master
1.{
2 // C6.2.1 ADC
3 .{
4 .pattern = "ADC <Wd>, <Wn>, <Wm>",
5 .symbols = .{
6 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
7 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
8 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
9 },
10 .encode = .{ .adc, .Wd, .Wn, .Wm },
11 },
12 .{
13 .pattern = "ADC <Xd>, <Xn>, <Xm>",
14 .symbols = .{
15 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
16 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
17 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
18 },
19 .encode = .{ .adc, .Xd, .Xn, .Xm },
20 },
21 // C6.2.2 ADCS
22 .{
23 .pattern = "ADCS <Wd>, <Wn>, <Wm>",
24 .symbols = .{
25 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
26 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
27 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
28 },
29 .encode = .{ .adcs, .Wd, .Wn, .Wm },
30 },
31 .{
32 .pattern = "ADCS <Xd>, <Xn>, <Xm>",
33 .symbols = .{
34 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
35 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
36 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
37 },
38 .encode = .{ .adcs, .Xd, .Xn, .Xm },
39 },
40 // C6.2.3 ADD (extended register)
41 .{
42 .pattern = "ADD <Wd|WSP>, <Wn|WSP>, <Wm>",
43 .symbols = .{
44 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
45 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
46 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
47 },
48 .encode = .{ .add, .Wd, .Wn, .{ .register = .Wm } },
49 },
50 .{
51 .pattern = "ADD <Wd|WSP>, <Wn|WSP>, <Wm>, <extend>",
52 .symbols = .{
53 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
54 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
55 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
56 .extend = .{ .extend = .{} },
57 },
58 .encode = .{ .add, .Wd, .Wn, .{ .extended_register_explicit = .{
59 .register = .Wm,
60 .option = .extend,
61 .amount = 0,
62 } } },
63 },
64 .{
65 .pattern = "ADD <Wd|WSP>, <Wn|WSP>, <Wm>, <extend> #<amount>",
66 .symbols = .{
67 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
68 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
69 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
70 .extend = .{ .extend = .{} },
71 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
72 },
73 .encode = .{ .add, .Wd, .Wn, .{ .extended_register_explicit = .{
74 .register = .Wm,
75 .option = .extend,
76 .amount = .amount,
77 } } },
78 },
79 .{
80 .pattern = "ADD <Xd|SP>, <Xn|SP>, <Xm>",
81 .symbols = .{
82 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
83 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
84 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
85 },
86 .encode = .{ .add, .Xd, .Xn, .{ .register = .Xm } },
87 },
88 .{
89 .pattern = "ADD <Xd|SP>, <Xn|SP>, <Wm>, <extend>",
90 .symbols = .{
91 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
92 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
93 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
94 .extend = .{ .extend = .{ .size = .word } },
95 },
96 .encode = .{ .add, .Xd, .Xn, .{ .extended_register_explicit = .{
97 .register = .Wm,
98 .option = .extend,
99 .amount = 0,
100 } } },
101 },
102 .{
103 .pattern = "ADD <Xd|SP>, <Xn|SP>, <Wm>, <extend> #<amount>",
104 .symbols = .{
105 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
106 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
107 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
108 .extend = .{ .extend = .{ .size = .word } },
109 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
110 },
111 .encode = .{ .add, .Xd, .Xn, .{ .extended_register_explicit = .{
112 .register = .Wm,
113 .option = .extend,
114 .amount = .amount,
115 } } },
116 },
117 .{
118 .pattern = "ADD <Xd|SP>, <Xn|SP>, <Xm>, <extend>",
119 .symbols = .{
120 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
121 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
122 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
123 .extend = .{ .extend = .{ .size = .doubleword } },
124 },
125 .encode = .{ .add, .Xd, .Xn, .{ .extended_register_explicit = .{
126 .register = .Xm,
127 .option = .extend,
128 .amount = 0,
129 } } },
130 },
131 .{
132 .pattern = "ADD <Xd|SP>, <Xn|SP>, <Xm>, <extend> #<amount>",
133 .symbols = .{
134 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
135 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
136 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
137 .extend = .{ .extend = .{ .size = .doubleword } },
138 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
139 },
140 .encode = .{ .add, .Xd, .Xn, .{ .extended_register_explicit = .{
141 .register = .Xm,
142 .option = .extend,
143 .amount = .amount,
144 } } },
145 },
146 // C6.2.4 ADD (immediate)
147 .{
148 .pattern = "ADD <Wd|WSP>, <Wn|WSP>, #<imm>",
149 .symbols = .{
150 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
151 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
152 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
153 },
154 .encode = .{ .add, .Wd, .Wn, .{ .immediate = .imm } },
155 },
156 .{
157 .pattern = "ADD <Wd|WSP>, <Wn|WSP>, #<imm>, LSL #<shift>",
158 .symbols = .{
159 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
160 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
161 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
162 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
163 },
164 .encode = .{ .add, .Wd, .Wn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
165 },
166 .{
167 .pattern = "ADD <Xd|SP>, <Xn|SP>, #<imm>",
168 .symbols = .{
169 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
170 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
171 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
172 },
173 .encode = .{ .add, .Xd, .Xn, .{ .immediate = .imm } },
174 },
175 .{
176 .pattern = "ADD <Xd|SP>, <Xn|SP>, #<imm>, LSL #<shift>",
177 .symbols = .{
178 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
179 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
180 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
181 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
182 },
183 .encode = .{ .add, .Xd, .Xn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
184 },
185 // C6.2.5 ADD (shifted register)
186 .{
187 .pattern = "ADD <Wd>, <Wn>, <Wm>",
188 .symbols = .{
189 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
190 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
191 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
192 },
193 .encode = .{ .add, .Wd, .Wn, .{ .register = .Wm } },
194 },
195 .{
196 .pattern = "ADD <Wd>, <Wn>, <Wm>, <shift> #<amount>",
197 .symbols = .{
198 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
199 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
200 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
201 .shift = .{ .shift = .{ .allow_ror = false } },
202 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
203 },
204 .encode = .{ .add, .Wd, .Wn, .{ .shifted_register_explicit = .{
205 .register = .Wm,
206 .shift = .shift,
207 .amount = .amount,
208 } } },
209 },
210 .{
211 .pattern = "ADD <Xd>, <Xn>, <Xm>",
212 .symbols = .{
213 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
214 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
215 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
216 },
217 .encode = .{ .add, .Xd, .Xn, .{ .register = .Xm } },
218 },
219 .{
220 .pattern = "ADD <Xd>, <Xn>, <Xm>, <shift> #<amount>",
221 .symbols = .{
222 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
223 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
224 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
225 .shift = .{ .shift = .{ .allow_ror = false } },
226 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
227 },
228 .encode = .{ .add, .Xd, .Xn, .{ .shifted_register_explicit = .{
229 .register = .Xm,
230 .shift = .shift,
231 .amount = .amount,
232 } } },
233 },
234 // C6.2.6 ADDG
235 .{
236 .requires = .{.mte},
237 .pattern = "ADDG <Xd|SP>, <Xn|SP>, #<uimm6>, #<uimm4>",
238 .symbols = .{
239 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
240 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
241 .uimm6 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 10 }, .multiple_of = 16 } },
242 .uimm4 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
243 },
244 .encode = .{ .addg, .Xd, .Xn, .uimm6, .uimm4 },
245 },
246 // C6.2.7 ADDS (extended register)
247 .{
248 .pattern = "ADDS <Wd>, <Wn|WSP>, <Wm>",
249 .symbols = .{
250 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
251 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
252 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
253 },
254 .encode = .{ .adds, .Wd, .Wn, .{ .register = .Wm } },
255 },
256 .{
257 .pattern = "ADDS <Wd>, <Wn|WSP>, <Wm>, <extend>",
258 .symbols = .{
259 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
260 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
261 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
262 .extend = .{ .extend = .{} },
263 },
264 .encode = .{ .adds, .Wd, .Wn, .{ .extended_register_explicit = .{
265 .register = .Wm,
266 .option = .extend,
267 .amount = 0,
268 } } },
269 },
270 .{
271 .pattern = "ADDS <Wd>, <Wn|WSP>, <Wm>, <extend> #<amount>",
272 .symbols = .{
273 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
274 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
275 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
276 .extend = .{ .extend = .{} },
277 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
278 },
279 .encode = .{ .adds, .Wd, .Wn, .{ .extended_register_explicit = .{
280 .register = .Wm,
281 .option = .extend,
282 .amount = .amount,
283 } } },
284 },
285 .{
286 .pattern = "ADDS <Xd>, <Xn|SP>, <Xm>",
287 .symbols = .{
288 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
289 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
290 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
291 },
292 .encode = .{ .adds, .Xd, .Xn, .{ .register = .Xm } },
293 },
294 .{
295 .pattern = "ADDS <Xd>, <Xn|SP>, <Wm>, <extend>",
296 .symbols = .{
297 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
298 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
299 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
300 .extend = .{ .extend = .{ .size = .word } },
301 },
302 .encode = .{ .adds, .Xd, .Xn, .{ .extended_register_explicit = .{
303 .register = .Wm,
304 .option = .extend,
305 .amount = 0,
306 } } },
307 },
308 .{
309 .pattern = "ADDS <Xd>, <Xn|SP>, <Wm>, <extend> #<amount>",
310 .symbols = .{
311 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
312 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
313 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
314 .extend = .{ .extend = .{ .size = .word } },
315 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
316 },
317 .encode = .{ .adds, .Xd, .Xn, .{ .extended_register_explicit = .{
318 .register = .Wm,
319 .option = .extend,
320 .amount = .amount,
321 } } },
322 },
323 .{
324 .pattern = "ADDS <Xd>, <Xn|SP>, <Xm>, <extend>",
325 .symbols = .{
326 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
327 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
328 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
329 .extend = .{ .extend = .{ .size = .doubleword } },
330 },
331 .encode = .{ .adds, .Xd, .Xn, .{ .extended_register_explicit = .{
332 .register = .Xm,
333 .option = .extend,
334 .amount = 0,
335 } } },
336 },
337 .{
338 .pattern = "ADDS <Xd>, <Xn|SP>, <Xm>, <extend> #<amount>",
339 .symbols = .{
340 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
341 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
342 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
343 .extend = .{ .extend = .{ .size = .doubleword } },
344 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
345 },
346 .encode = .{ .adds, .Xd, .Xn, .{ .extended_register_explicit = .{
347 .register = .Xm,
348 .option = .extend,
349 .amount = .amount,
350 } } },
351 },
352 // C6.2.8 ADDS (immediate)
353 .{
354 .pattern = "ADDS <Wd>, <Wn|WSP>, #<imm>",
355 .symbols = .{
356 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
357 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
358 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
359 },
360 .encode = .{ .adds, .Wd, .Wn, .{ .immediate = .imm } },
361 },
362 .{
363 .pattern = "ADDS <Wd>, <Wn|WSP>, #<imm>, LSL #<shift>",
364 .symbols = .{
365 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
366 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
367 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
368 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
369 },
370 .encode = .{ .adds, .Wd, .Wn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
371 },
372 .{
373 .pattern = "ADDS <Xd>, <Xn|SP>, #<imm>",
374 .symbols = .{
375 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
376 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
377 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
378 },
379 .encode = .{ .adds, .Xd, .Xn, .{ .immediate = .imm } },
380 },
381 .{
382 .pattern = "ADDS <Xd>, <Xn|SP>, #<imm>, LSL #<shift>",
383 .symbols = .{
384 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
385 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
386 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
387 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
388 },
389 .encode = .{ .adds, .Xd, .Xn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
390 },
391 // C6.2.9 ADDS (shifted register)
392 .{
393 .pattern = "ADDS <Wd>, <Wn>, <Wm>",
394 .symbols = .{
395 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
396 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
397 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
398 },
399 .encode = .{ .adds, .Wd, .Wn, .{ .register = .Wm } },
400 },
401 .{
402 .pattern = "ADDS <Wd>, <Wn>, <Wm>, <shift> #<amount>",
403 .symbols = .{
404 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
405 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
406 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
407 .shift = .{ .shift = .{ .allow_ror = false } },
408 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
409 },
410 .encode = .{ .adds, .Wd, .Wn, .{ .shifted_register_explicit = .{
411 .register = .Wm,
412 .shift = .shift,
413 .amount = .amount,
414 } } },
415 },
416 .{
417 .pattern = "ADDS <Xd>, <Xn>, <Xm>",
418 .symbols = .{
419 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
420 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
421 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
422 },
423 .encode = .{ .adds, .Xd, .Xn, .{ .register = .Xm } },
424 },
425 .{
426 .pattern = "ADDS <Xd>, <Xn>, <Xm>, <shift> #<amount>",
427 .symbols = .{
428 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
429 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
430 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
431 .shift = .{ .shift = .{ .allow_ror = false } },
432 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
433 },
434 .encode = .{ .adds, .Xd, .Xn, .{ .shifted_register_explicit = .{
435 .register = .Xm,
436 .shift = .shift,
437 .amount = .amount,
438 } } },
439 },
440 // C6.2.13 AND (shifted register)
441 .{
442 .pattern = "AND <Wd>, <Wn>, <Wm>",
443 .symbols = .{
444 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
445 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
446 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
447 },
448 .encode = .{ .@"and", .Wd, .Wn, .{ .register = .Wm } },
449 },
450 .{
451 .pattern = "AND <Wd>, <Wn>, <Wm>, <shift> #<amount>",
452 .symbols = .{
453 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
454 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
455 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
456 .shift = .{ .shift = .{} },
457 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
458 },
459 .encode = .{ .@"and", .Wd, .Wn, .{ .shifted_register_explicit = .{
460 .register = .Wm,
461 .shift = .shift,
462 .amount = .amount,
463 } } },
464 },
465 .{
466 .pattern = "AND <Xd>, <Xn>, <Xm>",
467 .symbols = .{
468 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
469 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
470 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
471 },
472 .encode = .{ .@"and", .Xd, .Xn, .{ .register = .Xm } },
473 },
474 .{
475 .pattern = "AND <Xd>, <Xn>, <Xm>, <shift> #<amount>",
476 .symbols = .{
477 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
478 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
479 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
480 .shift = .{ .shift = .{} },
481 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
482 },
483 .encode = .{ .@"and", .Xd, .Xn, .{ .shifted_register_explicit = .{
484 .register = .Xm,
485 .shift = .shift,
486 .amount = .amount,
487 } } },
488 },
489 // C6.2.15 ANDS (shifted register)
490 .{
491 .pattern = "ANDS <Wd>, <Wn>, <Wm>",
492 .symbols = .{
493 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
494 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
495 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
496 },
497 .encode = .{ .ands, .Wd, .Wn, .{ .register = .Wm } },
498 },
499 .{
500 .pattern = "ANDS <Wd>, <Wn>, <Wm>, <shift> #<amount>",
501 .symbols = .{
502 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
503 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
504 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
505 .shift = .{ .shift = .{} },
506 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
507 },
508 .encode = .{ .ands, .Wd, .Wn, .{ .shifted_register_explicit = .{
509 .register = .Wm,
510 .shift = .shift,
511 .amount = .amount,
512 } } },
513 },
514 .{
515 .pattern = "ANDS <Xd>, <Xn>, <Xm>",
516 .symbols = .{
517 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
518 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
519 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
520 },
521 .encode = .{ .ands, .Xd, .Xn, .{ .register = .Xm } },
522 },
523 .{
524 .pattern = "ANDS <Xd>, <Xn>, <Xm>, <shift> #<amount>",
525 .symbols = .{
526 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
527 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
528 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
529 .shift = .{ .shift = .{} },
530 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
531 },
532 .encode = .{ .ands, .Xd, .Xn, .{ .shifted_register_explicit = .{
533 .register = .Xm,
534 .shift = .shift,
535 .amount = .amount,
536 } } },
537 },
538 // C6.2.16 ASR (register)
539 .{
540 .pattern = "ASR <Wd>, <Wn>, <Wm>",
541 .symbols = .{
542 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
543 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
544 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
545 },
546 .encode = .{ .asrv, .Wd, .Wn, .Wm },
547 },
548 .{
549 .pattern = "ASR <Xd>, <Xn>, <Xm>",
550 .symbols = .{
551 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
552 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
553 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
554 },
555 .encode = .{ .asrv, .Xd, .Xn, .Xm },
556 },
557 // C6.2.17 ASR (immediate)
558 .{
559 .pattern = "ASR <Wd>, <Wn>, #<shift>",
560 .symbols = .{
561 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
562 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
563 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
564 },
565 .encode = .{ .sbfm, .Wd, .Wn, .{ .N = .word, .immr = .shift, .imms = 31 } },
566 },
567 .{
568 .pattern = "ASR <Xd>, <Xn>, #<shift>",
569 .symbols = .{
570 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
571 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
572 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
573 },
574 .encode = .{ .sbfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .shift, .imms = 63 } },
575 },
576 // C6.2.18 ASRV
577 .{
578 .pattern = "ASRV <Wd>, <Wn>, <Wm>",
579 .symbols = .{
580 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
581 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
582 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
583 },
584 .encode = .{ .asrv, .Wd, .Wn, .Wm },
585 },
586 .{
587 .pattern = "ASRV <Xd>, <Xn>, <Xm>",
588 .symbols = .{
589 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
590 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
591 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
592 },
593 .encode = .{ .asrv, .Xd, .Xn, .Xm },
594 },
595 // C6.2.24 AXFLAG
596 .{
597 .requires = .{.altnzcv},
598 .pattern = "AXFLAG",
599 .symbols = .{},
600 .encode = .{.axflag},
601 },
602 // C6.2.28 BFC
603 .{
604 .pattern = "BFC <Wd>, #<lsb>, #<width>",
605 .symbols = .{
606 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
607 .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .adjust = .neg_wrap } },
608 .width = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .adjust = .dec } },
609 },
610 .encode = .{ .bfm, .Wd, .wzr, .{ .N = .word, .immr = .lsb, .imms = .width } },
611 },
612 .{
613 .pattern = "BFC <Xd>, #<lsb>, #<width>",
614 .symbols = .{
615 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
616 .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .adjust = .neg_wrap } },
617 .width = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .adjust = .dec } },
618 },
619 .encode = .{ .bfm, .Xd, .xzr, .{ .N = .doubleword, .immr = .lsb, .imms = .width } },
620 },
621 // C6.2.29 BFI
622 .{
623 .pattern = "BFI <Wd>, <Wn>, #<lsb>, #<width>",
624 .symbols = .{
625 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
626 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
627 .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .adjust = .neg_wrap } },
628 .width = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .adjust = .dec } },
629 },
630 .encode = .{ .bfm, .Wd, .Wn, .{ .N = .word, .immr = .lsb, .imms = .width } },
631 },
632 .{
633 .pattern = "BFI <Xd>, <Xn>, #<lsb>, #<width>",
634 .symbols = .{
635 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
636 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
637 .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .adjust = .neg_wrap } },
638 .width = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .adjust = .dec } },
639 },
640 .encode = .{ .bfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .lsb, .imms = .width } },
641 },
642 // C6.2.30 BFM
643 .{
644 .pattern = "BFM <Wd>, <Wn>, #<immr>, #<imms>",
645 .symbols = .{
646 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
647 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
648 .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
649 .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
650 },
651 .encode = .{ .bfm, .Wd, .Wn, .{ .N = .word, .immr = .immr, .imms = .imms } },
652 },
653 .{
654 .pattern = "BFM <Xd>, <Xn>, #<immr>, #<imms>",
655 .symbols = .{
656 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
657 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
658 .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
659 .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
660 },
661 .encode = .{ .bfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .immr, .imms = .imms } },
662 },
663 // C6.2.35 BLR
664 .{
665 .pattern = "BLR <Xn>",
666 .symbols = .{
667 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
668 },
669 .encode = .{ .blr, .Xn },
670 },
671 // C6.2.37 BR
672 .{
673 .pattern = "BR <Xn>",
674 .symbols = .{
675 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
676 },
677 .encode = .{ .br, .Xn },
678 },
679 // C6.2.40 BRK
680 .{
681 .pattern = "BRK #<imm>",
682 .symbols = .{
683 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
684 },
685 .encode = .{ .brk, .imm },
686 },
687 // C6.2.52 CFINV
688 .{
689 .requires = .{.flagm},
690 .pattern = "CFINV",
691 .symbols = .{},
692 .encode = .{.cfinv},
693 },
694 // C6.2.56 CLREX
695 .{
696 .pattern = "CLREX",
697 .symbols = .{},
698 .encode = .{ .clrex, 0b1111 },
699 },
700 .{
701 .pattern = "CLREX #<imm>",
702 .symbols = .{
703 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
704 },
705 .encode = .{ .clrex, .imm },
706 },
707 // C6.2.57 CLS
708 .{
709 .pattern = "CLS <Wd>, <Wn>",
710 .symbols = .{
711 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
712 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
713 },
714 .encode = .{ .cls, .Wd, .Wn },
715 },
716 .{
717 .pattern = "CLS <Xd>, <Xn>",
718 .symbols = .{
719 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
720 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
721 },
722 .encode = .{ .cls, .Xd, .Xn },
723 },
724 // C6.2.58 CLZ
725 .{
726 .pattern = "CLZ <Wd>, <Wn>",
727 .symbols = .{
728 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
729 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
730 },
731 .encode = .{ .clz, .Wd, .Wn },
732 },
733 .{
734 .pattern = "CLZ <Xd>, <Xn>",
735 .symbols = .{
736 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
737 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
738 },
739 .encode = .{ .clz, .Xd, .Xn },
740 },
741 // C6.2.109 DC
742 .{
743 .pattern = "DC IVAC, <Xt>",
744 .symbols = .{
745 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
746 },
747 .encode = .{ .sys, 0b000, 0b0111, 0b0110, 0b001, .Xt },
748 },
749 .{
750 .pattern = "DC ISW, <Xt>",
751 .symbols = .{
752 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
753 },
754 .encode = .{ .sys, 0b000, 0b0111, 0b0110, 0b010, .Xt },
755 },
756 .{
757 .pattern = "DC CSW, <Xt>",
758 .symbols = .{
759 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
760 },
761 .encode = .{ .sys, 0b000, 0b0111, 0b1010, 0b010, .Xt },
762 },
763 .{
764 .pattern = "DC CISW, <Xt>",
765 .symbols = .{
766 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
767 },
768 .encode = .{ .sys, 0b000, 0b0111, 0b1110, 0b010, .Xt },
769 },
770 .{
771 .pattern = "DC ZVA, <Xt>",
772 .symbols = .{
773 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
774 },
775 .encode = .{ .sys, 0b011, 0b0111, 0b0100, 0b001, .Xt },
776 },
777 .{
778 .pattern = "DC CVAC, <Xt>",
779 .symbols = .{
780 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
781 },
782 .encode = .{ .sys, 0b011, 0b0111, 0b1010, 0b001, .Xt },
783 },
784 .{
785 .pattern = "DC CVAU, <Xt>",
786 .symbols = .{
787 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
788 },
789 .encode = .{ .sys, 0b011, 0b0111, 0b1011, 0b001, .Xt },
790 },
791 .{
792 .pattern = "DC CIVAC, <Xt>",
793 .symbols = .{
794 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
795 },
796 .encode = .{ .sys, 0b011, 0b0111, 0b1110, 0b001, .Xt },
797 },
798 // C6.2.110 DCPS1
799 .{
800 .pattern = "DCPS1",
801 .symbols = .{},
802 .encode = .{ .dcps1, 0 },
803 },
804 .{
805 .pattern = "DCPS1 #<imm>",
806 .symbols = .{
807 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
808 },
809 .encode = .{ .dcps1, .imm },
810 },
811 // C6.2.111 DCPS2
812 .{
813 .pattern = "DCPS2",
814 .symbols = .{},
815 .encode = .{ .dcps2, 0 },
816 },
817 .{
818 .pattern = "DCPS2 #<imm>",
819 .symbols = .{
820 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
821 },
822 .encode = .{ .dcps2, .imm },
823 },
824 // C6.2.112 DCPS3
825 .{
826 .pattern = "DCPS3",
827 .symbols = .{},
828 .encode = .{ .dcps3, 0 },
829 },
830 .{
831 .pattern = "DCPS3 #<imm>",
832 .symbols = .{
833 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
834 },
835 .encode = .{ .dcps3, .imm },
836 },
837 // C6.2.116 DSB
838 .{
839 .pattern = "DSB <option>",
840 .symbols = .{
841 .option = .{ .barrier = .{} },
842 },
843 .encode = .{ .dsb, .option },
844 },
845 .{
846 .pattern = "DSB #<imm>",
847 .symbols = .{
848 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
849 },
850 .encode = .{ .dsb, .imm },
851 },
852 // C6.2.120 EOR (shifted register)
853 .{
854 .pattern = "EOR <Wd>, <Wn>, <Wm>",
855 .symbols = .{
856 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
857 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
858 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
859 },
860 .encode = .{ .eor, .Wd, .Wn, .{ .register = .Wm } },
861 },
862 .{
863 .pattern = "EOR <Wd>, <Wn>, <Wm>, <shift> #<amount>",
864 .symbols = .{
865 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
866 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
867 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
868 .shift = .{ .shift = .{} },
869 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
870 },
871 .encode = .{ .eor, .Wd, .Wn, .{ .shifted_register_explicit = .{
872 .register = .Wm,
873 .shift = .shift,
874 .amount = .amount,
875 } } },
876 },
877 .{
878 .pattern = "EOR <Xd>, <Xn>, <Xm>",
879 .symbols = .{
880 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
881 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
882 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
883 },
884 .encode = .{ .eor, .Xd, .Xn, .{ .register = .Xm } },
885 },
886 .{
887 .pattern = "EOR <Xd>, <Xn>, <Xm>, <shift> #<amount>",
888 .symbols = .{
889 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
890 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
891 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
892 .shift = .{ .shift = .{} },
893 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
894 },
895 .encode = .{ .eor, .Xd, .Xn, .{ .shifted_register_explicit = .{
896 .register = .Xm,
897 .shift = .shift,
898 .amount = .amount,
899 } } },
900 },
901 // C6.2.124 EXTR
902 .{
903 .pattern = "EXTR <Wd>, <Wn>, <Wm>, #<lsb>",
904 .symbols = .{
905 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
906 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
907 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
908 .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
909 },
910 .encode = .{ .extr, .Wd, .Wn, .Wm, .lsb },
911 },
912 .{
913 .pattern = "EXTR <Xd>, <Xn>, <Xm>, #<lsb>",
914 .symbols = .{
915 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
916 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
917 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
918 .lsb = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
919 },
920 .encode = .{ .extr, .Xd, .Xn, .Xm, .lsb },
921 },
922 // C6.2.126 HINT
923 .{
924 .pattern = "HINT #<imm>",
925 .symbols = .{
926 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 7 } } },
927 },
928 .encode = .{ .hint, .imm },
929 },
930 // C6.2.127 HLT
931 .{
932 .pattern = "HLT #<imm>",
933 .symbols = .{
934 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
935 },
936 .encode = .{ .hlt, .imm },
937 },
938 // C6.2.128 HVC
939 .{
940 .pattern = "HVC #<imm>",
941 .symbols = .{
942 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
943 },
944 .encode = .{ .hvc, .imm },
945 },
946 // C6.2.129 IC
947 .{
948 .pattern = "IC IALLUIS",
949 .symbols = .{},
950 .encode = .{ .sys, 0b000, 0b0111, 0b0001, 0b000, .xzr },
951 },
952 .{
953 .pattern = "IC IALLUIS, <Xt>",
954 .symbols = .{
955 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
956 },
957 .encode = .{ .sys, 0b000, 0b0111, 0b0001, 0b000, .Xt },
958 },
959 .{
960 .pattern = "IC IALLU",
961 .symbols = .{},
962 .encode = .{ .sys, 0b000, 0b0111, 0b0101, 0b000, .xzr },
963 },
964 .{
965 .pattern = "IC IALLU, <Xt>",
966 .symbols = .{
967 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
968 },
969 .encode = .{ .sys, 0b000, 0b0111, 0b0101, 0b000, .Xt },
970 },
971 .{
972 .pattern = "IC IVAU",
973 .symbols = .{},
974 .encode = .{ .sys, 0b011, 0b0111, 0b0101, 0b001, .xzr },
975 },
976 .{
977 .pattern = "IC IVAU, <Xt>",
978 .symbols = .{
979 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
980 },
981 .encode = .{ .sys, 0b011, 0b0111, 0b0101, 0b001, .Xt },
982 },
983 // C6.2.131 ISB
984 .{
985 .pattern = "ISB",
986 .symbols = .{},
987 .encode = .{ .isb, .sy },
988 },
989 .{
990 .pattern = "ISB <option>",
991 .symbols = .{
992 .option = .{ .barrier = .{ .only_sy = true } },
993 },
994 .encode = .{ .isb, .option },
995 },
996 .{
997 .pattern = "ISB #<imm>",
998 .symbols = .{
999 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
1000 },
1001 .encode = .{ .isb, .imm },
1002 },
1003 // C6.2.164 LDP
1004 .{
1005 .pattern = "LDP <Wt1>, <Wt2>, [<Xn|SP>], #<imm>",
1006 .symbols = .{
1007 .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1008 .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1009 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1010 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1011 },
1012 .encode = .{ .ldp, .Wt1, .Wt2, .{ .post_index = .{ .base = .Xn, .index = .imm } } },
1013 },
1014 .{
1015 .pattern = "LDP <Xt1>, <Xt2>, [<Xn|SP>], #<imm>",
1016 .symbols = .{
1017 .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1018 .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1019 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1020 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1021 },
1022 .encode = .{ .ldp, .Xt1, .Xt2, .{ .post_index = .{ .base = .Xn, .index = .imm } } },
1023 },
1024 .{
1025 .pattern = "LDP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]!",
1026 .symbols = .{
1027 .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1028 .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1029 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1030 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1031 },
1032 .encode = .{ .ldp, .Wt1, .Wt2, .{ .pre_index = .{ .base = .Xn, .index = .imm } } },
1033 },
1034 .{
1035 .pattern = "LDP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!",
1036 .symbols = .{
1037 .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1038 .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1039 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1040 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1041 },
1042 .encode = .{ .ldp, .Xt1, .Xt2, .{ .pre_index = .{ .base = .Xn, .index = .imm } } },
1043 },
1044 .{
1045 .pattern = "LDP <Wt1>, <Wt2>, [<Xn|SP>]",
1046 .symbols = .{
1047 .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1048 .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1049 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1050 },
1051 .encode = .{ .ldp, .Wt1, .Wt2, .{ .base = .Xn } },
1052 },
1053 .{
1054 .pattern = "LDP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]",
1055 .symbols = .{
1056 .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1057 .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1058 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1059 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1060 },
1061 .encode = .{ .ldp, .Wt1, .Wt2, .{ .signed_offset = .{ .base = .Xn, .offset = .imm } } },
1062 },
1063 .{
1064 .pattern = "LDP <Xt1>, <Xt2>, [<Xn|SP>]",
1065 .symbols = .{
1066 .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1067 .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1068 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1069 },
1070 .encode = .{ .ldp, .Xt1, .Xt2, .{ .base = .Xn } },
1071 },
1072 .{
1073 .pattern = "LDP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]",
1074 .symbols = .{
1075 .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1076 .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1077 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1078 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1079 },
1080 .encode = .{ .ldp, .Xt1, .Xt2, .{ .signed_offset = .{ .base = .Xn, .offset = .imm } } },
1081 },
1082 // C6.2.166 LDR (immediate)
1083 .{
1084 .pattern = "LDR <Wt>, [<Xn|SP>], #<simm>",
1085 .symbols = .{
1086 .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1087 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1088 .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1089 },
1090 .encode = .{ .ldr, .Wt, .{ .post_index = .{ .base = .Xn, .index = .simm } } },
1091 },
1092 .{
1093 .pattern = "LDR <Xt>, [<Xn|SP>], #<simm>",
1094 .symbols = .{
1095 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1096 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1097 .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1098 },
1099 .encode = .{ .ldr, .Xt, .{ .post_index = .{ .base = .Xn, .index = .simm } } },
1100 },
1101 .{
1102 .pattern = "LDR <Wt>, [<Xn|SP>, #<simm>]!",
1103 .symbols = .{
1104 .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1105 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1106 .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1107 },
1108 .encode = .{ .ldr, .Wt, .{ .pre_index = .{ .base = .Xn, .index = .simm } } },
1109 },
1110 .{
1111 .pattern = "LDR <Xt>, [<Xn|SP>, #<simm>]!",
1112 .symbols = .{
1113 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1114 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1115 .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1116 },
1117 .encode = .{ .ldr, .Xt, .{ .pre_index = .{ .base = .Xn, .index = .simm } } },
1118 },
1119 .{
1120 .pattern = "LDR <Wt>, [<Xn|SP>]",
1121 .symbols = .{
1122 .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1123 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1124 },
1125 .encode = .{ .ldr, .Wt, .{ .base = .Xn } },
1126 },
1127 .{
1128 .pattern = "LDR <Wt>, [<Xn|SP>, #<pimm>]",
1129 .symbols = .{
1130 .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1131 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1132 .pimm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 14 }, .multiple_of = 4 } },
1133 },
1134 .encode = .{ .ldr, .Wt, .{ .unsigned_offset = .{ .base = .Xn, .offset = .pimm } } },
1135 },
1136 .{
1137 .pattern = "LDR <Xt>, [<Xn|SP>]",
1138 .symbols = .{
1139 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1140 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1141 },
1142 .encode = .{ .ldr, .Xt, .{ .base = .Xn } },
1143 },
1144 .{
1145 .pattern = "LDR <Xt>, [<Xn|SP>, #<pimm>]",
1146 .symbols = .{
1147 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1148 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1149 .pimm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 15 }, .multiple_of = 8 } },
1150 },
1151 .encode = .{ .ldr, .Xt, .{ .unsigned_offset = .{ .base = .Xn, .offset = .pimm } } },
1152 },
1153 // C6.2.212 LSL (register)
1154 .{
1155 .pattern = "LSL <Wd>, <Wn>, <Wm>",
1156 .symbols = .{
1157 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1158 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1159 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1160 },
1161 .encode = .{ .lslv, .Wd, .Wn, .Wm },
1162 },
1163 .{
1164 .pattern = "LSL <Xd>, <Xn>, <Xm>",
1165 .symbols = .{
1166 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1167 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1168 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1169 },
1170 .encode = .{ .lslv, .Xd, .Xn, .Xm },
1171 },
1172 // C6.2.214 LSLV
1173 .{
1174 .pattern = "LSLV <Wd>, <Wn>, <Wm>",
1175 .symbols = .{
1176 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1177 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1178 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1179 },
1180 .encode = .{ .lslv, .Wd, .Wn, .Wm },
1181 },
1182 .{
1183 .pattern = "LSLV <Xd>, <Xn>, <Xm>",
1184 .symbols = .{
1185 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1186 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1187 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1188 },
1189 .encode = .{ .lslv, .Xd, .Xn, .Xm },
1190 },
1191 // C6.2.215 LSR (register)
1192 .{
1193 .pattern = "LSR <Wd>, <Wn>, <Wm>",
1194 .symbols = .{
1195 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1196 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1197 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1198 },
1199 .encode = .{ .lsrv, .Wd, .Wn, .Wm },
1200 },
1201 .{
1202 .pattern = "LSR <Xd>, <Xn>, <Xm>",
1203 .symbols = .{
1204 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1205 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1206 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1207 },
1208 .encode = .{ .lsrv, .Xd, .Xn, .Xm },
1209 },
1210 // C6.2.217 LSRV
1211 .{
1212 .pattern = "LSRV <Wd>, <Wn>, <Wm>",
1213 .symbols = .{
1214 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1215 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1216 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1217 },
1218 .encode = .{ .lsrv, .Wd, .Wn, .Wm },
1219 },
1220 .{
1221 .pattern = "LSRV <Xd>, <Xn>, <Xm>",
1222 .symbols = .{
1223 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1224 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1225 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1226 },
1227 .encode = .{ .lsrv, .Xd, .Xn, .Xm },
1228 },
1229 // C6.2.218 MADD
1230 .{
1231 .pattern = "MADD <Wd>, <Wn>, <Wm>, <Wa>",
1232 .symbols = .{
1233 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1234 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1235 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1236 .Wa = .{ .reg = .{ .format = .{ .general = .word } } },
1237 },
1238 .encode = .{ .madd, .Wd, .Wn, .Wm, .Wa },
1239 },
1240 .{
1241 .pattern = "MADD <Xd>, <Xn>, <Xm>, <Xa>",
1242 .symbols = .{
1243 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1244 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1245 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1246 .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1247 },
1248 .encode = .{ .madd, .Xd, .Xn, .Xm, .Xa },
1249 },
1250 // C6.2.219 MNEG
1251 .{
1252 .pattern = "MNEG <Wd>, <Wn>, <Wm>",
1253 .symbols = .{
1254 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1255 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1256 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1257 },
1258 .encode = .{ .msub, .Wd, .Wn, .Wm, .wzr },
1259 },
1260 .{
1261 .pattern = "MNEG <Xd>, <Xn>, <Xm>",
1262 .symbols = .{
1263 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1264 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1265 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1266 },
1267 .encode = .{ .msub, .Xd, .Xn, .Xm, .xzr },
1268 },
1269 // C6.2.220 MOV (to/from SP)
1270 .{
1271 .pattern = "MOV WSP, <Wn|WSP>",
1272 .symbols = .{
1273 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
1274 },
1275 .encode = .{ .add, .wsp, .Wn, .{ .immediate = 0 } },
1276 },
1277 .{
1278 .pattern = "MOV <Wd|WSP>, WSP",
1279 .symbols = .{
1280 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
1281 },
1282 .encode = .{ .add, .Wd, .wsp, .{ .immediate = 0 } },
1283 },
1284 .{
1285 .pattern = "MOV SP, <Xn|SP>",
1286 .symbols = .{
1287 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1288 },
1289 .encode = .{ .add, .sp, .Xn, .{ .immediate = 0 } },
1290 },
1291 .{
1292 .pattern = "MOV <Xd|SP>, SP",
1293 .symbols = .{
1294 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1295 },
1296 .encode = .{ .add, .Xd, .sp, .{ .immediate = 0 } },
1297 },
1298 // C6.2.222 MOV (wide immediate)
1299 .{
1300 .pattern = "MOV <Wd>, #<imm>",
1301 .symbols = .{
1302 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1303 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1304 },
1305 .encode = .{ .movz, .Wd, .imm, .{ .lsl = .@"0" } },
1306 },
1307 .{
1308 .pattern = "MOV <Xd>, #<imm>",
1309 .symbols = .{
1310 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1311 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1312 },
1313 .encode = .{ .movz, .Xd, .imm, .{ .lsl = .@"0" } },
1314 },
1315 // C6.2.224 MOV (register)
1316 .{
1317 .pattern = "MOV <Wd>, <Wm>",
1318 .symbols = .{
1319 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1320 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1321 },
1322 .encode = .{ .orr, .Wd, .wzr, .{ .register = .Wm } },
1323 },
1324 .{
1325 .pattern = "MOV <Xd>, <Xm>",
1326 .symbols = .{
1327 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1328 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1329 },
1330 .encode = .{ .orr, .Xd, .xzr, .{ .register = .Xm } },
1331 },
1332 // C6.2.225 MOVK
1333 .{
1334 .pattern = "MOVK <Wd>, #<imm>",
1335 .symbols = .{
1336 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1337 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1338 },
1339 .encode = .{ .movk, .Wd, .imm, .{} },
1340 },
1341 .{
1342 .pattern = "MOVK <Wd>, #<imm>, LSL #<shift>",
1343 .symbols = .{
1344 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1345 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1346 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .multiple_of = 16 } },
1347 },
1348 .encode = .{ .movk, .Wd, .imm, .{ .lsl = .shift } },
1349 },
1350 .{
1351 .pattern = "MOVK <Xd>, #<imm>",
1352 .symbols = .{
1353 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1354 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1355 },
1356 .encode = .{ .movk, .Xd, .imm, .{} },
1357 },
1358 .{
1359 .pattern = "MOVK <Xd>, #<imm>, LSL #<shift>",
1360 .symbols = .{
1361 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1362 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1363 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .multiple_of = 16 } },
1364 },
1365 .encode = .{ .movk, .Xd, .imm, .{ .lsl = .shift } },
1366 },
1367 // C6.2.226 MOVN
1368 .{
1369 .pattern = "MOVN <Wd>, #<imm>",
1370 .symbols = .{
1371 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1372 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1373 },
1374 .encode = .{ .movn, .Wd, .imm, .{} },
1375 },
1376 .{
1377 .pattern = "MOVN <Wd>, #<imm>, LSL #<shift>",
1378 .symbols = .{
1379 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1380 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1381 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .multiple_of = 16 } },
1382 },
1383 .encode = .{ .movn, .Wd, .imm, .{ .lsl = .shift } },
1384 },
1385 .{
1386 .pattern = "MOVN <Xd>, #<imm>",
1387 .symbols = .{
1388 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1389 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1390 },
1391 .encode = .{ .movn, .Xd, .imm, .{} },
1392 },
1393 .{
1394 .pattern = "MOVN <Xd>, #<imm>, LSL #<shift>",
1395 .symbols = .{
1396 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1397 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1398 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .multiple_of = 16 } },
1399 },
1400 .encode = .{ .movn, .Xd, .imm, .{ .lsl = .shift } },
1401 },
1402 // C6.2.227 MOVZ
1403 .{
1404 .pattern = "MOVZ <Wd>, #<imm>",
1405 .symbols = .{
1406 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1407 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1408 },
1409 .encode = .{ .movz, .Wd, .imm, .{} },
1410 },
1411 .{
1412 .pattern = "MOVZ <Wd>, #<imm>, LSL #<shift>",
1413 .symbols = .{
1414 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1415 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1416 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 }, .multiple_of = 16 } },
1417 },
1418 .encode = .{ .movz, .Wd, .imm, .{ .lsl = .shift } },
1419 },
1420 .{
1421 .pattern = "MOVZ <Xd>, #<imm>",
1422 .symbols = .{
1423 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1424 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1425 },
1426 .encode = .{ .movz, .Xd, .imm, .{} },
1427 },
1428 .{
1429 .pattern = "MOVZ <Xd>, #<imm>, LSL #<shift>",
1430 .symbols = .{
1431 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1432 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1433 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 }, .multiple_of = 16 } },
1434 },
1435 .encode = .{ .movz, .Xd, .imm, .{ .lsl = .shift } },
1436 },
1437 // C6.2.228 MRS
1438 .{
1439 .pattern = "MRS <Xt>, <systemreg>",
1440 .symbols = .{
1441 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1442 .systemreg = .systemreg,
1443 },
1444 .encode = .{ .mrs, .Xt, .systemreg },
1445 },
1446 // C6.2.230 MSR (register)
1447 .{
1448 .pattern = "MSR <systemreg>, <Xt>",
1449 .symbols = .{
1450 .systemreg = .systemreg,
1451 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1452 },
1453 .encode = .{ .msr, .systemreg, .Xt },
1454 },
1455 // C6.2.231 MSUB
1456 .{
1457 .pattern = "MSUB <Wd>, <Wn>, <Wm>, <Wa>",
1458 .symbols = .{
1459 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1460 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1461 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1462 .Wa = .{ .reg = .{ .format = .{ .general = .word } } },
1463 },
1464 .encode = .{ .msub, .Wd, .Wn, .Wm, .Wa },
1465 },
1466 .{
1467 .pattern = "MSUB <Xd>, <Xn>, <Xm>, <Xa>",
1468 .symbols = .{
1469 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1470 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1471 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1472 .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1473 },
1474 .encode = .{ .msub, .Xd, .Xn, .Xm, .Xa },
1475 },
1476 // C6.2.232 MUL
1477 .{
1478 .pattern = "MUL <Wd>, <Wn>, <Wm>",
1479 .symbols = .{
1480 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1481 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1482 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1483 },
1484 .encode = .{ .madd, .Wd, .Wn, .Wm, .wzr },
1485 },
1486 .{
1487 .pattern = "MUL <Xd>, <Xn>, <Xm>",
1488 .symbols = .{
1489 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1490 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1491 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1492 },
1493 .encode = .{ .madd, .Xd, .Xn, .Xm, .xzr },
1494 },
1495 // C6.2.234 NEG
1496 .{
1497 .pattern = "NEG <Wd>, <Wm>",
1498 .symbols = .{
1499 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1500 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1501 },
1502 .encode = .{ .sub, .Wd, .wzr, .{ .register = .Wm } },
1503 },
1504 .{
1505 .pattern = "NEG <Wd>, <Wm>, <shift> #<amount>",
1506 .symbols = .{
1507 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1508 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1509 .shift = .{ .shift = .{ .allow_ror = false } },
1510 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1511 },
1512 .encode = .{ .sub, .Wd, .wzr, .{ .shifted_register_explicit = .{
1513 .register = .Wm,
1514 .shift = .shift,
1515 .amount = .amount,
1516 } } },
1517 },
1518 .{
1519 .pattern = "NEG <Xd>, <Xm>",
1520 .symbols = .{
1521 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1522 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1523 },
1524 .encode = .{ .sub, .Xd, .xzr, .{ .register = .Xm } },
1525 },
1526 .{
1527 .pattern = "NEG <Xd>, <Xm>, <shift> #<amount>",
1528 .symbols = .{
1529 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1530 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1531 .shift = .{ .shift = .{ .allow_ror = false } },
1532 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1533 },
1534 .encode = .{ .sub, .Xd, .xzr, .{ .shifted_register_explicit = .{
1535 .register = .Xm,
1536 .shift = .shift,
1537 .amount = .amount,
1538 } } },
1539 },
1540 // C6.2.238 NOP
1541 .{
1542 .pattern = "NOP",
1543 .symbols = .{},
1544 .encode = .{.nop},
1545 },
1546 // C6.2.241 ORR (shifted register)
1547 .{
1548 .pattern = "ORR <Wd>, <Wn>, <Wm>",
1549 .symbols = .{
1550 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1551 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1552 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1553 },
1554 .encode = .{ .orr, .Wd, .Wn, .{ .register = .Wm } },
1555 },
1556 .{
1557 .pattern = "ORR <Wd>, <Wn>, <Wm>, <shift> #<amount>",
1558 .symbols = .{
1559 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1560 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1561 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1562 .shift = .{ .shift = .{} },
1563 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1564 },
1565 .encode = .{ .orr, .Wd, .Wn, .{ .shifted_register_explicit = .{
1566 .register = .Wm,
1567 .shift = .shift,
1568 .amount = .amount,
1569 } } },
1570 },
1571 .{
1572 .pattern = "ORR <Xd>, <Xn>, <Xm>",
1573 .symbols = .{
1574 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1575 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1576 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1577 },
1578 .encode = .{ .orr, .Xd, .Xn, .{ .register = .Xm } },
1579 },
1580 .{
1581 .pattern = "ORR <Xd>, <Xn>, <Xm>, <shift> #<amount>",
1582 .symbols = .{
1583 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1584 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1585 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1586 .shift = .{ .shift = .{} },
1587 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1588 },
1589 .encode = .{ .orr, .Xd, .Xn, .{ .shifted_register_explicit = .{
1590 .register = .Xm,
1591 .shift = .shift,
1592 .amount = .amount,
1593 } } },
1594 },
1595 // C6.2.253 RBIT
1596 .{
1597 .pattern = "RBIT <Wd>, <Wn>",
1598 .symbols = .{
1599 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1600 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1601 },
1602 .encode = .{ .rbit, .Wd, .Wn },
1603 },
1604 .{
1605 .pattern = "RBIT <Xd>, <Xn>",
1606 .symbols = .{
1607 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1608 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1609 },
1610 .encode = .{ .rbit, .Xd, .Xn },
1611 },
1612 // C6.2.254 RET
1613 .{
1614 .pattern = "RET",
1615 .symbols = .{},
1616 .encode = .{ .ret, .x30 },
1617 },
1618 .{
1619 .pattern = "RET <Xn>",
1620 .symbols = .{
1621 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1622 },
1623 .encode = .{ .ret, .Xn },
1624 },
1625 // C6.2.256 REV
1626 .{
1627 .pattern = "REV <Wd>, <Wn>",
1628 .symbols = .{
1629 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1630 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1631 },
1632 .encode = .{ .rev, .Wd, .Wn },
1633 },
1634 .{
1635 .pattern = "REV <Xd>, <Xn>",
1636 .symbols = .{
1637 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1638 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1639 },
1640 .encode = .{ .rev, .Xd, .Xn },
1641 },
1642 // C6.2.257 REV16
1643 .{
1644 .pattern = "REV16 <Wd>, <Wn>",
1645 .symbols = .{
1646 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1647 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1648 },
1649 .encode = .{ .rev16, .Wd, .Wn },
1650 },
1651 .{
1652 .pattern = "REV16 <Xd>, <Xn>",
1653 .symbols = .{
1654 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1655 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1656 },
1657 .encode = .{ .rev16, .Xd, .Xn },
1658 },
1659 // C6.2.258 REV32
1660 .{
1661 .pattern = "REV32 <Xd>, <Xn>",
1662 .symbols = .{
1663 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1664 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1665 },
1666 .encode = .{ .rev32, .Xd, .Xn },
1667 },
1668 // C6.2.259 REV64
1669 .{
1670 .pattern = "REV64 <Xd>, <Xn>",
1671 .symbols = .{
1672 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1673 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1674 },
1675 .encode = .{ .rev, .Xd, .Xn },
1676 },
1677 // C6.2.261 ROR (immediate)
1678 .{
1679 .pattern = "ROR <Wd>, <Ws>, #<shift>",
1680 .symbols = .{
1681 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1682 .Ws = .{ .reg = .{ .format = .{ .general = .word } } },
1683 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1684 },
1685 .encode = .{ .extr, .Wd, .Ws, .Ws, .shift },
1686 },
1687 .{
1688 .pattern = "ROR <Xd>, <Xs>, #<shift>",
1689 .symbols = .{
1690 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1691 .Xs = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1692 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1693 },
1694 .encode = .{ .extr, .Xd, .Xs, .Xs, .shift },
1695 },
1696 // C6.2.262 ROR (register)
1697 .{
1698 .pattern = "ROR <Wd>, <Wn>, <Wm>",
1699 .symbols = .{
1700 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1701 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1702 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1703 },
1704 .encode = .{ .rorv, .Wd, .Wn, .Wm },
1705 },
1706 .{
1707 .pattern = "ROR <Xd>, <Xn>, <Xm>",
1708 .symbols = .{
1709 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1710 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1711 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1712 },
1713 .encode = .{ .rorv, .Xd, .Xn, .Xm },
1714 },
1715 // C6.2.263 RORV
1716 .{
1717 .pattern = "RORV <Wd>, <Wn>, <Wm>",
1718 .symbols = .{
1719 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1720 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1721 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1722 },
1723 .encode = .{ .rorv, .Wd, .Wn, .Wm },
1724 },
1725 .{
1726 .pattern = "RORV <Xd>, <Xn>, <Xm>",
1727 .symbols = .{
1728 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1729 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1730 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1731 },
1732 .encode = .{ .rorv, .Xd, .Xn, .Xm },
1733 },
1734 // C6.2.265 SBC
1735 .{
1736 .pattern = "SBC <Wd>, <Wn>, <Wm>",
1737 .symbols = .{
1738 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1739 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1740 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1741 },
1742 .encode = .{ .sbc, .Wd, .Wn, .Wm },
1743 },
1744 .{
1745 .pattern = "SBC <Xd>, <Xn>, <Xm>",
1746 .symbols = .{
1747 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1748 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1749 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1750 },
1751 .encode = .{ .sbc, .Xd, .Xn, .Xm },
1752 },
1753 // C6.2.266 SBCS
1754 .{
1755 .pattern = "SBCS <Wd>, <Wn>, <Wm>",
1756 .symbols = .{
1757 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1758 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1759 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1760 },
1761 .encode = .{ .sbcs, .Wd, .Wn, .Wm },
1762 },
1763 .{
1764 .pattern = "SBCS <Xd>, <Xn>, <Xm>",
1765 .symbols = .{
1766 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1767 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1768 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1769 },
1770 .encode = .{ .sbcs, .Xd, .Xn, .Xm },
1771 },
1772 // C6.2.268 SBFM
1773 .{
1774 .pattern = "SBFM <Wd>, <Wn>, #<immr>, #<imms>",
1775 .symbols = .{
1776 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1777 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1778 .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1779 .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
1780 },
1781 .encode = .{ .sbfm, .Wd, .Wn, .{ .N = .word, .immr = .immr, .imms = .imms } },
1782 },
1783 .{
1784 .pattern = "SBFM <Xd>, <Xn>, #<immr>, #<imms>",
1785 .symbols = .{
1786 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1787 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1788 .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1789 .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
1790 },
1791 .encode = .{ .sbfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .immr, .imms = .imms } },
1792 },
1793 // C6.2.270 SDIV
1794 .{
1795 .pattern = "SDIV <Wd>, <Wn>, <Wm>",
1796 .symbols = .{
1797 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
1798 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1799 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1800 },
1801 .encode = .{ .sdiv, .Wd, .Wn, .Wm },
1802 },
1803 .{
1804 .pattern = "SDIV <Xd>, <Xn>, <Xm>",
1805 .symbols = .{
1806 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1807 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1808 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1809 },
1810 .encode = .{ .sdiv, .Xd, .Xn, .Xm },
1811 },
1812 // C6.2.280 SEV
1813 .{
1814 .pattern = "SEV",
1815 .symbols = .{},
1816 .encode = .{.sev},
1817 },
1818 // C6.2.281 SEVL
1819 .{
1820 .pattern = "SEVL",
1821 .symbols = .{},
1822 .encode = .{.sevl},
1823 },
1824 // C6.2.282 SMADDL
1825 .{
1826 .pattern = "SMADDL <Xd>, <Wn>, <Wm>, <Xa>",
1827 .symbols = .{
1828 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1829 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1830 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1831 .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1832 },
1833 .encode = .{ .smaddl, .Xd, .Wn, .Wm, .Xa },
1834 },
1835 // C6.2.283 SMC
1836 .{
1837 .pattern = "SMC #<imm>",
1838 .symbols = .{
1839 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
1840 },
1841 .encode = .{ .smc, .imm },
1842 },
1843 // C6.2.284 SMNEGL
1844 .{
1845 .pattern = "SMNEGL <Xd>, <Wn>, <Wm>",
1846 .symbols = .{
1847 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1848 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1849 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1850 },
1851 .encode = .{ .smsubl, .Xd, .Wn, .Wm, .xzr },
1852 },
1853 // C6.2.287 SMSUBL
1854 .{
1855 .pattern = "SMSUBL <Xd>, <Wn>, <Wm>, <Xa>",
1856 .symbols = .{
1857 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1858 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1859 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1860 .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1861 },
1862 .encode = .{ .smsubl, .Xd, .Wn, .Wm, .Xa },
1863 },
1864 // C6.2.288 SMULH
1865 .{
1866 .pattern = "SMULH <Xd>, <Xn>, <Xm>",
1867 .symbols = .{
1868 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1869 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1870 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1871 },
1872 .encode = .{ .smulh, .Xd, .Xn, .Xm },
1873 },
1874 // C6.2.289 SMULL
1875 .{
1876 .pattern = "SMULL <Xd>, <Wn>, <Wm>",
1877 .symbols = .{
1878 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1879 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
1880 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
1881 },
1882 .encode = .{ .smaddl, .Xd, .Wn, .Wm, .xzr },
1883 },
1884 // C6.2.321 STP
1885 .{
1886 .pattern = "STP <Wt1>, <Wt2>, [<Xn|SP>], #<imm>",
1887 .symbols = .{
1888 .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1889 .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1890 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1891 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1892 },
1893 .encode = .{ .stp, .Wt1, .Wt2, .{ .post_index = .{ .base = .Xn, .index = .imm } } },
1894 },
1895 .{
1896 .pattern = "STP <Xt1>, <Xt2>, [<Xn|SP>], #<imm>",
1897 .symbols = .{
1898 .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1899 .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1900 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1901 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1902 },
1903 .encode = .{ .stp, .Xt1, .Xt2, .{ .post_index = .{ .base = .Xn, .index = .imm } } },
1904 },
1905 .{
1906 .pattern = "STP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]!",
1907 .symbols = .{
1908 .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1909 .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1910 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1911 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1912 },
1913 .encode = .{ .stp, .Wt1, .Wt2, .{ .pre_index = .{ .base = .Xn, .index = .imm } } },
1914 },
1915 .{
1916 .pattern = "STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!",
1917 .symbols = .{
1918 .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1919 .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1920 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1921 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1922 },
1923 .encode = .{ .stp, .Xt1, .Xt2, .{ .pre_index = .{ .base = .Xn, .index = .imm } } },
1924 },
1925 .{
1926 .pattern = "STP <Wt1>, <Wt2>, [<Xn|SP>]",
1927 .symbols = .{
1928 .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1929 .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1930 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1931 },
1932 .encode = .{ .stp, .Wt1, .Wt2, .{ .base = .Xn } },
1933 },
1934 .{
1935 .pattern = "STP <Wt1>, <Wt2>, [<Xn|SP>, #<imm>]",
1936 .symbols = .{
1937 .Wt1 = .{ .reg = .{ .format = .{ .general = .word } } },
1938 .Wt2 = .{ .reg = .{ .format = .{ .general = .word } } },
1939 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1940 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 }, .multiple_of = 4 } },
1941 },
1942 .encode = .{ .stp, .Wt1, .Wt2, .{ .signed_offset = .{ .base = .Xn, .offset = .imm } } },
1943 },
1944 .{
1945 .pattern = "STP <Xt1>, <Xt2>, [<Xn|SP>]",
1946 .symbols = .{
1947 .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1948 .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1949 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1950 },
1951 .encode = .{ .stp, .Xt1, .Xt2, .{ .base = .Xn } },
1952 },
1953 .{
1954 .pattern = "STP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]",
1955 .symbols = .{
1956 .Xt1 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1957 .Xt2 = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1958 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1959 .imm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 10 }, .multiple_of = 8 } },
1960 },
1961 .encode = .{ .stp, .Xt1, .Xt2, .{ .signed_offset = .{ .base = .Xn, .offset = .imm } } },
1962 },
1963 // C6.2.322 STR (immediate)
1964 .{
1965 .pattern = "STR <Wt>, [<Xn|SP>], #<simm>",
1966 .symbols = .{
1967 .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1968 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1969 .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1970 },
1971 .encode = .{ .str, .Wt, .{ .post_index = .{ .base = .Xn, .index = .simm } } },
1972 },
1973 .{
1974 .pattern = "STR <Xt>, [<Xn|SP>], #<simm>",
1975 .symbols = .{
1976 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1977 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1978 .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1979 },
1980 .encode = .{ .str, .Xt, .{ .post_index = .{ .base = .Xn, .index = .simm } } },
1981 },
1982 .{
1983 .pattern = "STR <Wt>, [<Xn|SP>, #<simm>]!",
1984 .symbols = .{
1985 .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
1986 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1987 .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1988 },
1989 .encode = .{ .str, .Wt, .{ .pre_index = .{ .base = .Xn, .index = .simm } } },
1990 },
1991 .{
1992 .pattern = "STR <Xt>, [<Xn|SP>, #<simm>]!",
1993 .symbols = .{
1994 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
1995 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
1996 .simm = .{ .imm = .{ .type = .{ .signedness = .signed, .bits = 9 } } },
1997 },
1998 .encode = .{ .str, .Xt, .{ .pre_index = .{ .base = .Xn, .index = .simm } } },
1999 },
2000 .{
2001 .pattern = "STR <Wt>, [<Xn|SP>]",
2002 .symbols = .{
2003 .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
2004 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2005 },
2006 .encode = .{ .str, .Wt, .{ .base = .Xn } },
2007 },
2008 .{
2009 .pattern = "STR <Wt>, [<Xn|SP>, #<pimm>]",
2010 .symbols = .{
2011 .Wt = .{ .reg = .{ .format = .{ .general = .word } } },
2012 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2013 .pimm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 14 }, .multiple_of = 4 } },
2014 },
2015 .encode = .{ .str, .Wt, .{ .unsigned_offset = .{ .base = .Xn, .offset = .pimm } } },
2016 },
2017 .{
2018 .pattern = "STR <Xt>, [<Xn|SP>]",
2019 .symbols = .{
2020 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2021 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2022 },
2023 .encode = .{ .str, .Xt, .{ .base = .Xn } },
2024 },
2025 .{
2026 .pattern = "STR <Xt>, [<Xn|SP>, #<pimm>]",
2027 .symbols = .{
2028 .Xt = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2029 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2030 .pimm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 15 }, .multiple_of = 8 } },
2031 },
2032 .encode = .{ .str, .Xt, .{ .unsigned_offset = .{ .base = .Xn, .offset = .pimm } } },
2033 },
2034 // C6.2.356 SUB (extended register)
2035 .{
2036 .pattern = "SUB <Wd|WSP>, <Wn|WSP>, <Wm>",
2037 .symbols = .{
2038 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2039 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2040 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2041 },
2042 .encode = .{ .sub, .Wd, .Wn, .{ .register = .Wm } },
2043 },
2044 .{
2045 .pattern = "SUB <Wd|WSP>, <Wn|WSP>, <Wm>, <extend>",
2046 .symbols = .{
2047 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2048 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2049 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2050 .extend = .{ .extend = .{} },
2051 },
2052 .encode = .{ .sub, .Wd, .Wn, .{ .extended_register_explicit = .{
2053 .register = .Wm,
2054 .option = .extend,
2055 .amount = 0,
2056 } } },
2057 },
2058 .{
2059 .pattern = "SUB <Wd|WSP>, <Wn|WSP>, <Wm>, <extend> #<amount>",
2060 .symbols = .{
2061 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2062 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2063 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2064 .extend = .{ .extend = .{} },
2065 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2066 },
2067 .encode = .{ .sub, .Wd, .Wn, .{ .extended_register_explicit = .{
2068 .register = .Wm,
2069 .option = .extend,
2070 .amount = .amount,
2071 } } },
2072 },
2073 .{
2074 .pattern = "SUB <Xd|SP>, <Xn|SP>, <Xm>",
2075 .symbols = .{
2076 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2077 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2078 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2079 },
2080 .encode = .{ .sub, .Xd, .Xn, .{ .register = .Xm } },
2081 },
2082 .{
2083 .pattern = "SUB <Xd|SP>, <Xn|SP>, <Wm>, <extend>",
2084 .symbols = .{
2085 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2086 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2087 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2088 .extend = .{ .extend = .{ .size = .word } },
2089 },
2090 .encode = .{ .sub, .Xd, .Xn, .{ .extended_register_explicit = .{
2091 .register = .Wm,
2092 .option = .extend,
2093 .amount = 0,
2094 } } },
2095 },
2096 .{
2097 .pattern = "SUB <Xd|SP>, <Xn|SP>, <Wm>, <extend> #<amount>",
2098 .symbols = .{
2099 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2100 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2101 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2102 .extend = .{ .extend = .{ .size = .word } },
2103 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2104 },
2105 .encode = .{ .sub, .Xd, .Xn, .{ .extended_register_explicit = .{
2106 .register = .Wm,
2107 .option = .extend,
2108 .amount = .amount,
2109 } } },
2110 },
2111 .{
2112 .pattern = "SUB <Xd|SP>, <Xn|SP>, <Xm>, <extend>",
2113 .symbols = .{
2114 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2115 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2116 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2117 .extend = .{ .extend = .{ .size = .doubleword } },
2118 },
2119 .encode = .{ .sub, .Xd, .Xn, .{ .extended_register_explicit = .{
2120 .register = .Xm,
2121 .option = .extend,
2122 .amount = 0,
2123 } } },
2124 },
2125 .{
2126 .pattern = "SUB <Xd|SP>, <Xn|SP>, <Xm>, <extend> #<amount>",
2127 .symbols = .{
2128 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2129 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2130 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2131 .extend = .{ .extend = .{ .size = .doubleword } },
2132 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2133 },
2134 .encode = .{ .sub, .Xd, .Xn, .{ .extended_register_explicit = .{
2135 .register = .Xm,
2136 .option = .extend,
2137 .amount = .amount,
2138 } } },
2139 },
2140 // C6.2.357 SUB (immediate)
2141 .{
2142 .pattern = "SUB <Wd|WSP>, <Wn|WSP>, #<imm>",
2143 .symbols = .{
2144 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2145 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2146 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2147 },
2148 .encode = .{ .sub, .Wd, .Wn, .{ .immediate = .imm } },
2149 },
2150 .{
2151 .pattern = "SUB <Wd|WSP>, <Wn|WSP>, #<imm>, LSL #<shift>",
2152 .symbols = .{
2153 .Wd = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2154 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2155 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2156 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
2157 },
2158 .encode = .{ .sub, .Wd, .Wn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
2159 },
2160 .{
2161 .pattern = "SUB <Xd|SP>, <Xn|SP>, #<imm>",
2162 .symbols = .{
2163 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2164 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2165 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2166 },
2167 .encode = .{ .sub, .Xd, .Xn, .{ .immediate = .imm } },
2168 },
2169 .{
2170 .pattern = "SUB <Xd|SP>, <Xn|SP>, #<imm>, LSL #<shift>",
2171 .symbols = .{
2172 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2173 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2174 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2175 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
2176 },
2177 .encode = .{ .sub, .Xd, .Xn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
2178 },
2179 // C6.2.358 SUB (shifted register)
2180 .{
2181 .pattern = "SUB <Wd>, <Wn>, <Wm>",
2182 .symbols = .{
2183 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2184 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2185 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2186 },
2187 .encode = .{ .sub, .Wd, .Wn, .{ .register = .Wm } },
2188 },
2189 .{
2190 .pattern = "SUB <Wd>, <Wn>, <Wm>, <shift> #<amount>",
2191 .symbols = .{
2192 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2193 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2194 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2195 .shift = .{ .shift = .{ .allow_ror = false } },
2196 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
2197 },
2198 .encode = .{ .sub, .Wd, .Wn, .{ .shifted_register_explicit = .{
2199 .register = .Wm,
2200 .shift = .shift,
2201 .amount = .amount,
2202 } } },
2203 },
2204 .{
2205 .pattern = "SUB <Xd>, <Xn>, <Xm>",
2206 .symbols = .{
2207 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2208 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2209 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2210 },
2211 .encode = .{ .sub, .Xd, .Xn, .{ .register = .Xm } },
2212 },
2213 .{
2214 .pattern = "SUB <Xd>, <Xn>, <Xm>, <shift> #<amount>",
2215 .symbols = .{
2216 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2217 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2218 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2219 .shift = .{ .shift = .{ .allow_ror = false } },
2220 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
2221 },
2222 .encode = .{ .sub, .Xd, .Xn, .{ .shifted_register_explicit = .{
2223 .register = .Xm,
2224 .shift = .shift,
2225 .amount = .amount,
2226 } } },
2227 },
2228 // C6.2.359 SUBG
2229 .{
2230 .requires = .{.mte},
2231 .pattern = "SUBG <Xd|SP>, <Xn|SP>, #<uimm6>, #<uimm4>",
2232 .symbols = .{
2233 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2234 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2235 .uimm6 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 10 }, .multiple_of = 16 } },
2236 .uimm4 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
2237 },
2238 .encode = .{ .subg, .Xd, .Xn, .uimm6, .uimm4 },
2239 },
2240 // C6.2.362 SUBS (extended register)
2241 .{
2242 .pattern = "SUBS <Wd>, <Wn|WSP>, <Wm>",
2243 .symbols = .{
2244 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2245 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2246 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2247 },
2248 .encode = .{ .subs, .Wd, .Wn, .{ .register = .Wm } },
2249 },
2250 .{
2251 .pattern = "SUBS <Wd>, <Wn|WSP>, <Wm>, <extend>",
2252 .symbols = .{
2253 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2254 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2255 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2256 .extend = .{ .extend = .{} },
2257 },
2258 .encode = .{ .subs, .Wd, .Wn, .{ .extended_register_explicit = .{
2259 .register = .Wm,
2260 .option = .extend,
2261 .amount = 0,
2262 } } },
2263 },
2264 .{
2265 .pattern = "SUBS <Wd>, <Wn|WSP>, <Wm>, <extend> #<amount>",
2266 .symbols = .{
2267 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2268 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2269 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2270 .extend = .{ .extend = .{} },
2271 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2272 },
2273 .encode = .{ .subs, .Wd, .Wn, .{ .extended_register_explicit = .{
2274 .register = .Wm,
2275 .option = .extend,
2276 .amount = .amount,
2277 } } },
2278 },
2279 .{
2280 .pattern = "SUBS <Xd>, <Xn|SP>, <Xm>",
2281 .symbols = .{
2282 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2283 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2284 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2285 },
2286 .encode = .{ .subs, .Xd, .Xn, .{ .register = .Xm } },
2287 },
2288 .{
2289 .pattern = "SUBS <Xd>, <Xn|SP>, <Wm>, <extend>",
2290 .symbols = .{
2291 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2292 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2293 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2294 .extend = .{ .extend = .{ .size = .word } },
2295 },
2296 .encode = .{ .subs, .Xd, .Xn, .{ .extended_register_explicit = .{
2297 .register = .Wm,
2298 .option = .extend,
2299 .amount = 0,
2300 } } },
2301 },
2302 .{
2303 .pattern = "SUBS <Xd>, <Xn|SP>, <Wm>, <extend> #<amount>",
2304 .symbols = .{
2305 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2306 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2307 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2308 .extend = .{ .extend = .{ .size = .word } },
2309 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2310 },
2311 .encode = .{ .subs, .Xd, .Xn, .{ .extended_register_explicit = .{
2312 .register = .Wm,
2313 .option = .extend,
2314 .amount = .amount,
2315 } } },
2316 },
2317 .{
2318 .pattern = "SUBS <Xd>, <Xn|SP>, <Xm>, <extend>",
2319 .symbols = .{
2320 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2321 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2322 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2323 .extend = .{ .extend = .{ .size = .doubleword } },
2324 },
2325 .encode = .{ .subs, .Xd, .Xn, .{ .extended_register_explicit = .{
2326 .register = .Xm,
2327 .option = .extend,
2328 .amount = 0,
2329 } } },
2330 },
2331 .{
2332 .pattern = "SUBS <Xd>, <Xn|SP>, <Xm>, <extend> #<amount>",
2333 .symbols = .{
2334 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2335 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2336 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2337 .extend = .{ .extend = .{ .size = .doubleword } },
2338 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 }, .max_valid = 4 } },
2339 },
2340 .encode = .{ .subs, .Xd, .Xn, .{ .extended_register_explicit = .{
2341 .register = .Xm,
2342 .option = .extend,
2343 .amount = .amount,
2344 } } },
2345 },
2346 // C6.2.363 SUBS (immediate)
2347 .{
2348 .pattern = "SUBS <Wd>, <Wn|WSP>, #<imm>",
2349 .symbols = .{
2350 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2351 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2352 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2353 },
2354 .encode = .{ .subs, .Wd, .Wn, .{ .immediate = .imm } },
2355 },
2356 .{
2357 .pattern = "SUBS <Wd>, <Wn|WSP>, #<imm>, LSL #<shift>",
2358 .symbols = .{
2359 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2360 .Wn = .{ .reg = .{ .format = .{ .general = .word }, .allow_sp = true } },
2361 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2362 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
2363 },
2364 .encode = .{ .subs, .Wd, .Wn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
2365 },
2366 .{
2367 .pattern = "SUBS <Xd>, <Xn|SP>, #<imm>",
2368 .symbols = .{
2369 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2370 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2371 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2372 },
2373 .encode = .{ .subs, .Xd, .Xn, .{ .immediate = .imm } },
2374 },
2375 .{
2376 .pattern = "SUBS <Xd>, <Xn|SP>, #<imm>, LSL #<shift>",
2377 .symbols = .{
2378 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2379 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword }, .allow_sp = true } },
2380 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 12 } } },
2381 .shift = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 }, .multiple_of = 12 } },
2382 },
2383 .encode = .{ .subs, .Xd, .Xn, .{ .shifted_immediate = .{ .immediate = .imm, .lsl = .shift } } },
2384 },
2385 // C6.2.364 SUBS (shifted register)
2386 .{
2387 .pattern = "SUBS <Wd>, <Wn>, <Wm>",
2388 .symbols = .{
2389 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2390 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2391 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2392 },
2393 .encode = .{ .subs, .Wd, .Wn, .{ .register = .Wm } },
2394 },
2395 .{
2396 .pattern = "SUBS <Wd>, <Wn>, <Wm>, <shift> #<amount>",
2397 .symbols = .{
2398 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2399 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2400 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2401 .shift = .{ .shift = .{ .allow_ror = false } },
2402 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
2403 },
2404 .encode = .{ .subs, .Wd, .Wn, .{ .shifted_register_explicit = .{
2405 .register = .Wm,
2406 .shift = .shift,
2407 .amount = .amount,
2408 } } },
2409 },
2410 .{
2411 .pattern = "SUBS <Xd>, <Xn>, <Xm>",
2412 .symbols = .{
2413 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2414 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2415 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2416 },
2417 .encode = .{ .subs, .Xd, .Xn, .{ .register = .Xm } },
2418 },
2419 .{
2420 .pattern = "SUBS <Xd>, <Xn>, <Xm>, <shift> #<amount>",
2421 .symbols = .{
2422 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2423 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2424 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2425 .shift = .{ .shift = .{ .allow_ror = false } },
2426 .amount = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
2427 },
2428 .encode = .{ .subs, .Xd, .Xn, .{ .shifted_register_explicit = .{
2429 .register = .Xm,
2430 .shift = .shift,
2431 .amount = .amount,
2432 } } },
2433 },
2434 // C6.2.365 SVC
2435 .{
2436 .pattern = "SVC #<imm>",
2437 .symbols = .{
2438 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
2439 },
2440 .encode = .{ .svc, .imm },
2441 },
2442 // C6.2.376 TCANCEL
2443 .{
2444 .pattern = "TCANCEL #<imm>",
2445 .symbols = .{
2446 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
2447 },
2448 .encode = .{ .tcancel, .imm },
2449 },
2450 // C6.2.385 UBFM
2451 .{
2452 .pattern = "UBFM <Wd>, <Wn>, #<immr>, #<imms>",
2453 .symbols = .{
2454 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2455 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2456 .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
2457 .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 5 } } },
2458 },
2459 .encode = .{ .ubfm, .Wd, .Wn, .{ .N = .word, .immr = .immr, .imms = .imms } },
2460 },
2461 .{
2462 .pattern = "UBFM <Xd>, <Xn>, #<immr>, #<imms>",
2463 .symbols = .{
2464 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2465 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2466 .immr = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
2467 .imms = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 6 } } },
2468 },
2469 .encode = .{ .ubfm, .Xd, .Xn, .{ .N = .doubleword, .immr = .immr, .imms = .imms } },
2470 },
2471 // C6.2.388 UDIV
2472 .{
2473 .pattern = "UDIV <Wd>, <Wn>, <Wm>",
2474 .symbols = .{
2475 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
2476 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2477 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2478 },
2479 .encode = .{ .udiv, .Wd, .Wn, .Wm },
2480 },
2481 .{
2482 .pattern = "UDIV <Xd>, <Xn>, <Xm>",
2483 .symbols = .{
2484 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2485 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2486 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2487 },
2488 .encode = .{ .udiv, .Xd, .Xn, .Xm },
2489 },
2490 // C6.2.387 UDF
2491 .{
2492 .pattern = "UDF #<imm>",
2493 .symbols = .{
2494 .imm = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 16 } } },
2495 },
2496 .encode = .{ .udf, .imm },
2497 },
2498 // C6.2.389 UMADDL
2499 .{
2500 .pattern = "UMADDL <Xd>, <Wn>, <Wm>, <Xa>",
2501 .symbols = .{
2502 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2503 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2504 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2505 .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2506 },
2507 .encode = .{ .umaddl, .Xd, .Wn, .Wm, .Xa },
2508 },
2509 // C6.2.390 UMNEGL
2510 .{
2511 .pattern = "UMNEGL <Xd>, <Wn>, <Wm>",
2512 .symbols = .{
2513 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2514 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2515 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2516 },
2517 .encode = .{ .umsubl, .Xd, .Wn, .Wm, .xzr },
2518 },
2519 // C6.2.391 UMSUBL
2520 .{
2521 .pattern = "UMSUBL <Xd>, <Wn>, <Wm>, <Xa>",
2522 .symbols = .{
2523 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2524 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2525 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2526 .Xa = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2527 },
2528 .encode = .{ .umsubl, .Xd, .Wn, .Wm, .Xa },
2529 },
2530 // C6.2.292 UMULH
2531 .{
2532 .pattern = "UMULH <Xd>, <Xn>, <Xm>",
2533 .symbols = .{
2534 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2535 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2536 .Xm = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2537 },
2538 .encode = .{ .umulh, .Xd, .Xn, .Xm },
2539 },
2540 // C6.2.393 UMULL
2541 .{
2542 .pattern = "UMULL <Xd>, <Wn>, <Wm>",
2543 .symbols = .{
2544 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2545 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2546 .Wm = .{ .reg = .{ .format = .{ .general = .word } } },
2547 },
2548 .encode = .{ .umaddl, .Xd, .Wn, .Wm, .xzr },
2549 },
2550 // C6.2.396 WFE
2551 .{
2552 .pattern = "WFE",
2553 .symbols = .{},
2554 .encode = .{.wfe},
2555 },
2556 // C6.2.398 WFI
2557 .{
2558 .pattern = "WFI",
2559 .symbols = .{},
2560 .encode = .{.wfi},
2561 },
2562 // C6.2.400 XAFLAG
2563 .{
2564 .requires = .{.altnzcv},
2565 .pattern = "XAFLAG",
2566 .symbols = .{},
2567 .encode = .{.xaflag},
2568 },
2569 // C6.2.402 YIELD
2570 .{
2571 .pattern = "YIELD",
2572 .symbols = .{},
2573 .encode = .{.yield},
2574 },
2575
2576 // C7.2.1 ABS
2577 .{
2578 .pattern = "ABS <Vd>, <Vn>",
2579 .symbols = .{
2580 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2581 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2582 },
2583 .encode = .{ .abs, .Vd, .Vn },
2584 },
2585 .{
2586 .pattern = "ABS <Vd>.<T>, <Vn>.<T>",
2587 .symbols = .{
2588 .Vd = .{ .reg_alias = .vector },
2589 .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2590 .Vn = .{ .reg_alias = .vector },
2591 },
2592 .encode = .{
2593 .abs,
2594 .{ .alias = .Vd, .format = .{ .vector = .T } },
2595 .{ .alias = .Vn, .format = .{ .vector = .T } },
2596 },
2597 },
2598 // C7.2.28 CMEQ (zero)
2599 .{
2600 .pattern = "CMEQ <Vd>, <Vn>, #<0>",
2601 .symbols = .{
2602 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2603 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2604 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2605 },
2606 .encode = .{ .cmeq, .Vd, .Vn, .zero },
2607 },
2608 .{
2609 .pattern = "CMEQ <Vd>.<T>, <Vn>.<T>, #<0>",
2610 .symbols = .{
2611 .Vd = .{ .reg_alias = .vector },
2612 .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2613 .Vn = .{ .reg_alias = .vector },
2614 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2615 },
2616 .encode = .{
2617 .cmeq,
2618 .{ .alias = .Vd, .format = .{ .vector = .T } },
2619 .{ .alias = .Vn, .format = .{ .vector = .T } },
2620 .zero,
2621 },
2622 },
2623 // C7.2.30 CMGE (zero)
2624 .{
2625 .pattern = "CMGE <Vd>, <Vn>, #<0>",
2626 .symbols = .{
2627 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2628 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2629 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2630 },
2631 .encode = .{ .cmge, .Vd, .Vn, .zero },
2632 },
2633 .{
2634 .pattern = "CMGE <Vd>.<T>, <Vn>.<T>, #<0>",
2635 .symbols = .{
2636 .Vd = .{ .reg_alias = .vector },
2637 .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2638 .Vn = .{ .reg_alias = .vector },
2639 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2640 },
2641 .encode = .{
2642 .cmge,
2643 .{ .alias = .Vd, .format = .{ .vector = .T } },
2644 .{ .alias = .Vn, .format = .{ .vector = .T } },
2645 .zero,
2646 },
2647 },
2648 // C7.2.32 CMGT (zero)
2649 .{
2650 .pattern = "CMGT <Vd>, <Vn>, #<0>",
2651 .symbols = .{
2652 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2653 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2654 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2655 },
2656 .encode = .{ .cmgt, .Vd, .Vn, .zero },
2657 },
2658 .{
2659 .pattern = "CMGT <Vd>.<T>, <Vn>.<T>, #<0>",
2660 .symbols = .{
2661 .Vd = .{ .reg_alias = .vector },
2662 .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2663 .Vn = .{ .reg_alias = .vector },
2664 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2665 },
2666 .encode = .{
2667 .cmgt,
2668 .{ .alias = .Vd, .format = .{ .vector = .T } },
2669 .{ .alias = .Vn, .format = .{ .vector = .T } },
2670 .zero,
2671 },
2672 },
2673 // C7.2.35 CMLE (zero)
2674 .{
2675 .pattern = "CMLE <Vd>, <Vn>, #<0>",
2676 .symbols = .{
2677 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2678 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2679 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2680 },
2681 .encode = .{ .cmle, .Vd, .Vn, .zero },
2682 },
2683 .{
2684 .pattern = "CMLE <Vd>.<T>, <Vn>.<T>, #<0>",
2685 .symbols = .{
2686 .Vd = .{ .reg_alias = .vector },
2687 .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2688 .Vn = .{ .reg_alias = .vector },
2689 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2690 },
2691 .encode = .{
2692 .cmle,
2693 .{ .alias = .Vd, .format = .{ .vector = .T } },
2694 .{ .alias = .Vn, .format = .{ .vector = .T } },
2695 .zero,
2696 },
2697 },
2698 // C7.2.36 CMLT (zero)
2699 .{
2700 .pattern = "CMLT <Vd>, <Vn>, #<0>",
2701 .symbols = .{
2702 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2703 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2704 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2705 },
2706 .encode = .{ .cmlt, .Vd, .Vn, .zero },
2707 },
2708 .{
2709 .pattern = "CMLT <Vd>.<T>, <Vn>.<T>, #<0>",
2710 .symbols = .{
2711 .Vd = .{ .reg_alias = .vector },
2712 .T = .{ .arrangement = .{ .min_valid_len = 2 } },
2713 .Vn = .{ .reg_alias = .vector },
2714 .@"0" = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 0 } } },
2715 },
2716 .encode = .{
2717 .cmlt,
2718 .{ .alias = .Vd, .format = .{ .vector = .T } },
2719 .{ .alias = .Vn, .format = .{ .vector = .T } },
2720 .zero,
2721 },
2722 },
2723 // C7.2.38 CNT
2724 .{
2725 .pattern = "CNT <Vd>.<T>, <Vn>.<T>",
2726 .symbols = .{
2727 .Vd = .{ .reg_alias = .vector },
2728 .T = .{ .arrangement = .{ .elem_size = .byte } },
2729 .Vn = .{ .reg_alias = .vector },
2730 },
2731 .encode = .{
2732 .cnt,
2733 .{ .alias = .Vd, .format = .{ .vector = .T } },
2734 .{ .alias = .Vn, .format = .{ .vector = .T } },
2735 },
2736 },
2737 // C7.2.39 DUP (element)
2738 .{
2739 .pattern = "DUP <Vd>, <Vn>.B[<index>]",
2740 .symbols = .{
2741 .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
2742 .Vn = .{ .reg_alias = .vector },
2743 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
2744 },
2745 .encode = .{
2746 .dup,
2747 .Vd,
2748 .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
2749 },
2750 },
2751 .{
2752 .pattern = "DUP <Vd>, <Vn>.H[<index>]",
2753 .symbols = .{
2754 .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
2755 .Vn = .{ .reg_alias = .vector },
2756 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
2757 },
2758 .encode = .{
2759 .dup,
2760 .Vd,
2761 .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
2762 },
2763 },
2764 .{
2765 .pattern = "DUP <Vd>, <Vn>.S[<index>]",
2766 .symbols = .{
2767 .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
2768 .Vn = .{ .reg_alias = .vector },
2769 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
2770 },
2771 .encode = .{
2772 .dup,
2773 .Vd,
2774 .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
2775 },
2776 },
2777 .{
2778 .pattern = "DUP <Vd>, <Vn>.D[<index>]",
2779 .symbols = .{
2780 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2781 .Vn = .{ .reg_alias = .vector },
2782 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
2783 },
2784 .encode = .{
2785 .dup,
2786 .Vd,
2787 .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
2788 },
2789 },
2790 .{
2791 .pattern = "DUP <Vd>.<T>, <Vn>.B[<index>]",
2792 .symbols = .{
2793 .Vd = .{ .reg_alias = .vector },
2794 .T = .{ .arrangement = .{ .elem_size = .byte } },
2795 .Vn = .{ .reg_alias = .vector },
2796 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
2797 },
2798 .encode = .{
2799 .dup,
2800 .{ .alias = .Vd, .format = .{ .vector = .T } },
2801 .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
2802 },
2803 },
2804 .{
2805 .pattern = "DUP <Vd>.<T>, <Vn>.H[<index>]",
2806 .symbols = .{
2807 .Vd = .{ .reg_alias = .vector },
2808 .T = .{ .arrangement = .{ .elem_size = .half } },
2809 .Vn = .{ .reg_alias = .vector },
2810 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
2811 },
2812 .encode = .{
2813 .dup,
2814 .{ .alias = .Vd, .format = .{ .vector = .T } },
2815 .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
2816 },
2817 },
2818 .{
2819 .pattern = "DUP <Vd>.<T>, <Vn>.S[<index>]",
2820 .symbols = .{
2821 .Vd = .{ .reg_alias = .vector },
2822 .T = .{ .arrangement = .{ .elem_size = .single } },
2823 .Vn = .{ .reg_alias = .vector },
2824 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
2825 },
2826 .encode = .{
2827 .dup,
2828 .{ .alias = .Vd, .format = .{ .vector = .T } },
2829 .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
2830 },
2831 },
2832 .{
2833 .pattern = "DUP <Vd>.2D, <Vn>.D[<index>]",
2834 .symbols = .{
2835 .Vd = .{ .reg_alias = .vector },
2836 .Vn = .{ .reg_alias = .vector },
2837 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
2838 },
2839 .encode = .{
2840 .dup,
2841 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
2842 .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
2843 },
2844 },
2845 // C7.2.40 DUP (general)
2846 .{
2847 .pattern = "DUP <Vd>.<T>, <Wn>",
2848 .symbols = .{
2849 .Vd = .{ .reg_alias = .vector },
2850 .T = .{ .arrangement = .{ .allow_double = false } },
2851 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
2852 },
2853 .encode = .{ .dup, .{ .alias = .Vd, .format = .{ .vector = .T } }, .Wn },
2854 },
2855 .{
2856 .pattern = "DUP <Vd>.2D, <Xn>",
2857 .symbols = .{
2858 .Vd = .{ .reg_alias = .vector },
2859 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
2860 },
2861 .encode = .{ .dup, .{ .alias = .Vd, .format = .{ .vector = .@"2d" } }, .Xn },
2862 },
2863 // C7.2.57 FCMEQ (zero)
2864 .{
2865 .requires = .{.fullfp16},
2866 .pattern = "FCMEQ <Hd>, <Hn>, #<0.0>",
2867 .symbols = .{
2868 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
2869 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
2870 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2871 },
2872 .encode = .{ .fcmeq, .Hd, .Hn, .zero },
2873 },
2874 .{
2875 .pattern = "FCMEQ <Sd>, <Sn>, #<0.0>",
2876 .symbols = .{
2877 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
2878 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
2879 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2880 },
2881 .encode = .{ .fcmeq, .Sd, .Sn, .zero },
2882 },
2883 .{
2884 .pattern = "FCMEQ <Dd>, <Dn>, #<0.0>",
2885 .symbols = .{
2886 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2887 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2888 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2889 },
2890 .encode = .{ .fcmeq, .Dd, .Dn, .zero },
2891 },
2892 .{
2893 .requires = .{.fullfp16},
2894 .pattern = "FCMEQ <Vd>.<T>, <Vn>.<T>, #<0.0>",
2895 .symbols = .{
2896 .Vd = .{ .reg_alias = .vector },
2897 .T = .{ .arrangement = .{ .elem_size = .half } },
2898 .Vn = .{ .reg_alias = .vector },
2899 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2900 },
2901 .encode = .{
2902 .fcmeq,
2903 .{ .alias = .Vd, .format = .{ .vector = .T } },
2904 .{ .alias = .Vn, .format = .{ .vector = .T } },
2905 .zero,
2906 },
2907 },
2908 .{
2909 .pattern = "FCMEQ <Vd>.<T>, <Vn>.<T>, #<0.0>",
2910 .symbols = .{
2911 .Vd = .{ .reg_alias = .vector },
2912 .T = .{ .arrangement = .{ .elem_size = .single } },
2913 .Vn = .{ .reg_alias = .vector },
2914 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2915 },
2916 .encode = .{
2917 .fcmeq,
2918 .{ .alias = .Vd, .format = .{ .vector = .T } },
2919 .{ .alias = .Vn, .format = .{ .vector = .T } },
2920 .zero,
2921 },
2922 },
2923 .{
2924 .pattern = "FCMEQ <Vd>.2D, <Vn>.2D, #<0.0>",
2925 .symbols = .{
2926 .Vd = .{ .reg_alias = .vector },
2927 .Vn = .{ .reg_alias = .vector },
2928 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2929 },
2930 .encode = .{
2931 .fcmeq,
2932 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
2933 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
2934 .zero,
2935 },
2936 },
2937 // C7.2.59 FCMGE (zero)
2938 .{
2939 .requires = .{.fullfp16},
2940 .pattern = "FCMGE <Hd>, <Hn>, #<0.0>",
2941 .symbols = .{
2942 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
2943 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
2944 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2945 },
2946 .encode = .{ .fcmge, .Hd, .Hn, .zero },
2947 },
2948 .{
2949 .pattern = "FCMGE <Sd>, <Sn>, #<0.0>",
2950 .symbols = .{
2951 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
2952 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
2953 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2954 },
2955 .encode = .{ .fcmge, .Sd, .Sn, .zero },
2956 },
2957 .{
2958 .pattern = "FCMGE <Dd>, <Dn>, #<0.0>",
2959 .symbols = .{
2960 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
2961 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
2962 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2963 },
2964 .encode = .{ .fcmge, .Dd, .Dn, .zero },
2965 },
2966 .{
2967 .requires = .{.fullfp16},
2968 .pattern = "FCMGE <Vd>.<T>, <Vn>.<T>, #<0.0>",
2969 .symbols = .{
2970 .Vd = .{ .reg_alias = .vector },
2971 .T = .{ .arrangement = .{ .elem_size = .half } },
2972 .Vn = .{ .reg_alias = .vector },
2973 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2974 },
2975 .encode = .{
2976 .fcmge,
2977 .{ .alias = .Vd, .format = .{ .vector = .T } },
2978 .{ .alias = .Vn, .format = .{ .vector = .T } },
2979 .zero,
2980 },
2981 },
2982 .{
2983 .pattern = "FCMGE <Vd>.<T>, <Vn>.<T>, #<0.0>",
2984 .symbols = .{
2985 .Vd = .{ .reg_alias = .vector },
2986 .T = .{ .arrangement = .{ .elem_size = .single } },
2987 .Vn = .{ .reg_alias = .vector },
2988 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
2989 },
2990 .encode = .{
2991 .fcmge,
2992 .{ .alias = .Vd, .format = .{ .vector = .T } },
2993 .{ .alias = .Vn, .format = .{ .vector = .T } },
2994 .zero,
2995 },
2996 },
2997 .{
2998 .pattern = "FCMGE <Vd>.2D, <Vn>.2D, #<0.0>",
2999 .symbols = .{
3000 .Vd = .{ .reg_alias = .vector },
3001 .Vn = .{ .reg_alias = .vector },
3002 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3003 },
3004 .encode = .{
3005 .fcmge,
3006 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3007 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3008 .zero,
3009 },
3010 },
3011 // C7.2.61 FCMGT (zero)
3012 .{
3013 .requires = .{.fullfp16},
3014 .pattern = "FCMGT <Hd>, <Hn>, #<0.0>",
3015 .symbols = .{
3016 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3017 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3018 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3019 },
3020 .encode = .{ .fcmgt, .Hd, .Hn, .zero },
3021 },
3022 .{
3023 .pattern = "FCMGT <Sd>, <Sn>, #<0.0>",
3024 .symbols = .{
3025 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3026 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3027 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3028 },
3029 .encode = .{ .fcmgt, .Sd, .Sn, .zero },
3030 },
3031 .{
3032 .pattern = "FCMGT <Dd>, <Dn>, #<0.0>",
3033 .symbols = .{
3034 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3035 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3036 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3037 },
3038 .encode = .{ .fcmgt, .Dd, .Dn, .zero },
3039 },
3040 .{
3041 .requires = .{.fullfp16},
3042 .pattern = "FCMGT <Vd>.<T>, <Vn>.<T>, #<0.0>",
3043 .symbols = .{
3044 .Vd = .{ .reg_alias = .vector },
3045 .T = .{ .arrangement = .{ .elem_size = .half } },
3046 .Vn = .{ .reg_alias = .vector },
3047 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3048 },
3049 .encode = .{
3050 .fcmgt,
3051 .{ .alias = .Vd, .format = .{ .vector = .T } },
3052 .{ .alias = .Vn, .format = .{ .vector = .T } },
3053 .zero,
3054 },
3055 },
3056 .{
3057 .pattern = "FCMGT <Vd>.<T>, <Vn>.<T>, #<0.0>",
3058 .symbols = .{
3059 .Vd = .{ .reg_alias = .vector },
3060 .T = .{ .arrangement = .{ .elem_size = .single } },
3061 .Vn = .{ .reg_alias = .vector },
3062 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3063 },
3064 .encode = .{
3065 .fcmgt,
3066 .{ .alias = .Vd, .format = .{ .vector = .T } },
3067 .{ .alias = .Vn, .format = .{ .vector = .T } },
3068 .zero,
3069 },
3070 },
3071 .{
3072 .pattern = "FCMGT <Vd>.2D, <Vn>.2D, #<0.0>",
3073 .symbols = .{
3074 .Vd = .{ .reg_alias = .vector },
3075 .Vn = .{ .reg_alias = .vector },
3076 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3077 },
3078 .encode = .{
3079 .fcmgt,
3080 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3081 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3082 .zero,
3083 },
3084 },
3085 // C7.2.64 FCMLE (zero)
3086 .{
3087 .requires = .{.fullfp16},
3088 .pattern = "FCMLE <Hd>, <Hn>, #<0.0>",
3089 .symbols = .{
3090 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3091 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3092 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3093 },
3094 .encode = .{ .fcmle, .Hd, .Hn, .zero },
3095 },
3096 .{
3097 .pattern = "FCMLE <Sd>, <Sn>, #<0.0>",
3098 .symbols = .{
3099 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3100 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3101 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3102 },
3103 .encode = .{ .fcmle, .Sd, .Sn, .zero },
3104 },
3105 .{
3106 .pattern = "FCMLE <Dd>, <Dn>, #<0.0>",
3107 .symbols = .{
3108 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3109 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3110 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3111 },
3112 .encode = .{ .fcmle, .Dd, .Dn, .zero },
3113 },
3114 .{
3115 .requires = .{.fullfp16},
3116 .pattern = "FCMLE <Vd>.<T>, <Vn>.<T>, #<0.0>",
3117 .symbols = .{
3118 .Vd = .{ .reg_alias = .vector },
3119 .T = .{ .arrangement = .{ .elem_size = .half } },
3120 .Vn = .{ .reg_alias = .vector },
3121 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3122 },
3123 .encode = .{
3124 .fcmle,
3125 .{ .alias = .Vd, .format = .{ .vector = .T } },
3126 .{ .alias = .Vn, .format = .{ .vector = .T } },
3127 .zero,
3128 },
3129 },
3130 .{
3131 .pattern = "FCMLE <Vd>.<T>, <Vn>.<T>, #<0.0>",
3132 .symbols = .{
3133 .Vd = .{ .reg_alias = .vector },
3134 .T = .{ .arrangement = .{ .elem_size = .single } },
3135 .Vn = .{ .reg_alias = .vector },
3136 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3137 },
3138 .encode = .{
3139 .fcmle,
3140 .{ .alias = .Vd, .format = .{ .vector = .T } },
3141 .{ .alias = .Vn, .format = .{ .vector = .T } },
3142 .zero,
3143 },
3144 },
3145 .{
3146 .pattern = "FCMLE <Vd>.2D, <Vn>.2D, #<0.0>",
3147 .symbols = .{
3148 .Vd = .{ .reg_alias = .vector },
3149 .Vn = .{ .reg_alias = .vector },
3150 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3151 },
3152 .encode = .{
3153 .fcmle,
3154 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3155 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3156 .zero,
3157 },
3158 },
3159 // C7.2.65 FCMLT (zero)
3160 .{
3161 .requires = .{.fullfp16},
3162 .pattern = "FCMLT <Hd>, <Hn>, #<0.0>",
3163 .symbols = .{
3164 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3165 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3166 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3167 },
3168 .encode = .{ .fcmlt, .Hd, .Hn, .zero },
3169 },
3170 .{
3171 .pattern = "FCMLT <Sd>, <Sn>, #<0.0>",
3172 .symbols = .{
3173 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3174 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3175 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3176 },
3177 .encode = .{ .fcmlt, .Sd, .Sn, .zero },
3178 },
3179 .{
3180 .pattern = "FCMLT <Dd>, <Dn>, #<0.0>",
3181 .symbols = .{
3182 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3183 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3184 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3185 },
3186 .encode = .{ .fcmlt, .Dd, .Dn, .zero },
3187 },
3188 .{
3189 .requires = .{.fullfp16},
3190 .pattern = "FCMLT <Vd>.<T>, <Vn>.<T>, #<0.0>",
3191 .symbols = .{
3192 .Vd = .{ .reg_alias = .vector },
3193 .T = .{ .arrangement = .{ .elem_size = .half } },
3194 .Vn = .{ .reg_alias = .vector },
3195 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3196 },
3197 .encode = .{
3198 .fcmlt,
3199 .{ .alias = .Vd, .format = .{ .vector = .T } },
3200 .{ .alias = .Vn, .format = .{ .vector = .T } },
3201 .zero,
3202 },
3203 },
3204 .{
3205 .pattern = "FCMLT <Vd>.<T>, <Vn>.<T>, #<0.0>",
3206 .symbols = .{
3207 .Vd = .{ .reg_alias = .vector },
3208 .T = .{ .arrangement = .{ .elem_size = .single } },
3209 .Vn = .{ .reg_alias = .vector },
3210 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3211 },
3212 .encode = .{
3213 .fcmlt,
3214 .{ .alias = .Vd, .format = .{ .vector = .T } },
3215 .{ .alias = .Vn, .format = .{ .vector = .T } },
3216 .zero,
3217 },
3218 },
3219 .{
3220 .pattern = "FCMLT <Vd>.2D, <Vn>.2D, #<0.0>",
3221 .symbols = .{
3222 .Vd = .{ .reg_alias = .vector },
3223 .Vn = .{ .reg_alias = .vector },
3224 .@"0.0" = .{ .fimm = .{ .only_valid = 0.0 } },
3225 },
3226 .encode = .{
3227 .fcmlt,
3228 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3229 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3230 .zero,
3231 },
3232 },
3233 // C7.2.70 FCVTAS (vector)
3234 .{
3235 .requires = .{.fullfp16},
3236 .pattern = "FCVTAS <Hd>, <Hn>",
3237 .symbols = .{
3238 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3239 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3240 },
3241 .encode = .{ .fcvtas, .Hd, .Hn },
3242 },
3243 .{
3244 .pattern = "FCVTAS <Sd>, <Sn>",
3245 .symbols = .{
3246 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3247 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3248 },
3249 .encode = .{ .fcvtas, .Sd, .Sn },
3250 },
3251 .{
3252 .pattern = "FCVTAS <Dd>, <Dn>",
3253 .symbols = .{
3254 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3255 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3256 },
3257 .encode = .{ .fcvtas, .Dd, .Dn },
3258 },
3259 .{
3260 .requires = .{.fullfp16},
3261 .pattern = "FCVTAS <Vd>.<T>, <Vn>.<T>",
3262 .symbols = .{
3263 .Vd = .{ .reg_alias = .vector },
3264 .T = .{ .arrangement = .{ .elem_size = .half } },
3265 .Vn = .{ .reg_alias = .vector },
3266 },
3267 .encode = .{
3268 .fcvtas,
3269 .{ .alias = .Vd, .format = .{ .vector = .T } },
3270 .{ .alias = .Vn, .format = .{ .vector = .T } },
3271 },
3272 },
3273 .{
3274 .pattern = "FCVTAS <Vd>.<T>, <Vn>.<T>",
3275 .symbols = .{
3276 .Vd = .{ .reg_alias = .vector },
3277 .T = .{ .arrangement = .{ .elem_size = .single } },
3278 .Vn = .{ .reg_alias = .vector },
3279 },
3280 .encode = .{
3281 .fcvtas,
3282 .{ .alias = .Vd, .format = .{ .vector = .T } },
3283 .{ .alias = .Vn, .format = .{ .vector = .T } },
3284 },
3285 },
3286 .{
3287 .pattern = "FCVTAS <Vd>.2D, <Vn>.2D",
3288 .symbols = .{
3289 .Vd = .{ .reg_alias = .vector },
3290 .Vn = .{ .reg_alias = .vector },
3291 },
3292 .encode = .{
3293 .fcvtas,
3294 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3295 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3296 },
3297 },
3298 // C7.2.71 FCVTAS (scalar)
3299 .{
3300 .requires = .{.fullfp16},
3301 .pattern = "FCVTAS <Wd>, <Hn>",
3302 .symbols = .{
3303 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3304 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3305 },
3306 .encode = .{ .fcvtas, .Wd, .Hn },
3307 },
3308 .{
3309 .requires = .{.fullfp16},
3310 .pattern = "FCVTAS <Xd>, <Hn>",
3311 .symbols = .{
3312 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3313 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3314 },
3315 .encode = .{ .fcvtas, .Xd, .Hn },
3316 },
3317 .{
3318 .pattern = "FCVTAS <Wd>, <Sn>",
3319 .symbols = .{
3320 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3321 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3322 },
3323 .encode = .{ .fcvtas, .Wd, .Sn },
3324 },
3325 .{
3326 .pattern = "FCVTAS <Xd>, <Sn>",
3327 .symbols = .{
3328 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3329 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3330 },
3331 .encode = .{ .fcvtas, .Xd, .Sn },
3332 },
3333 .{
3334 .pattern = "FCVTAS <Wd>, <Dn>",
3335 .symbols = .{
3336 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3337 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3338 },
3339 .encode = .{ .fcvtas, .Wd, .Dn },
3340 },
3341 .{
3342 .pattern = "FCVTAS <Xd>, <Dn>",
3343 .symbols = .{
3344 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3345 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3346 },
3347 .encode = .{ .fcvtas, .Xd, .Dn },
3348 },
3349 // C7.2.72 FCVTAU (vector)
3350 .{
3351 .requires = .{.fullfp16},
3352 .pattern = "FCVTAU <Hd>, <Hn>",
3353 .symbols = .{
3354 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3355 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3356 },
3357 .encode = .{ .fcvtau, .Hd, .Hn },
3358 },
3359 .{
3360 .pattern = "FCVTAU <Sd>, <Sn>",
3361 .symbols = .{
3362 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3363 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3364 },
3365 .encode = .{ .fcvtau, .Sd, .Sn },
3366 },
3367 .{
3368 .pattern = "FCVTAU <Dd>, <Dn>",
3369 .symbols = .{
3370 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3371 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3372 },
3373 .encode = .{ .fcvtau, .Dd, .Dn },
3374 },
3375 .{
3376 .requires = .{.fullfp16},
3377 .pattern = "FCVTAU <Vd>.<T>, <Vn>.<T>",
3378 .symbols = .{
3379 .Vd = .{ .reg_alias = .vector },
3380 .T = .{ .arrangement = .{ .elem_size = .half } },
3381 .Vn = .{ .reg_alias = .vector },
3382 },
3383 .encode = .{
3384 .fcvtau,
3385 .{ .alias = .Vd, .format = .{ .vector = .T } },
3386 .{ .alias = .Vn, .format = .{ .vector = .T } },
3387 },
3388 },
3389 .{
3390 .pattern = "FCVTAU <Vd>.<T>, <Vn>.<T>",
3391 .symbols = .{
3392 .Vd = .{ .reg_alias = .vector },
3393 .T = .{ .arrangement = .{ .elem_size = .single } },
3394 .Vn = .{ .reg_alias = .vector },
3395 },
3396 .encode = .{
3397 .fcvtau,
3398 .{ .alias = .Vd, .format = .{ .vector = .T } },
3399 .{ .alias = .Vn, .format = .{ .vector = .T } },
3400 },
3401 },
3402 .{
3403 .pattern = "FCVTAU <Vd>.2D, <Vn>.2D",
3404 .symbols = .{
3405 .Vd = .{ .reg_alias = .vector },
3406 .Vn = .{ .reg_alias = .vector },
3407 },
3408 .encode = .{
3409 .fcvtau,
3410 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3411 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3412 },
3413 },
3414 // C7.2.73 FCVTAU (scalar)
3415 .{
3416 .requires = .{.fullfp16},
3417 .pattern = "FCVTAU <Wd>, <Hn>",
3418 .symbols = .{
3419 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3420 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3421 },
3422 .encode = .{ .fcvtau, .Wd, .Hn },
3423 },
3424 .{
3425 .requires = .{.fullfp16},
3426 .pattern = "FCVTAU <Xd>, <Hn>",
3427 .symbols = .{
3428 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3429 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3430 },
3431 .encode = .{ .fcvtau, .Xd, .Hn },
3432 },
3433 .{
3434 .pattern = "FCVTAU <Wd>, <Sn>",
3435 .symbols = .{
3436 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3437 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3438 },
3439 .encode = .{ .fcvtau, .Wd, .Sn },
3440 },
3441 .{
3442 .pattern = "FCVTAU <Xd>, <Sn>",
3443 .symbols = .{
3444 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3445 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3446 },
3447 .encode = .{ .fcvtau, .Xd, .Sn },
3448 },
3449 .{
3450 .pattern = "FCVTAU <Wd>, <Dn>",
3451 .symbols = .{
3452 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3453 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3454 },
3455 .encode = .{ .fcvtau, .Wd, .Dn },
3456 },
3457 .{
3458 .pattern = "FCVTAU <Xd>, <Dn>",
3459 .symbols = .{
3460 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3461 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3462 },
3463 .encode = .{ .fcvtau, .Xd, .Dn },
3464 },
3465 // C7.2.75 FCVTMS (vector)
3466 .{
3467 .requires = .{.fullfp16},
3468 .pattern = "FCVTMS <Hd>, <Hn>",
3469 .symbols = .{
3470 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3471 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3472 },
3473 .encode = .{ .fcvtms, .Hd, .Hn },
3474 },
3475 .{
3476 .pattern = "FCVTMS <Sd>, <Sn>",
3477 .symbols = .{
3478 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3479 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3480 },
3481 .encode = .{ .fcvtms, .Sd, .Sn },
3482 },
3483 .{
3484 .pattern = "FCVTMS <Dd>, <Dn>",
3485 .symbols = .{
3486 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3487 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3488 },
3489 .encode = .{ .fcvtms, .Dd, .Dn },
3490 },
3491 .{
3492 .requires = .{.fullfp16},
3493 .pattern = "FCVTMS <Vd>.<T>, <Vn>.<T>",
3494 .symbols = .{
3495 .Vd = .{ .reg_alias = .vector },
3496 .T = .{ .arrangement = .{ .elem_size = .half } },
3497 .Vn = .{ .reg_alias = .vector },
3498 },
3499 .encode = .{
3500 .fcvtms,
3501 .{ .alias = .Vd, .format = .{ .vector = .T } },
3502 .{ .alias = .Vn, .format = .{ .vector = .T } },
3503 },
3504 },
3505 .{
3506 .pattern = "FCVTMS <Vd>.<T>, <Vn>.<T>",
3507 .symbols = .{
3508 .Vd = .{ .reg_alias = .vector },
3509 .T = .{ .arrangement = .{ .elem_size = .single } },
3510 .Vn = .{ .reg_alias = .vector },
3511 },
3512 .encode = .{
3513 .fcvtms,
3514 .{ .alias = .Vd, .format = .{ .vector = .T } },
3515 .{ .alias = .Vn, .format = .{ .vector = .T } },
3516 },
3517 },
3518 .{
3519 .pattern = "FCVTMS <Vd>.2D, <Vn>.2D",
3520 .symbols = .{
3521 .Vd = .{ .reg_alias = .vector },
3522 .Vn = .{ .reg_alias = .vector },
3523 },
3524 .encode = .{
3525 .fcvtms,
3526 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3527 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3528 },
3529 },
3530 // C7.2.76 FCVTMS (scalar)
3531 .{
3532 .requires = .{.fullfp16},
3533 .pattern = "FCVTMS <Wd>, <Hn>",
3534 .symbols = .{
3535 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3536 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3537 },
3538 .encode = .{ .fcvtms, .Wd, .Hn },
3539 },
3540 .{
3541 .requires = .{.fullfp16},
3542 .pattern = "FCVTMS <Xd>, <Hn>",
3543 .symbols = .{
3544 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3545 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3546 },
3547 .encode = .{ .fcvtms, .Xd, .Hn },
3548 },
3549 .{
3550 .pattern = "FCVTMS <Wd>, <Sn>",
3551 .symbols = .{
3552 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3553 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3554 },
3555 .encode = .{ .fcvtms, .Wd, .Sn },
3556 },
3557 .{
3558 .pattern = "FCVTMS <Xd>, <Sn>",
3559 .symbols = .{
3560 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3561 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3562 },
3563 .encode = .{ .fcvtms, .Xd, .Sn },
3564 },
3565 .{
3566 .pattern = "FCVTMS <Wd>, <Dn>",
3567 .symbols = .{
3568 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3569 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3570 },
3571 .encode = .{ .fcvtms, .Wd, .Dn },
3572 },
3573 .{
3574 .pattern = "FCVTMS <Xd>, <Dn>",
3575 .symbols = .{
3576 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3577 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3578 },
3579 .encode = .{ .fcvtms, .Xd, .Dn },
3580 },
3581 // C7.2.77 FCVTMU (vector)
3582 .{
3583 .requires = .{.fullfp16},
3584 .pattern = "FCVTMU <Hd>, <Hn>",
3585 .symbols = .{
3586 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3587 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3588 },
3589 .encode = .{ .fcvtmu, .Hd, .Hn },
3590 },
3591 .{
3592 .pattern = "FCVTMU <Sd>, <Sn>",
3593 .symbols = .{
3594 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3595 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3596 },
3597 .encode = .{ .fcvtmu, .Sd, .Sn },
3598 },
3599 .{
3600 .pattern = "FCVTMU <Dd>, <Dn>",
3601 .symbols = .{
3602 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3603 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3604 },
3605 .encode = .{ .fcvtmu, .Dd, .Dn },
3606 },
3607 .{
3608 .requires = .{.fullfp16},
3609 .pattern = "FCVTMU <Vd>.<T>, <Vn>.<T>",
3610 .symbols = .{
3611 .Vd = .{ .reg_alias = .vector },
3612 .T = .{ .arrangement = .{ .elem_size = .half } },
3613 .Vn = .{ .reg_alias = .vector },
3614 },
3615 .encode = .{
3616 .fcvtmu,
3617 .{ .alias = .Vd, .format = .{ .vector = .T } },
3618 .{ .alias = .Vn, .format = .{ .vector = .T } },
3619 },
3620 },
3621 .{
3622 .pattern = "FCVTMU <Vd>.<T>, <Vn>.<T>",
3623 .symbols = .{
3624 .Vd = .{ .reg_alias = .vector },
3625 .T = .{ .arrangement = .{ .elem_size = .single } },
3626 .Vn = .{ .reg_alias = .vector },
3627 },
3628 .encode = .{
3629 .fcvtmu,
3630 .{ .alias = .Vd, .format = .{ .vector = .T } },
3631 .{ .alias = .Vn, .format = .{ .vector = .T } },
3632 },
3633 },
3634 .{
3635 .pattern = "FCVTMU <Vd>.2D, <Vn>.2D",
3636 .symbols = .{
3637 .Vd = .{ .reg_alias = .vector },
3638 .Vn = .{ .reg_alias = .vector },
3639 },
3640 .encode = .{
3641 .fcvtmu,
3642 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3643 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3644 },
3645 },
3646 // C7.2.78 FCVTMU (scalar)
3647 .{
3648 .requires = .{.fullfp16},
3649 .pattern = "FCVTMU <Wd>, <Hn>",
3650 .symbols = .{
3651 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3652 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3653 },
3654 .encode = .{ .fcvtmu, .Wd, .Hn },
3655 },
3656 .{
3657 .requires = .{.fullfp16},
3658 .pattern = "FCVTMU <Xd>, <Hn>",
3659 .symbols = .{
3660 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3661 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3662 },
3663 .encode = .{ .fcvtmu, .Xd, .Hn },
3664 },
3665 .{
3666 .pattern = "FCVTMU <Wd>, <Sn>",
3667 .symbols = .{
3668 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3669 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3670 },
3671 .encode = .{ .fcvtmu, .Wd, .Sn },
3672 },
3673 .{
3674 .pattern = "FCVTMU <Xd>, <Sn>",
3675 .symbols = .{
3676 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3677 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3678 },
3679 .encode = .{ .fcvtmu, .Xd, .Sn },
3680 },
3681 .{
3682 .pattern = "FCVTMU <Wd>, <Dn>",
3683 .symbols = .{
3684 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3685 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3686 },
3687 .encode = .{ .fcvtmu, .Wd, .Dn },
3688 },
3689 .{
3690 .pattern = "FCVTMU <Xd>, <Dn>",
3691 .symbols = .{
3692 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3693 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3694 },
3695 .encode = .{ .fcvtmu, .Xd, .Dn },
3696 },
3697 // C7.2.80 FCVTNS (vector)
3698 .{
3699 .requires = .{.fullfp16},
3700 .pattern = "FCVTNS <Hd>, <Hn>",
3701 .symbols = .{
3702 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3703 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3704 },
3705 .encode = .{ .fcvtns, .Hd, .Hn },
3706 },
3707 .{
3708 .pattern = "FCVTNS <Sd>, <Sn>",
3709 .symbols = .{
3710 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3711 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3712 },
3713 .encode = .{ .fcvtns, .Sd, .Sn },
3714 },
3715 .{
3716 .pattern = "FCVTNS <Dd>, <Dn>",
3717 .symbols = .{
3718 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3719 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3720 },
3721 .encode = .{ .fcvtns, .Dd, .Dn },
3722 },
3723 .{
3724 .requires = .{.fullfp16},
3725 .pattern = "FCVTNS <Vd>.<T>, <Vn>.<T>",
3726 .symbols = .{
3727 .Vd = .{ .reg_alias = .vector },
3728 .T = .{ .arrangement = .{ .elem_size = .half } },
3729 .Vn = .{ .reg_alias = .vector },
3730 },
3731 .encode = .{
3732 .fcvtns,
3733 .{ .alias = .Vd, .format = .{ .vector = .T } },
3734 .{ .alias = .Vn, .format = .{ .vector = .T } },
3735 },
3736 },
3737 .{
3738 .pattern = "FCVTNS <Vd>.<T>, <Vn>.<T>",
3739 .symbols = .{
3740 .Vd = .{ .reg_alias = .vector },
3741 .T = .{ .arrangement = .{ .elem_size = .single } },
3742 .Vn = .{ .reg_alias = .vector },
3743 },
3744 .encode = .{
3745 .fcvtns,
3746 .{ .alias = .Vd, .format = .{ .vector = .T } },
3747 .{ .alias = .Vn, .format = .{ .vector = .T } },
3748 },
3749 },
3750 .{
3751 .pattern = "FCVTNS <Vd>.2D, <Vn>.2D",
3752 .symbols = .{
3753 .Vd = .{ .reg_alias = .vector },
3754 .Vn = .{ .reg_alias = .vector },
3755 },
3756 .encode = .{
3757 .fcvtns,
3758 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3759 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3760 },
3761 },
3762 // C7.2.81 FCVTNS (scalar)
3763 .{
3764 .requires = .{.fullfp16},
3765 .pattern = "FCVTNS <Wd>, <Hn>",
3766 .symbols = .{
3767 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3768 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3769 },
3770 .encode = .{ .fcvtns, .Wd, .Hn },
3771 },
3772 .{
3773 .requires = .{.fullfp16},
3774 .pattern = "FCVTNS <Xd>, <Hn>",
3775 .symbols = .{
3776 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3777 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3778 },
3779 .encode = .{ .fcvtns, .Xd, .Hn },
3780 },
3781 .{
3782 .pattern = "FCVTNS <Wd>, <Sn>",
3783 .symbols = .{
3784 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3785 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3786 },
3787 .encode = .{ .fcvtns, .Wd, .Sn },
3788 },
3789 .{
3790 .pattern = "FCVTNS <Xd>, <Sn>",
3791 .symbols = .{
3792 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3793 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3794 },
3795 .encode = .{ .fcvtns, .Xd, .Sn },
3796 },
3797 .{
3798 .pattern = "FCVTNS <Wd>, <Dn>",
3799 .symbols = .{
3800 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3801 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3802 },
3803 .encode = .{ .fcvtns, .Wd, .Dn },
3804 },
3805 .{
3806 .pattern = "FCVTNS <Xd>, <Dn>",
3807 .symbols = .{
3808 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3809 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3810 },
3811 .encode = .{ .fcvtns, .Xd, .Dn },
3812 },
3813 // C7.2.82 FCVTNU (vector)
3814 .{
3815 .requires = .{.fullfp16},
3816 .pattern = "FCVTNU <Hd>, <Hn>",
3817 .symbols = .{
3818 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3819 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3820 },
3821 .encode = .{ .fcvtnu, .Hd, .Hn },
3822 },
3823 .{
3824 .pattern = "FCVTNU <Sd>, <Sn>",
3825 .symbols = .{
3826 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3827 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3828 },
3829 .encode = .{ .fcvtnu, .Sd, .Sn },
3830 },
3831 .{
3832 .pattern = "FCVTNU <Dd>, <Dn>",
3833 .symbols = .{
3834 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3835 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3836 },
3837 .encode = .{ .fcvtnu, .Dd, .Dn },
3838 },
3839 .{
3840 .requires = .{.fullfp16},
3841 .pattern = "FCVTNU <Vd>.<T>, <Vn>.<T>",
3842 .symbols = .{
3843 .Vd = .{ .reg_alias = .vector },
3844 .T = .{ .arrangement = .{ .elem_size = .half } },
3845 .Vn = .{ .reg_alias = .vector },
3846 },
3847 .encode = .{
3848 .fcvtnu,
3849 .{ .alias = .Vd, .format = .{ .vector = .T } },
3850 .{ .alias = .Vn, .format = .{ .vector = .T } },
3851 },
3852 },
3853 .{
3854 .pattern = "FCVTNU <Vd>.<T>, <Vn>.<T>",
3855 .symbols = .{
3856 .Vd = .{ .reg_alias = .vector },
3857 .T = .{ .arrangement = .{ .elem_size = .single } },
3858 .Vn = .{ .reg_alias = .vector },
3859 },
3860 .encode = .{
3861 .fcvtnu,
3862 .{ .alias = .Vd, .format = .{ .vector = .T } },
3863 .{ .alias = .Vn, .format = .{ .vector = .T } },
3864 },
3865 },
3866 .{
3867 .pattern = "FCVTNU <Vd>.2D, <Vn>.2D",
3868 .symbols = .{
3869 .Vd = .{ .reg_alias = .vector },
3870 .Vn = .{ .reg_alias = .vector },
3871 },
3872 .encode = .{
3873 .fcvtnu,
3874 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3875 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3876 },
3877 },
3878 // C7.2.83 FCVTNU (scalar)
3879 .{
3880 .requires = .{.fullfp16},
3881 .pattern = "FCVTNU <Wd>, <Hn>",
3882 .symbols = .{
3883 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3884 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3885 },
3886 .encode = .{ .fcvtnu, .Wd, .Hn },
3887 },
3888 .{
3889 .requires = .{.fullfp16},
3890 .pattern = "FCVTNU <Xd>, <Hn>",
3891 .symbols = .{
3892 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3893 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3894 },
3895 .encode = .{ .fcvtnu, .Xd, .Hn },
3896 },
3897 .{
3898 .pattern = "FCVTNU <Wd>, <Sn>",
3899 .symbols = .{
3900 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3901 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3902 },
3903 .encode = .{ .fcvtnu, .Wd, .Sn },
3904 },
3905 .{
3906 .pattern = "FCVTNU <Xd>, <Sn>",
3907 .symbols = .{
3908 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3909 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3910 },
3911 .encode = .{ .fcvtnu, .Xd, .Sn },
3912 },
3913 .{
3914 .pattern = "FCVTNU <Wd>, <Dn>",
3915 .symbols = .{
3916 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
3917 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3918 },
3919 .encode = .{ .fcvtnu, .Wd, .Dn },
3920 },
3921 .{
3922 .pattern = "FCVTNU <Xd>, <Dn>",
3923 .symbols = .{
3924 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
3925 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3926 },
3927 .encode = .{ .fcvtnu, .Xd, .Dn },
3928 },
3929 // C7.2.84 FCVTPS (vector)
3930 .{
3931 .requires = .{.fullfp16},
3932 .pattern = "FCVTPS <Hd>, <Hn>",
3933 .symbols = .{
3934 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
3935 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
3936 },
3937 .encode = .{ .fcvtps, .Hd, .Hn },
3938 },
3939 .{
3940 .pattern = "FCVTPS <Sd>, <Sn>",
3941 .symbols = .{
3942 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
3943 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
3944 },
3945 .encode = .{ .fcvtps, .Sd, .Sn },
3946 },
3947 .{
3948 .pattern = "FCVTPS <Dd>, <Dn>",
3949 .symbols = .{
3950 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
3951 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
3952 },
3953 .encode = .{ .fcvtps, .Dd, .Dn },
3954 },
3955 .{
3956 .requires = .{.fullfp16},
3957 .pattern = "FCVTPS <Vd>.<T>, <Vn>.<T>",
3958 .symbols = .{
3959 .Vd = .{ .reg_alias = .vector },
3960 .T = .{ .arrangement = .{ .elem_size = .half } },
3961 .Vn = .{ .reg_alias = .vector },
3962 },
3963 .encode = .{
3964 .fcvtps,
3965 .{ .alias = .Vd, .format = .{ .vector = .T } },
3966 .{ .alias = .Vn, .format = .{ .vector = .T } },
3967 },
3968 },
3969 .{
3970 .pattern = "FCVTPS <Vd>.<T>, <Vn>.<T>",
3971 .symbols = .{
3972 .Vd = .{ .reg_alias = .vector },
3973 .T = .{ .arrangement = .{ .elem_size = .single } },
3974 .Vn = .{ .reg_alias = .vector },
3975 },
3976 .encode = .{
3977 .fcvtps,
3978 .{ .alias = .Vd, .format = .{ .vector = .T } },
3979 .{ .alias = .Vn, .format = .{ .vector = .T } },
3980 },
3981 },
3982 .{
3983 .pattern = "FCVTPS <Vd>.2D, <Vn>.2D",
3984 .symbols = .{
3985 .Vd = .{ .reg_alias = .vector },
3986 .Vn = .{ .reg_alias = .vector },
3987 },
3988 .encode = .{
3989 .fcvtps,
3990 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
3991 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
3992 },
3993 },
3994 // C7.2.85 FCVTPS (scalar)
3995 .{
3996 .requires = .{.fullfp16},
3997 .pattern = "FCVTPS <Wd>, <Hn>",
3998 .symbols = .{
3999 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4000 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4001 },
4002 .encode = .{ .fcvtps, .Wd, .Hn },
4003 },
4004 .{
4005 .requires = .{.fullfp16},
4006 .pattern = "FCVTPS <Xd>, <Hn>",
4007 .symbols = .{
4008 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4009 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4010 },
4011 .encode = .{ .fcvtps, .Xd, .Hn },
4012 },
4013 .{
4014 .pattern = "FCVTPS <Wd>, <Sn>",
4015 .symbols = .{
4016 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4017 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4018 },
4019 .encode = .{ .fcvtps, .Wd, .Sn },
4020 },
4021 .{
4022 .pattern = "FCVTPS <Xd>, <Sn>",
4023 .symbols = .{
4024 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4025 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4026 },
4027 .encode = .{ .fcvtps, .Xd, .Sn },
4028 },
4029 .{
4030 .pattern = "FCVTPS <Wd>, <Dn>",
4031 .symbols = .{
4032 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4033 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4034 },
4035 .encode = .{ .fcvtps, .Wd, .Dn },
4036 },
4037 .{
4038 .pattern = "FCVTPS <Xd>, <Dn>",
4039 .symbols = .{
4040 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4041 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4042 },
4043 .encode = .{ .fcvtps, .Xd, .Dn },
4044 },
4045 // C7.2.86 FCVTPU (vector)
4046 .{
4047 .requires = .{.fullfp16},
4048 .pattern = "FCVTPU <Hd>, <Hn>",
4049 .symbols = .{
4050 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4051 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4052 },
4053 .encode = .{ .fcvtpu, .Hd, .Hn },
4054 },
4055 .{
4056 .pattern = "FCVTPU <Sd>, <Sn>",
4057 .symbols = .{
4058 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4059 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4060 },
4061 .encode = .{ .fcvtpu, .Sd, .Sn },
4062 },
4063 .{
4064 .pattern = "FCVTPU <Dd>, <Dn>",
4065 .symbols = .{
4066 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4067 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4068 },
4069 .encode = .{ .fcvtpu, .Dd, .Dn },
4070 },
4071 .{
4072 .requires = .{.fullfp16},
4073 .pattern = "FCVTPU <Vd>.<T>, <Vn>.<T>",
4074 .symbols = .{
4075 .Vd = .{ .reg_alias = .vector },
4076 .T = .{ .arrangement = .{ .elem_size = .half } },
4077 .Vn = .{ .reg_alias = .vector },
4078 },
4079 .encode = .{
4080 .fcvtpu,
4081 .{ .alias = .Vd, .format = .{ .vector = .T } },
4082 .{ .alias = .Vn, .format = .{ .vector = .T } },
4083 },
4084 },
4085 .{
4086 .pattern = "FCVTPU <Vd>.<T>, <Vn>.<T>",
4087 .symbols = .{
4088 .Vd = .{ .reg_alias = .vector },
4089 .T = .{ .arrangement = .{ .elem_size = .single } },
4090 .Vn = .{ .reg_alias = .vector },
4091 },
4092 .encode = .{
4093 .fcvtpu,
4094 .{ .alias = .Vd, .format = .{ .vector = .T } },
4095 .{ .alias = .Vn, .format = .{ .vector = .T } },
4096 },
4097 },
4098 .{
4099 .pattern = "FCVTPU <Vd>.2D, <Vn>.2D",
4100 .symbols = .{
4101 .Vd = .{ .reg_alias = .vector },
4102 .Vn = .{ .reg_alias = .vector },
4103 },
4104 .encode = .{
4105 .fcvtpu,
4106 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4107 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4108 },
4109 },
4110 // C7.2.87 FCVTPU (scalar)
4111 .{
4112 .requires = .{.fullfp16},
4113 .pattern = "FCVTPU <Wd>, <Hn>",
4114 .symbols = .{
4115 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4116 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4117 },
4118 .encode = .{ .fcvtpu, .Wd, .Hn },
4119 },
4120 .{
4121 .requires = .{.fullfp16},
4122 .pattern = "FCVTPU <Xd>, <Hn>",
4123 .symbols = .{
4124 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4125 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4126 },
4127 .encode = .{ .fcvtpu, .Xd, .Hn },
4128 },
4129 .{
4130 .pattern = "FCVTPU <Wd>, <Sn>",
4131 .symbols = .{
4132 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4133 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4134 },
4135 .encode = .{ .fcvtpu, .Wd, .Sn },
4136 },
4137 .{
4138 .pattern = "FCVTPU <Xd>, <Sn>",
4139 .symbols = .{
4140 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4141 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4142 },
4143 .encode = .{ .fcvtpu, .Xd, .Sn },
4144 },
4145 .{
4146 .pattern = "FCVTPU <Wd>, <Dn>",
4147 .symbols = .{
4148 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4149 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4150 },
4151 .encode = .{ .fcvtpu, .Wd, .Dn },
4152 },
4153 .{
4154 .pattern = "FCVTPU <Xd>, <Dn>",
4155 .symbols = .{
4156 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4157 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4158 },
4159 .encode = .{ .fcvtpu, .Xd, .Dn },
4160 },
4161 // C7.2.90 FCVTZS (vector, integer)
4162 .{
4163 .requires = .{.fullfp16},
4164 .pattern = "FCVTZS <Hd>, <Hn>",
4165 .symbols = .{
4166 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4167 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4168 },
4169 .encode = .{ .fcvtzs, .Hd, .Hn },
4170 },
4171 .{
4172 .pattern = "FCVTZS <Sd>, <Sn>",
4173 .symbols = .{
4174 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4175 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4176 },
4177 .encode = .{ .fcvtzs, .Sd, .Sn },
4178 },
4179 .{
4180 .pattern = "FCVTZS <Dd>, <Dn>",
4181 .symbols = .{
4182 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4183 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4184 },
4185 .encode = .{ .fcvtzs, .Dd, .Dn },
4186 },
4187 .{
4188 .requires = .{.fullfp16},
4189 .pattern = "FCVTZS <Vd>.<T>, <Vn>.<T>",
4190 .symbols = .{
4191 .Vd = .{ .reg_alias = .vector },
4192 .T = .{ .arrangement = .{ .elem_size = .half } },
4193 .Vn = .{ .reg_alias = .vector },
4194 },
4195 .encode = .{
4196 .fcvtzs,
4197 .{ .alias = .Vd, .format = .{ .vector = .T } },
4198 .{ .alias = .Vn, .format = .{ .vector = .T } },
4199 },
4200 },
4201 .{
4202 .pattern = "FCVTZS <Vd>.<T>, <Vn>.<T>",
4203 .symbols = .{
4204 .Vd = .{ .reg_alias = .vector },
4205 .T = .{ .arrangement = .{ .elem_size = .single } },
4206 .Vn = .{ .reg_alias = .vector },
4207 },
4208 .encode = .{
4209 .fcvtzs,
4210 .{ .alias = .Vd, .format = .{ .vector = .T } },
4211 .{ .alias = .Vn, .format = .{ .vector = .T } },
4212 },
4213 },
4214 .{
4215 .pattern = "FCVTZS <Vd>.2D, <Vn>.2D",
4216 .symbols = .{
4217 .Vd = .{ .reg_alias = .vector },
4218 .Vn = .{ .reg_alias = .vector },
4219 },
4220 .encode = .{
4221 .fcvtzs,
4222 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4223 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4224 },
4225 },
4226 // C7.2.92 FCVTZS (scalar, integer)
4227 .{
4228 .requires = .{.fullfp16},
4229 .pattern = "FCVTZS <Wd>, <Hn>",
4230 .symbols = .{
4231 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4232 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4233 },
4234 .encode = .{ .fcvtzs, .Wd, .Hn },
4235 },
4236 .{
4237 .requires = .{.fullfp16},
4238 .pattern = "FCVTZS <Xd>, <Hn>",
4239 .symbols = .{
4240 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4241 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4242 },
4243 .encode = .{ .fcvtzs, .Xd, .Hn },
4244 },
4245 .{
4246 .pattern = "FCVTZS <Wd>, <Sn>",
4247 .symbols = .{
4248 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4249 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4250 },
4251 .encode = .{ .fcvtzs, .Wd, .Sn },
4252 },
4253 .{
4254 .pattern = "FCVTZS <Xd>, <Sn>",
4255 .symbols = .{
4256 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4257 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4258 },
4259 .encode = .{ .fcvtzs, .Xd, .Sn },
4260 },
4261 .{
4262 .pattern = "FCVTZS <Wd>, <Dn>",
4263 .symbols = .{
4264 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4265 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4266 },
4267 .encode = .{ .fcvtzs, .Wd, .Dn },
4268 },
4269 .{
4270 .pattern = "FCVTZS <Xd>, <Dn>",
4271 .symbols = .{
4272 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4273 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4274 },
4275 .encode = .{ .fcvtzs, .Xd, .Dn },
4276 },
4277 // C7.2.94 FCVTZU (vector, integer)
4278 .{
4279 .requires = .{.fullfp16},
4280 .pattern = "FCVTZU <Hd>, <Hn>",
4281 .symbols = .{
4282 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4283 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4284 },
4285 .encode = .{ .fcvtzu, .Hd, .Hn },
4286 },
4287 .{
4288 .pattern = "FCVTZU <Sd>, <Sn>",
4289 .symbols = .{
4290 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4291 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4292 },
4293 .encode = .{ .fcvtzu, .Sd, .Sn },
4294 },
4295 .{
4296 .pattern = "FCVTZU <Dd>, <Dn>",
4297 .symbols = .{
4298 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4299 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4300 },
4301 .encode = .{ .fcvtzu, .Dd, .Dn },
4302 },
4303 .{
4304 .requires = .{.fullfp16},
4305 .pattern = "FCVTZU <Vd>.<T>, <Vn>.<T>",
4306 .symbols = .{
4307 .Vd = .{ .reg_alias = .vector },
4308 .T = .{ .arrangement = .{ .elem_size = .half } },
4309 .Vn = .{ .reg_alias = .vector },
4310 },
4311 .encode = .{
4312 .fcvtzu,
4313 .{ .alias = .Vd, .format = .{ .vector = .T } },
4314 .{ .alias = .Vn, .format = .{ .vector = .T } },
4315 },
4316 },
4317 .{
4318 .pattern = "FCVTZU <Vd>.<T>, <Vn>.<T>",
4319 .symbols = .{
4320 .Vd = .{ .reg_alias = .vector },
4321 .T = .{ .arrangement = .{ .elem_size = .single } },
4322 .Vn = .{ .reg_alias = .vector },
4323 },
4324 .encode = .{
4325 .fcvtzu,
4326 .{ .alias = .Vd, .format = .{ .vector = .T } },
4327 .{ .alias = .Vn, .format = .{ .vector = .T } },
4328 },
4329 },
4330 .{
4331 .pattern = "FCVTZU <Vd>.2D, <Vn>.2D",
4332 .symbols = .{
4333 .Vd = .{ .reg_alias = .vector },
4334 .Vn = .{ .reg_alias = .vector },
4335 },
4336 .encode = .{
4337 .fcvtzu,
4338 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4339 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4340 },
4341 },
4342 // C7.2.96 FCVTZU (scalar, integer)
4343 .{
4344 .requires = .{.fullfp16},
4345 .pattern = "FCVTZU <Wd>, <Hn>",
4346 .symbols = .{
4347 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4348 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4349 },
4350 .encode = .{ .fcvtzu, .Wd, .Hn },
4351 },
4352 .{
4353 .requires = .{.fullfp16},
4354 .pattern = "FCVTZU <Xd>, <Hn>",
4355 .symbols = .{
4356 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4357 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4358 },
4359 .encode = .{ .fcvtzu, .Xd, .Hn },
4360 },
4361 .{
4362 .pattern = "FCVTZU <Wd>, <Sn>",
4363 .symbols = .{
4364 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4365 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4366 },
4367 .encode = .{ .fcvtzu, .Wd, .Sn },
4368 },
4369 .{
4370 .pattern = "FCVTZU <Xd>, <Sn>",
4371 .symbols = .{
4372 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4373 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4374 },
4375 .encode = .{ .fcvtzu, .Xd, .Sn },
4376 },
4377 .{
4378 .pattern = "FCVTZU <Wd>, <Dn>",
4379 .symbols = .{
4380 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4381 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4382 },
4383 .encode = .{ .fcvtzu, .Wd, .Dn },
4384 },
4385 .{
4386 .pattern = "FCVTZU <Xd>, <Dn>",
4387 .symbols = .{
4388 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4389 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4390 },
4391 .encode = .{ .fcvtzu, .Xd, .Dn },
4392 },
4393 // C7.2.129 FMOV (vector, immediate)
4394 .{
4395 .requires = .{.fullfp16},
4396 .pattern = "FMOV <Vd>.<T>, #<imm>",
4397 .symbols = .{
4398 .Vd = .{ .reg_alias = .vector },
4399 .T = .{ .arrangement = .{ .elem_size = .half } },
4400 .imm = .{ .fimm = .{} },
4401 },
4402 .encode = .{ .fmov, .{ .alias = .Vd, .format = .{ .vector = .T } }, .{ .immediate = .imm } },
4403 },
4404 .{
4405 .pattern = "FMOV <Vd>.<T>, #<imm>",
4406 .symbols = .{
4407 .Vd = .{ .reg_alias = .vector },
4408 .T = .{ .arrangement = .{ .elem_size = .single } },
4409 .imm = .{ .fimm = .{} },
4410 },
4411 .encode = .{ .fmov, .{ .alias = .Vd, .format = .{ .vector = .T } }, .{ .immediate = .imm } },
4412 },
4413 .{
4414 .pattern = "FMOV <Vd>.2D, #<imm>",
4415 .symbols = .{
4416 .Vd = .{ .reg_alias = .vector },
4417 .imm = .{ .fimm = .{} },
4418 },
4419 .encode = .{ .fmov, .{ .alias = .Vd, .format = .{ .vector = .@"2d" } }, .{ .immediate = .imm } },
4420 },
4421 // C7.2.130 FMOV (register)
4422 .{
4423 .requires = .{.fullfp16},
4424 .pattern = "FMOV <Hd>, <Hn>",
4425 .symbols = .{
4426 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4427 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4428 },
4429 .encode = .{ .fmov, .Hd, .{ .register = .Hn } },
4430 },
4431 .{
4432 .pattern = "FMOV <Sd>, <Sn>",
4433 .symbols = .{
4434 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4435 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4436 },
4437 .encode = .{ .fmov, .Sd, .{ .register = .Sn } },
4438 },
4439 .{
4440 .pattern = "FMOV <Dd>, <Dn>",
4441 .symbols = .{
4442 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4443 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4444 },
4445 .encode = .{ .fmov, .Dd, .{ .register = .Dn } },
4446 },
4447 // C7.2.131 FMOV (general)
4448 .{
4449 .requires = .{.fullfp16},
4450 .pattern = "FMOV <Wd>, <Hn>",
4451 .symbols = .{
4452 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4453 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4454 },
4455 .encode = .{ .fmov, .Wd, .{ .register = .Hn } },
4456 },
4457 .{
4458 .requires = .{.fullfp16},
4459 .pattern = "FMOV <Xd>, <Hn>",
4460 .symbols = .{
4461 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4462 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4463 },
4464 .encode = .{ .fmov, .Xd, .{ .register = .Hn } },
4465 },
4466 .{
4467 .requires = .{.fullfp16},
4468 .pattern = "FMOV <Hd>, <Wn>",
4469 .symbols = .{
4470 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4471 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4472 },
4473 .encode = .{ .fmov, .Hd, .{ .register = .Wn } },
4474 },
4475 .{
4476 .pattern = "FMOV <Sd>, <Wn>",
4477 .symbols = .{
4478 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4479 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4480 },
4481 .encode = .{ .fmov, .Sd, .{ .register = .Wn } },
4482 },
4483 .{
4484 .pattern = "FMOV <Wd>, <Sn>",
4485 .symbols = .{
4486 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
4487 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4488 },
4489 .encode = .{ .fmov, .Wd, .{ .register = .Sn } },
4490 },
4491 .{
4492 .requires = .{.fullfp16},
4493 .pattern = "FMOV <Hd>, <Xn>",
4494 .symbols = .{
4495 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4496 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4497 },
4498 .encode = .{ .fmov, .Hd, .{ .register = .Xn } },
4499 },
4500 .{
4501 .pattern = "FMOV <Dd>, <Xn>",
4502 .symbols = .{
4503 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4504 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4505 },
4506 .encode = .{ .fmov, .Dd, .{ .register = .Xn } },
4507 },
4508 .{
4509 .pattern = "FMOV <Vd>.D[<index>], <Xn>",
4510 .symbols = .{
4511 .Vd = .{ .reg_alias = .vector },
4512 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 }, .min_valid = 1 } },
4513 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4514 },
4515 .encode = .{
4516 .fmov,
4517 .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index } } },
4518 .{ .register = .Xn },
4519 },
4520 },
4521 .{
4522 .pattern = "FMOV <Xd>, <Dn>",
4523 .symbols = .{
4524 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4525 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4526 },
4527 .encode = .{ .fmov, .Xd, .{ .register = .Dn } },
4528 },
4529 .{
4530 .pattern = "FMOV <Xd>, <Vn>.D[<index>]",
4531 .symbols = .{
4532 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4533 .Vn = .{ .reg_alias = .vector },
4534 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 }, .min_valid = 1 } },
4535 },
4536 .encode = .{ .fmov, .Xd, .{
4537 .register = .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
4538 } },
4539 },
4540 // C7.2.132 FMOV (scalar, immediate)
4541 .{
4542 .requires = .{.fullfp16},
4543 .pattern = "FMOV <Hd>, #<imm>",
4544 .symbols = .{
4545 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4546 .imm = .{ .fimm = .{} },
4547 },
4548 .encode = .{ .fmov, .Hd, .{ .immediate = .imm } },
4549 },
4550 .{
4551 .pattern = "FMOV <Sd>, #<imm>",
4552 .symbols = .{
4553 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4554 .imm = .{ .fimm = .{} },
4555 },
4556 .encode = .{ .fmov, .Sd, .{ .immediate = .imm } },
4557 },
4558 .{
4559 .pattern = "FMOV <Dd>, #<imm>",
4560 .symbols = .{
4561 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4562 .imm = .{ .fimm = .{} },
4563 },
4564 .encode = .{ .fmov, .Dd, .{ .immediate = .imm } },
4565 },
4566 // C7.2.157 FRINTI (vector)
4567 .{
4568 .requires = .{.fullfp16},
4569 .pattern = "FRINTI <Vd>.<T>, <Vn>.<T>",
4570 .symbols = .{
4571 .Vd = .{ .reg_alias = .vector },
4572 .T = .{ .arrangement = .{ .elem_size = .half } },
4573 .Vn = .{ .reg_alias = .vector },
4574 },
4575 .encode = .{
4576 .frinti,
4577 .{ .alias = .Vd, .format = .{ .vector = .T } },
4578 .{ .alias = .Vn, .format = .{ .vector = .T } },
4579 },
4580 },
4581 .{
4582 .pattern = "FRINTI <Vd>.<T>, <Vn>.<T>",
4583 .symbols = .{
4584 .Vd = .{ .reg_alias = .vector },
4585 .T = .{ .arrangement = .{ .elem_size = .single } },
4586 .Vn = .{ .reg_alias = .vector },
4587 },
4588 .encode = .{
4589 .frinti,
4590 .{ .alias = .Vd, .format = .{ .vector = .T } },
4591 .{ .alias = .Vn, .format = .{ .vector = .T } },
4592 },
4593 },
4594 .{
4595 .pattern = "FRINTI <Vd>.2D, <Vn>.2D",
4596 .symbols = .{
4597 .Vd = .{ .reg_alias = .vector },
4598 .Vn = .{ .reg_alias = .vector },
4599 },
4600 .encode = .{
4601 .frinti,
4602 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4603 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4604 },
4605 },
4606 // C7.2.168 FRINTI (scalar)
4607 .{
4608 .requires = .{.fullfp16},
4609 .pattern = "FRINTI <Hd>, <Hn>",
4610 .symbols = .{
4611 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4612 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4613 },
4614 .encode = .{ .frinti, .Hd, .Hn },
4615 },
4616 .{
4617 .pattern = "FRINTI <Sd>, <Sn>",
4618 .symbols = .{
4619 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4620 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4621 },
4622 .encode = .{ .frinti, .Sd, .Sn },
4623 },
4624 .{
4625 .pattern = "FRINTI <Dd>, <Dn>",
4626 .symbols = .{
4627 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4628 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4629 },
4630 .encode = .{ .frinti, .Dd, .Dn },
4631 },
4632 // C7.2.159 FRINTM (vector)
4633 .{
4634 .requires = .{.fullfp16},
4635 .pattern = "FRINTM <Vd>.<T>, <Vn>.<T>",
4636 .symbols = .{
4637 .Vd = .{ .reg_alias = .vector },
4638 .T = .{ .arrangement = .{ .elem_size = .half } },
4639 .Vn = .{ .reg_alias = .vector },
4640 },
4641 .encode = .{
4642 .frintm,
4643 .{ .alias = .Vd, .format = .{ .vector = .T } },
4644 .{ .alias = .Vn, .format = .{ .vector = .T } },
4645 },
4646 },
4647 .{
4648 .pattern = "FRINTM <Vd>.<T>, <Vn>.<T>",
4649 .symbols = .{
4650 .Vd = .{ .reg_alias = .vector },
4651 .T = .{ .arrangement = .{ .elem_size = .single } },
4652 .Vn = .{ .reg_alias = .vector },
4653 },
4654 .encode = .{
4655 .frintm,
4656 .{ .alias = .Vd, .format = .{ .vector = .T } },
4657 .{ .alias = .Vn, .format = .{ .vector = .T } },
4658 },
4659 },
4660 .{
4661 .pattern = "FRINTM <Vd>.2D, <Vn>.2D",
4662 .symbols = .{
4663 .Vd = .{ .reg_alias = .vector },
4664 .Vn = .{ .reg_alias = .vector },
4665 },
4666 .encode = .{
4667 .frintm,
4668 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4669 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4670 },
4671 },
4672 // C7.2.160 FRINTM (scalar)
4673 .{
4674 .requires = .{.fullfp16},
4675 .pattern = "FRINTM <Hd>, <Hn>",
4676 .symbols = .{
4677 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4678 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4679 },
4680 .encode = .{ .frintm, .Hd, .Hn },
4681 },
4682 .{
4683 .pattern = "FRINTM <Sd>, <Sn>",
4684 .symbols = .{
4685 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4686 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4687 },
4688 .encode = .{ .frintm, .Sd, .Sn },
4689 },
4690 .{
4691 .pattern = "FRINTM <Dd>, <Dn>",
4692 .symbols = .{
4693 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4694 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4695 },
4696 .encode = .{ .frintm, .Dd, .Dn },
4697 },
4698 // C7.2.161 FRINTN (vector)
4699 .{
4700 .requires = .{.fullfp16},
4701 .pattern = "FRINTN <Vd>.<T>, <Vn>.<T>",
4702 .symbols = .{
4703 .Vd = .{ .reg_alias = .vector },
4704 .T = .{ .arrangement = .{ .elem_size = .half } },
4705 .Vn = .{ .reg_alias = .vector },
4706 },
4707 .encode = .{
4708 .frintn,
4709 .{ .alias = .Vd, .format = .{ .vector = .T } },
4710 .{ .alias = .Vn, .format = .{ .vector = .T } },
4711 },
4712 },
4713 .{
4714 .pattern = "FRINTN <Vd>.<T>, <Vn>.<T>",
4715 .symbols = .{
4716 .Vd = .{ .reg_alias = .vector },
4717 .T = .{ .arrangement = .{ .elem_size = .single } },
4718 .Vn = .{ .reg_alias = .vector },
4719 },
4720 .encode = .{
4721 .frintn,
4722 .{ .alias = .Vd, .format = .{ .vector = .T } },
4723 .{ .alias = .Vn, .format = .{ .vector = .T } },
4724 },
4725 },
4726 .{
4727 .pattern = "FRINTN <Vd>.2D, <Vn>.2D",
4728 .symbols = .{
4729 .Vd = .{ .reg_alias = .vector },
4730 .Vn = .{ .reg_alias = .vector },
4731 },
4732 .encode = .{
4733 .frintn,
4734 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4735 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4736 },
4737 },
4738 // C7.2.162 FRINTN (scalar)
4739 .{
4740 .requires = .{.fullfp16},
4741 .pattern = "FRINTN <Hd>, <Hn>",
4742 .symbols = .{
4743 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4744 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4745 },
4746 .encode = .{ .frintn, .Hd, .Hn },
4747 },
4748 .{
4749 .pattern = "FRINTN <Sd>, <Sn>",
4750 .symbols = .{
4751 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4752 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4753 },
4754 .encode = .{ .frintn, .Sd, .Sn },
4755 },
4756 .{
4757 .pattern = "FRINTN <Dd>, <Dn>",
4758 .symbols = .{
4759 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4760 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4761 },
4762 .encode = .{ .frintn, .Dd, .Dn },
4763 },
4764 // C7.2.163 FRINTP (vector)
4765 .{
4766 .requires = .{.fullfp16},
4767 .pattern = "FRINTP <Vd>.<T>, <Vn>.<T>",
4768 .symbols = .{
4769 .Vd = .{ .reg_alias = .vector },
4770 .T = .{ .arrangement = .{ .elem_size = .half } },
4771 .Vn = .{ .reg_alias = .vector },
4772 },
4773 .encode = .{
4774 .frintp,
4775 .{ .alias = .Vd, .format = .{ .vector = .T } },
4776 .{ .alias = .Vn, .format = .{ .vector = .T } },
4777 },
4778 },
4779 .{
4780 .pattern = "FRINTP <Vd>.<T>, <Vn>.<T>",
4781 .symbols = .{
4782 .Vd = .{ .reg_alias = .vector },
4783 .T = .{ .arrangement = .{ .elem_size = .single } },
4784 .Vn = .{ .reg_alias = .vector },
4785 },
4786 .encode = .{
4787 .frintp,
4788 .{ .alias = .Vd, .format = .{ .vector = .T } },
4789 .{ .alias = .Vn, .format = .{ .vector = .T } },
4790 },
4791 },
4792 .{
4793 .pattern = "FRINTP <Vd>.2D, <Vn>.2D",
4794 .symbols = .{
4795 .Vd = .{ .reg_alias = .vector },
4796 .Vn = .{ .reg_alias = .vector },
4797 },
4798 .encode = .{
4799 .frintp,
4800 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4801 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4802 },
4803 },
4804 // C7.2.164 FRINTP (scalar)
4805 .{
4806 .requires = .{.fullfp16},
4807 .pattern = "FRINTP <Hd>, <Hn>",
4808 .symbols = .{
4809 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4810 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4811 },
4812 .encode = .{ .frintp, .Hd, .Hn },
4813 },
4814 .{
4815 .pattern = "FRINTP <Sd>, <Sn>",
4816 .symbols = .{
4817 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4818 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4819 },
4820 .encode = .{ .frintp, .Sd, .Sn },
4821 },
4822 .{
4823 .pattern = "FRINTP <Dd>, <Dn>",
4824 .symbols = .{
4825 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4826 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4827 },
4828 .encode = .{ .frintp, .Dd, .Dn },
4829 },
4830 // C7.2.167 FRINTZ (vector)
4831 .{
4832 .requires = .{.fullfp16},
4833 .pattern = "FRINTZ <Vd>.<T>, <Vn>.<T>",
4834 .symbols = .{
4835 .Vd = .{ .reg_alias = .vector },
4836 .T = .{ .arrangement = .{ .elem_size = .half } },
4837 .Vn = .{ .reg_alias = .vector },
4838 },
4839 .encode = .{
4840 .frintz,
4841 .{ .alias = .Vd, .format = .{ .vector = .T } },
4842 .{ .alias = .Vn, .format = .{ .vector = .T } },
4843 },
4844 },
4845 .{
4846 .pattern = "FRINTZ <Vd>.<T>, <Vn>.<T>",
4847 .symbols = .{
4848 .Vd = .{ .reg_alias = .vector },
4849 .T = .{ .arrangement = .{ .elem_size = .single } },
4850 .Vn = .{ .reg_alias = .vector },
4851 },
4852 .encode = .{
4853 .frintz,
4854 .{ .alias = .Vd, .format = .{ .vector = .T } },
4855 .{ .alias = .Vn, .format = .{ .vector = .T } },
4856 },
4857 },
4858 .{
4859 .pattern = "FRINTZ <Vd>.2D, <Vn>.2D",
4860 .symbols = .{
4861 .Vd = .{ .reg_alias = .vector },
4862 .Vn = .{ .reg_alias = .vector },
4863 },
4864 .encode = .{
4865 .frintz,
4866 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
4867 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
4868 },
4869 },
4870 // C7.2.168 FRINTZ (scalar)
4871 .{
4872 .requires = .{.fullfp16},
4873 .pattern = "FRINTZ <Hd>, <Hn>",
4874 .symbols = .{
4875 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
4876 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
4877 },
4878 .encode = .{ .frintz, .Hd, .Hn },
4879 },
4880 .{
4881 .pattern = "FRINTZ <Sd>, <Sn>",
4882 .symbols = .{
4883 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
4884 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
4885 },
4886 .encode = .{ .frintz, .Sd, .Sn },
4887 },
4888 .{
4889 .pattern = "FRINTZ <Dd>, <Dn>",
4890 .symbols = .{
4891 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
4892 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
4893 },
4894 .encode = .{ .frintz, .Dd, .Dn },
4895 },
4896 // C7.2.175 INS (element)
4897 .{
4898 .pattern = "INS <Vd>.B[<index1>], <Vn>.B[<index2>]",
4899 .symbols = .{
4900 .Vd = .{ .reg_alias = .vector },
4901 .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
4902 .Vn = .{ .reg_alias = .vector },
4903 .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
4904 },
4905 .encode = .{
4906 .ins,
4907 .{ .alias = .Vd, .format = .{ .element = .{ .size = .byte, .index = .index1 } } },
4908 .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index2 } } },
4909 },
4910 },
4911 .{
4912 .pattern = "INS <Vd>.H[<index1>], <Vn>.H[<index2>]",
4913 .symbols = .{
4914 .Vd = .{ .reg_alias = .vector },
4915 .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
4916 .Vn = .{ .reg_alias = .vector },
4917 .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
4918 },
4919 .encode = .{
4920 .ins,
4921 .{ .alias = .Vd, .format = .{ .element = .{ .size = .half, .index = .index1 } } },
4922 .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index2 } } },
4923 },
4924 },
4925 .{
4926 .pattern = "INS <Vd>.S[<index1>], <Vn>.S[<index2>]",
4927 .symbols = .{
4928 .Vd = .{ .reg_alias = .vector },
4929 .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
4930 .Vn = .{ .reg_alias = .vector },
4931 .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
4932 },
4933 .encode = .{
4934 .ins,
4935 .{ .alias = .Vd, .format = .{ .element = .{ .size = .single, .index = .index1 } } },
4936 .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index2 } } },
4937 },
4938 },
4939 .{
4940 .pattern = "INS <Vd>.D[<index1>], <Vn>.D[<index2>]",
4941 .symbols = .{
4942 .Vd = .{ .reg_alias = .vector },
4943 .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
4944 .Vn = .{ .reg_alias = .vector },
4945 .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
4946 },
4947 .encode = .{
4948 .ins,
4949 .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index1 } } },
4950 .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index2 } } },
4951 },
4952 },
4953 // C7.2.176 INS (general)
4954 .{
4955 .pattern = "INS <Vd>.B[<index>], <Wn>",
4956 .symbols = .{
4957 .Vd = .{ .reg_alias = .vector },
4958 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
4959 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4960 },
4961 .encode = .{
4962 .ins,
4963 .{ .alias = .Vd, .format = .{ .element = .{ .size = .byte, .index = .index } } },
4964 .Wn,
4965 },
4966 },
4967 .{
4968 .pattern = "INS <Vd>.H[<index>], <Wn>",
4969 .symbols = .{
4970 .Vd = .{ .reg_alias = .vector },
4971 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
4972 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4973 },
4974 .encode = .{
4975 .ins,
4976 .{ .alias = .Vd, .format = .{ .element = .{ .size = .half, .index = .index } } },
4977 .Wn,
4978 },
4979 },
4980 .{
4981 .pattern = "INS <Vd>.S[<index>], <Wn>",
4982 .symbols = .{
4983 .Vd = .{ .reg_alias = .vector },
4984 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
4985 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
4986 },
4987 .encode = .{
4988 .ins,
4989 .{ .alias = .Vd, .format = .{ .element = .{ .size = .single, .index = .index } } },
4990 .Wn,
4991 },
4992 },
4993 .{
4994 .pattern = "INS <Vd>.D[<index>], <Xn>",
4995 .symbols = .{
4996 .Vd = .{ .reg_alias = .vector },
4997 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
4998 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
4999 },
5000 .encode = .{
5001 .ins,
5002 .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index } } },
5003 .Xn,
5004 },
5005 },
5006 // C7.2.199 MOV (scalar)
5007 .{
5008 .pattern = "MOV <Vd>, <Vn>.B[<index>]",
5009 .symbols = .{
5010 .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5011 .Vn = .{ .reg_alias = .vector },
5012 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5013 },
5014 .encode = .{
5015 .dup,
5016 .Vd,
5017 .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5018 },
5019 },
5020 .{
5021 .pattern = "MOV <Vd>, <Vn>.H[<index>]",
5022 .symbols = .{
5023 .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5024 .Vn = .{ .reg_alias = .vector },
5025 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5026 },
5027 .encode = .{
5028 .dup,
5029 .Vd,
5030 .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
5031 },
5032 },
5033 .{
5034 .pattern = "MOV <Vd>, <Vn>.S[<index>]",
5035 .symbols = .{
5036 .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5037 .Vn = .{ .reg_alias = .vector },
5038 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5039 },
5040 .encode = .{
5041 .dup,
5042 .Vd,
5043 .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
5044 },
5045 },
5046 .{
5047 .pattern = "MOV <Vd>, <Vn>.D[<index>]",
5048 .symbols = .{
5049 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5050 .Vn = .{ .reg_alias = .vector },
5051 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5052 },
5053 .encode = .{
5054 .dup,
5055 .Vd,
5056 .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
5057 },
5058 },
5059 // C7.2.200 MOV (element)
5060 .{
5061 .pattern = "MOV <Vd>.B[<index1>], <Vn>.B[<index2>]",
5062 .symbols = .{
5063 .Vd = .{ .reg_alias = .vector },
5064 .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5065 .Vn = .{ .reg_alias = .vector },
5066 .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5067 },
5068 .encode = .{
5069 .ins,
5070 .{ .alias = .Vd, .format = .{ .element = .{ .size = .byte, .index = .index1 } } },
5071 .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index2 } } },
5072 },
5073 },
5074 .{
5075 .pattern = "MOV <Vd>.H[<index1>], <Vn>.H[<index2>]",
5076 .symbols = .{
5077 .Vd = .{ .reg_alias = .vector },
5078 .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5079 .Vn = .{ .reg_alias = .vector },
5080 .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5081 },
5082 .encode = .{
5083 .ins,
5084 .{ .alias = .Vd, .format = .{ .element = .{ .size = .half, .index = .index1 } } },
5085 .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index2 } } },
5086 },
5087 },
5088 .{
5089 .pattern = "MOV <Vd>.S[<index1>], <Vn>.S[<index2>]",
5090 .symbols = .{
5091 .Vd = .{ .reg_alias = .vector },
5092 .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5093 .Vn = .{ .reg_alias = .vector },
5094 .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5095 },
5096 .encode = .{
5097 .ins,
5098 .{ .alias = .Vd, .format = .{ .element = .{ .size = .single, .index = .index1 } } },
5099 .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index2 } } },
5100 },
5101 },
5102 .{
5103 .pattern = "MOV <Vd>.D[<index1>], <Vn>.D[<index2>]",
5104 .symbols = .{
5105 .Vd = .{ .reg_alias = .vector },
5106 .index1 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5107 .Vn = .{ .reg_alias = .vector },
5108 .index2 = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5109 },
5110 .encode = .{
5111 .ins,
5112 .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index1 } } },
5113 .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index2 } } },
5114 },
5115 },
5116 // C7.2.201 MOV (from general)
5117 .{
5118 .pattern = "MOV <Vd>.B[<index>], <Wn>",
5119 .symbols = .{
5120 .Vd = .{ .reg_alias = .vector },
5121 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5122 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5123 },
5124 .encode = .{
5125 .ins,
5126 .{ .alias = .Vd, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5127 .Wn,
5128 },
5129 },
5130 .{
5131 .pattern = "MOV <Vd>.H[<index>], <Wn>",
5132 .symbols = .{
5133 .Vd = .{ .reg_alias = .vector },
5134 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5135 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5136 },
5137 .encode = .{
5138 .ins,
5139 .{ .alias = .Vd, .format = .{ .element = .{ .size = .half, .index = .index } } },
5140 .Wn,
5141 },
5142 },
5143 .{
5144 .pattern = "MOV <Vd>.S[<index>], <Wn>",
5145 .symbols = .{
5146 .Vd = .{ .reg_alias = .vector },
5147 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5148 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5149 },
5150 .encode = .{
5151 .ins,
5152 .{ .alias = .Vd, .format = .{ .element = .{ .size = .single, .index = .index } } },
5153 .Wn,
5154 },
5155 },
5156 .{
5157 .pattern = "MOV <Vd>.D[<index>], <Xn>",
5158 .symbols = .{
5159 .Vd = .{ .reg_alias = .vector },
5160 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5161 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5162 },
5163 .encode = .{
5164 .ins,
5165 .{ .alias = .Vd, .format = .{ .element = .{ .size = .double, .index = .index } } },
5166 .Xn,
5167 },
5168 },
5169 // C7.2.202 MOV (vector)
5170 .{
5171 .pattern = "MOV <Vd>.<T>, <Vn>.<T>",
5172 .symbols = .{
5173 .Vd = .{ .reg_alias = .vector },
5174 .T = .{ .arrangement = .{ .elem_size = .byte } },
5175 .Vn = .{ .reg_alias = .vector },
5176 },
5177 .encode = .{
5178 .orr,
5179 .{ .alias = .Vd, .format = .{ .vector = .T } },
5180 .{ .alias = .Vn, .format = .{ .vector = .T } },
5181 .{ .register = .{ .alias = .Vn, .format = .{ .vector = .T } } },
5182 },
5183 },
5184 // C7.2.203 MOV (to general)
5185 .{
5186 .pattern = "MOV <Wd>, <Vn>.S[<index>]",
5187 .symbols = .{
5188 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5189 .Vn = .{ .reg_alias = .vector },
5190 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5191 },
5192 .encode = .{
5193 .umov,
5194 .Wd,
5195 .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
5196 },
5197 },
5198 .{
5199 .pattern = "MOV <Xd>, <Vn>.D[<index>]",
5200 .symbols = .{
5201 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5202 .Vn = .{ .reg_alias = .vector },
5203 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5204 },
5205 .encode = .{
5206 .umov,
5207 .Xd,
5208 .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
5209 },
5210 },
5211 // C7.2.209 NEG (vector)
5212 .{
5213 .pattern = "NEG <Vd>, <Vn>",
5214 .symbols = .{
5215 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5216 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5217 },
5218 .encode = .{ .neg, .Vd, .Vn },
5219 },
5220 .{
5221 .pattern = "NEG <Vd>.<T>, <Vn>.<T>",
5222 .symbols = .{
5223 .Vd = .{ .reg_alias = .vector },
5224 .T = .{ .arrangement = .{ .min_valid_len = 2 } },
5225 .Vn = .{ .reg_alias = .vector },
5226 },
5227 .encode = .{
5228 .neg,
5229 .{ .alias = .Vd, .format = .{ .vector = .T } },
5230 .{ .alias = .Vn, .format = .{ .vector = .T } },
5231 },
5232 },
5233 // C7.2.210 NOT
5234 .{
5235 .pattern = "NOT <Vd>.<T>, <Vn>.<T>",
5236 .symbols = .{
5237 .Vd = .{ .reg_alias = .vector },
5238 .T = .{ .arrangement = .{ .elem_size = .byte } },
5239 .Vn = .{ .reg_alias = .vector },
5240 },
5241 .encode = .{
5242 .not,
5243 .{ .alias = .Vd, .format = .{ .vector = .T } },
5244 .{ .alias = .Vn, .format = .{ .vector = .T } },
5245 },
5246 },
5247 // C7.2.234 SCVTF (vector, integer)
5248 .{
5249 .requires = .{.fullfp16},
5250 .pattern = "SCVTF <Hd>, <Hn>",
5251 .symbols = .{
5252 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5253 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5254 },
5255 .encode = .{ .scvtf, .Hd, .Hn },
5256 },
5257 .{
5258 .pattern = "SCVTF <Sd>, <Sn>",
5259 .symbols = .{
5260 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5261 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5262 },
5263 .encode = .{ .scvtf, .Sd, .Sn },
5264 },
5265 .{
5266 .pattern = "SCVTF <Dd>, <Dn>",
5267 .symbols = .{
5268 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5269 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5270 },
5271 .encode = .{ .scvtf, .Dd, .Dn },
5272 },
5273 .{
5274 .requires = .{.fullfp16},
5275 .pattern = "SCVTF <Vd>.<T>, <Vn>.<T>",
5276 .symbols = .{
5277 .Vd = .{ .reg_alias = .vector },
5278 .T = .{ .arrangement = .{ .elem_size = .half } },
5279 .Vn = .{ .reg_alias = .vector },
5280 },
5281 .encode = .{
5282 .scvtf,
5283 .{ .alias = .Vd, .format = .{ .vector = .T } },
5284 .{ .alias = .Vn, .format = .{ .vector = .T } },
5285 },
5286 },
5287 .{
5288 .pattern = "SCVTF <Vd>.<T>, <Vn>.<T>",
5289 .symbols = .{
5290 .Vd = .{ .reg_alias = .vector },
5291 .T = .{ .arrangement = .{ .elem_size = .single } },
5292 .Vn = .{ .reg_alias = .vector },
5293 },
5294 .encode = .{
5295 .scvtf,
5296 .{ .alias = .Vd, .format = .{ .vector = .T } },
5297 .{ .alias = .Vn, .format = .{ .vector = .T } },
5298 },
5299 },
5300 .{
5301 .pattern = "SCVTF <Vd>.2D, <Vn>.2D",
5302 .symbols = .{
5303 .Vd = .{ .reg_alias = .vector },
5304 .Vn = .{ .reg_alias = .vector },
5305 },
5306 .encode = .{
5307 .scvtf,
5308 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
5309 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
5310 },
5311 },
5312 // C7.2.236 SCVTF (scalar, integer)
5313 .{
5314 .requires = .{.fullfp16},
5315 .pattern = "SCVTF <Hd>, <Wn>",
5316 .symbols = .{
5317 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5318 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5319 },
5320 .encode = .{ .scvtf, .Hd, .Wn },
5321 },
5322 .{
5323 .pattern = "SCVTF <Sd>, <Wn>",
5324 .symbols = .{
5325 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5326 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5327 },
5328 .encode = .{ .scvtf, .Sd, .Wn },
5329 },
5330 .{
5331 .pattern = "SCVTF <Dd>, <Wn>",
5332 .symbols = .{
5333 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5334 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5335 },
5336 .encode = .{ .scvtf, .Dd, .Wn },
5337 },
5338 .{
5339 .requires = .{.fullfp16},
5340 .pattern = "SCVTF <Hd>, <Xn>",
5341 .symbols = .{
5342 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5343 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5344 },
5345 .encode = .{ .scvtf, .Hd, .Xn },
5346 },
5347 .{
5348 .pattern = "SCVTF <Sd>, <Xn>",
5349 .symbols = .{
5350 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5351 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5352 },
5353 .encode = .{ .scvtf, .Sd, .Xn },
5354 },
5355 .{
5356 .pattern = "SCVTF <Dd>, <Xn>",
5357 .symbols = .{
5358 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5359 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5360 },
5361 .encode = .{ .scvtf, .Dd, .Xn },
5362 },
5363 // C7.2.279 SMOV
5364 .{
5365 .pattern = "SMOV <Wd>, <Vn>.B[<index>]",
5366 .symbols = .{
5367 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5368 .Vn = .{ .reg_alias = .vector },
5369 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5370 },
5371 .encode = .{
5372 .smov,
5373 .Wd,
5374 .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5375 },
5376 },
5377 .{
5378 .pattern = "SMOV <Xd>, <Vn>.B[<index>]",
5379 .symbols = .{
5380 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5381 .Vn = .{ .reg_alias = .vector },
5382 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5383 },
5384 .encode = .{
5385 .smov,
5386 .Xd,
5387 .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5388 },
5389 },
5390 .{
5391 .pattern = "SMOV <Wd>, <Vn>.H[<index>]",
5392 .symbols = .{
5393 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5394 .Vn = .{ .reg_alias = .vector },
5395 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5396 },
5397 .encode = .{
5398 .smov,
5399 .Wd,
5400 .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
5401 },
5402 },
5403 .{
5404 .pattern = "SMOV <Xd>, <Vn>.H[<index>]",
5405 .symbols = .{
5406 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5407 .Vn = .{ .reg_alias = .vector },
5408 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5409 },
5410 .encode = .{
5411 .smov,
5412 .Xd,
5413 .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
5414 },
5415 },
5416 .{
5417 .pattern = "SMOV <Xd>, <Vn>.S[<index>]",
5418 .symbols = .{
5419 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5420 .Vn = .{ .reg_alias = .vector },
5421 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5422 },
5423 .encode = .{
5424 .smov,
5425 .Xd,
5426 .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
5427 },
5428 },
5429 // C7.2.282 SQABS
5430 .{
5431 .pattern = "SQABS <Vd>, <Vn>",
5432 .symbols = .{
5433 .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5434 .Vn = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5435 },
5436 .encode = .{ .sqabs, .Vd, .Vn },
5437 },
5438 .{
5439 .pattern = "SQABS <Vd>, <Vn>",
5440 .symbols = .{
5441 .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5442 .Vn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5443 },
5444 .encode = .{ .sqabs, .Vd, .Vn },
5445 },
5446 .{
5447 .pattern = "SQABS <Vd>, <Vn>",
5448 .symbols = .{
5449 .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5450 .Vn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5451 },
5452 .encode = .{ .sqabs, .Vd, .Vn },
5453 },
5454 .{
5455 .pattern = "SQABS <Vd>, <Vn>",
5456 .symbols = .{
5457 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5458 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5459 },
5460 .encode = .{ .sqabs, .Vd, .Vn },
5461 },
5462 .{
5463 .pattern = "SQABS <Vd>.<T>, <Vn>.<T>",
5464 .symbols = .{
5465 .Vd = .{ .reg_alias = .vector },
5466 .T = .{ .arrangement = .{ .min_valid_len = 2 } },
5467 .Vn = .{ .reg_alias = .vector },
5468 },
5469 .encode = .{
5470 .sqabs,
5471 .{ .alias = .Vd, .format = .{ .vector = .T } },
5472 .{ .alias = .Vn, .format = .{ .vector = .T } },
5473 },
5474 },
5475 // C7.2.308 SQXTN, SQXTN2
5476 .{
5477 .pattern = "SQXTN <Vd>, <Vn>",
5478 .symbols = .{
5479 .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5480 .Vn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5481 },
5482 .encode = .{ .sqxtn, .Vd, .Vn },
5483 },
5484 .{
5485 .pattern = "SQXTN <Vd>, <Vn>",
5486 .symbols = .{
5487 .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5488 .Vn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5489 },
5490 .encode = .{ .sqxtn, .Vd, .Vn },
5491 },
5492 .{
5493 .pattern = "SQXTN <Vd>, <Vn>",
5494 .symbols = .{
5495 .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5496 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5497 },
5498 .encode = .{ .sqxtn, .Vd, .Vn },
5499 },
5500 .{
5501 .pattern = "SQXTN <Vd>.8B, <Vn>.8H",
5502 .symbols = .{
5503 .Vd = .{ .reg_alias = .vector },
5504 .Vn = .{ .reg_alias = .vector },
5505 },
5506 .encode = .{
5507 .sqxtn,
5508 .{ .alias = .Vd, .format = .{ .vector = .@"8b" } },
5509 .{ .alias = .Vn, .format = .{ .vector = .@"8h" } },
5510 },
5511 },
5512 .{
5513 .pattern = "SQXTN2 <Vd>.16B, <Vn>.8H",
5514 .symbols = .{
5515 .Vd = .{ .reg_alias = .vector },
5516 .Vn = .{ .reg_alias = .vector },
5517 },
5518 .encode = .{
5519 .sqxtn2,
5520 .{ .alias = .Vd, .format = .{ .vector = .@"16b" } },
5521 .{ .alias = .Vn, .format = .{ .vector = .@"8h" } },
5522 },
5523 },
5524 .{
5525 .pattern = "SQXTN <Vd>.4H, <Vn>.4S",
5526 .symbols = .{
5527 .Vd = .{ .reg_alias = .vector },
5528 .Vn = .{ .reg_alias = .vector },
5529 },
5530 .encode = .{
5531 .sqxtn,
5532 .{ .alias = .Vd, .format = .{ .vector = .@"4h" } },
5533 .{ .alias = .Vn, .format = .{ .vector = .@"4s" } },
5534 },
5535 },
5536 .{
5537 .pattern = "SQXTN2 <Vd>.8H, <Vn>.4S",
5538 .symbols = .{
5539 .Vd = .{ .reg_alias = .vector },
5540 .Vn = .{ .reg_alias = .vector },
5541 },
5542 .encode = .{
5543 .sqxtn2,
5544 .{ .alias = .Vd, .format = .{ .vector = .@"8h" } },
5545 .{ .alias = .Vn, .format = .{ .vector = .@"4s" } },
5546 },
5547 },
5548 .{
5549 .pattern = "SQXTN <Vd>.2S, <Vn>.2D",
5550 .symbols = .{
5551 .Vd = .{ .reg_alias = .vector },
5552 .Vn = .{ .reg_alias = .vector },
5553 },
5554 .encode = .{
5555 .sqxtn,
5556 .{ .alias = .Vd, .format = .{ .vector = .@"2s" } },
5557 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
5558 },
5559 },
5560 .{
5561 .pattern = "SQXTN2 <Vd>.4S, <Vn>.2D",
5562 .symbols = .{
5563 .Vd = .{ .reg_alias = .vector },
5564 .Vn = .{ .reg_alias = .vector },
5565 },
5566 .encode = .{
5567 .sqxtn2,
5568 .{ .alias = .Vd, .format = .{ .vector = .@"4s" } },
5569 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
5570 },
5571 },
5572 // C7.2.337 SUQADD
5573 .{
5574 .pattern = "SUQADD <Vd>, <Vn>",
5575 .symbols = .{
5576 .Vd = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5577 .Vn = .{ .reg = .{ .format = .{ .scalar = .byte } } },
5578 },
5579 .encode = .{ .suqadd, .Vd, .Vn },
5580 },
5581 .{
5582 .pattern = "SUQADD <Vd>, <Vn>",
5583 .symbols = .{
5584 .Vd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5585 .Vn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5586 },
5587 .encode = .{ .suqadd, .Vd, .Vn },
5588 },
5589 .{
5590 .pattern = "SUQADD <Vd>, <Vn>",
5591 .symbols = .{
5592 .Vd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5593 .Vn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5594 },
5595 .encode = .{ .suqadd, .Vd, .Vn },
5596 },
5597 .{
5598 .pattern = "SUQADD <Vd>, <Vn>",
5599 .symbols = .{
5600 .Vd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5601 .Vn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5602 },
5603 .encode = .{ .suqadd, .Vd, .Vn },
5604 },
5605 .{
5606 .pattern = "SUQADD <Vd>.<T>, <Vn>.<T>",
5607 .symbols = .{
5608 .Vd = .{ .reg_alias = .vector },
5609 .T = .{ .arrangement = .{ .min_valid_len = 2 } },
5610 .Vn = .{ .reg_alias = .vector },
5611 },
5612 .encode = .{
5613 .suqadd,
5614 .{ .alias = .Vd, .format = .{ .vector = .T } },
5615 .{ .alias = .Vn, .format = .{ .vector = .T } },
5616 },
5617 },
5618 // C7.2.353 UCVTF (vector, integer)
5619 .{
5620 .requires = .{.fullfp16},
5621 .pattern = "UCVTF <Hd>, <Hn>",
5622 .symbols = .{
5623 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5624 .Hn = .{ .reg = .{ .format = .{ .scalar = .half } } },
5625 },
5626 .encode = .{ .ucvtf, .Hd, .Hn },
5627 },
5628 .{
5629 .pattern = "UCVTF <Sd>, <Sn>",
5630 .symbols = .{
5631 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5632 .Sn = .{ .reg = .{ .format = .{ .scalar = .single } } },
5633 },
5634 .encode = .{ .ucvtf, .Sd, .Sn },
5635 },
5636 .{
5637 .pattern = "UCVTF <Dd>, <Dn>",
5638 .symbols = .{
5639 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5640 .Dn = .{ .reg = .{ .format = .{ .scalar = .double } } },
5641 },
5642 .encode = .{ .ucvtf, .Dd, .Dn },
5643 },
5644 .{
5645 .requires = .{.fullfp16},
5646 .pattern = "UCVTF <Vd>.<T>, <Vn>.<T>",
5647 .symbols = .{
5648 .Vd = .{ .reg_alias = .vector },
5649 .T = .{ .arrangement = .{ .elem_size = .half } },
5650 .Vn = .{ .reg_alias = .vector },
5651 },
5652 .encode = .{
5653 .ucvtf,
5654 .{ .alias = .Vd, .format = .{ .vector = .T } },
5655 .{ .alias = .Vn, .format = .{ .vector = .T } },
5656 },
5657 },
5658 .{
5659 .pattern = "UCVTF <Vd>.<T>, <Vn>.<T>",
5660 .symbols = .{
5661 .Vd = .{ .reg_alias = .vector },
5662 .T = .{ .arrangement = .{ .elem_size = .single } },
5663 .Vn = .{ .reg_alias = .vector },
5664 },
5665 .encode = .{
5666 .ucvtf,
5667 .{ .alias = .Vd, .format = .{ .vector = .T } },
5668 .{ .alias = .Vn, .format = .{ .vector = .T } },
5669 },
5670 },
5671 .{
5672 .pattern = "UCVTF <Vd>.2D, <Vn>.2D",
5673 .symbols = .{
5674 .Vd = .{ .reg_alias = .vector },
5675 .Vn = .{ .reg_alias = .vector },
5676 },
5677 .encode = .{
5678 .ucvtf,
5679 .{ .alias = .Vd, .format = .{ .vector = .@"2d" } },
5680 .{ .alias = .Vn, .format = .{ .vector = .@"2d" } },
5681 },
5682 },
5683 // C7.2.355 UCVTF (scalar, integer)
5684 .{
5685 .requires = .{.fullfp16},
5686 .pattern = "UCVTF <Hd>, <Wn>",
5687 .symbols = .{
5688 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5689 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5690 },
5691 .encode = .{ .ucvtf, .Hd, .Wn },
5692 },
5693 .{
5694 .pattern = "UCVTF <Sd>, <Wn>",
5695 .symbols = .{
5696 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5697 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5698 },
5699 .encode = .{ .ucvtf, .Sd, .Wn },
5700 },
5701 .{
5702 .pattern = "UCVTF <Dd>, <Wn>",
5703 .symbols = .{
5704 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5705 .Wn = .{ .reg = .{ .format = .{ .general = .word } } },
5706 },
5707 .encode = .{ .ucvtf, .Dd, .Wn },
5708 },
5709 .{
5710 .requires = .{.fullfp16},
5711 .pattern = "UCVTF <Hd>, <Xn>",
5712 .symbols = .{
5713 .Hd = .{ .reg = .{ .format = .{ .scalar = .half } } },
5714 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5715 },
5716 .encode = .{ .ucvtf, .Hd, .Xn },
5717 },
5718 .{
5719 .pattern = "UCVTF <Sd>, <Xn>",
5720 .symbols = .{
5721 .Sd = .{ .reg = .{ .format = .{ .scalar = .single } } },
5722 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5723 },
5724 .encode = .{ .ucvtf, .Sd, .Xn },
5725 },
5726 .{
5727 .pattern = "UCVTF <Dd>, <Xn>",
5728 .symbols = .{
5729 .Dd = .{ .reg = .{ .format = .{ .scalar = .double } } },
5730 .Xn = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5731 },
5732 .encode = .{ .ucvtf, .Dd, .Xn },
5733 },
5734 // C7.2.371 UMOV
5735 .{
5736 .pattern = "UMOV <Wd>, <Vn>.B[<index>]",
5737 .symbols = .{
5738 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5739 .Vn = .{ .reg_alias = .vector },
5740 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 4 } } },
5741 },
5742 .encode = .{
5743 .umov,
5744 .Wd,
5745 .{ .alias = .Vn, .format = .{ .element = .{ .size = .byte, .index = .index } } },
5746 },
5747 },
5748 .{
5749 .pattern = "UMOV <Wd>, <Vn>.H[<index>]",
5750 .symbols = .{
5751 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5752 .Vn = .{ .reg_alias = .vector },
5753 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 3 } } },
5754 },
5755 .encode = .{
5756 .umov,
5757 .Wd,
5758 .{ .alias = .Vn, .format = .{ .element = .{ .size = .half, .index = .index } } },
5759 },
5760 },
5761 .{
5762 .pattern = "UMOV <Wd>, <Vn>.S[<index>]",
5763 .symbols = .{
5764 .Wd = .{ .reg = .{ .format = .{ .general = .word } } },
5765 .Vn = .{ .reg_alias = .vector },
5766 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 2 } } },
5767 },
5768 .encode = .{
5769 .umov,
5770 .Wd,
5771 .{ .alias = .Vn, .format = .{ .element = .{ .size = .single, .index = .index } } },
5772 },
5773 },
5774 .{
5775 .pattern = "UMOV <Xd>, <Vn>.D[<index>]",
5776 .symbols = .{
5777 .Xd = .{ .reg = .{ .format = .{ .general = .doubleword } } },
5778 .Vn = .{ .reg_alias = .vector },
5779 .index = .{ .imm = .{ .type = .{ .signedness = .unsigned, .bits = 1 } } },
5780 },
5781 .encode = .{
5782 .umov,
5783 .Xd,
5784 .{ .alias = .Vn, .format = .{ .element = .{ .size = .double, .index = .index } } },
5785 },
5786 },
5787}