X86 conditional branch support.

llvm-svn: 24870
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index dac14da..776ff6c 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -31,7 +31,6 @@
 
 X86TargetLowering::X86TargetLowering(TargetMachine &TM)
   : TargetLowering(TM) {
-
   // Set up the TargetLowering object.
 
   // X86 is weird, it always uses i8 for shift amounts and setcc results.
@@ -81,6 +80,9 @@
   setOperationAction(ISD::FP_TO_SINT       , MVT::i8   , Promote);
   setOperationAction(ISD::FP_TO_SINT       , MVT::i16  , Promote);
 
+  if (X86DAGIsel) {
+    setOperationAction(ISD::BRCOND         , MVT::Other, Custom);
+  }
   setOperationAction(ISD::BRCONDTWOWAY     , MVT::Other, Expand);
   setOperationAction(ISD::BRTWOWAY_CC      , MVT::Other, Expand);
   setOperationAction(ISD::MEMMOVE          , MVT::Other, Expand);
@@ -949,5 +951,22 @@
     return DAG.getNode(X86ISD::CMOV, Op.getValueType(),
                        Op.getOperand(1), Op.getOperand(2), CC, Cond);
   }
+  case ISD::BRCOND: {
+    SDOperand Chain = Op.getOperand(0);
+    SDOperand Cond  = Op.getOperand(1);
+    SDOperand Dest  = Op.getOperand(2);
+    SDOperand CC;
+    // TODO: handle Cond == OR / AND / XOR
+    if (Cond.getOpcode() == ISD::SETCC) {
+      CC = Cond.getOperand(2);
+      Cond = DAG.getNode(X86ISD::CMP, MVT::Flag,
+                         Cond.getOperand(0), Cond.getOperand(1));
+    } else {
+      CC = DAG.getCondCode(ISD::SETNE);
+      Cond = DAG.getNode(X86ISD::TEST, MVT::Flag, Cond, Cond);
+    }
+    return DAG.getNode(X86ISD::BRCOND, Op.getValueType(),
+                       Op.getOperand(0), Op.getOperand(2), CC, Cond);
+  }
   }
 }