From: Misha Brukman Date: Fri, 13 Dec 2002 09:54:12 +0000 (+0000) Subject: Added moveReg2Reg() and moveImm2Reg() to accomodate moving data around due to X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2b46e8ecccfe8a6adc861158a21b67fb9e786885;p=llvm Added moveReg2Reg() and moveImm2Reg() to accomodate moving data around due to PHI nodes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5001 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Target/MRegisterInfo.h b/include/llvm/Target/MRegisterInfo.h index 099fc9a95fa..577d59c93aa 100644 --- a/include/llvm/Target/MRegisterInfo.h +++ b/include/llvm/Target/MRegisterInfo.h @@ -129,6 +129,16 @@ public: unsigned DestReg, unsigned SrcReg, 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, diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index cd22d88efbd..8e049a2c09f 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 76950e8d889..78d3bdda813 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;