c93a90ac64405e055ed6421ede850e62dc5c5aab
[deliverable/binutils-gdb.git] / opcodes / aarch64-opc.c
1 /* aarch64-opc.c -- AArch64 opcode support.
2 Copyright (C) 2009-2017 Free Software Foundation, Inc.
3 Contributed by ARM Ltd.
4
5 This file is part of the GNU opcodes library.
6
7 This library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 It is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; see the file COPYING3. If not,
19 see <http://www.gnu.org/licenses/>. */
20
21 #include "sysdep.h"
22 #include <assert.h>
23 #include <stdlib.h>
24 #include <stdio.h>
25 #include <stdint.h>
26 #include <stdarg.h>
27 #include <inttypes.h>
28
29 #include "opintl.h"
30 #include "libiberty.h"
31
32 #include "aarch64-opc.h"
33
34 #ifdef DEBUG_AARCH64
35 int debug_dump = FALSE;
36 #endif /* DEBUG_AARCH64 */
37
38 /* The enumeration strings associated with each value of a 5-bit SVE
39 pattern operand. A null entry indicates a reserved meaning. */
40 const char *const aarch64_sve_pattern_array[32] = {
41 /* 0-7. */
42 "pow2",
43 "vl1",
44 "vl2",
45 "vl3",
46 "vl4",
47 "vl5",
48 "vl6",
49 "vl7",
50 /* 8-15. */
51 "vl8",
52 "vl16",
53 "vl32",
54 "vl64",
55 "vl128",
56 "vl256",
57 0,
58 0,
59 /* 16-23. */
60 0,
61 0,
62 0,
63 0,
64 0,
65 0,
66 0,
67 0,
68 /* 24-31. */
69 0,
70 0,
71 0,
72 0,
73 0,
74 "mul4",
75 "mul3",
76 "all"
77 };
78
79 /* The enumeration strings associated with each value of a 4-bit SVE
80 prefetch operand. A null entry indicates a reserved meaning. */
81 const char *const aarch64_sve_prfop_array[16] = {
82 /* 0-7. */
83 "pldl1keep",
84 "pldl1strm",
85 "pldl2keep",
86 "pldl2strm",
87 "pldl3keep",
88 "pldl3strm",
89 0,
90 0,
91 /* 8-15. */
92 "pstl1keep",
93 "pstl1strm",
94 "pstl2keep",
95 "pstl2strm",
96 "pstl3keep",
97 "pstl3strm",
98 0,
99 0
100 };
101
102 /* Helper functions to determine which operand to be used to encode/decode
103 the size:Q fields for AdvSIMD instructions. */
104
105 static inline bfd_boolean
106 vector_qualifier_p (enum aarch64_opnd_qualifier qualifier)
107 {
108 return ((qualifier >= AARCH64_OPND_QLF_V_8B
109 && qualifier <= AARCH64_OPND_QLF_V_1Q) ? TRUE
110 : FALSE);
111 }
112
113 static inline bfd_boolean
114 fp_qualifier_p (enum aarch64_opnd_qualifier qualifier)
115 {
116 return ((qualifier >= AARCH64_OPND_QLF_S_B
117 && qualifier <= AARCH64_OPND_QLF_S_Q) ? TRUE
118 : FALSE);
119 }
120
121 enum data_pattern
122 {
123 DP_UNKNOWN,
124 DP_VECTOR_3SAME,
125 DP_VECTOR_LONG,
126 DP_VECTOR_WIDE,
127 DP_VECTOR_ACROSS_LANES,
128 };
129
130 static const char significant_operand_index [] =
131 {
132 0, /* DP_UNKNOWN, by default using operand 0. */
133 0, /* DP_VECTOR_3SAME */
134 1, /* DP_VECTOR_LONG */
135 2, /* DP_VECTOR_WIDE */
136 1, /* DP_VECTOR_ACROSS_LANES */
137 };
138
139 /* Given a sequence of qualifiers in QUALIFIERS, determine and return
140 the data pattern.
141 N.B. QUALIFIERS is a possible sequence of qualifiers each of which
142 corresponds to one of a sequence of operands. */
143
144 static enum data_pattern
145 get_data_pattern (const aarch64_opnd_qualifier_seq_t qualifiers)
146 {
147 if (vector_qualifier_p (qualifiers[0]) == TRUE)
148 {
149 /* e.g. v.4s, v.4s, v.4s
150 or v.4h, v.4h, v.h[3]. */
151 if (qualifiers[0] == qualifiers[1]
152 && vector_qualifier_p (qualifiers[2]) == TRUE
153 && (aarch64_get_qualifier_esize (qualifiers[0])
154 == aarch64_get_qualifier_esize (qualifiers[1]))
155 && (aarch64_get_qualifier_esize (qualifiers[0])
156 == aarch64_get_qualifier_esize (qualifiers[2])))
157 return DP_VECTOR_3SAME;
158 /* e.g. v.8h, v.8b, v.8b.
159 or v.4s, v.4h, v.h[2].
160 or v.8h, v.16b. */
161 if (vector_qualifier_p (qualifiers[1]) == TRUE
162 && aarch64_get_qualifier_esize (qualifiers[0]) != 0
163 && (aarch64_get_qualifier_esize (qualifiers[0])
164 == aarch64_get_qualifier_esize (qualifiers[1]) << 1))
165 return DP_VECTOR_LONG;
166 /* e.g. v.8h, v.8h, v.8b. */
167 if (qualifiers[0] == qualifiers[1]
168 && vector_qualifier_p (qualifiers[2]) == TRUE
169 && aarch64_get_qualifier_esize (qualifiers[0]) != 0
170 && (aarch64_get_qualifier_esize (qualifiers[0])
171 == aarch64_get_qualifier_esize (qualifiers[2]) << 1)
172 && (aarch64_get_qualifier_esize (qualifiers[0])
173 == aarch64_get_qualifier_esize (qualifiers[1])))
174 return DP_VECTOR_WIDE;
175 }
176 else if (fp_qualifier_p (qualifiers[0]) == TRUE)
177 {
178 /* e.g. SADDLV <V><d>, <Vn>.<T>. */
179 if (vector_qualifier_p (qualifiers[1]) == TRUE
180 && qualifiers[2] == AARCH64_OPND_QLF_NIL)
181 return DP_VECTOR_ACROSS_LANES;
182 }
183
184 return DP_UNKNOWN;
185 }
186
187 /* Select the operand to do the encoding/decoding of the 'size:Q' fields in
188 the AdvSIMD instructions. */
189 /* N.B. it is possible to do some optimization that doesn't call
190 get_data_pattern each time when we need to select an operand. We can
191 either buffer the caculated the result or statically generate the data,
192 however, it is not obvious that the optimization will bring significant
193 benefit. */
194
195 int
196 aarch64_select_operand_for_sizeq_field_coding (const aarch64_opcode *opcode)
197 {
198 return
199 significant_operand_index [get_data_pattern (opcode->qualifiers_list[0])];
200 }
201 \f
202 const aarch64_field fields[] =
203 {
204 { 0, 0 }, /* NIL. */
205 { 0, 4 }, /* cond2: condition in truly conditional-executed inst. */
206 { 0, 4 }, /* nzcv: flag bit specifier, encoded in the "nzcv" field. */
207 { 5, 5 }, /* defgh: d:e:f:g:h bits in AdvSIMD modified immediate. */
208 { 16, 3 }, /* abc: a:b:c bits in AdvSIMD modified immediate. */
209 { 5, 19 }, /* imm19: e.g. in CBZ. */
210 { 5, 19 }, /* immhi: e.g. in ADRP. */
211 { 29, 2 }, /* immlo: e.g. in ADRP. */
212 { 22, 2 }, /* size: in most AdvSIMD and floating-point instructions. */
213 { 10, 2 }, /* vldst_size: size field in the AdvSIMD load/store inst. */
214 { 29, 1 }, /* op: in AdvSIMD modified immediate instructions. */
215 { 30, 1 }, /* Q: in most AdvSIMD instructions. */
216 { 0, 5 }, /* Rt: in load/store instructions. */
217 { 0, 5 }, /* Rd: in many integer instructions. */
218 { 5, 5 }, /* Rn: in many integer instructions. */
219 { 10, 5 }, /* Rt2: in load/store pair instructions. */
220 { 10, 5 }, /* Ra: in fp instructions. */
221 { 5, 3 }, /* op2: in the system instructions. */
222 { 8, 4 }, /* CRm: in the system instructions. */
223 { 12, 4 }, /* CRn: in the system instructions. */
224 { 16, 3 }, /* op1: in the system instructions. */
225 { 19, 2 }, /* op0: in the system instructions. */
226 { 10, 3 }, /* imm3: in add/sub extended reg instructions. */
227 { 12, 4 }, /* cond: condition flags as a source operand. */
228 { 12, 4 }, /* opcode: in advsimd load/store instructions. */
229 { 12, 4 }, /* cmode: in advsimd modified immediate instructions. */
230 { 13, 3 }, /* asisdlso_opcode: opcode in advsimd ld/st single element. */
231 { 13, 2 }, /* len: in advsimd tbl/tbx instructions. */
232 { 16, 5 }, /* Rm: in ld/st reg offset and some integer inst. */
233 { 16, 5 }, /* Rs: in load/store exclusive instructions. */
234 { 13, 3 }, /* option: in ld/st reg offset + add/sub extended reg inst. */
235 { 12, 1 }, /* S: in load/store reg offset instructions. */
236 { 21, 2 }, /* hw: in move wide constant instructions. */
237 { 22, 2 }, /* opc: in load/store reg offset instructions. */
238 { 23, 1 }, /* opc1: in load/store reg offset instructions. */
239 { 22, 2 }, /* shift: in add/sub reg/imm shifted instructions. */
240 { 22, 2 }, /* type: floating point type field in fp data inst. */
241 { 30, 2 }, /* ldst_size: size field in ld/st reg offset inst. */
242 { 10, 6 }, /* imm6: in add/sub reg shifted instructions. */
243 { 11, 4 }, /* imm4: in advsimd ext and advsimd ins instructions. */
244 { 16, 5 }, /* imm5: in conditional compare (immediate) instructions. */
245 { 15, 7 }, /* imm7: in load/store pair pre/post index instructions. */
246 { 13, 8 }, /* imm8: in floating-point scalar move immediate inst. */
247 { 12, 9 }, /* imm9: in load/store pre/post index instructions. */
248 { 10, 12 }, /* imm12: in ld/st unsigned imm or add/sub shifted inst. */
249 { 5, 14 }, /* imm14: in test bit and branch instructions. */
250 { 5, 16 }, /* imm16: in exception instructions. */
251 { 0, 26 }, /* imm26: in unconditional branch instructions. */
252 { 10, 6 }, /* imms: in bitfield and logical immediate instructions. */
253 { 16, 6 }, /* immr: in bitfield and logical immediate instructions. */
254 { 16, 3 }, /* immb: in advsimd shift by immediate instructions. */
255 { 19, 4 }, /* immh: in advsimd shift by immediate instructions. */
256 { 22, 1 }, /* S: in LDRAA and LDRAB instructions. */
257 { 22, 1 }, /* N: in logical (immediate) instructions. */
258 { 11, 1 }, /* index: in ld/st inst deciding the pre/post-index. */
259 { 24, 1 }, /* index2: in ld/st pair inst deciding the pre/post-index. */
260 { 31, 1 }, /* sf: in integer data processing instructions. */
261 { 30, 1 }, /* lse_size: in LSE extension atomic instructions. */
262 { 11, 1 }, /* H: in advsimd scalar x indexed element instructions. */
263 { 21, 1 }, /* L: in advsimd scalar x indexed element instructions. */
264 { 20, 1 }, /* M: in advsimd scalar x indexed element instructions. */
265 { 31, 1 }, /* b5: in the test bit and branch instructions. */
266 { 19, 5 }, /* b40: in the test bit and branch instructions. */
267 { 10, 6 }, /* scale: in the fixed-point scalar to fp converting inst. */
268 { 4, 1 }, /* SVE_M_4: Merge/zero select, bit 4. */
269 { 14, 1 }, /* SVE_M_14: Merge/zero select, bit 14. */
270 { 16, 1 }, /* SVE_M_16: Merge/zero select, bit 16. */
271 { 17, 1 }, /* SVE_N: SVE equivalent of N. */
272 { 0, 4 }, /* SVE_Pd: p0-p15, bits [3,0]. */
273 { 10, 3 }, /* SVE_Pg3: p0-p7, bits [12,10]. */
274 { 5, 4 }, /* SVE_Pg4_5: p0-p15, bits [8,5]. */
275 { 10, 4 }, /* SVE_Pg4_10: p0-p15, bits [13,10]. */
276 { 16, 4 }, /* SVE_Pg4_16: p0-p15, bits [19,16]. */
277 { 16, 4 }, /* SVE_Pm: p0-p15, bits [19,16]. */
278 { 5, 4 }, /* SVE_Pn: p0-p15, bits [8,5]. */
279 { 0, 4 }, /* SVE_Pt: p0-p15, bits [3,0]. */
280 { 5, 5 }, /* SVE_Rm: SVE alternative position for Rm. */
281 { 16, 5 }, /* SVE_Rn: SVE alternative position for Rn. */
282 { 0, 5 }, /* SVE_Vd: Scalar SIMD&FP register, bits [4,0]. */
283 { 5, 5 }, /* SVE_Vm: Scalar SIMD&FP register, bits [9,5]. */
284 { 5, 5 }, /* SVE_Vn: Scalar SIMD&FP register, bits [9,5]. */
285 { 5, 5 }, /* SVE_Za_5: SVE vector register, bits [9,5]. */
286 { 16, 5 }, /* SVE_Za_16: SVE vector register, bits [20,16]. */
287 { 0, 5 }, /* SVE_Zd: SVE vector register. bits [4,0]. */
288 { 5, 5 }, /* SVE_Zm_5: SVE vector register, bits [9,5]. */
289 { 16, 5 }, /* SVE_Zm_16: SVE vector register, bits [20,16]. */
290 { 5, 5 }, /* SVE_Zn: SVE vector register, bits [9,5]. */
291 { 0, 5 }, /* SVE_Zt: SVE vector register, bits [4,0]. */
292 { 5, 1 }, /* SVE_i1: single-bit immediate. */
293 { 22, 1 }, /* SVE_i3h: high bit of 3-bit immediate. */
294 { 16, 3 }, /* SVE_imm3: 3-bit immediate field. */
295 { 16, 4 }, /* SVE_imm4: 4-bit immediate field. */
296 { 5, 5 }, /* SVE_imm5: 5-bit immediate field. */
297 { 16, 5 }, /* SVE_imm5b: secondary 5-bit immediate field. */
298 { 16, 6 }, /* SVE_imm6: 6-bit immediate field. */
299 { 14, 7 }, /* SVE_imm7: 7-bit immediate field. */
300 { 5, 8 }, /* SVE_imm8: 8-bit immediate field. */
301 { 5, 9 }, /* SVE_imm9: 9-bit immediate field. */
302 { 11, 6 }, /* SVE_immr: SVE equivalent of immr. */
303 { 5, 6 }, /* SVE_imms: SVE equivalent of imms. */
304 { 10, 2 }, /* SVE_msz: 2-bit shift amount for ADR. */
305 { 5, 5 }, /* SVE_pattern: vector pattern enumeration. */
306 { 0, 4 }, /* SVE_prfop: prefetch operation for SVE PRF[BHWD]. */
307 { 16, 1 }, /* SVE_rot1: 1-bit rotation amount. */
308 { 10, 2 }, /* SVE_rot2: 2-bit rotation amount. */
309 { 22, 1 }, /* SVE_sz: 1-bit element size select. */
310 { 16, 4 }, /* SVE_tsz: triangular size select. */
311 { 22, 2 }, /* SVE_tszh: triangular size select high, bits [23,22]. */
312 { 8, 2 }, /* SVE_tszl_8: triangular size select low, bits [9,8]. */
313 { 19, 2 }, /* SVE_tszl_19: triangular size select low, bits [20,19]. */
314 { 14, 1 }, /* SVE_xs_14: UXTW/SXTW select (bit 14). */
315 { 22, 1 }, /* SVE_xs_22: UXTW/SXTW select (bit 22). */
316 { 11, 2 }, /* rotate1: FCMLA immediate rotate. */
317 { 13, 2 }, /* rotate2: Indexed element FCMLA immediate rotate. */
318 { 12, 1 }, /* rotate3: FCADD immediate rotate. */
319 };
320
321 enum aarch64_operand_class
322 aarch64_get_operand_class (enum aarch64_opnd type)
323 {
324 return aarch64_operands[type].op_class;
325 }
326
327 const char *
328 aarch64_get_operand_name (enum aarch64_opnd type)
329 {
330 return aarch64_operands[type].name;
331 }
332
333 /* Get operand description string.
334 This is usually for the diagnosis purpose. */
335 const char *
336 aarch64_get_operand_desc (enum aarch64_opnd type)
337 {
338 return aarch64_operands[type].desc;
339 }
340
341 /* Table of all conditional affixes. */
342 const aarch64_cond aarch64_conds[16] =
343 {
344 {{"eq", "none"}, 0x0},
345 {{"ne", "any"}, 0x1},
346 {{"cs", "hs", "nlast"}, 0x2},
347 {{"cc", "lo", "ul", "last"}, 0x3},
348 {{"mi", "first"}, 0x4},
349 {{"pl", "nfrst"}, 0x5},
350 {{"vs"}, 0x6},
351 {{"vc"}, 0x7},
352 {{"hi", "pmore"}, 0x8},
353 {{"ls", "plast"}, 0x9},
354 {{"ge", "tcont"}, 0xa},
355 {{"lt", "tstop"}, 0xb},
356 {{"gt"}, 0xc},
357 {{"le"}, 0xd},
358 {{"al"}, 0xe},
359 {{"nv"}, 0xf},
360 };
361
362 const aarch64_cond *
363 get_cond_from_value (aarch64_insn value)
364 {
365 assert (value < 16);
366 return &aarch64_conds[(unsigned int) value];
367 }
368
369 const aarch64_cond *
370 get_inverted_cond (const aarch64_cond *cond)
371 {
372 return &aarch64_conds[cond->value ^ 0x1];
373 }
374
375 /* Table describing the operand extension/shifting operators; indexed by
376 enum aarch64_modifier_kind.
377
378 The value column provides the most common values for encoding modifiers,
379 which enables table-driven encoding/decoding for the modifiers. */
380 const struct aarch64_name_value_pair aarch64_operand_modifiers [] =
381 {
382 {"none", 0x0},
383 {"msl", 0x0},
384 {"ror", 0x3},
385 {"asr", 0x2},
386 {"lsr", 0x1},
387 {"lsl", 0x0},
388 {"uxtb", 0x0},
389 {"uxth", 0x1},
390 {"uxtw", 0x2},
391 {"uxtx", 0x3},
392 {"sxtb", 0x4},
393 {"sxth", 0x5},
394 {"sxtw", 0x6},
395 {"sxtx", 0x7},
396 {"mul", 0x0},
397 {"mul vl", 0x0},
398 {NULL, 0},
399 };
400
401 enum aarch64_modifier_kind
402 aarch64_get_operand_modifier (const struct aarch64_name_value_pair *desc)
403 {
404 return desc - aarch64_operand_modifiers;
405 }
406
407 aarch64_insn
408 aarch64_get_operand_modifier_value (enum aarch64_modifier_kind kind)
409 {
410 return aarch64_operand_modifiers[kind].value;
411 }
412
413 enum aarch64_modifier_kind
414 aarch64_get_operand_modifier_from_value (aarch64_insn value,
415 bfd_boolean extend_p)
416 {
417 if (extend_p == TRUE)
418 return AARCH64_MOD_UXTB + value;
419 else
420 return AARCH64_MOD_LSL - value;
421 }
422
423 bfd_boolean
424 aarch64_extend_operator_p (enum aarch64_modifier_kind kind)
425 {
426 return (kind > AARCH64_MOD_LSL && kind <= AARCH64_MOD_SXTX)
427 ? TRUE : FALSE;
428 }
429
430 static inline bfd_boolean
431 aarch64_shift_operator_p (enum aarch64_modifier_kind kind)
432 {
433 return (kind >= AARCH64_MOD_ROR && kind <= AARCH64_MOD_LSL)
434 ? TRUE : FALSE;
435 }
436
437 const struct aarch64_name_value_pair aarch64_barrier_options[16] =
438 {
439 { "#0x00", 0x0 },
440 { "oshld", 0x1 },
441 { "oshst", 0x2 },
442 { "osh", 0x3 },
443 { "#0x04", 0x4 },
444 { "nshld", 0x5 },
445 { "nshst", 0x6 },
446 { "nsh", 0x7 },
447 { "#0x08", 0x8 },
448 { "ishld", 0x9 },
449 { "ishst", 0xa },
450 { "ish", 0xb },
451 { "#0x0c", 0xc },
452 { "ld", 0xd },
453 { "st", 0xe },
454 { "sy", 0xf },
455 };
456
457 /* Table describing the operands supported by the aliases of the HINT
458 instruction.
459
460 The name column is the operand that is accepted for the alias. The value
461 column is the hint number of the alias. The list of operands is terminated
462 by NULL in the name column. */
463
464 const struct aarch64_name_value_pair aarch64_hint_options[] =
465 {
466 { "csync", 0x11 }, /* PSB CSYNC. */
467 { NULL, 0x0 },
468 };
469
470 /* op -> op: load = 0 instruction = 1 store = 2
471 l -> level: 1-3
472 t -> temporal: temporal (retained) = 0 non-temporal (streaming) = 1 */
473 #define B(op,l,t) (((op) << 3) | (((l) - 1) << 1) | (t))
474 const struct aarch64_name_value_pair aarch64_prfops[32] =
475 {
476 { "pldl1keep", B(0, 1, 0) },
477 { "pldl1strm", B(0, 1, 1) },
478 { "pldl2keep", B(0, 2, 0) },
479 { "pldl2strm", B(0, 2, 1) },
480 { "pldl3keep", B(0, 3, 0) },
481 { "pldl3strm", B(0, 3, 1) },
482 { NULL, 0x06 },
483 { NULL, 0x07 },
484 { "plil1keep", B(1, 1, 0) },
485 { "plil1strm", B(1, 1, 1) },
486 { "plil2keep", B(1, 2, 0) },
487 { "plil2strm", B(1, 2, 1) },
488 { "plil3keep", B(1, 3, 0) },
489 { "plil3strm", B(1, 3, 1) },
490 { NULL, 0x0e },
491 { NULL, 0x0f },
492 { "pstl1keep", B(2, 1, 0) },
493 { "pstl1strm", B(2, 1, 1) },
494 { "pstl2keep", B(2, 2, 0) },
495 { "pstl2strm", B(2, 2, 1) },
496 { "pstl3keep", B(2, 3, 0) },
497 { "pstl3strm", B(2, 3, 1) },
498 { NULL, 0x16 },
499 { NULL, 0x17 },
500 { NULL, 0x18 },
501 { NULL, 0x19 },
502 { NULL, 0x1a },
503 { NULL, 0x1b },
504 { NULL, 0x1c },
505 { NULL, 0x1d },
506 { NULL, 0x1e },
507 { NULL, 0x1f },
508 };
509 #undef B
510 \f
511 /* Utilities on value constraint. */
512
513 static inline int
514 value_in_range_p (int64_t value, int low, int high)
515 {
516 return (value >= low && value <= high) ? 1 : 0;
517 }
518
519 /* Return true if VALUE is a multiple of ALIGN. */
520 static inline int
521 value_aligned_p (int64_t value, int align)
522 {
523 return (value % align) == 0;
524 }
525
526 /* A signed value fits in a field. */
527 static inline int
528 value_fit_signed_field_p (int64_t value, unsigned width)
529 {
530 assert (width < 32);
531 if (width < sizeof (value) * 8)
532 {
533 int64_t lim = (int64_t)1 << (width - 1);
534 if (value >= -lim && value < lim)
535 return 1;
536 }
537 return 0;
538 }
539
540 /* An unsigned value fits in a field. */
541 static inline int
542 value_fit_unsigned_field_p (int64_t value, unsigned width)
543 {
544 assert (width < 32);
545 if (width < sizeof (value) * 8)
546 {
547 int64_t lim = (int64_t)1 << width;
548 if (value >= 0 && value < lim)
549 return 1;
550 }
551 return 0;
552 }
553
554 /* Return 1 if OPERAND is SP or WSP. */
555 int
556 aarch64_stack_pointer_p (const aarch64_opnd_info *operand)
557 {
558 return ((aarch64_get_operand_class (operand->type)
559 == AARCH64_OPND_CLASS_INT_REG)
560 && operand_maybe_stack_pointer (aarch64_operands + operand->type)
561 && operand->reg.regno == 31);
562 }
563
564 /* Return 1 if OPERAND is XZR or WZP. */
565 int
566 aarch64_zero_register_p (const aarch64_opnd_info *operand)
567 {
568 return ((aarch64_get_operand_class (operand->type)
569 == AARCH64_OPND_CLASS_INT_REG)
570 && !operand_maybe_stack_pointer (aarch64_operands + operand->type)
571 && operand->reg.regno == 31);
572 }
573
574 /* Return true if the operand *OPERAND that has the operand code
575 OPERAND->TYPE and been qualified by OPERAND->QUALIFIER can be also
576 qualified by the qualifier TARGET. */
577
578 static inline int
579 operand_also_qualified_p (const struct aarch64_opnd_info *operand,
580 aarch64_opnd_qualifier_t target)
581 {
582 switch (operand->qualifier)
583 {
584 case AARCH64_OPND_QLF_W:
585 if (target == AARCH64_OPND_QLF_WSP && aarch64_stack_pointer_p (operand))
586 return 1;
587 break;
588 case AARCH64_OPND_QLF_X:
589 if (target == AARCH64_OPND_QLF_SP && aarch64_stack_pointer_p (operand))
590 return 1;
591 break;
592 case AARCH64_OPND_QLF_WSP:
593 if (target == AARCH64_OPND_QLF_W
594 && operand_maybe_stack_pointer (aarch64_operands + operand->type))
595 return 1;
596 break;
597 case AARCH64_OPND_QLF_SP:
598 if (target == AARCH64_OPND_QLF_X
599 && operand_maybe_stack_pointer (aarch64_operands + operand->type))
600 return 1;
601 break;
602 default:
603 break;
604 }
605
606 return 0;
607 }
608
609 /* Given qualifier sequence list QSEQ_LIST and the known qualifier KNOWN_QLF
610 for operand KNOWN_IDX, return the expected qualifier for operand IDX.
611
612 Return NIL if more than one expected qualifiers are found. */
613
614 aarch64_opnd_qualifier_t
615 aarch64_get_expected_qualifier (const aarch64_opnd_qualifier_seq_t *qseq_list,
616 int idx,
617 const aarch64_opnd_qualifier_t known_qlf,
618 int known_idx)
619 {
620 int i, saved_i;
621
622 /* Special case.
623
624 When the known qualifier is NIL, we have to assume that there is only
625 one qualifier sequence in the *QSEQ_LIST and return the corresponding
626 qualifier directly. One scenario is that for instruction
627 PRFM <prfop>, [<Xn|SP>, #:lo12:<symbol>]
628 which has only one possible valid qualifier sequence
629 NIL, S_D
630 the caller may pass NIL in KNOWN_QLF to obtain S_D so that it can
631 determine the correct relocation type (i.e. LDST64_LO12) for PRFM.
632
633 Because the qualifier NIL has dual roles in the qualifier sequence:
634 it can mean no qualifier for the operand, or the qualifer sequence is
635 not in use (when all qualifiers in the sequence are NILs), we have to
636 handle this special case here. */
637 if (known_qlf == AARCH64_OPND_NIL)
638 {
639 assert (qseq_list[0][known_idx] == AARCH64_OPND_NIL);
640 return qseq_list[0][idx];
641 }
642
643 for (i = 0, saved_i = -1; i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
644 {
645 if (qseq_list[i][known_idx] == known_qlf)
646 {
647 if (saved_i != -1)
648 /* More than one sequences are found to have KNOWN_QLF at
649 KNOWN_IDX. */
650 return AARCH64_OPND_NIL;
651 saved_i = i;
652 }
653 }
654
655 return qseq_list[saved_i][idx];
656 }
657
658 enum operand_qualifier_kind
659 {
660 OQK_NIL,
661 OQK_OPD_VARIANT,
662 OQK_VALUE_IN_RANGE,
663 OQK_MISC,
664 };
665
666 /* Operand qualifier description. */
667 struct operand_qualifier_data
668 {
669 /* The usage of the three data fields depends on the qualifier kind. */
670 int data0;
671 int data1;
672 int data2;
673 /* Description. */
674 const char *desc;
675 /* Kind. */
676 enum operand_qualifier_kind kind;
677 };
678
679 /* Indexed by the operand qualifier enumerators. */
680 struct operand_qualifier_data aarch64_opnd_qualifiers[] =
681 {
682 {0, 0, 0, "NIL", OQK_NIL},
683
684 /* Operand variant qualifiers.
685 First 3 fields:
686 element size, number of elements and common value for encoding. */
687
688 {4, 1, 0x0, "w", OQK_OPD_VARIANT},
689 {8, 1, 0x1, "x", OQK_OPD_VARIANT},
690 {4, 1, 0x0, "wsp", OQK_OPD_VARIANT},
691 {8, 1, 0x1, "sp", OQK_OPD_VARIANT},
692
693 {1, 1, 0x0, "b", OQK_OPD_VARIANT},
694 {2, 1, 0x1, "h", OQK_OPD_VARIANT},
695 {4, 1, 0x2, "s", OQK_OPD_VARIANT},
696 {8, 1, 0x3, "d", OQK_OPD_VARIANT},
697 {16, 1, 0x4, "q", OQK_OPD_VARIANT},
698
699 {1, 8, 0x0, "8b", OQK_OPD_VARIANT},
700 {1, 16, 0x1, "16b", OQK_OPD_VARIANT},
701 {2, 2, 0x0, "2h", OQK_OPD_VARIANT},
702 {2, 4, 0x2, "4h", OQK_OPD_VARIANT},
703 {2, 8, 0x3, "8h", OQK_OPD_VARIANT},
704 {4, 2, 0x4, "2s", OQK_OPD_VARIANT},
705 {4, 4, 0x5, "4s", OQK_OPD_VARIANT},
706 {8, 1, 0x6, "1d", OQK_OPD_VARIANT},
707 {8, 2, 0x7, "2d", OQK_OPD_VARIANT},
708 {16, 1, 0x8, "1q", OQK_OPD_VARIANT},
709
710 {0, 0, 0, "z", OQK_OPD_VARIANT},
711 {0, 0, 0, "m", OQK_OPD_VARIANT},
712
713 /* Qualifiers constraining the value range.
714 First 3 fields:
715 Lower bound, higher bound, unused. */
716
717 {0, 15, 0, "CR", OQK_VALUE_IN_RANGE},
718 {0, 7, 0, "imm_0_7" , OQK_VALUE_IN_RANGE},
719 {0, 15, 0, "imm_0_15", OQK_VALUE_IN_RANGE},
720 {0, 31, 0, "imm_0_31", OQK_VALUE_IN_RANGE},
721 {0, 63, 0, "imm_0_63", OQK_VALUE_IN_RANGE},
722 {1, 32, 0, "imm_1_32", OQK_VALUE_IN_RANGE},
723 {1, 64, 0, "imm_1_64", OQK_VALUE_IN_RANGE},
724
725 /* Qualifiers for miscellaneous purpose.
726 First 3 fields:
727 unused, unused and unused. */
728
729 {0, 0, 0, "lsl", 0},
730 {0, 0, 0, "msl", 0},
731
732 {0, 0, 0, "retrieving", 0},
733 };
734
735 static inline bfd_boolean
736 operand_variant_qualifier_p (aarch64_opnd_qualifier_t qualifier)
737 {
738 return (aarch64_opnd_qualifiers[qualifier].kind == OQK_OPD_VARIANT)
739 ? TRUE : FALSE;
740 }
741
742 static inline bfd_boolean
743 qualifier_value_in_range_constraint_p (aarch64_opnd_qualifier_t qualifier)
744 {
745 return (aarch64_opnd_qualifiers[qualifier].kind == OQK_VALUE_IN_RANGE)
746 ? TRUE : FALSE;
747 }
748
749 const char*
750 aarch64_get_qualifier_name (aarch64_opnd_qualifier_t qualifier)
751 {
752 return aarch64_opnd_qualifiers[qualifier].desc;
753 }
754
755 /* Given an operand qualifier, return the expected data element size
756 of a qualified operand. */
757 unsigned char
758 aarch64_get_qualifier_esize (aarch64_opnd_qualifier_t qualifier)
759 {
760 assert (operand_variant_qualifier_p (qualifier) == TRUE);
761 return aarch64_opnd_qualifiers[qualifier].data0;
762 }
763
764 unsigned char
765 aarch64_get_qualifier_nelem (aarch64_opnd_qualifier_t qualifier)
766 {
767 assert (operand_variant_qualifier_p (qualifier) == TRUE);
768 return aarch64_opnd_qualifiers[qualifier].data1;
769 }
770
771 aarch64_insn
772 aarch64_get_qualifier_standard_value (aarch64_opnd_qualifier_t qualifier)
773 {
774 assert (operand_variant_qualifier_p (qualifier) == TRUE);
775 return aarch64_opnd_qualifiers[qualifier].data2;
776 }
777
778 static int
779 get_lower_bound (aarch64_opnd_qualifier_t qualifier)
780 {
781 assert (qualifier_value_in_range_constraint_p (qualifier) == TRUE);
782 return aarch64_opnd_qualifiers[qualifier].data0;
783 }
784
785 static int
786 get_upper_bound (aarch64_opnd_qualifier_t qualifier)
787 {
788 assert (qualifier_value_in_range_constraint_p (qualifier) == TRUE);
789 return aarch64_opnd_qualifiers[qualifier].data1;
790 }
791
792 #ifdef DEBUG_AARCH64
793 void
794 aarch64_verbose (const char *str, ...)
795 {
796 va_list ap;
797 va_start (ap, str);
798 printf ("#### ");
799 vprintf (str, ap);
800 printf ("\n");
801 va_end (ap);
802 }
803
804 static inline void
805 dump_qualifier_sequence (const aarch64_opnd_qualifier_t *qualifier)
806 {
807 int i;
808 printf ("#### \t");
809 for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i, ++qualifier)
810 printf ("%s,", aarch64_get_qualifier_name (*qualifier));
811 printf ("\n");
812 }
813
814 static void
815 dump_match_qualifiers (const struct aarch64_opnd_info *opnd,
816 const aarch64_opnd_qualifier_t *qualifier)
817 {
818 int i;
819 aarch64_opnd_qualifier_t curr[AARCH64_MAX_OPND_NUM];
820
821 aarch64_verbose ("dump_match_qualifiers:");
822 for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
823 curr[i] = opnd[i].qualifier;
824 dump_qualifier_sequence (curr);
825 aarch64_verbose ("against");
826 dump_qualifier_sequence (qualifier);
827 }
828 #endif /* DEBUG_AARCH64 */
829
830 /* TODO improve this, we can have an extra field at the runtime to
831 store the number of operands rather than calculating it every time. */
832
833 int
834 aarch64_num_of_operands (const aarch64_opcode *opcode)
835 {
836 int i = 0;
837 const enum aarch64_opnd *opnds = opcode->operands;
838 while (opnds[i++] != AARCH64_OPND_NIL)
839 ;
840 --i;
841 assert (i >= 0 && i <= AARCH64_MAX_OPND_NUM);
842 return i;
843 }
844
845 /* Find the best matched qualifier sequence in *QUALIFIERS_LIST for INST.
846 If succeeds, fill the found sequence in *RET, return 1; otherwise return 0.
847
848 N.B. on the entry, it is very likely that only some operands in *INST
849 have had their qualifiers been established.
850
851 If STOP_AT is not -1, the function will only try to match
852 the qualifier sequence for operands before and including the operand
853 of index STOP_AT; and on success *RET will only be filled with the first
854 (STOP_AT+1) qualifiers.
855
856 A couple examples of the matching algorithm:
857
858 X,W,NIL should match
859 X,W,NIL
860
861 NIL,NIL should match
862 X ,NIL
863
864 Apart from serving the main encoding routine, this can also be called
865 during or after the operand decoding. */
866
867 int
868 aarch64_find_best_match (const aarch64_inst *inst,
869 const aarch64_opnd_qualifier_seq_t *qualifiers_list,
870 int stop_at, aarch64_opnd_qualifier_t *ret)
871 {
872 int found = 0;
873 int i, num_opnds;
874 const aarch64_opnd_qualifier_t *qualifiers;
875
876 num_opnds = aarch64_num_of_operands (inst->opcode);
877 if (num_opnds == 0)
878 {
879 DEBUG_TRACE ("SUCCEED: no operand");
880 return 1;
881 }
882
883 if (stop_at < 0 || stop_at >= num_opnds)
884 stop_at = num_opnds - 1;
885
886 /* For each pattern. */
887 for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i, ++qualifiers_list)
888 {
889 int j;
890 qualifiers = *qualifiers_list;
891
892 /* Start as positive. */
893 found = 1;
894
895 DEBUG_TRACE ("%d", i);
896 #ifdef DEBUG_AARCH64
897 if (debug_dump)
898 dump_match_qualifiers (inst->operands, qualifiers);
899 #endif
900
901 /* Most opcodes has much fewer patterns in the list.
902 First NIL qualifier indicates the end in the list. */
903 if (empty_qualifier_sequence_p (qualifiers) == TRUE)
904 {
905 DEBUG_TRACE_IF (i == 0, "SUCCEED: empty qualifier list");
906 if (i)
907 found = 0;
908 break;
909 }
910
911 for (j = 0; j < num_opnds && j <= stop_at; ++j, ++qualifiers)
912 {
913 if (inst->operands[j].qualifier == AARCH64_OPND_QLF_NIL)
914 {
915 /* Either the operand does not have qualifier, or the qualifier
916 for the operand needs to be deduced from the qualifier
917 sequence.
918 In the latter case, any constraint checking related with
919 the obtained qualifier should be done later in
920 operand_general_constraint_met_p. */
921 continue;
922 }
923 else if (*qualifiers != inst->operands[j].qualifier)
924 {
925 /* Unless the target qualifier can also qualify the operand
926 (which has already had a non-nil qualifier), non-equal
927 qualifiers are generally un-matched. */
928 if (operand_also_qualified_p (inst->operands + j, *qualifiers))
929 continue;
930 else
931 {
932 found = 0;
933 break;
934 }
935 }
936 else
937 continue; /* Equal qualifiers are certainly matched. */
938 }
939
940 /* Qualifiers established. */
941 if (found == 1)
942 break;
943 }
944
945 if (found == 1)
946 {
947 /* Fill the result in *RET. */
948 int j;
949 qualifiers = *qualifiers_list;
950
951 DEBUG_TRACE ("complete qualifiers using list %d", i);
952 #ifdef DEBUG_AARCH64
953 if (debug_dump)
954 dump_qualifier_sequence (qualifiers);
955 #endif
956
957 for (j = 0; j <= stop_at; ++j, ++qualifiers)
958 ret[j] = *qualifiers;
959 for (; j < AARCH64_MAX_OPND_NUM; ++j)
960 ret[j] = AARCH64_OPND_QLF_NIL;
961
962 DEBUG_TRACE ("SUCCESS");
963 return 1;
964 }
965
966 DEBUG_TRACE ("FAIL");
967 return 0;
968 }
969
970 /* Operand qualifier matching and resolving.
971
972 Return 1 if the operand qualifier(s) in *INST match one of the qualifier
973 sequences in INST->OPCODE->qualifiers_list; otherwise return 0.
974
975 if UPDATE_P == TRUE, update the qualifier(s) in *INST after the matching
976 succeeds. */
977
978 static int
979 match_operands_qualifier (aarch64_inst *inst, bfd_boolean update_p)
980 {
981 int i, nops;
982 aarch64_opnd_qualifier_seq_t qualifiers;
983
984 if (!aarch64_find_best_match (inst, inst->opcode->qualifiers_list, -1,
985 qualifiers))
986 {
987 DEBUG_TRACE ("matching FAIL");
988 return 0;
989 }
990
991 if (inst->opcode->flags & F_STRICT)
992 {
993 /* Require an exact qualifier match, even for NIL qualifiers. */
994 nops = aarch64_num_of_operands (inst->opcode);
995 for (i = 0; i < nops; ++i)
996 if (inst->operands[i].qualifier != qualifiers[i])
997 return FALSE;
998 }
999
1000 /* Update the qualifiers. */
1001 if (update_p == TRUE)
1002 for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
1003 {
1004 if (inst->opcode->operands[i] == AARCH64_OPND_NIL)
1005 break;
1006 DEBUG_TRACE_IF (inst->operands[i].qualifier != qualifiers[i],
1007 "update %s with %s for operand %d",
1008 aarch64_get_qualifier_name (inst->operands[i].qualifier),
1009 aarch64_get_qualifier_name (qualifiers[i]), i);
1010 inst->operands[i].qualifier = qualifiers[i];
1011 }
1012
1013 DEBUG_TRACE ("matching SUCCESS");
1014 return 1;
1015 }
1016
1017 /* Return TRUE if VALUE is a wide constant that can be moved into a general
1018 register by MOVZ.
1019
1020 IS32 indicates whether value is a 32-bit immediate or not.
1021 If SHIFT_AMOUNT is not NULL, on the return of TRUE, the logical left shift
1022 amount will be returned in *SHIFT_AMOUNT. */
1023
1024 bfd_boolean
1025 aarch64_wide_constant_p (int64_t value, int is32, unsigned int *shift_amount)
1026 {
1027 int amount;
1028
1029 DEBUG_TRACE ("enter with 0x%" PRIx64 "(%" PRIi64 ")", value, value);
1030
1031 if (is32)
1032 {
1033 /* Allow all zeros or all ones in top 32-bits, so that
1034 32-bit constant expressions like ~0x80000000 are
1035 permitted. */
1036 uint64_t ext = value;
1037 if (ext >> 32 != 0 && ext >> 32 != (uint64_t) 0xffffffff)
1038 /* Immediate out of range. */
1039 return FALSE;
1040 value &= (int64_t) 0xffffffff;
1041 }
1042
1043 /* first, try movz then movn */
1044 amount = -1;
1045 if ((value & ((int64_t) 0xffff << 0)) == value)
1046 amount = 0;
1047 else if ((value & ((int64_t) 0xffff << 16)) == value)
1048 amount = 16;
1049 else if (!is32 && (value & ((int64_t) 0xffff << 32)) == value)
1050 amount = 32;
1051 else if (!is32 && (value & ((int64_t) 0xffff << 48)) == value)
1052 amount = 48;
1053
1054 if (amount == -1)
1055 {
1056 DEBUG_TRACE ("exit FALSE with 0x%" PRIx64 "(%" PRIi64 ")", value, value);
1057 return FALSE;
1058 }
1059
1060 if (shift_amount != NULL)
1061 *shift_amount = amount;
1062
1063 DEBUG_TRACE ("exit TRUE with amount %d", amount);
1064
1065 return TRUE;
1066 }
1067
1068 /* Build the accepted values for immediate logical SIMD instructions.
1069
1070 The standard encodings of the immediate value are:
1071 N imms immr SIMD size R S
1072 1 ssssss rrrrrr 64 UInt(rrrrrr) UInt(ssssss)
1073 0 0sssss 0rrrrr 32 UInt(rrrrr) UInt(sssss)
1074 0 10ssss 00rrrr 16 UInt(rrrr) UInt(ssss)
1075 0 110sss 000rrr 8 UInt(rrr) UInt(sss)
1076 0 1110ss 0000rr 4 UInt(rr) UInt(ss)
1077 0 11110s 00000r 2 UInt(r) UInt(s)
1078 where all-ones value of S is reserved.
1079
1080 Let's call E the SIMD size.
1081
1082 The immediate value is: S+1 bits '1' rotated to the right by R.
1083
1084 The total of valid encodings is 64*63 + 32*31 + ... + 2*1 = 5334
1085 (remember S != E - 1). */
1086
1087 #define TOTAL_IMM_NB 5334
1088
1089 typedef struct
1090 {
1091 uint64_t imm;
1092 aarch64_insn encoding;
1093 } simd_imm_encoding;
1094
1095 static simd_imm_encoding simd_immediates[TOTAL_IMM_NB];
1096
1097 static int
1098 simd_imm_encoding_cmp(const void *i1, const void *i2)
1099 {
1100 const simd_imm_encoding *imm1 = (const simd_imm_encoding *)i1;
1101 const simd_imm_encoding *imm2 = (const simd_imm_encoding *)i2;
1102
1103 if (imm1->imm < imm2->imm)
1104 return -1;
1105 if (imm1->imm > imm2->imm)
1106 return +1;
1107 return 0;
1108 }
1109
1110 /* immediate bitfield standard encoding
1111 imm13<12> imm13<5:0> imm13<11:6> SIMD size R S
1112 1 ssssss rrrrrr 64 rrrrrr ssssss
1113 0 0sssss 0rrrrr 32 rrrrr sssss
1114 0 10ssss 00rrrr 16 rrrr ssss
1115 0 110sss 000rrr 8 rrr sss
1116 0 1110ss 0000rr 4 rr ss
1117 0 11110s 00000r 2 r s */
1118 static inline int
1119 encode_immediate_bitfield (int is64, uint32_t s, uint32_t r)
1120 {
1121 return (is64 << 12) | (r << 6) | s;
1122 }
1123
1124 static void
1125 build_immediate_table (void)
1126 {
1127 uint32_t log_e, e, s, r, s_mask;
1128 uint64_t mask, imm;
1129 int nb_imms;
1130 int is64;
1131
1132 nb_imms = 0;
1133 for (log_e = 1; log_e <= 6; log_e++)
1134 {
1135 /* Get element size. */
1136 e = 1u << log_e;
1137 if (log_e == 6)
1138 {
1139 is64 = 1;
1140 mask = 0xffffffffffffffffull;
1141 s_mask = 0;
1142 }
1143 else
1144 {
1145 is64 = 0;
1146 mask = (1ull << e) - 1;
1147 /* log_e s_mask
1148 1 ((1 << 4) - 1) << 2 = 111100
1149 2 ((1 << 3) - 1) << 3 = 111000
1150 3 ((1 << 2) - 1) << 4 = 110000
1151 4 ((1 << 1) - 1) << 5 = 100000
1152 5 ((1 << 0) - 1) << 6 = 000000 */
1153 s_mask = ((1u << (5 - log_e)) - 1) << (log_e + 1);
1154 }
1155 for (s = 0; s < e - 1; s++)
1156 for (r = 0; r < e; r++)
1157 {
1158 /* s+1 consecutive bits to 1 (s < 63) */
1159 imm = (1ull << (s + 1)) - 1;
1160 /* rotate right by r */
1161 if (r != 0)
1162 imm = (imm >> r) | ((imm << (e - r)) & mask);
1163 /* replicate the constant depending on SIMD size */
1164 switch (log_e)
1165 {
1166 case 1: imm = (imm << 2) | imm;
1167 /* Fall through. */
1168 case 2: imm = (imm << 4) | imm;
1169 /* Fall through. */
1170 case 3: imm = (imm << 8) | imm;
1171 /* Fall through. */
1172 case 4: imm = (imm << 16) | imm;
1173 /* Fall through. */
1174 case 5: imm = (imm << 32) | imm;
1175 /* Fall through. */
1176 case 6: break;
1177 default: abort ();
1178 }
1179 simd_immediates[nb_imms].imm = imm;
1180 simd_immediates[nb_imms].encoding =
1181 encode_immediate_bitfield(is64, s | s_mask, r);
1182 nb_imms++;
1183 }
1184 }
1185 assert (nb_imms == TOTAL_IMM_NB);
1186 qsort(simd_immediates, nb_imms,
1187 sizeof(simd_immediates[0]), simd_imm_encoding_cmp);
1188 }
1189
1190 /* Return TRUE if VALUE is a valid logical immediate, i.e. bitmask, that can
1191 be accepted by logical (immediate) instructions
1192 e.g. ORR <Xd|SP>, <Xn>, #<imm>.
1193
1194 ESIZE is the number of bytes in the decoded immediate value.
1195 If ENCODING is not NULL, on the return of TRUE, the standard encoding for
1196 VALUE will be returned in *ENCODING. */
1197
1198 bfd_boolean
1199 aarch64_logical_immediate_p (uint64_t value, int esize, aarch64_insn *encoding)
1200 {
1201 simd_imm_encoding imm_enc;
1202 const simd_imm_encoding *imm_encoding;
1203 static bfd_boolean initialized = FALSE;
1204 uint64_t upper;
1205 int i;
1206
1207 DEBUG_TRACE ("enter with 0x%" PRIx64 "(%" PRIi64 "), esize: %d", value,
1208 value, esize);
1209
1210 if (!initialized)
1211 {
1212 build_immediate_table ();
1213 initialized = TRUE;
1214 }
1215
1216 /* Allow all zeros or all ones in top bits, so that
1217 constant expressions like ~1 are permitted. */
1218 upper = (uint64_t) -1 << (esize * 4) << (esize * 4);
1219 if ((value & ~upper) != value && (value | upper) != value)
1220 return FALSE;
1221
1222 /* Replicate to a full 64-bit value. */
1223 value &= ~upper;
1224 for (i = esize * 8; i < 64; i *= 2)
1225 value |= (value << i);
1226
1227 imm_enc.imm = value;
1228 imm_encoding = (const simd_imm_encoding *)
1229 bsearch(&imm_enc, simd_immediates, TOTAL_IMM_NB,
1230 sizeof(simd_immediates[0]), simd_imm_encoding_cmp);
1231 if (imm_encoding == NULL)
1232 {
1233 DEBUG_TRACE ("exit with FALSE");
1234 return FALSE;
1235 }
1236 if (encoding != NULL)
1237 *encoding = imm_encoding->encoding;
1238 DEBUG_TRACE ("exit with TRUE");
1239 return TRUE;
1240 }
1241
1242 /* If 64-bit immediate IMM is in the format of
1243 "aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffffgggggggghhhhhhhh",
1244 where a, b, c, d, e, f, g and h are independently 0 or 1, return an integer
1245 of value "abcdefgh". Otherwise return -1. */
1246 int
1247 aarch64_shrink_expanded_imm8 (uint64_t imm)
1248 {
1249 int i, ret;
1250 uint32_t byte;
1251
1252 ret = 0;
1253 for (i = 0; i < 8; i++)
1254 {
1255 byte = (imm >> (8 * i)) & 0xff;
1256 if (byte == 0xff)
1257 ret |= 1 << i;
1258 else if (byte != 0x00)
1259 return -1;
1260 }
1261 return ret;
1262 }
1263
1264 /* Utility inline functions for operand_general_constraint_met_p. */
1265
1266 static inline void
1267 set_error (aarch64_operand_error *mismatch_detail,
1268 enum aarch64_operand_error_kind kind, int idx,
1269 const char* error)
1270 {
1271 if (mismatch_detail == NULL)
1272 return;
1273 mismatch_detail->kind = kind;
1274 mismatch_detail->index = idx;
1275 mismatch_detail->error = error;
1276 }
1277
1278 static inline void
1279 set_syntax_error (aarch64_operand_error *mismatch_detail, int idx,
1280 const char* error)
1281 {
1282 if (mismatch_detail == NULL)
1283 return;
1284 set_error (mismatch_detail, AARCH64_OPDE_SYNTAX_ERROR, idx, error);
1285 }
1286
1287 static inline void
1288 set_out_of_range_error (aarch64_operand_error *mismatch_detail,
1289 int idx, int lower_bound, int upper_bound,
1290 const char* error)
1291 {
1292 if (mismatch_detail == NULL)
1293 return;
1294 set_error (mismatch_detail, AARCH64_OPDE_OUT_OF_RANGE, idx, error);
1295 mismatch_detail->data[0] = lower_bound;
1296 mismatch_detail->data[1] = upper_bound;
1297 }
1298
1299 static inline void
1300 set_imm_out_of_range_error (aarch64_operand_error *mismatch_detail,
1301 int idx, int lower_bound, int upper_bound)
1302 {
1303 if (mismatch_detail == NULL)
1304 return;
1305 set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1306 _("immediate value"));
1307 }
1308
1309 static inline void
1310 set_offset_out_of_range_error (aarch64_operand_error *mismatch_detail,
1311 int idx, int lower_bound, int upper_bound)
1312 {
1313 if (mismatch_detail == NULL)
1314 return;
1315 set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1316 _("immediate offset"));
1317 }
1318
1319 static inline void
1320 set_regno_out_of_range_error (aarch64_operand_error *mismatch_detail,
1321 int idx, int lower_bound, int upper_bound)
1322 {
1323 if (mismatch_detail == NULL)
1324 return;
1325 set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1326 _("register number"));
1327 }
1328
1329 static inline void
1330 set_elem_idx_out_of_range_error (aarch64_operand_error *mismatch_detail,
1331 int idx, int lower_bound, int upper_bound)
1332 {
1333 if (mismatch_detail == NULL)
1334 return;
1335 set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1336 _("register element index"));
1337 }
1338
1339 static inline void
1340 set_sft_amount_out_of_range_error (aarch64_operand_error *mismatch_detail,
1341 int idx, int lower_bound, int upper_bound)
1342 {
1343 if (mismatch_detail == NULL)
1344 return;
1345 set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1346 _("shift amount"));
1347 }
1348
1349 /* Report that the MUL modifier in operand IDX should be in the range
1350 [LOWER_BOUND, UPPER_BOUND]. */
1351 static inline void
1352 set_multiplier_out_of_range_error (aarch64_operand_error *mismatch_detail,
1353 int idx, int lower_bound, int upper_bound)
1354 {
1355 if (mismatch_detail == NULL)
1356 return;
1357 set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1358 _("multiplier"));
1359 }
1360
1361 static inline void
1362 set_unaligned_error (aarch64_operand_error *mismatch_detail, int idx,
1363 int alignment)
1364 {
1365 if (mismatch_detail == NULL)
1366 return;
1367 set_error (mismatch_detail, AARCH64_OPDE_UNALIGNED, idx, NULL);
1368 mismatch_detail->data[0] = alignment;
1369 }
1370
1371 static inline void
1372 set_reg_list_error (aarch64_operand_error *mismatch_detail, int idx,
1373 int expected_num)
1374 {
1375 if (mismatch_detail == NULL)
1376 return;
1377 set_error (mismatch_detail, AARCH64_OPDE_REG_LIST, idx, NULL);
1378 mismatch_detail->data[0] = expected_num;
1379 }
1380
1381 static inline void
1382 set_other_error (aarch64_operand_error *mismatch_detail, int idx,
1383 const char* error)
1384 {
1385 if (mismatch_detail == NULL)
1386 return;
1387 set_error (mismatch_detail, AARCH64_OPDE_OTHER_ERROR, idx, error);
1388 }
1389
1390 /* General constraint checking based on operand code.
1391
1392 Return 1 if OPNDS[IDX] meets the general constraint of operand code TYPE
1393 as the IDXth operand of opcode OPCODE. Otherwise return 0.
1394
1395 This function has to be called after the qualifiers for all operands
1396 have been resolved.
1397
1398 Mismatching error message is returned in *MISMATCH_DETAIL upon request,
1399 i.e. when MISMATCH_DETAIL is non-NULL. This avoids the generation
1400 of error message during the disassembling where error message is not
1401 wanted. We avoid the dynamic construction of strings of error messages
1402 here (i.e. in libopcodes), as it is costly and complicated; instead, we
1403 use a combination of error code, static string and some integer data to
1404 represent an error. */
1405
1406 static int
1407 operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx,
1408 enum aarch64_opnd type,
1409 const aarch64_opcode *opcode,
1410 aarch64_operand_error *mismatch_detail)
1411 {
1412 unsigned num, modifiers, shift;
1413 unsigned char size;
1414 int64_t imm, min_value, max_value;
1415 uint64_t uvalue, mask;
1416 const aarch64_opnd_info *opnd = opnds + idx;
1417 aarch64_opnd_qualifier_t qualifier = opnd->qualifier;
1418
1419 assert (opcode->operands[idx] == opnd->type && opnd->type == type);
1420
1421 switch (aarch64_operands[type].op_class)
1422 {
1423 case AARCH64_OPND_CLASS_INT_REG:
1424 /* Check pair reg constraints for cas* instructions. */
1425 if (type == AARCH64_OPND_PAIRREG)
1426 {
1427 assert (idx == 1 || idx == 3);
1428 if (opnds[idx - 1].reg.regno % 2 != 0)
1429 {
1430 set_syntax_error (mismatch_detail, idx - 1,
1431 _("reg pair must start from even reg"));
1432 return 0;
1433 }
1434 if (opnds[idx].reg.regno != opnds[idx - 1].reg.regno + 1)
1435 {
1436 set_syntax_error (mismatch_detail, idx,
1437 _("reg pair must be contiguous"));
1438 return 0;
1439 }
1440 break;
1441 }
1442
1443 /* <Xt> may be optional in some IC and TLBI instructions. */
1444 if (type == AARCH64_OPND_Rt_SYS)
1445 {
1446 assert (idx == 1 && (aarch64_get_operand_class (opnds[0].type)
1447 == AARCH64_OPND_CLASS_SYSTEM));
1448 if (opnds[1].present
1449 && !aarch64_sys_ins_reg_has_xt (opnds[0].sysins_op))
1450 {
1451 set_other_error (mismatch_detail, idx, _("extraneous register"));
1452 return 0;
1453 }
1454 if (!opnds[1].present
1455 && aarch64_sys_ins_reg_has_xt (opnds[0].sysins_op))
1456 {
1457 set_other_error (mismatch_detail, idx, _("missing register"));
1458 return 0;
1459 }
1460 }
1461 switch (qualifier)
1462 {
1463 case AARCH64_OPND_QLF_WSP:
1464 case AARCH64_OPND_QLF_SP:
1465 if (!aarch64_stack_pointer_p (opnd))
1466 {
1467 set_other_error (mismatch_detail, idx,
1468 _("stack pointer register expected"));
1469 return 0;
1470 }
1471 break;
1472 default:
1473 break;
1474 }
1475 break;
1476
1477 case AARCH64_OPND_CLASS_SVE_REG:
1478 switch (type)
1479 {
1480 case AARCH64_OPND_SVE_Zm3_INDEX:
1481 case AARCH64_OPND_SVE_Zm3_22_INDEX:
1482 case AARCH64_OPND_SVE_Zm4_INDEX:
1483 size = get_operand_fields_width (get_operand_from_code (type));
1484 shift = get_operand_specific_data (&aarch64_operands[type]);
1485 mask = (1 << shift) - 1;
1486 if (opnd->reg.regno > mask)
1487 {
1488 assert (mask == 7 || mask == 15);
1489 set_other_error (mismatch_detail, idx,
1490 mask == 15
1491 ? _("z0-z15 expected")
1492 : _("z0-z7 expected"));
1493 return 0;
1494 }
1495 mask = (1 << (size - shift)) - 1;
1496 if (!value_in_range_p (opnd->reglane.index, 0, mask))
1497 {
1498 set_elem_idx_out_of_range_error (mismatch_detail, idx, 0, mask);
1499 return 0;
1500 }
1501 break;
1502
1503 case AARCH64_OPND_SVE_Zn_INDEX:
1504 size = aarch64_get_qualifier_esize (opnd->qualifier);
1505 if (!value_in_range_p (opnd->reglane.index, 0, 64 / size - 1))
1506 {
1507 set_elem_idx_out_of_range_error (mismatch_detail, idx,
1508 0, 64 / size - 1);
1509 return 0;
1510 }
1511 break;
1512
1513 case AARCH64_OPND_SVE_ZnxN:
1514 case AARCH64_OPND_SVE_ZtxN:
1515 if (opnd->reglist.num_regs != get_opcode_dependent_value (opcode))
1516 {
1517 set_other_error (mismatch_detail, idx,
1518 _("invalid register list"));
1519 return 0;
1520 }
1521 break;
1522
1523 default:
1524 break;
1525 }
1526 break;
1527
1528 case AARCH64_OPND_CLASS_PRED_REG:
1529 if (opnd->reg.regno >= 8
1530 && get_operand_fields_width (get_operand_from_code (type)) == 3)
1531 {
1532 set_other_error (mismatch_detail, idx, _("p0-p7 expected"));
1533 return 0;
1534 }
1535 break;
1536
1537 case AARCH64_OPND_CLASS_COND:
1538 if (type == AARCH64_OPND_COND1
1539 && (opnds[idx].cond->value & 0xe) == 0xe)
1540 {
1541 /* Not allow AL or NV. */
1542 set_syntax_error (mismatch_detail, idx, NULL);
1543 }
1544 break;
1545
1546 case AARCH64_OPND_CLASS_ADDRESS:
1547 /* Check writeback. */
1548 switch (opcode->iclass)
1549 {
1550 case ldst_pos:
1551 case ldst_unscaled:
1552 case ldstnapair_offs:
1553 case ldstpair_off:
1554 case ldst_unpriv:
1555 if (opnd->addr.writeback == 1)
1556 {
1557 set_syntax_error (mismatch_detail, idx,
1558 _("unexpected address writeback"));
1559 return 0;
1560 }
1561 break;
1562 case ldst_imm10:
1563 if (opnd->addr.writeback == 1 && opnd->addr.preind != 1)
1564 {
1565 set_syntax_error (mismatch_detail, idx,
1566 _("unexpected address writeback"));
1567 return 0;
1568 }
1569 break;
1570 case ldst_imm9:
1571 case ldstpair_indexed:
1572 case asisdlsep:
1573 case asisdlsop:
1574 if (opnd->addr.writeback == 0)
1575 {
1576 set_syntax_error (mismatch_detail, idx,
1577 _("address writeback expected"));
1578 return 0;
1579 }
1580 break;
1581 default:
1582 assert (opnd->addr.writeback == 0);
1583 break;
1584 }
1585 switch (type)
1586 {
1587 case AARCH64_OPND_ADDR_SIMM7:
1588 /* Scaled signed 7 bits immediate offset. */
1589 /* Get the size of the data element that is accessed, which may be
1590 different from that of the source register size,
1591 e.g. in strb/ldrb. */
1592 size = aarch64_get_qualifier_esize (opnd->qualifier);
1593 if (!value_in_range_p (opnd->addr.offset.imm, -64 * size, 63 * size))
1594 {
1595 set_offset_out_of_range_error (mismatch_detail, idx,
1596 -64 * size, 63 * size);
1597 return 0;
1598 }
1599 if (!value_aligned_p (opnd->addr.offset.imm, size))
1600 {
1601 set_unaligned_error (mismatch_detail, idx, size);
1602 return 0;
1603 }
1604 break;
1605 case AARCH64_OPND_ADDR_SIMM9:
1606 /* Unscaled signed 9 bits immediate offset. */
1607 if (!value_in_range_p (opnd->addr.offset.imm, -256, 255))
1608 {
1609 set_offset_out_of_range_error (mismatch_detail, idx, -256, 255);
1610 return 0;
1611 }
1612 break;
1613
1614 case AARCH64_OPND_ADDR_SIMM9_2:
1615 /* Unscaled signed 9 bits immediate offset, which has to be negative
1616 or unaligned. */
1617 size = aarch64_get_qualifier_esize (qualifier);
1618 if ((value_in_range_p (opnd->addr.offset.imm, 0, 255)
1619 && !value_aligned_p (opnd->addr.offset.imm, size))
1620 || value_in_range_p (opnd->addr.offset.imm, -256, -1))
1621 return 1;
1622 set_other_error (mismatch_detail, idx,
1623 _("negative or unaligned offset expected"));
1624 return 0;
1625
1626 case AARCH64_OPND_ADDR_SIMM10:
1627 /* Scaled signed 10 bits immediate offset. */
1628 if (!value_in_range_p (opnd->addr.offset.imm, -4096, 4088))
1629 {
1630 set_offset_out_of_range_error (mismatch_detail, idx, -4096, 4088);
1631 return 0;
1632 }
1633 if (!value_aligned_p (opnd->addr.offset.imm, 8))
1634 {
1635 set_unaligned_error (mismatch_detail, idx, 8);
1636 return 0;
1637 }
1638 break;
1639
1640 case AARCH64_OPND_SIMD_ADDR_POST:
1641 /* AdvSIMD load/store multiple structures, post-index. */
1642 assert (idx == 1);
1643 if (opnd->addr.offset.is_reg)
1644 {
1645 if (value_in_range_p (opnd->addr.offset.regno, 0, 30))
1646 return 1;
1647 else
1648 {
1649 set_other_error (mismatch_detail, idx,
1650 _("invalid register offset"));
1651 return 0;
1652 }
1653 }
1654 else
1655 {
1656 const aarch64_opnd_info *prev = &opnds[idx-1];
1657 unsigned num_bytes; /* total number of bytes transferred. */
1658 /* The opcode dependent area stores the number of elements in
1659 each structure to be loaded/stored. */
1660 int is_ld1r = get_opcode_dependent_value (opcode) == 1;
1661 if (opcode->operands[0] == AARCH64_OPND_LVt_AL)
1662 /* Special handling of loading single structure to all lane. */
1663 num_bytes = (is_ld1r ? 1 : prev->reglist.num_regs)
1664 * aarch64_get_qualifier_esize (prev->qualifier);
1665 else
1666 num_bytes = prev->reglist.num_regs
1667 * aarch64_get_qualifier_esize (prev->qualifier)
1668 * aarch64_get_qualifier_nelem (prev->qualifier);
1669 if ((int) num_bytes != opnd->addr.offset.imm)
1670 {
1671 set_other_error (mismatch_detail, idx,
1672 _("invalid post-increment amount"));
1673 return 0;
1674 }
1675 }
1676 break;
1677
1678 case AARCH64_OPND_ADDR_REGOFF:
1679 /* Get the size of the data element that is accessed, which may be
1680 different from that of the source register size,
1681 e.g. in strb/ldrb. */
1682 size = aarch64_get_qualifier_esize (opnd->qualifier);
1683 /* It is either no shift or shift by the binary logarithm of SIZE. */
1684 if (opnd->shifter.amount != 0
1685 && opnd->shifter.amount != (int)get_logsz (size))
1686 {
1687 set_other_error (mismatch_detail, idx,
1688 _("invalid shift amount"));
1689 return 0;
1690 }
1691 /* Only UXTW, LSL, SXTW and SXTX are the accepted extending
1692 operators. */
1693 switch (opnd->shifter.kind)
1694 {
1695 case AARCH64_MOD_UXTW:
1696 case AARCH64_MOD_LSL:
1697 case AARCH64_MOD_SXTW:
1698 case AARCH64_MOD_SXTX: break;
1699 default:
1700 set_other_error (mismatch_detail, idx,
1701 _("invalid extend/shift operator"));
1702 return 0;
1703 }
1704 break;
1705
1706 case AARCH64_OPND_ADDR_UIMM12:
1707 imm = opnd->addr.offset.imm;
1708 /* Get the size of the data element that is accessed, which may be
1709 different from that of the source register size,
1710 e.g. in strb/ldrb. */
1711 size = aarch64_get_qualifier_esize (qualifier);
1712 if (!value_in_range_p (opnd->addr.offset.imm, 0, 4095 * size))
1713 {
1714 set_offset_out_of_range_error (mismatch_detail, idx,
1715 0, 4095 * size);
1716 return 0;
1717 }
1718 if (!value_aligned_p (opnd->addr.offset.imm, size))
1719 {
1720 set_unaligned_error (mismatch_detail, idx, size);
1721 return 0;
1722 }
1723 break;
1724
1725 case AARCH64_OPND_ADDR_PCREL14:
1726 case AARCH64_OPND_ADDR_PCREL19:
1727 case AARCH64_OPND_ADDR_PCREL21:
1728 case AARCH64_OPND_ADDR_PCREL26:
1729 imm = opnd->imm.value;
1730 if (operand_need_shift_by_two (get_operand_from_code (type)))
1731 {
1732 /* The offset value in a PC-relative branch instruction is alway
1733 4-byte aligned and is encoded without the lowest 2 bits. */
1734 if (!value_aligned_p (imm, 4))
1735 {
1736 set_unaligned_error (mismatch_detail, idx, 4);
1737 return 0;
1738 }
1739 /* Right shift by 2 so that we can carry out the following check
1740 canonically. */
1741 imm >>= 2;
1742 }
1743 size = get_operand_fields_width (get_operand_from_code (type));
1744 if (!value_fit_signed_field_p (imm, size))
1745 {
1746 set_other_error (mismatch_detail, idx,
1747 _("immediate out of range"));
1748 return 0;
1749 }
1750 break;
1751
1752 case AARCH64_OPND_SVE_ADDR_RI_S4xVL:
1753 case AARCH64_OPND_SVE_ADDR_RI_S4x2xVL:
1754 case AARCH64_OPND_SVE_ADDR_RI_S4x3xVL:
1755 case AARCH64_OPND_SVE_ADDR_RI_S4x4xVL:
1756 min_value = -8;
1757 max_value = 7;
1758 sve_imm_offset_vl:
1759 assert (!opnd->addr.offset.is_reg);
1760 assert (opnd->addr.preind);
1761 num = 1 + get_operand_specific_data (&aarch64_operands[type]);
1762 min_value *= num;
1763 max_value *= num;
1764 if ((opnd->addr.offset.imm != 0 && !opnd->shifter.operator_present)
1765 || (opnd->shifter.operator_present
1766 && opnd->shifter.kind != AARCH64_MOD_MUL_VL))
1767 {
1768 set_other_error (mismatch_detail, idx,
1769 _("invalid addressing mode"));
1770 return 0;
1771 }
1772 if (!value_in_range_p (opnd->addr.offset.imm, min_value, max_value))
1773 {
1774 set_offset_out_of_range_error (mismatch_detail, idx,
1775 min_value, max_value);
1776 return 0;
1777 }
1778 if (!value_aligned_p (opnd->addr.offset.imm, num))
1779 {
1780 set_unaligned_error (mismatch_detail, idx, num);
1781 return 0;
1782 }
1783 break;
1784
1785 case AARCH64_OPND_SVE_ADDR_RI_S6xVL:
1786 min_value = -32;
1787 max_value = 31;
1788 goto sve_imm_offset_vl;
1789
1790 case AARCH64_OPND_SVE_ADDR_RI_S9xVL:
1791 min_value = -256;
1792 max_value = 255;
1793 goto sve_imm_offset_vl;
1794
1795 case AARCH64_OPND_SVE_ADDR_RI_U6:
1796 case AARCH64_OPND_SVE_ADDR_RI_U6x2:
1797 case AARCH64_OPND_SVE_ADDR_RI_U6x4:
1798 case AARCH64_OPND_SVE_ADDR_RI_U6x8:
1799 min_value = 0;
1800 max_value = 63;
1801 sve_imm_offset:
1802 assert (!opnd->addr.offset.is_reg);
1803 assert (opnd->addr.preind);
1804 num = 1 << get_operand_specific_data (&aarch64_operands[type]);
1805 min_value *= num;
1806 max_value *= num;
1807 if (opnd->shifter.operator_present
1808 || opnd->shifter.amount_present)
1809 {
1810 set_other_error (mismatch_detail, idx,
1811 _("invalid addressing mode"));
1812 return 0;
1813 }
1814 if (!value_in_range_p (opnd->addr.offset.imm, min_value, max_value))
1815 {
1816 set_offset_out_of_range_error (mismatch_detail, idx,
1817 min_value, max_value);
1818 return 0;
1819 }
1820 if (!value_aligned_p (opnd->addr.offset.imm, num))
1821 {
1822 set_unaligned_error (mismatch_detail, idx, num);
1823 return 0;
1824 }
1825 break;
1826
1827 case AARCH64_OPND_SVE_ADDR_RI_S4x16:
1828 min_value = -8;
1829 max_value = 7;
1830 goto sve_imm_offset;
1831
1832 case AARCH64_OPND_SVE_ADDR_RR:
1833 case AARCH64_OPND_SVE_ADDR_RR_LSL1:
1834 case AARCH64_OPND_SVE_ADDR_RR_LSL2:
1835 case AARCH64_OPND_SVE_ADDR_RR_LSL3:
1836 case AARCH64_OPND_SVE_ADDR_RX:
1837 case AARCH64_OPND_SVE_ADDR_RX_LSL1:
1838 case AARCH64_OPND_SVE_ADDR_RX_LSL2:
1839 case AARCH64_OPND_SVE_ADDR_RX_LSL3:
1840 case AARCH64_OPND_SVE_ADDR_RZ:
1841 case AARCH64_OPND_SVE_ADDR_RZ_LSL1:
1842 case AARCH64_OPND_SVE_ADDR_RZ_LSL2:
1843 case AARCH64_OPND_SVE_ADDR_RZ_LSL3:
1844 modifiers = 1 << AARCH64_MOD_LSL;
1845 sve_rr_operand:
1846 assert (opnd->addr.offset.is_reg);
1847 assert (opnd->addr.preind);
1848 if ((aarch64_operands[type].flags & OPD_F_NO_ZR) != 0
1849 && opnd->addr.offset.regno == 31)
1850 {
1851 set_other_error (mismatch_detail, idx,
1852 _("index register xzr is not allowed"));
1853 return 0;
1854 }
1855 if (((1 << opnd->shifter.kind) & modifiers) == 0
1856 || (opnd->shifter.amount
1857 != get_operand_specific_data (&aarch64_operands[type])))
1858 {
1859 set_other_error (mismatch_detail, idx,
1860 _("invalid addressing mode"));
1861 return 0;
1862 }
1863 break;
1864
1865 case AARCH64_OPND_SVE_ADDR_RZ_XTW_14:
1866 case AARCH64_OPND_SVE_ADDR_RZ_XTW_22:
1867 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_14:
1868 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_22:
1869 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_14:
1870 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_22:
1871 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_14:
1872 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_22:
1873 modifiers = (1 << AARCH64_MOD_SXTW) | (1 << AARCH64_MOD_UXTW);
1874 goto sve_rr_operand;
1875
1876 case AARCH64_OPND_SVE_ADDR_ZI_U5:
1877 case AARCH64_OPND_SVE_ADDR_ZI_U5x2:
1878 case AARCH64_OPND_SVE_ADDR_ZI_U5x4:
1879 case AARCH64_OPND_SVE_ADDR_ZI_U5x8:
1880 min_value = 0;
1881 max_value = 31;
1882 goto sve_imm_offset;
1883
1884 case AARCH64_OPND_SVE_ADDR_ZZ_LSL:
1885 modifiers = 1 << AARCH64_MOD_LSL;
1886 sve_zz_operand:
1887 assert (opnd->addr.offset.is_reg);
1888 assert (opnd->addr.preind);
1889 if (((1 << opnd->shifter.kind) & modifiers) == 0
1890 || opnd->shifter.amount < 0
1891 || opnd->shifter.amount > 3)
1892 {
1893 set_other_error (mismatch_detail, idx,
1894 _("invalid addressing mode"));
1895 return 0;
1896 }
1897 break;
1898
1899 case AARCH64_OPND_SVE_ADDR_ZZ_SXTW:
1900 modifiers = (1 << AARCH64_MOD_SXTW);
1901 goto sve_zz_operand;
1902
1903 case AARCH64_OPND_SVE_ADDR_ZZ_UXTW:
1904 modifiers = 1 << AARCH64_MOD_UXTW;
1905 goto sve_zz_operand;
1906
1907 default:
1908 break;
1909 }
1910 break;
1911
1912 case AARCH64_OPND_CLASS_SIMD_REGLIST:
1913 if (type == AARCH64_OPND_LEt)
1914 {
1915 /* Get the upper bound for the element index. */
1916 num = 16 / aarch64_get_qualifier_esize (qualifier) - 1;
1917 if (!value_in_range_p (opnd->reglist.index, 0, num))
1918 {
1919 set_elem_idx_out_of_range_error (mismatch_detail, idx, 0, num);
1920 return 0;
1921 }
1922 }
1923 /* The opcode dependent area stores the number of elements in
1924 each structure to be loaded/stored. */
1925 num = get_opcode_dependent_value (opcode);
1926 switch (type)
1927 {
1928 case AARCH64_OPND_LVt:
1929 assert (num >= 1 && num <= 4);
1930 /* Unless LD1/ST1, the number of registers should be equal to that
1931 of the structure elements. */
1932 if (num != 1 && opnd->reglist.num_regs != num)
1933 {
1934 set_reg_list_error (mismatch_detail, idx, num);
1935 return 0;
1936 }
1937 break;
1938 case AARCH64_OPND_LVt_AL:
1939 case AARCH64_OPND_LEt:
1940 assert (num >= 1 && num <= 4);
1941 /* The number of registers should be equal to that of the structure
1942 elements. */
1943 if (opnd->reglist.num_regs != num)
1944 {
1945 set_reg_list_error (mismatch_detail, idx, num);
1946 return 0;
1947 }
1948 break;
1949 default:
1950 break;
1951 }
1952 break;
1953
1954 case AARCH64_OPND_CLASS_IMMEDIATE:
1955 /* Constraint check on immediate operand. */
1956 imm = opnd->imm.value;
1957 /* E.g. imm_0_31 constrains value to be 0..31. */
1958 if (qualifier_value_in_range_constraint_p (qualifier)
1959 && !value_in_range_p (imm, get_lower_bound (qualifier),
1960 get_upper_bound (qualifier)))
1961 {
1962 set_imm_out_of_range_error (mismatch_detail, idx,
1963 get_lower_bound (qualifier),
1964 get_upper_bound (qualifier));
1965 return 0;
1966 }
1967
1968 switch (type)
1969 {
1970 case AARCH64_OPND_AIMM:
1971 if (opnd->shifter.kind != AARCH64_MOD_LSL)
1972 {
1973 set_other_error (mismatch_detail, idx,
1974 _("invalid shift operator"));
1975 return 0;
1976 }
1977 if (opnd->shifter.amount != 0 && opnd->shifter.amount != 12)
1978 {
1979 set_other_error (mismatch_detail, idx,
1980 _("shift amount must be 0 or 12"));
1981 return 0;
1982 }
1983 if (!value_fit_unsigned_field_p (opnd->imm.value, 12))
1984 {
1985 set_other_error (mismatch_detail, idx,
1986 _("immediate out of range"));
1987 return 0;
1988 }
1989 break;
1990
1991 case AARCH64_OPND_HALF:
1992 assert (idx == 1 && opnds[0].type == AARCH64_OPND_Rd);
1993 if (opnd->shifter.kind != AARCH64_MOD_LSL)
1994 {
1995 set_other_error (mismatch_detail, idx,
1996 _("invalid shift operator"));
1997 return 0;
1998 }
1999 size = aarch64_get_qualifier_esize (opnds[0].qualifier);
2000 if (!value_aligned_p (opnd->shifter.amount, 16))
2001 {
2002 set_other_error (mismatch_detail, idx,
2003 _("shift amount must be a multiple of 16"));
2004 return 0;
2005 }
2006 if (!value_in_range_p (opnd->shifter.amount, 0, size * 8 - 16))
2007 {
2008 set_sft_amount_out_of_range_error (mismatch_detail, idx,
2009 0, size * 8 - 16);
2010 return 0;
2011 }
2012 if (opnd->imm.value < 0)
2013 {
2014 set_other_error (mismatch_detail, idx,
2015 _("negative immediate value not allowed"));
2016 return 0;
2017 }
2018 if (!value_fit_unsigned_field_p (opnd->imm.value, 16))
2019 {
2020 set_other_error (mismatch_detail, idx,
2021 _("immediate out of range"));
2022 return 0;
2023 }
2024 break;
2025
2026 case AARCH64_OPND_IMM_MOV:
2027 {
2028 int esize = aarch64_get_qualifier_esize (opnds[0].qualifier);
2029 imm = opnd->imm.value;
2030 assert (idx == 1);
2031 switch (opcode->op)
2032 {
2033 case OP_MOV_IMM_WIDEN:
2034 imm = ~imm;
2035 /* Fall through. */
2036 case OP_MOV_IMM_WIDE:
2037 if (!aarch64_wide_constant_p (imm, esize == 4, NULL))
2038 {
2039 set_other_error (mismatch_detail, idx,
2040 _("immediate out of range"));
2041 return 0;
2042 }
2043 break;
2044 case OP_MOV_IMM_LOG:
2045 if (!aarch64_logical_immediate_p (imm, esize, NULL))
2046 {
2047 set_other_error (mismatch_detail, idx,
2048 _("immediate out of range"));
2049 return 0;
2050 }
2051 break;
2052 default:
2053 assert (0);
2054 return 0;
2055 }
2056 }
2057 break;
2058
2059 case AARCH64_OPND_NZCV:
2060 case AARCH64_OPND_CCMP_IMM:
2061 case AARCH64_OPND_EXCEPTION:
2062 case AARCH64_OPND_UIMM4:
2063 case AARCH64_OPND_UIMM7:
2064 case AARCH64_OPND_UIMM3_OP1:
2065 case AARCH64_OPND_UIMM3_OP2:
2066 case AARCH64_OPND_SVE_UIMM3:
2067 case AARCH64_OPND_SVE_UIMM7:
2068 case AARCH64_OPND_SVE_UIMM8:
2069 case AARCH64_OPND_SVE_UIMM8_53:
2070 size = get_operand_fields_width (get_operand_from_code (type));
2071 assert (size < 32);
2072 if (!value_fit_unsigned_field_p (opnd->imm.value, size))
2073 {
2074 set_imm_out_of_range_error (mismatch_detail, idx, 0,
2075 (1 << size) - 1);
2076 return 0;
2077 }
2078 break;
2079
2080 case AARCH64_OPND_SIMM5:
2081 case AARCH64_OPND_SVE_SIMM5:
2082 case AARCH64_OPND_SVE_SIMM5B:
2083 case AARCH64_OPND_SVE_SIMM6:
2084 case AARCH64_OPND_SVE_SIMM8:
2085 size = get_operand_fields_width (get_operand_from_code (type));
2086 assert (size < 32);
2087 if (!value_fit_signed_field_p (opnd->imm.value, size))
2088 {
2089 set_imm_out_of_range_error (mismatch_detail, idx,
2090 -(1 << (size - 1)),
2091 (1 << (size - 1)) - 1);
2092 return 0;
2093 }
2094 break;
2095
2096 case AARCH64_OPND_WIDTH:
2097 assert (idx > 1 && opnds[idx-1].type == AARCH64_OPND_IMM
2098 && opnds[0].type == AARCH64_OPND_Rd);
2099 size = get_upper_bound (qualifier);
2100 if (opnd->imm.value + opnds[idx-1].imm.value > size)
2101 /* lsb+width <= reg.size */
2102 {
2103 set_imm_out_of_range_error (mismatch_detail, idx, 1,
2104 size - opnds[idx-1].imm.value);
2105 return 0;
2106 }
2107 break;
2108
2109 case AARCH64_OPND_LIMM:
2110 case AARCH64_OPND_SVE_LIMM:
2111 {
2112 int esize = aarch64_get_qualifier_esize (opnds[0].qualifier);
2113 uint64_t uimm = opnd->imm.value;
2114 if (opcode->op == OP_BIC)
2115 uimm = ~uimm;
2116 if (!aarch64_logical_immediate_p (uimm, esize, NULL))
2117 {
2118 set_other_error (mismatch_detail, idx,
2119 _("immediate out of range"));
2120 return 0;
2121 }
2122 }
2123 break;
2124
2125 case AARCH64_OPND_IMM0:
2126 case AARCH64_OPND_FPIMM0:
2127 if (opnd->imm.value != 0)
2128 {
2129 set_other_error (mismatch_detail, idx,
2130 _("immediate zero expected"));
2131 return 0;
2132 }
2133 break;
2134
2135 case AARCH64_OPND_IMM_ROT1:
2136 case AARCH64_OPND_IMM_ROT2:
2137 case AARCH64_OPND_SVE_IMM_ROT2:
2138 if (opnd->imm.value != 0
2139 && opnd->imm.value != 90
2140 && opnd->imm.value != 180
2141 && opnd->imm.value != 270)
2142 {
2143 set_other_error (mismatch_detail, idx,
2144 _("rotate expected to be 0, 90, 180 or 270"));
2145 return 0;
2146 }
2147 break;
2148
2149 case AARCH64_OPND_IMM_ROT3:
2150 case AARCH64_OPND_SVE_IMM_ROT1:
2151 if (opnd->imm.value != 90 && opnd->imm.value != 270)
2152 {
2153 set_other_error (mismatch_detail, idx,
2154 _("rotate expected to be 90 or 270"));
2155 return 0;
2156 }
2157 break;
2158
2159 case AARCH64_OPND_SHLL_IMM:
2160 assert (idx == 2);
2161 size = 8 * aarch64_get_qualifier_esize (opnds[idx - 1].qualifier);
2162 if (opnd->imm.value != size)
2163 {
2164 set_other_error (mismatch_detail, idx,
2165 _("invalid shift amount"));
2166 return 0;
2167 }
2168 break;
2169
2170 case AARCH64_OPND_IMM_VLSL:
2171 size = aarch64_get_qualifier_esize (qualifier);
2172 if (!value_in_range_p (opnd->imm.value, 0, size * 8 - 1))
2173 {
2174 set_imm_out_of_range_error (mismatch_detail, idx, 0,
2175 size * 8 - 1);
2176 return 0;
2177 }
2178 break;
2179
2180 case AARCH64_OPND_IMM_VLSR:
2181 size = aarch64_get_qualifier_esize (qualifier);
2182 if (!value_in_range_p (opnd->imm.value, 1, size * 8))
2183 {
2184 set_imm_out_of_range_error (mismatch_detail, idx, 1, size * 8);
2185 return 0;
2186 }
2187 break;
2188
2189 case AARCH64_OPND_SIMD_IMM:
2190 case AARCH64_OPND_SIMD_IMM_SFT:
2191 /* Qualifier check. */
2192 switch (qualifier)
2193 {
2194 case AARCH64_OPND_QLF_LSL:
2195 if (opnd->shifter.kind != AARCH64_MOD_LSL)
2196 {
2197 set_other_error (mismatch_detail, idx,
2198 _("invalid shift operator"));
2199 return 0;
2200 }
2201 break;
2202 case AARCH64_OPND_QLF_MSL:
2203 if (opnd->shifter.kind != AARCH64_MOD_MSL)
2204 {
2205 set_other_error (mismatch_detail, idx,
2206 _("invalid shift operator"));
2207 return 0;
2208 }
2209 break;
2210 case AARCH64_OPND_QLF_NIL:
2211 if (opnd->shifter.kind != AARCH64_MOD_NONE)
2212 {
2213 set_other_error (mismatch_detail, idx,
2214 _("shift is not permitted"));
2215 return 0;
2216 }
2217 break;
2218 default:
2219 assert (0);
2220 return 0;
2221 }
2222 /* Is the immediate valid? */
2223 assert (idx == 1);
2224 if (aarch64_get_qualifier_esize (opnds[0].qualifier) != 8)
2225 {
2226 /* uimm8 or simm8 */
2227 if (!value_in_range_p (opnd->imm.value, -128, 255))
2228 {
2229 set_imm_out_of_range_error (mismatch_detail, idx, -128, 255);
2230 return 0;
2231 }
2232 }
2233 else if (aarch64_shrink_expanded_imm8 (opnd->imm.value) < 0)
2234 {
2235 /* uimm64 is not
2236 'aaaaaaaabbbbbbbbccccccccddddddddeeeeeeee
2237 ffffffffgggggggghhhhhhhh'. */
2238 set_other_error (mismatch_detail, idx,
2239 _("invalid value for immediate"));
2240 return 0;
2241 }
2242 /* Is the shift amount valid? */
2243 switch (opnd->shifter.kind)
2244 {
2245 case AARCH64_MOD_LSL:
2246 size = aarch64_get_qualifier_esize (opnds[0].qualifier);
2247 if (!value_in_range_p (opnd->shifter.amount, 0, (size - 1) * 8))
2248 {
2249 set_sft_amount_out_of_range_error (mismatch_detail, idx, 0,
2250 (size - 1) * 8);
2251 return 0;
2252 }
2253 if (!value_aligned_p (opnd->shifter.amount, 8))
2254 {
2255 set_unaligned_error (mismatch_detail, idx, 8);
2256 return 0;
2257 }
2258 break;
2259 case AARCH64_MOD_MSL:
2260 /* Only 8 and 16 are valid shift amount. */
2261 if (opnd->shifter.amount != 8 && opnd->shifter.amount != 16)
2262 {
2263 set_other_error (mismatch_detail, idx,
2264 _("shift amount must be 0 or 16"));
2265 return 0;
2266 }
2267 break;
2268 default:
2269 if (opnd->shifter.kind != AARCH64_MOD_NONE)
2270 {
2271 set_other_error (mismatch_detail, idx,
2272 _("invalid shift operator"));
2273 return 0;
2274 }
2275 break;
2276 }
2277 break;
2278
2279 case AARCH64_OPND_FPIMM:
2280 case AARCH64_OPND_SIMD_FPIMM:
2281 case AARCH64_OPND_SVE_FPIMM8:
2282 if (opnd->imm.is_fp == 0)
2283 {
2284 set_other_error (mismatch_detail, idx,
2285 _("floating-point immediate expected"));
2286 return 0;
2287 }
2288 /* The value is expected to be an 8-bit floating-point constant with
2289 sign, 3-bit exponent and normalized 4 bits of precision, encoded
2290 in "a:b:c:d:e:f:g:h" or FLD_imm8 (depending on the type of the
2291 instruction). */
2292 if (!value_in_range_p (opnd->imm.value, 0, 255))
2293 {
2294 set_other_error (mismatch_detail, idx,
2295 _("immediate out of range"));
2296 return 0;
2297 }
2298 if (opnd->shifter.kind != AARCH64_MOD_NONE)
2299 {
2300 set_other_error (mismatch_detail, idx,
2301 _("invalid shift operator"));
2302 return 0;
2303 }
2304 break;
2305
2306 case AARCH64_OPND_SVE_AIMM:
2307 min_value = 0;
2308 sve_aimm:
2309 assert (opnd->shifter.kind == AARCH64_MOD_LSL);
2310 size = aarch64_get_qualifier_esize (opnds[0].qualifier);
2311 mask = ~((uint64_t) -1 << (size * 4) << (size * 4));
2312 uvalue = opnd->imm.value;
2313 shift = opnd->shifter.amount;
2314 if (size == 1)
2315 {
2316 if (shift != 0)
2317 {
2318 set_other_error (mismatch_detail, idx,
2319 _("no shift amount allowed for"
2320 " 8-bit constants"));
2321 return 0;
2322 }
2323 }
2324 else
2325 {
2326 if (shift != 0 && shift != 8)
2327 {
2328 set_other_error (mismatch_detail, idx,
2329 _("shift amount must be 0 or 8"));
2330 return 0;
2331 }
2332 if (shift == 0 && (uvalue & 0xff) == 0)
2333 {
2334 shift = 8;
2335 uvalue = (int64_t) uvalue / 256;
2336 }
2337 }
2338 mask >>= shift;
2339 if ((uvalue & mask) != uvalue && (uvalue | ~mask) != uvalue)
2340 {
2341 set_other_error (mismatch_detail, idx,
2342 _("immediate too big for element size"));
2343 return 0;
2344 }
2345 uvalue = (uvalue - min_value) & mask;
2346 if (uvalue > 0xff)
2347 {
2348 set_other_error (mismatch_detail, idx,
2349 _("invalid arithmetic immediate"));
2350 return 0;
2351 }
2352 break;
2353
2354 case AARCH64_OPND_SVE_ASIMM:
2355 min_value = -128;
2356 goto sve_aimm;
2357
2358 case AARCH64_OPND_SVE_I1_HALF_ONE:
2359 assert (opnd->imm.is_fp);
2360 if (opnd->imm.value != 0x3f000000 && opnd->imm.value != 0x3f800000)
2361 {
2362 set_other_error (mismatch_detail, idx,
2363 _("floating-point value must be 0.5 or 1.0"));
2364 return 0;
2365 }
2366 break;
2367
2368 case AARCH64_OPND_SVE_I1_HALF_TWO:
2369 assert (opnd->imm.is_fp);
2370 if (opnd->imm.value != 0x3f000000 && opnd->imm.value != 0x40000000)
2371 {
2372 set_other_error (mismatch_detail, idx,
2373 _("floating-point value must be 0.5 or 2.0"));
2374 return 0;
2375 }
2376 break;
2377
2378 case AARCH64_OPND_SVE_I1_ZERO_ONE:
2379 assert (opnd->imm.is_fp);
2380 if (opnd->imm.value != 0 && opnd->imm.value != 0x3f800000)
2381 {
2382 set_other_error (mismatch_detail, idx,
2383 _("floating-point value must be 0.0 or 1.0"));
2384 return 0;
2385 }
2386 break;
2387
2388 case AARCH64_OPND_SVE_INV_LIMM:
2389 {
2390 int esize = aarch64_get_qualifier_esize (opnds[0].qualifier);
2391 uint64_t uimm = ~opnd->imm.value;
2392 if (!aarch64_logical_immediate_p (uimm, esize, NULL))
2393 {
2394 set_other_error (mismatch_detail, idx,
2395 _("immediate out of range"));
2396 return 0;
2397 }
2398 }
2399 break;
2400
2401 case AARCH64_OPND_SVE_LIMM_MOV:
2402 {
2403 int esize = aarch64_get_qualifier_esize (opnds[0].qualifier);
2404 uint64_t uimm = opnd->imm.value;
2405 if (!aarch64_logical_immediate_p (uimm, esize, NULL))
2406 {
2407 set_other_error (mismatch_detail, idx,
2408 _("immediate out of range"));
2409 return 0;
2410 }
2411 if (!aarch64_sve_dupm_mov_immediate_p (uimm, esize))
2412 {
2413 set_other_error (mismatch_detail, idx,
2414 _("invalid replicated MOV immediate"));
2415 return 0;
2416 }
2417 }
2418 break;
2419
2420 case AARCH64_OPND_SVE_PATTERN_SCALED:
2421 assert (opnd->shifter.kind == AARCH64_MOD_MUL);
2422 if (!value_in_range_p (opnd->shifter.amount, 1, 16))
2423 {
2424 set_multiplier_out_of_range_error (mismatch_detail, idx, 1, 16);
2425 return 0;
2426 }
2427 break;
2428
2429 case AARCH64_OPND_SVE_SHLIMM_PRED:
2430 case AARCH64_OPND_SVE_SHLIMM_UNPRED:
2431 size = aarch64_get_qualifier_esize (opnds[idx - 1].qualifier);
2432 if (!value_in_range_p (opnd->imm.value, 0, 8 * size - 1))
2433 {
2434 set_imm_out_of_range_error (mismatch_detail, idx,
2435 0, 8 * size - 1);
2436 return 0;
2437 }
2438 break;
2439
2440 case AARCH64_OPND_SVE_SHRIMM_PRED:
2441 case AARCH64_OPND_SVE_SHRIMM_UNPRED:
2442 size = aarch64_get_qualifier_esize (opnds[idx - 1].qualifier);
2443 if (!value_in_range_p (opnd->imm.value, 1, 8 * size))
2444 {
2445 set_imm_out_of_range_error (mismatch_detail, idx, 1, 8 * size);
2446 return 0;
2447 }
2448 break;
2449
2450 default:
2451 break;
2452 }
2453 break;
2454
2455 case AARCH64_OPND_CLASS_SYSTEM:
2456 switch (type)
2457 {
2458 case AARCH64_OPND_PSTATEFIELD:
2459 assert (idx == 0 && opnds[1].type == AARCH64_OPND_UIMM4);
2460 /* MSR UAO, #uimm4
2461 MSR PAN, #uimm4
2462 The immediate must be #0 or #1. */
2463 if ((opnd->pstatefield == 0x03 /* UAO. */
2464 || opnd->pstatefield == 0x04) /* PAN. */
2465 && opnds[1].imm.value > 1)
2466 {
2467 set_imm_out_of_range_error (mismatch_detail, idx, 0, 1);
2468 return 0;
2469 }
2470 /* MSR SPSel, #uimm4
2471 Uses uimm4 as a control value to select the stack pointer: if
2472 bit 0 is set it selects the current exception level's stack
2473 pointer, if bit 0 is clear it selects shared EL0 stack pointer.
2474 Bits 1 to 3 of uimm4 are reserved and should be zero. */
2475 if (opnd->pstatefield == 0x05 /* spsel */ && opnds[1].imm.value > 1)
2476 {
2477 set_imm_out_of_range_error (mismatch_detail, idx, 0, 1);
2478 return 0;
2479 }
2480 break;
2481 default:
2482 break;
2483 }
2484 break;
2485
2486 case AARCH64_OPND_CLASS_SIMD_ELEMENT:
2487 /* Get the upper bound for the element index. */
2488 if (opcode->op == OP_FCMLA_ELEM)
2489 /* FCMLA index range depends on the vector size of other operands
2490 and is halfed because complex numbers take two elements. */
2491 num = aarch64_get_qualifier_nelem (opnds[0].qualifier)
2492 * aarch64_get_qualifier_esize (opnds[0].qualifier) / 2;
2493 else
2494 num = 16;
2495 num = num / aarch64_get_qualifier_esize (qualifier) - 1;
2496
2497 /* Index out-of-range. */
2498 if (!value_in_range_p (opnd->reglane.index, 0, num))
2499 {
2500 set_elem_idx_out_of_range_error (mismatch_detail, idx, 0, num);
2501 return 0;
2502 }
2503 /* SMLAL<Q> <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Ts>[<index>].
2504 <Vm> Is the vector register (V0-V31) or (V0-V15), whose
2505 number is encoded in "size:M:Rm":
2506 size <Vm>
2507 00 RESERVED
2508 01 0:Rm
2509 10 M:Rm
2510 11 RESERVED */
2511 if (type == AARCH64_OPND_Em && qualifier == AARCH64_OPND_QLF_S_H
2512 && !value_in_range_p (opnd->reglane.regno, 0, 15))
2513 {
2514 set_regno_out_of_range_error (mismatch_detail, idx, 0, 15);
2515 return 0;
2516 }
2517 break;
2518
2519 case AARCH64_OPND_CLASS_MODIFIED_REG:
2520 assert (idx == 1 || idx == 2);
2521 switch (type)
2522 {
2523 case AARCH64_OPND_Rm_EXT:
2524 if (!aarch64_extend_operator_p (opnd->shifter.kind)
2525 && opnd->shifter.kind != AARCH64_MOD_LSL)
2526 {
2527 set_other_error (mismatch_detail, idx,
2528 _("extend operator expected"));
2529 return 0;
2530 }
2531 /* It is not optional unless at least one of "Rd" or "Rn" is '11111'
2532 (i.e. SP), in which case it defaults to LSL. The LSL alias is
2533 only valid when "Rd" or "Rn" is '11111', and is preferred in that
2534 case. */
2535 if (!aarch64_stack_pointer_p (opnds + 0)
2536 && (idx != 2 || !aarch64_stack_pointer_p (opnds + 1)))
2537 {
2538 if (!opnd->shifter.operator_present)
2539 {
2540 set_other_error (mismatch_detail, idx,
2541 _("missing extend operator"));
2542 return 0;
2543 }
2544 else if (opnd->shifter.kind == AARCH64_MOD_LSL)
2545 {
2546 set_other_error (mismatch_detail, idx,
2547 _("'LSL' operator not allowed"));
2548 return 0;
2549 }
2550 }
2551 assert (opnd->shifter.operator_present /* Default to LSL. */
2552 || opnd->shifter.kind == AARCH64_MOD_LSL);
2553 if (!value_in_range_p (opnd->shifter.amount, 0, 4))
2554 {
2555 set_sft_amount_out_of_range_error (mismatch_detail, idx, 0, 4);
2556 return 0;
2557 }
2558 /* In the 64-bit form, the final register operand is written as Wm
2559 for all but the (possibly omitted) UXTX/LSL and SXTX
2560 operators.
2561 N.B. GAS allows X register to be used with any operator as a
2562 programming convenience. */
2563 if (qualifier == AARCH64_OPND_QLF_X
2564 && opnd->shifter.kind != AARCH64_MOD_LSL
2565 && opnd->shifter.kind != AARCH64_MOD_UXTX
2566 && opnd->shifter.kind != AARCH64_MOD_SXTX)
2567 {
2568 set_other_error (mismatch_detail, idx, _("W register expected"));
2569 return 0;
2570 }
2571 break;
2572
2573 case AARCH64_OPND_Rm_SFT:
2574 /* ROR is not available to the shifted register operand in
2575 arithmetic instructions. */
2576 if (!aarch64_shift_operator_p (opnd->shifter.kind))
2577 {
2578 set_other_error (mismatch_detail, idx,
2579 _("shift operator expected"));
2580 return 0;
2581 }
2582 if (opnd->shifter.kind == AARCH64_MOD_ROR
2583 && opcode->iclass != log_shift)
2584 {
2585 set_other_error (mismatch_detail, idx,
2586 _("'ROR' operator not allowed"));
2587 return 0;
2588 }
2589 num = qualifier == AARCH64_OPND_QLF_W ? 31 : 63;
2590 if (!value_in_range_p (opnd->shifter.amount, 0, num))
2591 {
2592 set_sft_amount_out_of_range_error (mismatch_detail, idx, 0, num);
2593 return 0;
2594 }
2595 break;
2596
2597 default:
2598 break;
2599 }
2600 break;
2601
2602 default:
2603 break;
2604 }
2605
2606 return 1;
2607 }
2608
2609 /* Main entrypoint for the operand constraint checking.
2610
2611 Return 1 if operands of *INST meet the constraint applied by the operand
2612 codes and operand qualifiers; otherwise return 0 and if MISMATCH_DETAIL is
2613 not NULL, return the detail of the error in *MISMATCH_DETAIL. N.B. when
2614 adding more constraint checking, make sure MISMATCH_DETAIL->KIND is set
2615 with a proper error kind rather than AARCH64_OPDE_NIL (GAS asserts non-NIL
2616 error kind when it is notified that an instruction does not pass the check).
2617
2618 Un-determined operand qualifiers may get established during the process. */
2619
2620 int
2621 aarch64_match_operands_constraint (aarch64_inst *inst,
2622 aarch64_operand_error *mismatch_detail)
2623 {
2624 int i;
2625
2626 DEBUG_TRACE ("enter");
2627
2628 /* Check for cases where a source register needs to be the same as the
2629 destination register. Do this before matching qualifiers since if
2630 an instruction has both invalid tying and invalid qualifiers,
2631 the error about qualifiers would suggest several alternative
2632 instructions that also have invalid tying. */
2633 i = inst->opcode->tied_operand;
2634 if (i > 0 && (inst->operands[0].reg.regno != inst->operands[i].reg.regno))
2635 {
2636 if (mismatch_detail)
2637 {
2638 mismatch_detail->kind = AARCH64_OPDE_UNTIED_OPERAND;
2639 mismatch_detail->index = i;
2640 mismatch_detail->error = NULL;
2641 }
2642 return 0;
2643 }
2644
2645 /* Match operands' qualifier.
2646 *INST has already had qualifier establish for some, if not all, of
2647 its operands; we need to find out whether these established
2648 qualifiers match one of the qualifier sequence in
2649 INST->OPCODE->QUALIFIERS_LIST. If yes, we will assign each operand
2650 with the corresponding qualifier in such a sequence.
2651 Only basic operand constraint checking is done here; the more thorough
2652 constraint checking will carried out by operand_general_constraint_met_p,
2653 which has be to called after this in order to get all of the operands'
2654 qualifiers established. */
2655 if (match_operands_qualifier (inst, TRUE /* update_p */) == 0)
2656 {
2657 DEBUG_TRACE ("FAIL on operand qualifier matching");
2658 if (mismatch_detail)
2659 {
2660 /* Return an error type to indicate that it is the qualifier
2661 matching failure; we don't care about which operand as there
2662 are enough information in the opcode table to reproduce it. */
2663 mismatch_detail->kind = AARCH64_OPDE_INVALID_VARIANT;
2664 mismatch_detail->index = -1;
2665 mismatch_detail->error = NULL;
2666 }
2667 return 0;
2668 }
2669
2670 /* Match operands' constraint. */
2671 for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2672 {
2673 enum aarch64_opnd type = inst->opcode->operands[i];
2674 if (type == AARCH64_OPND_NIL)
2675 break;
2676 if (inst->operands[i].skip)
2677 {
2678 DEBUG_TRACE ("skip the incomplete operand %d", i);
2679 continue;
2680 }
2681 if (operand_general_constraint_met_p (inst->operands, i, type,
2682 inst->opcode, mismatch_detail) == 0)
2683 {
2684 DEBUG_TRACE ("FAIL on operand %d", i);
2685 return 0;
2686 }
2687 }
2688
2689 DEBUG_TRACE ("PASS");
2690
2691 return 1;
2692 }
2693
2694 /* Replace INST->OPCODE with OPCODE and return the replaced OPCODE.
2695 Also updates the TYPE of each INST->OPERANDS with the corresponding
2696 value of OPCODE->OPERANDS.
2697
2698 Note that some operand qualifiers may need to be manually cleared by
2699 the caller before it further calls the aarch64_opcode_encode; by
2700 doing this, it helps the qualifier matching facilities work
2701 properly. */
2702
2703 const aarch64_opcode*
2704 aarch64_replace_opcode (aarch64_inst *inst, const aarch64_opcode *opcode)
2705 {
2706 int i;
2707 const aarch64_opcode *old = inst->opcode;
2708
2709 inst->opcode = opcode;
2710
2711 /* Update the operand types. */
2712 for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2713 {
2714 inst->operands[i].type = opcode->operands[i];
2715 if (opcode->operands[i] == AARCH64_OPND_NIL)
2716 break;
2717 }
2718
2719 DEBUG_TRACE ("replace %s with %s", old->name, opcode->name);
2720
2721 return old;
2722 }
2723
2724 int
2725 aarch64_operand_index (const enum aarch64_opnd *operands, enum aarch64_opnd operand)
2726 {
2727 int i;
2728 for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2729 if (operands[i] == operand)
2730 return i;
2731 else if (operands[i] == AARCH64_OPND_NIL)
2732 break;
2733 return -1;
2734 }
2735 \f
2736 /* R0...R30, followed by FOR31. */
2737 #define BANK(R, FOR31) \
2738 { R (0), R (1), R (2), R (3), R (4), R (5), R (6), R (7), \
2739 R (8), R (9), R (10), R (11), R (12), R (13), R (14), R (15), \
2740 R (16), R (17), R (18), R (19), R (20), R (21), R (22), R (23), \
2741 R (24), R (25), R (26), R (27), R (28), R (29), R (30), FOR31 }
2742 /* [0][0] 32-bit integer regs with sp Wn
2743 [0][1] 64-bit integer regs with sp Xn sf=1
2744 [1][0] 32-bit integer regs with #0 Wn
2745 [1][1] 64-bit integer regs with #0 Xn sf=1 */
2746 static const char *int_reg[2][2][32] = {
2747 #define R32(X) "w" #X
2748 #define R64(X) "x" #X
2749 { BANK (R32, "wsp"), BANK (R64, "sp") },
2750 { BANK (R32, "wzr"), BANK (R64, "xzr") }
2751 #undef R64
2752 #undef R32
2753 };
2754
2755 /* Names of the SVE vector registers, first with .S suffixes,
2756 then with .D suffixes. */
2757
2758 static const char *sve_reg[2][32] = {
2759 #define ZS(X) "z" #X ".s"
2760 #define ZD(X) "z" #X ".d"
2761 BANK (ZS, ZS (31)), BANK (ZD, ZD (31))
2762 #undef ZD
2763 #undef ZS
2764 };
2765 #undef BANK
2766
2767 /* Return the integer register name.
2768 if SP_REG_P is not 0, R31 is an SP reg, other R31 is the zero reg. */
2769
2770 static inline const char *
2771 get_int_reg_name (int regno, aarch64_opnd_qualifier_t qualifier, int sp_reg_p)
2772 {
2773 const int has_zr = sp_reg_p ? 0 : 1;
2774 const int is_64 = aarch64_get_qualifier_esize (qualifier) == 4 ? 0 : 1;
2775 return int_reg[has_zr][is_64][regno];
2776 }
2777
2778 /* Like get_int_reg_name, but IS_64 is always 1. */
2779
2780 static inline const char *
2781 get_64bit_int_reg_name (int regno, int sp_reg_p)
2782 {
2783 const int has_zr = sp_reg_p ? 0 : 1;
2784 return int_reg[has_zr][1][regno];
2785 }
2786
2787 /* Get the name of the integer offset register in OPND, using the shift type
2788 to decide whether it's a word or doubleword. */
2789
2790 static inline const char *
2791 get_offset_int_reg_name (const aarch64_opnd_info *opnd)
2792 {
2793 switch (opnd->shifter.kind)
2794 {
2795 case AARCH64_MOD_UXTW:
2796 case AARCH64_MOD_SXTW:
2797 return get_int_reg_name (opnd->addr.offset.regno, AARCH64_OPND_QLF_W, 0);
2798
2799 case AARCH64_MOD_LSL:
2800 case AARCH64_MOD_SXTX:
2801 return get_int_reg_name (opnd->addr.offset.regno, AARCH64_OPND_QLF_X, 0);
2802
2803 default:
2804 abort ();
2805 }
2806 }
2807
2808 /* Get the name of the SVE vector offset register in OPND, using the operand
2809 qualifier to decide whether the suffix should be .S or .D. */
2810
2811 static inline const char *
2812 get_addr_sve_reg_name (int regno, aarch64_opnd_qualifier_t qualifier)
2813 {
2814 assert (qualifier == AARCH64_OPND_QLF_S_S
2815 || qualifier == AARCH64_OPND_QLF_S_D);
2816 return sve_reg[qualifier == AARCH64_OPND_QLF_S_D][regno];
2817 }
2818
2819 /* Types for expanding an encoded 8-bit value to a floating-point value. */
2820
2821 typedef union
2822 {
2823 uint64_t i;
2824 double d;
2825 } double_conv_t;
2826
2827 typedef union
2828 {
2829 uint32_t i;
2830 float f;
2831 } single_conv_t;
2832
2833 typedef union
2834 {
2835 uint32_t i;
2836 float f;
2837 } half_conv_t;
2838
2839 /* IMM8 is an 8-bit floating-point constant with sign, 3-bit exponent and
2840 normalized 4 bits of precision, encoded in "a:b:c:d:e:f:g:h" or FLD_imm8
2841 (depending on the type of the instruction). IMM8 will be expanded to a
2842 single-precision floating-point value (SIZE == 4) or a double-precision
2843 floating-point value (SIZE == 8). A half-precision floating-point value
2844 (SIZE == 2) is expanded to a single-precision floating-point value. The
2845 expanded value is returned. */
2846
2847 static uint64_t
2848 expand_fp_imm (int size, uint32_t imm8)
2849 {
2850 uint64_t imm = 0;
2851 uint32_t imm8_7, imm8_6_0, imm8_6, imm8_6_repl4;
2852
2853 imm8_7 = (imm8 >> 7) & 0x01; /* imm8<7> */
2854 imm8_6_0 = imm8 & 0x7f; /* imm8<6:0> */
2855 imm8_6 = imm8_6_0 >> 6; /* imm8<6> */
2856 imm8_6_repl4 = (imm8_6 << 3) | (imm8_6 << 2)
2857 | (imm8_6 << 1) | imm8_6; /* Replicate(imm8<6>,4) */
2858 if (size == 8)
2859 {
2860 imm = (imm8_7 << (63-32)) /* imm8<7> */
2861 | ((imm8_6 ^ 1) << (62-32)) /* NOT(imm8<6) */
2862 | (imm8_6_repl4 << (58-32)) | (imm8_6 << (57-32))
2863 | (imm8_6 << (56-32)) | (imm8_6 << (55-32)) /* Replicate(imm8<6>,7) */
2864 | (imm8_6_0 << (48-32)); /* imm8<6>:imm8<5:0> */
2865 imm <<= 32;
2866 }
2867 else if (size == 4 || size == 2)
2868 {
2869 imm = (imm8_7 << 31) /* imm8<7> */
2870 | ((imm8_6 ^ 1) << 30) /* NOT(imm8<6>) */
2871 | (imm8_6_repl4 << 26) /* Replicate(imm8<6>,4) */
2872 | (imm8_6_0 << 19); /* imm8<6>:imm8<5:0> */
2873 }
2874 else
2875 {
2876 /* An unsupported size. */
2877 assert (0);
2878 }
2879
2880 return imm;
2881 }
2882
2883 /* Produce the string representation of the register list operand *OPND
2884 in the buffer pointed by BUF of size SIZE. PREFIX is the part of
2885 the register name that comes before the register number, such as "v". */
2886 static void
2887 print_register_list (char *buf, size_t size, const aarch64_opnd_info *opnd,
2888 const char *prefix)
2889 {
2890 const int num_regs = opnd->reglist.num_regs;
2891 const int first_reg = opnd->reglist.first_regno;
2892 const int last_reg = (first_reg + num_regs - 1) & 0x1f;
2893 const char *qlf_name = aarch64_get_qualifier_name (opnd->qualifier);
2894 char tb[8]; /* Temporary buffer. */
2895
2896 assert (opnd->type != AARCH64_OPND_LEt || opnd->reglist.has_index);
2897 assert (num_regs >= 1 && num_regs <= 4);
2898
2899 /* Prepare the index if any. */
2900 if (opnd->reglist.has_index)
2901 /* PR 21096: The %100 is to silence a warning about possible truncation. */
2902 snprintf (tb, 8, "[%" PRIi64 "]", (opnd->reglist.index % 100));
2903 else
2904 tb[0] = '\0';
2905
2906 /* The hyphenated form is preferred for disassembly if there are
2907 more than two registers in the list, and the register numbers
2908 are monotonically increasing in increments of one. */
2909 if (num_regs > 2 && last_reg > first_reg)
2910 snprintf (buf, size, "{%s%d.%s-%s%d.%s}%s", prefix, first_reg, qlf_name,
2911 prefix, last_reg, qlf_name, tb);
2912 else
2913 {
2914 const int reg0 = first_reg;
2915 const int reg1 = (first_reg + 1) & 0x1f;
2916 const int reg2 = (first_reg + 2) & 0x1f;
2917 const int reg3 = (first_reg + 3) & 0x1f;
2918
2919 switch (num_regs)
2920 {
2921 case 1:
2922 snprintf (buf, size, "{%s%d.%s}%s", prefix, reg0, qlf_name, tb);
2923 break;
2924 case 2:
2925 snprintf (buf, size, "{%s%d.%s, %s%d.%s}%s", prefix, reg0, qlf_name,
2926 prefix, reg1, qlf_name, tb);
2927 break;
2928 case 3:
2929 snprintf (buf, size, "{%s%d.%s, %s%d.%s, %s%d.%s}%s",
2930 prefix, reg0, qlf_name, prefix, reg1, qlf_name,
2931 prefix, reg2, qlf_name, tb);
2932 break;
2933 case 4:
2934 snprintf (buf, size, "{%s%d.%s, %s%d.%s, %s%d.%s, %s%d.%s}%s",
2935 prefix, reg0, qlf_name, prefix, reg1, qlf_name,
2936 prefix, reg2, qlf_name, prefix, reg3, qlf_name, tb);
2937 break;
2938 }
2939 }
2940 }
2941
2942 /* Print the register+immediate address in OPND to BUF, which has SIZE
2943 characters. BASE is the name of the base register. */
2944
2945 static void
2946 print_immediate_offset_address (char *buf, size_t size,
2947 const aarch64_opnd_info *opnd,
2948 const char *base)
2949 {
2950 if (opnd->addr.writeback)
2951 {
2952 if (opnd->addr.preind)
2953 snprintf (buf, size, "[%s, #%d]!", base, opnd->addr.offset.imm);
2954 else
2955 snprintf (buf, size, "[%s], #%d", base, opnd->addr.offset.imm);
2956 }
2957 else
2958 {
2959 if (opnd->shifter.operator_present)
2960 {
2961 assert (opnd->shifter.kind == AARCH64_MOD_MUL_VL);
2962 snprintf (buf, size, "[%s, #%d, mul vl]",
2963 base, opnd->addr.offset.imm);
2964 }
2965 else if (opnd->addr.offset.imm)
2966 snprintf (buf, size, "[%s, #%d]", base, opnd->addr.offset.imm);
2967 else
2968 snprintf (buf, size, "[%s]", base);
2969 }
2970 }
2971
2972 /* Produce the string representation of the register offset address operand
2973 *OPND in the buffer pointed by BUF of size SIZE. BASE and OFFSET are
2974 the names of the base and offset registers. */
2975 static void
2976 print_register_offset_address (char *buf, size_t size,
2977 const aarch64_opnd_info *opnd,
2978 const char *base, const char *offset)
2979 {
2980 char tb[16]; /* Temporary buffer. */
2981 bfd_boolean print_extend_p = TRUE;
2982 bfd_boolean print_amount_p = TRUE;
2983 const char *shift_name = aarch64_operand_modifiers[opnd->shifter.kind].name;
2984
2985 if (!opnd->shifter.amount && (opnd->qualifier != AARCH64_OPND_QLF_S_B
2986 || !opnd->shifter.amount_present))
2987 {
2988 /* Not print the shift/extend amount when the amount is zero and
2989 when it is not the special case of 8-bit load/store instruction. */
2990 print_amount_p = FALSE;
2991 /* Likewise, no need to print the shift operator LSL in such a
2992 situation. */
2993 if (opnd->shifter.kind == AARCH64_MOD_LSL)
2994 print_extend_p = FALSE;
2995 }
2996
2997 /* Prepare for the extend/shift. */
2998 if (print_extend_p)
2999 {
3000 if (print_amount_p)
3001 snprintf (tb, sizeof (tb), ", %s #%" PRIi64, shift_name,
3002 /* PR 21096: The %100 is to silence a warning about possible truncation. */
3003 (opnd->shifter.amount % 100));
3004 else
3005 snprintf (tb, sizeof (tb), ", %s", shift_name);
3006 }
3007 else
3008 tb[0] = '\0';
3009
3010 snprintf (buf, size, "[%s, %s%s]", base, offset, tb);
3011 }
3012
3013 /* Generate the string representation of the operand OPNDS[IDX] for OPCODE
3014 in *BUF. The caller should pass in the maximum size of *BUF in SIZE.
3015 PC, PCREL_P and ADDRESS are used to pass in and return information about
3016 the PC-relative address calculation, where the PC value is passed in
3017 PC. If the operand is pc-relative related, *PCREL_P (if PCREL_P non-NULL)
3018 will return 1 and *ADDRESS (if ADDRESS non-NULL) will return the
3019 calculated address; otherwise, *PCREL_P (if PCREL_P non-NULL) returns 0.
3020
3021 The function serves both the disassembler and the assembler diagnostics
3022 issuer, which is the reason why it lives in this file. */
3023
3024 void
3025 aarch64_print_operand (char *buf, size_t size, bfd_vma pc,
3026 const aarch64_opcode *opcode,
3027 const aarch64_opnd_info *opnds, int idx, int *pcrel_p,
3028 bfd_vma *address)
3029 {
3030 unsigned int i, num_conds;
3031 const char *name = NULL;
3032 const aarch64_opnd_info *opnd = opnds + idx;
3033 enum aarch64_modifier_kind kind;
3034 uint64_t addr, enum_value;
3035
3036 buf[0] = '\0';
3037 if (pcrel_p)
3038 *pcrel_p = 0;
3039
3040 switch (opnd->type)
3041 {
3042 case AARCH64_OPND_Rd:
3043 case AARCH64_OPND_Rn:
3044 case AARCH64_OPND_Rm:
3045 case AARCH64_OPND_Rt:
3046 case AARCH64_OPND_Rt2:
3047 case AARCH64_OPND_Rs:
3048 case AARCH64_OPND_Ra:
3049 case AARCH64_OPND_Rt_SYS:
3050 case AARCH64_OPND_PAIRREG:
3051 case AARCH64_OPND_SVE_Rm:
3052 /* The optional-ness of <Xt> in e.g. IC <ic_op>{, <Xt>} is determined by
3053 the <ic_op>, therefore we use opnd->present to override the
3054 generic optional-ness information. */
3055 if (opnd->type == AARCH64_OPND_Rt_SYS)
3056 {
3057 if (!opnd->present)
3058 break;
3059 }
3060 /* Omit the operand, e.g. RET. */
3061 else if (optional_operand_p (opcode, idx)
3062 && (opnd->reg.regno
3063 == get_optional_operand_default_value (opcode)))
3064 break;
3065 assert (opnd->qualifier == AARCH64_OPND_QLF_W
3066 || opnd->qualifier == AARCH64_OPND_QLF_X);
3067 snprintf (buf, size, "%s",
3068 get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0));
3069 break;
3070
3071 case AARCH64_OPND_Rd_SP:
3072 case AARCH64_OPND_Rn_SP:
3073 case AARCH64_OPND_SVE_Rn_SP:
3074 case AARCH64_OPND_Rm_SP:
3075 assert (opnd->qualifier == AARCH64_OPND_QLF_W
3076 || opnd->qualifier == AARCH64_OPND_QLF_WSP
3077 || opnd->qualifier == AARCH64_OPND_QLF_X
3078 || opnd->qualifier == AARCH64_OPND_QLF_SP);
3079 snprintf (buf, size, "%s",
3080 get_int_reg_name (opnd->reg.regno, opnd->qualifier, 1));
3081 break;
3082
3083 case AARCH64_OPND_Rm_EXT:
3084 kind = opnd->shifter.kind;
3085 assert (idx == 1 || idx == 2);
3086 if ((aarch64_stack_pointer_p (opnds)
3087 || (idx == 2 && aarch64_stack_pointer_p (opnds + 1)))
3088 && ((opnd->qualifier == AARCH64_OPND_QLF_W
3089 && opnds[0].qualifier == AARCH64_OPND_QLF_W
3090 && kind == AARCH64_MOD_UXTW)
3091 || (opnd->qualifier == AARCH64_OPND_QLF_X
3092 && kind == AARCH64_MOD_UXTX)))
3093 {
3094 /* 'LSL' is the preferred form in this case. */
3095 kind = AARCH64_MOD_LSL;
3096 if (opnd->shifter.amount == 0)
3097 {
3098 /* Shifter omitted. */
3099 snprintf (buf, size, "%s",
3100 get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0));
3101 break;
3102 }
3103 }
3104 if (opnd->shifter.amount)
3105 snprintf (buf, size, "%s, %s #%" PRIi64,
3106 get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0),
3107 aarch64_operand_modifiers[kind].name,
3108 opnd->shifter.amount);
3109 else
3110 snprintf (buf, size, "%s, %s",
3111 get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0),
3112 aarch64_operand_modifiers[kind].name);
3113 break;
3114
3115 case AARCH64_OPND_Rm_SFT:
3116 assert (opnd->qualifier == AARCH64_OPND_QLF_W
3117 || opnd->qualifier == AARCH64_OPND_QLF_X);
3118 if (opnd->shifter.amount == 0 && opnd->shifter.kind == AARCH64_MOD_LSL)
3119 snprintf (buf, size, "%s",
3120 get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0));
3121 else
3122 snprintf (buf, size, "%s, %s #%" PRIi64,
3123 get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0),
3124 aarch64_operand_modifiers[opnd->shifter.kind].name,
3125 opnd->shifter.amount);
3126 break;
3127
3128 case AARCH64_OPND_Fd:
3129 case AARCH64_OPND_Fn:
3130 case AARCH64_OPND_Fm:
3131 case AARCH64_OPND_Fa:
3132 case AARCH64_OPND_Ft:
3133 case AARCH64_OPND_Ft2:
3134 case AARCH64_OPND_Sd:
3135 case AARCH64_OPND_Sn:
3136 case AARCH64_OPND_Sm:
3137 case AARCH64_OPND_SVE_VZn:
3138 case AARCH64_OPND_SVE_Vd:
3139 case AARCH64_OPND_SVE_Vm:
3140 case AARCH64_OPND_SVE_Vn:
3141 snprintf (buf, size, "%s%d", aarch64_get_qualifier_name (opnd->qualifier),
3142 opnd->reg.regno);
3143 break;
3144
3145 case AARCH64_OPND_Vd:
3146 case AARCH64_OPND_Vn:
3147 case AARCH64_OPND_Vm:
3148 snprintf (buf, size, "v%d.%s", opnd->reg.regno,
3149 aarch64_get_qualifier_name (opnd->qualifier));
3150 break;
3151
3152 case AARCH64_OPND_Ed:
3153 case AARCH64_OPND_En:
3154 case AARCH64_OPND_Em:
3155 snprintf (buf, size, "v%d.%s[%" PRIi64 "]", opnd->reglane.regno,
3156 aarch64_get_qualifier_name (opnd->qualifier),
3157 opnd->reglane.index);
3158 break;
3159
3160 case AARCH64_OPND_VdD1:
3161 case AARCH64_OPND_VnD1:
3162 snprintf (buf, size, "v%d.d[1]", opnd->reg.regno);
3163 break;
3164
3165 case AARCH64_OPND_LVn:
3166 case AARCH64_OPND_LVt:
3167 case AARCH64_OPND_LVt_AL:
3168 case AARCH64_OPND_LEt:
3169 print_register_list (buf, size, opnd, "v");
3170 break;
3171
3172 case AARCH64_OPND_SVE_Pd:
3173 case AARCH64_OPND_SVE_Pg3:
3174 case AARCH64_OPND_SVE_Pg4_5:
3175 case AARCH64_OPND_SVE_Pg4_10:
3176 case AARCH64_OPND_SVE_Pg4_16:
3177 case AARCH64_OPND_SVE_Pm:
3178 case AARCH64_OPND_SVE_Pn:
3179 case AARCH64_OPND_SVE_Pt:
3180 if (opnd->qualifier == AARCH64_OPND_QLF_NIL)
3181 snprintf (buf, size, "p%d", opnd->reg.regno);
3182 else if (opnd->qualifier == AARCH64_OPND_QLF_P_Z
3183 || opnd->qualifier == AARCH64_OPND_QLF_P_M)
3184 snprintf (buf, size, "p%d/%s", opnd->reg.regno,
3185 aarch64_get_qualifier_name (opnd->qualifier));
3186 else
3187 snprintf (buf, size, "p%d.%s", opnd->reg.regno,
3188 aarch64_get_qualifier_name (opnd->qualifier));
3189 break;
3190
3191 case AARCH64_OPND_SVE_Za_5:
3192 case AARCH64_OPND_SVE_Za_16:
3193 case AARCH64_OPND_SVE_Zd:
3194 case AARCH64_OPND_SVE_Zm_5:
3195 case AARCH64_OPND_SVE_Zm_16:
3196 case AARCH64_OPND_SVE_Zn:
3197 case AARCH64_OPND_SVE_Zt:
3198 if (opnd->qualifier == AARCH64_OPND_QLF_NIL)
3199 snprintf (buf, size, "z%d", opnd->reg.regno);
3200 else
3201 snprintf (buf, size, "z%d.%s", opnd->reg.regno,
3202 aarch64_get_qualifier_name (opnd->qualifier));
3203 break;
3204
3205 case AARCH64_OPND_SVE_ZnxN:
3206 case AARCH64_OPND_SVE_ZtxN:
3207 print_register_list (buf, size, opnd, "z");
3208 break;
3209
3210 case AARCH64_OPND_SVE_Zm3_INDEX:
3211 case AARCH64_OPND_SVE_Zm3_22_INDEX:
3212 case AARCH64_OPND_SVE_Zm4_INDEX:
3213 case AARCH64_OPND_SVE_Zn_INDEX:
3214 snprintf (buf, size, "z%d.%s[%" PRIi64 "]", opnd->reglane.regno,
3215 aarch64_get_qualifier_name (opnd->qualifier),
3216 opnd->reglane.index);
3217 break;
3218
3219 case AARCH64_OPND_CRn:
3220 case AARCH64_OPND_CRm:
3221 snprintf (buf, size, "C%" PRIi64, opnd->imm.value);
3222 break;
3223
3224 case AARCH64_OPND_IDX:
3225 case AARCH64_OPND_IMM:
3226 case AARCH64_OPND_WIDTH:
3227 case AARCH64_OPND_UIMM3_OP1:
3228 case AARCH64_OPND_UIMM3_OP2:
3229 case AARCH64_OPND_BIT_NUM:
3230 case AARCH64_OPND_IMM_VLSL:
3231 case AARCH64_OPND_IMM_VLSR:
3232 case AARCH64_OPND_SHLL_IMM:
3233 case AARCH64_OPND_IMM0:
3234 case AARCH64_OPND_IMMR:
3235 case AARCH64_OPND_IMMS:
3236 case AARCH64_OPND_FBITS:
3237 case AARCH64_OPND_SIMM5:
3238 case AARCH64_OPND_SVE_SHLIMM_PRED:
3239 case AARCH64_OPND_SVE_SHLIMM_UNPRED:
3240 case AARCH64_OPND_SVE_SHRIMM_PRED:
3241 case AARCH64_OPND_SVE_SHRIMM_UNPRED:
3242 case AARCH64_OPND_SVE_SIMM5:
3243 case AARCH64_OPND_SVE_SIMM5B:
3244 case AARCH64_OPND_SVE_SIMM6:
3245 case AARCH64_OPND_SVE_SIMM8:
3246 case AARCH64_OPND_SVE_UIMM3:
3247 case AARCH64_OPND_SVE_UIMM7:
3248 case AARCH64_OPND_SVE_UIMM8:
3249 case AARCH64_OPND_SVE_UIMM8_53:
3250 case AARCH64_OPND_IMM_ROT1:
3251 case AARCH64_OPND_IMM_ROT2:
3252 case AARCH64_OPND_IMM_ROT3:
3253 case AARCH64_OPND_SVE_IMM_ROT1:
3254 case AARCH64_OPND_SVE_IMM_ROT2:
3255 snprintf (buf, size, "#%" PRIi64, opnd->imm.value);
3256 break;
3257
3258 case AARCH64_OPND_SVE_I1_HALF_ONE:
3259 case AARCH64_OPND_SVE_I1_HALF_TWO:
3260 case AARCH64_OPND_SVE_I1_ZERO_ONE:
3261 {
3262 single_conv_t c;
3263 c.i = opnd->imm.value;
3264 snprintf (buf, size, "#%.1f", c.f);
3265 break;
3266 }
3267
3268 case AARCH64_OPND_SVE_PATTERN:
3269 if (optional_operand_p (opcode, idx)
3270 && opnd->imm.value == get_optional_operand_default_value (opcode))
3271 break;
3272 enum_value = opnd->imm.value;
3273 assert (enum_value < ARRAY_SIZE (aarch64_sve_pattern_array));
3274 if (aarch64_sve_pattern_array[enum_value])
3275 snprintf (buf, size, "%s", aarch64_sve_pattern_array[enum_value]);
3276 else
3277 snprintf (buf, size, "#%" PRIi64, opnd->imm.value);
3278 break;
3279
3280 case AARCH64_OPND_SVE_PATTERN_SCALED:
3281 if (optional_operand_p (opcode, idx)
3282 && !opnd->shifter.operator_present
3283 && opnd->imm.value == get_optional_operand_default_value (opcode))
3284 break;
3285 enum_value = opnd->imm.value;
3286 assert (enum_value < ARRAY_SIZE (aarch64_sve_pattern_array));
3287 if (aarch64_sve_pattern_array[opnd->imm.value])
3288 snprintf (buf, size, "%s", aarch64_sve_pattern_array[opnd->imm.value]);
3289 else
3290 snprintf (buf, size, "#%" PRIi64, opnd->imm.value);
3291 if (opnd->shifter.operator_present)
3292 {
3293 size_t len = strlen (buf);
3294 snprintf (buf + len, size - len, ", %s #%" PRIi64,
3295 aarch64_operand_modifiers[opnd->shifter.kind].name,
3296 opnd->shifter.amount);
3297 }
3298 break;
3299
3300 case AARCH64_OPND_SVE_PRFOP:
3301 enum_value = opnd->imm.value;
3302 assert (enum_value < ARRAY_SIZE (aarch64_sve_prfop_array));
3303 if (aarch64_sve_prfop_array[enum_value])
3304 snprintf (buf, size, "%s", aarch64_sve_prfop_array[enum_value]);
3305 else
3306 snprintf (buf, size, "#%" PRIi64, opnd->imm.value);
3307 break;
3308
3309 case AARCH64_OPND_IMM_MOV:
3310 switch (aarch64_get_qualifier_esize (opnds[0].qualifier))
3311 {
3312 case 4: /* e.g. MOV Wd, #<imm32>. */
3313 {
3314 int imm32 = opnd->imm.value;
3315 snprintf (buf, size, "#0x%-20x\t// #%d", imm32, imm32);
3316 }
3317 break;
3318 case 8: /* e.g. MOV Xd, #<imm64>. */
3319 snprintf (buf, size, "#0x%-20" PRIx64 "\t// #%" PRIi64,
3320 opnd->imm.value, opnd->imm.value);
3321 break;
3322 default: assert (0);
3323 }
3324 break;
3325
3326 case AARCH64_OPND_FPIMM0:
3327 snprintf (buf, size, "#0.0");
3328 break;
3329
3330 case AARCH64_OPND_LIMM:
3331 case AARCH64_OPND_AIMM:
3332 case AARCH64_OPND_HALF:
3333 case AARCH64_OPND_SVE_INV_LIMM:
3334 case AARCH64_OPND_SVE_LIMM:
3335 case AARCH64_OPND_SVE_LIMM_MOV:
3336 if (opnd->shifter.amount)
3337 snprintf (buf, size, "#0x%" PRIx64 ", lsl #%" PRIi64, opnd->imm.value,
3338 opnd->shifter.amount);
3339 else
3340 snprintf (buf, size, "#0x%" PRIx64, opnd->imm.value);
3341 break;
3342
3343 case AARCH64_OPND_SIMD_IMM:
3344 case AARCH64_OPND_SIMD_IMM_SFT:
3345 if ((! opnd->shifter.amount && opnd->shifter.kind == AARCH64_MOD_LSL)
3346 || opnd->shifter.kind == AARCH64_MOD_NONE)
3347 snprintf (buf, size, "#0x%" PRIx64, opnd->imm.value);
3348 else
3349 snprintf (buf, size, "#0x%" PRIx64 ", %s #%" PRIi64, opnd->imm.value,
3350 aarch64_operand_modifiers[opnd->shifter.kind].name,
3351 opnd->shifter.amount);
3352 break;
3353
3354 case AARCH64_OPND_SVE_AIMM:
3355 case AARCH64_OPND_SVE_ASIMM:
3356 if (opnd->shifter.amount)
3357 snprintf (buf, size, "#%" PRIi64 ", lsl #%" PRIi64, opnd->imm.value,
3358 opnd->shifter.amount);
3359 else
3360 snprintf (buf, size, "#%" PRIi64, opnd->imm.value);
3361 break;
3362
3363 case AARCH64_OPND_FPIMM:
3364 case AARCH64_OPND_SIMD_FPIMM:
3365 case AARCH64_OPND_SVE_FPIMM8:
3366 switch (aarch64_get_qualifier_esize (opnds[0].qualifier))
3367 {
3368 case 2: /* e.g. FMOV <Hd>, #<imm>. */
3369 {
3370 half_conv_t c;
3371 c.i = expand_fp_imm (2, opnd->imm.value);
3372 snprintf (buf, size, "#%.18e", c.f);
3373 }
3374 break;
3375 case 4: /* e.g. FMOV <Vd>.4S, #<imm>. */
3376 {
3377 single_conv_t c;
3378 c.i = expand_fp_imm (4, opnd->imm.value);
3379 snprintf (buf, size, "#%.18e", c.f);
3380 }
3381 break;
3382 case 8: /* e.g. FMOV <Sd>, #<imm>. */
3383 {
3384 double_conv_t c;
3385 c.i = expand_fp_imm (8, opnd->imm.value);
3386 snprintf (buf, size, "#%.18e", c.d);
3387 }
3388 break;
3389 default: assert (0);
3390 }
3391 break;
3392
3393 case AARCH64_OPND_CCMP_IMM:
3394 case AARCH64_OPND_NZCV:
3395 case AARCH64_OPND_EXCEPTION:
3396 case AARCH64_OPND_UIMM4:
3397 case AARCH64_OPND_UIMM7:
3398 if (optional_operand_p (opcode, idx) == TRUE
3399 && (opnd->imm.value ==
3400 (int64_t) get_optional_operand_default_value (opcode)))
3401 /* Omit the operand, e.g. DCPS1. */
3402 break;
3403 snprintf (buf, size, "#0x%x", (unsigned int)opnd->imm.value);
3404 break;
3405
3406 case AARCH64_OPND_COND:
3407 case AARCH64_OPND_COND1:
3408 snprintf (buf, size, "%s", opnd->cond->names[0]);
3409 num_conds = ARRAY_SIZE (opnd->cond->names);
3410 for (i = 1; i < num_conds && opnd->cond->names[i]; ++i)
3411 {
3412 size_t len = strlen (buf);
3413 if (i == 1)
3414 snprintf (buf + len, size - len, " // %s = %s",
3415 opnd->cond->names[0], opnd->cond->names[i]);
3416 else
3417 snprintf (buf + len, size - len, ", %s",
3418 opnd->cond->names[i]);
3419 }
3420 break;
3421
3422 case AARCH64_OPND_ADDR_ADRP:
3423 addr = ((pc + AARCH64_PCREL_OFFSET) & ~(uint64_t)0xfff)
3424 + opnd->imm.value;
3425 if (pcrel_p)
3426 *pcrel_p = 1;
3427 if (address)
3428 *address = addr;
3429 /* This is not necessary during the disassembling, as print_address_func
3430 in the disassemble_info will take care of the printing. But some
3431 other callers may be still interested in getting the string in *STR,
3432 so here we do snprintf regardless. */
3433 snprintf (buf, size, "#0x%" PRIx64, addr);
3434 break;
3435
3436 case AARCH64_OPND_ADDR_PCREL14:
3437 case AARCH64_OPND_ADDR_PCREL19:
3438 case AARCH64_OPND_ADDR_PCREL21:
3439 case AARCH64_OPND_ADDR_PCREL26:
3440 addr = pc + AARCH64_PCREL_OFFSET + opnd->imm.value;
3441 if (pcrel_p)
3442 *pcrel_p = 1;
3443 if (address)
3444 *address = addr;
3445 /* This is not necessary during the disassembling, as print_address_func
3446 in the disassemble_info will take care of the printing. But some
3447 other callers may be still interested in getting the string in *STR,
3448 so here we do snprintf regardless. */
3449 snprintf (buf, size, "#0x%" PRIx64, addr);
3450 break;
3451
3452 case AARCH64_OPND_ADDR_SIMPLE:
3453 case AARCH64_OPND_SIMD_ADDR_SIMPLE:
3454 case AARCH64_OPND_SIMD_ADDR_POST:
3455 name = get_64bit_int_reg_name (opnd->addr.base_regno, 1);
3456 if (opnd->type == AARCH64_OPND_SIMD_ADDR_POST)
3457 {
3458 if (opnd->addr.offset.is_reg)
3459 snprintf (buf, size, "[%s], x%d", name, opnd->addr.offset.regno);
3460 else
3461 snprintf (buf, size, "[%s], #%d", name, opnd->addr.offset.imm);
3462 }
3463 else
3464 snprintf (buf, size, "[%s]", name);
3465 break;
3466
3467 case AARCH64_OPND_ADDR_REGOFF:
3468 case AARCH64_OPND_SVE_ADDR_RR:
3469 case AARCH64_OPND_SVE_ADDR_RR_LSL1:
3470 case AARCH64_OPND_SVE_ADDR_RR_LSL2:
3471 case AARCH64_OPND_SVE_ADDR_RR_LSL3:
3472 case AARCH64_OPND_SVE_ADDR_RX:
3473 case AARCH64_OPND_SVE_ADDR_RX_LSL1:
3474 case AARCH64_OPND_SVE_ADDR_RX_LSL2:
3475 case AARCH64_OPND_SVE_ADDR_RX_LSL3:
3476 print_register_offset_address
3477 (buf, size, opnd, get_64bit_int_reg_name (opnd->addr.base_regno, 1),
3478 get_offset_int_reg_name (opnd));
3479 break;
3480
3481 case AARCH64_OPND_SVE_ADDR_RZ:
3482 case AARCH64_OPND_SVE_ADDR_RZ_LSL1:
3483 case AARCH64_OPND_SVE_ADDR_RZ_LSL2:
3484 case AARCH64_OPND_SVE_ADDR_RZ_LSL3:
3485 case AARCH64_OPND_SVE_ADDR_RZ_XTW_14:
3486 case AARCH64_OPND_SVE_ADDR_RZ_XTW_22:
3487 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_14:
3488 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_22:
3489 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_14:
3490 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_22:
3491 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_14:
3492 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_22:
3493 print_register_offset_address
3494 (buf, size, opnd, get_64bit_int_reg_name (opnd->addr.base_regno, 1),
3495 get_addr_sve_reg_name (opnd->addr.offset.regno, opnd->qualifier));
3496 break;
3497
3498 case AARCH64_OPND_ADDR_SIMM7:
3499 case AARCH64_OPND_ADDR_SIMM9:
3500 case AARCH64_OPND_ADDR_SIMM9_2:
3501 case AARCH64_OPND_ADDR_SIMM10:
3502 case AARCH64_OPND_SVE_ADDR_RI_S4x16:
3503 case AARCH64_OPND_SVE_ADDR_RI_S4xVL:
3504 case AARCH64_OPND_SVE_ADDR_RI_S4x2xVL:
3505 case AARCH64_OPND_SVE_ADDR_RI_S4x3xVL:
3506 case AARCH64_OPND_SVE_ADDR_RI_S4x4xVL:
3507 case AARCH64_OPND_SVE_ADDR_RI_S6xVL:
3508 case AARCH64_OPND_SVE_ADDR_RI_S9xVL:
3509 case AARCH64_OPND_SVE_ADDR_RI_U6:
3510 case AARCH64_OPND_SVE_ADDR_RI_U6x2:
3511 case AARCH64_OPND_SVE_ADDR_RI_U6x4:
3512 case AARCH64_OPND_SVE_ADDR_RI_U6x8:
3513 print_immediate_offset_address
3514 (buf, size, opnd, get_64bit_int_reg_name (opnd->addr.base_regno, 1));
3515 break;
3516
3517 case AARCH64_OPND_SVE_ADDR_ZI_U5:
3518 case AARCH64_OPND_SVE_ADDR_ZI_U5x2:
3519 case AARCH64_OPND_SVE_ADDR_ZI_U5x4:
3520 case AARCH64_OPND_SVE_ADDR_ZI_U5x8:
3521 print_immediate_offset_address
3522 (buf, size, opnd,
3523 get_addr_sve_reg_name (opnd->addr.base_regno, opnd->qualifier));
3524 break;
3525
3526 case AARCH64_OPND_SVE_ADDR_ZZ_LSL:
3527 case AARCH64_OPND_SVE_ADDR_ZZ_SXTW:
3528 case AARCH64_OPND_SVE_ADDR_ZZ_UXTW:
3529 print_register_offset_address
3530 (buf, size, opnd,
3531 get_addr_sve_reg_name (opnd->addr.base_regno, opnd->qualifier),
3532 get_addr_sve_reg_name (opnd->addr.offset.regno, opnd->qualifier));
3533 break;
3534
3535 case AARCH64_OPND_ADDR_UIMM12:
3536 name = get_64bit_int_reg_name (opnd->addr.base_regno, 1);
3537 if (opnd->addr.offset.imm)
3538 snprintf (buf, size, "[%s, #%d]", name, opnd->addr.offset.imm);
3539 else
3540 snprintf (buf, size, "[%s]", name);
3541 break;
3542
3543 case AARCH64_OPND_SYSREG:
3544 for (i = 0; aarch64_sys_regs[i].name; ++i)
3545 if (aarch64_sys_regs[i].value == opnd->sysreg
3546 && ! aarch64_sys_reg_deprecated_p (&aarch64_sys_regs[i]))
3547 break;
3548 if (aarch64_sys_regs[i].name)
3549 snprintf (buf, size, "%s", aarch64_sys_regs[i].name);
3550 else
3551 {
3552 /* Implementation defined system register. */
3553 unsigned int value = opnd->sysreg;
3554 snprintf (buf, size, "s%u_%u_c%u_c%u_%u", (value >> 14) & 0x3,
3555 (value >> 11) & 0x7, (value >> 7) & 0xf, (value >> 3) & 0xf,
3556 value & 0x7);
3557 }
3558 break;
3559
3560 case AARCH64_OPND_PSTATEFIELD:
3561 for (i = 0; aarch64_pstatefields[i].name; ++i)
3562 if (aarch64_pstatefields[i].value == opnd->pstatefield)
3563 break;
3564 assert (aarch64_pstatefields[i].name);
3565 snprintf (buf, size, "%s", aarch64_pstatefields[i].name);
3566 break;
3567
3568 case AARCH64_OPND_SYSREG_AT:
3569 case AARCH64_OPND_SYSREG_DC:
3570 case AARCH64_OPND_SYSREG_IC:
3571 case AARCH64_OPND_SYSREG_TLBI:
3572 snprintf (buf, size, "%s", opnd->sysins_op->name);
3573 break;
3574
3575 case AARCH64_OPND_BARRIER:
3576 snprintf (buf, size, "%s", opnd->barrier->name);
3577 break;
3578
3579 case AARCH64_OPND_BARRIER_ISB:
3580 /* Operand can be omitted, e.g. in DCPS1. */
3581 if (! optional_operand_p (opcode, idx)
3582 || (opnd->barrier->value
3583 != get_optional_operand_default_value (opcode)))
3584 snprintf (buf, size, "#0x%x", opnd->barrier->value);
3585 break;
3586
3587 case AARCH64_OPND_PRFOP:
3588 if (opnd->prfop->name != NULL)
3589 snprintf (buf, size, "%s", opnd->prfop->name);
3590 else
3591 snprintf (buf, size, "#0x%02x", opnd->prfop->value);
3592 break;
3593
3594 case AARCH64_OPND_BARRIER_PSB:
3595 snprintf (buf, size, "%s", opnd->hint_option->name);
3596 break;
3597
3598 default:
3599 assert (0);
3600 }
3601 }
3602 \f
3603 #define CPENC(op0,op1,crn,crm,op2) \
3604 ((((op0) << 19) | ((op1) << 16) | ((crn) << 12) | ((crm) << 8) | ((op2) << 5)) >> 5)
3605 /* for 3.9.3 Instructions for Accessing Special Purpose Registers */
3606 #define CPEN_(op1,crm,op2) CPENC(3,(op1),4,(crm),(op2))
3607 /* for 3.9.10 System Instructions */
3608 #define CPENS(op1,crn,crm,op2) CPENC(1,(op1),(crn),(crm),(op2))
3609
3610 #define C0 0
3611 #define C1 1
3612 #define C2 2
3613 #define C3 3
3614 #define C4 4
3615 #define C5 5
3616 #define C6 6
3617 #define C7 7
3618 #define C8 8
3619 #define C9 9
3620 #define C10 10
3621 #define C11 11
3622 #define C12 12
3623 #define C13 13
3624 #define C14 14
3625 #define C15 15
3626
3627 #ifdef F_DEPRECATED
3628 #undef F_DEPRECATED
3629 #endif
3630 #define F_DEPRECATED 0x1 /* Deprecated system register. */
3631
3632 #ifdef F_ARCHEXT
3633 #undef F_ARCHEXT
3634 #endif
3635 #define F_ARCHEXT 0x2 /* Architecture dependent system register. */
3636
3637 #ifdef F_HASXT
3638 #undef F_HASXT
3639 #endif
3640 #define F_HASXT 0x4 /* System instruction register <Xt>
3641 operand. */
3642
3643
3644 /* TODO there are two more issues need to be resolved
3645 1. handle read-only and write-only system registers
3646 2. handle cpu-implementation-defined system registers. */
3647 const aarch64_sys_reg aarch64_sys_regs [] =
3648 {
3649 { "spsr_el1", CPEN_(0,C0,0), 0 }, /* = spsr_svc */
3650 { "spsr_el12", CPEN_ (5, C0, 0), F_ARCHEXT },
3651 { "elr_el1", CPEN_(0,C0,1), 0 },
3652 { "elr_el12", CPEN_ (5, C0, 1), F_ARCHEXT },
3653 { "sp_el0", CPEN_(0,C1,0), 0 },
3654 { "spsel", CPEN_(0,C2,0), 0 },
3655 { "daif", CPEN_(3,C2,1), 0 },
3656 { "currentel", CPEN_(0,C2,2), 0 }, /* RO */
3657 { "pan", CPEN_(0,C2,3), F_ARCHEXT },
3658 { "uao", CPEN_ (0, C2, 4), F_ARCHEXT },
3659 { "nzcv", CPEN_(3,C2,0), 0 },
3660 { "fpcr", CPEN_(3,C4,0), 0 },
3661 { "fpsr", CPEN_(3,C4,1), 0 },
3662 { "dspsr_el0", CPEN_(3,C5,0), 0 },
3663 { "dlr_el0", CPEN_(3,C5,1), 0 },
3664 { "spsr_el2", CPEN_(4,C0,0), 0 }, /* = spsr_hyp */
3665 { "elr_el2", CPEN_(4,C0,1), 0 },
3666 { "sp_el1", CPEN_(4,C1,0), 0 },
3667 { "spsr_irq", CPEN_(4,C3,0), 0 },
3668 { "spsr_abt", CPEN_(4,C3,1), 0 },
3669 { "spsr_und", CPEN_(4,C3,2), 0 },
3670 { "spsr_fiq", CPEN_(4,C3,3), 0 },
3671 { "spsr_el3", CPEN_(6,C0,0), 0 },
3672 { "elr_el3", CPEN_(6,C0,1), 0 },
3673 { "sp_el2", CPEN_(6,C1,0), 0 },
3674 { "spsr_svc", CPEN_(0,C0,0), F_DEPRECATED }, /* = spsr_el1 */
3675 { "spsr_hyp", CPEN_(4,C0,0), F_DEPRECATED }, /* = spsr_el2 */
3676 { "midr_el1", CPENC(3,0,C0,C0,0), 0 }, /* RO */
3677 { "ctr_el0", CPENC(3,3,C0,C0,1), 0 }, /* RO */
3678 { "mpidr_el1", CPENC(3,0,C0,C0,5), 0 }, /* RO */
3679 { "revidr_el1", CPENC(3,0,C0,C0,6), 0 }, /* RO */
3680 { "aidr_el1", CPENC(3,1,C0,C0,7), 0 }, /* RO */
3681 { "dczid_el0", CPENC(3,3,C0,C0,7), 0 }, /* RO */
3682 { "id_dfr0_el1", CPENC(3,0,C0,C1,2), 0 }, /* RO */
3683 { "id_pfr0_el1", CPENC(3,0,C0,C1,0), 0 }, /* RO */
3684 { "id_pfr1_el1", CPENC(3,0,C0,C1,1), 0 }, /* RO */
3685 { "id_afr0_el1", CPENC(3,0,C0,C1,3), 0 }, /* RO */
3686 { "id_mmfr0_el1", CPENC(3,0,C0,C1,4), 0 }, /* RO */
3687 { "id_mmfr1_el1", CPENC(3,0,C0,C1,5), 0 }, /* RO */
3688 { "id_mmfr2_el1", CPENC(3,0,C0,C1,6), 0 }, /* RO */
3689 { "id_mmfr3_el1", CPENC(3,0,C0,C1,7), 0 }, /* RO */
3690 { "id_mmfr4_el1", CPENC(3,0,C0,C2,6), 0 }, /* RO */
3691 { "id_isar0_el1", CPENC(3,0,C0,C2,0), 0 }, /* RO */
3692 { "id_isar1_el1", CPENC(3,0,C0,C2,1), 0 }, /* RO */
3693 { "id_isar2_el1", CPENC(3,0,C0,C2,2), 0 }, /* RO */
3694 { "id_isar3_el1", CPENC(3,0,C0,C2,3), 0 }, /* RO */
3695 { "id_isar4_el1", CPENC(3,0,C0,C2,4), 0 }, /* RO */
3696 { "id_isar5_el1", CPENC(3,0,C0,C2,5), 0 }, /* RO */
3697 { "mvfr0_el1", CPENC(3,0,C0,C3,0), 0 }, /* RO */
3698 { "mvfr1_el1", CPENC(3,0,C0,C3,1), 0 }, /* RO */
3699 { "mvfr2_el1", CPENC(3,0,C0,C3,2), 0 }, /* RO */
3700 { "ccsidr_el1", CPENC(3,1,C0,C0,0), 0 }, /* RO */
3701 { "id_aa64pfr0_el1", CPENC(3,0,C0,C4,0), 0 }, /* RO */
3702 { "id_aa64pfr1_el1", CPENC(3,0,C0,C4,1), 0 }, /* RO */
3703 { "id_aa64dfr0_el1", CPENC(3,0,C0,C5,0), 0 }, /* RO */
3704 { "id_aa64dfr1_el1", CPENC(3,0,C0,C5,1), 0 }, /* RO */
3705 { "id_aa64isar0_el1", CPENC(3,0,C0,C6,0), 0 }, /* RO */
3706 { "id_aa64isar1_el1", CPENC(3,0,C0,C6,1), 0 }, /* RO */
3707 { "id_aa64mmfr0_el1", CPENC(3,0,C0,C7,0), 0 }, /* RO */
3708 { "id_aa64mmfr1_el1", CPENC(3,0,C0,C7,1), 0 }, /* RO */
3709 { "id_aa64mmfr2_el1", CPENC (3, 0, C0, C7, 2), F_ARCHEXT }, /* RO */
3710 { "id_aa64afr0_el1", CPENC(3,0,C0,C5,4), 0 }, /* RO */
3711 { "id_aa64afr1_el1", CPENC(3,0,C0,C5,5), 0 }, /* RO */
3712 { "id_aa64zfr0_el1", CPENC (3, 0, C0, C4, 4), F_ARCHEXT }, /* RO */
3713 { "clidr_el1", CPENC(3,1,C0,C0,1), 0 }, /* RO */
3714 { "csselr_el1", CPENC(3,2,C0,C0,0), 0 }, /* RO */
3715 { "vpidr_el2", CPENC(3,4,C0,C0,0), 0 },
3716 { "vmpidr_el2", CPENC(3,4,C0,C0,5), 0 },
3717 { "sctlr_el1", CPENC(3,0,C1,C0,0), 0 },
3718 { "sctlr_el2", CPENC(3,4,C1,C0,0), 0 },
3719 { "sctlr_el3", CPENC(3,6,C1,C0,0), 0 },
3720 { "sctlr_el12", CPENC (3, 5, C1, C0, 0), F_ARCHEXT },
3721 { "actlr_el1", CPENC(3,0,C1,C0,1), 0 },
3722 { "actlr_el2", CPENC(3,4,C1,C0,1), 0 },
3723 { "actlr_el3", CPENC(3,6,C1,C0,1), 0 },
3724 { "cpacr_el1", CPENC(3,0,C1,C0,2), 0 },
3725 { "cpacr_el12", CPENC (3, 5, C1, C0, 2), F_ARCHEXT },
3726 { "cptr_el2", CPENC(3,4,C1,C1,2), 0 },
3727 { "cptr_el3", CPENC(3,6,C1,C1,2), 0 },
3728 { "scr_el3", CPENC(3,6,C1,C1,0), 0 },
3729 { "hcr_el2", CPENC(3,4,C1,C1,0), 0 },
3730 { "mdcr_el2", CPENC(3,4,C1,C1,1), 0 },
3731 { "mdcr_el3", CPENC(3,6,C1,C3,1), 0 },
3732 { "hstr_el2", CPENC(3,4,C1,C1,3), 0 },
3733 { "hacr_el2", CPENC(3,4,C1,C1,7), 0 },
3734 { "zcr_el1", CPENC (3, 0, C1, C2, 0), F_ARCHEXT },
3735 { "zcr_el12", CPENC (3, 5, C1, C2, 0), F_ARCHEXT },
3736 { "zcr_el2", CPENC (3, 4, C1, C2, 0), F_ARCHEXT },
3737 { "zcr_el3", CPENC (3, 6, C1, C2, 0), F_ARCHEXT },
3738 { "zidr_el1", CPENC (3, 0, C0, C0, 7), F_ARCHEXT },
3739 { "ttbr0_el1", CPENC(3,0,C2,C0,0), 0 },
3740 { "ttbr1_el1", CPENC(3,0,C2,C0,1), 0 },
3741 { "ttbr0_el2", CPENC(3,4,C2,C0,0), 0 },
3742 { "ttbr1_el2", CPENC (3, 4, C2, C0, 1), F_ARCHEXT },
3743 { "ttbr0_el3", CPENC(3,6,C2,C0,0), 0 },
3744 { "ttbr0_el12", CPENC (3, 5, C2, C0, 0), F_ARCHEXT },
3745 { "ttbr1_el12", CPENC (3, 5, C2, C0, 1), F_ARCHEXT },
3746 { "vttbr_el2", CPENC(3,4,C2,C1,0), 0 },
3747 { "tcr_el1", CPENC(3,0,C2,C0,2), 0 },
3748 { "tcr_el2", CPENC(3,4,C2,C0,2), 0 },
3749 { "tcr_el3", CPENC(3,6,C2,C0,2), 0 },
3750 { "tcr_el12", CPENC (3, 5, C2, C0, 2), F_ARCHEXT },
3751 { "vtcr_el2", CPENC(3,4,C2,C1,2), 0 },
3752 { "apiakeylo_el1", CPENC (3, 0, C2, C1, 0), F_ARCHEXT },
3753 { "apiakeyhi_el1", CPENC (3, 0, C2, C1, 1), F_ARCHEXT },
3754 { "apibkeylo_el1", CPENC (3, 0, C2, C1, 2), F_ARCHEXT },
3755 { "apibkeyhi_el1", CPENC (3, 0, C2, C1, 3), F_ARCHEXT },
3756 { "apdakeylo_el1", CPENC (3, 0, C2, C2, 0), F_ARCHEXT },
3757 { "apdakeyhi_el1", CPENC (3, 0, C2, C2, 1), F_ARCHEXT },
3758 { "apdbkeylo_el1", CPENC (3, 0, C2, C2, 2), F_ARCHEXT },
3759 { "apdbkeyhi_el1", CPENC (3, 0, C2, C2, 3), F_ARCHEXT },
3760 { "apgakeylo_el1", CPENC (3, 0, C2, C3, 0), F_ARCHEXT },
3761 { "apgakeyhi_el1", CPENC (3, 0, C2, C3, 1), F_ARCHEXT },
3762 { "afsr0_el1", CPENC(3,0,C5,C1,0), 0 },
3763 { "afsr1_el1", CPENC(3,0,C5,C1,1), 0 },
3764 { "afsr0_el2", CPENC(3,4,C5,C1,0), 0 },
3765 { "afsr1_el2", CPENC(3,4,C5,C1,1), 0 },
3766 { "afsr0_el3", CPENC(3,6,C5,C1,0), 0 },
3767 { "afsr0_el12", CPENC (3, 5, C5, C1, 0), F_ARCHEXT },
3768 { "afsr1_el3", CPENC(3,6,C5,C1,1), 0 },
3769 { "afsr1_el12", CPENC (3, 5, C5, C1, 1), F_ARCHEXT },
3770 { "esr_el1", CPENC(3,0,C5,C2,0), 0 },
3771 { "esr_el2", CPENC(3,4,C5,C2,0), 0 },
3772 { "esr_el3", CPENC(3,6,C5,C2,0), 0 },
3773 { "esr_el12", CPENC (3, 5, C5, C2, 0), F_ARCHEXT },
3774 { "vsesr_el2", CPENC (3, 4, C5, C2, 3), F_ARCHEXT }, /* RO */
3775 { "fpexc32_el2", CPENC(3,4,C5,C3,0), 0 },
3776 { "erridr_el1", CPENC (3, 0, C5, C3, 0), F_ARCHEXT }, /* RO */
3777 { "errselr_el1", CPENC (3, 0, C5, C3, 1), F_ARCHEXT },
3778 { "erxfr_el1", CPENC (3, 0, C5, C4, 0), F_ARCHEXT }, /* RO */
3779 { "erxctlr_el1", CPENC (3, 0, C5, C4, 1), F_ARCHEXT },
3780 { "erxstatus_el1", CPENC (3, 0, C5, C4, 2), F_ARCHEXT },
3781 { "erxaddr_el1", CPENC (3, 0, C5, C4, 3), F_ARCHEXT },
3782 { "erxmisc0_el1", CPENC (3, 0, C5, C5, 0), F_ARCHEXT },
3783 { "erxmisc1_el1", CPENC (3, 0, C5, C5, 1), F_ARCHEXT },
3784 { "far_el1", CPENC(3,0,C6,C0,0), 0 },
3785 { "far_el2", CPENC(3,4,C6,C0,0), 0 },
3786 { "far_el3", CPENC(3,6,C6,C0,0), 0 },
3787 { "far_el12", CPENC (3, 5, C6, C0, 0), F_ARCHEXT },
3788 { "hpfar_el2", CPENC(3,4,C6,C0,4), 0 },
3789 { "par_el1", CPENC(3,0,C7,C4,0), 0 },
3790 { "mair_el1", CPENC(3,0,C10,C2,0), 0 },
3791 { "mair_el2", CPENC(3,4,C10,C2,0), 0 },
3792 { "mair_el3", CPENC(3,6,C10,C2,0), 0 },
3793 { "mair_el12", CPENC (3, 5, C10, C2, 0), F_ARCHEXT },
3794 { "amair_el1", CPENC(3,0,C10,C3,0), 0 },
3795 { "amair_el2", CPENC(3,4,C10,C3,0), 0 },
3796 { "amair_el3", CPENC(3,6,C10,C3,0), 0 },
3797 { "amair_el12", CPENC (3, 5, C10, C3, 0), F_ARCHEXT },
3798 { "vbar_el1", CPENC(3,0,C12,C0,0), 0 },
3799 { "vbar_el2", CPENC(3,4,C12,C0,0), 0 },
3800 { "vbar_el3", CPENC(3,6,C12,C0,0), 0 },
3801 { "vbar_el12", CPENC (3, 5, C12, C0, 0), F_ARCHEXT },
3802 { "rvbar_el1", CPENC(3,0,C12,C0,1), 0 }, /* RO */
3803 { "rvbar_el2", CPENC(3,4,C12,C0,1), 0 }, /* RO */
3804 { "rvbar_el3", CPENC(3,6,C12,C0,1), 0 }, /* RO */
3805 { "rmr_el1", CPENC(3,0,C12,C0,2), 0 },
3806 { "rmr_el2", CPENC(3,4,C12,C0,2), 0 },
3807 { "rmr_el3", CPENC(3,6,C12,C0,2), 0 },
3808 { "isr_el1", CPENC(3,0,C12,C1,0), 0 }, /* RO */
3809 { "disr_el1", CPENC (3, 0, C12, C1, 1), F_ARCHEXT },
3810 { "vdisr_el2", CPENC (3, 4, C12, C1, 1), F_ARCHEXT },
3811 { "contextidr_el1", CPENC(3,0,C13,C0,1), 0 },
3812 { "contextidr_el2", CPENC (3, 4, C13, C0, 1), F_ARCHEXT },
3813 { "contextidr_el12", CPENC (3, 5, C13, C0, 1), F_ARCHEXT },
3814 { "tpidr_el0", CPENC(3,3,C13,C0,2), 0 },
3815 { "tpidrro_el0", CPENC(3,3,C13,C0,3), 0 }, /* RO */
3816 { "tpidr_el1", CPENC(3,0,C13,C0,4), 0 },
3817 { "tpidr_el2", CPENC(3,4,C13,C0,2), 0 },
3818 { "tpidr_el3", CPENC(3,6,C13,C0,2), 0 },
3819 { "teecr32_el1", CPENC(2,2,C0, C0,0), 0 }, /* See section 3.9.7.1 */
3820 { "cntfrq_el0", CPENC(3,3,C14,C0,0), 0 }, /* RO */
3821 { "cntpct_el0", CPENC(3,3,C14,C0,1), 0 }, /* RO */
3822 { "cntvct_el0", CPENC(3,3,C14,C0,2), 0 }, /* RO */
3823 { "cntvoff_el2", CPENC(3,4,C14,C0,3), 0 },
3824 { "cntkctl_el1", CPENC(3,0,C14,C1,0), 0 },
3825 { "cntkctl_el12", CPENC (3, 5, C14, C1, 0), F_ARCHEXT },
3826 { "cnthctl_el2", CPENC(3,4,C14,C1,0), 0 },
3827 { "cntp_tval_el0", CPENC(3,3,C14,C2,0), 0 },
3828 { "cntp_tval_el02", CPENC (3, 5, C14, C2, 0), F_ARCHEXT },
3829 { "cntp_ctl_el0", CPENC(3,3,C14,C2,1), 0 },
3830 { "cntp_ctl_el02", CPENC (3, 5, C14, C2, 1), F_ARCHEXT },
3831 { "cntp_cval_el0", CPENC(3,3,C14,C2,2), 0 },
3832 { "cntp_cval_el02", CPENC (3, 5, C14, C2, 2), F_ARCHEXT },
3833 { "cntv_tval_el0", CPENC(3,3,C14,C3,0), 0 },
3834 { "cntv_tval_el02", CPENC (3, 5, C14, C3, 0), F_ARCHEXT },
3835 { "cntv_ctl_el0", CPENC(3,3,C14,C3,1), 0 },
3836 { "cntv_ctl_el02", CPENC (3, 5, C14, C3, 1), F_ARCHEXT },
3837 { "cntv_cval_el0", CPENC(3,3,C14,C3,2), 0 },
3838 { "cntv_cval_el02", CPENC (3, 5, C14, C3, 2), F_ARCHEXT },
3839 { "cnthp_tval_el2", CPENC(3,4,C14,C2,0), 0 },
3840 { "cnthp_ctl_el2", CPENC(3,4,C14,C2,1), 0 },
3841 { "cnthp_cval_el2", CPENC(3,4,C14,C2,2), 0 },
3842 { "cntps_tval_el1", CPENC(3,7,C14,C2,0), 0 },
3843 { "cntps_ctl_el1", CPENC(3,7,C14,C2,1), 0 },
3844 { "cntps_cval_el1", CPENC(3,7,C14,C2,2), 0 },
3845 { "cnthv_tval_el2", CPENC (3, 4, C14, C3, 0), F_ARCHEXT },
3846 { "cnthv_ctl_el2", CPENC (3, 4, C14, C3, 1), F_ARCHEXT },
3847 { "cnthv_cval_el2", CPENC (3, 4, C14, C3, 2), F_ARCHEXT },
3848 { "dacr32_el2", CPENC(3,4,C3,C0,0), 0 },
3849 { "ifsr32_el2", CPENC(3,4,C5,C0,1), 0 },
3850 { "teehbr32_el1", CPENC(2,2,C1,C0,0), 0 },
3851 { "sder32_el3", CPENC(3,6,C1,C1,1), 0 },
3852 { "mdscr_el1", CPENC(2,0,C0, C2, 2), 0 },
3853 { "mdccsr_el0", CPENC(2,3,C0, C1, 0), 0 }, /* r */
3854 { "mdccint_el1", CPENC(2,0,C0, C2, 0), 0 },
3855 { "dbgdtr_el0", CPENC(2,3,C0, C4, 0), 0 },
3856 { "dbgdtrrx_el0", CPENC(2,3,C0, C5, 0), 0 }, /* r */
3857 { "dbgdtrtx_el0", CPENC(2,3,C0, C5, 0), 0 }, /* w */
3858 { "osdtrrx_el1", CPENC(2,0,C0, C0, 2), 0 }, /* r */
3859 { "osdtrtx_el1", CPENC(2,0,C0, C3, 2), 0 }, /* w */
3860 { "oseccr_el1", CPENC(2,0,C0, C6, 2), 0 },
3861 { "dbgvcr32_el2", CPENC(2,4,C0, C7, 0), 0 },
3862 { "dbgbvr0_el1", CPENC(2,0,C0, C0, 4), 0 },
3863 { "dbgbvr1_el1", CPENC(2,0,C0, C1, 4), 0 },
3864 { "dbgbvr2_el1", CPENC(2,0,C0, C2, 4), 0 },
3865 { "dbgbvr3_el1", CPENC(2,0,C0, C3, 4), 0 },
3866 { "dbgbvr4_el1", CPENC(2,0,C0, C4, 4), 0 },
3867 { "dbgbvr5_el1", CPENC(2,0,C0, C5, 4), 0 },
3868 { "dbgbvr6_el1", CPENC(2,0,C0, C6, 4), 0 },
3869 { "dbgbvr7_el1", CPENC(2,0,C0, C7, 4), 0 },
3870 { "dbgbvr8_el1", CPENC(2,0,C0, C8, 4), 0 },
3871 { "dbgbvr9_el1", CPENC(2,0,C0, C9, 4), 0 },
3872 { "dbgbvr10_el1", CPENC(2,0,C0, C10,4), 0 },
3873 { "dbgbvr11_el1", CPENC(2,0,C0, C11,4), 0 },
3874 { "dbgbvr12_el1", CPENC(2,0,C0, C12,4), 0 },
3875 { "dbgbvr13_el1", CPENC(2,0,C0, C13,4), 0 },
3876 { "dbgbvr14_el1", CPENC(2,0,C0, C14,4), 0 },
3877 { "dbgbvr15_el1", CPENC(2,0,C0, C15,4), 0 },
3878 { "dbgbcr0_el1", CPENC(2,0,C0, C0, 5), 0 },
3879 { "dbgbcr1_el1", CPENC(2,0,C0, C1, 5), 0 },
3880 { "dbgbcr2_el1", CPENC(2,0,C0, C2, 5), 0 },
3881 { "dbgbcr3_el1", CPENC(2,0,C0, C3, 5), 0 },
3882 { "dbgbcr4_el1", CPENC(2,0,C0, C4, 5), 0 },
3883 { "dbgbcr5_el1", CPENC(2,0,C0, C5, 5), 0 },
3884 { "dbgbcr6_el1", CPENC(2,0,C0, C6, 5), 0 },
3885 { "dbgbcr7_el1", CPENC(2,0,C0, C7, 5), 0 },
3886 { "dbgbcr8_el1", CPENC(2,0,C0, C8, 5), 0 },
3887 { "dbgbcr9_el1", CPENC(2,0,C0, C9, 5), 0 },
3888 { "dbgbcr10_el1", CPENC(2,0,C0, C10,5), 0 },
3889 { "dbgbcr11_el1", CPENC(2,0,C0, C11,5), 0 },
3890 { "dbgbcr12_el1", CPENC(2,0,C0, C12,5), 0 },
3891 { "dbgbcr13_el1", CPENC(2,0,C0, C13,5), 0 },
3892 { "dbgbcr14_el1", CPENC(2,0,C0, C14,5), 0 },
3893 { "dbgbcr15_el1", CPENC(2,0,C0, C15,5), 0 },
3894 { "dbgwvr0_el1", CPENC(2,0,C0, C0, 6), 0 },
3895 { "dbgwvr1_el1", CPENC(2,0,C0, C1, 6), 0 },
3896 { "dbgwvr2_el1", CPENC(2,0,C0, C2, 6), 0 },
3897 { "dbgwvr3_el1", CPENC(2,0,C0, C3, 6), 0 },
3898 { "dbgwvr4_el1", CPENC(2,0,C0, C4, 6), 0 },
3899 { "dbgwvr5_el1", CPENC(2,0,C0, C5, 6), 0 },
3900 { "dbgwvr6_el1", CPENC(2,0,C0, C6, 6), 0 },
3901 { "dbgwvr7_el1", CPENC(2,0,C0, C7, 6), 0 },
3902 { "dbgwvr8_el1", CPENC(2,0,C0, C8, 6), 0 },
3903 { "dbgwvr9_el1", CPENC(2,0,C0, C9, 6), 0 },
3904 { "dbgwvr10_el1", CPENC(2,0,C0, C10,6), 0 },
3905 { "dbgwvr11_el1", CPENC(2,0,C0, C11,6), 0 },
3906 { "dbgwvr12_el1", CPENC(2,0,C0, C12,6), 0 },
3907 { "dbgwvr13_el1", CPENC(2,0,C0, C13,6), 0 },
3908 { "dbgwvr14_el1", CPENC(2,0,C0, C14,6), 0 },
3909 { "dbgwvr15_el1", CPENC(2,0,C0, C15,6), 0 },
3910 { "dbgwcr0_el1", CPENC(2,0,C0, C0, 7), 0 },
3911 { "dbgwcr1_el1", CPENC(2,0,C0, C1, 7), 0 },
3912 { "dbgwcr2_el1", CPENC(2,0,C0, C2, 7), 0 },
3913 { "dbgwcr3_el1", CPENC(2,0,C0, C3, 7), 0 },
3914 { "dbgwcr4_el1", CPENC(2,0,C0, C4, 7), 0 },
3915 { "dbgwcr5_el1", CPENC(2,0,C0, C5, 7), 0 },
3916 { "dbgwcr6_el1", CPENC(2,0,C0, C6, 7), 0 },
3917 { "dbgwcr7_el1", CPENC(2,0,C0, C7, 7), 0 },
3918 { "dbgwcr8_el1", CPENC(2,0,C0, C8, 7), 0 },
3919 { "dbgwcr9_el1", CPENC(2,0,C0, C9, 7), 0 },
3920 { "dbgwcr10_el1", CPENC(2,0,C0, C10,7), 0 },
3921 { "dbgwcr11_el1", CPENC(2,0,C0, C11,7), 0 },
3922 { "dbgwcr12_el1", CPENC(2,0,C0, C12,7), 0 },
3923 { "dbgwcr13_el1", CPENC(2,0,C0, C13,7), 0 },
3924 { "dbgwcr14_el1", CPENC(2,0,C0, C14,7), 0 },
3925 { "dbgwcr15_el1", CPENC(2,0,C0, C15,7), 0 },
3926 { "mdrar_el1", CPENC(2,0,C1, C0, 0), 0 }, /* r */
3927 { "oslar_el1", CPENC(2,0,C1, C0, 4), 0 }, /* w */
3928 { "oslsr_el1", CPENC(2,0,C1, C1, 4), 0 }, /* r */
3929 { "osdlr_el1", CPENC(2,0,C1, C3, 4), 0 },
3930 { "dbgprcr_el1", CPENC(2,0,C1, C4, 4), 0 },
3931 { "dbgclaimset_el1", CPENC(2,0,C7, C8, 6), 0 },
3932 { "dbgclaimclr_el1", CPENC(2,0,C7, C9, 6), 0 },
3933 { "dbgauthstatus_el1", CPENC(2,0,C7, C14,6), 0 }, /* r */
3934 { "pmblimitr_el1", CPENC (3, 0, C9, C10, 0), F_ARCHEXT }, /* rw */
3935 { "pmbptr_el1", CPENC (3, 0, C9, C10, 1), F_ARCHEXT }, /* rw */
3936 { "pmbsr_el1", CPENC (3, 0, C9, C10, 3), F_ARCHEXT }, /* rw */
3937 { "pmbidr_el1", CPENC (3, 0, C9, C10, 7), F_ARCHEXT }, /* ro */
3938 { "pmscr_el1", CPENC (3, 0, C9, C9, 0), F_ARCHEXT }, /* rw */
3939 { "pmsicr_el1", CPENC (3, 0, C9, C9, 2), F_ARCHEXT }, /* rw */
3940 { "pmsirr_el1", CPENC (3, 0, C9, C9, 3), F_ARCHEXT }, /* rw */
3941 { "pmsfcr_el1", CPENC (3, 0, C9, C9, 4), F_ARCHEXT }, /* rw */
3942 { "pmsevfr_el1", CPENC (3, 0, C9, C9, 5), F_ARCHEXT }, /* rw */
3943 { "pmslatfr_el1", CPENC (3, 0, C9, C9, 6), F_ARCHEXT }, /* rw */
3944 { "pmsidr_el1", CPENC (3, 0, C9, C9, 7), F_ARCHEXT }, /* ro */
3945 { "pmscr_el2", CPENC (3, 4, C9, C9, 0), F_ARCHEXT }, /* rw */
3946 { "pmscr_el12", CPENC (3, 5, C9, C9, 0), F_ARCHEXT }, /* rw */
3947 { "pmcr_el0", CPENC(3,3,C9,C12, 0), 0 },
3948 { "pmcntenset_el0", CPENC(3,3,C9,C12, 1), 0 },
3949 { "pmcntenclr_el0", CPENC(3,3,C9,C12, 2), 0 },
3950 { "pmovsclr_el0", CPENC(3,3,C9,C12, 3), 0 },
3951 { "pmswinc_el0", CPENC(3,3,C9,C12, 4), 0 }, /* w */
3952 { "pmselr_el0", CPENC(3,3,C9,C12, 5), 0 },
3953 { "pmceid0_el0", CPENC(3,3,C9,C12, 6), 0 }, /* r */
3954 { "pmceid1_el0", CPENC(3,3,C9,C12, 7), 0 }, /* r */
3955 { "pmccntr_el0", CPENC(3,3,C9,C13, 0), 0 },
3956 { "pmxevtyper_el0", CPENC(3,3,C9,C13, 1), 0 },
3957 { "pmxevcntr_el0", CPENC(3,3,C9,C13, 2), 0 },
3958 { "pmuserenr_el0", CPENC(3,3,C9,C14, 0), 0 },
3959 { "pmintenset_el1", CPENC(3,0,C9,C14, 1), 0 },
3960 { "pmintenclr_el1", CPENC(3,0,C9,C14, 2), 0 },
3961 { "pmovsset_el0", CPENC(3,3,C9,C14, 3), 0 },
3962 { "pmevcntr0_el0", CPENC(3,3,C14,C8, 0), 0 },
3963 { "pmevcntr1_el0", CPENC(3,3,C14,C8, 1), 0 },
3964 { "pmevcntr2_el0", CPENC(3,3,C14,C8, 2), 0 },
3965 { "pmevcntr3_el0", CPENC(3,3,C14,C8, 3), 0 },
3966 { "pmevcntr4_el0", CPENC(3,3,C14,C8, 4), 0 },
3967 { "pmevcntr5_el0", CPENC(3,3,C14,C8, 5), 0 },
3968 { "pmevcntr6_el0", CPENC(3,3,C14,C8, 6), 0 },
3969 { "pmevcntr7_el0", CPENC(3,3,C14,C8, 7), 0 },
3970 { "pmevcntr8_el0", CPENC(3,3,C14,C9, 0), 0 },
3971 { "pmevcntr9_el0", CPENC(3,3,C14,C9, 1), 0 },
3972 { "pmevcntr10_el0", CPENC(3,3,C14,C9, 2), 0 },
3973 { "pmevcntr11_el0", CPENC(3,3,C14,C9, 3), 0 },
3974 { "pmevcntr12_el0", CPENC(3,3,C14,C9, 4), 0 },
3975 { "pmevcntr13_el0", CPENC(3,3,C14,C9, 5), 0 },
3976 { "pmevcntr14_el0", CPENC(3,3,C14,C9, 6), 0 },
3977 { "pmevcntr15_el0", CPENC(3,3,C14,C9, 7), 0 },
3978 { "pmevcntr16_el0", CPENC(3,3,C14,C10,0), 0 },
3979 { "pmevcntr17_el0", CPENC(3,3,C14,C10,1), 0 },
3980 { "pmevcntr18_el0", CPENC(3,3,C14,C10,2), 0 },
3981 { "pmevcntr19_el0", CPENC(3,3,C14,C10,3), 0 },
3982 { "pmevcntr20_el0", CPENC(3,3,C14,C10,4), 0 },
3983 { "pmevcntr21_el0", CPENC(3,3,C14,C10,5), 0 },
3984 { "pmevcntr22_el0", CPENC(3,3,C14,C10,6), 0 },
3985 { "pmevcntr23_el0", CPENC(3,3,C14,C10,7), 0 },
3986 { "pmevcntr24_el0", CPENC(3,3,C14,C11,0), 0 },
3987 { "pmevcntr25_el0", CPENC(3,3,C14,C11,1), 0 },
3988 { "pmevcntr26_el0", CPENC(3,3,C14,C11,2), 0 },
3989 { "pmevcntr27_el0", CPENC(3,3,C14,C11,3), 0 },
3990 { "pmevcntr28_el0", CPENC(3,3,C14,C11,4), 0 },
3991 { "pmevcntr29_el0", CPENC(3,3,C14,C11,5), 0 },
3992 { "pmevcntr30_el0", CPENC(3,3,C14,C11,6), 0 },
3993 { "pmevtyper0_el0", CPENC(3,3,C14,C12,0), 0 },
3994 { "pmevtyper1_el0", CPENC(3,3,C14,C12,1), 0 },
3995 { "pmevtyper2_el0", CPENC(3,3,C14,C12,2), 0 },
3996 { "pmevtyper3_el0", CPENC(3,3,C14,C12,3), 0 },
3997 { "pmevtyper4_el0", CPENC(3,3,C14,C12,4), 0 },
3998 { "pmevtyper5_el0", CPENC(3,3,C14,C12,5), 0 },
3999 { "pmevtyper6_el0", CPENC(3,3,C14,C12,6), 0 },
4000 { "pmevtyper7_el0", CPENC(3,3,C14,C12,7), 0 },
4001 { "pmevtyper8_el0", CPENC(3,3,C14,C13,0), 0 },
4002 { "pmevtyper9_el0", CPENC(3,3,C14,C13,1), 0 },
4003 { "pmevtyper10_el0", CPENC(3,3,C14,C13,2), 0 },
4004 { "pmevtyper11_el0", CPENC(3,3,C14,C13,3), 0 },
4005 { "pmevtyper12_el0", CPENC(3,3,C14,C13,4), 0 },
4006 { "pmevtyper13_el0", CPENC(3,3,C14,C13,5), 0 },
4007 { "pmevtyper14_el0", CPENC(3,3,C14,C13,6), 0 },
4008 { "pmevtyper15_el0", CPENC(3,3,C14,C13,7), 0 },
4009 { "pmevtyper16_el0", CPENC(3,3,C14,C14,0), 0 },
4010 { "pmevtyper17_el0", CPENC(3,3,C14,C14,1), 0 },
4011 { "pmevtyper18_el0", CPENC(3,3,C14,C14,2), 0 },
4012 { "pmevtyper19_el0", CPENC(3,3,C14,C14,3), 0 },
4013 { "pmevtyper20_el0", CPENC(3,3,C14,C14,4), 0 },
4014 { "pmevtyper21_el0", CPENC(3,3,C14,C14,5), 0 },
4015 { "pmevtyper22_el0", CPENC(3,3,C14,C14,6), 0 },
4016 { "pmevtyper23_el0", CPENC(3,3,C14,C14,7), 0 },
4017 { "pmevtyper24_el0", CPENC(3,3,C14,C15,0), 0 },
4018 { "pmevtyper25_el0", CPENC(3,3,C14,C15,1), 0 },
4019 { "pmevtyper26_el0", CPENC(3,3,C14,C15,2), 0 },
4020 { "pmevtyper27_el0", CPENC(3,3,C14,C15,3), 0 },
4021 { "pmevtyper28_el0", CPENC(3,3,C14,C15,4), 0 },
4022 { "pmevtyper29_el0", CPENC(3,3,C14,C15,5), 0 },
4023 { "pmevtyper30_el0", CPENC(3,3,C14,C15,6), 0 },
4024 { "pmccfiltr_el0", CPENC(3,3,C14,C15,7), 0 },
4025 { 0, CPENC(0,0,0,0,0), 0 },
4026 };
4027
4028 bfd_boolean
4029 aarch64_sys_reg_deprecated_p (const aarch64_sys_reg *reg)
4030 {
4031 return (reg->flags & F_DEPRECATED) != 0;
4032 }
4033
4034 bfd_boolean
4035 aarch64_sys_reg_supported_p (const aarch64_feature_set features,
4036 const aarch64_sys_reg *reg)
4037 {
4038 if (!(reg->flags & F_ARCHEXT))
4039 return TRUE;
4040
4041 /* PAN. Values are from aarch64_sys_regs. */
4042 if (reg->value == CPEN_(0,C2,3)
4043 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_PAN))
4044 return FALSE;
4045
4046 /* Virtualization host extensions: system registers. */
4047 if ((reg->value == CPENC (3, 4, C2, C0, 1)
4048 || reg->value == CPENC (3, 4, C13, C0, 1)
4049 || reg->value == CPENC (3, 4, C14, C3, 0)
4050 || reg->value == CPENC (3, 4, C14, C3, 1)
4051 || reg->value == CPENC (3, 4, C14, C3, 2))
4052 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_V8_1))
4053 return FALSE;
4054
4055 /* Virtualization host extensions: *_el12 names of *_el1 registers. */
4056 if ((reg->value == CPEN_ (5, C0, 0)
4057 || reg->value == CPEN_ (5, C0, 1)
4058 || reg->value == CPENC (3, 5, C1, C0, 0)
4059 || reg->value == CPENC (3, 5, C1, C0, 2)
4060 || reg->value == CPENC (3, 5, C2, C0, 0)
4061 || reg->value == CPENC (3, 5, C2, C0, 1)
4062 || reg->value == CPENC (3, 5, C2, C0, 2)
4063 || reg->value == CPENC (3, 5, C5, C1, 0)
4064 || reg->value == CPENC (3, 5, C5, C1, 1)
4065 || reg->value == CPENC (3, 5, C5, C2, 0)
4066 || reg->value == CPENC (3, 5, C6, C0, 0)
4067 || reg->value == CPENC (3, 5, C10, C2, 0)
4068 || reg->value == CPENC (3, 5, C10, C3, 0)
4069 || reg->value == CPENC (3, 5, C12, C0, 0)
4070 || reg->value == CPENC (3, 5, C13, C0, 1)
4071 || reg->value == CPENC (3, 5, C14, C1, 0))
4072 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_V8_1))
4073 return FALSE;
4074
4075 /* Virtualization host extensions: *_el02 names of *_el0 registers. */
4076 if ((reg->value == CPENC (3, 5, C14, C2, 0)
4077 || reg->value == CPENC (3, 5, C14, C2, 1)
4078 || reg->value == CPENC (3, 5, C14, C2, 2)
4079 || reg->value == CPENC (3, 5, C14, C3, 0)
4080 || reg->value == CPENC (3, 5, C14, C3, 1)
4081 || reg->value == CPENC (3, 5, C14, C3, 2))
4082 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_V8_1))
4083 return FALSE;
4084
4085 /* ARMv8.2 features. */
4086
4087 /* ID_AA64MMFR2_EL1. */
4088 if (reg->value == CPENC (3, 0, C0, C7, 2)
4089 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_V8_2))
4090 return FALSE;
4091
4092 /* PSTATE.UAO. */
4093 if (reg->value == CPEN_ (0, C2, 4)
4094 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_V8_2))
4095 return FALSE;
4096
4097 /* RAS extension. */
4098
4099 /* ERRIDR_EL1, ERRSELR_EL1, ERXFR_EL1, ERXCTLR_EL1, ERXSTATUS_EL, ERXADDR_EL1,
4100 ERXMISC0_EL1 AND ERXMISC1_EL1. */
4101 if ((reg->value == CPENC (3, 0, C5, C3, 0)
4102 || reg->value == CPENC (3, 0, C5, C3, 1)
4103 || reg->value == CPENC (3, 0, C5, C3, 2)
4104 || reg->value == CPENC (3, 0, C5, C3, 3)
4105 || reg->value == CPENC (3, 0, C5, C4, 0)
4106 || reg->value == CPENC (3, 0, C5, C4, 1)
4107 || reg->value == CPENC (3, 0, C5, C4, 2)
4108 || reg->value == CPENC (3, 0, C5, C4, 3)
4109 || reg->value == CPENC (3, 0, C5, C5, 0)
4110 || reg->value == CPENC (3, 0, C5, C5, 1))
4111 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_RAS))
4112 return FALSE;
4113
4114 /* VSESR_EL2, DISR_EL1 and VDISR_EL2. */
4115 if ((reg->value == CPENC (3, 4, C5, C2, 3)
4116 || reg->value == CPENC (3, 0, C12, C1, 1)
4117 || reg->value == CPENC (3, 4, C12, C1, 1))
4118 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_RAS))
4119 return FALSE;
4120
4121 /* Statistical Profiling extension. */
4122 if ((reg->value == CPENC (3, 0, C9, C10, 0)
4123 || reg->value == CPENC (3, 0, C9, C10, 1)
4124 || reg->value == CPENC (3, 0, C9, C10, 3)
4125 || reg->value == CPENC (3, 0, C9, C10, 7)
4126 || reg->value == CPENC (3, 0, C9, C9, 0)
4127 || reg->value == CPENC (3, 0, C9, C9, 2)
4128 || reg->value == CPENC (3, 0, C9, C9, 3)
4129 || reg->value == CPENC (3, 0, C9, C9, 4)
4130 || reg->value == CPENC (3, 0, C9, C9, 5)
4131 || reg->value == CPENC (3, 0, C9, C9, 6)
4132 || reg->value == CPENC (3, 0, C9, C9, 7)
4133 || reg->value == CPENC (3, 4, C9, C9, 0)
4134 || reg->value == CPENC (3, 5, C9, C9, 0))
4135 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_PROFILE))
4136 return FALSE;
4137
4138 /* ARMv8.3 Pointer authentication keys. */
4139 if ((reg->value == CPENC (3, 0, C2, C1, 0)
4140 || reg->value == CPENC (3, 0, C2, C1, 1)
4141 || reg->value == CPENC (3, 0, C2, C1, 2)
4142 || reg->value == CPENC (3, 0, C2, C1, 3)
4143 || reg->value == CPENC (3, 0, C2, C2, 0)
4144 || reg->value == CPENC (3, 0, C2, C2, 1)
4145 || reg->value == CPENC (3, 0, C2, C2, 2)
4146 || reg->value == CPENC (3, 0, C2, C2, 3)
4147 || reg->value == CPENC (3, 0, C2, C3, 0)
4148 || reg->value == CPENC (3, 0, C2, C3, 1))
4149 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_V8_3))
4150 return FALSE;
4151
4152 /* SVE. */
4153 if ((reg->value == CPENC (3, 0, C0, C4, 4)
4154 || reg->value == CPENC (3, 0, C1, C2, 0)
4155 || reg->value == CPENC (3, 4, C1, C2, 0)
4156 || reg->value == CPENC (3, 6, C1, C2, 0)
4157 || reg->value == CPENC (3, 5, C1, C2, 0)
4158 || reg->value == CPENC (3, 0, C0, C0, 7))
4159 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_SVE))
4160 return FALSE;
4161
4162 return TRUE;
4163 }
4164
4165 const aarch64_sys_reg aarch64_pstatefields [] =
4166 {
4167 { "spsel", 0x05, 0 },
4168 { "daifset", 0x1e, 0 },
4169 { "daifclr", 0x1f, 0 },
4170 { "pan", 0x04, F_ARCHEXT },
4171 { "uao", 0x03, F_ARCHEXT },
4172 { 0, CPENC(0,0,0,0,0), 0 },
4173 };
4174
4175 bfd_boolean
4176 aarch64_pstatefield_supported_p (const aarch64_feature_set features,
4177 const aarch64_sys_reg *reg)
4178 {
4179 if (!(reg->flags & F_ARCHEXT))
4180 return TRUE;
4181
4182 /* PAN. Values are from aarch64_pstatefields. */
4183 if (reg->value == 0x04
4184 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_PAN))
4185 return FALSE;
4186
4187 /* UAO. Values are from aarch64_pstatefields. */
4188 if (reg->value == 0x03
4189 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_V8_2))
4190 return FALSE;
4191
4192 return TRUE;
4193 }
4194
4195 const aarch64_sys_ins_reg aarch64_sys_regs_ic[] =
4196 {
4197 { "ialluis", CPENS(0,C7,C1,0), 0 },
4198 { "iallu", CPENS(0,C7,C5,0), 0 },
4199 { "ivau", CPENS (3, C7, C5, 1), F_HASXT },
4200 { 0, CPENS(0,0,0,0), 0 }
4201 };
4202
4203 const aarch64_sys_ins_reg aarch64_sys_regs_dc[] =
4204 {
4205 { "zva", CPENS (3, C7, C4, 1), F_HASXT },
4206 { "ivac", CPENS (0, C7, C6, 1), F_HASXT },
4207 { "isw", CPENS (0, C7, C6, 2), F_HASXT },
4208 { "cvac", CPENS (3, C7, C10, 1), F_HASXT },
4209 { "csw", CPENS (0, C7, C10, 2), F_HASXT },
4210 { "cvau", CPENS (3, C7, C11, 1), F_HASXT },
4211 { "cvap", CPENS (3, C7, C12, 1), F_HASXT | F_ARCHEXT },
4212 { "civac", CPENS (3, C7, C14, 1), F_HASXT },
4213 { "cisw", CPENS (0, C7, C14, 2), F_HASXT },
4214 { 0, CPENS(0,0,0,0), 0 }
4215 };
4216
4217 const aarch64_sys_ins_reg aarch64_sys_regs_at[] =
4218 {
4219 { "s1e1r", CPENS (0, C7, C8, 0), F_HASXT },
4220 { "s1e1w", CPENS (0, C7, C8, 1), F_HASXT },
4221 { "s1e0r", CPENS (0, C7, C8, 2), F_HASXT },
4222 { "s1e0w", CPENS (0, C7, C8, 3), F_HASXT },
4223 { "s12e1r", CPENS (4, C7, C8, 4), F_HASXT },
4224 { "s12e1w", CPENS (4, C7, C8, 5), F_HASXT },
4225 { "s12e0r", CPENS (4, C7, C8, 6), F_HASXT },
4226 { "s12e0w", CPENS (4, C7, C8, 7), F_HASXT },
4227 { "s1e2r", CPENS (4, C7, C8, 0), F_HASXT },
4228 { "s1e2w", CPENS (4, C7, C8, 1), F_HASXT },
4229 { "s1e3r", CPENS (6, C7, C8, 0), F_HASXT },
4230 { "s1e3w", CPENS (6, C7, C8, 1), F_HASXT },
4231 { "s1e1rp", CPENS (0, C7, C9, 0), F_HASXT | F_ARCHEXT },
4232 { "s1e1wp", CPENS (0, C7, C9, 1), F_HASXT | F_ARCHEXT },
4233 { 0, CPENS(0,0,0,0), 0 }
4234 };
4235
4236 const aarch64_sys_ins_reg aarch64_sys_regs_tlbi[] =
4237 {
4238 { "vmalle1", CPENS(0,C8,C7,0), 0 },
4239 { "vae1", CPENS (0, C8, C7, 1), F_HASXT },
4240 { "aside1", CPENS (0, C8, C7, 2), F_HASXT },
4241 { "vaae1", CPENS (0, C8, C7, 3), F_HASXT },
4242 { "vmalle1is", CPENS(0,C8,C3,0), 0 },
4243 { "vae1is", CPENS (0, C8, C3, 1), F_HASXT },
4244 { "aside1is", CPENS (0, C8, C3, 2), F_HASXT },
4245 { "vaae1is", CPENS (0, C8, C3, 3), F_HASXT },
4246 { "ipas2e1is", CPENS (4, C8, C0, 1), F_HASXT },
4247 { "ipas2le1is",CPENS (4, C8, C0, 5), F_HASXT },
4248 { "ipas2e1", CPENS (4, C8, C4, 1), F_HASXT },
4249 { "ipas2le1", CPENS (4, C8, C4, 5), F_HASXT },
4250 { "vae2", CPENS (4, C8, C7, 1), F_HASXT },
4251 { "vae2is", CPENS (4, C8, C3, 1), F_HASXT },
4252 { "vmalls12e1",CPENS(4,C8,C7,6), 0 },
4253 { "vmalls12e1is",CPENS(4,C8,C3,6), 0 },
4254 { "vae3", CPENS (6, C8, C7, 1), F_HASXT },
4255 { "vae3is", CPENS (6, C8, C3, 1), F_HASXT },
4256 { "alle2", CPENS(4,C8,C7,0), 0 },
4257 { "alle2is", CPENS(4,C8,C3,0), 0 },
4258 { "alle1", CPENS(4,C8,C7,4), 0 },
4259 { "alle1is", CPENS(4,C8,C3,4), 0 },
4260 { "alle3", CPENS(6,C8,C7,0), 0 },
4261 { "alle3is", CPENS(6,C8,C3,0), 0 },
4262 { "vale1is", CPENS (0, C8, C3, 5), F_HASXT },
4263 { "vale2is", CPENS (4, C8, C3, 5), F_HASXT },
4264 { "vale3is", CPENS (6, C8, C3, 5), F_HASXT },
4265 { "vaale1is", CPENS (0, C8, C3, 7), F_HASXT },
4266 { "vale1", CPENS (0, C8, C7, 5), F_HASXT },
4267 { "vale2", CPENS (4, C8, C7, 5), F_HASXT },
4268 { "vale3", CPENS (6, C8, C7, 5), F_HASXT },
4269 { "vaale1", CPENS (0, C8, C7, 7), F_HASXT },
4270 { 0, CPENS(0,0,0,0), 0 }
4271 };
4272
4273 bfd_boolean
4274 aarch64_sys_ins_reg_has_xt (const aarch64_sys_ins_reg *sys_ins_reg)
4275 {
4276 return (sys_ins_reg->flags & F_HASXT) != 0;
4277 }
4278
4279 extern bfd_boolean
4280 aarch64_sys_ins_reg_supported_p (const aarch64_feature_set features,
4281 const aarch64_sys_ins_reg *reg)
4282 {
4283 if (!(reg->flags & F_ARCHEXT))
4284 return TRUE;
4285
4286 /* DC CVAP. Values are from aarch64_sys_regs_dc. */
4287 if (reg->value == CPENS (3, C7, C12, 1)
4288 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_V8_2))
4289 return FALSE;
4290
4291 /* AT S1E1RP, AT S1E1WP. Values are from aarch64_sys_regs_at. */
4292 if ((reg->value == CPENS (0, C7, C9, 0)
4293 || reg->value == CPENS (0, C7, C9, 1))
4294 && !AARCH64_CPU_HAS_FEATURE (features, AARCH64_FEATURE_V8_2))
4295 return FALSE;
4296
4297 return TRUE;
4298 }
4299
4300 #undef C0
4301 #undef C1
4302 #undef C2
4303 #undef C3
4304 #undef C4
4305 #undef C5
4306 #undef C6
4307 #undef C7
4308 #undef C8
4309 #undef C9
4310 #undef C10
4311 #undef C11
4312 #undef C12
4313 #undef C13
4314 #undef C14
4315 #undef C15
4316
4317 #define BIT(INSN,BT) (((INSN) >> (BT)) & 1)
4318 #define BITS(INSN,HI,LO) (((INSN) >> (LO)) & ((1 << (((HI) - (LO)) + 1)) - 1))
4319
4320 static bfd_boolean
4321 verify_ldpsw (const struct aarch64_opcode * opcode ATTRIBUTE_UNUSED,
4322 const aarch64_insn insn)
4323 {
4324 int t = BITS (insn, 4, 0);
4325 int n = BITS (insn, 9, 5);
4326 int t2 = BITS (insn, 14, 10);
4327
4328 if (BIT (insn, 23))
4329 {
4330 /* Write back enabled. */
4331 if ((t == n || t2 == n) && n != 31)
4332 return FALSE;
4333 }
4334
4335 if (BIT (insn, 22))
4336 {
4337 /* Load */
4338 if (t == t2)
4339 return FALSE;
4340 }
4341
4342 return TRUE;
4343 }
4344
4345 /* Return true if VALUE cannot be moved into an SVE register using DUP
4346 (with any element size, not just ESIZE) and if using DUPM would
4347 therefore be OK. ESIZE is the number of bytes in the immediate. */
4348
4349 bfd_boolean
4350 aarch64_sve_dupm_mov_immediate_p (uint64_t uvalue, int esize)
4351 {
4352 int64_t svalue = uvalue;
4353 uint64_t upper = (uint64_t) -1 << (esize * 4) << (esize * 4);
4354
4355 if ((uvalue & ~upper) != uvalue && (uvalue | upper) != uvalue)
4356 return FALSE;
4357 if (esize <= 4 || (uint32_t) uvalue == (uint32_t) (uvalue >> 32))
4358 {
4359 svalue = (int32_t) uvalue;
4360 if (esize <= 2 || (uint16_t) uvalue == (uint16_t) (uvalue >> 16))
4361 {
4362 svalue = (int16_t) uvalue;
4363 if (esize == 1 || (uint8_t) uvalue == (uint8_t) (uvalue >> 8))
4364 return FALSE;
4365 }
4366 }
4367 if ((svalue & 0xff) == 0)
4368 svalue /= 256;
4369 return svalue < -128 || svalue >= 128;
4370 }
4371
4372 /* Include the opcode description table as well as the operand description
4373 table. */
4374 #define VERIFIER(x) verify_##x
4375 #include "aarch64-tbl.h"
This page took 0.287935 seconds and 3 git commands to generate.