@@ -45,20 +45,26 @@ def am_sme_indexed_b4 : ComplexPattern<iPTR, 2, "SelectAddrModeIndexedSVE<0, 15>
4545// If the operands do not match this pattern, the pseudos are expanded
4646// to a REG_SEQUENCE using the post-isel hook.
4747
48- def FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO :
49- Pseudo<(outs ZPR2Mul2 :$tup),
50- (ins ZPR:$zn0, ZPR:$zn1), []>, Sched<[]>{
48+ class sme_form_transpose_x2_pseudo<RegisterClass multi_vector_class>
49+ : Pseudo<(outs multi_vector_class :$tup), (ins ZPR:$zn0, ZPR:$zn1), []> ,
50+ Sched<[]> {
5151 let hasSideEffects = 0;
5252 let hasPostISelHook = 1;
5353}
5454
55- def FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO :
56- Pseudo<(outs ZPR4Mul4:$tup),
57- (ins ZPR:$zn0, ZPR:$zn1, ZPR:$zn2, ZPR:$zn3), []>, Sched<[]>{
55+ def FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO : sme_form_transpose_x2_pseudo<ZPR2>;
56+ def FORM_TRANSPOSED_REG_TUPLE_MULX2_PSEUDO : sme_form_transpose_x2_pseudo<ZPR2Mul2>;
57+
58+ class sme_form_transpose_x4_pseudo<RegisterClass multi_vector_class>
59+ : Pseudo<(outs multi_vector_class:$tup), (ins ZPR:$zn0, ZPR:$zn1, ZPR:$zn2, ZPR:$zn3), []>,
60+ Sched<[]> {
5861 let hasSideEffects = 0;
5962 let hasPostISelHook = 1;
6063}
6164
65+ def FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO : sme_form_transpose_x4_pseudo<ZPR4>;
66+ def FORM_TRANSPOSED_REG_TUPLE_MULX4_PSEUDO : sme_form_transpose_x4_pseudo<ZPR4Mul4>;
67+
6268def SDTZALoadStore : SDTypeProfile<0, 3, [SDTCisInt<0>, SDTCisPtrTy<1>, SDTCisInt<2>]>;
6369def AArch64SMELdr : SDNode<"AArch64ISD::SME_ZA_LDR", SDTZALoadStore,
6470 [SDNPHasChain, SDNPSideEffect, SDNPMayLoad]>;
@@ -164,14 +170,14 @@ class SME2_ZA_TwoOp_Multi_Single_Pat<string name, SDPatternOperator intrinsic, O
164170class SME2_ZA_TwoOp_VG2_Multi_Single_Pat<string name, SDPatternOperator intrinsic, Operand index_ty, ZPRRegOp zpr_ty,
165171 ValueType vt, ComplexPattern tileslice>
166172 : Pat<(intrinsic (i32 (tileslice MatrixIndexGPR32Op8_11:$base, index_ty:$offset)), vt:$Zn1, vt:$Zn2, vt:$Zm),
167- (!cast<Instruction>(name # _PSEUDO) $base, $offset, (REG_SEQUENCE ZPR2, vt:$Zn1, zsub0, vt:$Zn2, zsub1 ),
173+ (!cast<Instruction>(name # _PSEUDO) $base, $offset, (FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO vt:$Zn1, vt:$Zn2),
168174 zpr_ty:$Zm)>;
169175class SME2_ZA_TwoOp_VG4_Multi_Single_Pat<string name, SDPatternOperator intrinsic, Operand index_ty, ZPRRegOp zpr_ty,
170176 ValueType vt, ComplexPattern tileslice>
171177 : Pat<(intrinsic (i32 (tileslice MatrixIndexGPR32Op8_11:$base, index_ty:$offset)),
172178 vt:$Zn1, vt:$Zn2, vt:$Zn3, vt:$Zn4, vt:$Zm),
173179 (!cast<Instruction>(name # _PSEUDO) $base, $offset,
174- (REG_SEQUENCE ZPR4, vt:$Zn1, zsub0, vt:$Zn2, zsub1, vt:$Zn3, zsub2, vt:$Zn4, zsub3 ),
180+ (FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO vt:$Zn1, vt:$Zn2, vt:$Zn3, vt:$Zn4),
175181 zpr_ty:$Zm)>;
176182
177183class SME2_ZA_TwoOp_VG2_Multi_Multi_Pat<string name, SDPatternOperator intrinsic, Operand index_ty, ValueType vt, ComplexPattern tileslice>
@@ -197,14 +203,14 @@ class SME2_ZA_TwoOp_VG2_Multi_Index_Pat<string name, SDPatternOperator intrinsic
197203 Operand imm_ty, ComplexPattern tileslice>
198204 : Pat<(intrinsic (i32 (tileslice MatrixIndexGPR32Op8_11:$base, index_ty:$offset)), vt:$Zn1, vt:$Zn2, vt:$Zm, (i32 imm_ty:$i)),
199205 (!cast<Instruction>(name # _PSEUDO) $base, $offset,
200- (FORM_TRANSPOSED_REG_TUPLE_X2_PSEUDO vt:$Zn1,vt:$Zn2), zpr_ty:$Zm, imm_ty:$i)>;
206+ (FORM_TRANSPOSED_REG_TUPLE_MULX2_PSEUDO vt:$Zn1,vt:$Zn2), zpr_ty:$Zm, imm_ty:$i)>;
201207
202208class SME2_ZA_TwoOp_VG4_Multi_Index_Pat<string name, SDPatternOperator intrinsic, Operand index_ty, ZPRRegOp zpr_ty, ValueType vt,
203209 Operand imm_ty, ComplexPattern tileslice>
204210 : Pat<(intrinsic (i32 (tileslice MatrixIndexGPR32Op8_11:$base, index_ty:$offset)),
205211 vt:$Zn1, vt:$Zn2, vt:$Zn3, vt:$Zn4, vt:$Zm, (i32 imm_ty:$i)),
206212 (!cast<Instruction>(name # _PSEUDO) $base, $offset,
207- (FORM_TRANSPOSED_REG_TUPLE_X4_PSEUDO vt:$Zn1, vt:$Zn2, vt:$Zn3, vt:$Zn4),
213+ (FORM_TRANSPOSED_REG_TUPLE_MULX4_PSEUDO vt:$Zn1, vt:$Zn2, vt:$Zn3, vt:$Zn4),
208214 zpr_ty:$Zm, imm_ty:$i)>;
209215
210216class SME2_Sat_Shift_VG2_Pat<string name, SDPatternOperator intrinsic, ValueType out_vt, ValueType in_vt, Operand imm_ty>
0 commit comments