fix the int<->fp instructions, which apparently take a single float register
authorChris Lattner <sabre@nondot.org>
Fri, 23 Dec 2005 05:00:16 +0000 (05:00 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 23 Dec 2005 05:00:16 +0000 (05:00 +0000)
to represent the int part (because it's always 32-bits)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24976 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Sparc/SparcISelDAGToDAG.cpp
lib/Target/Sparc/SparcInstrInfo.td
lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp
lib/Target/SparcV8/SparcV8InstrInfo.td

index 775093d0a62035d55f68c56809c8b628b7567ef3..3c307d34c32ef87e116b65695c25ce93c199dfa7 100644 (file)
@@ -601,28 +601,14 @@ LowerOperation(SDOperand Op, SelectionDAG &DAG) {
     SDOperand Lo = DAG.getNode(V8ISD::Lo, MVT::i32, CP);
     return DAG.getNode(ISD::ADD, MVT::i32, Lo, Hi);
   }
-  case ISD::FP_TO_SINT: {
+  case ISD::FP_TO_SINT:
     // Convert the fp value to integer in an FP register.
-    Op = DAG.getNode(V8ISD::FTOI, Op.getOperand(0).getValueType(),
-                     Op.getOperand(0));
-    int Size = Op.getOperand(0).getValueType() == MVT::f32 ? 4 : 8;
-    int FrameIdx =
-      DAG.getMachineFunction().getFrameInfo()->CreateStackObject(Size, Size);
-    SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32);
-    SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(),
-                               Op, FI, DAG.getSrcValue(0));
-    return DAG.getLoad(MVT::i32, ST, FI, DAG.getSrcValue(0));
-  }
+    assert(Op.getValueType() == MVT::i32);
+    Op = DAG.getNode(V8ISD::FTOI, MVT::f32, Op.getOperand(0));
+    return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Op);
   case ISD::SINT_TO_FP: {
-    int Size = Op.getOperand(0).getValueType() == MVT::f32 ? 4 : 8;
-    int FrameIdx =
-      DAG.getMachineFunction().getFrameInfo()->CreateStackObject(Size, Size);
-    SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32);
-    SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(),
-                               Op.getOperand(0), FI, DAG.getSrcValue(0));
-    
-    Op = DAG.getLoad(Op.getValueType(), ST, FI, DAG.getSrcValue(0));
-    
+    assert(Op.getOperand(0).getValueType() == MVT::i32);
+    Op = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, Op);
     // Convert the int value to FP in an FP register.
     return DAG.getNode(V8ISD::ITOF, Op.getValueType(), Op);
   }
index 2e8f2f60258217cf6e51a6c92c1d3198164e7920..cccf6f1ad0db7ad88f4fb51ba111bec60059508d 100644 (file)
@@ -69,6 +69,10 @@ SDTypeProfile<0, 3, [SDTCisVT<0, OtherVT>, SDTCisVT<1, OtherVT>,
 def SDTV8selectcc :
 SDTypeProfile<1, 4, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, 
                      SDTCisVT<3, i32>, SDTCisVT<4, FlagVT>]>;
+def SDTV8FTOI :
+SDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisFP<1>]>;
+def SDTV8ITOF :
+SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVT<1, f32>]>;
 
 def V8cmpicc : SDNode<"V8ISD::CMPICC", SDTV8cmpicc>;
 def V8cmpfcc : SDNode<"V8ISD::CMPFCC", SDTV8cmpfcc>;
@@ -78,8 +82,8 @@ def V8brfcc : SDNode<"V8ISD::BRFCC", SDTV8brcc, [SDNPHasChain]>;
 def V8hi    : SDNode<"V8ISD::Hi", SDTIntUnaryOp>;
 def V8lo    : SDNode<"V8ISD::Lo", SDTIntUnaryOp>;
 
