diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/X86RegisterInfo.cpp | 30 | ||||
-rw-r--r-- | lib/Target/X86/X86RegisterInfo.h | 3 |
2 files changed, 33 insertions, 0 deletions
diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index 98955a305e..fdb259cd0e 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/lib/Target/X86/X86RegisterInfo.cpp @@ -234,6 +234,30 @@ void X86RegisterInfo::copyRegToReg(MachineBasicBlock &MBB, const TargetRegisterClass *DestRC, const TargetRegisterClass *SrcRC) const { if (DestRC != SrcRC) { + // Moving EFLAGS to / from another register requires a push and a pop. + if (SrcRC == &X86::CCRRegClass) { + assert(SrcReg == X86::EFLAGS); + if (DestRC == &X86::GR64RegClass) { + BuildMI(MBB, MI, TII.get(X86::PUSHFQ)); + BuildMI(MBB, MI, TII.get(X86::POP64r), DestReg); + return; + } else if (DestRC == &X86::GR32RegClass) { + BuildMI(MBB, MI, TII.get(X86::PUSHFD)); + BuildMI(MBB, MI, TII.get(X86::POP32r), DestReg); + return; + } + } else if (DestRC == &X86::CCRRegClass) { + assert(DestReg == X86::EFLAGS); + if (SrcRC == &X86::GR64RegClass) { + BuildMI(MBB, MI, TII.get(X86::PUSH64r)).addReg(SrcReg); + BuildMI(MBB, MI, TII.get(X86::POPFQ)); + return; + } else if (SrcRC == &X86::GR32RegClass) { + BuildMI(MBB, MI, TII.get(X86::PUSH32r)).addReg(SrcReg); + BuildMI(MBB, MI, TII.get(X86::POPFD)); + return; + } + } cerr << "Not yet supported!"; abort(); } @@ -272,6 +296,12 @@ void X86RegisterInfo::copyRegToReg(MachineBasicBlock &MBB, BuildMI(MBB, MI, TII.get(Opc), DestReg).addReg(SrcReg); } +const TargetRegisterClass * +X86RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const { + if (RC == &X86::CCRRegClass) + return &X86::GR32RegClass; + return NULL; +} void X86RegisterInfo::reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, diff --git a/lib/Target/X86/X86RegisterInfo.h b/lib/Target/X86/X86RegisterInfo.h index e0d1c6a4bf..fd26d9fd7d 100644 --- a/lib/Target/X86/X86RegisterInfo.h +++ b/lib/Target/X86/X86RegisterInfo.h @@ -81,6 +81,9 @@ public: const TargetRegisterClass *DestRC, const TargetRegisterClass *SrcRC) const; + const TargetRegisterClass * + getCrossCopyRegClass(const TargetRegisterClass *RC) const; + void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, const MachineInstr *Orig) const; |