Skip to content

Commit cc2d8e7

Browse files
[AArch64] Add assembly/disassembly of FMOP4{A,S} (non-widening) single-precision instructions (#113344)
The new instructions are described in https://developer.arm.com/documentation/ddi0602/2024-09/SME-Instructions
1 parent 463a4c1 commit cc2d8e7

File tree

4 files changed

+464
-0
lines changed

4 files changed

+464
-0
lines changed

llvm/lib/Target/AArch64/AArch64SMEInstrInfo.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,6 +1017,9 @@ let Predicates = [HasSME2p2] in {
10171017
defm FMUL_2Z2Z : sme2_multi2_fmul_mm< "fmul">;
10181018
defm FMUL_4ZZ : sme2_multi4_fmul_sm<"fmul">;
10191019
defm FMUL_4Z4Z : sme2_multi4_fmul_mm< "fmul">;
1020+
1021+
defm FMOP4A : sme2_fmop4as_fp32_non_widening<0, "fmop4a">;
1022+
defm FMOP4S : sme2_fmop4as_fp32_non_widening<1, "fmop4s">;
10201023
} // [HasSME2p2]
10211024

10221025
let Predicates = [HasSME2p2, HasSMEB16B16] in {

llvm/lib/Target/AArch64/SMEInstrFormats.td

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5454,3 +5454,40 @@ multiclass sme2_bfmop4as_non_widening<bit S, string mnemonic> {
54545454
// Multiple vectors
54555455
def _M2Z2Z_H : sme2_bf16_fp16_quarter_tile_outer_product<1, 1, S, mnemonic, ZZ_h_mul_r_Lo, ZZ_h_mul_r_Hi>;
54565456
}
5457+
5458+
class sme2_fp32_quarter_tile_outer_product<bit M, bit N, bit S, string mnemonic, RegisterOperand zn_ty, RegisterOperand zm_ty>
5459+
: I<(outs TileOp32:$ZAda),
5460+
(ins TileOp32:$_ZAda, zn_ty:$Zn, zm_ty:$Zm),
5461+
mnemonic, "\t$ZAda, $Zn, $Zm",
5462+
"", []>, Sched<[]> {
5463+
bits<2> ZAda;
5464+
bits<3> Zn;
5465+
bits<3> Zm;
5466+
5467+
let Inst{31-21} = 0b10000000000;
5468+
let Inst{20} = M;
5469+
let Inst{19-17} = Zm;
5470+
let Inst{16-10} = 0b0000000;
5471+
let Inst{9} = N;
5472+
let Inst{8-6} = Zn;
5473+
let Inst{5} = 0;
5474+
let Inst{4} = S;
5475+
let Inst{3-2} = 0b00;
5476+
let Inst{1-0} = ZAda;
5477+
5478+
let Constraints = "$ZAda = $_ZAda";
5479+
}
5480+
5481+
multiclass sme2_fmop4as_fp32_non_widening<bit S, string mnemonic> {
5482+
// Single vectors
5483+
def _MZZ_S : sme2_fp32_quarter_tile_outer_product<0, 0, S, mnemonic, ZPR32Mul2_Lo, ZPR32Mul2_Hi>;
5484+
5485+
// Multiple and single vectors
5486+
def _M2ZZ_S : sme2_fp32_quarter_tile_outer_product<0, 1, S, mnemonic, ZZ_s_mul_r_Lo, ZPR32Mul2_Hi>;
5487+
5488+
// Single and multiple vectors
5489+
def _MZ2Z_S : sme2_fp32_quarter_tile_outer_product<1, 0, S, mnemonic, ZPR32Mul2_Lo, ZZ_s_mul_r_Hi>;
5490+
5491+
// Multiple vectors
5492+
def _M2Z2Z_S : sme2_fp32_quarter_tile_outer_product<1, 1, S, mnemonic, ZZ_s_mul_r_Lo, ZZ_s_mul_r_Hi>;
5493+
}
Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
// RUN: not llvm-mc -triple=aarch64 -mattr=+sme2p2 < %s 2>&1 | FileCheck %s
2+
3+
// FMOP4A
4+
5+
// Single vectors
6+
7+
fmop4a za0.d, z0.s, z16.s
8+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand
9+
10+
fmop4a za4.s, z0.s, z16.s
11+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
12+
13+
fmop4a za0.s, z0.d, z16.s
14+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
15+
16+
fmop4a za0.s, z15.s, z16.s
17+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
18+
19+
fmop4a za0.s, z16.s, z16.s
20+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
21+
22+
fmop4a za0.s, z0.s, z16.d
23+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
24+
25+
fmop4a za0.s, z12.s, z17.s
26+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
27+
28+
fmop4a za0.s, z12.s, z14.s
29+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
30+
31+
fmop4a za0.s, z12.s, z31.s
32+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
33+
34+
// Single and multiple vectors
35+
36+
fmop4a za0.d, z0.s, {z16.s-z17.s}
37+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand
38+
39+
fmop4a za4.s, z0.s, {z16.s-z17.s}
40+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
41+
42+
fmop4a za0.s, z0.d, {z16.s-z17.s}
43+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
44+
45+
fmop4a za0.s, z1.s, {z16.s-z17.s}
46+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
47+
48+
fmop4a za0.s, z16.s, {z16.s-z17.s}
49+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
50+
51+
fmop4a za0.s, z0.s, {z16.d-z17.d}
52+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
53+
54+
fmop4a za0.s, z0.s, {z17.s-z18.s}
55+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z16-z30, where the first vector is a multiple of 2 and with matching element types
56+
57+
fmop4a za0.s, z0.s, {z16.s-z18.s}
58+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
59+
60+
fmop4a za0.s, z0.s, {z12.s-z13.s}
61+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z16-z30, where the first vector is a multiple of 2 and with matching element types
62+
63+
// Multiple and single vectors
64+
65+
fmop4a za0.d, {z0.s-z1.s}, z16.s
66+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand
67+
68+
fmop4a za4.s, {z0.s-z1.s}, z16.s
69+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
70+
71+
fmop4a za0.s, {z0.d-z1.s}, z16.s
72+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: mismatched register size suffix
73+
74+
fmop4a za0.s, {z1.s-z2.s}, z16.s
75+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z0-z14, where the first vector is a multiple of 2 and with matching element types
76+
77+
fmop4a za0.s, {z2.s-z4.s}, z16.s
78+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
79+
80+
fmop4a za0.s, {z16.s-z17.s}, z16.s
81+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z0-z14, where the first vector is a multiple of 2 and with matching element types
82+
83+
fmop4a za0.s, {z0.s-z1.s}, z16.d
84+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
85+
86+
fmop4a za0.s, {z0.s-z1.s}, z17.s
87+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
88+
89+
fmop4a za0.s, {z0.s-z1.s}, z12.s
90+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
91+
92+
// Multiple vectors
93+
94+
fmop4a za0.d, {z0.s-z1.s}, {z16.s-z17.s}
95+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand
96+
97+
fmop4a za4.s, {z0.s-z1.s}, {z16.s-z17.s}
98+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
99+
100+
fmop4a za0.s, {z0.d-z1.d}, {z16.s-z17.s}
101+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
102+
103+
fmop4a za0.s, {z1.s-z2.s}, {z16.s-z17.s}
104+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z0-z14, where the first vector is a multiple of 2 and with matching element types
105+
106+
fmop4a za0.s, {z2.s-z4.s}, {z16.s-z17.s}
107+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
108+
109+
fmop4a za0.s, {z18.s-z19.s}, {z16.s-z17.s}
110+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z0-z14, where the first vector is a multiple of 2 and with matching element types
111+
112+
fmop4a za0.s, {z0.s-z1.s}, {z16.d-z17.d}
113+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
114+
115+
fmop4a za0.s, {z0.s-z1.s}, {z19.s-z20.s}
116+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z16-z30, where the first vector is a multiple of 2 and with matching element types
117+
118+
fmop4a za0.s, {z0.s-z1.s}, {z16.s-z18.s}
119+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
120+
121+
fmop4a za0.s, {z0.s-z1.s}, {z10.s-z11.s}
122+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z16-z30, where the first vector is a multiple of 2 and with matching element types
123+
124+
125+
// FMOP4S
126+
127+
// Single vectors
128+
129+
fmop4s za0.d, z0.s, z16.s
130+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand
131+
132+
fmop4s za4.s, z0.s, z16.s
133+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
134+
135+
fmop4s za0.s, z0.d, z16.s
136+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
137+
138+
fmop4s za0.s, z15.s, z16.s
139+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
140+
141+
fmop4s za0.s, z16.s, z16.s
142+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
143+
144+
fmop4s za0.s, z0.s, z16.d
145+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
146+
147+
fmop4s za0.s, z12.s, z17.s
148+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
149+
150+
fmop4s za0.s, z12.s, z14.s
151+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
152+
153+
fmop4s za0.s, z12.s, z31.s
154+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
155+
156+
// Single and multiple vectors
157+
158+
fmop4s za0.d, z0.s, {z16.s-z17.s}
159+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand
160+
161+
fmop4s za4.s, z0.s, {z16.s-z17.s}
162+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
163+
164+
fmop4s za0.s, z0.d, {z16.s-z17.s}
165+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
166+
167+
fmop4s za0.s, z1.s, {z16.s-z17.s}
168+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
169+
170+
fmop4s za0.s, z16.s, {z16.s-z17.s}
171+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z0.s..z14.s
172+
173+
fmop4s za0.s, z0.s, {z16.d-z17.d}
174+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
175+
176+
fmop4s za0.s, z0.s, {z17.s-z18.s}
177+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z16-z30, where the first vector is a multiple of 2 and with matching element types
178+
179+
fmop4s za0.s, z0.s, {z16.s-z18.s}
180+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
181+
182+
fmop4s za0.s, z0.s, {z12.s-z13.s}
183+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z16-z30, where the first vector is a multiple of 2 and with matching element types
184+
185+
// Multiple and single vectors
186+
187+
fmop4s za0.d, {z0.s-z1.s}, z16.s
188+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand
189+
190+
fmop4s za4.s, {z0.s-z1.s}, z16.s
191+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
192+
193+
fmop4s za0.s, {z0.d-z1.s}, z16.s
194+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: mismatched register size suffix
195+
196+
fmop4s za0.s, {z1.s-z2.s}, z16.s
197+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z0-z14, where the first vector is a multiple of 2 and with matching element types
198+
199+
fmop4s za0.s, {z2.s-z4.s}, z16.s
200+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
201+
202+
fmop4s za0.s, {z16.s-z17.s}, z16.s
203+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z0-z14, where the first vector is a multiple of 2 and with matching element types
204+
205+
fmop4s za0.s, {z0.s-z1.s}, z16.d
206+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
207+
208+
fmop4s za0.s, {z0.s-z1.s}, z17.s
209+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
210+
211+
fmop4s za0.s, {z0.s-z1.s}, z12.s
212+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid restricted vector register, expected even register in z16.s..z30.s
213+
214+
// Multiple vectors
215+
216+
fmop4s za0.d, {z0.s-z1.s}, {z16.s-z17.s}
217+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand
218+
219+
fmop4s za4.s, {z0.s-z1.s}, {z16.s-z17.s}
220+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
221+
222+
fmop4s za0.s, {z0.d-z1.d}, {z16.s-z17.s}
223+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
224+
225+
fmop4s za0.s, {z1.s-z2.s}, {z16.s-z17.s}
226+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z0-z14, where the first vector is a multiple of 2 and with matching element types
227+
228+
fmop4s za0.s, {z2.s-z4.s}, {z16.s-z17.s}
229+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
230+
231+
fmop4s za0.s, {z18.s-z19.s}, {z16.s-z17.s}
232+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z0-z14, where the first vector is a multiple of 2 and with matching element types
233+
234+
fmop4s za0.s, {z0.s-z1.s}, {z16.d-z17.d}
235+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
236+
237+
fmop4s za0.s, {z0.s-z1.s}, {z19.s-z20.s}
238+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z16-z30, where the first vector is a multiple of 2 and with matching element types
239+
240+
fmop4s za0.s, {z0.s-z1.s}, {z16.s-z18.s}
241+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand for instruction
242+
243+
fmop4s za0.s, {z0.s-z1.s}, {z10.s-z11.s}
244+
// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid vector list, expected list with 2 consecutive SVE vectors in the range z16-z30, where the first vector is a multiple of 2 and with matching element types
245+

0 commit comments

Comments
 (0)