Allow custom lowering of ADDE/ADDC/SUBE/SUBC operations.
authorSanjiv Gupta <sanjiv.gupta@microchip.com>
Wed, 26 Nov 2008 11:19:00 +0000 (11:19 +0000)
committerSanjiv Gupta <sanjiv.gupta@microchip.com>
Wed, 26 Nov 2008 11:19:00 +0000 (11:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60102 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 4400fed8fe0af8abada06e8c5d882fd4ecc62fce..78d03b7e8f5660f52673b31bdd160835b89cf9e8 100644 (file)
@@ -3299,11 +3299,26 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
     Tmp1 = LegalizeOp(Node->getOperand(0));
     Tmp2 = LegalizeOp(Node->getOperand(1));
     Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2);
+    Tmp3 = Result.getValue(0);
+    Tmp4 = Result.getValue(1);
+
+    switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) {
+    default: assert(0 && "This action is not supported yet!");
+    case TargetLowering::Legal:
+      break;
+    case TargetLowering::Custom:
+      Tmp1 = TLI.LowerOperation(Tmp3, DAG);
+      if (Tmp1.getNode() != NULL) {
+        Tmp3 = LegalizeOp(Tmp1);;
+        Tmp4 = LegalizeOp(Tmp1.getValue(1));
+      }
+      break;
+    }
     // Since this produces two values, make sure to remember that we legalized
     // both of them.
-    AddLegalizedOperand(SDValue(Node, 0), Result.getValue(0));
-    AddLegalizedOperand(SDValue(Node, 1), Result.getValue(1));
-    return Result;
+    AddLegalizedOperand(SDValue(Node, 0), Tmp3);
+    AddLegalizedOperand(SDValue(Node, 1), Tmp4);
+    return Op.getResNo() ? Tmp4 : Tmp3;
 
   case ISD::ADDE:
   case ISD::SUBE:
@@ -3311,11 +3326,26 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
     Tmp2 = LegalizeOp(Node->getOperand(1));
     Tmp3 = LegalizeOp(Node->getOperand(2));
     Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3);
+    Tmp3 = Result.getValue(0);
+    Tmp4 = Result.getValue(1);
+
+    switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) {
+    default: assert(0 && "This action is not supported yet!");
+    case TargetLowering::Legal:
+      break;
+    case TargetLowering::Custom:
+      Tmp1 = TLI.LowerOperation(Tmp3, DAG);
+      if (Tmp1.getNode() != NULL) {
+        Tmp3 = LegalizeOp(Tmp1);;
+        Tmp4 = LegalizeOp(Tmp1.getValue(1));
+      }
+      break;
+    }
     // Since this produces two values, make sure to remember that we legalized
     // both of them.
-    AddLegalizedOperand(SDValue(Node, 0), Result.getValue(0));
-    AddLegalizedOperand(SDValue(Node, 1), Result.getValue(1));
-    return Result;
+    AddLegalizedOperand(SDValue(Node, 0), Tmp3);
+    AddLegalizedOperand(SDValue(Node, 1), Tmp4);
+    return Op.getResNo() ? Tmp4 : Tmp3;
     
   case ISD::BUILD_PAIR: {
     MVT PairTy = Node->getValueType(0);