@@ -61,6 +61,11 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
6161 const LLT v2s64 = LLT::fixed_vector (2 , 64 );
6262 const LLT v2p0 = LLT::fixed_vector (2 , p0);
6363
64+ const LLT nxv16s8 = LLT::scalable_vector (16 , s8);
65+ const LLT nxv8s16 = LLT::scalable_vector (8 , s16);
66+ const LLT nxv4s32 = LLT::scalable_vector (4 , s32);
67+ const LLT nxv2s64 = LLT::scalable_vector (2 , s64);
68+
6469 std::initializer_list<LLT> PackedVectorAllTypeList = {/* Begin 128bit types */
6570 v16s8, v8s16, v4s32,
6671 v2s64, v2p0,
@@ -328,7 +333,31 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
328333 return ValTy.isPointerVector () && ValTy.getAddressSpace () == 0 ;
329334 };
330335
331- getActionDefinitionsBuilder (G_LOAD)
336+ auto &LoadActions = getActionDefinitionsBuilder (G_LOAD);
337+ auto &StoreActions = getActionDefinitionsBuilder (G_STORE);
338+
339+ if (ST.hasSVE ()) {
340+ LoadActions.legalForTypesWithMemDesc ({
341+ // 128 bit base sizes
342+ {nxv16s8, p0, nxv16s8, 8 },
343+ {nxv8s16, p0, nxv8s16, 8 },
344+ {nxv4s32, p0, nxv4s32, 8 },
345+ {nxv2s64, p0, nxv2s64, 8 },
346+ });
347+
348+ // TODO: Add nxv2p0. Consider bitcastIf.
349+ // See #92130
350+ // https://github.com/llvm/llvm-project/pull/92130#discussion_r1616888461
351+ StoreActions.legalForTypesWithMemDesc ({
352+ // 128 bit base sizes
353+ {nxv16s8, p0, nxv16s8, 8 },
354+ {nxv8s16, p0, nxv8s16, 8 },
355+ {nxv4s32, p0, nxv4s32, 8 },
356+ {nxv2s64, p0, nxv2s64, 8 },
357+ });
358+ }
359+
360+ LoadActions
332361 .customIf ([=](const LegalityQuery &Query) {
333362 return HasRCPC3 && Query.Types [0 ] == s128 &&
334363 Query.MMODescrs [0 ].Ordering == AtomicOrdering::Acquire;
@@ -378,7 +407,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
378407 .customIf (IsPtrVecPred)
379408 .scalarizeIf (typeInSet (0 , {v2s16, v2s8}), 0 );
380409
381- getActionDefinitionsBuilder (G_STORE)
410+ StoreActions
382411 .customIf ([=](const LegalityQuery &Query) {
383412 return HasRCPC3 && Query.Types [0 ] == s128 &&
384413 Query.MMODescrs [0 ].Ordering == AtomicOrdering::Release;
0 commit comments