Index: include/llvm/Target/TargetSelectionDAG.td =================================================================== --- include/llvm/Target/TargetSelectionDAG.td +++ include/llvm/Target/TargetSelectionDAG.td @@ -156,6 +156,11 @@ def SDTFPToIntOp : SDTypeProfile<1, 1, [ // fp_to_[su]int SDTCisInt<0>, SDTCisFP<1>, SDTCisSameNumEltsAs<0, 1> ]>; + +def SDTCarryOp : SDTypeProfile<2, 3, [ // addcarry, subcarry + SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>, SDTCisInt<0>, SDTCisVT<1, i1>, SDTCisVT<4, i1> +]>; + def SDTExtInreg : SDTypeProfile<1, 2, [ // sext_inreg SDTCisSameAs<0, 1>, SDTCisInt<0>, SDTCisVT<2, OtherVT>, SDTCisVTSmallerThanOp<2, 1> @@ -394,10 +399,12 @@ [SDNPCommutative, SDNPAssociative]>; def addc : SDNode<"ISD::ADDC" , SDTIntBinOp, [SDNPCommutative, SDNPOutGlue]>; +def addcarry : SDNode<"ISD::ADDCARRY" , SDTCarryOp>; def adde : SDNode<"ISD::ADDE" , SDTIntBinOp, [SDNPCommutative, SDNPOutGlue, SDNPInGlue]>; def subc : SDNode<"ISD::SUBC" , SDTIntBinOp, [SDNPOutGlue]>; +def subcarry : SDNode<"ISD::SUBCARRY" , SDTCarryOp>; def sube : SDNode<"ISD::SUBE" , SDTIntBinOp, [SDNPOutGlue, SDNPInGlue]>; def smin : SDNode<"ISD::SMIN" , SDTIntBinOp,