Skip to content

Commit 9a92adf

Browse files
committed
ISel/AArch64: fix all issues
1 parent ab50733 commit 9a92adf

File tree

7 files changed

+2267
-3255
lines changed

7 files changed

+2267
-3255
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,6 +1304,12 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
13041304
setOperationAction(Op, Ty, Legal);
13051305
}
13061306

1307+
// LRINT and LLRINT.
1308+
for (auto VT : MVT::fp_fixedlen_vector_valuetypes()) {
1309+
setOperationAction(ISD::LRINT, VT, Custom);
1310+
setOperationAction(ISD::LLRINT, VT, Custom);
1311+
}
1312+
13071313
setTruncStoreAction(MVT::v4i16, MVT::v4i8, Custom);
13081314

13091315
setOperationAction(ISD::BITCAST, MVT::i2, Custom);
@@ -1419,6 +1425,12 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
14191425
setOperationAction(ISD::OR, VT, Custom);
14201426
}
14211427

1428+
// LRINT and LLRINT.
1429+
for (auto VT : MVT::fp_scalable_vector_valuetypes()) {
1430+
setOperationAction(ISD::LRINT, VT, Custom);
1431+
setOperationAction(ISD::LLRINT, VT, Custom);
1432+
}
1433+
14221434
// Illegal unpacked integer vector types.
14231435
for (auto VT : {MVT::nxv8i8, MVT::nxv4i16, MVT::nxv2i32}) {
14241436
setOperationAction(ISD::EXTRACT_SUBVECTOR, VT, Custom);
@@ -1526,8 +1538,6 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
15261538
setOperationAction(ISD::FNEARBYINT, VT, Custom);
15271539
setOperationAction(ISD::FRINT, VT, Custom);
15281540
setOperationAction(ISD::FROUND, VT, Custom);
1529-
setOperationAction(ISD::LRINT, VT, Custom);
1530-
setOperationAction(ISD::LLRINT, VT, Custom);
15311541
setOperationAction(ISD::FROUNDEVEN, VT, Custom);
15321542
setOperationAction(ISD::FTRUNC, VT, Custom);
15331543
setOperationAction(ISD::FSQRT, VT, Custom);
@@ -1667,6 +1677,11 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
16671677
setOperationAction(ISD::MULHU, VT, Custom);
16681678
}
16691679

1680+
// LRINT and LLRINT.
1681+
for (auto VT : MVT::fp_fixedlen_vector_valuetypes()) {
1682+
setOperationAction(ISD::LRINT, VT, Custom);
1683+
setOperationAction(ISD::LLRINT, VT, Custom);
1684+
}
16701685

16711686
// Use SVE for vectors with more than 2 elements.
16721687
for (auto VT : {MVT::v4f16, MVT::v8f16, MVT::v4f32})
@@ -1942,8 +1957,6 @@ void AArch64TargetLowering::addTypeForFixedLengthSVE(MVT VT) {
19421957
setOperationAction(ISD::FP_TO_UINT, VT, Default);
19431958
setOperationAction(ISD::FRINT, VT, Default);
19441959
setOperationAction(ISD::FROUND, VT, Default);
1945-
setOperationAction(ISD::LRINT, VT, Default);
1946-
setOperationAction(ISD::LLRINT, VT, Default);
19471960
setOperationAction(ISD::FROUNDEVEN, VT, Default);
19481961
setOperationAction(ISD::FSQRT, VT, Default);
19491962
setOperationAction(ISD::FSUB, VT, Default);
@@ -4374,30 +4387,15 @@ SDValue AArch64TargetLowering::LowerVectorXRINT(SDValue Op,
43744387

43754388
assert(VT.isVector() && "Expected vector type");
43764389

4377-
EVT ContainerVT = VT;
4378-
EVT SrcVT = Src.getValueType();
43794390
EVT CastVT =
4380-
ContainerVT.changeVectorElementType(SrcVT.getVectorElementType());
4391+
VT.changeVectorElementType(Src.getValueType().getVectorElementType());
43814392

4382-
if (VT.isFixedLengthVector()) {
4383-
ContainerVT = getContainerForFixedLengthVector(DAG, VT);
4384-
CastVT = ContainerVT.changeVectorElementType(SrcVT.getVectorElementType());
4385-
Src = convertToScalableVector(DAG, CastVT, Src);
4386-
}
4387-
4388-
// First, round the floating-point value into a floating-point register with
4389-
// the current rounding mode.
4393+
// Round the floating-point value into a floating-point register with the
4394+
// current rounding mode.
43904395
SDValue FOp = DAG.getNode(ISD::FRINT, DL, CastVT, Src);
43914396

4392-
// Finally, truncate the rounded floating point to an integer, rounding to
4393-
// zero.
4394-
SDValue Truncated =
4395-
DAG.getNode(ISD::FP_TO_SINT, DL, ContainerVT, FOp.getOperand(0));
4396-
4397-
if (VT.isScalableVector())
4398-
return Truncated;
4399-
4400-
return convertFromScalableVector(DAG, VT, Truncated);
4397+
// Truncate the rounded floating point to an integer, rounding to zero.
4398+
return DAG.getNode(ISD::FP_TO_SINT, DL, VT, FOp);
44014399
}
44024400

44034401
SDValue AArch64TargetLowering::LowerVectorINT_TO_FP(SDValue Op,

0 commit comments

Comments
 (0)