- if ((!Subtarget->is64Bit() && Op0.getValueType() == MVT::i64) ||
- (Subtarget->is64Bit() && Op0.getValueType() == MVT::i128)) {
- switch (X86CC) {
- case X86::COND_E:
- case X86::COND_NE:
- case X86::COND_S:
- case X86::COND_NS:
- // Just use the generic lowering, which works well on x86.
- return SDValue();
- case X86::COND_B:
- case X86::COND_AE:
- case X86::COND_L:
- case X86::COND_GE:
- // Use SBB-based lowering.
- break;
- case X86::COND_A:
- // Use SBB-based lowering; commute so ZF isn't used.
- X86CC = X86::COND_B;
- std::swap(Op0, Op1);
- break;
- case X86::COND_BE:
- // Use SBB-based lowering; commute so ZF isn't used.
- X86CC = X86::COND_AE;
- std::swap(Op0, Op1);
- break;
- case X86::COND_G:
- // Use SBB-based lowering; commute so ZF isn't used.
- X86CC = X86::COND_L;
- std::swap(Op0, Op1);
- break;
- case X86::COND_LE:
- // Use SBB-based lowering; commute so ZF isn't used.
- X86CC = X86::COND_GE;
- std::swap(Op0, Op1);
- break;
- default:
- assert(0 && "Unexpected X86CC.");
- return SDValue();
- }
- MVT HalfType = getPointerTy();
- // FIXME: Refactor this code out to implement ISD::SADDO and friends.
- SDValue Op0Low = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, HalfType,
- Op0, DAG.getIntPtrConstant(0));
- SDValue Op1Low = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, HalfType,
- Op1, DAG.getIntPtrConstant(0));
- SDValue Op0High = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, HalfType,
- Op0, DAG.getIntPtrConstant(1));
- SDValue Op1High = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, HalfType,
- Op1, DAG.getIntPtrConstant(1));
- // Redirect some cases which will simplify to the generic expansion;
- // X86ISD::SUB and X86ISD::SBB are not optimized well at the moment.
- // FIXME: We really need to add DAGCombines for SUB/SBB/etc.
- if (Op1Low.getOpcode() == ISD::Constant &&
- cast<ConstantSDNode>(Op1Low)->isNullValue())
- return SDValue();
- if (Op0Low.getOpcode() == ISD::Constant &&
- cast<ConstantSDNode>(Op0Low)->isAllOnesValue())
- return SDValue();
- SDValue res1, res2;
- SDVTList VTList = DAG.getVTList(HalfType, MVT::i32);
- res1 = DAG.getNode(X86ISD::SUB, dl, VTList, Op0Low, Op1Low).getValue(1);
- res2 = DAG.getNode(X86ISD::SBB, dl, VTList, Op0High, Op1High,
- res1).getValue(1);
- return DAG.getNode(X86ISD::SETCC, dl, MVT::i8,
- DAG.getConstant(X86CC, MVT::i8), res2);
- }
-