xref: /netbsd-src/external/gpl3/binutils/dist/opcodes/aarch64-opc.c (revision 413d532bcc3f62d122e56d92e13ac64825a40baf)
1 /* aarch64-opc.c -- AArch64 opcode support.
2    Copyright 2009, 2010, 2011, 2012, 2013  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 
31 #include "aarch64-opc.h"
32 
33 #ifdef DEBUG_AARCH64
34 int debug_dump = FALSE;
35 #endif /* DEBUG_AARCH64 */
36 
37 /* Helper functions to determine which operand to be used to encode/decode
38    the size:Q fields for AdvSIMD instructions.  */
39 
40 static inline bfd_boolean
41 vector_qualifier_p (enum aarch64_opnd_qualifier qualifier)
42 {
43   return ((qualifier >= AARCH64_OPND_QLF_V_8B
44 	  && qualifier <= AARCH64_OPND_QLF_V_1Q) ? TRUE
45 	  : FALSE);
46 }
47 
48 static inline bfd_boolean
49 fp_qualifier_p (enum aarch64_opnd_qualifier qualifier)
50 {
51   return ((qualifier >= AARCH64_OPND_QLF_S_B
52 	  && qualifier <= AARCH64_OPND_QLF_S_Q) ? TRUE
53 	  : FALSE);
54 }
55 
56 enum data_pattern
57 {
58   DP_UNKNOWN,
59   DP_VECTOR_3SAME,
60   DP_VECTOR_LONG,
61   DP_VECTOR_WIDE,
62   DP_VECTOR_ACROSS_LANES,
63 };
64 
65 static const char significant_operand_index [] =
66 {
67   0,	/* DP_UNKNOWN, by default using operand 0.  */
68   0,	/* DP_VECTOR_3SAME */
69   1,	/* DP_VECTOR_LONG */
70   2,	/* DP_VECTOR_WIDE */
71   1,	/* DP_VECTOR_ACROSS_LANES */
72 };
73 
74 /* Given a sequence of qualifiers in QUALIFIERS, determine and return
75    the data pattern.
76    N.B. QUALIFIERS is a possible sequence of qualifiers each of which
77    corresponds to one of a sequence of operands.  */
78 
79 static enum data_pattern
80 get_data_pattern (const aarch64_opnd_qualifier_seq_t qualifiers)
81 {
82   if (vector_qualifier_p (qualifiers[0]) == TRUE)
83     {
84       /* e.g. v.4s, v.4s, v.4s
85 	   or v.4h, v.4h, v.h[3].  */
86       if (qualifiers[0] == qualifiers[1]
87 	  && vector_qualifier_p (qualifiers[2]) == TRUE
88 	  && (aarch64_get_qualifier_esize (qualifiers[0])
89 	      == aarch64_get_qualifier_esize (qualifiers[1]))
90 	  && (aarch64_get_qualifier_esize (qualifiers[0])
91 	      == aarch64_get_qualifier_esize (qualifiers[2])))
92 	return DP_VECTOR_3SAME;
93       /* e.g. v.8h, v.8b, v.8b.
94            or v.4s, v.4h, v.h[2].
95 	   or v.8h, v.16b.  */
96       if (vector_qualifier_p (qualifiers[1]) == TRUE
97 	  && aarch64_get_qualifier_esize (qualifiers[0]) != 0
98 	  && (aarch64_get_qualifier_esize (qualifiers[0])
99 	      == aarch64_get_qualifier_esize (qualifiers[1]) << 1))
100 	return DP_VECTOR_LONG;
101       /* e.g. v.8h, v.8h, v.8b.  */
102       if (qualifiers[0] == qualifiers[1]
103 	  && vector_qualifier_p (qualifiers[2]) == TRUE
104 	  && aarch64_get_qualifier_esize (qualifiers[0]) != 0
105 	  && (aarch64_get_qualifier_esize (qualifiers[0])
106 	      == aarch64_get_qualifier_esize (qualifiers[2]) << 1)
107 	  && (aarch64_get_qualifier_esize (qualifiers[0])
108 	      == aarch64_get_qualifier_esize (qualifiers[1])))
109 	return DP_VECTOR_WIDE;
110     }
111   else if (fp_qualifier_p (qualifiers[0]) == TRUE)
112     {
113       /* e.g. SADDLV <V><d>, <Vn>.<T>.  */
114       if (vector_qualifier_p (qualifiers[1]) == TRUE
115 	  && qualifiers[2] == AARCH64_OPND_QLF_NIL)
116 	return DP_VECTOR_ACROSS_LANES;
117     }
118 
119   return DP_UNKNOWN;
120 }
121 
122 /* Select the operand to do the encoding/decoding of the 'size:Q' fields in
123    the AdvSIMD instructions.  */
124 /* N.B. it is possible to do some optimization that doesn't call
125    get_data_pattern each time when we need to select an operand.  We can
126    either buffer the caculated the result or statically generate the data,
127    however, it is not obvious that the optimization will bring significant
128    benefit.  */
129 
130 int
131 aarch64_select_operand_for_sizeq_field_coding (const aarch64_opcode *opcode)
132 {
133   return
134     significant_operand_index [get_data_pattern (opcode->qualifiers_list[0])];
135 }
136 
137 const aarch64_field fields[] =
138 {
139     {  0,  0 },	/* NIL.  */
140     {  0,  4 },	/* cond2: condition in truly conditional-executed inst.  */
141     {  0,  4 },	/* nzcv: flag bit specifier, encoded in the "nzcv" field.  */
142     {  5,  5 },	/* defgh: d:e:f:g:h bits in AdvSIMD modified immediate.  */
143     { 16,  3 },	/* abc: a:b:c bits in AdvSIMD modified immediate.  */
144     {  5, 19 },	/* imm19: e.g. in CBZ.  */
145     {  5, 19 },	/* immhi: e.g. in ADRP.  */
146     { 29,  2 },	/* immlo: e.g. in ADRP.  */
147     { 22,  2 },	/* size: in most AdvSIMD and floating-point instructions.  */
148     { 10,  2 },	/* vldst_size: size field in the AdvSIMD load/store inst.  */
149     { 29,  1 },	/* op: in AdvSIMD modified immediate instructions.  */
150     { 30,  1 },	/* Q: in most AdvSIMD instructions.  */
151     {  0,  5 },	/* Rt: in load/store instructions.  */
152     {  0,  5 },	/* Rd: in many integer instructions.  */
153     {  5,  5 },	/* Rn: in many integer instructions.  */
154     { 10,  5 },	/* Rt2: in load/store pair instructions.  */
155     { 10,  5 },	/* Ra: in fp instructions.  */
156     {  5,  3 },	/* op2: in the system instructions.  */
157     {  8,  4 },	/* CRm: in the system instructions.  */
158     { 12,  4 },	/* CRn: in the system instructions.  */
159     { 16,  3 },	/* op1: in the system instructions.  */
160     { 19,  2 },	/* op0: in the system instructions.  */
161     { 10,  3 },	/* imm3: in add/sub extended reg instructions.  */
162     { 12,  4 },	/* cond: condition flags as a source operand.  */
163     { 12,  4 },	/* opcode: in advsimd load/store instructions.  */
164     { 12,  4 },	/* cmode: in advsimd modified immediate instructions.  */
165     { 13,  3 },	/* asisdlso_opcode: opcode in advsimd ld/st single element.  */
166     { 13,  2 },	/* len: in advsimd tbl/tbx instructions.  */
167     { 16,  5 },	/* Rm: in ld/st reg offset and some integer inst.  */
168     { 16,  5 },	/* Rs: in load/store exclusive instructions.  */
169     { 13,  3 },	/* option: in ld/st reg offset + add/sub extended reg inst.  */
170     { 12,  1 },	/* S: in load/store reg offset instructions.  */
171     { 21,  2 },	/* hw: in move wide constant instructions.  */
172     { 22,  2 },	/* opc: in load/store reg offset instructions.  */
173     { 23,  1 },	/* opc1: in load/store reg offset instructions.  */
174     { 22,  2 },	/* shift: in add/sub reg/imm shifted instructions.  */
175     { 22,  2 },	/* type: floating point type field in fp data inst.  */
176     { 30,  2 },	/* ldst_size: size field in ld/st reg offset inst.  */
177     { 10,  6 },	/* imm6: in add/sub reg shifted instructions.  */
178     { 11,  4 },	/* imm4: in advsimd ext and advsimd ins instructions.  */
179     { 16,  5 },	/* imm5: in conditional compare (immediate) instructions.  */
180     { 15,  7 },	/* imm7: in load/store pair pre/post index instructions.  */
181     { 13,  8 },	/* imm8: in floating-point scalar move immediate inst.  */
182     { 12,  9 },	/* imm9: in load/store pre/post index instructions.  */
183     { 10, 12 },	/* imm12: in ld/st unsigned imm or add/sub shifted inst.  */
184     {  5, 14 },	/* imm14: in test bit and branch instructions.  */
185     {  5, 16 },	/* imm16: in exception instructions.  */
186     {  0, 26 },	/* imm26: in unconditional branch instructions.  */
187     { 10,  6 },	/* imms: in bitfield and logical immediate instructions.  */
188     { 16,  6 },	/* immr: in bitfield and logical immediate instructions.  */
189     { 16,  3 },	/* immb: in advsimd shift by immediate instructions.  */
190     { 19,  4 },	/* immh: in advsimd shift by immediate instructions.  */
191     { 22,  1 },	/* N: in logical (immediate) instructions.  */
192     { 11,  1 },	/* index: in ld/st inst deciding the pre/post-index.  */
193     { 24,  1 },	/* index2: in ld/st pair inst deciding the pre/post-index.  */
194     { 31,  1 },	/* sf: in integer data processing instructions.  */
195     { 11,  1 },	/* H: in advsimd scalar x indexed element instructions.  */
196     { 21,  1 },	/* L: in advsimd scalar x indexed element instructions.  */
197     { 20,  1 },	/* M: in advsimd scalar x indexed element instructions.  */
198     { 31,  1 },	/* b5: in the test bit and branch instructions.  */
199     { 19,  5 },	/* b40: in the test bit and branch instructions.  */
200     { 10,  6 },	/* scale: in the fixed-point scalar to fp converting inst.  */
201 };
202 
203 enum aarch64_operand_class
204 aarch64_get_operand_class (enum aarch64_opnd type)
205 {
206   return aarch64_operands[type].op_class;
207 }
208 
209 const char*
210 aarch64_get_operand_name (enum aarch64_opnd type)
211 {
212   return aarch64_operands[type].name;
213 }
214 
215 /* Get operand description string.
216    This is usually for the diagnosis purpose.  */
217 const char*
218 aarch64_get_operand_desc (enum aarch64_opnd type)
219 {
220   return aarch64_operands[type].desc;
221 }
222 
223 /* Table of all conditional affixes.  */
224 const aarch64_cond aarch64_conds[16] =
225 {
226   {{"eq"}, 0x0},
227   {{"ne"}, 0x1},
228   {{"cs", "hs"}, 0x2},
229   {{"cc", "lo", "ul"}, 0x3},
230   {{"mi"}, 0x4},
231   {{"pl"}, 0x5},
232   {{"vs"}, 0x6},
233   {{"vc"}, 0x7},
234   {{"hi"}, 0x8},
235   {{"ls"}, 0x9},
236   {{"ge"}, 0xa},
237   {{"lt"}, 0xb},
238   {{"gt"}, 0xc},
239   {{"le"}, 0xd},
240   {{"al"}, 0xe},
241   {{"nv"}, 0xf},
242 };
243 
244 const aarch64_cond*
245 get_cond_from_value (aarch64_insn value)
246 {
247   assert (value < 16);
248   return &aarch64_conds[(unsigned int) value];
249 }
250 
251 const aarch64_cond*
252 get_inverted_cond (const aarch64_cond *cond)
253 {
254   return &aarch64_conds[cond->value ^ 0x1];
255 }
256 
257 /* Table describing the operand extension/shifting operators; indexed by
258    enum aarch64_modifier_kind.
259 
260    The value column provides the most common values for encoding modifiers,
261    which enables table-driven encoding/decoding for the modifiers.  */
262 const struct aarch64_name_value_pair aarch64_operand_modifiers [] =
263 {
264     {"none", 0x0},
265     {"msl",  0x0},
266     {"ror",  0x3},
267     {"asr",  0x2},
268     {"lsr",  0x1},
269     {"lsl",  0x0},
270     {"uxtb", 0x0},
271     {"uxth", 0x1},
272     {"uxtw", 0x2},
273     {"uxtx", 0x3},
274     {"sxtb", 0x4},
275     {"sxth", 0x5},
276     {"sxtw", 0x6},
277     {"sxtx", 0x7},
278     {NULL, 0},
279 };
280 
281 enum aarch64_modifier_kind
282 aarch64_get_operand_modifier (const struct aarch64_name_value_pair *desc)
283 {
284   return desc - aarch64_operand_modifiers;
285 }
286 
287 aarch64_insn
288 aarch64_get_operand_modifier_value (enum aarch64_modifier_kind kind)
289 {
290   return aarch64_operand_modifiers[kind].value;
291 }
292 
293 enum aarch64_modifier_kind
294 aarch64_get_operand_modifier_from_value (aarch64_insn value,
295 					 bfd_boolean extend_p)
296 {
297   if (extend_p == TRUE)
298     return AARCH64_MOD_UXTB + value;
299   else
300     return AARCH64_MOD_LSL - value;
301 }
302 
303 bfd_boolean
304 aarch64_extend_operator_p (enum aarch64_modifier_kind kind)
305 {
306   return (kind > AARCH64_MOD_LSL && kind <= AARCH64_MOD_SXTX)
307     ? TRUE : FALSE;
308 }
309 
310 static inline bfd_boolean
311 aarch64_shift_operator_p (enum aarch64_modifier_kind kind)
312 {
313   return (kind >= AARCH64_MOD_ROR && kind <= AARCH64_MOD_LSL)
314     ? TRUE : FALSE;
315 }
316 
317 const struct aarch64_name_value_pair aarch64_barrier_options[16] =
318 {
319     { "#0x00", 0x0 },
320     { "oshld", 0x1 },
321     { "oshst", 0x2 },
322     { "osh",   0x3 },
323     { "#0x04", 0x4 },
324     { "nshld", 0x5 },
325     { "nshst", 0x6 },
326     { "nsh",   0x7 },
327     { "#0x08", 0x8 },
328     { "ishld", 0x9 },
329     { "ishst", 0xa },
330     { "ish",   0xb },
331     { "#0x0c", 0xc },
332     { "ld",    0xd },
333     { "st",    0xe },
334     { "sy",    0xf },
335 };
336 
337 /* op -> op:       load = 0 instruction = 1 store = 2
338    l  -> level:    1-3
339    t  -> temporal: temporal (retained) = 0 non-temporal (streaming) = 1   */
340 #define B(op,l,t) (((op) << 3) | (((l) - 1) << 1) | (t))
341 const struct aarch64_name_value_pair aarch64_prfops[32] =
342 {
343   { "pldl1keep", B(0, 1, 0) },
344   { "pldl1strm", B(0, 1, 1) },
345   { "pldl2keep", B(0, 2, 0) },
346   { "pldl2strm", B(0, 2, 1) },
347   { "pldl3keep", B(0, 3, 0) },
348   { "pldl3strm", B(0, 3, 1) },
349   { NULL, 0x06 },
350   { NULL, 0x07 },
351   { "plil1keep", B(1, 1, 0) },
352   { "plil1strm", B(1, 1, 1) },
353   { "plil2keep", B(1, 2, 0) },
354   { "plil2strm", B(1, 2, 1) },
355   { "plil3keep", B(1, 3, 0) },
356   { "plil3strm", B(1, 3, 1) },
357   { NULL, 0x0e },
358   { NULL, 0x0f },
359   { "pstl1keep", B(2, 1, 0) },
360   { "pstl1strm", B(2, 1, 1) },
361   { "pstl2keep", B(2, 2, 0) },
362   { "pstl2strm", B(2, 2, 1) },
363   { "pstl3keep", B(2, 3, 0) },
364   { "pstl3strm", B(2, 3, 1) },
365   { NULL, 0x16 },
366   { NULL, 0x17 },
367   { NULL, 0x18 },
368   { NULL, 0x19 },
369   { NULL, 0x1a },
370   { NULL, 0x1b },
371   { NULL, 0x1c },
372   { NULL, 0x1d },
373   { NULL, 0x1e },
374   { NULL, 0x1f },
375 };
376 #undef B
377 
378 /* Utilities on value constraint.  */
379 
380 static inline int
381 value_in_range_p (int64_t value, int low, int high)
382 {
383   return (value >= low && value <= high) ? 1 : 0;
384 }
385 
386 static inline int
387 value_aligned_p (int64_t value, int align)
388 {
389   return ((value & (align - 1)) == 0) ? 1 : 0;
390 }
391 
392 /* A signed value fits in a field.  */
393 static inline int
394 value_fit_signed_field_p (int64_t value, unsigned width)
395 {
396   assert (width < 32);
397   if (width < sizeof (value) * 8)
398     {
399       int64_t lim = (int64_t)1 << (width - 1);
400       if (value >= -lim && value < lim)
401 	return 1;
402     }
403   return 0;
404 }
405 
406 /* An unsigned value fits in a field.  */
407 static inline int
408 value_fit_unsigned_field_p (int64_t value, unsigned width)
409 {
410   assert (width < 32);
411   if (width < sizeof (value) * 8)
412     {
413       int64_t lim = (int64_t)1 << width;
414       if (value >= 0 && value < lim)
415 	return 1;
416     }
417   return 0;
418 }
419 
420 /* Return 1 if OPERAND is SP or WSP.  */
421 int
422 aarch64_stack_pointer_p (const aarch64_opnd_info *operand)
423 {
424   return ((aarch64_get_operand_class (operand->type)
425 	   == AARCH64_OPND_CLASS_INT_REG)
426 	  && operand_maybe_stack_pointer (aarch64_operands + operand->type)
427 	  && operand->reg.regno == 31);
428 }
429 
430 /* Return 1 if OPERAND is XZR or WZP.  */
431 int
432 aarch64_zero_register_p (const aarch64_opnd_info *operand)
433 {
434   return ((aarch64_get_operand_class (operand->type)
435 	   == AARCH64_OPND_CLASS_INT_REG)
436 	  && !operand_maybe_stack_pointer (aarch64_operands + operand->type)
437 	  && operand->reg.regno == 31);
438 }
439 
440 /* Return true if the operand *OPERAND that has the operand code
441    OPERAND->TYPE and been qualified by OPERAND->QUALIFIER can be also
442    qualified by the qualifier TARGET.  */
443 
444 static inline int
445 operand_also_qualified_p (const struct aarch64_opnd_info *operand,
446 			  aarch64_opnd_qualifier_t target)
447 {
448   switch (operand->qualifier)
449     {
450     case AARCH64_OPND_QLF_W:
451       if (target == AARCH64_OPND_QLF_WSP && aarch64_stack_pointer_p (operand))
452 	return 1;
453       break;
454     case AARCH64_OPND_QLF_X:
455       if (target == AARCH64_OPND_QLF_SP && aarch64_stack_pointer_p (operand))
456 	return 1;
457       break;
458     case AARCH64_OPND_QLF_WSP:
459       if (target == AARCH64_OPND_QLF_W
460 	  && operand_maybe_stack_pointer (aarch64_operands + operand->type))
461 	return 1;
462       break;
463     case AARCH64_OPND_QLF_SP:
464       if (target == AARCH64_OPND_QLF_X
465 	  && operand_maybe_stack_pointer (aarch64_operands + operand->type))
466 	return 1;
467       break;
468     default:
469       break;
470     }
471 
472   return 0;
473 }
474 
475 /* Given qualifier sequence list QSEQ_LIST and the known qualifier KNOWN_QLF
476    for operand KNOWN_IDX, return the expected qualifier for operand IDX.
477 
478    Return NIL if more than one expected qualifiers are found.  */
479 
480 aarch64_opnd_qualifier_t
481 aarch64_get_expected_qualifier (const aarch64_opnd_qualifier_seq_t *qseq_list,
482 				int idx,
483 				const aarch64_opnd_qualifier_t known_qlf,
484 				int known_idx)
485 {
486   int i, saved_i;
487 
488   /* Special case.
489 
490      When the known qualifier is NIL, we have to assume that there is only
491      one qualifier sequence in the *QSEQ_LIST and return the corresponding
492      qualifier directly.  One scenario is that for instruction
493 	PRFM <prfop>, [<Xn|SP>, #:lo12:<symbol>]
494      which has only one possible valid qualifier sequence
495 	NIL, S_D
496      the caller may pass NIL in KNOWN_QLF to obtain S_D so that it can
497      determine the correct relocation type (i.e. LDST64_LO12) for PRFM.
498 
499      Because the qualifier NIL has dual roles in the qualifier sequence:
500      it can mean no qualifier for the operand, or the qualifer sequence is
501      not in use (when all qualifiers in the sequence are NILs), we have to
502      handle this special case here.  */
503   if (known_qlf == AARCH64_OPND_NIL)
504     {
505       assert (qseq_list[0][known_idx] == AARCH64_OPND_NIL);
506       return qseq_list[0][idx];
507     }
508 
509   for (i = 0, saved_i = -1; i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
510     {
511       if (qseq_list[i][known_idx] == known_qlf)
512 	{
513 	  if (saved_i != -1)
514 	    /* More than one sequences are found to have KNOWN_QLF at
515 	       KNOWN_IDX.  */
516 	    return AARCH64_OPND_NIL;
517 	  saved_i = i;
518 	}
519     }
520 
521   return qseq_list[saved_i][idx];
522 }
523 
524 enum operand_qualifier_kind
525 {
526   OQK_NIL,
527   OQK_OPD_VARIANT,
528   OQK_VALUE_IN_RANGE,
529   OQK_MISC,
530 };
531 
532 /* Operand qualifier description.  */
533 struct operand_qualifier_data
534 {
535   /* The usage of the three data fields depends on the qualifier kind.  */
536   int data0;
537   int data1;
538   int data2;
539   /* Description.  */
540   const char *desc;
541   /* Kind.  */
542   enum operand_qualifier_kind kind;
543 };
544 
545 /* Indexed by the operand qualifier enumerators.  */
546 struct operand_qualifier_data aarch64_opnd_qualifiers[] =
547 {
548   {0, 0, 0, "NIL", OQK_NIL},
549 
550   /* Operand variant qualifiers.
551      First 3 fields:
552      element size, number of elements and common value for encoding.  */
553 
554   {4, 1, 0x0, "w", OQK_OPD_VARIANT},
555   {8, 1, 0x1, "x", OQK_OPD_VARIANT},
556   {4, 1, 0x0, "wsp", OQK_OPD_VARIANT},
557   {8, 1, 0x1, "sp", OQK_OPD_VARIANT},
558 
559   {1, 1, 0x0, "b", OQK_OPD_VARIANT},
560   {2, 1, 0x1, "h", OQK_OPD_VARIANT},
561   {4, 1, 0x2, "s", OQK_OPD_VARIANT},
562   {8, 1, 0x3, "d", OQK_OPD_VARIANT},
563   {16, 1, 0x4, "q", OQK_OPD_VARIANT},
564 
565   {1, 8, 0x0, "8b", OQK_OPD_VARIANT},
566   {1, 16, 0x1, "16b", OQK_OPD_VARIANT},
567   {2, 4, 0x2, "4h", OQK_OPD_VARIANT},
568   {2, 8, 0x3, "8h", OQK_OPD_VARIANT},
569   {4, 2, 0x4, "2s", OQK_OPD_VARIANT},
570   {4, 4, 0x5, "4s", OQK_OPD_VARIANT},
571   {8, 1, 0x6, "1d", OQK_OPD_VARIANT},
572   {8, 2, 0x7, "2d", OQK_OPD_VARIANT},
573   {16, 1, 0x8, "1q", OQK_OPD_VARIANT},
574 
575   /* Qualifiers constraining the value range.
576      First 3 fields:
577      Lower bound, higher bound, unused.  */
578 
579   {0,  7, 0, "imm_0_7" , OQK_VALUE_IN_RANGE},
580   {0, 15, 0, "imm_0_15", OQK_VALUE_IN_RANGE},
581   {0, 31, 0, "imm_0_31", OQK_VALUE_IN_RANGE},
582   {0, 63, 0, "imm_0_63", OQK_VALUE_IN_RANGE},
583   {1, 32, 0, "imm_1_32", OQK_VALUE_IN_RANGE},
584   {1, 64, 0, "imm_1_64", OQK_VALUE_IN_RANGE},
585 
586   /* Qualifiers for miscellaneous purpose.
587      First 3 fields:
588      unused, unused and unused.  */
589 
590   {0, 0, 0, "lsl", 0},
591   {0, 0, 0, "msl", 0},
592 
593   {0, 0, 0, "retrieving", 0},
594 };
595 
596 static inline bfd_boolean
597 operand_variant_qualifier_p (aarch64_opnd_qualifier_t qualifier)
598 {
599   return (aarch64_opnd_qualifiers[qualifier].kind == OQK_OPD_VARIANT)
600     ? TRUE : FALSE;
601 }
602 
603 static inline bfd_boolean
604 qualifier_value_in_range_constraint_p (aarch64_opnd_qualifier_t qualifier)
605 {
606   return (aarch64_opnd_qualifiers[qualifier].kind == OQK_VALUE_IN_RANGE)
607     ? TRUE : FALSE;
608 }
609 
610 const char*
611 aarch64_get_qualifier_name (aarch64_opnd_qualifier_t qualifier)
612 {
613   return aarch64_opnd_qualifiers[qualifier].desc;
614 }
615 
616 /* Given an operand qualifier, return the expected data element size
617    of a qualified operand.  */
618 unsigned char
619 aarch64_get_qualifier_esize (aarch64_opnd_qualifier_t qualifier)
620 {
621   assert (operand_variant_qualifier_p (qualifier) == TRUE);
622   return aarch64_opnd_qualifiers[qualifier].data0;
623 }
624 
625 unsigned char
626 aarch64_get_qualifier_nelem (aarch64_opnd_qualifier_t qualifier)
627 {
628   assert (operand_variant_qualifier_p (qualifier) == TRUE);
629   return aarch64_opnd_qualifiers[qualifier].data1;
630 }
631 
632 aarch64_insn
633 aarch64_get_qualifier_standard_value (aarch64_opnd_qualifier_t qualifier)
634 {
635   assert (operand_variant_qualifier_p (qualifier) == TRUE);
636   return aarch64_opnd_qualifiers[qualifier].data2;
637 }
638 
639 static int
640 get_lower_bound (aarch64_opnd_qualifier_t qualifier)
641 {
642   assert (qualifier_value_in_range_constraint_p (qualifier) == TRUE);
643   return aarch64_opnd_qualifiers[qualifier].data0;
644 }
645 
646 static int
647 get_upper_bound (aarch64_opnd_qualifier_t qualifier)
648 {
649   assert (qualifier_value_in_range_constraint_p (qualifier) == TRUE);
650   return aarch64_opnd_qualifiers[qualifier].data1;
651 }
652 
653 #ifdef DEBUG_AARCH64
654 void
655 aarch64_verbose (const char *str, ...)
656 {
657   va_list ap;
658   va_start (ap, str);
659   printf ("#### ");
660   vprintf (str, ap);
661   printf ("\n");
662   va_end (ap);
663 }
664 
665 static inline void
666 dump_qualifier_sequence (const aarch64_opnd_qualifier_t *qualifier)
667 {
668   int i;
669   printf ("#### \t");
670   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i, ++qualifier)
671     printf ("%s,", aarch64_get_qualifier_name (*qualifier));
672   printf ("\n");
673 }
674 
675 static void
676 dump_match_qualifiers (const struct aarch64_opnd_info *opnd,
677 		       const aarch64_opnd_qualifier_t *qualifier)
678 {
679   int i;
680   aarch64_opnd_qualifier_t curr[AARCH64_MAX_OPND_NUM];
681 
682   aarch64_verbose ("dump_match_qualifiers:");
683   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
684     curr[i] = opnd[i].qualifier;
685   dump_qualifier_sequence (curr);
686   aarch64_verbose ("against");
687   dump_qualifier_sequence (qualifier);
688 }
689 #endif /* DEBUG_AARCH64 */
690 
691 /* TODO improve this, we can have an extra field at the runtime to
692    store the number of operands rather than calculating it every time.  */
693 
694 int
695 aarch64_num_of_operands (const aarch64_opcode *opcode)
696 {
697   int i = 0;
698   const enum aarch64_opnd *opnds = opcode->operands;
699   while (opnds[i++] != AARCH64_OPND_NIL)
700     ;
701   --i;
702   assert (i >= 0 && i <= AARCH64_MAX_OPND_NUM);
703   return i;
704 }
705 
706 /* Find the best matched qualifier sequence in *QUALIFIERS_LIST for INST.
707    If succeeds, fill the found sequence in *RET, return 1; otherwise return 0.
708 
709    N.B. on the entry, it is very likely that only some operands in *INST
710    have had their qualifiers been established.
711 
712    If STOP_AT is not -1, the function will only try to match
713    the qualifier sequence for operands before and including the operand
714    of index STOP_AT; and on success *RET will only be filled with the first
715    (STOP_AT+1) qualifiers.
716 
717    A couple examples of the matching algorithm:
718 
719    X,W,NIL should match
720    X,W,NIL
721 
722    NIL,NIL should match
723    X  ,NIL
724 
725    Apart from serving the main encoding routine, this can also be called
726    during or after the operand decoding.  */
727 
728 int
729 aarch64_find_best_match (const aarch64_inst *inst,
730 			 const aarch64_opnd_qualifier_seq_t *qualifiers_list,
731 			 int stop_at, aarch64_opnd_qualifier_t *ret)
732 {
733   int found = 0;
734   int i, num_opnds;
735   const aarch64_opnd_qualifier_t *qualifiers;
736 
737   num_opnds = aarch64_num_of_operands (inst->opcode);
738   if (num_opnds == 0)
739     {
740       DEBUG_TRACE ("SUCCEED: no operand");
741       return 1;
742     }
743 
744   if (stop_at < 0 || stop_at >= num_opnds)
745     stop_at = num_opnds - 1;
746 
747   /* For each pattern.  */
748   for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i, ++qualifiers_list)
749     {
750       int j;
751       qualifiers = *qualifiers_list;
752 
753       /* Start as positive.  */
754       found = 1;
755 
756       DEBUG_TRACE ("%d", i);
757 #ifdef DEBUG_AARCH64
758       if (debug_dump)
759 	dump_match_qualifiers (inst->operands, qualifiers);
760 #endif
761 
762       /* Most opcodes has much fewer patterns in the list.
763 	 First NIL qualifier indicates the end in the list.   */
764       if (empty_qualifier_sequence_p (qualifiers) == TRUE)
765 	{
766 	  DEBUG_TRACE_IF (i == 0, "SUCCEED: empty qualifier list");
767 	  if (i)
768 	    found = 0;
769 	  break;
770 	}
771 
772       for (j = 0; j < num_opnds && j <= stop_at; ++j, ++qualifiers)
773 	{
774 	  if (inst->operands[j].qualifier == AARCH64_OPND_QLF_NIL)
775 	    {
776 	      /* Either the operand does not have qualifier, or the qualifier
777 		 for the operand needs to be deduced from the qualifier
778 		 sequence.
779 		 In the latter case, any constraint checking related with
780 		 the obtained qualifier should be done later in
781 		 operand_general_constraint_met_p.  */
782 	      continue;
783 	    }
784 	  else if (*qualifiers != inst->operands[j].qualifier)
785 	    {
786 	      /* Unless the target qualifier can also qualify the operand
787 		 (which has already had a non-nil qualifier), non-equal
788 		 qualifiers are generally un-matched.  */
789 	      if (operand_also_qualified_p (inst->operands + j, *qualifiers))
790 		continue;
791 	      else
792 		{
793 		  found = 0;
794 		  break;
795 		}
796 	    }
797 	  else
798 	    continue;	/* Equal qualifiers are certainly matched.  */
799 	}
800 
801       /* Qualifiers established.  */
802       if (found == 1)
803 	break;
804     }
805 
806   if (found == 1)
807     {
808       /* Fill the result in *RET.  */
809       int j;
810       qualifiers = *qualifiers_list;
811 
812       DEBUG_TRACE ("complete qualifiers using list %d", i);
813 #ifdef DEBUG_AARCH64
814       if (debug_dump)
815 	dump_qualifier_sequence (qualifiers);
816 #endif
817 
818       for (j = 0; j <= stop_at; ++j, ++qualifiers)
819 	ret[j] = *qualifiers;
820       for (; j < AARCH64_MAX_OPND_NUM; ++j)
821 	ret[j] = AARCH64_OPND_QLF_NIL;
822 
823       DEBUG_TRACE ("SUCCESS");
824       return 1;
825     }
826 
827   DEBUG_TRACE ("FAIL");
828   return 0;
829 }
830 
831 /* Operand qualifier matching and resolving.
832 
833    Return 1 if the operand qualifier(s) in *INST match one of the qualifier
834    sequences in INST->OPCODE->qualifiers_list; otherwise return 0.
835 
836    if UPDATE_P == TRUE, update the qualifier(s) in *INST after the matching
837    succeeds.  */
838 
839 static int
840 match_operands_qualifier (aarch64_inst *inst, bfd_boolean update_p)
841 {
842   int i;
843   aarch64_opnd_qualifier_seq_t qualifiers;
844 
845   if (!aarch64_find_best_match (inst, inst->opcode->qualifiers_list, -1,
846 			       qualifiers))
847     {
848       DEBUG_TRACE ("matching FAIL");
849       return 0;
850     }
851 
852   /* Update the qualifiers.  */
853   if (update_p == TRUE)
854     for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
855       {
856 	if (inst->opcode->operands[i] == AARCH64_OPND_NIL)
857 	  break;
858 	DEBUG_TRACE_IF (inst->operands[i].qualifier != qualifiers[i],
859 			"update %s with %s for operand %d",
860 			aarch64_get_qualifier_name (inst->operands[i].qualifier),
861 			aarch64_get_qualifier_name (qualifiers[i]), i);
862 	inst->operands[i].qualifier = qualifiers[i];
863       }
864 
865   DEBUG_TRACE ("matching SUCCESS");
866   return 1;
867 }
868 
869 /* Return TRUE if VALUE is a wide constant that can be moved into a general
870    register by MOVZ.
871 
872    IS32 indicates whether value is a 32-bit immediate or not.
873    If SHIFT_AMOUNT is not NULL, on the return of TRUE, the logical left shift
874    amount will be returned in *SHIFT_AMOUNT.  */
875 
876 bfd_boolean
877 aarch64_wide_constant_p (int64_t value, int is32, unsigned int *shift_amount)
878 {
879   int amount;
880 
881   DEBUG_TRACE ("enter with 0x%" PRIx64 "(%" PRIi64 ")", value, value);
882 
883   if (is32)
884     {
885       /* Allow all zeros or all ones in top 32-bits, so that
886 	 32-bit constant expressions like ~0x80000000 are
887 	 permitted.  */
888       uint64_t ext = value;
889       if (ext >> 32 != 0 && ext >> 32 != (uint64_t) 0xffffffff)
890 	/* Immediate out of range.  */
891 	return FALSE;
892       value &= (int64_t) 0xffffffff;
893     }
894 
895   /* first, try movz then movn */
896   amount = -1;
897   if ((value & ((int64_t) 0xffff << 0)) == value)
898     amount = 0;
899   else if ((value & ((int64_t) 0xffff << 16)) == value)
900     amount = 16;
901   else if (!is32 && (value & ((int64_t) 0xffff << 32)) == value)
902     amount = 32;
903   else if (!is32 && (value & ((int64_t) 0xffff << 48)) == value)
904     amount = 48;
905 
906   if (amount == -1)
907     {
908       DEBUG_TRACE ("exit FALSE with 0x%" PRIx64 "(%" PRIi64 ")", value, value);
909       return FALSE;
910     }
911 
912   if (shift_amount != NULL)
913     *shift_amount = amount;
914 
915   DEBUG_TRACE ("exit TRUE with amount %d", amount);
916 
917   return TRUE;
918 }
919 
920 /* Build the accepted values for immediate logical SIMD instructions.
921 
922    The standard encodings of the immediate value are:
923      N      imms     immr         SIMD size  R             S
924      1      ssssss   rrrrrr       64      UInt(rrrrrr)  UInt(ssssss)
925      0      0sssss   0rrrrr       32      UInt(rrrrr)   UInt(sssss)
926      0      10ssss   00rrrr       16      UInt(rrrr)    UInt(ssss)
927      0      110sss   000rrr       8       UInt(rrr)     UInt(sss)
928      0      1110ss   0000rr       4       UInt(rr)      UInt(ss)
929      0      11110s   00000r       2       UInt(r)       UInt(s)
930    where all-ones value of S is reserved.
931 
932    Let's call E the SIMD size.
933 
934    The immediate value is: S+1 bits '1' rotated to the right by R.
935 
936    The total of valid encodings is 64*63 + 32*31 + ... + 2*1 = 5334
937    (remember S != E - 1).  */
938 
939 #define TOTAL_IMM_NB  5334
940 
941 typedef struct
942 {
943   uint64_t imm;
944   aarch64_insn encoding;
945 } simd_imm_encoding;
946 
947 static simd_imm_encoding simd_immediates[TOTAL_IMM_NB];
948 
949 static int
950 simd_imm_encoding_cmp(const void *i1, const void *i2)
951 {
952   const simd_imm_encoding *imm1 = (const simd_imm_encoding *)i1;
953   const simd_imm_encoding *imm2 = (const simd_imm_encoding *)i2;
954 
955   if (imm1->imm < imm2->imm)
956     return -1;
957   if (imm1->imm > imm2->imm)
958     return +1;
959   return 0;
960 }
961 
962 /* immediate bitfield standard encoding
963    imm13<12> imm13<5:0> imm13<11:6> SIMD size R      S
964    1         ssssss     rrrrrr      64        rrrrrr ssssss
965    0         0sssss     0rrrrr      32        rrrrr  sssss
966    0         10ssss     00rrrr      16        rrrr   ssss
967    0         110sss     000rrr      8         rrr    sss
968    0         1110ss     0000rr      4         rr     ss
969    0         11110s     00000r      2         r      s  */
970 static inline int
971 encode_immediate_bitfield (int is64, uint32_t s, uint32_t r)
972 {
973   return (is64 << 12) | (r << 6) | s;
974 }
975 
976 static void
977 build_immediate_table (void)
978 {
979   uint32_t log_e, e, s, r, s_mask;
980   uint64_t mask, imm;
981   int nb_imms;
982   int is64;
983 
984   nb_imms = 0;
985   for (log_e = 1; log_e <= 6; log_e++)
986     {
987       /* Get element size.  */
988       e = 1u << log_e;
989       if (log_e == 6)
990 	{
991 	  is64 = 1;
992 	  mask = 0xffffffffffffffffull;
993 	  s_mask = 0;
994 	}
995       else
996 	{
997 	  is64 = 0;
998 	  mask = (1ull << e) - 1;
999 	  /* log_e  s_mask
1000 	     1     ((1 << 4) - 1) << 2 = 111100
1001 	     2     ((1 << 3) - 1) << 3 = 111000
1002 	     3     ((1 << 2) - 1) << 4 = 110000
1003 	     4     ((1 << 1) - 1) << 5 = 100000
1004 	     5     ((1 << 0) - 1) << 6 = 000000  */
1005 	  s_mask = ((1u << (5 - log_e)) - 1) << (log_e + 1);
1006 	}
1007       for (s = 0; s < e - 1; s++)
1008 	for (r = 0; r < e; r++)
1009 	  {
1010 	    /* s+1 consecutive bits to 1 (s < 63) */
1011 	    imm = (1ull << (s + 1)) - 1;
1012 	    /* rotate right by r */
1013 	    if (r != 0)
1014 	      imm = (imm >> r) | ((imm << (e - r)) & mask);
1015 	    /* replicate the constant depending on SIMD size */
1016 	    switch (log_e)
1017 	      {
1018 	      case 1: imm = (imm <<  2) | imm;
1019 	      case 2: imm = (imm <<  4) | imm;
1020 	      case 3: imm = (imm <<  8) | imm;
1021 	      case 4: imm = (imm << 16) | imm;
1022 	      case 5: imm = (imm << 32) | imm;
1023 	      case 6: break;
1024 	      default: abort ();
1025 	      }
1026 	    simd_immediates[nb_imms].imm = imm;
1027 	    simd_immediates[nb_imms].encoding =
1028 	      encode_immediate_bitfield(is64, s | s_mask, r);
1029 	    nb_imms++;
1030 	  }
1031     }
1032   assert (nb_imms == TOTAL_IMM_NB);
1033   qsort(simd_immediates, nb_imms,
1034 	sizeof(simd_immediates[0]), simd_imm_encoding_cmp);
1035 }
1036 
1037 /* Return TRUE if VALUE is a valid logical immediate, i.e. bitmask, that can
1038    be accepted by logical (immediate) instructions
1039    e.g. ORR <Xd|SP>, <Xn>, #<imm>.
1040 
1041    IS32 indicates whether or not VALUE is a 32-bit immediate.
1042    If ENCODING is not NULL, on the return of TRUE, the standard encoding for
1043    VALUE will be returned in *ENCODING.  */
1044 
1045 bfd_boolean
1046 aarch64_logical_immediate_p (uint64_t value, int is32, aarch64_insn *encoding)
1047 {
1048   simd_imm_encoding imm_enc;
1049   const simd_imm_encoding *imm_encoding;
1050   static bfd_boolean initialized = FALSE;
1051 
1052   DEBUG_TRACE ("enter with 0x%" PRIx64 "(%" PRIi64 "), is32: %d", value,
1053 	       value, is32);
1054 
1055   if (initialized == FALSE)
1056     {
1057       build_immediate_table ();
1058       initialized = TRUE;
1059     }
1060 
1061   if (is32)
1062     {
1063       /* Allow all zeros or all ones in top 32-bits, so that
1064 	 constant expressions like ~1 are permitted. */
1065       if (value >> 32 != 0 && value >> 32 != 0xffffffff)
1066 	return 0xffffffff;
1067       /* Replicate the 32 lower bits to the 32 upper bits.  */
1068       value &= 0xffffffff;
1069       value |= value << 32;
1070     }
1071 
1072   imm_enc.imm = value;
1073   imm_encoding = (const simd_imm_encoding *)
1074     bsearch(&imm_enc, simd_immediates, TOTAL_IMM_NB,
1075             sizeof(simd_immediates[0]), simd_imm_encoding_cmp);
1076   if (imm_encoding == NULL)
1077     {
1078       DEBUG_TRACE ("exit with FALSE");
1079       return FALSE;
1080     }
1081   if (encoding != NULL)
1082     *encoding = imm_encoding->encoding;
1083   DEBUG_TRACE ("exit with TRUE");
1084   return TRUE;
1085 }
1086 
1087 /* If 64-bit immediate IMM is in the format of
1088    "aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffffgggggggghhhhhhhh",
1089    where a, b, c, d, e, f, g and h are independently 0 or 1, return an integer
1090    of value "abcdefgh".  Otherwise return -1.  */
1091 int
1092 aarch64_shrink_expanded_imm8 (uint64_t imm)
1093 {
1094   int i, ret;
1095   uint32_t byte;
1096 
1097   ret = 0;
1098   for (i = 0; i < 8; i++)
1099     {
1100       byte = (imm >> (8 * i)) & 0xff;
1101       if (byte == 0xff)
1102 	ret |= 1 << i;
1103       else if (byte != 0x00)
1104 	return -1;
1105     }
1106   return ret;
1107 }
1108 
1109 /* Utility inline functions for operand_general_constraint_met_p.  */
1110 
1111 static inline void
1112 set_error (aarch64_operand_error *mismatch_detail,
1113 	   enum aarch64_operand_error_kind kind, int idx,
1114 	   const char* error)
1115 {
1116   if (mismatch_detail == NULL)
1117     return;
1118   mismatch_detail->kind = kind;
1119   mismatch_detail->index = idx;
1120   mismatch_detail->error = error;
1121 }
1122 
1123 static inline void
1124 set_out_of_range_error (aarch64_operand_error *mismatch_detail,
1125 			int idx, int lower_bound, int upper_bound,
1126 			const char* error)
1127 {
1128   if (mismatch_detail == NULL)
1129     return;
1130   set_error (mismatch_detail, AARCH64_OPDE_OUT_OF_RANGE, idx, error);
1131   mismatch_detail->data[0] = lower_bound;
1132   mismatch_detail->data[1] = upper_bound;
1133 }
1134 
1135 static inline void
1136 set_imm_out_of_range_error (aarch64_operand_error *mismatch_detail,
1137 			    int idx, int lower_bound, int upper_bound)
1138 {
1139   if (mismatch_detail == NULL)
1140     return;
1141   set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1142 			  _("immediate value"));
1143 }
1144 
1145 static inline void
1146 set_offset_out_of_range_error (aarch64_operand_error *mismatch_detail,
1147 			       int idx, int lower_bound, int upper_bound)
1148 {
1149   if (mismatch_detail == NULL)
1150     return;
1151   set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1152 			  _("immediate offset"));
1153 }
1154 
1155 static inline void
1156 set_regno_out_of_range_error (aarch64_operand_error *mismatch_detail,
1157 			      int idx, int lower_bound, int upper_bound)
1158 {
1159   if (mismatch_detail == NULL)
1160     return;
1161   set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1162 			  _("register number"));
1163 }
1164 
1165 static inline void
1166 set_elem_idx_out_of_range_error (aarch64_operand_error *mismatch_detail,
1167 				 int idx, int lower_bound, int upper_bound)
1168 {
1169   if (mismatch_detail == NULL)
1170     return;
1171   set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1172 			  _("register element index"));
1173 }
1174 
1175 static inline void
1176 set_sft_amount_out_of_range_error (aarch64_operand_error *mismatch_detail,
1177 				   int idx, int lower_bound, int upper_bound)
1178 {
1179   if (mismatch_detail == NULL)
1180     return;
1181   set_out_of_range_error (mismatch_detail, idx, lower_bound, upper_bound,
1182 			  _("shift amount"));
1183 }
1184 
1185 static inline void
1186 set_unaligned_error (aarch64_operand_error *mismatch_detail, int idx,
1187 		     int alignment)
1188 {
1189   if (mismatch_detail == NULL)
1190     return;
1191   set_error (mismatch_detail, AARCH64_OPDE_UNALIGNED, idx, NULL);
1192   mismatch_detail->data[0] = alignment;
1193 }
1194 
1195 static inline void
1196 set_reg_list_error (aarch64_operand_error *mismatch_detail, int idx,
1197 		    int expected_num)
1198 {
1199   if (mismatch_detail == NULL)
1200     return;
1201   set_error (mismatch_detail, AARCH64_OPDE_REG_LIST, idx, NULL);
1202   mismatch_detail->data[0] = expected_num;
1203 }
1204 
1205 static inline void
1206 set_other_error (aarch64_operand_error *mismatch_detail, int idx,
1207 		 const char* error)
1208 {
1209   if (mismatch_detail == NULL)
1210     return;
1211   set_error (mismatch_detail, AARCH64_OPDE_OTHER_ERROR, idx, error);
1212 }
1213 
1214 /* General constraint checking based on operand code.
1215 
1216    Return 1 if OPNDS[IDX] meets the general constraint of operand code TYPE
1217    as the IDXth operand of opcode OPCODE.  Otherwise return 0.
1218 
1219    This function has to be called after the qualifiers for all operands
1220    have been resolved.
1221 
1222    Mismatching error message is returned in *MISMATCH_DETAIL upon request,
1223    i.e. when MISMATCH_DETAIL is non-NULL.  This avoids the generation
1224    of error message during the disassembling where error message is not
1225    wanted.  We avoid the dynamic construction of strings of error messages
1226    here (i.e. in libopcodes), as it is costly and complicated; instead, we
1227    use a combination of error code, static string and some integer data to
1228    represent an error.  */
1229 
1230 static int
1231 operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx,
1232 				  enum aarch64_opnd type,
1233 				  const aarch64_opcode *opcode,
1234 				  aarch64_operand_error *mismatch_detail)
1235 {
1236   unsigned num;
1237   unsigned char size;
1238   int64_t imm;
1239   const aarch64_opnd_info *opnd = opnds + idx;
1240   aarch64_opnd_qualifier_t qualifier = opnd->qualifier;
1241 
1242   assert (opcode->operands[idx] == opnd->type && opnd->type == type);
1243 
1244   switch (aarch64_operands[type].op_class)
1245     {
1246     case AARCH64_OPND_CLASS_INT_REG:
1247       /* <Xt> may be optional in some IC and TLBI instructions.  */
1248       if (type == AARCH64_OPND_Rt_SYS)
1249 	{
1250 	  assert (idx == 1 && (aarch64_get_operand_class (opnds[0].type)
1251 			       == AARCH64_OPND_CLASS_SYSTEM));
1252 	  if (opnds[1].present && !opnds[0].sysins_op->has_xt)
1253 	    {
1254 	      set_other_error (mismatch_detail, idx, _("extraneous register"));
1255 	      return 0;
1256 	    }
1257 	  if (!opnds[1].present && opnds[0].sysins_op->has_xt)
1258 	    {
1259 	      set_other_error (mismatch_detail, idx, _("missing register"));
1260 	      return 0;
1261 	    }
1262 	}
1263       switch (qualifier)
1264 	{
1265 	case AARCH64_OPND_QLF_WSP:
1266 	case AARCH64_OPND_QLF_SP:
1267 	  if (!aarch64_stack_pointer_p (opnd))
1268 	    {
1269 	      set_other_error (mismatch_detail, idx,
1270 			       _("stack pointer register expected"));
1271 	      return 0;
1272 	    }
1273 	  break;
1274 	default:
1275 	  break;
1276 	}
1277       break;
1278 
1279     case AARCH64_OPND_CLASS_ADDRESS:
1280       /* Check writeback.  */
1281       switch (opcode->iclass)
1282 	{
1283 	case ldst_pos:
1284 	case ldst_unscaled:
1285 	case ldstnapair_offs:
1286 	case ldstpair_off:
1287 	case ldst_unpriv:
1288 	  if (opnd->addr.writeback == 1)
1289 	    {
1290 	      set_other_error (mismatch_detail, idx,
1291 			       _("unexpected address writeback"));
1292 	      return 0;
1293 	    }
1294 	  break;
1295 	case ldst_imm9:
1296 	case ldstpair_indexed:
1297 	case asisdlsep:
1298 	case asisdlsop:
1299 	  if (opnd->addr.writeback == 0)
1300 	    {
1301 	      set_other_error (mismatch_detail, idx,
1302 			       _("address writeback expected"));
1303 	      return 0;
1304 	    }
1305 	  break;
1306 	default:
1307 	  assert (opnd->addr.writeback == 0);
1308 	  break;
1309 	}
1310       switch (type)
1311 	{
1312 	case AARCH64_OPND_ADDR_SIMM7:
1313 	  /* Scaled signed 7 bits immediate offset.  */
1314 	  /* Get the size of the data element that is accessed, which may be
1315 	     different from that of the source register size,
1316 	     e.g. in strb/ldrb.  */
1317 	  size = aarch64_get_qualifier_esize (opnd->qualifier);
1318 	  if (!value_in_range_p (opnd->addr.offset.imm, -64 * size, 63 * size))
1319 	    {
1320 	      set_offset_out_of_range_error (mismatch_detail, idx,
1321 					     -64 * size, 63 * size);
1322 	      return 0;
1323 	    }
1324 	  if (!value_aligned_p (opnd->addr.offset.imm, size))
1325 	    {
1326 	      set_unaligned_error (mismatch_detail, idx, size);
1327 	      return 0;
1328 	    }
1329 	  break;
1330 	case AARCH64_OPND_ADDR_SIMM9:
1331 	  /* Unscaled signed 9 bits immediate offset.  */
1332 	  if (!value_in_range_p (opnd->addr.offset.imm, -256, 255))
1333 	    {
1334 	      set_offset_out_of_range_error (mismatch_detail, idx, -256, 255);
1335 	      return 0;
1336 	    }
1337 	  break;
1338 
1339 	case AARCH64_OPND_ADDR_SIMM9_2:
1340 	  /* Unscaled signed 9 bits immediate offset, which has to be negative
1341 	     or unaligned.  */
1342 	  size = aarch64_get_qualifier_esize (qualifier);
1343 	  if ((value_in_range_p (opnd->addr.offset.imm, 0, 255)
1344 	       && !value_aligned_p (opnd->addr.offset.imm, size))
1345 	      || value_in_range_p (opnd->addr.offset.imm, -256, -1))
1346 	    return 1;
1347 	  set_other_error (mismatch_detail, idx,
1348 			   _("negative or unaligned offset expected"));
1349 	  return 0;
1350 
1351 	case AARCH64_OPND_SIMD_ADDR_POST:
1352 	  /* AdvSIMD load/store multiple structures, post-index.  */
1353 	  assert (idx == 1);
1354 	  if (opnd->addr.offset.is_reg)
1355 	    {
1356 	      if (value_in_range_p (opnd->addr.offset.regno, 0, 30))
1357 		return 1;
1358 	      else
1359 		{
1360 		  set_other_error (mismatch_detail, idx,
1361 				   _("invalid register offset"));
1362 		  return 0;
1363 		}
1364 	    }
1365 	  else
1366 	    {
1367 	      const aarch64_opnd_info *prev = &opnds[idx-1];
1368 	      unsigned num_bytes; /* total number of bytes transferred.  */
1369 	      /* The opcode dependent area stores the number of elements in
1370 		 each structure to be loaded/stored.  */
1371 	      int is_ld1r = get_opcode_dependent_value (opcode) == 1;
1372 	      if (opcode->operands[0] == AARCH64_OPND_LVt_AL)
1373 		/* Special handling of loading single structure to all lane.  */
1374 		num_bytes = (is_ld1r ? 1 : prev->reglist.num_regs)
1375 		  * aarch64_get_qualifier_esize (prev->qualifier);
1376 	      else
1377 		num_bytes = prev->reglist.num_regs
1378 		  * aarch64_get_qualifier_esize (prev->qualifier)
1379 		  * aarch64_get_qualifier_nelem (prev->qualifier);
1380 	      if ((int) num_bytes != opnd->addr.offset.imm)
1381 		{
1382 		  set_other_error (mismatch_detail, idx,
1383 				   _("invalid post-increment amount"));
1384 		  return 0;
1385 		}
1386 	    }
1387 	  break;
1388 
1389 	case AARCH64_OPND_ADDR_REGOFF:
1390 	  /* Get the size of the data element that is accessed, which may be
1391 	     different from that of the source register size,
1392 	     e.g. in strb/ldrb.  */
1393 	  size = aarch64_get_qualifier_esize (opnd->qualifier);
1394 	  /* It is either no shift or shift by the binary logarithm of SIZE.  */
1395 	  if (opnd->shifter.amount != 0
1396 	      && opnd->shifter.amount != (int)get_logsz (size))
1397 	    {
1398 	      set_other_error (mismatch_detail, idx,
1399 			       _("invalid shift amount"));
1400 	      return 0;
1401 	    }
1402 	  /* Only UXTW, LSL, SXTW and SXTX are the accepted extending
1403 	     operators.  */
1404 	  switch (opnd->shifter.kind)
1405 	    {
1406 	    case AARCH64_MOD_UXTW:
1407 	    case AARCH64_MOD_LSL:
1408 	    case AARCH64_MOD_SXTW:
1409 	    case AARCH64_MOD_SXTX: break;
1410 	    default:
1411 	      set_other_error (mismatch_detail, idx,
1412 			       _("invalid extend/shift operator"));
1413 	      return 0;
1414 	    }
1415 	  break;
1416 
1417 	case AARCH64_OPND_ADDR_UIMM12:
1418 	  imm = opnd->addr.offset.imm;
1419 	  /* Get the size of the data element that is accessed, which may be
1420 	     different from that of the source register size,
1421 	     e.g. in strb/ldrb.  */
1422 	  size = aarch64_get_qualifier_esize (qualifier);
1423 	  if (!value_in_range_p (opnd->addr.offset.imm, 0, 4095 * size))
1424 	    {
1425 	      set_offset_out_of_range_error (mismatch_detail, idx,
1426 					     0, 4095 * size);
1427 	      return 0;
1428 	    }
1429 	  if (!value_aligned_p (opnd->addr.offset.imm, size))
1430 	    {
1431 	      set_unaligned_error (mismatch_detail, idx, size);
1432 	      return 0;
1433 	    }
1434 	  break;
1435 
1436 	case AARCH64_OPND_ADDR_PCREL14:
1437 	case AARCH64_OPND_ADDR_PCREL19:
1438 	case AARCH64_OPND_ADDR_PCREL21:
1439 	case AARCH64_OPND_ADDR_PCREL26:
1440 	  imm = opnd->imm.value;
1441 	  if (operand_need_shift_by_two (get_operand_from_code (type)))
1442 	    {
1443 	      /* The offset value in a PC-relative branch instruction is alway
1444 		 4-byte aligned and is encoded without the lowest 2 bits.  */
1445 	      if (!value_aligned_p (imm, 4))
1446 		{
1447 		  set_unaligned_error (mismatch_detail, idx, 4);
1448 		  return 0;
1449 		}
1450 	      /* Right shift by 2 so that we can carry out the following check
1451 		 canonically.  */
1452 	      imm >>= 2;
1453 	    }
1454 	  size = get_operand_fields_width (get_operand_from_code (type));
1455 	  if (!value_fit_signed_field_p (imm, size))
1456 	    {
1457 	      set_other_error (mismatch_detail, idx,
1458 			       _("immediate out of range"));
1459 	      return 0;
1460 	    }
1461 	  break;
1462 
1463 	default:
1464 	  break;
1465 	}
1466       break;
1467 
1468     case AARCH64_OPND_CLASS_SIMD_REGLIST:
1469       /* The opcode dependent area stores the number of elements in
1470 	 each structure to be loaded/stored.  */
1471       num = get_opcode_dependent_value (opcode);
1472       switch (type)
1473 	{
1474 	case AARCH64_OPND_LVt:
1475 	  assert (num >= 1 && num <= 4);
1476 	  /* Unless LD1/ST1, the number of registers should be equal to that
1477 	     of the structure elements.  */
1478 	  if (num != 1 && opnd->reglist.num_regs != num)
1479 	    {
1480 	      set_reg_list_error (mismatch_detail, idx, num);
1481 	      return 0;
1482 	    }
1483 	  break;
1484 	case AARCH64_OPND_LVt_AL:
1485 	case AARCH64_OPND_LEt:
1486 	  assert (num >= 1 && num <= 4);
1487 	  /* The number of registers should be equal to that of the structure
1488 	     elements.  */
1489 	  if (opnd->reglist.num_regs != num)
1490 	    {
1491 	      set_reg_list_error (mismatch_detail, idx, num);
1492 	      return 0;
1493 	    }
1494 	  break;
1495 	default:
1496 	  break;
1497 	}
1498       break;
1499 
1500     case AARCH64_OPND_CLASS_IMMEDIATE:
1501       /* Constraint check on immediate operand.  */
1502       imm = opnd->imm.value;
1503       /* E.g. imm_0_31 constrains value to be 0..31.  */
1504       if (qualifier_value_in_range_constraint_p (qualifier)
1505 	  && !value_in_range_p (imm, get_lower_bound (qualifier),
1506 				get_upper_bound (qualifier)))
1507 	{
1508 	  set_imm_out_of_range_error (mismatch_detail, idx,
1509 				      get_lower_bound (qualifier),
1510 				      get_upper_bound (qualifier));
1511 	  return 0;
1512 	}
1513 
1514       switch (type)
1515 	{
1516 	case AARCH64_OPND_AIMM:
1517 	  if (opnd->shifter.kind != AARCH64_MOD_LSL)
1518 	    {
1519 	      set_other_error (mismatch_detail, idx,
1520 			       _("invalid shift operator"));
1521 	      return 0;
1522 	    }
1523 	  if (opnd->shifter.amount != 0 && opnd->shifter.amount != 12)
1524 	    {
1525 	      set_other_error (mismatch_detail, idx,
1526 			       _("shift amount expected to be 0 or 12"));
1527 	      return 0;
1528 	    }
1529 	  if (!value_fit_unsigned_field_p (opnd->imm.value, 12))
1530 	    {
1531 	      set_other_error (mismatch_detail, idx,
1532 			       _("immediate out of range"));
1533 	      return 0;
1534 	    }
1535 	  break;
1536 
1537 	case AARCH64_OPND_HALF:
1538 	  assert (idx == 1 && opnds[0].type == AARCH64_OPND_Rd);
1539 	  if (opnd->shifter.kind != AARCH64_MOD_LSL)
1540 	    {
1541 	      set_other_error (mismatch_detail, idx,
1542 			       _("invalid shift operator"));
1543 	      return 0;
1544 	    }
1545 	  size = aarch64_get_qualifier_esize (opnds[0].qualifier);
1546 	  if (!value_aligned_p (opnd->shifter.amount, 16))
1547 	    {
1548 	      set_other_error (mismatch_detail, idx,
1549 			       _("shift amount should be a multiple of 16"));
1550 	      return 0;
1551 	    }
1552 	  if (!value_in_range_p (opnd->shifter.amount, 0, size * 8 - 16))
1553 	    {
1554 	      set_sft_amount_out_of_range_error (mismatch_detail, idx,
1555 						 0, size * 8 - 16);
1556 	      return 0;
1557 	    }
1558 	  if (opnd->imm.value < 0)
1559 	    {
1560 	      set_other_error (mismatch_detail, idx,
1561 			       _("negative immediate value not allowed"));
1562 	      return 0;
1563 	    }
1564 	  if (!value_fit_unsigned_field_p (opnd->imm.value, 16))
1565 	    {
1566 	      set_other_error (mismatch_detail, idx,
1567 			       _("immediate out of range"));
1568 	      return 0;
1569 	    }
1570 	  break;
1571 
1572 	case AARCH64_OPND_IMM_MOV:
1573 	    {
1574 	      int is32 = aarch64_get_qualifier_esize (opnds[0].qualifier) == 4;
1575 	      imm = opnd->imm.value;
1576 	      assert (idx == 1);
1577 	      switch (opcode->op)
1578 		{
1579 		case OP_MOV_IMM_WIDEN:
1580 		  imm = ~imm;
1581 		  /* Fall through... */
1582 		case OP_MOV_IMM_WIDE:
1583 		  if (!aarch64_wide_constant_p (imm, is32, NULL))
1584 		    {
1585 		      set_other_error (mismatch_detail, idx,
1586 				       _("immediate out of range"));
1587 		      return 0;
1588 		    }
1589 		  break;
1590 		case OP_MOV_IMM_LOG:
1591 		  if (!aarch64_logical_immediate_p (imm, is32, NULL))
1592 		    {
1593 		      set_other_error (mismatch_detail, idx,
1594 				       _("immediate out of range"));
1595 		      return 0;
1596 		    }
1597 		  break;
1598 		default:
1599 		  assert (0);
1600 		  return 0;
1601 		}
1602 	    }
1603 	  break;
1604 
1605 	case AARCH64_OPND_NZCV:
1606 	case AARCH64_OPND_CCMP_IMM:
1607 	case AARCH64_OPND_EXCEPTION:
1608 	case AARCH64_OPND_UIMM4:
1609 	case AARCH64_OPND_UIMM7:
1610 	case AARCH64_OPND_UIMM3_OP1:
1611 	case AARCH64_OPND_UIMM3_OP2:
1612 	  size = get_operand_fields_width (get_operand_from_code (type));
1613 	  assert (size < 32);
1614 	  if (!value_fit_unsigned_field_p (opnd->imm.value, size))
1615 	    {
1616 	      set_imm_out_of_range_error (mismatch_detail, idx, 0,
1617 					  (1 << size) - 1);
1618 	      return 0;
1619 	    }
1620 	  break;
1621 
1622 	case AARCH64_OPND_WIDTH:
1623 	  assert (idx == 3 && opnds[idx-1].type == AARCH64_OPND_IMM
1624 		  && opnds[0].type == AARCH64_OPND_Rd);
1625 	  size = get_upper_bound (qualifier);
1626 	  if (opnd->imm.value + opnds[idx-1].imm.value > size)
1627 	    /* lsb+width <= reg.size  */
1628 	    {
1629 	      set_imm_out_of_range_error (mismatch_detail, idx, 1,
1630 					  size - opnds[idx-1].imm.value);
1631 	      return 0;
1632 	    }
1633 	  break;
1634 
1635 	case AARCH64_OPND_LIMM:
1636 	    {
1637 	      int is32 = opnds[0].qualifier == AARCH64_OPND_QLF_W;
1638 	      uint64_t uimm = opnd->imm.value;
1639 	      if (opcode->op == OP_BIC)
1640 		uimm = ~uimm;
1641 	      if (aarch64_logical_immediate_p (uimm, is32, NULL) == FALSE)
1642 		{
1643 		  set_other_error (mismatch_detail, idx,
1644 				   _("immediate out of range"));
1645 		  return 0;
1646 		}
1647 	    }
1648 	  break;
1649 
1650 	case AARCH64_OPND_IMM0:
1651 	case AARCH64_OPND_FPIMM0:
1652 	  if (opnd->imm.value != 0)
1653 	    {
1654 	      set_other_error (mismatch_detail, idx,
1655 			       _("immediate zero expected"));
1656 	      return 0;
1657 	    }
1658 	  break;
1659 
1660 	case AARCH64_OPND_SHLL_IMM:
1661 	  assert (idx == 2);
1662 	  size = 8 * aarch64_get_qualifier_esize (opnds[idx - 1].qualifier);
1663 	  if (opnd->imm.value != size)
1664 	    {
1665 	      set_other_error (mismatch_detail, idx,
1666 			       _("invalid shift amount"));
1667 	      return 0;
1668 	    }
1669 	  break;
1670 
1671 	case AARCH64_OPND_IMM_VLSL:
1672 	  size = aarch64_get_qualifier_esize (qualifier);
1673 	  if (!value_in_range_p (opnd->imm.value, 0, size * 8 - 1))
1674 	    {
1675 	      set_imm_out_of_range_error (mismatch_detail, idx, 0,
1676 					  size * 8 - 1);
1677 	      return 0;
1678 	    }
1679 	  break;
1680 
1681 	case AARCH64_OPND_IMM_VLSR:
1682 	  size = aarch64_get_qualifier_esize (qualifier);
1683 	  if (!value_in_range_p (opnd->imm.value, 1, size * 8))
1684 	    {
1685 	      set_imm_out_of_range_error (mismatch_detail, idx, 1, size * 8);
1686 	      return 0;
1687 	    }
1688 	  break;
1689 
1690 	case AARCH64_OPND_SIMD_IMM:
1691 	case AARCH64_OPND_SIMD_IMM_SFT:
1692 	  /* Qualifier check.  */
1693 	  switch (qualifier)
1694 	    {
1695 	    case AARCH64_OPND_QLF_LSL:
1696 	      if (opnd->shifter.kind != AARCH64_MOD_LSL)
1697 		{
1698 		  set_other_error (mismatch_detail, idx,
1699 				   _("invalid shift operator"));
1700 		  return 0;
1701 		}
1702 	      break;
1703 	    case AARCH64_OPND_QLF_MSL:
1704 	      if (opnd->shifter.kind != AARCH64_MOD_MSL)
1705 		{
1706 		  set_other_error (mismatch_detail, idx,
1707 				   _("invalid shift operator"));
1708 		  return 0;
1709 		}
1710 	      break;
1711 	    case AARCH64_OPND_QLF_NIL:
1712 	      if (opnd->shifter.kind != AARCH64_MOD_NONE)
1713 		{
1714 		  set_other_error (mismatch_detail, idx,
1715 				   _("shift is not permitted"));
1716 		  return 0;
1717 		}
1718 	      break;
1719 	    default:
1720 	      assert (0);
1721 	      return 0;
1722 	    }
1723 	  /* Is the immediate valid?  */
1724 	  assert (idx == 1);
1725 	  if (aarch64_get_qualifier_esize (opnds[0].qualifier) != 8)
1726 	    {
1727 	      /* uimm8 */
1728 	      if (!value_in_range_p (opnd->imm.value, 0, 255))
1729 		{
1730 		  set_imm_out_of_range_error (mismatch_detail, idx, 0, 255);
1731 		  return 0;
1732 		}
1733 	    }
1734 	  else if (aarch64_shrink_expanded_imm8 (opnd->imm.value) < 0)
1735 	    {
1736 	      /* uimm64 is not
1737 		 'aaaaaaaabbbbbbbbccccccccddddddddeeeeeeee
1738 		 ffffffffgggggggghhhhhhhh'.  */
1739 	      set_other_error (mismatch_detail, idx,
1740 			       _("invalid value for immediate"));
1741 	      return 0;
1742 	    }
1743 	  /* Is the shift amount valid?  */
1744 	  switch (opnd->shifter.kind)
1745 	    {
1746 	    case AARCH64_MOD_LSL:
1747 	      size = aarch64_get_qualifier_esize (opnds[0].qualifier);
1748 	      if (!value_aligned_p (opnd->shifter.amount, 8))
1749 		{
1750 		  set_unaligned_error (mismatch_detail, idx, 8);
1751 		  return 0;
1752 		}
1753 	      if (!value_in_range_p (opnd->shifter.amount, 0, (size - 1) * 8))
1754 		{
1755 		  set_imm_out_of_range_error (mismatch_detail, idx, 0,
1756 					      (size - 1) * 8);
1757 		  return 0;
1758 		}
1759 	      break;
1760 	    case AARCH64_MOD_MSL:
1761 	      /* Only 8 and 16 are valid shift amount.  */
1762 	      if (opnd->shifter.amount != 8 && opnd->shifter.amount != 16)
1763 		{
1764 		  set_other_error (mismatch_detail, idx,
1765 				   _("shift amount expected to be 0 or 16"));
1766 		  return 0;
1767 		}
1768 	      break;
1769 	    default:
1770 	      if (opnd->shifter.kind != AARCH64_MOD_NONE)
1771 		{
1772 		  set_other_error (mismatch_detail, idx,
1773 				   _("invalid shift operator"));
1774 		  return 0;
1775 		}
1776 	      break;
1777 	    }
1778 	  break;
1779 
1780 	case AARCH64_OPND_FPIMM:
1781 	case AARCH64_OPND_SIMD_FPIMM:
1782 	  if (opnd->imm.is_fp == 0)
1783 	    {
1784 	      set_other_error (mismatch_detail, idx,
1785 			       _("floating-point immediate expected"));
1786 	      return 0;
1787 	    }
1788 	  /* The value is expected to be an 8-bit floating-point constant with
1789 	     sign, 3-bit exponent and normalized 4 bits of precision, encoded
1790 	     in "a:b:c:d:e:f:g:h" or FLD_imm8 (depending on the type of the
1791 	     instruction).  */
1792 	  if (!value_in_range_p (opnd->imm.value, 0, 255))
1793 	    {
1794 	      set_other_error (mismatch_detail, idx,
1795 			       _("immediate out of range"));
1796 	      return 0;
1797 	    }
1798 	  if (opnd->shifter.kind != AARCH64_MOD_NONE)
1799 	    {
1800 	      set_other_error (mismatch_detail, idx,
1801 			       _("invalid shift operator"));
1802 	      return 0;
1803 	    }
1804 	  break;
1805 
1806 	default:
1807 	  break;
1808 	}
1809       break;
1810 
1811     case AARCH64_OPND_CLASS_CP_REG:
1812       /* Cn or Cm: 4-bit opcode field named for historical reasons.
1813 	 valid range: C0 - C15.  */
1814       if (opnd->reg.regno > 15)
1815 	{
1816 	  set_regno_out_of_range_error (mismatch_detail, idx, 0, 15);
1817 	  return 0;
1818 	}
1819       break;
1820 
1821     case AARCH64_OPND_CLASS_SYSTEM:
1822       switch (type)
1823 	{
1824 	case AARCH64_OPND_PSTATEFIELD:
1825 	  assert (idx == 0 && opnds[1].type == AARCH64_OPND_UIMM4);
1826 	  /* MSR SPSel, #uimm4
1827 	     Uses uimm4 as a control value to select the stack pointer: if
1828 	     bit 0 is set it selects the current exception level's stack
1829 	     pointer, if bit 0 is clear it selects shared EL0 stack pointer.
1830 	     Bits 1 to 3 of uimm4 are reserved and should be zero.  */
1831 	  if (opnd->pstatefield == 0x05 /* spsel */ && opnds[1].imm.value > 1)
1832 	    {
1833 	      set_imm_out_of_range_error (mismatch_detail, idx, 0, 1);
1834 	      return 0;
1835 	    }
1836 	  break;
1837 	default:
1838 	  break;
1839 	}
1840       break;
1841 
1842     case AARCH64_OPND_CLASS_SIMD_ELEMENT:
1843       /* Get the upper bound for the element index.  */
1844       num = 16 / aarch64_get_qualifier_esize (qualifier) - 1;
1845       /* Index out-of-range.  */
1846       if (!value_in_range_p (opnd->reglane.index, 0, num))
1847 	{
1848 	  set_elem_idx_out_of_range_error (mismatch_detail, idx, 0, num);
1849 	  return 0;
1850 	}
1851       /* SMLAL<Q> <Vd>.<Ta>, <Vn>.<Tb>, <Vm>.<Ts>[<index>].
1852 	 <Vm>	Is the vector register (V0-V31) or (V0-V15), whose
1853 	 number is encoded in "size:M:Rm":
1854 	 size	<Vm>
1855 	 00		RESERVED
1856 	 01		0:Rm
1857 	 10		M:Rm
1858 	 11		RESERVED  */
1859       if (type == AARCH64_OPND_Em && qualifier == AARCH64_OPND_QLF_S_H
1860 	  && !value_in_range_p (opnd->reglane.regno, 0, 15))
1861 	{
1862 	  set_regno_out_of_range_error (mismatch_detail, idx, 0, 15);
1863 	  return 0;
1864 	}
1865       break;
1866 
1867     case AARCH64_OPND_CLASS_MODIFIED_REG:
1868       assert (idx == 1 || idx == 2);
1869       switch (type)
1870 	{
1871 	case AARCH64_OPND_Rm_EXT:
1872 	  if (aarch64_extend_operator_p (opnd->shifter.kind) == FALSE
1873 	      && opnd->shifter.kind != AARCH64_MOD_LSL)
1874 	    {
1875 	      set_other_error (mismatch_detail, idx,
1876 			       _("extend operator expected"));
1877 	      return 0;
1878 	    }
1879 	  /* It is not optional unless at least one of "Rd" or "Rn" is '11111'
1880 	     (i.e. SP), in which case it defaults to LSL. The LSL alias is
1881 	     only valid when "Rd" or "Rn" is '11111', and is preferred in that
1882 	     case.  */
1883 	  if (!aarch64_stack_pointer_p (opnds + 0)
1884 	      && (idx != 2 || !aarch64_stack_pointer_p (opnds + 1)))
1885 	    {
1886 	      if (!opnd->shifter.operator_present)
1887 		{
1888 		  set_other_error (mismatch_detail, idx,
1889 				   _("missing extend operator"));
1890 		  return 0;
1891 		}
1892 	      else if (opnd->shifter.kind == AARCH64_MOD_LSL)
1893 		{
1894 		  set_other_error (mismatch_detail, idx,
1895 				   _("'LSL' operator not allowed"));
1896 		  return 0;
1897 		}
1898 	    }
1899 	  assert (opnd->shifter.operator_present	/* Default to LSL.  */
1900 		  || opnd->shifter.kind == AARCH64_MOD_LSL);
1901 	  if (!value_in_range_p (opnd->shifter.amount, 0, 4))
1902 	    {
1903 	      set_sft_amount_out_of_range_error (mismatch_detail, idx, 0, 4);
1904 	      return 0;
1905 	    }
1906 	  /* In the 64-bit form, the final register operand is written as Wm
1907 	     for all but the (possibly omitted) UXTX/LSL and SXTX
1908 	     operators.
1909 	     N.B. GAS allows X register to be used with any operator as a
1910 	     programming convenience.  */
1911 	  if (qualifier == AARCH64_OPND_QLF_X
1912 	      && opnd->shifter.kind != AARCH64_MOD_LSL
1913 	      && opnd->shifter.kind != AARCH64_MOD_UXTX
1914 	      && opnd->shifter.kind != AARCH64_MOD_SXTX)
1915 	    {
1916 	      set_other_error (mismatch_detail, idx, _("W register expected"));
1917 	      return 0;
1918 	    }
1919 	  break;
1920 
1921 	case AARCH64_OPND_Rm_SFT:
1922 	  /* ROR is not available to the shifted register operand in
1923 	     arithmetic instructions.  */
1924 	  if (aarch64_shift_operator_p (opnd->shifter.kind) == FALSE)
1925 	    {
1926 	      set_other_error (mismatch_detail, idx,
1927 			       _("shift operator expected"));
1928 	      return 0;
1929 	    }
1930 	  if (opnd->shifter.kind == AARCH64_MOD_ROR
1931 	      && opcode->iclass != log_shift)
1932 	    {
1933 	      set_other_error (mismatch_detail, idx,
1934 			       _("'ROR' operator not allowed"));
1935 	      return 0;
1936 	    }
1937 	  num = qualifier == AARCH64_OPND_QLF_W ? 31 : 63;
1938 	  if (!value_in_range_p (opnd->shifter.amount, 0, num))
1939 	    {
1940 	      set_sft_amount_out_of_range_error (mismatch_detail, idx, 0, num);
1941 	      return 0;
1942 	    }
1943 	  break;
1944 
1945 	default:
1946 	  break;
1947 	}
1948       break;
1949 
1950     default:
1951       break;
1952     }
1953 
1954   return 1;
1955 }
1956 
1957 /* Main entrypoint for the operand constraint checking.
1958 
1959    Return 1 if operands of *INST meet the constraint applied by the operand
1960    codes and operand qualifiers; otherwise return 0 and if MISMATCH_DETAIL is
1961    not NULL, return the detail of the error in *MISMATCH_DETAIL.  N.B. when
1962    adding more constraint checking, make sure MISMATCH_DETAIL->KIND is set
1963    with a proper error kind rather than AARCH64_OPDE_NIL (GAS asserts non-NIL
1964    error kind when it is notified that an instruction does not pass the check).
1965 
1966    Un-determined operand qualifiers may get established during the process.  */
1967 
1968 int
1969 aarch64_match_operands_constraint (aarch64_inst *inst,
1970 				   aarch64_operand_error *mismatch_detail)
1971 {
1972   int i;
1973 
1974   DEBUG_TRACE ("enter");
1975 
1976   /* Match operands' qualifier.
1977      *INST has already had qualifier establish for some, if not all, of
1978      its operands; we need to find out whether these established
1979      qualifiers match one of the qualifier sequence in
1980      INST->OPCODE->QUALIFIERS_LIST.  If yes, we will assign each operand
1981      with the corresponding qualifier in such a sequence.
1982      Only basic operand constraint checking is done here; the more thorough
1983      constraint checking will carried out by operand_general_constraint_met_p,
1984      which has be to called after this in order to get all of the operands'
1985      qualifiers established.  */
1986   if (match_operands_qualifier (inst, TRUE /* update_p */) == 0)
1987     {
1988       DEBUG_TRACE ("FAIL on operand qualifier matching");
1989       if (mismatch_detail)
1990 	{
1991 	  /* Return an error type to indicate that it is the qualifier
1992 	     matching failure; we don't care about which operand as there
1993 	     are enough information in the opcode table to reproduce it.  */
1994 	  mismatch_detail->kind = AARCH64_OPDE_INVALID_VARIANT;
1995 	  mismatch_detail->index = -1;
1996 	  mismatch_detail->error = NULL;
1997 	}
1998       return 0;
1999     }
2000 
2001   /* Match operands' constraint.  */
2002   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2003     {
2004       enum aarch64_opnd type = inst->opcode->operands[i];
2005       if (type == AARCH64_OPND_NIL)
2006 	break;
2007       if (inst->operands[i].skip)
2008 	{
2009 	  DEBUG_TRACE ("skip the incomplete operand %d", i);
2010 	  continue;
2011 	}
2012       if (operand_general_constraint_met_p (inst->operands, i, type,
2013 					    inst->opcode, mismatch_detail) == 0)
2014 	{
2015 	  DEBUG_TRACE ("FAIL on operand %d", i);
2016 	  return 0;
2017 	}
2018     }
2019 
2020   DEBUG_TRACE ("PASS");
2021 
2022   return 1;
2023 }
2024 
2025 /* Replace INST->OPCODE with OPCODE and return the replaced OPCODE.
2026    Also updates the TYPE of each INST->OPERANDS with the corresponding
2027    value of OPCODE->OPERANDS.
2028 
2029    Note that some operand qualifiers may need to be manually cleared by
2030    the caller before it further calls the aarch64_opcode_encode; by
2031    doing this, it helps the qualifier matching facilities work
2032    properly.  */
2033 
2034 const aarch64_opcode*
2035 aarch64_replace_opcode (aarch64_inst *inst, const aarch64_opcode *opcode)
2036 {
2037   int i;
2038   const aarch64_opcode *old = inst->opcode;
2039 
2040   inst->opcode = opcode;
2041 
2042   /* Update the operand types.  */
2043   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2044     {
2045       inst->operands[i].type = opcode->operands[i];
2046       if (opcode->operands[i] == AARCH64_OPND_NIL)
2047 	break;
2048     }
2049 
2050   DEBUG_TRACE ("replace %s with %s", old->name, opcode->name);
2051 
2052   return old;
2053 }
2054 
2055 int
2056 aarch64_operand_index (const enum aarch64_opnd *operands, enum aarch64_opnd operand)
2057 {
2058   int i;
2059   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2060     if (operands[i] == operand)
2061       return i;
2062     else if (operands[i] == AARCH64_OPND_NIL)
2063       break;
2064   return -1;
2065 }
2066 
2067 /* [0][0]  32-bit integer regs with sp   Wn
2068    [0][1]  64-bit integer regs with sp   Xn  sf=1
2069    [1][0]  32-bit integer regs with #0   Wn
2070    [1][1]  64-bit integer regs with #0   Xn  sf=1 */
2071 static const char *int_reg[2][2][32] = {
2072 #define R32 "w"
2073 #define R64 "x"
2074   { { R32  "0", R32  "1", R32  "2", R32  "3", R32  "4", R32  "5", R32  "6", R32  "7",
2075       R32  "8", R32  "9", R32 "10", R32 "11", R32 "12", R32 "13", R32 "14", R32 "15",
2076       R32 "16", R32 "17", R32 "18", R32 "19", R32 "20", R32 "21", R32 "22", R32 "23",
2077       R32 "24", R32 "25", R32 "26", R32 "27", R32 "28", R32 "29", R32 "30",    "wsp" },
2078     { R64  "0", R64  "1", R64  "2", R64  "3", R64  "4", R64  "5", R64  "6", R64  "7",
2079       R64  "8", R64  "9", R64 "10", R64 "11", R64 "12", R64 "13", R64 "14", R64 "15",
2080       R64 "16", R64 "17", R64 "18", R64 "19", R64 "20", R64 "21", R64 "22", R64 "23",
2081       R64 "24", R64 "25", R64 "26", R64 "27", R64 "28", R64 "29", R64 "30",     "sp" } },
2082   { { R32  "0", R32  "1", R32  "2", R32  "3", R32  "4", R32  "5", R32  "6", R32  "7",
2083       R32  "8", R32  "9", R32 "10", R32 "11", R32 "12", R32 "13", R32 "14", R32 "15",
2084       R32 "16", R32 "17", R32 "18", R32 "19", R32 "20", R32 "21", R32 "22", R32 "23",
2085       R32 "24", R32 "25", R32 "26", R32 "27", R32 "28", R32 "29", R32 "30", R32 "zr" },
2086     { R64  "0", R64  "1", R64  "2", R64  "3", R64  "4", R64  "5", R64  "6", R64  "7",
2087       R64  "8", R64  "9", R64 "10", R64 "11", R64 "12", R64 "13", R64 "14", R64 "15",
2088       R64 "16", R64 "17", R64 "18", R64 "19", R64 "20", R64 "21", R64 "22", R64 "23",
2089       R64 "24", R64 "25", R64 "26", R64 "27", R64 "28", R64 "29", R64 "30", R64 "zr" } }
2090 #undef R64
2091 #undef R32
2092 };
2093 
2094 /* Return the integer register name.
2095    if SP_REG_P is not 0, R31 is an SP reg, other R31 is the zero reg.  */
2096 
2097 static inline const char *
2098 get_int_reg_name (int regno, aarch64_opnd_qualifier_t qualifier, int sp_reg_p)
2099 {
2100   const int has_zr = sp_reg_p ? 0 : 1;
2101   const int is_64 = aarch64_get_qualifier_esize (qualifier) == 4 ? 0 : 1;
2102   return int_reg[has_zr][is_64][regno];
2103 }
2104 
2105 /* Like get_int_reg_name, but IS_64 is always 1.  */
2106 
2107 static inline const char *
2108 get_64bit_int_reg_name (int regno, int sp_reg_p)
2109 {
2110   const int has_zr = sp_reg_p ? 0 : 1;
2111   return int_reg[has_zr][1][regno];
2112 }
2113 
2114 /* Types for expanding an encoded 8-bit value to a floating-point value.  */
2115 
2116 typedef union
2117 {
2118   uint64_t i;
2119   double   d;
2120 } double_conv_t;
2121 
2122 typedef union
2123 {
2124   uint32_t i;
2125   float    f;
2126 } single_conv_t;
2127 
2128 /* IMM8 is an 8-bit floating-point constant with sign, 3-bit exponent and
2129    normalized 4 bits of precision, encoded in "a:b:c:d:e:f:g:h" or FLD_imm8
2130    (depending on the type of the instruction).  IMM8 will be expanded to a
2131    single-precision floating-point value (IS_DP == 0) or a double-precision
2132    floating-point value (IS_DP == 1).  The expanded value is returned.  */
2133 
2134 static uint64_t
2135 expand_fp_imm (int is_dp, uint32_t imm8)
2136 {
2137   uint64_t imm;
2138   uint32_t imm8_7, imm8_6_0, imm8_6, imm8_6_repl4;
2139 
2140   imm8_7 = (imm8 >> 7) & 0x01;	/* imm8<7>   */
2141   imm8_6_0 = imm8 & 0x7f;	/* imm8<6:0> */
2142   imm8_6 = imm8_6_0 >> 6;	/* imm8<6>   */
2143   imm8_6_repl4 = (imm8_6 << 3) | (imm8_6 << 2)
2144     | (imm8_6 << 1) | imm8_6;	/* Replicate(imm8<6>,4) */
2145   if (is_dp)
2146     {
2147       imm = (imm8_7 << (63-32))		/* imm8<7>  */
2148 	| ((imm8_6 ^ 1) << (62-32))	/* NOT(imm8<6)	*/
2149 	| (imm8_6_repl4 << (58-32)) | (imm8_6 << (57-32))
2150 	| (imm8_6 << (56-32)) | (imm8_6 << (55-32)) /* Replicate(imm8<6>,7) */
2151 	| (imm8_6_0 << (48-32));	/* imm8<6>:imm8<5:0>    */
2152       imm <<= 32;
2153     }
2154   else
2155     {
2156       imm = (imm8_7 << 31)	/* imm8<7>              */
2157 	| ((imm8_6 ^ 1) << 30)	/* NOT(imm8<6>)         */
2158 	| (imm8_6_repl4 << 26)	/* Replicate(imm8<6>,4) */
2159 	| (imm8_6_0 << 19);	/* imm8<6>:imm8<5:0>    */
2160     }
2161 
2162   return imm;
2163 }
2164 
2165 /* Produce the string representation of the register list operand *OPND
2166    in the buffer pointed by BUF of size SIZE.  */
2167 static void
2168 print_register_list (char *buf, size_t size, const aarch64_opnd_info *opnd)
2169 {
2170   const int num_regs = opnd->reglist.num_regs;
2171   const int first_reg = opnd->reglist.first_regno;
2172   const int last_reg = (first_reg + num_regs - 1) & 0x1f;
2173   const char *qlf_name = aarch64_get_qualifier_name (opnd->qualifier);
2174   char tb[8];	/* Temporary buffer.  */
2175 
2176   assert (opnd->type != AARCH64_OPND_LEt || opnd->reglist.has_index);
2177   assert (num_regs >= 1 && num_regs <= 4);
2178 
2179   /* Prepare the index if any.  */
2180   if (opnd->reglist.has_index)
2181     snprintf (tb, 8, "[%d]", opnd->reglist.index);
2182   else
2183     tb[0] = '\0';
2184 
2185   /* The hyphenated form is preferred for disassembly if there are
2186      more than two registers in the list, and the register numbers
2187      are monotonically increasing in increments of one.  */
2188   if (num_regs > 2 && last_reg > first_reg)
2189     snprintf (buf, size, "{v%d.%s-v%d.%s}%s", first_reg, qlf_name,
2190 	      last_reg, qlf_name, tb);
2191   else
2192     {
2193       const int reg0 = first_reg;
2194       const int reg1 = (first_reg + 1) & 0x1f;
2195       const int reg2 = (first_reg + 2) & 0x1f;
2196       const int reg3 = (first_reg + 3) & 0x1f;
2197 
2198       switch (num_regs)
2199 	{
2200 	case 1:
2201 	  snprintf (buf, size, "{v%d.%s}%s", reg0, qlf_name, tb);
2202 	  break;
2203 	case 2:
2204 	  snprintf (buf, size, "{v%d.%s, v%d.%s}%s", reg0, qlf_name,
2205 		    reg1, qlf_name, tb);
2206 	  break;
2207 	case 3:
2208 	  snprintf (buf, size, "{v%d.%s, v%d.%s, v%d.%s}%s", reg0, qlf_name,
2209 		    reg1, qlf_name, reg2, qlf_name, tb);
2210 	  break;
2211 	case 4:
2212 	  snprintf (buf, size, "{v%d.%s, v%d.%s, v%d.%s, v%d.%s}%s",
2213 		    reg0, qlf_name, reg1, qlf_name, reg2, qlf_name,
2214 		    reg3, qlf_name, tb);
2215 	  break;
2216 	}
2217     }
2218 }
2219 
2220 /* Produce the string representation of the register offset address operand
2221    *OPND in the buffer pointed by BUF of size SIZE.  */
2222 static void
2223 print_register_offset_address (char *buf, size_t size,
2224 			       const aarch64_opnd_info *opnd)
2225 {
2226   const size_t tblen = 16;
2227   char tb[tblen];		/* Temporary buffer.  */
2228   bfd_boolean lsl_p = FALSE;	/* Is LSL shift operator?  */
2229   bfd_boolean wm_p = FALSE;	/* Should Rm be Wm?  */
2230   bfd_boolean print_extend_p = TRUE;
2231   bfd_boolean print_amount_p = TRUE;
2232   const char *shift_name = aarch64_operand_modifiers[opnd->shifter.kind].name;
2233 
2234   switch (opnd->shifter.kind)
2235     {
2236     case AARCH64_MOD_UXTW: wm_p = TRUE; break;
2237     case AARCH64_MOD_LSL : lsl_p = TRUE; break;
2238     case AARCH64_MOD_SXTW: wm_p = TRUE; break;
2239     case AARCH64_MOD_SXTX: break;
2240     default: assert (0);
2241     }
2242 
2243   if (!opnd->shifter.amount && (opnd->qualifier != AARCH64_OPND_QLF_S_B
2244 				|| !opnd->shifter.amount_present))
2245     {
2246       /* Not print the shift/extend amount when the amount is zero and
2247          when it is not the special case of 8-bit load/store instruction.  */
2248       print_amount_p = FALSE;
2249       /* Likewise, no need to print the shift operator LSL in such a
2250 	 situation.  */
2251       if (lsl_p)
2252 	print_extend_p = FALSE;
2253     }
2254 
2255   /* Prepare for the extend/shift.  */
2256   if (print_extend_p)
2257     {
2258       if (print_amount_p)
2259 	snprintf (tb, tblen, ",%s #%d", shift_name, opnd->shifter.amount);
2260       else
2261 	snprintf (tb, tblen, ",%s", shift_name);
2262     }
2263   else
2264     tb[0] = '\0';
2265 
2266   snprintf (buf, size, "[%s,%c%d%s]",
2267 	    get_64bit_int_reg_name (opnd->addr.base_regno, 1),
2268 	    wm_p ? 'w' : 'x', opnd->addr.offset.regno, tb);
2269 }
2270 
2271 /* Generate the string representation of the operand OPNDS[IDX] for OPCODE
2272    in *BUF.  The caller should pass in the maximum size of *BUF in SIZE.
2273    PC, PCREL_P and ADDRESS are used to pass in and return information about
2274    the PC-relative address calculation, where the PC value is passed in
2275    PC.  If the operand is pc-relative related, *PCREL_P (if PCREL_P non-NULL)
2276    will return 1 and *ADDRESS (if ADDRESS non-NULL) will return the
2277    calculated address; otherwise, *PCREL_P (if PCREL_P non-NULL) returns 0.
2278 
2279    The function serves both the disassembler and the assembler diagnostics
2280    issuer, which is the reason why it lives in this file.  */
2281 
2282 void
2283 aarch64_print_operand (char *buf, size_t size, bfd_vma pc,
2284 		       const aarch64_opcode *opcode,
2285 		       const aarch64_opnd_info *opnds, int idx, int *pcrel_p,
2286 		       bfd_vma *address)
2287 {
2288   int i;
2289   const char *name = NULL;
2290   const aarch64_opnd_info *opnd = opnds + idx;
2291   enum aarch64_modifier_kind kind;
2292   uint64_t addr;
2293 
2294   buf[0] = '\0';
2295   if (pcrel_p)
2296     *pcrel_p = 0;
2297 
2298   switch (opnd->type)
2299     {
2300     case AARCH64_OPND_Rd:
2301     case AARCH64_OPND_Rn:
2302     case AARCH64_OPND_Rm:
2303     case AARCH64_OPND_Rt:
2304     case AARCH64_OPND_Rt2:
2305     case AARCH64_OPND_Rs:
2306     case AARCH64_OPND_Ra:
2307     case AARCH64_OPND_Rt_SYS:
2308       /* The optional-ness of <Xt> in e.g. IC <ic_op>{, <Xt>} is determined by
2309 	 the <ic_op>, therefore we we use opnd->present to override the
2310 	 generic optional-ness information.  */
2311       if (opnd->type == AARCH64_OPND_Rt_SYS && !opnd->present)
2312 	break;
2313       /* Omit the operand, e.g. RET.  */
2314       if (optional_operand_p (opcode, idx)
2315 	  && opnd->reg.regno == get_optional_operand_default_value (opcode))
2316 	break;
2317       assert (opnd->qualifier == AARCH64_OPND_QLF_W
2318 	      || opnd->qualifier == AARCH64_OPND_QLF_X);
2319       snprintf (buf, size, "%s",
2320 		get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0));
2321       break;
2322 
2323     case AARCH64_OPND_Rd_SP:
2324     case AARCH64_OPND_Rn_SP:
2325       assert (opnd->qualifier == AARCH64_OPND_QLF_W
2326 	      || opnd->qualifier == AARCH64_OPND_QLF_WSP
2327 	      || opnd->qualifier == AARCH64_OPND_QLF_X
2328 	      || opnd->qualifier == AARCH64_OPND_QLF_SP);
2329       snprintf (buf, size, "%s",
2330 		get_int_reg_name (opnd->reg.regno, opnd->qualifier, 1));
2331       break;
2332 
2333     case AARCH64_OPND_Rm_EXT:
2334       kind = opnd->shifter.kind;
2335       assert (idx == 1 || idx == 2);
2336       if ((aarch64_stack_pointer_p (opnds)
2337 	   || (idx == 2 && aarch64_stack_pointer_p (opnds + 1)))
2338 	  && ((opnd->qualifier == AARCH64_OPND_QLF_W
2339 	       && opnds[0].qualifier == AARCH64_OPND_QLF_W
2340 	       && kind == AARCH64_MOD_UXTW)
2341 	      || (opnd->qualifier == AARCH64_OPND_QLF_X
2342 		  && kind == AARCH64_MOD_UXTX)))
2343 	{
2344 	  /* 'LSL' is the preferred form in this case.  */
2345 	  kind = AARCH64_MOD_LSL;
2346 	  if (opnd->shifter.amount == 0)
2347 	    {
2348 	      /* Shifter omitted.  */
2349 	      snprintf (buf, size, "%s",
2350 			get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0));
2351 	      break;
2352 	    }
2353 	}
2354       if (opnd->shifter.amount)
2355 	snprintf (buf, size, "%s, %s #%d",
2356 		  get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0),
2357 		  aarch64_operand_modifiers[kind].name,
2358 		  opnd->shifter.amount);
2359       else
2360 	snprintf (buf, size, "%s, %s",
2361 		  get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0),
2362 		  aarch64_operand_modifiers[kind].name);
2363       break;
2364 
2365     case AARCH64_OPND_Rm_SFT:
2366       assert (opnd->qualifier == AARCH64_OPND_QLF_W
2367 	      || opnd->qualifier == AARCH64_OPND_QLF_X);
2368       if (opnd->shifter.amount == 0 && opnd->shifter.kind == AARCH64_MOD_LSL)
2369 	snprintf (buf, size, "%s",
2370 		  get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0));
2371       else
2372 	snprintf (buf, size, "%s, %s #%d",
2373 		  get_int_reg_name (opnd->reg.regno, opnd->qualifier, 0),
2374 		  aarch64_operand_modifiers[opnd->shifter.kind].name,
2375 		  opnd->shifter.amount);
2376       break;
2377 
2378     case AARCH64_OPND_Fd:
2379     case AARCH64_OPND_Fn:
2380     case AARCH64_OPND_Fm:
2381     case AARCH64_OPND_Fa:
2382     case AARCH64_OPND_Ft:
2383     case AARCH64_OPND_Ft2:
2384     case AARCH64_OPND_Sd:
2385     case AARCH64_OPND_Sn:
2386     case AARCH64_OPND_Sm:
2387       snprintf (buf, size, "%s%d", aarch64_get_qualifier_name (opnd->qualifier),
2388 		opnd->reg.regno);
2389       break;
2390 
2391     case AARCH64_OPND_Vd:
2392     case AARCH64_OPND_Vn:
2393     case AARCH64_OPND_Vm:
2394       snprintf (buf, size, "v%d.%s", opnd->reg.regno,
2395 		aarch64_get_qualifier_name (opnd->qualifier));
2396       break;
2397 
2398     case AARCH64_OPND_Ed:
2399     case AARCH64_OPND_En:
2400     case AARCH64_OPND_Em:
2401       snprintf (buf, size, "v%d.%s[%d]", opnd->reglane.regno,
2402 		aarch64_get_qualifier_name (opnd->qualifier),
2403 		opnd->reglane.index);
2404       break;
2405 
2406     case AARCH64_OPND_VdD1:
2407     case AARCH64_OPND_VnD1:
2408       snprintf (buf, size, "v%d.d[1]", opnd->reg.regno);
2409       break;
2410 
2411     case AARCH64_OPND_LVn:
2412     case AARCH64_OPND_LVt:
2413     case AARCH64_OPND_LVt_AL:
2414     case AARCH64_OPND_LEt:
2415       print_register_list (buf, size, opnd);
2416       break;
2417 
2418     case AARCH64_OPND_Cn:
2419     case AARCH64_OPND_Cm:
2420       snprintf (buf, size, "C%d", opnd->reg.regno);
2421       break;
2422 
2423     case AARCH64_OPND_IDX:
2424     case AARCH64_OPND_IMM:
2425     case AARCH64_OPND_WIDTH:
2426     case AARCH64_OPND_UIMM3_OP1:
2427     case AARCH64_OPND_UIMM3_OP2:
2428     case AARCH64_OPND_BIT_NUM:
2429     case AARCH64_OPND_IMM_VLSL:
2430     case AARCH64_OPND_IMM_VLSR:
2431     case AARCH64_OPND_SHLL_IMM:
2432     case AARCH64_OPND_IMM0:
2433     case AARCH64_OPND_IMMR:
2434     case AARCH64_OPND_IMMS:
2435     case AARCH64_OPND_FBITS:
2436       snprintf (buf, size, "#%" PRIi64, opnd->imm.value);
2437       break;
2438 
2439     case AARCH64_OPND_IMM_MOV:
2440       switch (aarch64_get_qualifier_esize (opnds[0].qualifier))
2441 	{
2442 	case 4:	/* e.g. MOV Wd, #<imm32>.  */
2443 	    {
2444 	      int imm32 = opnd->imm.value;
2445 	      snprintf (buf, size, "#0x%-20x\t// #%d", imm32, imm32);
2446 	    }
2447 	  break;
2448 	case 8:	/* e.g. MOV Xd, #<imm64>.  */
2449 	  snprintf (buf, size, "#0x%-20" PRIx64 "\t// #%" PRIi64,
2450 		    opnd->imm.value, opnd->imm.value);
2451 	  break;
2452 	default: assert (0);
2453 	}
2454       break;
2455 
2456     case AARCH64_OPND_FPIMM0:
2457       snprintf (buf, size, "#0.0");
2458       break;
2459 
2460     case AARCH64_OPND_LIMM:
2461     case AARCH64_OPND_AIMM:
2462     case AARCH64_OPND_HALF:
2463       if (opnd->shifter.amount)
2464 	snprintf (buf, size, "#0x%" PRIx64 ", lsl #%d", opnd->imm.value,
2465 		  opnd->shifter.amount);
2466       else
2467 	snprintf (buf, size, "#0x%" PRIx64, opnd->imm.value);
2468       break;
2469 
2470     case AARCH64_OPND_SIMD_IMM:
2471     case AARCH64_OPND_SIMD_IMM_SFT:
2472       if ((! opnd->shifter.amount && opnd->shifter.kind == AARCH64_MOD_LSL)
2473 	  || opnd->shifter.kind == AARCH64_MOD_NONE)
2474 	snprintf (buf, size, "#0x%" PRIx64, opnd->imm.value);
2475       else
2476 	snprintf (buf, size, "#0x%" PRIx64 ", %s #%d", opnd->imm.value,
2477 		  aarch64_operand_modifiers[opnd->shifter.kind].name,
2478 		  opnd->shifter.amount);
2479       break;
2480 
2481     case AARCH64_OPND_FPIMM:
2482     case AARCH64_OPND_SIMD_FPIMM:
2483       switch (aarch64_get_qualifier_esize (opnds[0].qualifier))
2484 	{
2485 	case 4:	/* e.g. FMOV <Vd>.4S, #<imm>.  */
2486 	    {
2487 	      single_conv_t c;
2488 	      c.i = expand_fp_imm (0, opnd->imm.value);
2489 	      snprintf (buf, size,  "#%.18e", c.f);
2490 	    }
2491 	  break;
2492 	case 8:	/* e.g. FMOV <Sd>, #<imm>.  */
2493 	    {
2494 	      double_conv_t c;
2495 	      c.i = expand_fp_imm (1, opnd->imm.value);
2496 	      snprintf (buf, size,  "#%.18e", c.d);
2497 	    }
2498 	  break;
2499 	default: assert (0);
2500 	}
2501       break;
2502 
2503     case AARCH64_OPND_CCMP_IMM:
2504     case AARCH64_OPND_NZCV:
2505     case AARCH64_OPND_EXCEPTION:
2506     case AARCH64_OPND_UIMM4:
2507     case AARCH64_OPND_UIMM7:
2508       if (optional_operand_p (opcode, idx) == TRUE
2509 	  && (opnd->imm.value ==
2510 	      (int64_t) get_optional_operand_default_value (opcode)))
2511 	/* Omit the operand, e.g. DCPS1.  */
2512 	break;
2513       snprintf (buf, size, "#0x%x", (unsigned int)opnd->imm.value);
2514       break;
2515 
2516     case AARCH64_OPND_COND:
2517       snprintf (buf, size, "%s", opnd->cond->names[0]);
2518       break;
2519 
2520     case AARCH64_OPND_ADDR_ADRP:
2521       addr = ((pc + AARCH64_PCREL_OFFSET) & ~(uint64_t)0xfff)
2522 	+ opnd->imm.value;
2523       if (pcrel_p)
2524 	*pcrel_p = 1;
2525       if (address)
2526 	*address = addr;
2527       /* This is not necessary during the disassembling, as print_address_func
2528 	 in the disassemble_info will take care of the printing.  But some
2529 	 other callers may be still interested in getting the string in *STR,
2530 	 so here we do snprintf regardless.  */
2531       snprintf (buf, size, "#0x%" PRIx64, addr);
2532       break;
2533 
2534     case AARCH64_OPND_ADDR_PCREL14:
2535     case AARCH64_OPND_ADDR_PCREL19:
2536     case AARCH64_OPND_ADDR_PCREL21:
2537     case AARCH64_OPND_ADDR_PCREL26:
2538       addr = pc + AARCH64_PCREL_OFFSET + opnd->imm.value;
2539       if (pcrel_p)
2540 	*pcrel_p = 1;
2541       if (address)
2542 	*address = addr;
2543       /* This is not necessary during the disassembling, as print_address_func
2544 	 in the disassemble_info will take care of the printing.  But some
2545 	 other callers may be still interested in getting the string in *STR,
2546 	 so here we do snprintf regardless.  */
2547       snprintf (buf, size, "#0x%" PRIx64, addr);
2548       break;
2549 
2550     case AARCH64_OPND_ADDR_SIMPLE:
2551     case AARCH64_OPND_SIMD_ADDR_SIMPLE:
2552     case AARCH64_OPND_SIMD_ADDR_POST:
2553       name = get_64bit_int_reg_name (opnd->addr.base_regno, 1);
2554       if (opnd->type == AARCH64_OPND_SIMD_ADDR_POST)
2555 	{
2556 	  if (opnd->addr.offset.is_reg)
2557 	    snprintf (buf, size, "[%s], x%d", name, opnd->addr.offset.regno);
2558 	  else
2559 	    snprintf (buf, size, "[%s], #%d", name, opnd->addr.offset.imm);
2560 	}
2561       else
2562 	snprintf (buf, size, "[%s]", name);
2563       break;
2564 
2565     case AARCH64_OPND_ADDR_REGOFF:
2566       print_register_offset_address (buf, size, opnd);
2567       break;
2568 
2569     case AARCH64_OPND_ADDR_SIMM7:
2570     case AARCH64_OPND_ADDR_SIMM9:
2571     case AARCH64_OPND_ADDR_SIMM9_2:
2572       name = get_64bit_int_reg_name (opnd->addr.base_regno, 1);
2573       if (opnd->addr.writeback)
2574 	{
2575 	  if (opnd->addr.preind)
2576 	    snprintf (buf, size, "[%s,#%d]!", name, opnd->addr.offset.imm);
2577 	  else
2578 	    snprintf (buf, size, "[%s],#%d", name, opnd->addr.offset.imm);
2579 	}
2580       else
2581 	{
2582 	  if (opnd->addr.offset.imm)
2583 	    snprintf (buf, size, "[%s,#%d]", name, opnd->addr.offset.imm);
2584 	  else
2585 	    snprintf (buf, size, "[%s]", name);
2586 	}
2587       break;
2588 
2589     case AARCH64_OPND_ADDR_UIMM12:
2590       name = get_64bit_int_reg_name (opnd->addr.base_regno, 1);
2591       if (opnd->addr.offset.imm)
2592 	snprintf (buf, size, "[%s,#%d]", name, opnd->addr.offset.imm);
2593       else
2594 	snprintf (buf, size, "[%s]", name);
2595       break;
2596 
2597     case AARCH64_OPND_SYSREG:
2598       for (i = 0; aarch64_sys_regs[i].name; ++i)
2599 	if (aarch64_sys_regs[i].value == opnd->sysreg)
2600 	  break;
2601       if (aarch64_sys_regs[i].name)
2602 	snprintf (buf, size, "%s", aarch64_sys_regs[i].name);
2603       else
2604 	{
2605 	  /* Implementation defined system register.  */
2606 	  unsigned int value = opnd->sysreg;
2607 	  snprintf (buf, size, "s%u_%u_c%u_c%u_%u", (value >> 14) & 0x3,
2608 		    (value >> 11) & 0x7, (value >> 7) & 0xf, (value >> 3) & 0xf,
2609 		    value & 0x7);
2610 	}
2611       break;
2612 
2613     case AARCH64_OPND_PSTATEFIELD:
2614       for (i = 0; aarch64_pstatefields[i].name; ++i)
2615 	if (aarch64_pstatefields[i].value == opnd->pstatefield)
2616 	  break;
2617       assert (aarch64_pstatefields[i].name);
2618       snprintf (buf, size, "%s", aarch64_pstatefields[i].name);
2619       break;
2620 
2621     case AARCH64_OPND_SYSREG_AT:
2622     case AARCH64_OPND_SYSREG_DC:
2623     case AARCH64_OPND_SYSREG_IC:
2624     case AARCH64_OPND_SYSREG_TLBI:
2625       snprintf (buf, size, "%s", opnd->sysins_op->template);
2626       break;
2627 
2628     case AARCH64_OPND_BARRIER:
2629       snprintf (buf, size, "%s", opnd->barrier->name);
2630       break;
2631 
2632     case AARCH64_OPND_BARRIER_ISB:
2633       /* Operand can be omitted, e.g. in DCPS1.  */
2634       if (! optional_operand_p (opcode, idx)
2635 	  || (opnd->barrier->value
2636 	      != get_optional_operand_default_value (opcode)))
2637 	snprintf (buf, size, "#0x%x", opnd->barrier->value);
2638       break;
2639 
2640     case AARCH64_OPND_PRFOP:
2641       if (opnd->prfop->name != NULL)
2642 	snprintf (buf, size, "%s", opnd->prfop->name);
2643       else
2644 	snprintf (buf, size, "#0x%02x", opnd->prfop->value);
2645       break;
2646 
2647     default:
2648       assert (0);
2649     }
2650 }
2651 
2652 #define CPENC(op0,op1,crn,crm,op2) \
2653   ((((op0) << 19) | ((op1) << 16) | ((crn) << 12) | ((crm) << 8) | ((op2) << 5)) >> 5)
2654   /* for 3.9.3 Instructions for Accessing Special Purpose Registers */
2655 #define CPEN_(op1,crm,op2) CPENC(3,(op1),4,(crm),(op2))
2656   /* for 3.9.10 System Instructions */
2657 #define CPENS(op1,crn,crm,op2) CPENC(1,(op1),(crn),(crm),(op2))
2658 
2659 #define C0  0
2660 #define C1  1
2661 #define C2  2
2662 #define C3  3
2663 #define C4  4
2664 #define C5  5
2665 #define C6  6
2666 #define C7  7
2667 #define C8  8
2668 #define C9  9
2669 #define C10 10
2670 #define C11 11
2671 #define C12 12
2672 #define C13 13
2673 #define C14 14
2674 #define C15 15
2675 
2676 /* TODO there are two more issues need to be resolved
2677    1. handle read-only and write-only system registers
2678    2. handle cpu-implementation-defined system registers.  */
2679 const struct aarch64_name_value_pair aarch64_sys_regs [] =
2680 {
2681   { "spsr_el1",         CPEN_(0,C0,0)  }, /* = spsr_svc */
2682   { "elr_el1",          CPEN_(0,C0,1)  },
2683   { "sp_el0",           CPEN_(0,C1,0)  },
2684   { "spsel",            CPEN_(0,C2,0)  },
2685   { "daif",             CPEN_(3,C2,1)  },
2686   { "currentel",        CPEN_(0,C2,2)  }, /* RO */
2687   { "nzcv",             CPEN_(3,C2,0)  },
2688   { "fpcr",             CPEN_(3,C4,0)  },
2689   { "fpsr",             CPEN_(3,C4,1)  },
2690   { "dspsr_el0",        CPEN_(3,C5,0)  },
2691   { "dlr_el0",          CPEN_(3,C5,1)  },
2692   { "spsr_el2",         CPEN_(4,C0,0)  }, /* = spsr_hyp */
2693   { "elr_el2",          CPEN_(4,C0,1)  },
2694   { "sp_el1",           CPEN_(4,C1,0)  },
2695   { "spsr_irq",         CPEN_(4,C3,0)  },
2696   { "spsr_abt",         CPEN_(4,C3,1)  },
2697   { "spsr_und",         CPEN_(4,C3,2)  },
2698   { "spsr_fiq",         CPEN_(4,C3,3)  },
2699   { "spsr_el3",         CPEN_(6,C0,0)  },
2700   { "elr_el3",          CPEN_(6,C0,1)  },
2701   { "sp_el2",           CPEN_(6,C1,0)  },
2702   { "spsr_svc",         CPEN_(0,C0,0)  }, /* = spsr_el1 */
2703   { "spsr_hyp",         CPEN_(4,C0,0)  }, /* = spsr_el2 */
2704   { "midr_el1",         CPENC(3,0,C0,C0,0)  }, /* RO */
2705   { "ctr_el0",          CPENC(3,3,C0,C0,1)  }, /* RO */
2706   { "mpidr_el1",        CPENC(3,0,C0,C0,5)  }, /* RO */
2707   { "revidr_el1",       CPENC(3,0,C0,C0,6)  }, /* RO */
2708   { "aidr_el1",         CPENC(3,1,C0,C0,7)  }, /* RO */
2709   { "dczid_el0",        CPENC(3,3,C0,C0,7)  }, /* RO */
2710   { "id_dfr0_el1",      CPENC(3,0,C0,C1,2)  }, /* RO */
2711   { "id_pfr0_el1",      CPENC(3,0,C0,C1,0)  }, /* RO */
2712   { "id_pfr1_el1",      CPENC(3,0,C0,C1,1)  }, /* RO */
2713   { "id_afr0_el1",      CPENC(3,0,C0,C1,3)  }, /* RO */
2714   { "id_mmfr0_el1",     CPENC(3,0,C0,C1,4)  }, /* RO */
2715   { "id_mmfr1_el1",     CPENC(3,0,C0,C1,5)  }, /* RO */
2716   { "id_mmfr2_el1",     CPENC(3,0,C0,C1,6)  }, /* RO */
2717   { "id_mmfr3_el1",     CPENC(3,0,C0,C1,7)  }, /* RO */
2718   { "id_isar0_el1",     CPENC(3,0,C0,C2,0)  }, /* RO */
2719   { "id_isar1_el1",     CPENC(3,0,C0,C2,1)  }, /* RO */
2720   { "id_isar2_el1",     CPENC(3,0,C0,C2,2)  }, /* RO */
2721   { "id_isar3_el1",     CPENC(3,0,C0,C2,3)  }, /* RO */
2722   { "id_isar4_el1",     CPENC(3,0,C0,C2,4)  }, /* RO */
2723   { "id_isar5_el1",     CPENC(3,0,C0,C2,5)  }, /* RO */
2724   { "mvfr0_el1",        CPENC(3,0,C0,C3,0)  }, /* RO */
2725   { "mvfr1_el1",        CPENC(3,0,C0,C3,1)  }, /* RO */
2726   { "mvfr2_el1",        CPENC(3,0,C0,C3,2)  }, /* RO */
2727   { "ccsidr_el1",       CPENC(3,1,C0,C0,0)  }, /* RO */
2728   { "id_aa64pfr0_el1",  CPENC(3,0,C0,C4,0)  }, /* RO */
2729   { "id_aa64pfr1_el1",  CPENC(3,0,C0,C4,1)  }, /* RO */
2730   { "id_aa64dfr0_el1",  CPENC(3,0,C0,C5,0)  }, /* RO */
2731   { "id_aa64dfr1_el1",  CPENC(3,0,C0,C5,1)  }, /* RO */
2732   { "id_aa64isar0_el1", CPENC(3,0,C0,C6,0)  }, /* RO */
2733   { "id_aa64isar1_el1", CPENC(3,0,C0,C6,1)  }, /* RO */
2734   { "id_aa64mmfr0_el1", CPENC(3,0,C0,C7,0)  }, /* RO */
2735   { "id_aa64mmfr1_el1", CPENC(3,0,C0,C7,1)  }, /* RO */
2736   { "id_aa64afr0_el1",  CPENC(3,0,C0,C5,4)  }, /* RO */
2737   { "id_aa64afr1_el1",  CPENC(3,0,C0,C5,5)  }, /* RO */
2738   { "clidr_el1",        CPENC(3,1,C0,C0,1)  }, /* RO */
2739   { "csselr_el1",       CPENC(3,2,C0,C0,0)  }, /* RO */
2740   { "vpidr_el2",        CPENC(3,4,C0,C0,0)  },
2741   { "vmpidr_el2",       CPENC(3,4,C0,C0,5)  },
2742   { "sctlr_el1",        CPENC(3,0,C1,C0,0)  },
2743   { "sctlr_el2",        CPENC(3,4,C1,C0,0)  },
2744   { "sctlr_el3",        CPENC(3,6,C1,C0,0)  },
2745   { "actlr_el1",        CPENC(3,0,C1,C0,1)  },
2746   { "actlr_el2",        CPENC(3,4,C1,C0,1)  },
2747   { "actlr_el3",        CPENC(3,6,C1,C0,1)  },
2748   { "cpacr_el1",        CPENC(3,0,C1,C0,2)  },
2749   { "cptr_el2",         CPENC(3,4,C1,C1,2)  },
2750   { "cptr_el3",         CPENC(3,6,C1,C1,2)  },
2751   { "scr_el3",          CPENC(3,6,C1,C1,0)  },
2752   { "hcr_el2",          CPENC(3,4,C1,C1,0)  },
2753   { "mdcr_el2",         CPENC(3,4,C1,C1,1)  },
2754   { "mdcr_el3",         CPENC(3,6,C1,C3,1)  },
2755   { "hstr_el2",         CPENC(3,4,C1,C1,3)  },
2756   { "hacr_el2",         CPENC(3,4,C1,C1,7)  },
2757   { "ttbr0_el1",        CPENC(3,0,C2,C0,0)  },
2758   { "ttbr1_el1",        CPENC(3,0,C2,C0,1)  },
2759   { "ttbr0_el2",        CPENC(3,4,C2,C0,0)  },
2760   { "ttbr0_el3",        CPENC(3,6,C2,C0,0)  },
2761   { "vttbr_el2",        CPENC(3,4,C2,C1,0)  },
2762   { "tcr_el1",          CPENC(3,0,C2,C0,2)  },
2763   { "tcr_el2",          CPENC(3,4,C2,C0,2)  },
2764   { "tcr_el3",          CPENC(3,6,C2,C0,2)  },
2765   { "vtcr_el2",         CPENC(3,4,C2,C1,2)  },
2766   { "afsr0_el1",        CPENC(3,0,C5,C1,0)  },
2767   { "afsr1_el1",        CPENC(3,0,C5,C1,1)  },
2768   { "afsr0_el2",        CPENC(3,4,C5,C1,0)  },
2769   { "afsr1_el2",        CPENC(3,4,C5,C1,1)  },
2770   { "afsr0_el3",        CPENC(3,6,C5,C1,0)  },
2771   { "afsr1_el3",        CPENC(3,6,C5,C1,1)  },
2772   { "esr_el1",          CPENC(3,0,C5,C2,0)  },
2773   { "esr_el2",          CPENC(3,4,C5,C2,0)  },
2774   { "esr_el3",          CPENC(3,6,C5,C2,0)  },
2775   { "fpexc32_el2",      CPENC(3,4,C5,C3,0)  },
2776   { "far_el1",          CPENC(3,0,C6,C0,0)  },
2777   { "far_el2",          CPENC(3,4,C6,C0,0)  },
2778   { "far_el3",          CPENC(3,6,C6,C0,0)  },
2779   { "hpfar_el2",        CPENC(3,4,C6,C0,4)  },
2780   { "par_el1",          CPENC(3,0,C7,C4,0)  },
2781   { "mair_el1",         CPENC(3,0,C10,C2,0) },
2782   { "mair_el2",         CPENC(3,4,C10,C2,0) },
2783   { "mair_el3",         CPENC(3,6,C10,C2,0) },
2784   { "amair_el1",        CPENC(3,0,C10,C3,0) },
2785   { "amair_el2",        CPENC(3,4,C10,C3,0) },
2786   { "amair_el3",        CPENC(3,6,C10,C3,0) },
2787   { "vbar_el1",         CPENC(3,0,C12,C0,0) },
2788   { "vbar_el2",         CPENC(3,4,C12,C0,0) },
2789   { "vbar_el3",         CPENC(3,6,C12,C0,0) },
2790   { "rvbar_el1",        CPENC(3,0,C12,C0,1) }, /* RO */
2791   { "rvbar_el2",        CPENC(3,4,C12,C0,1) }, /* RO */
2792   { "rvbar_el3",        CPENC(3,6,C12,C0,1) }, /* RO */
2793   { "rmr_el1",          CPENC(3,0,C12,C0,2) },
2794   { "rmr_el2",          CPENC(3,4,C12,C0,2) },
2795   { "rmr_el3",          CPENC(3,6,C12,C0,2) },
2796   { "isr_el1",          CPENC(3,0,C12,C1,0) }, /* RO */
2797   { "contextidr_el1",   CPENC(3,0,C13,C0,1) },
2798   { "tpidr_el0",        CPENC(3,3,C13,C0,2) },
2799   { "tpidrro_el0",      CPENC(3,3,C13,C0,3) }, /* RO */
2800   { "tpidr_el1",        CPENC(3,0,C13,C0,4) },
2801   { "tpidr_el2",        CPENC(3,4,C13,C0,2) },
2802   { "tpidr_el3",        CPENC(3,6,C13,C0,2) },
2803   { "teecr32_el1",      CPENC(2,2,C0, C0,0) }, /* See section 3.9.7.1 */
2804   { "cntfrq_el0",       CPENC(3,3,C14,C0,0) }, /* RO */
2805   { "cntpct_el0",       CPENC(3,3,C14,C0,1) }, /* RO */
2806   { "cntvct_el0",       CPENC(3,3,C14,C0,2) }, /* RO */
2807   { "cntvoff_el2",      CPENC(3,4,C14,C0,3) },
2808   { "cntkctl_el1",      CPENC(3,0,C14,C1,0) },
2809   { "cnthctl_el2",      CPENC(3,4,C14,C1,0) },
2810   { "cntp_tval_el0",    CPENC(3,3,C14,C2,0) },
2811   { "cntp_ctl_el0",     CPENC(3,3,C14,C2,1) },
2812   { "cntp_cval_el0",    CPENC(3,3,C14,C2,2) },
2813   { "cntv_tval_el0",    CPENC(3,3,C14,C3,0) },
2814   { "cntv_ctl_el0",     CPENC(3,3,C14,C3,1) },
2815   { "cntv_cval_el0",    CPENC(3,3,C14,C3,2) },
2816   { "cnthp_tval_el2",   CPENC(3,4,C14,C2,0) },
2817   { "cnthp_ctl_el2",    CPENC(3,4,C14,C2,1) },
2818   { "cnthp_cval_el2",   CPENC(3,4,C14,C2,2) },
2819   { "cntps_tval_el1",   CPENC(3,7,C14,C2,0) },
2820   { "cntps_ctl_el1",    CPENC(3,7,C14,C2,1) },
2821   { "cntps_cval_el1",   CPENC(3,7,C14,C2,2) },
2822   { "dacr32_el2",       CPENC(3,4,C3,C0,0)  },
2823   { "ifsr32_el2",       CPENC(3,4,C5,C0,1)  },
2824   { "teehbr32_el1",     CPENC(2,2,C1,C0,0)  },
2825   { "sder32_el3",       CPENC(3,6,C1,C1,1)  },
2826   { "mdscr_el1",         CPENC(2,0,C0, C2, 2) },
2827   { "mdccsr_el0",        CPENC(2,3,C0, C1, 0) },  /* r */
2828   { "mdccint_el1",       CPENC(2,0,C0, C2, 0) },
2829   { "dbgdtr_el0",        CPENC(2,3,C0, C4, 0) },
2830   { "dbgdtrrx_el0",      CPENC(2,3,C0, C5, 0) },  /* r */
2831   { "dbgdtrtx_el0",      CPENC(2,3,C0, C5, 0) },  /* w */
2832   { "osdtrrx_el1",       CPENC(2,0,C0, C0, 2) },  /* r */
2833   { "osdtrtx_el1",       CPENC(2,0,C0, C3, 2) },  /* w */
2834   { "oseccr_el1",        CPENC(2,0,C0, C6, 2) },
2835   { "dbgvcr32_el2",      CPENC(2,4,C0, C7, 0) },
2836   { "dbgbvr0_el1",       CPENC(2,0,C0, C0, 4) },
2837   { "dbgbvr1_el1",       CPENC(2,0,C0, C1, 4) },
2838   { "dbgbvr2_el1",       CPENC(2,0,C0, C2, 4) },
2839   { "dbgbvr3_el1",       CPENC(2,0,C0, C3, 4) },
2840   { "dbgbvr4_el1",       CPENC(2,0,C0, C4, 4) },
2841   { "dbgbvr5_el1",       CPENC(2,0,C0, C5, 4) },
2842   { "dbgbvr6_el1",       CPENC(2,0,C0, C6, 4) },
2843   { "dbgbvr7_el1",       CPENC(2,0,C0, C7, 4) },
2844   { "dbgbvr8_el1",       CPENC(2,0,C0, C8, 4) },
2845   { "dbgbvr9_el1",       CPENC(2,0,C0, C9, 4) },
2846   { "dbgbvr10_el1",      CPENC(2,0,C0, C10,4) },
2847   { "dbgbvr11_el1",      CPENC(2,0,C0, C11,4) },
2848   { "dbgbvr12_el1",      CPENC(2,0,C0, C12,4) },
2849   { "dbgbvr13_el1",      CPENC(2,0,C0, C13,4) },
2850   { "dbgbvr14_el1",      CPENC(2,0,C0, C14,4) },
2851   { "dbgbvr15_el1",      CPENC(2,0,C0, C15,4) },
2852   { "dbgbcr0_el1",       CPENC(2,0,C0, C0, 5) },
2853   { "dbgbcr1_el1",       CPENC(2,0,C0, C1, 5) },
2854   { "dbgbcr2_el1",       CPENC(2,0,C0, C2, 5) },
2855   { "dbgbcr3_el1",       CPENC(2,0,C0, C3, 5) },
2856   { "dbgbcr4_el1",       CPENC(2,0,C0, C4, 5) },
2857   { "dbgbcr5_el1",       CPENC(2,0,C0, C5, 5) },
2858   { "dbgbcr6_el1",       CPENC(2,0,C0, C6, 5) },
2859   { "dbgbcr7_el1",       CPENC(2,0,C0, C7, 5) },
2860   { "dbgbcr8_el1",       CPENC(2,0,C0, C8, 5) },
2861   { "dbgbcr9_el1",       CPENC(2,0,C0, C9, 5) },
2862   { "dbgbcr10_el1",      CPENC(2,0,C0, C10,5) },
2863   { "dbgbcr11_el1",      CPENC(2,0,C0, C11,5) },
2864   { "dbgbcr12_el1",      CPENC(2,0,C0, C12,5) },
2865   { "dbgbcr13_el1",      CPENC(2,0,C0, C13,5) },
2866   { "dbgbcr14_el1",      CPENC(2,0,C0, C14,5) },
2867   { "dbgbcr15_el1",      CPENC(2,0,C0, C15,5) },
2868   { "dbgwvr0_el1",       CPENC(2,0,C0, C0, 6) },
2869   { "dbgwvr1_el1",       CPENC(2,0,C0, C1, 6) },
2870   { "dbgwvr2_el1",       CPENC(2,0,C0, C2, 6) },
2871   { "dbgwvr3_el1",       CPENC(2,0,C0, C3, 6) },
2872   { "dbgwvr4_el1",       CPENC(2,0,C0, C4, 6) },
2873   { "dbgwvr5_el1",       CPENC(2,0,C0, C5, 6) },
2874   { "dbgwvr6_el1",       CPENC(2,0,C0, C6, 6) },
2875   { "dbgwvr7_el1",       CPENC(2,0,C0, C7, 6) },
2876   { "dbgwvr8_el1",       CPENC(2,0,C0, C8, 6) },
2877   { "dbgwvr9_el1",       CPENC(2,0,C0, C9, 6) },
2878   { "dbgwvr10_el1",      CPENC(2,0,C0, C10,6) },
2879   { "dbgwvr11_el1",      CPENC(2,0,C0, C11,6) },
2880   { "dbgwvr12_el1",      CPENC(2,0,C0, C12,6) },
2881   { "dbgwvr13_el1",      CPENC(2,0,C0, C13,6) },
2882   { "dbgwvr14_el1",      CPENC(2,0,C0, C14,6) },
2883   { "dbgwvr15_el1",      CPENC(2,0,C0, C15,6) },
2884   { "dbgwcr0_el1",       CPENC(2,0,C0, C0, 7) },
2885   { "dbgwcr1_el1",       CPENC(2,0,C0, C1, 7) },
2886   { "dbgwcr2_el1",       CPENC(2,0,C0, C2, 7) },
2887   { "dbgwcr3_el1",       CPENC(2,0,C0, C3, 7) },
2888   { "dbgwcr4_el1",       CPENC(2,0,C0, C4, 7) },
2889   { "dbgwcr5_el1",       CPENC(2,0,C0, C5, 7) },
2890   { "dbgwcr6_el1",       CPENC(2,0,C0, C6, 7) },
2891   { "dbgwcr7_el1",       CPENC(2,0,C0, C7, 7) },
2892   { "dbgwcr8_el1",       CPENC(2,0,C0, C8, 7) },
2893   { "dbgwcr9_el1",       CPENC(2,0,C0, C9, 7) },
2894   { "dbgwcr10_el1",      CPENC(2,0,C0, C10,7) },
2895   { "dbgwcr11_el1",      CPENC(2,0,C0, C11,7) },
2896   { "dbgwcr12_el1",      CPENC(2,0,C0, C12,7) },
2897   { "dbgwcr13_el1",      CPENC(2,0,C0, C13,7) },
2898   { "dbgwcr14_el1",      CPENC(2,0,C0, C14,7) },
2899   { "dbgwcr15_el1",      CPENC(2,0,C0, C15,7) },
2900   { "mdrar_el1",         CPENC(2,0,C1, C0, 0) },  /* r */
2901   { "oslar_el1",         CPENC(2,0,C1, C0, 4) },  /* w */
2902   { "oslsr_el1",         CPENC(2,0,C1, C1, 4) },  /* r */
2903   { "osdlr_el1",         CPENC(2,0,C1, C3, 4) },
2904   { "dbgprcr_el1",       CPENC(2,0,C1, C4, 4) },
2905   { "dbgclaimset_el1",   CPENC(2,0,C7, C8, 6) },
2906   { "dbgclaimclr_el1",   CPENC(2,0,C7, C9, 6) },
2907   { "dbgauthstatus_el1", CPENC(2,0,C7, C14,6) },  /* r */
2908 
2909   { "pmcr_el0",          CPENC(3,3,C9,C12, 0) },
2910   { "pmcntenset_el0",    CPENC(3,3,C9,C12, 1) },
2911   { "pmcntenclr_el0",    CPENC(3,3,C9,C12, 2) },
2912   { "pmovsclr_el0",      CPENC(3,3,C9,C12, 3) },
2913   { "pmswinc_el0",       CPENC(3,3,C9,C12, 4) },  /* w */
2914   { "pmselr_el0",        CPENC(3,3,C9,C12, 5) },
2915   { "pmceid0_el0",       CPENC(3,3,C9,C12, 6) },  /* r */
2916   { "pmceid1_el0",       CPENC(3,3,C9,C12, 7) },  /* r */
2917   { "pmccntr_el0",       CPENC(3,3,C9,C13, 0) },
2918   { "pmxevtyper_el0",    CPENC(3,3,C9,C13, 1) },
2919   { "pmxevcntr_el0",     CPENC(3,3,C9,C13, 2) },
2920   { "pmuserenr_el0",     CPENC(3,3,C9,C14, 0) },
2921   { "pmintenset_el1",    CPENC(3,0,C9,C14, 1) },
2922   { "pmintenclr_el1",    CPENC(3,0,C9,C14, 2) },
2923   { "pmovsset_el0",      CPENC(3,3,C9,C14, 3) },
2924   { "pmevcntr0_el0",     CPENC(3,3,C14,C8, 0) },
2925   { "pmevcntr1_el0",     CPENC(3,3,C14,C8, 1) },
2926   { "pmevcntr2_el0",     CPENC(3,3,C14,C8, 2) },
2927   { "pmevcntr3_el0",     CPENC(3,3,C14,C8, 3) },
2928   { "pmevcntr4_el0",     CPENC(3,3,C14,C8, 4) },
2929   { "pmevcntr5_el0",     CPENC(3,3,C14,C8, 5) },
2930   { "pmevcntr6_el0",     CPENC(3,3,C14,C8, 6) },
2931   { "pmevcntr7_el0",     CPENC(3,3,C14,C8, 7) },
2932   { "pmevcntr8_el0",     CPENC(3,3,C14,C9, 0) },
2933   { "pmevcntr9_el0",     CPENC(3,3,C14,C9, 1) },
2934   { "pmevcntr10_el0",    CPENC(3,3,C14,C9, 2) },
2935   { "pmevcntr11_el0",    CPENC(3,3,C14,C9, 3) },
2936   { "pmevcntr12_el0",    CPENC(3,3,C14,C9, 4) },
2937   { "pmevcntr13_el0",    CPENC(3,3,C14,C9, 5) },
2938   { "pmevcntr14_el0",    CPENC(3,3,C14,C9, 6) },
2939   { "pmevcntr15_el0",    CPENC(3,3,C14,C9, 7) },
2940   { "pmevcntr16_el0",    CPENC(3,3,C14,C10,0) },
2941   { "pmevcntr17_el0",    CPENC(3,3,C14,C10,1) },
2942   { "pmevcntr18_el0",    CPENC(3,3,C14,C10,2) },
2943   { "pmevcntr19_el0",    CPENC(3,3,C14,C10,3) },
2944   { "pmevcntr20_el0",    CPENC(3,3,C14,C10,4) },
2945   { "pmevcntr21_el0",    CPENC(3,3,C14,C10,5) },
2946   { "pmevcntr22_el0",    CPENC(3,3,C14,C10,6) },
2947   { "pmevcntr23_el0",    CPENC(3,3,C14,C10,7) },
2948   { "pmevcntr24_el0",    CPENC(3,3,C14,C11,0) },
2949   { "pmevcntr25_el0",    CPENC(3,3,C14,C11,1) },
2950   { "pmevcntr26_el0",    CPENC(3,3,C14,C11,2) },
2951   { "pmevcntr27_el0",    CPENC(3,3,C14,C11,3) },
2952   { "pmevcntr28_el0",    CPENC(3,3,C14,C11,4) },
2953   { "pmevcntr29_el0",    CPENC(3,3,C14,C11,5) },
2954   { "pmevcntr30_el0",    CPENC(3,3,C14,C11,6) },
2955   { "pmevtyper0_el0",    CPENC(3,3,C14,C12,0) },
2956   { "pmevtyper1_el0",    CPENC(3,3,C14,C12,1) },
2957   { "pmevtyper2_el0",    CPENC(3,3,C14,C12,2) },
2958   { "pmevtyper3_el0",    CPENC(3,3,C14,C12,3) },
2959   { "pmevtyper4_el0",    CPENC(3,3,C14,C12,4) },
2960   { "pmevtyper5_el0",    CPENC(3,3,C14,C12,5) },
2961   { "pmevtyper6_el0",    CPENC(3,3,C14,C12,6) },
2962   { "pmevtyper7_el0",    CPENC(3,3,C14,C12,7) },
2963   { "pmevtyper8_el0",    CPENC(3,3,C14,C13,0) },
2964   { "pmevtyper9_el0",    CPENC(3,3,C14,C13,1) },
2965   { "pmevtyper10_el0",   CPENC(3,3,C14,C13,2) },
2966   { "pmevtyper11_el0",   CPENC(3,3,C14,C13,3) },
2967   { "pmevtyper12_el0",   CPENC(3,3,C14,C13,4) },
2968   { "pmevtyper13_el0",   CPENC(3,3,C14,C13,5) },
2969   { "pmevtyper14_el0",   CPENC(3,3,C14,C13,6) },
2970   { "pmevtyper15_el0",   CPENC(3,3,C14,C13,7) },
2971   { "pmevtyper16_el0",   CPENC(3,3,C14,C14,0) },
2972   { "pmevtyper17_el0",   CPENC(3,3,C14,C14,1) },
2973   { "pmevtyper18_el0",   CPENC(3,3,C14,C14,2) },
2974   { "pmevtyper19_el0",   CPENC(3,3,C14,C14,3) },
2975   { "pmevtyper20_el0",   CPENC(3,3,C14,C14,4) },
2976   { "pmevtyper21_el0",   CPENC(3,3,C14,C14,5) },
2977   { "pmevtyper22_el0",   CPENC(3,3,C14,C14,6) },
2978   { "pmevtyper23_el0",   CPENC(3,3,C14,C14,7) },
2979   { "pmevtyper24_el0",   CPENC(3,3,C14,C15,0) },
2980   { "pmevtyper25_el0",   CPENC(3,3,C14,C15,1) },
2981   { "pmevtyper26_el0",   CPENC(3,3,C14,C15,2) },
2982   { "pmevtyper27_el0",   CPENC(3,3,C14,C15,3) },
2983   { "pmevtyper28_el0",   CPENC(3,3,C14,C15,4) },
2984   { "pmevtyper29_el0",   CPENC(3,3,C14,C15,5) },
2985   { "pmevtyper30_el0",   CPENC(3,3,C14,C15,6) },
2986   { "pmccfiltr_el0",     CPENC(3,3,C14,C15,7) },
2987   { 0,          CPENC(0,0,0,0,0)  },
2988 };
2989 
2990 const struct aarch64_name_value_pair aarch64_pstatefields [] =
2991 {
2992   { "spsel",            0x05  },
2993   { "daifset",          0x1e  },
2994   { "daifclr",          0x1f  },
2995   { 0,          CPENC(0,0,0,0,0)  },
2996 };
2997 
2998 const aarch64_sys_ins_reg aarch64_sys_regs_ic[] =
2999 {
3000     { "ialluis", CPENS(0,C7,C1,0), 0 },
3001     { "iallu",   CPENS(0,C7,C5,0), 0 },
3002     { "ivau",    CPENS(3,C7,C5,1), 1 },
3003     { 0, CPENS(0,0,0,0), 0 }
3004 };
3005 
3006 const aarch64_sys_ins_reg aarch64_sys_regs_dc[] =
3007 {
3008     { "zva",        CPENS(3,C7,C4,1),  1 },
3009     { "ivac",       CPENS(0,C7,C6,1),  1 },
3010     { "isw",        CPENS(0,C7,C6,2),  1 },
3011     { "cvac",       CPENS(3,C7,C10,1), 1 },
3012     { "csw",        CPENS(0,C7,C10,2), 1 },
3013     { "cvau",       CPENS(3,C7,C11,1), 1 },
3014     { "civac",      CPENS(3,C7,C14,1), 1 },
3015     { "cisw",       CPENS(0,C7,C14,2), 1 },
3016     { 0,       CPENS(0,0,0,0), 0 }
3017 };
3018 
3019 const aarch64_sys_ins_reg aarch64_sys_regs_at[] =
3020 {
3021     { "s1e1r",      CPENS(0,C7,C8,0), 1 },
3022     { "s1e1w",      CPENS(0,C7,C8,1), 1 },
3023     { "s1e0r",      CPENS(0,C7,C8,2), 1 },
3024     { "s1e0w",      CPENS(0,C7,C8,3), 1 },
3025     { "s12e1r",     CPENS(4,C7,C8,4), 1 },
3026     { "s12e1w",     CPENS(4,C7,C8,5), 1 },
3027     { "s12e0r",     CPENS(4,C7,C8,6), 1 },
3028     { "s12e0w",     CPENS(4,C7,C8,7), 1 },
3029     { "s1e2r",      CPENS(4,C7,C8,0), 1 },
3030     { "s1e2w",      CPENS(4,C7,C8,1), 1 },
3031     { "s1e3r",      CPENS(6,C7,C8,0), 1 },
3032     { "s1e3w",      CPENS(6,C7,C8,1), 1 },
3033     { 0,       CPENS(0,0,0,0), 0 }
3034 };
3035 
3036 const aarch64_sys_ins_reg aarch64_sys_regs_tlbi[] =
3037 {
3038     { "vmalle1",   CPENS(0,C8,C7,0), 0 },
3039     { "vae1",      CPENS(0,C8,C7,1), 1 },
3040     { "aside1",    CPENS(0,C8,C7,2), 1 },
3041     { "vaae1",     CPENS(0,C8,C7,3), 1 },
3042     { "vmalle1is", CPENS(0,C8,C3,0), 0 },
3043     { "vae1is",    CPENS(0,C8,C3,1), 1 },
3044     { "aside1is",  CPENS(0,C8,C3,2), 1 },
3045     { "vaae1is",   CPENS(0,C8,C3,3), 1 },
3046     { "ipas2e1is", CPENS(4,C8,C0,1), 1 },
3047     { "ipas2le1is",CPENS(4,C8,C0,5), 1 },
3048     { "ipas2e1",   CPENS(4,C8,C4,1), 1 },
3049     { "ipas2le1",  CPENS(4,C8,C4,5), 1 },
3050     { "vae2",      CPENS(4,C8,C7,1), 1 },
3051     { "vae2is",    CPENS(4,C8,C3,1), 1 },
3052     { "vmalls12e1",CPENS(4,C8,C7,6), 0 },
3053     { "vmalls12e1is",CPENS(4,C8,C3,6), 0 },
3054     { "vae3",      CPENS(6,C8,C7,1), 1 },
3055     { "vae3is",    CPENS(6,C8,C3,1), 1 },
3056     { "alle2",     CPENS(4,C8,C7,0), 0 },
3057     { "alle2is",   CPENS(4,C8,C3,0), 0 },
3058     { "alle1",     CPENS(4,C8,C7,4), 0 },
3059     { "alle1is",   CPENS(4,C8,C3,4), 0 },
3060     { "alle3",     CPENS(6,C8,C7,0), 0 },
3061     { "alle3is",   CPENS(6,C8,C3,0), 0 },
3062     { "vale1is",   CPENS(0,C8,C3,5), 1 },
3063     { "vale2is",   CPENS(4,C8,C3,5), 1 },
3064     { "vale3is",   CPENS(6,C8,C3,5), 1 },
3065     { "vaale1is",  CPENS(0,C8,C3,7), 1 },
3066     { "vale1",     CPENS(0,C8,C7,5), 1 },
3067     { "vale2",     CPENS(4,C8,C7,5), 1 },
3068     { "vale3",     CPENS(6,C8,C7,5), 1 },
3069     { "vaale1",    CPENS(0,C8,C7,7), 1 },
3070     { 0,       CPENS(0,0,0,0), 0 }
3071 };
3072 
3073 #undef C0
3074 #undef C1
3075 #undef C2
3076 #undef C3
3077 #undef C4
3078 #undef C5
3079 #undef C6
3080 #undef C7
3081 #undef C8
3082 #undef C9
3083 #undef C10
3084 #undef C11
3085 #undef C12
3086 #undef C13
3087 #undef C14
3088 #undef C15
3089 
3090 /* Include the opcode description table as well as the operand description
3091    table.  */
3092 #include "aarch64-tbl.h"
3093