[llvm-commits] CVS: llvm/lib/Target/X86/X86RegisterInfo.cpp X86RegisterInfo.td

Chris Lattner lattner at cs.uiuc.edu
Thu Dec 2 10:17:43 PST 2004



Changes in directory llvm/lib/Target/X86:

X86RegisterInfo.cpp updated: 1.94 -> 1.95
X86RegisterInfo.td updated: 1.15 -> 1.16
---
Log message:

Spill/restore X86 floating point stack registers with 64-bits of precision
instead of 80-bits of precision.  This fixes PR467: http://llvm.cs.uiuc.edu/PR467 .

This change speeds up fldry on X86 with LLC from 7.32s on apoc to 4.68s.


---
Diffs of the changes:  (+13 -6)

Index: llvm/lib/Target/X86/X86RegisterInfo.cpp
diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.94 llvm/lib/Target/X86/X86RegisterInfo.cpp:1.95
--- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.94	Tue Oct  5 23:01:02 2004
+++ llvm/lib/Target/X86/X86RegisterInfo.cpp	Thu Dec  2 12:17:31 2004
@@ -50,7 +50,8 @@
   case 8:  return 0;
   case 16: return 1;
   case 32: return 2;
-  case 80: return 3;
+  case 64: return 3;   // FP in 64-bit spill mode.
+  case 80: return 4;   // FP in 80-bit spill mode.
   }
 }
 
@@ -58,7 +59,7 @@
                                           MachineBasicBlock::iterator MI,
                                           unsigned SrcReg, int FrameIdx) const {
   static const unsigned Opcode[] =
-    { X86::MOV8mr, X86::MOV16mr, X86::MOV32mr, X86::FSTP80m };
+    { X86::MOV8mr, X86::MOV16mr, X86::MOV32mr, X86::FST64m, X86::FSTP80m };
   unsigned Idx = getIdx(getSpillSize(SrcReg));
   addFrameReference(BuildMI(MBB, MI, Opcode[Idx], 5), FrameIdx).addReg(SrcReg);
 }
@@ -67,7 +68,7 @@
                                            MachineBasicBlock::iterator MI,
                                            unsigned DestReg, int FrameIdx)const{
   static const unsigned Opcode[] =
-    { X86::MOV8rm, X86::MOV16rm, X86::MOV32rm, X86::FLD80m };
+    { X86::MOV8rm, X86::MOV16rm, X86::MOV32rm, X86::FLD64m, X86::FLD80m };
   unsigned Idx = getIdx(getSpillSize(DestReg));
   addFrameReference(BuildMI(MBB, MI, Opcode[Idx], 4, DestReg), FrameIdx);
 }
@@ -77,7 +78,7 @@
                                    unsigned DestReg, unsigned SrcReg,
                                    const TargetRegisterClass *RC) const {
   static const unsigned Opcode[] =
-    { X86::MOV8rr, X86::MOV16rr, X86::MOV32rr, X86::FpMOV };
+    { X86::MOV8rr, X86::MOV16rr, X86::MOV32rr, X86::FpMOV, X86::FpMOV };
   BuildMI(MBB, MI, Opcode[getIdx(RC->getSize()*8)], 1, DestReg).addReg(SrcReg);
 }
 


Index: llvm/lib/Target/X86/X86RegisterInfo.td
diff -u llvm/lib/Target/X86/X86RegisterInfo.td:1.15 llvm/lib/Target/X86/X86RegisterInfo.td:1.16
--- llvm/lib/Target/X86/X86RegisterInfo.td:1.15	Tue Sep 21 16:22:11 2004
+++ llvm/lib/Target/X86/X86RegisterInfo.td	Thu Dec  2 12:17:31 2004
@@ -84,12 +84,18 @@
   }];
 }
 
-def RFP : RegisterClass<f80, 32, [FP0, FP1, FP2, FP3, FP4, FP5, FP6]>;
+// FIXME: This sets up the floating point register files as though they are f64
+// values, though they really are f80 values.  This will cause us to spill
+// values as 64-bit quantities instead of 80-bit quantities, which is much much
+// faster on common hardware.  In reality, this should be controlled by a
+// command line option or something.
+
+def RFP : RegisterClass<f64, 32, [FP0, FP1, FP2, FP3, FP4, FP5, FP6]>;
 
 // Floating point stack registers (these are not allocatable by the
 // register allocator - the floating point stackifier is responsible
 // for transforming FPn allocations to STn registers)
-def RST : RegisterClass<f80, 32, [ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7]> {
+def RST : RegisterClass<f64, 32, [ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7]> {
   let Methods = [{
     iterator allocation_order_end(MachineFunction &MF) const {
       return begin();






More information about the llvm-commits mailing list