@@ -24139,6 +24139,32 @@ static SDValue LowerSELECTWithCmpZero(SDValue CmpVal, SDValue LHS, SDValue RHS,
24139
24139
}
24140
24140
}
24141
24141
24142
+ if ((X86CC == X86::COND_E || X86CC == X86::COND_NE) &&
24143
+ (isAllOnesConstant(LHS) || isAllOnesConstant(RHS))) {
24144
+ SDValue Y = isAllOnesConstant(RHS) ? LHS : RHS;
24145
+ SDVTList CmpVTs = DAG.getVTList(CmpVT, MVT::i32);
24146
+
24147
+ // 'X - 1' sets the carry flag if X == 0.
24148
+ // '0 - X' sets the carry flag if X != 0.
24149
+ // Convert the carry flag to a -1/0 mask with sbb:
24150
+ // select (X != 0), -1, Y --> 0 - X; or (sbb), Y
24151
+ // select (X == 0), Y, -1 --> 0 - X; or (sbb), Y
24152
+ // select (X != 0), Y, -1 --> X - 1; or (sbb), Y
24153
+ // select (X == 0), -1, Y --> X - 1; or (sbb), Y
24154
+ SDValue Sub;
24155
+ if (isAllOnesConstant(LHS) == (X86CC == X86::COND_NE)) {
24156
+ SDValue Zero = DAG.getConstant(0, DL, CmpVT);
24157
+ Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, Zero, CmpVal);
24158
+ } else {
24159
+ SDValue One = DAG.getConstant(1, DL, CmpVT);
24160
+ Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, CmpVal, One);
24161
+ }
24162
+ SDValue SBB = DAG.getNode(X86ISD::SETCC_CARRY, DL, VT,
24163
+ DAG.getTargetConstant(X86::COND_B, DL, MVT::i8),
24164
+ Sub.getValue(1));
24165
+ return DAG.getNode(ISD::OR, DL, VT, SBB, Y);
24166
+ }
24167
+
24142
24168
return SDValue();
24143
24169
}
24144
24170
@@ -24262,30 +24288,6 @@ SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) const {
24262
24288
((CondCode == X86::COND_NE && MatchFFSMinus1(Op1, Op2)) ||
24263
24289
(CondCode == X86::COND_E && MatchFFSMinus1(Op2, Op1)))) {
24264
24290
// Keep Cmp.
24265
- } else if ((isAllOnesConstant(Op1) || isAllOnesConstant(Op2)) &&
24266
- (CondCode == X86::COND_E || CondCode == X86::COND_NE)) {
24267
- SDValue Y = isAllOnesConstant(Op2) ? Op1 : Op2;
24268
- SDVTList CmpVTs = DAG.getVTList(CmpOp0.getValueType(), MVT::i32);
24269
-
24270
- // 'X - 1' sets the carry flag if X == 0.
24271
- // '0 - X' sets the carry flag if X != 0.
24272
- // Convert the carry flag to a -1/0 mask with sbb:
24273
- // select (X != 0), -1, Y --> 0 - X; or (sbb), Y
24274
- // select (X == 0), Y, -1 --> 0 - X; or (sbb), Y
24275
- // select (X != 0), Y, -1 --> X - 1; or (sbb), Y
24276
- // select (X == 0), -1, Y --> X - 1; or (sbb), Y
24277
- SDValue Sub;
24278
- if (isAllOnesConstant(Op1) == (CondCode == X86::COND_NE)) {
24279
- SDValue Zero = DAG.getConstant(0, DL, CmpOp0.getValueType());
24280
- Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, Zero, CmpOp0);
24281
- } else {
24282
- SDValue One = DAG.getConstant(1, DL, CmpOp0.getValueType());
24283
- Sub = DAG.getNode(X86ISD::SUB, DL, CmpVTs, CmpOp0, One);
24284
- }
24285
- SDValue SBB = DAG.getNode(X86ISD::SETCC_CARRY, DL, VT,
24286
- DAG.getTargetConstant(X86::COND_B, DL, MVT::i8),
24287
- Sub.getValue(1));
24288
- return DAG.getNode(ISD::OR, DL, VT, SBB, Y);
24289
24291
} else if (SDValue R = LowerSELECTWithCmpZero(CmpOp0, Op1, Op2, CondCode,
24290
24292
DL, DAG, Subtarget)) {
24291
24293
return R;
0 commit comments