1// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sme 2>&1 < %s| FileCheck %s
2
3// ------------------------------------------------------------------------- //
4// Invalid predicate (expected: p0-p7)
5
6mova z0.b, p8/m, za0h.b[w12, 0]
7// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid restricted predicate register, expected p0..p7 (without element suffix)
8// CHECK-NEXT: mova z0.b, p8/m, za0h.b[w12, 0]
9// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
10
11// ------------------------------------------------------------------------- //
12// Invalid tile
13
14// tile-to-vector
15
16mova z0.b, p0/m, za1h.b[w12, 0]
17// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
18// CHECK-NEXT: mova z0.b, p0/m, za1h.b[w12, 0]
19// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
20
21mova z0.h, p0/m, za2h.h[w12, 0]
22// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
23// CHECK-NEXT: mova z0.h, p0/m, za2h.h[w12, 0]
24// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
25
26mova z0.s, p0/m, za4h.s[w12, 0]
27// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
28// CHECK-NEXT: mova z0.s, p0/m, za4h.s[w12, 0]
29// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
30
31mova z0.d, p0/m, za8h.d[w12, 0]
32// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
33// CHECK-NEXT: mova z0.d, p0/m, za8h.d[w12, 0]
34// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
35
36mova z0.q, p0/m, za16h.q[w12, 0]
37// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
38// CHECK-NEXT: mova z0.q, p0/m, za16h.q[w12, 0]
39// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
40
41// vector-to-tile
42
43mova za1h.b[w12, 0], p0/m, z0.b
44// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
45// CHECK-NEXT: mova za1h.b[w12, 0], p0/m, z0.b
46// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
47
48mova za2h.h[w12, 0], p0/m, z0.h
49// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
50// CHECK-NEXT: mova za2h.h[w12, 0], p0/m, z0.h
51// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
52
53mova za4h.s[w12, 0], p0/m, z0.s
54// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
55// CHECK-NEXT: mova za4h.s[w12, 0], p0/m, z0.s
56// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
57
58mova za8h.d[w12, 0], p0/m, z0.d
59// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
60// CHECK-NEXT: mova za8h.d[w12, 0], p0/m, z0.d
61// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
62
63mova za16h.q[w12, 0], p0/m, z0.q
64// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: unexpected token in argument list
65// CHECK-NEXT: mova za16h.q[w12, 0], p0/m, z0.q
66// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
67
68// ------------------------------------------------------------------------- //
69// Invalid matrix operand
70
71// tile-to-vector
72
73mova z0.b, p0/m, za0h.h[w12, 0]
74// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za0h.b or za0v.b
75// CHECK-NEXT: mova z0.b, p0/m, za0h.h[w12, 0]
76// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
77
78mova z0.h, p0/m, za[w12, 0]
79// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za[0-1]h.h or za[0-1]v.h
80// CHECK-NEXT: mova z0.h, p0/m, za[w12, 0]
81// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
82
83mova z0.s, p0/m, za2.s[w12, 0]
84// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za[0-3]h.s or za[0-3]v.s
85// CHECK-NEXT: mova z0.s, p0/m, za2.s[w12, 0]
86// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
87
88mova z0.d, p0/m, za2v.s[w12, 0]
89// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za[0-7]h.d or za[0-7]v.d
90// CHECK-NEXT: mova z0.d, p0/m, za2v.s[w12, 0]
91// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
92
93mova z0.q, p0/m, za0h.b[w12, 0]
94// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za[0-15]h.q or za[0-15]v.q
95// CHECK-NEXT: mova z0.q, p0/m, za0h.b[w12, 0]
96// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
97
98// vector-to-tile, only one test here since the intended instruction variant is
99// ambiguous when failing to match on the first operand.
100
101mova za[w12, 0], p0/m, z0.b
102// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid matrix operand, expected za[0-15]h.q or za[0-15]v.q
103// CHECK-NEXT: mova za[w12, 0], p0/m, z0.b
104// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
105
106// ------------------------------------------------------------------------- //
107// Invalid vector select register (expected: w12-w15)
108
109mova z0.h, p0/m, za0h.h[w11, 0]
110// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: operand must be a register in range [w12, w15]
111// CHECK-NEXT: mova z0.h, p0/m, za0h.h[w11, 0]
112// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
113
114mova z0.s, p0/m, za0h.s[w16, 0]
115// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: operand must be a register in range [w12, w15]
116// CHECK-NEXT: mova z0.s, p0/m, za0h.s[w16, 0]
117// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
118
119mova za0h.d[w11, 0], p0/m, z0.d
120// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: operand must be a register in range [w12, w15]
121// CHECK-NEXT: mova za0h.d[w11, 0], p0/m, z0.d
122// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
123
124mova za0h.q[w16, 0], p0/m, z0.q
125// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: operand must be a register in range [w12, w15]
126// CHECK-NEXT: mova za0h.q[w16, 0], p0/m, z0.q
127// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
128
129// ------------------------------------------------------------------------- //
130// Invalid vector select offset
131//
132//   expected: .b => 0-15, .h => 0-7, .s => 0-3, .d => 0-1, .q => NONE
133
134// tile-to-vector
135
136mova z0.b, p0/m, za0h.b[w12, 16]
137// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 15].
138// CHECK-NEXT: mova z0.b, p0/m, za0h.b[w12, 16]
139// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
140
141mova z0.h, p0/m, za0h.h[w12, 8]
142// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 7].
143// CHECK-NEXT: mova z0.h, p0/m, za0h.h[w12, 8]
144// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
145
146mova z0.s, p0/m, za0h.s[w12, 4]
147// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 3].
148// CHECK-NEXT: mova z0.s, p0/m, za0h.s[w12, 4]
149// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
150
151mova z0.d, p0/m, za0h.d[w12, 2]
152// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 1].
153// CHECK-NEXT: mova z0.d, p0/m, za0h.d[w12, 2]
154// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
155
156mova z0.q, p0/m, za0h.q[w12, 1]
157// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be 0.
158// CHECK-NEXT: mova z0.q, p0/m, za0h.q[w12, 1]
159// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
160
161mov z0.b, p0/m, za0h.b[w12, 16]
162// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 15].
163// CHECK-NEXT: mov z0.b, p0/m, za0h.b[w12, 16]
164// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
165
166mov z0.h, p0/m, za0h.h[w12, 8]
167// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 7].
168// CHECK-NEXT: mov z0.h, p0/m, za0h.h[w12, 8]
169// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
170
171mov z0.s, p0/m, za0h.s[w12, 4]
172// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 3].
173// CHECK-NEXT: mov z0.s, p0/m, za0h.s[w12, 4]
174// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
175
176mov z0.d, p0/m, za0h.d[w12, 2]
177// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 1].
178// CHECK-NEXT: mov z0.d, p0/m, za0h.d[w12, 2]
179// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
180
181mov z0.q, p0/m, za0h.q[w12, 1]
182// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be 0.
183// CHECK-NEXT: mov z0.q, p0/m, za0h.q[w12, 1]
184// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
185
186// vector-to-tile
187
188mova za0h.b[w12, 16], p0/m, z0.b
189// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 15].
190// CHECK-NEXT: mova za0h.b[w12, 16], p0/m, z0.b
191// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
192
193mova za0h.h[w12, 8], p0/m, z0.h
194// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 7].
195// CHECK-NEXT: mova za0h.h[w12, 8], p0/m, z0.h
196// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
197
198mova za0h.s[w12, 4], p0/m, z0.s
199// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 3].
200// CHECK-NEXT: mova za0h.s[w12, 4], p0/m, z0.s
201// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
202
203mova za0h.d[w12, 2], p0/m, z0.d
204// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 1].
205// CHECK-NEXT: mova za0h.d[w12, 2], p0/m, z0.d
206// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
207
208mova za0h.q[w12, 1], p0/m, z0.q
209// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be 0.
210// CHECK-NEXT: mova za0h.q[w12, 1], p0/m, z0.q
211// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
212
213mov za0h.b[w12, 16], p0/m, z0.b
214// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 15].
215// CHECK-NEXT: mov za0h.b[w12, 16], p0/m, z0.b
216// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
217
218mov za0h.h[w12, 8], p0/m, z0.h
219// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 7].
220// CHECK-NEXT: mov za0h.h[w12, 8], p0/m, z0.h
221// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
222
223mov za0h.s[w12, 4], p0/m, z0.s
224// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 3].
225// CHECK-NEXT: mov za0h.s[w12, 4], p0/m, z0.s
226// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
227
228mov za0h.d[w12, 2], p0/m, z0.d
229// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be an integer in range [0, 1].
230// CHECK-NEXT: mov za0h.d[w12, 2], p0/m, z0.d
231// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
232
233mov za0h.q[w12, 1], p0/m, z0.q
234// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: immediate must be 0.
235// CHECK-NEXT: mov za0h.q[w12, 1], p0/m, z0.q
236// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
237
238// ------------------------------------------------------------------------- //
239// Invalid ZPR element width
240
241mova za0h.b[w12, 0], p0/m, z0.h
242// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
243// CHECK-NEXT: mova za0h.b[w12, 0], p0/m, z0.h
244// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
245
246mova za0h.h[w12, 0], p0/m, z0.s
247// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
248// CHECK-NEXT: mova za0h.h[w12, 0], p0/m, z0.s
249// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
250
251mova za0h.s[w12, 0], p0/m, z0.d
252// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
253// CHECK-NEXT: mova za0h.s[w12, 0], p0/m, z0.d
254// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
255
256mova za0h.d[w12, 0], p0/m, z0.q
257// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
258// CHECK-NEXT: mova za0h.d[w12, 0], p0/m, z0.q
259// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
260
261mova za0h.q[w12, 0], p0/m, z0.b
262// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid element width
263// CHECK-NEXT: mova za0h.q[w12, 0], p0/m, z0.b
264// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
265