[llvm-commits] [llvm] r42372 - in /llvm/trunk: include/llvm/Target/MRegisterInfo.h lib/Target/X86/X86RegisterInfo.cpp lib/Target/X86/X86RegisterInfo.h

Evan Cheng evan.cheng at apple.com
Wed Sep 26 14:31:07 PDT 2007


Author: evancheng
Date: Wed Sep 26 16:31:07 2007
New Revision: 42372

URL: http://llvm.org/viewvc/llvm-project?rev=42372&view=rev
Log:
- Added MRegisterInfo::getCrossCopyRegClass() hook. For register classes where reg to reg copies are not possible, this returns another register class which registers in the specified register class can be copied to (and copy back from).
- X86 copyRegToReg() now supports copying between EFLAGS and GR32 / GR64 registers.

Modified:
    llvm/trunk/include/llvm/Target/MRegisterInfo.h
    llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
    llvm/trunk/lib/Target/X86/X86RegisterInfo.h

Modified: llvm/trunk/include/llvm/Target/MRegisterInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/MRegisterInfo.h?rev=42372&r1=42371&r2=42372&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Target/MRegisterInfo.h (original)
+++ llvm/trunk/include/llvm/Target/MRegisterInfo.h Wed Sep 26 16:31:07 2007
@@ -315,6 +315,11 @@
     return Reg >= FirstVirtualRegister;
   }
 
+  /// getPhysicalRegisterRegClass - Returns the Register Class of a physical
+  /// register of the given type.
+  const TargetRegisterClass *getPhysicalRegisterRegClass(MVT::ValueType VT,
+                                                         unsigned Reg) const;
+
   /// getAllocatableSet - Returns a bitset indexed by register number
   /// indicating if a register is allocatable or not. If a register class is
   /// specified, returns the subset for the class.
@@ -509,6 +514,14 @@
                             const TargetRegisterClass *DestRC,
                             const TargetRegisterClass *SrcRC) const = 0;
 
+  /// getCrossCopyRegClass - Returns a legal register class to copy a register
+  /// in the specified class to or from. Returns NULL if it is possible to copy
+  /// between a two registers of the specified class.
+  virtual const TargetRegisterClass *
+  getCrossCopyRegClass(const TargetRegisterClass *RC) const {
+    return NULL;
+  }
+
   /// reMaterialize - Re-issue the specified 'original' instruction at the
   /// specific location targeting a new destination register.
   virtual void reMaterialize(MachineBasicBlock &MBB,

Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=42372&r1=42371&r2=42372&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Wed Sep 26 16:31:07 2007
@@ -234,6 +234,30 @@
                                    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 @@
   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,

Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.h?rev=42372&r1=42371&r2=42372&view=diff

==============================================================================
--- llvm/trunk/lib/Target/X86/X86RegisterInfo.h (original)
+++ llvm/trunk/lib/Target/X86/X86RegisterInfo.h Wed Sep 26 16:31:07 2007
@@ -81,6 +81,9 @@
                     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;
 





More information about the llvm-commits mailing list