@@ -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 :
@@ -1328,6 +1349,24 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
1328
1349
// FADDP custom lowering
1329
1350
for (MVT VT : { MVT::v16f16, MVT::v8f32, MVT::v4f64 })
1330
1351
setOperationAction(ISD::FADD, VT, Custom);
1352
+ } else {
1353
+ for (MVT VT : MVT::fixedlen_vector_valuetypes()) {
1354
+ for (unsigned Op = 0; Op < ISD::BUILTIN_OP_END; ++Op)
1355
+ setOperationAction(Op, VT, Expand);
1356
+
1357
+ if (VT.is128BitVector() || VT.is64BitVector()) {
1358
+ setOperationAction(ISD::LOAD, VT, Legal);
1359
+ setOperationAction(ISD::STORE, VT, Legal);
1360
+ setOperationAction(ISD::BITCAST, VT,
1361
+ Subtarget->isLittleEndian() ? Legal : Expand);
1362
+ }
1363
+ for (MVT InnerVT : MVT::fixedlen_vector_valuetypes()) {
1364
+ setTruncStoreAction(VT, InnerVT, Expand);
1365
+ setLoadExtAction(ISD::SEXTLOAD, VT, InnerVT, Expand);
1366
+ setLoadExtAction(ISD::ZEXTLOAD, VT, InnerVT, Expand);
1367
+ setLoadExtAction(ISD::EXTLOAD, VT, InnerVT, Expand);
1368
+ }
1369
+ }
1331
1370
}
1332
1371
1333
1372
if (Subtarget->hasSME()) {
@@ -9377,7 +9416,8 @@ SDValue AArch64TargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
9377
9416
9378
9417
SDValue AArch64TargetLowering::LowerFCOPYSIGN(SDValue Op,
9379
9418
SelectionDAG &DAG) const {
9380
- if (!Subtarget->hasNEON())
9419
+ if (!Subtarget->isNeonAvailable() &&
9420
+ !Subtarget->useSVEForFixedLengthVectors())
9381
9421
return SDValue();
9382
9422
9383
9423
EVT VT = Op.getValueType();
@@ -14110,6 +14150,13 @@ SDValue AArch64TargetLowering::LowerDIV(SDValue Op, SelectionDAG &DAG) const {
14110
14150
return DAG.getNode(AArch64ISD::UZP1, dl, VT, ResultLo, ResultHi);
14111
14151
}
14112
14152
14153
+ bool AArch64TargetLowering::shouldExpandBuildVectorWithShuffles(
14154
+ EVT VT, unsigned DefinedValues) const {
14155
+ if (!Subtarget->isNeonAvailable())
14156
+ return false;
14157
+ return TargetLowering::shouldExpandBuildVectorWithShuffles(VT, DefinedValues);
14158
+ }
14159
+
14113
14160
bool AArch64TargetLowering::isShuffleMaskLegal(ArrayRef<int> M, EVT VT) const {
14114
14161
// Currently no fixed length shuffles that require SVE are legal.
14115
14162
if (useSVEForFixedLengthVectorVT(VT, !Subtarget->isNeonAvailable()))
0 commit comments