@@ -52,6 +52,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
52
52
const LLT v16s8 = LLT::fixed_vector (16 , 8 );
53
53
const LLT v8s8 = LLT::fixed_vector (8 , 8 );
54
54
const LLT v4s8 = LLT::fixed_vector (4 , 8 );
55
+ const LLT v2s8 = LLT::fixed_vector (2 , 8 );
55
56
const LLT v8s16 = LLT::fixed_vector (8 , 16 );
56
57
const LLT v4s16 = LLT::fixed_vector (4 , 16 );
57
58
const LLT v2s16 = LLT::fixed_vector (2 , 16 );
@@ -422,8 +423,10 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
422
423
.clampMaxNumElements (0 , s64, 2 )
423
424
.clampMaxNumElements (0 , p0, 2 )
424
425
.lowerIfMemSizeNotPow2 ()
426
+ // TODO: Use BITCAST for v2i8, v2i16
427
+ .customIf (typeInSet (0 , {v4s8}))
425
428
.customIf (IsPtrVecPred)
426
- .scalarizeIf (typeIs (0 , v2s16), 0 );
429
+ .scalarizeIf (typeInSet (0 , { v2s16, v2s8} ), 0 );
427
430
428
431
getActionDefinitionsBuilder (G_INDEXED_STORE)
429
432
// Idx 0 == Ptr, Idx 1 == Val
@@ -1599,6 +1602,18 @@ bool AArch64LegalizerInfo::legalizeLoadStore(
1599
1602
Register ValReg = MI.getOperand (0 ).getReg ();
1600
1603
const LLT ValTy = MRI.getType (ValReg);
1601
1604
1605
+ // G_STORE v4s8, ptr => s32 = G_BITCAST v4s8
1606
+ // G_STORE s32, ptr
1607
+ if (ValTy.isVector () && ValTy.getNumElements () == 4 &&
1608
+ ValTy.getScalarSizeInBits () == 8 ) {
1609
+ Register MidReg =
1610
+ MIRBuilder.buildBitcast (LLT::scalar (ValTy.getSizeInBits ()), ValReg)
1611
+ .getReg (0 );
1612
+ MI.getOperand (0 ).setReg (MidReg);
1613
+ if (!ValTy.isPointerVector () || ValTy.getAddressSpace () != 0 )
1614
+ return true ;
1615
+ }
1616
+
1602
1617
if (ValTy == LLT::scalar (128 )) {
1603
1618
1604
1619
AtomicOrdering Ordering = (*MI.memoperands_begin ())->getSuccessOrdering ();
0 commit comments