teach X86InstrInfo::copyRegToReg how to copy into ST(0) from
[oota-llvm.git] / lib / Target / X86 / X86InstrInfo.cpp
index 01a7cd401f960e47b729bf346f695c0d31ac0042..3c12fa17356134fd81082653dede6cf44da9e649 100644 (file)
@@ -1465,7 +1465,7 @@ void X86InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
     }
   }
   
-  // Moving ST(0) to/from a register turns into FpGET_ST0_32 etc.
+  // Moving from ST(0) turns into FpGET_ST0_32 etc.
   if (SrcRC == &X86::RSTRegClass) {
     // Copying from ST(0).  FIXME: handle ST(1) also
     assert(SrcReg == X86::ST0 && "Can only copy from TOS right now");
@@ -1481,6 +1481,23 @@ void X86InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
     BuildMI(MBB, MI, get(Opc), DestReg);
     return;
   }
+
+  // Moving to ST(0) turns into FpSET_ST0_32 etc.
+  if (DestRC == &X86::RSTRegClass) {
+    // Copying to ST(0).  FIXME: handle ST(1) also
+    assert(DestReg == X86::ST0 && "Can only copy to TOS right now");
+    unsigned Opc;
+    if (SrcRC == &X86::RFP32RegClass)
+      Opc = X86::FpSET_ST0_32;
+    else if (SrcRC == &X86::RFP64RegClass)
+      Opc = X86::FpSET_ST0_64;
+    else {
+      assert(SrcRC == &X86::RFP80RegClass);
+      Opc = X86::FpSET_ST0_80;
+    }
+    BuildMI(MBB, MI, get(Opc)).addReg(SrcReg);
+    return;
+  }
   
   cerr << "Not yet supported!";
   abort();