Implement MipsTargetLowering::LowerSELECT_CC to custom lower SELECT_CC.
authorAkira Hatanaka <ahatanaka@mips.com>
Wed, 11 Jul 2012 19:32:27 +0000 (19:32 +0000)
committerAkira Hatanaka <ahatanaka@mips.com>
Wed, 11 Jul 2012 19:32:27 +0000 (19:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160064 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsISelLowering.cpp
lib/Target/Mips/MipsISelLowering.h
test/CodeGen/Mips/selectcc.ll [new file with mode: 0644]

index 6858d84f08b64940241529251cde9106e0fdd255..6b80e3fe3e13b6227c37006253ddcc2c40ae7b2e 100644 (file)
@@ -152,6 +152,8 @@ MipsTargetLowering(MipsTargetMachine &TM)
   setOperationAction(ISD::SELECT,             MVT::f32,   Custom);
   setOperationAction(ISD::SELECT,             MVT::f64,   Custom);
   setOperationAction(ISD::SELECT,             MVT::i32,   Custom);
+  setOperationAction(ISD::SELECT_CC,          MVT::f32,   Custom);
+  setOperationAction(ISD::SELECT_CC,          MVT::f64,   Custom);
   setOperationAction(ISD::SETCC,              MVT::f32,   Custom);
   setOperationAction(ISD::SETCC,              MVT::f64,   Custom);
   setOperationAction(ISD::BRCOND,             MVT::Other, Custom);
@@ -263,9 +265,6 @@ MipsTargetLowering(MipsTargetMachine &TM)
 
   setInsertFencesForAtomic(true);
 
-  if (Subtarget->isSingleFloat())
-    setOperationAction(ISD::SELECT_CC, MVT::f64, Expand);
-
   if (!Subtarget->hasSEInReg()) {
     setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8,  Expand);
     setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Expand);
@@ -801,6 +800,7 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const
     case ISD::GlobalTLSAddress:   return LowerGlobalTLSAddress(Op, DAG);
     case ISD::JumpTable:          return LowerJumpTable(Op, DAG);
     case ISD::SELECT:             return LowerSELECT(Op, DAG);
+    case ISD::SELECT_CC:          return LowerSELECT_CC(Op, DAG);
     case ISD::SETCC:              return LowerSETCC(Op, DAG);
     case ISD::VASTART:            return LowerVASTART(Op, DAG);
     case ISD::FCOPYSIGN:          return LowerFCOPYSIGN(Op, DAG);
@@ -1576,6 +1576,19 @@ LowerSELECT(SDValue Op, SelectionDAG &DAG) const
                       Op.getDebugLoc());
 }
 
+SDValue MipsTargetLowering::
+LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const
+{
+  DebugLoc DL = Op.getDebugLoc();
+  EVT Ty = Op.getOperand(0).getValueType();
+  SDValue Cond = DAG.getNode(ISD::SETCC, DL, getSetCCResultType(Ty),
+                             Op.getOperand(0), Op.getOperand(1),
+                             Op.getOperand(4));
+
+  return DAG.getNode(ISD::SELECT, DL, Op.getValueType(), Cond, Op.getOperand(2),
+                     Op.getOperand(3));
+}
+
 SDValue MipsTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
   SDValue Cond = CreateFPCmp(DAG, Op);
 
index c8b96acc1b3815c5a628ea5e11e534c4f1ffde21..edab03cdd8da7b102cff269b345c100b1ed70461 100644 (file)
@@ -138,6 +138,7 @@ namespace llvm {
     SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
+    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
     SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
diff --git a/test/CodeGen/Mips/selectcc.ll b/test/CodeGen/Mips/selectcc.ll
new file mode 100644 (file)
index 0000000..d7d674b
--- /dev/null
@@ -0,0 +1,25 @@
+; RUN: llc -march=mipsel < %s 
+
+@gd0 = external global double
+@gd1 = external global double
+
+define double @select_cc_f32(float %a, float %b) nounwind {
+entry:
+  store double 0.000000e+00, double* @gd0, align 8
+  store double 1.000000e+00, double* @gd1, align 8
+  %cmp = fcmp olt float %a, %b
+  %conv = zext i1 %cmp to i32
+  %conv1 = sitofp i32 %conv to double
+  ret double %conv1
+}
+
+define double @select_cc_f64(double %a, double %b) nounwind {
+entry:
+  store double 0.000000e+00, double* @gd0, align 8
+  store double 1.000000e+00, double* @gd1, align 8
+  %cmp = fcmp olt double %a, %b
+  %conv = zext i1 %cmp to i32
+  %conv1 = sitofp i32 %conv to double
+  ret double %conv1
+}
+