-def V8ftoi  : SDNode<"V8ISD::FTOI", SDTFPUnaryOp>;
-def V8itof  : SDNode<"V8ISD::ITOF", SDTFPUnaryOp>;
+def V8ftoi  : SDNode<"V8ISD::FTOI", SDTV8FTOI>;
+def V8itof  : SDNode<"V8ISD::ITOF", SDTV8ITOF>;
 
 def V8selecticc : SDNode<"V8ISD::SELECT_ICC", SDTV8selectcc>;
 def V8selectfcc : SDNode<"V8ISD::SELECT_FCC", SDTV8selectcc>;
@@ -597,9 +601,9 @@ def FITOS : F3_3<2, 0b110100, 0b011000100,
                  "fitos $src, $dst",
                  [(set FPRegs:$dst, (V8itof FPRegs:$src))]>;
 def FITOD : F3_3<2, 0b110100, 0b011001000, 
-                 (ops DFPRegs:$dst, DFPRegs:$src),
+                 (ops DFPRegs:$dst, FPRegs:$src),
                  "fitod $src, $dst",
-                 [(set DFPRegs:$dst, (V8itof DFPRegs:$src))]>;
+                 [(set DFPRegs:$dst, (V8itof FPRegs:$src))]>;
 
 // Convert Floating-point to Integer Instructions, p. 142
 def FSTOI : F3_3<2, 0b110100, 0b011010001,
@@ -607,9 +611,9 @@ def FSTOI : F3_3<2, 0b110100, 0b011010001,
                  "fstoi $src, $dst",
                  [(set FPRegs:$dst, (V8ftoi FPRegs:$src))]>;
 def FDTOI : F3_3<2, 0b110100, 0b011010010,
-                 (ops DFPRegs:$dst, DFPRegs:$src),
+                 (ops FPRegs:$dst, DFPRegs:$src),
                  "fdtoi $src, $dst",
-                 [(set DFPRegs:$dst, (V8ftoi DFPRegs:$src))]>;
+                 [(set FPRegs:$dst, (V8ftoi DFPRegs:$src))]>;
 
 // Convert between Floating-point Formats Instructions, p. 143
 def FSTOD : F3_3<2, 0b110100, 0b011001001, 
index 775093d0a62035d55f68c56809c8b628b7567ef3..3c307d34c32ef87e116b65695c25ce93c199dfa7 100644 (file)
@@ -601,28 +601,14 @@ LowerOperation(SDOperand Op, SelectionDAG &DAG) {
     SDOperand Lo = DAG.getNode(V8ISD::Lo, MVT::i32, CP);
     return DAG.getNode(ISD::ADD, MVT::i32, Lo, Hi);
   }
-  case ISD::FP_TO_SINT: {
+  case ISD::FP_TO_SINT:
     // Convert the fp value to integer in an FP register.
-    Op = DAG.getNode(V8ISD::FTOI, Op.getOperand(0).getValueType(),
-                     Op.getOperand(0));
-    int Size = Op.getOperand(0).getValueType() == MVT::f32 ? 4 : 8;
-    int FrameIdx =
-      DAG.getMachineFunction().getFrameInfo()->CreateStackObject(Size, Size);
-    SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32);
-    SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(),
-                               Op, FI, DAG.getSrcValue(0));
-    return DAG.getLoad(MVT::i32, ST, FI, DAG.getSrcValue(0));
-  }
+    assert(Op.getValueType() == MVT::i32);
+    Op = DAG.getNode(V8ISD::FTOI, MVT::f32, Op.getOperand(0));
+    return DAG.getNode(ISD::BIT_CONVERT, MVT::i32, Op);
   case ISD::SINT_TO_FP: {
-    int Size = Op.getOperand(0).getValueType() == MVT::f32 ? 4 : 8;
-    int FrameIdx =
-      DAG.getMachineFunction().getFrameInfo()->CreateStackObject(Size, Size);
-    SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32);
-    SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(),
-                               Op.getOperand(0), FI, DAG.getSrcValue(0));
-    
-    Op = DAG.getLoad(Op.getValueType(), ST, FI, DAG.getSrcValue(0));
-    
+    assert(Op.getOperand(0).getValueType() == MVT::i32);
+    Op = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, Op);
     // Convert the int value to FP in an FP register.
     return DAG.getNode(V8ISD::ITOF, Op.getValueType(), Op);
   }
