FPSelect and more custom lowering

llvm-svn: 24535
diff --git a/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp b/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
index 50ff1b0..debc41d 100644
--- a/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
+++ b/llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp
@@ -368,8 +368,35 @@
       return FP;
     }
     break;
+
+  case ISD::SELECT:
+    if (MVT::isFloatingPoint(N->getValueType(0))) {
+      //move int to fp
+      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(Alpha::FCMOVEQ, MVT::f64, TV, FV, LD);
+      return FP;
+    }
+    break;
+
+
   }
-  
+
   return SelectCode(Op);
 }