Index: lib/Target/Mips/Mips16ISelDAGToDAG.cpp =================================================================== --- lib/Target/Mips/Mips16ISelDAGToDAG.cpp +++ lib/Target/Mips/Mips16ISelDAGToDAG.cpp @@ -192,41 +192,6 @@ default: break; - case ISD::SUBE: - case ISD::ADDE: { - SDValue InFlag = Node->getOperand(2), CmpLHS; - unsigned Opc = InFlag.getOpcode(); - (void)Opc; - assert(((Opc == ISD::ADDC || Opc == ISD::ADDE) || - (Opc == ISD::SUBC || Opc == ISD::SUBE)) && - "(ADD|SUB)E flag operand must come from (ADD|SUB)C/E insn"); - - unsigned MOp; - if (Opcode == ISD::ADDE) { - CmpLHS = InFlag.getValue(0); - MOp = Mips::AdduRxRyRz16; - } else { - CmpLHS = InFlag.getOperand(0); - MOp = Mips::SubuRxRyRz16; - } - - SDValue Ops[] = {CmpLHS, InFlag.getOperand(1)}; - - SDValue LHS = Node->getOperand(0); - SDValue RHS = Node->getOperand(1); - - EVT VT = LHS.getValueType(); - - unsigned Sltu_op = Mips::SltuRxRyRz16; - SDNode *Carry = CurDAG->getMachineNode(Sltu_op, DL, VT, Ops); - unsigned Addu_op = Mips::AdduRxRyRz16; - SDNode *AddCarry = - CurDAG->getMachineNode(Addu_op, DL, VT, SDValue(Carry, 0), RHS); - - CurDAG->SelectNodeTo(Node, MOp, VT, MVT::Glue, LHS, SDValue(AddCarry, 0)); - return true; - } - /// Mul with two results case ISD::SMUL_LOHI: case ISD::UMUL_LOHI: { Index: lib/Target/Mips/Mips16InstrInfo.td =================================================================== --- lib/Target/Mips/Mips16InstrInfo.td +++ lib/Target/Mips/Mips16InstrInfo.td @@ -1407,14 +1407,6 @@ // Large (>16 bit) immediate loads def : Mips16Pat<(i32 imm:$imm), (LwConstant32 imm:$imm, -1)>; -// Carry MipsPatterns -def : Mips16Pat<(subc CPU16Regs:$lhs, CPU16Regs:$rhs), - (SubuRxRyRz16 CPU16Regs:$lhs, CPU16Regs:$rhs)>; -def : Mips16Pat<(addc CPU16Regs:$lhs, CPU16Regs:$rhs), - (AdduRxRyRz16 CPU16Regs:$lhs, CPU16Regs:$rhs)>; -def : Mips16Pat<(addc CPU16Regs:$src, immSExt16:$imm), - (AddiuRxRxImmX16 CPU16Regs:$src, imm:$imm)>; - // // Some branch conditional patterns are not generated by llvm at this time. // Some are for seemingly arbitrary reasons not used: i.e. with signed number Index: lib/Target/Mips/MipsISelLowering.cpp =================================================================== --- lib/Target/Mips/MipsISelLowering.cpp +++ lib/Target/Mips/MipsISelLowering.cpp @@ -393,11 +393,6 @@ setOperationAction(ISD::UDIV, MVT::i64, Expand); setOperationAction(ISD::UREM, MVT::i64, Expand); - if (Subtarget.hasDSP() && Subtarget.hasMips32r2()) { - setOperationAction(ISD::ADDC, MVT::i32, Legal); - setOperationAction(ISD::ADDE, MVT::i32, Legal); - } - // Operations not directly supported by Mips. setOperationAction(ISD::BR_CC, MVT::f32, Expand); setOperationAction(ISD::BR_CC, MVT::f64, Expand); Index: lib/Target/Mips/MipsSEISelLowering.cpp =================================================================== --- lib/Target/Mips/MipsSEISelLowering.cpp +++ lib/Target/Mips/MipsSEISelLowering.cpp @@ -104,6 +104,11 @@ setTargetDAGCombine(ISD::SRL); setTargetDAGCombine(ISD::SETCC); setTargetDAGCombine(ISD::VSELECT); + + if (Subtarget.hasMips32r2()) { + setOperationAction(ISD::ADDC, MVT::i32, Legal); + setOperationAction(ISD::ADDE, MVT::i32, Legal); + } } if (Subtarget.hasDSPR2())