Handle the constantfp created during post-legalization dag combiner phase.
[oota-llvm.git] / lib / Target / ARM / ARMISelDAGToDAG.cpp
index 3304900c9f2e69c3d4b52755ecb6a2618a1465c7..823ae2f10e82df8099848a7aace0d01fecc5aa4a 100644 (file)
@@ -988,6 +988,24 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) {
     // Other cases are autogenerated.
     break;
   }
+  case ISD::ConstantFP: {
+    ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(N);
+    MVT VT = CFP->getValueType(0);
+    ConstantFP *LLVMC = const_cast<ConstantFP*>(CFP->getConstantFPValue());
+    SDValue CPIdx = CurDAG->getTargetConstantPool(LLVMC, TLI.getPointerTy());
+    SDNode *ResNode;
+    SDValue Ops[] = {
+      CPIdx, 
+      CurDAG->getTargetConstant(0, MVT::i32),
+      getAL(CurDAG),
+      CurDAG->getRegister(0, MVT::i32),
+      CurDAG->getEntryNode()
+    };
+    unsigned Opc = (VT == MVT::f32) ? ARM::FLDS : ARM::FLDD;
+    ResNode=CurDAG->getTargetNode(Opc, dl, VT, MVT::Other, Ops, 5);
+    ReplaceUses(Op, SDValue(ResNode, 0));
+    return NULL;
+  }
   case ISD::FrameIndex: {
     // Selects to ADDri FI, 0 which in turn will become ADDri SP, imm.
     int FI = cast<FrameIndexSDNode>(N)->getIndex();