index 2e8f2f60258217cf6e51a6c92c1d3198164e7920..cccf6f1ad0db7ad88f4fb51ba111bec60059508d 100644 (file)
@@ -69,6 +69,10 @@ SDTypeProfile<0, 3, [SDTCisVT<0, OtherVT>, SDTCisVT<1, OtherVT>,
 def SDTV8selectcc :
 SDTypeProfile<1, 4, [SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, 
                      SDTCisVT<3, i32>, SDTCisVT<4, FlagVT>]>;
+def SDTV8FTOI :
+SDTypeProfile<1, 1, [SDTCisVT<0, f32>, SDTCisFP<1>]>;
+def SDTV8ITOF :
+SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisVT<1, f32>]>;
 
 def V8cmpicc : SDNode<"V8ISD::CMPICC", SDTV8cmpicc>;
 def V8cmpfcc : SDNode<"V8ISD::CMPFCC", SDTV8cmpfcc>;
@@ -78,8 +82,8 @@ def V8brfcc : SDNode<"V8ISD::BRFCC", SDTV8brcc, [SDNPHasChain]>;
 def V8hi    : SDNode<"V8ISD::Hi", SDTIntUnaryOp>;
 def V8lo    : SDNode<"V8ISD::Lo", SDTIntUnaryOp>;
 
-def V8ftoi  : SDNode<"V8ISD::FTOI", SDTFPUnaryOp>;
-def V8itof  : SDNode<"V8ISD::ITOF", SDTFPUnaryOp>;
+def V8ftoi  : SDNode<"V8ISD::FTOI", SDTV8FTOI>;
+def V8itof  : SDNode<"V8ISD::ITOF", SDTV8ITOF>;
 
 def V8selecticc : SDNode<"V8ISD::SELECT_ICC", SDTV8selectcc>;
 def V8selectfcc : SDNode<"V8ISD::SELECT_FCC", SDTV8selectcc>;
@@ -597,9 +601,9 @@ def FITOS : F3_3<2, 0b110100, 0b011000100,
                  "fitos $src, $dst",
                  [(set FPRegs:$dst, (V8itof FPRegs:$src))]>;
 def FITOD : F3_3<2, 0b110100, 0b011001000, 
-                 (ops DFPRegs:$dst, DFPRegs:$src),
+                 (ops DFPRegs:$dst, FPRegs:$src),
                  "fitod $src, $dst",
-                 [(set DFPRegs:$dst, (V8itof DFPRegs:$src))]>;
+                 [(set DFPRegs:$dst, (V8itof FPRegs:$src))]>;
 
 // Convert Floating-point to Integer Instructions, p. 142
 def FSTOI : F3_3<2, 0b110100, 0b011010001,
@@ -607,9 +611,9 @@ def FSTOI : F3_3<2, 0b110100, 0b011010001,
                  "fstoi $src, $dst",
                  [(set FPRegs:$dst, (V8ftoi FPRegs:$src))]>;
 def FDTOI : F3_3<2, 0b110100, 0b011010010,
-                 (ops DFPRegs:$dst, DFPRegs:$src),
+                 (ops FPRegs:$dst, DFPRegs:$src),
                  "fdtoi $src, $dst",
-                 [(set DFPRegs:$dst, (V8ftoi DFPRegs:$src))]>;
+                 [(set FPRegs:$dst, (V8ftoi DFPRegs:$src))]>;
 
 // Convert between Floating-point Formats Instructions, p. 143
 def FSTOD : F3_3<2, 0b110100, 0b011001001,