diff options
-rw-r--r-- | include/llvm/Target/MRegisterInfo.h | 10 | ||||
-rw-r--r-- | lib/Target/X86/X86RegisterInfo.cpp | 36 | ||||
-rw-r--r-- | lib/Target/X86/X86RegisterInfo.h | 10 |
3 files changed, 56 insertions, 0 deletions
diff --git a/include/llvm/Target/MRegisterInfo.h b/include/llvm/Target/MRegisterInfo.h index 099fc9a95f..577d59c93a 100644 --- a/include/llvm/Target/MRegisterInfo.h +++ b/include/llvm/Target/MRegisterInfo.h @@ -130,6 +130,16 @@ public: unsigned ImmOffset, unsigned dataSize) const = 0; virtual MachineBasicBlock::iterator + moveReg2Reg(MachineBasicBlock *MBB, + MachineBasicBlock::iterator MBBI, + unsigned DestReg, unsigned SrcReg, unsigned dataSize) const = 0; + + virtual MachineBasicBlock::iterator + moveImm2Reg(MachineBasicBlock *MBB, + MachineBasicBlock::iterator MBBI, + unsigned DestReg, unsigned Imm, unsigned dataSize) const = 0; + + virtual MachineBasicBlock::iterator emitPrologue(MachineBasicBlock *MBB, MachineBasicBlock::iterator MBBI, unsigned numBytes) const = 0; diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index cd22d88efb..8e049a2c09 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/lib/Target/X86/X86RegisterInfo.cpp @@ -63,6 +63,42 @@ X86RegisterInfo::loadRegOffset2Reg(MachineBasicBlock *MBB, return ++(MBB->insert(MBBI, MI)); } +MachineBasicBlock::iterator +X86RegisterInfo::moveReg2Reg(MachineBasicBlock *MBB, + MachineBasicBlock::iterator MBBI, + unsigned DestReg, unsigned SrcReg, + unsigned dataSize) const +{ + unsigned opcode; + switch (dataSize) { + case 1: opcode = X86::MOVrr8; break; + case 2: opcode = X86::MOVrr16; break; + case 4: opcode = X86::MOVrr32; break; + default: assert(0 && "Invalid data size!"); + } + + MachineInstr *MI = BuildMI(opcode, 2).addReg(DestReg).addReg(SrcReg); + return ++(MBB->insert(MBBI, MI)); +} + +MachineBasicBlock::iterator +X86RegisterInfo::moveImm2Reg(MachineBasicBlock *MBB, + MachineBasicBlock::iterator MBBI, + unsigned DestReg, unsigned Imm, unsigned dataSize) + const +{ + unsigned opcode; + switch (dataSize) { + case 1: opcode = X86::MOVir8; break; + case 2: opcode = X86::MOVir16; break; + case 4: opcode = X86::MOVir32; break; + default: assert(0 && "Invalid data size!"); + } + + MachineInstr *MI = BuildMI(opcode, 2).addReg(DestReg).addReg(Imm); + return ++(MBB->insert(MBBI, MI)); +} + unsigned X86RegisterInfo::getFramePointer() const { return X86::EBP; diff --git a/lib/Target/X86/X86RegisterInfo.h b/lib/Target/X86/X86RegisterInfo.h index 76950e8d88..78d3bdda81 100644 --- a/lib/Target/X86/X86RegisterInfo.h +++ b/lib/Target/X86/X86RegisterInfo.h @@ -29,6 +29,16 @@ struct X86RegisterInfo : public MRegisterInfo { unsigned DestReg, unsigned SrcReg, unsigned ImmOffset, unsigned dataSize) const; + MachineBasicBlock::iterator + moveReg2Reg(MachineBasicBlock *MBB, + MachineBasicBlock::iterator MBBI, + unsigned DestReg, unsigned SrcReg, unsigned dataSize) const; + + MachineBasicBlock::iterator + moveImm2Reg(MachineBasicBlock *MBB, + MachineBasicBlock::iterator MBBI, + unsigned DestReg, unsigned Imm, unsigned dataSize) const; + unsigned getFramePointer() const; unsigned getStackPointer() const; |