@@ -357,7 +357,7 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
357
357
addRegisterClass(MVT::f128, &AArch64::FPR128RegClass);
358
358
}
359
359
360
- if (Subtarget->hasNEON ()) {
360
+ if (Subtarget->isNeonAvailable ()) {
361
361
addRegisterClass(MVT::v16i8, &AArch64::FPR8RegClass);
362
362
addRegisterClass(MVT::v8i16, &AArch64::FPR16RegClass);
363
363
// Someone set us up the NEON.
@@ -378,6 +378,27 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
378
378
addQRTypeForNEON(MVT::v2i64);
379
379
addQRTypeForNEON(MVT::v8f16);
380
380
addQRTypeForNEON(MVT::v8bf16);
381
+ } else if (Subtarget->hasNEON() || Subtarget->useSVEForFixedLengthVectors()) {
382
+ addRegisterClass(MVT::v16i8, &AArch64::FPR8RegClass);
383
+ addRegisterClass(MVT::v8i16, &AArch64::FPR16RegClass);
384
+
385
+ addRegisterClass(MVT::v2f32, &AArch64::FPR64RegClass);
386
+ addRegisterClass(MVT::v8i8, &AArch64::FPR64RegClass);
387
+ addRegisterClass(MVT::v4i16, &AArch64::FPR64RegClass);
388
+ addRegisterClass(MVT::v2i32, &AArch64::FPR64RegClass);
389
+ addRegisterClass(MVT::v1i64, &AArch64::FPR64RegClass);
390
+ addRegisterClass(MVT::v1f64, &AArch64::FPR64RegClass);
391
+ addRegisterClass(MVT::v4f16, &AArch64::FPR64RegClass);
392
+ addRegisterClass(MVT::v4bf16, &AArch64::FPR64RegClass);
393
+
394
+ addRegisterClass(MVT::v4f32, &AArch64::FPR128RegClass);
395
+ addRegisterClass(MVT::v2f64, &AArch64::FPR128RegClass);
396
+ addRegisterClass(MVT::v16i8, &AArch64::FPR128RegClass);
397
+ addRegisterClass(MVT::v8i16, &AArch64::FPR128RegClass);
398
+ addRegisterClass(MVT::v4i32, &AArch64::FPR128RegClass);
399
+ addRegisterClass(MVT::v2i64, &AArch64::FPR128RegClass);
400
+ addRegisterClass(MVT::v8f16, &AArch64::FPR128RegClass);
401
+ addRegisterClass(MVT::v8bf16, &AArch64::FPR128RegClass);
381
402
}
382
403
383
404
if (Subtarget->hasSVEorSME()) {
@@ -1125,7 +1146,7 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
1125
1146
1126
1147
setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
1127
1148
1128
- if (Subtarget->hasNEON ()) {
1149
+ if (Subtarget->isNeonAvailable ()) {
1129
1150
// FIXME: v1f64 shouldn't be legal if we can avoid it, because it leads to
1130
1151
// silliness like this:
1131
1152
for (auto Op :
@@ -1337,6 +1358,24 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
1337
1358
// FADDP custom lowering
1338
1359
for (MVT VT : { MVT::v16f16, MVT::v8f32, MVT::v4f64 })
1339
1360
setOperationAction(ISD::FADD, VT, Custom);
1361
+ } else {
1362
+ for (MVT VT : MVT::fixedlen_vector_valuetypes()) {
1363
+ for (unsigned Op = 0; Op < ISD::BUILTIN_OP_END; ++Op)
1364
+ setOperationAction(Op, VT, Expand);
1365
+
1366
+ if (VT.is128BitVector() || VT.is64BitVector()) {
1367
+ setOperationAction(ISD::LOAD, VT, Legal);
1368
+ setOperationAction(ISD::STORE, VT, Legal);
1369
+ setOperationAction(ISD::BITCAST, VT,
1370
+ Subtarget->isLittleEndian() ? Legal : Expand);
1371
+ }
1372
+ for (MVT InnerVT : MVT::fixedlen_vector_valuetypes()) {
1373
+ setTruncStoreAction(VT, InnerVT, Expand);
1374
+ setLoadExtAction(ISD::SEXTLOAD, VT, InnerVT, Expand);
1375
+ setLoadExtAction(ISD::ZEXTLOAD, VT, InnerVT, Expand);
1376
+ setLoadExtAction(ISD::EXTLOAD, VT, InnerVT, Expand);
1377
+ }
1378
+ }
1340
1379
}
1341
1380
1342
1381
if (Subtarget->hasSME()) {
@@ -9445,7 +9484,8 @@ SDValue AArch64TargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
9445
9484
9446
9485
SDValue AArch64TargetLowering::LowerFCOPYSIGN(SDValue Op,
9447
9486
SelectionDAG &DAG) const {
9448
- if (!Subtarget->hasNEON())
9487
+ if (!Subtarget->isNeonAvailable() &&
9488
+ !Subtarget->useSVEForFixedLengthVectors())
9449
9489
return SDValue();
9450
9490
9451
9491
EVT VT = Op.getValueType();
@@ -14141,6 +14181,13 @@ SDValue AArch64TargetLowering::LowerDIV(SDValue Op, SelectionDAG &DAG) const {
14141
14181
return DAG.getNode(AArch64ISD::UZP1, dl, VT, ResultLo, ResultHi);
14142
14182
}
14143
14183
14184
+ bool AArch64TargetLowering::shouldExpandBuildVectorWithShuffles(
14185
+ EVT VT, unsigned DefinedValues) const {
14186
+ if (!Subtarget->isNeonAvailable())
14187
+ return false;
14188
+ return TargetLowering::shouldExpandBuildVectorWithShuffles(VT, DefinedValues);
14189
+ }
14190
+
14144
14191
bool AArch64TargetLowering::isShuffleMaskLegal(ArrayRef<int> M, EVT VT) const {
14145
14192
// Currently no fixed length shuffles that require SVE are legal.
14146
14193
if (useSVEForFixedLengthVectorVT(VT, !Subtarget->isNeonAvailable()))
0 commit comments