restore a more restricted select
authorAndrew Lenharth <andrewl@lenharth.org>
Mon, 12 Dec 2005 17:43:52 +0000 (17:43 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Mon, 12 Dec 2005 17:43:52 +0000 (17:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24668 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Alpha/AlphaISelDAGToDAG.cpp

index 065cb11f36c00b84ad10f887682c40e297d05cac..e7df9d60af482b2c0baace6b7e82b1823645563b 100644 (file)
@@ -401,6 +401,38 @@ SDOperand AlphaDAGToDAGISel::Select(SDOperand Op) {
     }
     break;
 
+  case ISD::SELECT:
+    if (MVT::isFloatingPoint(N->getValueType(0)) &&
+       (N->getOperand(0).getOpcode() != ISD::SETCC ||
+        !MVT::isFloatingPoint(N->getOperand(0).getOperand(1).getValueType()))) {
+      //This should be the condition not covered by the Patterns
+      //FIXME: Don't have SelectCode die, but rather return something testable
+      // so that things like this can be caught in fall though code
+      //move int to fp
+      bool isDouble = N->getValueType(0) == MVT::f64;
+      SDOperand LD,
+       cond = Select(N->getOperand(0)),
+       TV = Select(N->getOperand(1)),
+       FV = Select(N->getOperand(2));
+      
+      if (AlphaLowering.hasITOF()) {
+       LD = CurDAG->getNode(AlphaISD::ITOFT_, MVT::f64, cond);
+      } else {
+       int FrameIdx =
+         CurDAG->getMachineFunction().getFrameInfo()->CreateStackObject(8, 8);
+       SDOperand FI = CurDAG->getFrameIndex(FrameIdx, MVT::i64);
+       SDOperand ST = CurDAG->getTargetNode(Alpha::STQ, MVT::Other,
+                                            cond, FI, CurDAG->getRegister(Alpha::R31, MVT::i64));
+       LD = CurDAG->getTargetNode(Alpha::LDT, MVT::f64, FI,
+                                  CurDAG->getRegister(Alpha::R31, MVT::i64),
+                                  ST);
+      }
+      SDOperand FP = CurDAG->getTargetNode(isDouble?Alpha::FCMOVEQT:Alpha::FCMOVEQS,
+                                          MVT::f64, FV, TV, LD);
+      return FP;
+    }
+    break;
+
   }
 
   return SelectCode(Op);