@@ -164,6 +164,9 @@ static cl::opt<bool> UseFEATCPACodegen(
164
164
/// Value type used for condition codes.
165
165
static const MVT MVT_CC = MVT::i32;
166
166
167
+ /// Value type used for NZCV flags.
168
+ static constexpr MVT FlagsVT = MVT::i32;
169
+
167
170
static const MCPhysReg GPRArgRegs[] = {AArch64::X0, AArch64::X1, AArch64::X2,
168
171
AArch64::X3, AArch64::X4, AArch64::X5,
169
172
AArch64::X6, AArch64::X7};
@@ -3451,7 +3454,7 @@ static SDValue emitStrictFPComparison(SDValue LHS, SDValue RHS, const SDLoc &DL,
3451
3454
}
3452
3455
unsigned Opcode =
3453
3456
IsSignaling ? AArch64ISD::STRICT_FCMPE : AArch64ISD::STRICT_FCMP;
3454
- return DAG.getNode(Opcode, DL, {MVT::i32 , MVT::Other}, {Chain, LHS, RHS});
3457
+ return DAG.getNode(Opcode, DL, {FlagsVT , MVT::Other}, {Chain, LHS, RHS});
3455
3458
}
3456
3459
3457
3460
static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
@@ -3465,7 +3468,7 @@ static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3465
3468
LHS = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, LHS);
3466
3469
RHS = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, RHS);
3467
3470
}
3468
- return DAG.getNode(AArch64ISD::FCMP, DL, MVT::i32 , LHS, RHS);
3471
+ return DAG.getNode(AArch64ISD::FCMP, DL, FlagsVT , LHS, RHS);
3469
3472
}
3470
3473
3471
3474
// The CMP instruction is just an alias for SUBS, and representing it as
@@ -3490,7 +3493,7 @@ static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3490
3493
// (a.k.a. ANDS) except that the flags are only guaranteed to work for one
3491
3494
// of the signed comparisons.
3492
3495
const SDValue ANDSNode =
3493
- DAG.getNode(AArch64ISD::ANDS, DL, DAG.getVTList(VT, MVT_CC ),
3496
+ DAG.getNode(AArch64ISD::ANDS, DL, DAG.getVTList(VT, FlagsVT ),
3494
3497
LHS.getOperand(0), LHS.getOperand(1));
3495
3498
// Replace all users of (and X, Y) with newly generated (ands X, Y)
3496
3499
DAG.ReplaceAllUsesWith(LHS, ANDSNode);
@@ -3501,7 +3504,7 @@ static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
3501
3504
}
3502
3505
}
3503
3506
3504
- return DAG.getNode(Opcode, DL, DAG.getVTList(VT, MVT_CC ), LHS, RHS)
3507
+ return DAG.getNode(Opcode, DL, DAG.getVTList(VT, FlagsVT ), LHS, RHS)
3505
3508
.getValue(1);
3506
3509
}
3507
3510
@@ -3597,7 +3600,7 @@ static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
3597
3600
AArch64CC::CondCode InvOutCC = AArch64CC::getInvertedCondCode(OutCC);
3598
3601
unsigned NZCV = AArch64CC::getNZCVToSatisfyCondCode(InvOutCC);
3599
3602
SDValue NZCVOp = DAG.getConstant(NZCV, DL, MVT::i32);
3600
- return DAG.getNode(Opcode, DL, MVT_CC , LHS, RHS, NZCVOp, Condition, CCOp);
3603
+ return DAG.getNode(Opcode, DL, FlagsVT , LHS, RHS, NZCVOp, Condition, CCOp);
3601
3604
}
3602
3605
3603
3606
/// Returns true if @p Val is a tree of AND/OR/SETCC operations that can be
@@ -4036,7 +4039,7 @@ getAArch64XALUOOp(AArch64CC::CondCode &CC, SDValue Op, SelectionDAG &DAG) {
4036
4039
Value = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Mul);
4037
4040
4038
4041
// Check that the result fits into a 32-bit integer.
4039
- SDVTList VTs = DAG.getVTList(MVT::i64, MVT_CC );
4042
+ SDVTList VTs = DAG.getVTList(MVT::i64, FlagsVT );
4040
4043
if (IsSigned) {
4041
4044
// cmp xreg, wreg, sxtw
4042
4045
SDValue SExtMul = DAG.getNode(ISD::SIGN_EXTEND, DL, MVT::i64, Value);
@@ -4059,12 +4062,12 @@ getAArch64XALUOOp(AArch64CC::CondCode &CC, SDValue Op, SelectionDAG &DAG) {
4059
4062
DAG.getConstant(63, DL, MVT::i64));
4060
4063
// It is important that LowerBits is last, otherwise the arithmetic
4061
4064
// shift will not be folded into the compare (SUBS).
4062
- SDVTList VTs = DAG.getVTList(MVT::i64, MVT::i32 );
4065
+ SDVTList VTs = DAG.getVTList(MVT::i64, FlagsVT );
4063
4066
Overflow = DAG.getNode(AArch64ISD::SUBS, DL, VTs, UpperBits, LowerBits)
4064
4067
.getValue(1);
4065
4068
} else {
4066
4069
SDValue UpperBits = DAG.getNode(ISD::MULHU, DL, MVT::i64, LHS, RHS);
4067
- SDVTList VTs = DAG.getVTList(MVT::i64, MVT::i32 );
4070
+ SDVTList VTs = DAG.getVTList(MVT::i64, FlagsVT );
4068
4071
Overflow =
4069
4072
DAG.getNode(AArch64ISD::SUBS, DL, VTs,
4070
4073
DAG.getConstant(0, DL, MVT::i64),
@@ -4075,7 +4078,7 @@ getAArch64XALUOOp(AArch64CC::CondCode &CC, SDValue Op, SelectionDAG &DAG) {
4075
4078
} // switch (...)
4076
4079
4077
4080
if (Opc) {
4078
- SDVTList VTs = DAG.getVTList(Op->getValueType(0), MVT::i32 );
4081
+ SDVTList VTs = DAG.getVTList(Op->getValueType(0), FlagsVT );
4079
4082
4080
4083
// Emit the AArch64 operation with overflow check.
4081
4084
Value = DAG.getNode(Opc, DL, VTs, LHS, RHS);
@@ -4177,7 +4180,7 @@ static SDValue valueToCarryFlag(SDValue Value, SelectionDAG &DAG, bool Invert) {
4177
4180
SDValue Op0 = Invert ? DAG.getConstant(0, DL, VT) : Value;
4178
4181
SDValue Op1 = Invert ? Value : DAG.getConstant(1, DL, VT);
4179
4182
SDValue Cmp =
4180
- DAG.getNode(AArch64ISD::SUBS, DL, DAG.getVTList(VT, MVT::Glue ), Op0, Op1);
4183
+ DAG.getNode(AArch64ISD::SUBS, DL, DAG.getVTList(VT, FlagsVT ), Op0, Op1);
4181
4184
return Cmp.getValue(1);
4182
4185
}
4183
4186
@@ -4222,7 +4225,7 @@ static SDValue lowerADDSUBO_CARRY(SDValue Op, SelectionDAG &DAG,
4222
4225
SDLoc DL(Op);
4223
4226
SDVTList VTs = DAG.getVTList(VT0, VT1);
4224
4227
4225
- SDValue Sum = DAG.getNode(Opcode, DL, DAG.getVTList(VT0, MVT::Glue ), OpLHS,
4228
+ SDValue Sum = DAG.getNode(Opcode, DL, DAG.getVTList(VT0, FlagsVT ), OpLHS,
4226
4229
OpRHS, OpCarryIn);
4227
4230
4228
4231
SDValue OutFlag =
@@ -7037,9 +7040,8 @@ SDValue AArch64TargetLowering::LowerABS(SDValue Op, SelectionDAG &DAG) const {
7037
7040
SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT),
7038
7041
Op.getOperand(0));
7039
7042
// Generate SUBS & CSEL.
7040
- SDValue Cmp =
7041
- DAG.getNode(AArch64ISD::SUBS, DL, DAG.getVTList(VT, MVT::i32),
7042
- Op.getOperand(0), DAG.getConstant(0, DL, VT));
7043
+ SDValue Cmp = DAG.getNode(AArch64ISD::SUBS, DL, DAG.getVTList(VT, FlagsVT),
7044
+ Op.getOperand(0), DAG.getConstant(0, DL, VT));
7043
7045
return DAG.getNode(AArch64ISD::CSEL, DL, VT, Op.getOperand(0), Neg,
7044
7046
DAG.getConstant(AArch64CC::PL, DL, MVT::i32),
7045
7047
Cmp.getValue(1));
@@ -11108,7 +11110,7 @@ SDValue AArch64TargetLowering::LowerSETCCCARRY(SDValue Op,
11108
11110
SDValue Carry = Op.getOperand(2);
11109
11111
// SBCS uses a carry not a borrow so the carry flag should be inverted first.
11110
11112
SDValue InvCarry = valueToCarryFlag(Carry, DAG, true);
11111
- SDValue Cmp = DAG.getNode(AArch64ISD::SBCS, DL, DAG.getVTList(VT, MVT::Glue ),
11113
+ SDValue Cmp = DAG.getNode(AArch64ISD::SBCS, DL, DAG.getVTList(VT, FlagsVT ),
11112
11114
LHS, RHS, InvCarry);
11113
11115
11114
11116
EVT OpVT = Op.getValueType();
@@ -12441,10 +12443,10 @@ SDValue AArch64TargetLowering::LowerAsmOutputForConstraint(
12441
12443
12442
12444
// Get NZCV register. Only update chain when copyfrom is glued.
12443
12445
if (Glue.getNode()) {
12444
- Glue = DAG.getCopyFromReg(Chain, DL, AArch64::NZCV, MVT::i32 , Glue);
12446
+ Glue = DAG.getCopyFromReg(Chain, DL, AArch64::NZCV, FlagsVT , Glue);
12445
12447
Chain = Glue.getValue(1);
12446
12448
} else
12447
- Glue = DAG.getCopyFromReg(Chain, DL, AArch64::NZCV, MVT::i32 );
12449
+ Glue = DAG.getCopyFromReg(Chain, DL, AArch64::NZCV, FlagsVT );
12448
12450
// Extract CC code.
12449
12451
SDValue CC = getSETCC(Cond, Glue, DL, DAG);
12450
12452
@@ -18593,7 +18595,7 @@ AArch64TargetLowering::BuildSREMPow2(SDNode *N, const APInt &Divisor,
18593
18595
Created.push_back(And.getNode());
18594
18596
} else {
18595
18597
SDValue CCVal = DAG.getConstant(AArch64CC::MI, DL, MVT_CC);
18596
- SDVTList VTs = DAG.getVTList(VT, MVT::i32 );
18598
+ SDVTList VTs = DAG.getVTList(VT, FlagsVT );
18597
18599
18598
18600
SDValue Negs = DAG.getNode(AArch64ISD::SUBS, DL, VTs, Zero, N0);
18599
18601
SDValue AndPos = DAG.getNode(ISD::AND, DL, VT, N0, Pow2MinusOne);
@@ -19482,10 +19484,10 @@ static SDValue performANDORCSELCombine(SDNode *N, SelectionDAG &DAG) {
19482
19484
// can select to CCMN to avoid the extra mov
19483
19485
SDValue AbsOp1 =
19484
19486
DAG.getConstant(Op1->getAPIntValue().abs(), DL, Op1->getValueType(0));
19485
- CCmp = DAG.getNode(AArch64ISD::CCMN, DL, MVT_CC , Cmp1.getOperand(0), AbsOp1 ,
19486
- NZCVOp, Condition, Cmp0);
19487
+ CCmp = DAG.getNode(AArch64ISD::CCMN, DL, FlagsVT , Cmp1.getOperand(0),
19488
+ AbsOp1, NZCVOp, Condition, Cmp0);
19487
19489
} else {
19488
- CCmp = DAG.getNode(AArch64ISD::CCMP, DL, MVT_CC , Cmp1.getOperand(0),
19490
+ CCmp = DAG.getNode(AArch64ISD::CCMP, DL, FlagsVT , Cmp1.getOperand(0),
19489
19491
Cmp1.getOperand(1), NZCVOp, Condition, Cmp0);
19490
19492
}
19491
19493
return DAG.getNode(AArch64ISD::CSEL, DL, VT, CSel0.getOperand(0),
@@ -25134,8 +25136,9 @@ static SDValue reassociateCSELOperandsForCSE(SDNode *N, SelectionDAG &DAG) {
25134
25136
if (!TReassocOp && !FReassocOp)
25135
25137
return SDValue();
25136
25138
25137
- SDValue NewCmp = DAG.getNode(AArch64ISD::SUBS, SDLoc(SubsNode),
25138
- DAG.getVTList(VT, MVT_CC), CmpOpOther, SubsOp);
25139
+ SDValue NewCmp =
25140
+ DAG.getNode(AArch64ISD::SUBS, SDLoc(SubsNode),
25141
+ DAG.getVTList(VT, FlagsVT), CmpOpOther, SubsOp);
25139
25142
25140
25143
auto Reassociate = [&](SDValue ReassocOp, unsigned OpNum) {
25141
25144
if (!ReassocOp)
@@ -27161,7 +27164,7 @@ SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
27161
27164
: AArch64SysReg::RNDRRS);
27162
27165
SDLoc DL(N);
27163
27166
SDValue A = DAG.getNode(
27164
- AArch64ISD::MRS, DL, DAG.getVTList(MVT::i64, MVT::i32 , MVT::Other),
27167
+ AArch64ISD::MRS, DL, DAG.getVTList(MVT::i64, FlagsVT , MVT::Other),
27165
27168
N->getOperand(0), DAG.getConstant(Register, DL, MVT::i32));
27166
27169
SDValue B = DAG.getNode(
27167
27170
AArch64ISD::CSINC, DL, MVT::i32, DAG.getConstant(0, DL, MVT::i32),
0 commit comments