xref: /netbsd-src/external/gpl3/binutils.old/dist/opcodes/aarch64-dis.c (revision 9fd8799cb5ceb66c69f2eb1a6d26a1d587ba1f1e)
1 /* aarch64-dis.c -- AArch64 disassembler.
2    Copyright (C) 2009-2018 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 "bfd_stdint.h"
23 #include "disassemble.h"
24 #include "libiberty.h"
25 #include "opintl.h"
26 #include "aarch64-dis.h"
27 #include "elf-bfd.h"
28 
29 #define ERR_OK   0
30 #define ERR_UND -1
31 #define ERR_UNP -3
32 #define ERR_NYI -5
33 
34 #define INSNLEN 4
35 
36 /* Cached mapping symbol state.  */
37 enum map_type
38 {
39   MAP_INSN,
40   MAP_DATA
41 };
42 
43 static enum map_type last_type;
44 static int last_mapping_sym = -1;
45 static bfd_vma last_mapping_addr = 0;
46 
47 /* Other options */
48 static int no_aliases = 0;	/* If set disassemble as most general inst.  */
49 static int no_notes = 1;	/* If set do not print disassemble notes in the
50 				  output as comments.  */
51 
52 static void
53 set_default_aarch64_dis_options (struct disassemble_info *info ATTRIBUTE_UNUSED)
54 {
55 }
56 
57 static void
58 parse_aarch64_dis_option (const char *option, unsigned int len ATTRIBUTE_UNUSED)
59 {
60   /* Try to match options that are simple flags */
61   if (CONST_STRNEQ (option, "no-aliases"))
62     {
63       no_aliases = 1;
64       return;
65     }
66 
67   if (CONST_STRNEQ (option, "aliases"))
68     {
69       no_aliases = 0;
70       return;
71     }
72 
73   if (CONST_STRNEQ (option, "no-notes"))
74     {
75       no_notes = 1;
76       return;
77     }
78 
79   if (CONST_STRNEQ (option, "notes"))
80     {
81       no_notes = 0;
82       return;
83     }
84 
85 #ifdef DEBUG_AARCH64
86   if (CONST_STRNEQ (option, "debug_dump"))
87     {
88       debug_dump = 1;
89       return;
90     }
91 #endif /* DEBUG_AARCH64 */
92 
93   /* Invalid option.  */
94   opcodes_error_handler (_("unrecognised disassembler option: %s"), option);
95 }
96 
97 static void
98 parse_aarch64_dis_options (const char *options)
99 {
100   const char *option_end;
101 
102   if (options == NULL)
103     return;
104 
105   while (*options != '\0')
106     {
107       /* Skip empty options.  */
108       if (*options == ',')
109 	{
110 	  options++;
111 	  continue;
112 	}
113 
114       /* We know that *options is neither NUL or a comma.  */
115       option_end = options + 1;
116       while (*option_end != ',' && *option_end != '\0')
117 	option_end++;
118 
119       parse_aarch64_dis_option (options, option_end - options);
120 
121       /* Go on to the next one.  If option_end points to a comma, it
122 	 will be skipped above.  */
123       options = option_end;
124     }
125 }
126 
127 /* Functions doing the instruction disassembling.  */
128 
129 /* The unnamed arguments consist of the number of fields and information about
130    these fields where the VALUE will be extracted from CODE and returned.
131    MASK can be zero or the base mask of the opcode.
132 
133    N.B. the fields are required to be in such an order than the most signficant
134    field for VALUE comes the first, e.g. the <index> in
135     SQDMLAL <Va><d>, <Vb><n>, <Vm>.<Ts>[<index>]
136    is encoded in H:L:M in some cases, the fields H:L:M should be passed in
137    the order of H, L, M.  */
138 
139 aarch64_insn
140 extract_fields (aarch64_insn code, aarch64_insn mask, ...)
141 {
142   uint32_t num;
143   const aarch64_field *field;
144   enum aarch64_field_kind kind;
145   va_list va;
146 
147   va_start (va, mask);
148   num = va_arg (va, uint32_t);
149   assert (num <= 5);
150   aarch64_insn value = 0x0;
151   while (num--)
152     {
153       kind = va_arg (va, enum aarch64_field_kind);
154       field = &fields[kind];
155       value <<= field->width;
156       value |= extract_field (kind, code, mask);
157     }
158   return value;
159 }
160 
161 /* Extract the value of all fields in SELF->fields from instruction CODE.
162    The least significant bit comes from the final field.  */
163 
164 static aarch64_insn
165 extract_all_fields (const aarch64_operand *self, aarch64_insn code)
166 {
167   aarch64_insn value;
168   unsigned int i;
169   enum aarch64_field_kind kind;
170 
171   value = 0;
172   for (i = 0; i < ARRAY_SIZE (self->fields) && self->fields[i] != FLD_NIL; ++i)
173     {
174       kind = self->fields[i];
175       value <<= fields[kind].width;
176       value |= extract_field (kind, code, 0);
177     }
178   return value;
179 }
180 
181 /* Sign-extend bit I of VALUE.  */
182 static inline int32_t
183 sign_extend (aarch64_insn value, unsigned i)
184 {
185   uint32_t ret = value;
186 
187   assert (i < 32);
188   if ((value >> i) & 0x1)
189     {
190       uint32_t val = (uint32_t)(-1) << i;
191       ret = ret | val;
192     }
193   return (int32_t) ret;
194 }
195 
196 /* N.B. the following inline helpfer functions create a dependency on the
197    order of operand qualifier enumerators.  */
198 
199 /* Given VALUE, return qualifier for a general purpose register.  */
200 static inline enum aarch64_opnd_qualifier
201 get_greg_qualifier_from_value (aarch64_insn value)
202 {
203   enum aarch64_opnd_qualifier qualifier = AARCH64_OPND_QLF_W + value;
204   assert (value <= 0x1
205 	  && aarch64_get_qualifier_standard_value (qualifier) == value);
206   return qualifier;
207 }
208 
209 /* Given VALUE, return qualifier for a vector register.  This does not support
210    decoding instructions that accept the 2H vector type.  */
211 
212 static inline enum aarch64_opnd_qualifier
213 get_vreg_qualifier_from_value (aarch64_insn value)
214 {
215   enum aarch64_opnd_qualifier qualifier = AARCH64_OPND_QLF_V_8B + value;
216 
217   /* Instructions using vector type 2H should not call this function.  Skip over
218      the 2H qualifier.  */
219   if (qualifier >= AARCH64_OPND_QLF_V_2H)
220     qualifier += 1;
221 
222   assert (value <= 0x8
223 	  && aarch64_get_qualifier_standard_value (qualifier) == value);
224   return qualifier;
225 }
226 
227 /* Given VALUE, return qualifier for an FP or AdvSIMD scalar register.  */
228 static inline enum aarch64_opnd_qualifier
229 get_sreg_qualifier_from_value (aarch64_insn value)
230 {
231   enum aarch64_opnd_qualifier qualifier = AARCH64_OPND_QLF_S_B + value;
232 
233   assert (value <= 0x4
234 	  && aarch64_get_qualifier_standard_value (qualifier) == value);
235   return qualifier;
236 }
237 
238 /* Given the instruction in *INST which is probably half way through the
239    decoding and our caller wants to know the expected qualifier for operand
240    I.  Return such a qualifier if we can establish it; otherwise return
241    AARCH64_OPND_QLF_NIL.  */
242 
243 static aarch64_opnd_qualifier_t
244 get_expected_qualifier (const aarch64_inst *inst, int i)
245 {
246   aarch64_opnd_qualifier_seq_t qualifiers;
247   /* Should not be called if the qualifier is known.  */
248   assert (inst->operands[i].qualifier == AARCH64_OPND_QLF_NIL);
249   if (aarch64_find_best_match (inst, inst->opcode->qualifiers_list,
250 			       i, qualifiers))
251     return qualifiers[i];
252   else
253     return AARCH64_OPND_QLF_NIL;
254 }
255 
256 /* Operand extractors.  */
257 
258 bfd_boolean
259 aarch64_ext_regno (const aarch64_operand *self, aarch64_opnd_info *info,
260 		   const aarch64_insn code,
261 		   const aarch64_inst *inst ATTRIBUTE_UNUSED,
262 		   aarch64_operand_error *errors ATTRIBUTE_UNUSED)
263 {
264   info->reg.regno = extract_field (self->fields[0], code, 0);
265   return TRUE;
266 }
267 
268 bfd_boolean
269 aarch64_ext_regno_pair (const aarch64_operand *self ATTRIBUTE_UNUSED, aarch64_opnd_info *info,
270 		   const aarch64_insn code ATTRIBUTE_UNUSED,
271 		   const aarch64_inst *inst ATTRIBUTE_UNUSED,
272 		   aarch64_operand_error *errors ATTRIBUTE_UNUSED)
273 {
274   assert (info->idx == 1
275 	  || info->idx ==3);
276   info->reg.regno = inst->operands[info->idx - 1].reg.regno + 1;
277   return TRUE;
278 }
279 
280 /* e.g. IC <ic_op>{, <Xt>}.  */
281 bfd_boolean
282 aarch64_ext_regrt_sysins (const aarch64_operand *self, aarch64_opnd_info *info,
283 			  const aarch64_insn code,
284 			  const aarch64_inst *inst ATTRIBUTE_UNUSED,
285 			  aarch64_operand_error *errors ATTRIBUTE_UNUSED)
286 {
287   info->reg.regno = extract_field (self->fields[0], code, 0);
288   assert (info->idx == 1
289 	  && (aarch64_get_operand_class (inst->operands[0].type)
290 	      == AARCH64_OPND_CLASS_SYSTEM));
291   /* This will make the constraint checking happy and more importantly will
292      help the disassembler determine whether this operand is optional or
293      not.  */
294   info->present = aarch64_sys_ins_reg_has_xt (inst->operands[0].sysins_op);
295 
296   return TRUE;
297 }
298 
299 /* e.g. SQDMLAL <Va><d>, <Vb><n>, <Vm>.<Ts>[<index>].  */
300 bfd_boolean
301 aarch64_ext_reglane (const aarch64_operand *self, aarch64_opnd_info *info,
302 		     const aarch64_insn code,
303 		     const aarch64_inst *inst ATTRIBUTE_UNUSED,
304 		     aarch64_operand_error *errors ATTRIBUTE_UNUSED)
305 {
306   /* regno */
307   info->reglane.regno = extract_field (self->fields[0], code,
308 				       inst->opcode->mask);
309 
310   /* Index and/or type.  */
311   if (inst->opcode->iclass == asisdone
312     || inst->opcode->iclass == asimdins)
313     {
314       if (info->type == AARCH64_OPND_En
315 	  && inst->opcode->operands[0] == AARCH64_OPND_Ed)
316 	{
317 	  unsigned shift;
318 	  /* index2 for e.g. INS <Vd>.<Ts>[<index1>], <Vn>.<Ts>[<index2>].  */
319 	  assert (info->idx == 1);	/* Vn */
320 	  aarch64_insn value = extract_field (FLD_imm4, code, 0);
321 	  /* Depend on AARCH64_OPND_Ed to determine the qualifier.  */
322 	  info->qualifier = get_expected_qualifier (inst, info->idx);
323 	  shift = get_logsz (aarch64_get_qualifier_esize (info->qualifier));
324 	  info->reglane.index = value >> shift;
325 	}
326       else
327 	{
328 	  /* index and type for e.g. DUP <V><d>, <Vn>.<T>[<index>].
329 	     imm5<3:0>	<V>
330 	     0000	RESERVED
331 	     xxx1	B
332 	     xx10	H
333 	     x100	S
334 	     1000	D  */
335 	  int pos = -1;
336 	  aarch64_insn value = extract_field (FLD_imm5, code, 0);
337 	  while (++pos <= 3 && (value & 0x1) == 0)
338 	    value >>= 1;
339 	  if (pos > 3)
340 	    return FALSE;
341 	  info->qualifier = get_sreg_qualifier_from_value (pos);
342 	  info->reglane.index = (unsigned) (value >> 1);
343 	}
344     }
345   else if (inst->opcode->iclass == dotproduct)
346     {
347       /* Need information in other operand(s) to help decoding.  */
348       info->qualifier = get_expected_qualifier (inst, info->idx);
349       switch (info->qualifier)
350 	{
351 	case AARCH64_OPND_QLF_S_4B:
352 	  /* L:H */
353 	  info->reglane.index = extract_fields (code, 0, 2, FLD_H, FLD_L);
354 	  info->reglane.regno &= 0x1f;
355 	  break;
356 	default:
357 	  return FALSE;
358 	}
359     }
360   else if (inst->opcode->iclass == cryptosm3)
361     {
362       /* index for e.g. SM3TT2A <Vd>.4S, <Vn>.4S, <Vm>S[<imm2>].  */
363       info->reglane.index = extract_field (FLD_SM3_imm2, code, 0);
364     }
365   else
366     {
367       /* Index only for e.g. SQDMLAL <Va><d>, <Vb><n>, <Vm>.<Ts>[<index>]
368          or SQDMLAL <Va><d>, <Vb><n>, <Vm>.<Ts>[<index>].  */
369 
370       /* Need information in other operand(s) to help decoding.  */
371       info->qualifier = get_expected_qualifier (inst, info->idx);
372       switch (info->qualifier)
373 	{
374 	case AARCH64_OPND_QLF_S_H:
375 	  if (info->type == AARCH64_OPND_Em16)
376 	    {
377 	      /* h:l:m */
378 	      info->reglane.index = extract_fields (code, 0, 3, FLD_H, FLD_L,
379 						    FLD_M);
380 	      info->reglane.regno &= 0xf;
381 	    }
382 	  else
383 	    {
384 	      /* h:l */
385 	      info->reglane.index = extract_fields (code, 0, 2, FLD_H, FLD_L);
386 	    }
387 	  break;
388 	case AARCH64_OPND_QLF_S_S:
389 	  /* h:l */
390 	  info->reglane.index = extract_fields (code, 0, 2, FLD_H, FLD_L);
391 	  break;
392 	case AARCH64_OPND_QLF_S_D:
393 	  /* H */
394 	  info->reglane.index = extract_field (FLD_H, code, 0);
395 	  break;
396 	default:
397 	  return FALSE;
398 	}
399 
400       if (inst->opcode->op == OP_FCMLA_ELEM
401 	  && info->qualifier != AARCH64_OPND_QLF_S_H)
402 	{
403 	  /* Complex operand takes two elements.  */
404 	  if (info->reglane.index & 1)
405 	    return FALSE;
406 	  info->reglane.index /= 2;
407 	}
408     }
409 
410   return TRUE;
411 }
412 
413 bfd_boolean
414 aarch64_ext_reglist (const aarch64_operand *self, aarch64_opnd_info *info,
415 		     const aarch64_insn code,
416 		     const aarch64_inst *inst ATTRIBUTE_UNUSED,
417 		     aarch64_operand_error *errors ATTRIBUTE_UNUSED)
418 {
419   /* R */
420   info->reglist.first_regno = extract_field (self->fields[0], code, 0);
421   /* len */
422   info->reglist.num_regs = extract_field (FLD_len, code, 0) + 1;
423   return TRUE;
424 }
425 
426 /* Decode Rt and opcode fields of Vt in AdvSIMD load/store instructions.  */
427 bfd_boolean
428 aarch64_ext_ldst_reglist (const aarch64_operand *self ATTRIBUTE_UNUSED,
429 			  aarch64_opnd_info *info, const aarch64_insn code,
430 			  const aarch64_inst *inst,
431 			  aarch64_operand_error *errors ATTRIBUTE_UNUSED)
432 {
433   aarch64_insn value;
434   /* Number of elements in each structure to be loaded/stored.  */
435   unsigned expected_num = get_opcode_dependent_value (inst->opcode);
436 
437   struct
438     {
439       unsigned is_reserved;
440       unsigned num_regs;
441       unsigned num_elements;
442     } data [] =
443   {   {0, 4, 4},
444       {1, 4, 4},
445       {0, 4, 1},
446       {0, 4, 2},
447       {0, 3, 3},
448       {1, 3, 3},
449       {0, 3, 1},
450       {0, 1, 1},
451       {0, 2, 2},
452       {1, 2, 2},
453       {0, 2, 1},
454   };
455 
456   /* Rt */
457   info->reglist.first_regno = extract_field (FLD_Rt, code, 0);
458   /* opcode */
459   value = extract_field (FLD_opcode, code, 0);
460   /* PR 21595: Check for a bogus value.  */
461   if (value >= ARRAY_SIZE (data))
462     return FALSE;
463   if (expected_num != data[value].num_elements || data[value].is_reserved)
464     return FALSE;
465   info->reglist.num_regs = data[value].num_regs;
466 
467   return TRUE;
468 }
469 
470 /* Decode Rt and S fields of Vt in AdvSIMD load single structure to all
471    lanes instructions.  */
472 bfd_boolean
473 aarch64_ext_ldst_reglist_r (const aarch64_operand *self ATTRIBUTE_UNUSED,
474 			    aarch64_opnd_info *info, const aarch64_insn code,
475 			    const aarch64_inst *inst,
476 			    aarch64_operand_error *errors ATTRIBUTE_UNUSED)
477 {
478   aarch64_insn value;
479 
480   /* Rt */
481   info->reglist.first_regno = extract_field (FLD_Rt, code, 0);
482   /* S */
483   value = extract_field (FLD_S, code, 0);
484 
485   /* Number of registers is equal to the number of elements in
486      each structure to be loaded/stored.  */
487   info->reglist.num_regs = get_opcode_dependent_value (inst->opcode);
488   assert (info->reglist.num_regs >= 1 && info->reglist.num_regs <= 4);
489 
490   /* Except when it is LD1R.  */
491   if (info->reglist.num_regs == 1 && value == (aarch64_insn) 1)
492     info->reglist.num_regs = 2;
493 
494   return TRUE;
495 }
496 
497 /* Decode Q, opcode<2:1>, S, size and Rt fields of Vt in AdvSIMD
498    load/store single element instructions.  */
499 bfd_boolean
500 aarch64_ext_ldst_elemlist (const aarch64_operand *self ATTRIBUTE_UNUSED,
501 			   aarch64_opnd_info *info, const aarch64_insn code,
502 			   const aarch64_inst *inst ATTRIBUTE_UNUSED,
503 			   aarch64_operand_error *errors ATTRIBUTE_UNUSED)
504 {
505   aarch64_field field = {0, 0};
506   aarch64_insn QSsize;		/* fields Q:S:size.  */
507   aarch64_insn opcodeh2;	/* opcode<2:1> */
508 
509   /* Rt */
510   info->reglist.first_regno = extract_field (FLD_Rt, code, 0);
511 
512   /* Decode the index, opcode<2:1> and size.  */
513   gen_sub_field (FLD_asisdlso_opcode, 1, 2, &field);
514   opcodeh2 = extract_field_2 (&field, code, 0);
515   QSsize = extract_fields (code, 0, 3, FLD_Q, FLD_S, FLD_vldst_size);
516   switch (opcodeh2)
517     {
518     case 0x0:
519       info->qualifier = AARCH64_OPND_QLF_S_B;
520       /* Index encoded in "Q:S:size".  */
521       info->reglist.index = QSsize;
522       break;
523     case 0x1:
524       if (QSsize & 0x1)
525 	/* UND.  */
526 	return FALSE;
527       info->qualifier = AARCH64_OPND_QLF_S_H;
528       /* Index encoded in "Q:S:size<1>".  */
529       info->reglist.index = QSsize >> 1;
530       break;
531     case 0x2:
532       if ((QSsize >> 1) & 0x1)
533 	/* UND.  */
534 	return FALSE;
535       if ((QSsize & 0x1) == 0)
536 	{
537 	  info->qualifier = AARCH64_OPND_QLF_S_S;
538 	  /* Index encoded in "Q:S".  */
539 	  info->reglist.index = QSsize >> 2;
540 	}
541       else
542 	{
543 	  if (extract_field (FLD_S, code, 0))
544 	    /* UND */
545 	    return FALSE;
546 	  info->qualifier = AARCH64_OPND_QLF_S_D;
547 	  /* Index encoded in "Q".  */
548 	  info->reglist.index = QSsize >> 3;
549 	}
550       break;
551     default:
552       return FALSE;
553     }
554 
555   info->reglist.has_index = 1;
556   info->reglist.num_regs = 0;
557   /* Number of registers is equal to the number of elements in
558      each structure to be loaded/stored.  */
559   info->reglist.num_regs = get_opcode_dependent_value (inst->opcode);
560   assert (info->reglist.num_regs >= 1 && info->reglist.num_regs <= 4);
561 
562   return TRUE;
563 }
564 
565 /* Decode fields immh:immb and/or Q for e.g.
566    SSHR <Vd>.<T>, <Vn>.<T>, #<shift>
567    or SSHR <V><d>, <V><n>, #<shift>.  */
568 
569 bfd_boolean
570 aarch64_ext_advsimd_imm_shift (const aarch64_operand *self ATTRIBUTE_UNUSED,
571 			       aarch64_opnd_info *info, const aarch64_insn code,
572 			       const aarch64_inst *inst,
573 			       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
574 {
575   int pos;
576   aarch64_insn Q, imm, immh;
577   enum aarch64_insn_class iclass = inst->opcode->iclass;
578 
579   immh = extract_field (FLD_immh, code, 0);
580   if (immh == 0)
581     return FALSE;
582   imm = extract_fields (code, 0, 2, FLD_immh, FLD_immb);
583   pos = 4;
584   /* Get highest set bit in immh.  */
585   while (--pos >= 0 && (immh & 0x8) == 0)
586     immh <<= 1;
587 
588   assert ((iclass == asimdshf || iclass == asisdshf)
589 	  && (info->type == AARCH64_OPND_IMM_VLSR
590 	      || info->type == AARCH64_OPND_IMM_VLSL));
591 
592   if (iclass == asimdshf)
593     {
594       Q = extract_field (FLD_Q, code, 0);
595       /* immh	Q	<T>
596 	 0000	x	SEE AdvSIMD modified immediate
597 	 0001	0	8B
598 	 0001	1	16B
599 	 001x	0	4H
600 	 001x	1	8H
601 	 01xx	0	2S
602 	 01xx	1	4S
603 	 1xxx	0	RESERVED
604 	 1xxx	1	2D  */
605       info->qualifier =
606 	get_vreg_qualifier_from_value ((pos << 1) | (int) Q);
607     }
608   else
609     info->qualifier = get_sreg_qualifier_from_value (pos);
610 
611   if (info->type == AARCH64_OPND_IMM_VLSR)
612     /* immh	<shift>
613        0000	SEE AdvSIMD modified immediate
614        0001	(16-UInt(immh:immb))
615        001x	(32-UInt(immh:immb))
616        01xx	(64-UInt(immh:immb))
617        1xxx	(128-UInt(immh:immb))  */
618     info->imm.value = (16 << pos) - imm;
619   else
620     /* immh:immb
621        immh	<shift>
622        0000	SEE AdvSIMD modified immediate
623        0001	(UInt(immh:immb)-8)
624        001x	(UInt(immh:immb)-16)
625        01xx	(UInt(immh:immb)-32)
626        1xxx	(UInt(immh:immb)-64)  */
627     info->imm.value = imm - (8 << pos);
628 
629   return TRUE;
630 }
631 
632 /* Decode shift immediate for e.g. sshr (imm).  */
633 bfd_boolean
634 aarch64_ext_shll_imm (const aarch64_operand *self ATTRIBUTE_UNUSED,
635 		      aarch64_opnd_info *info, const aarch64_insn code,
636 		      const aarch64_inst *inst ATTRIBUTE_UNUSED,
637 		      aarch64_operand_error *errors ATTRIBUTE_UNUSED)
638 {
639   int64_t imm;
640   aarch64_insn val;
641   val = extract_field (FLD_size, code, 0);
642   switch (val)
643     {
644     case 0: imm = 8; break;
645     case 1: imm = 16; break;
646     case 2: imm = 32; break;
647     default: return FALSE;
648     }
649   info->imm.value = imm;
650   return TRUE;
651 }
652 
653 /* Decode imm for e.g. BFM <Wd>, <Wn>, #<immr>, #<imms>.
654    value in the field(s) will be extracted as unsigned immediate value.  */
655 bfd_boolean
656 aarch64_ext_imm (const aarch64_operand *self, aarch64_opnd_info *info,
657 		 const aarch64_insn code,
658 		 const aarch64_inst *inst ATTRIBUTE_UNUSED,
659 		 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
660 {
661   int64_t imm;
662 
663   imm = extract_all_fields (self, code);
664 
665   if (operand_need_sign_extension (self))
666     imm = sign_extend (imm, get_operand_fields_width (self) - 1);
667 
668   if (operand_need_shift_by_two (self))
669     imm <<= 2;
670 
671   if (info->type == AARCH64_OPND_ADDR_ADRP)
672     imm <<= 12;
673 
674   info->imm.value = imm;
675   return TRUE;
676 }
677 
678 /* Decode imm and its shifter for e.g. MOVZ <Wd>, #<imm16>{, LSL #<shift>}.  */
679 bfd_boolean
680 aarch64_ext_imm_half (const aarch64_operand *self, aarch64_opnd_info *info,
681 		      const aarch64_insn code,
682 		      const aarch64_inst *inst ATTRIBUTE_UNUSED,
683 		      aarch64_operand_error *errors)
684 {
685   aarch64_ext_imm (self, info, code, inst, errors);
686   info->shifter.kind = AARCH64_MOD_LSL;
687   info->shifter.amount = extract_field (FLD_hw, code, 0) << 4;
688   return TRUE;
689 }
690 
691 /* Decode cmode and "a:b:c:d:e:f:g:h" for e.g.
692      MOVI <Vd>.<T>, #<imm8> {, LSL #<amount>}.  */
693 bfd_boolean
694 aarch64_ext_advsimd_imm_modified (const aarch64_operand *self ATTRIBUTE_UNUSED,
695 				  aarch64_opnd_info *info,
696 				  const aarch64_insn code,
697 				  const aarch64_inst *inst ATTRIBUTE_UNUSED,
698 				  aarch64_operand_error *errors ATTRIBUTE_UNUSED)
699 {
700   uint64_t imm;
701   enum aarch64_opnd_qualifier opnd0_qualifier = inst->operands[0].qualifier;
702   aarch64_field field = {0, 0};
703 
704   assert (info->idx == 1);
705 
706   if (info->type == AARCH64_OPND_SIMD_FPIMM)
707     info->imm.is_fp = 1;
708 
709   /* a:b:c:d:e:f:g:h */
710   imm = extract_fields (code, 0, 2, FLD_abc, FLD_defgh);
711   if (!info->imm.is_fp && aarch64_get_qualifier_esize (opnd0_qualifier) == 8)
712     {
713       /* Either MOVI <Dd>, #<imm>
714 	 or     MOVI <Vd>.2D, #<imm>.
715 	 <imm> is a 64-bit immediate
716 	 'aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffffgggggggghhhhhhhh',
717 	 encoded in "a:b:c:d:e:f:g:h".	*/
718       int i;
719       unsigned abcdefgh = imm;
720       for (imm = 0ull, i = 0; i < 8; i++)
721 	if (((abcdefgh >> i) & 0x1) != 0)
722 	  imm |= 0xffull << (8 * i);
723     }
724   info->imm.value = imm;
725 
726   /* cmode */
727   info->qualifier = get_expected_qualifier (inst, info->idx);
728   switch (info->qualifier)
729     {
730     case AARCH64_OPND_QLF_NIL:
731       /* no shift */
732       info->shifter.kind = AARCH64_MOD_NONE;
733       return 1;
734     case AARCH64_OPND_QLF_LSL:
735       /* shift zeros */
736       info->shifter.kind = AARCH64_MOD_LSL;
737       switch (aarch64_get_qualifier_esize (opnd0_qualifier))
738 	{
739 	case 4: gen_sub_field (FLD_cmode, 1, 2, &field); break;	/* per word */
740 	case 2: gen_sub_field (FLD_cmode, 1, 1, &field); break;	/* per half */
741 	case 1: gen_sub_field (FLD_cmode, 1, 0, &field); break;	/* per byte */
742 	default: assert (0); return FALSE;
743 	}
744       /* 00: 0; 01: 8; 10:16; 11:24.  */
745       info->shifter.amount = extract_field_2 (&field, code, 0) << 3;
746       break;
747     case AARCH64_OPND_QLF_MSL:
748       /* shift ones */
749       info->shifter.kind = AARCH64_MOD_MSL;
750       gen_sub_field (FLD_cmode, 0, 1, &field);		/* per word */
751       info->shifter.amount = extract_field_2 (&field, code, 0) ? 16 : 8;
752       break;
753     default:
754       assert (0);
755       return FALSE;
756     }
757 
758   return TRUE;
759 }
760 
761 /* Decode an 8-bit floating-point immediate.  */
762 bfd_boolean
763 aarch64_ext_fpimm (const aarch64_operand *self, aarch64_opnd_info *info,
764 		   const aarch64_insn code,
765 		   const aarch64_inst *inst ATTRIBUTE_UNUSED,
766 		   aarch64_operand_error *errors ATTRIBUTE_UNUSED)
767 {
768   info->imm.value = extract_all_fields (self, code);
769   info->imm.is_fp = 1;
770   return TRUE;
771 }
772 
773 /* Decode a 1-bit rotate immediate (#90 or #270).  */
774 bfd_boolean
775 aarch64_ext_imm_rotate1 (const aarch64_operand *self, aarch64_opnd_info *info,
776 			 const aarch64_insn code,
777 			 const aarch64_inst *inst ATTRIBUTE_UNUSED,
778 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
779 {
780   uint64_t rot = extract_field (self->fields[0], code, 0);
781   assert (rot < 2U);
782   info->imm.value = rot * 180 + 90;
783   return TRUE;
784 }
785 
786 /* Decode a 2-bit rotate immediate (#0, #90, #180 or #270).  */
787 bfd_boolean
788 aarch64_ext_imm_rotate2 (const aarch64_operand *self, aarch64_opnd_info *info,
789 			 const aarch64_insn code,
790 			 const aarch64_inst *inst ATTRIBUTE_UNUSED,
791 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
792 {
793   uint64_t rot = extract_field (self->fields[0], code, 0);
794   assert (rot < 4U);
795   info->imm.value = rot * 90;
796   return TRUE;
797 }
798 
799 /* Decode scale for e.g. SCVTF <Dd>, <Wn>, #<fbits>.  */
800 bfd_boolean
801 aarch64_ext_fbits (const aarch64_operand *self ATTRIBUTE_UNUSED,
802 		   aarch64_opnd_info *info, const aarch64_insn code,
803 		   const aarch64_inst *inst ATTRIBUTE_UNUSED,
804 		   aarch64_operand_error *errors ATTRIBUTE_UNUSED)
805 {
806   info->imm.value = 64- extract_field (FLD_scale, code, 0);
807   return TRUE;
808 }
809 
810 /* Decode arithmetic immediate for e.g.
811      SUBS <Wd>, <Wn|WSP>, #<imm> {, <shift>}.  */
812 bfd_boolean
813 aarch64_ext_aimm (const aarch64_operand *self ATTRIBUTE_UNUSED,
814 		  aarch64_opnd_info *info, const aarch64_insn code,
815 		  const aarch64_inst *inst ATTRIBUTE_UNUSED,
816 		  aarch64_operand_error *errors ATTRIBUTE_UNUSED)
817 {
818   aarch64_insn value;
819 
820   info->shifter.kind = AARCH64_MOD_LSL;
821   /* shift */
822   value = extract_field (FLD_shift, code, 0);
823   if (value >= 2)
824     return FALSE;
825   info->shifter.amount = value ? 12 : 0;
826   /* imm12 (unsigned) */
827   info->imm.value = extract_field (FLD_imm12, code, 0);
828 
829   return TRUE;
830 }
831 
832 /* Return true if VALUE is a valid logical immediate encoding, storing the
833    decoded value in *RESULT if so.  ESIZE is the number of bytes in the
834    decoded immediate.  */
835 static bfd_boolean
836 decode_limm (uint32_t esize, aarch64_insn value, int64_t *result)
837 {
838   uint64_t imm, mask;
839   uint32_t N, R, S;
840   unsigned simd_size;
841 
842   /* value is N:immr:imms.  */
843   S = value & 0x3f;
844   R = (value >> 6) & 0x3f;
845   N = (value >> 12) & 0x1;
846 
847   /* The immediate value is S+1 bits to 1, left rotated by SIMDsize - R
848      (in other words, right rotated by R), then replicated.  */
849   if (N != 0)
850     {
851       simd_size = 64;
852       mask = 0xffffffffffffffffull;
853     }
854   else
855     {
856       switch (S)
857 	{
858 	case 0x00 ... 0x1f: /* 0xxxxx */ simd_size = 32;           break;
859 	case 0x20 ... 0x2f: /* 10xxxx */ simd_size = 16; S &= 0xf; break;
860 	case 0x30 ... 0x37: /* 110xxx */ simd_size =  8; S &= 0x7; break;
861 	case 0x38 ... 0x3b: /* 1110xx */ simd_size =  4; S &= 0x3; break;
862 	case 0x3c ... 0x3d: /* 11110x */ simd_size =  2; S &= 0x1; break;
863 	default: return FALSE;
864 	}
865       mask = (1ull << simd_size) - 1;
866       /* Top bits are IGNORED.  */
867       R &= simd_size - 1;
868     }
869 
870   if (simd_size > esize * 8)
871     return FALSE;
872 
873   /* NOTE: if S = simd_size - 1 we get 0xf..f which is rejected.  */
874   if (S == simd_size - 1)
875     return FALSE;
876   /* S+1 consecutive bits to 1.  */
877   /* NOTE: S can't be 63 due to detection above.  */
878   imm = (1ull << (S + 1)) - 1;
879   /* Rotate to the left by simd_size - R.  */
880   if (R != 0)
881     imm = ((imm << (simd_size - R)) & mask) | (imm >> R);
882   /* Replicate the value according to SIMD size.  */
883   switch (simd_size)
884     {
885     case  2: imm = (imm <<  2) | imm;
886       /* Fall through.  */
887     case  4: imm = (imm <<  4) | imm;
888       /* Fall through.  */
889     case  8: imm = (imm <<  8) | imm;
890       /* Fall through.  */
891     case 16: imm = (imm << 16) | imm;
892       /* Fall through.  */
893     case 32: imm = (imm << 32) | imm;
894       /* Fall through.  */
895     case 64: break;
896     default: assert (0); return 0;
897     }
898 
899   *result = imm & ~((uint64_t) -1 << (esize * 4) << (esize * 4));
900 
901   return TRUE;
902 }
903 
904 /* Decode a logical immediate for e.g. ORR <Wd|WSP>, <Wn>, #<imm>.  */
905 bfd_boolean
906 aarch64_ext_limm (const aarch64_operand *self,
907 		  aarch64_opnd_info *info, const aarch64_insn code,
908 		  const aarch64_inst *inst,
909 		  aarch64_operand_error *errors ATTRIBUTE_UNUSED)
910 {
911   uint32_t esize;
912   aarch64_insn value;
913 
914   value = extract_fields (code, 0, 3, self->fields[0], self->fields[1],
915 			  self->fields[2]);
916   esize = aarch64_get_qualifier_esize (inst->operands[0].qualifier);
917   return decode_limm (esize, value, &info->imm.value);
918 }
919 
920 /* Decode a logical immediate for the BIC alias of AND (etc.).  */
921 bfd_boolean
922 aarch64_ext_inv_limm (const aarch64_operand *self,
923 		      aarch64_opnd_info *info, const aarch64_insn code,
924 		      const aarch64_inst *inst,
925 		      aarch64_operand_error *errors)
926 {
927   if (!aarch64_ext_limm (self, info, code, inst, errors))
928     return FALSE;
929   info->imm.value = ~info->imm.value;
930   return TRUE;
931 }
932 
933 /* Decode Ft for e.g. STR <Qt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}]
934    or LDP <Qt1>, <Qt2>, [<Xn|SP>], #<imm>.  */
935 bfd_boolean
936 aarch64_ext_ft (const aarch64_operand *self ATTRIBUTE_UNUSED,
937 		aarch64_opnd_info *info,
938 		const aarch64_insn code, const aarch64_inst *inst,
939 		aarch64_operand_error *errors ATTRIBUTE_UNUSED)
940 {
941   aarch64_insn value;
942 
943   /* Rt */
944   info->reg.regno = extract_field (FLD_Rt, code, 0);
945 
946   /* size */
947   value = extract_field (FLD_ldst_size, code, 0);
948   if (inst->opcode->iclass == ldstpair_indexed
949       || inst->opcode->iclass == ldstnapair_offs
950       || inst->opcode->iclass == ldstpair_off
951       || inst->opcode->iclass == loadlit)
952     {
953       enum aarch64_opnd_qualifier qualifier;
954       switch (value)
955 	{
956 	case 0: qualifier = AARCH64_OPND_QLF_S_S; break;
957 	case 1: qualifier = AARCH64_OPND_QLF_S_D; break;
958 	case 2: qualifier = AARCH64_OPND_QLF_S_Q; break;
959 	default: return FALSE;
960 	}
961       info->qualifier = qualifier;
962     }
963   else
964     {
965       /* opc1:size */
966       value = extract_fields (code, 0, 2, FLD_opc1, FLD_ldst_size);
967       if (value > 0x4)
968 	return FALSE;
969       info->qualifier = get_sreg_qualifier_from_value (value);
970     }
971 
972   return TRUE;
973 }
974 
975 /* Decode the address operand for e.g. STXRB <Ws>, <Wt>, [<Xn|SP>{,#0}].  */
976 bfd_boolean
977 aarch64_ext_addr_simple (const aarch64_operand *self ATTRIBUTE_UNUSED,
978 			 aarch64_opnd_info *info,
979 			 aarch64_insn code,
980 			 const aarch64_inst *inst ATTRIBUTE_UNUSED,
981 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
982 {
983   /* Rn */
984   info->addr.base_regno = extract_field (FLD_Rn, code, 0);
985   return TRUE;
986 }
987 
988 /* Decode the address operand for e.g.
989      stlur <Xt>, [<Xn|SP>{, <amount>}].  */
990 bfd_boolean
991 aarch64_ext_addr_offset (const aarch64_operand *self ATTRIBUTE_UNUSED,
992 			 aarch64_opnd_info *info,
993 			 aarch64_insn code, const aarch64_inst *inst,
994 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
995 {
996   info->qualifier = get_expected_qualifier (inst, info->idx);
997 
998   /* Rn */
999   info->addr.base_regno = extract_field (self->fields[0], code, 0);
1000 
1001   /* simm9 */
1002   aarch64_insn imm = extract_fields (code, 0, 1, self->fields[1]);
1003   info->addr.offset.imm = sign_extend (imm, 8);
1004   if (extract_field (self->fields[2], code, 0) == 1) {
1005     info->addr.writeback = 1;
1006     info->addr.preind = 1;
1007   }
1008   return TRUE;
1009 }
1010 
1011 /* Decode the address operand for e.g.
1012      STR <Qt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}].  */
1013 bfd_boolean
1014 aarch64_ext_addr_regoff (const aarch64_operand *self ATTRIBUTE_UNUSED,
1015 			 aarch64_opnd_info *info,
1016 			 aarch64_insn code, const aarch64_inst *inst,
1017 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1018 {
1019   aarch64_insn S, value;
1020 
1021   /* Rn */
1022   info->addr.base_regno = extract_field (FLD_Rn, code, 0);
1023   /* Rm */
1024   info->addr.offset.regno = extract_field (FLD_Rm, code, 0);
1025   /* option */
1026   value = extract_field (FLD_option, code, 0);
1027   info->shifter.kind =
1028     aarch64_get_operand_modifier_from_value (value, TRUE /* extend_p */);
1029   /* Fix-up the shifter kind; although the table-driven approach is
1030      efficient, it is slightly inflexible, thus needing this fix-up.  */
1031   if (info->shifter.kind == AARCH64_MOD_UXTX)
1032     info->shifter.kind = AARCH64_MOD_LSL;
1033   /* S */
1034   S = extract_field (FLD_S, code, 0);
1035   if (S == 0)
1036     {
1037       info->shifter.amount = 0;
1038       info->shifter.amount_present = 0;
1039     }
1040   else
1041     {
1042       int size;
1043       /* Need information in other operand(s) to help achieve the decoding
1044 	 from 'S' field.  */
1045       info->qualifier = get_expected_qualifier (inst, info->idx);
1046       /* Get the size of the data element that is accessed, which may be
1047 	 different from that of the source register size, e.g. in strb/ldrb.  */
1048       size = aarch64_get_qualifier_esize (info->qualifier);
1049       info->shifter.amount = get_logsz (size);
1050       info->shifter.amount_present = 1;
1051     }
1052 
1053   return TRUE;
1054 }
1055 
1056 /* Decode the address operand for e.g. LDRSW <Xt>, [<Xn|SP>], #<simm>.  */
1057 bfd_boolean
1058 aarch64_ext_addr_simm (const aarch64_operand *self, aarch64_opnd_info *info,
1059 		       aarch64_insn code, const aarch64_inst *inst,
1060 		       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1061 {
1062   aarch64_insn imm;
1063   info->qualifier = get_expected_qualifier (inst, info->idx);
1064 
1065   /* Rn */
1066   info->addr.base_regno = extract_field (FLD_Rn, code, 0);
1067   /* simm (imm9 or imm7)  */
1068   imm = extract_field (self->fields[0], code, 0);
1069   info->addr.offset.imm = sign_extend (imm, fields[self->fields[0]].width - 1);
1070   if (self->fields[0] == FLD_imm7)
1071     /* scaled immediate in ld/st pair instructions.  */
1072     info->addr.offset.imm *= aarch64_get_qualifier_esize (info->qualifier);
1073   /* qualifier */
1074   if (inst->opcode->iclass == ldst_unscaled
1075       || inst->opcode->iclass == ldstnapair_offs
1076       || inst->opcode->iclass == ldstpair_off
1077       || inst->opcode->iclass == ldst_unpriv)
1078     info->addr.writeback = 0;
1079   else
1080     {
1081       /* pre/post- index */
1082       info->addr.writeback = 1;
1083       if (extract_field (self->fields[1], code, 0) == 1)
1084 	info->addr.preind = 1;
1085       else
1086 	info->addr.postind = 1;
1087     }
1088 
1089   return TRUE;
1090 }
1091 
1092 /* Decode the address operand for e.g. LDRSW <Xt>, [<Xn|SP>{, #<simm>}].  */
1093 bfd_boolean
1094 aarch64_ext_addr_uimm12 (const aarch64_operand *self, aarch64_opnd_info *info,
1095 			 aarch64_insn code,
1096 			 const aarch64_inst *inst ATTRIBUTE_UNUSED,
1097 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1098 {
1099   int shift;
1100   info->qualifier = get_expected_qualifier (inst, info->idx);
1101   shift = get_logsz (aarch64_get_qualifier_esize (info->qualifier));
1102   /* Rn */
1103   info->addr.base_regno = extract_field (self->fields[0], code, 0);
1104   /* uimm12 */
1105   info->addr.offset.imm = extract_field (self->fields[1], code, 0) << shift;
1106   return TRUE;
1107 }
1108 
1109 /* Decode the address operand for e.g. LDRAA <Xt>, [<Xn|SP>{, #<simm>}].  */
1110 bfd_boolean
1111 aarch64_ext_addr_simm10 (const aarch64_operand *self, aarch64_opnd_info *info,
1112 			 aarch64_insn code,
1113 			 const aarch64_inst *inst ATTRIBUTE_UNUSED,
1114 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1115 {
1116   aarch64_insn imm;
1117 
1118   info->qualifier = get_expected_qualifier (inst, info->idx);
1119   /* Rn */
1120   info->addr.base_regno = extract_field (self->fields[0], code, 0);
1121   /* simm10 */
1122   imm = extract_fields (code, 0, 2, self->fields[1], self->fields[2]);
1123   info->addr.offset.imm = sign_extend (imm, 9) << 3;
1124   if (extract_field (self->fields[3], code, 0) == 1) {
1125     info->addr.writeback = 1;
1126     info->addr.preind = 1;
1127   }
1128   return TRUE;
1129 }
1130 
1131 /* Decode the address operand for e.g.
1132      LD1 {<Vt>.<T>, <Vt2>.<T>, <Vt3>.<T>}, [<Xn|SP>], <Xm|#<amount>>.  */
1133 bfd_boolean
1134 aarch64_ext_simd_addr_post (const aarch64_operand *self ATTRIBUTE_UNUSED,
1135 			    aarch64_opnd_info *info,
1136 			    aarch64_insn code, const aarch64_inst *inst,
1137 			    aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1138 {
1139   /* The opcode dependent area stores the number of elements in
1140      each structure to be loaded/stored.  */
1141   int is_ld1r = get_opcode_dependent_value (inst->opcode) == 1;
1142 
1143   /* Rn */
1144   info->addr.base_regno = extract_field (FLD_Rn, code, 0);
1145   /* Rm | #<amount>  */
1146   info->addr.offset.regno = extract_field (FLD_Rm, code, 0);
1147   if (info->addr.offset.regno == 31)
1148     {
1149       if (inst->opcode->operands[0] == AARCH64_OPND_LVt_AL)
1150 	/* Special handling of loading single structure to all lane.  */
1151 	info->addr.offset.imm = (is_ld1r ? 1
1152 				 : inst->operands[0].reglist.num_regs)
1153 	  * aarch64_get_qualifier_esize (inst->operands[0].qualifier);
1154       else
1155 	info->addr.offset.imm = inst->operands[0].reglist.num_regs
1156 	  * aarch64_get_qualifier_esize (inst->operands[0].qualifier)
1157 	  * aarch64_get_qualifier_nelem (inst->operands[0].qualifier);
1158     }
1159   else
1160     info->addr.offset.is_reg = 1;
1161   info->addr.writeback = 1;
1162 
1163   return TRUE;
1164 }
1165 
1166 /* Decode the condition operand for e.g. CSEL <Xd>, <Xn>, <Xm>, <cond>.  */
1167 bfd_boolean
1168 aarch64_ext_cond (const aarch64_operand *self ATTRIBUTE_UNUSED,
1169 		  aarch64_opnd_info *info,
1170 		  aarch64_insn code, const aarch64_inst *inst ATTRIBUTE_UNUSED,
1171 		  aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1172 {
1173   aarch64_insn value;
1174   /* cond */
1175   value = extract_field (FLD_cond, code, 0);
1176   info->cond = get_cond_from_value (value);
1177   return TRUE;
1178 }
1179 
1180 /* Decode the system register operand for e.g. MRS <Xt>, <systemreg>.  */
1181 bfd_boolean
1182 aarch64_ext_sysreg (const aarch64_operand *self ATTRIBUTE_UNUSED,
1183 		    aarch64_opnd_info *info,
1184 		    aarch64_insn code,
1185 		    const aarch64_inst *inst ATTRIBUTE_UNUSED,
1186 		    aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1187 {
1188   /* op0:op1:CRn:CRm:op2 */
1189   info->sysreg.value = extract_fields (code, 0, 5, FLD_op0, FLD_op1, FLD_CRn,
1190 				       FLD_CRm, FLD_op2);
1191   info->sysreg.flags = 0;
1192 
1193   /* If a system instruction, check which restrictions should be on the register
1194      value during decoding, these will be enforced then.  */
1195   if (inst->opcode->iclass == ic_system)
1196     {
1197       /* Check to see if it's read-only, else check if it's write only.
1198 	 if it's both or unspecified don't care.  */
1199       if ((inst->opcode->flags & (F_SYS_READ | F_SYS_WRITE)) == F_SYS_READ)
1200 	info->sysreg.flags = F_REG_READ;
1201       else if ((inst->opcode->flags & (F_SYS_READ | F_SYS_WRITE))
1202 	       == F_SYS_WRITE)
1203 	info->sysreg.flags = F_REG_WRITE;
1204     }
1205 
1206   return TRUE;
1207 }
1208 
1209 /* Decode the PSTATE field operand for e.g. MSR <pstatefield>, #<imm>.  */
1210 bfd_boolean
1211 aarch64_ext_pstatefield (const aarch64_operand *self ATTRIBUTE_UNUSED,
1212 			 aarch64_opnd_info *info, aarch64_insn code,
1213 			 const aarch64_inst *inst ATTRIBUTE_UNUSED,
1214 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1215 {
1216   int i;
1217   /* op1:op2 */
1218   info->pstatefield = extract_fields (code, 0, 2, FLD_op1, FLD_op2);
1219   for (i = 0; aarch64_pstatefields[i].name != NULL; ++i)
1220     if (aarch64_pstatefields[i].value == (aarch64_insn)info->pstatefield)
1221       return TRUE;
1222   /* Reserved value in <pstatefield>.  */
1223   return FALSE;
1224 }
1225 
1226 /* Decode the system instruction op operand for e.g. AT <at_op>, <Xt>.  */
1227 bfd_boolean
1228 aarch64_ext_sysins_op (const aarch64_operand *self ATTRIBUTE_UNUSED,
1229 		       aarch64_opnd_info *info,
1230 		       aarch64_insn code,
1231 		       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1232 		       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1233 {
1234   int i;
1235   aarch64_insn value;
1236   const aarch64_sys_ins_reg *sysins_ops;
1237   /* op0:op1:CRn:CRm:op2 */
1238   value = extract_fields (code, 0, 5,
1239 			  FLD_op0, FLD_op1, FLD_CRn,
1240 			  FLD_CRm, FLD_op2);
1241 
1242   switch (info->type)
1243     {
1244     case AARCH64_OPND_SYSREG_AT: sysins_ops = aarch64_sys_regs_at; break;
1245     case AARCH64_OPND_SYSREG_DC: sysins_ops = aarch64_sys_regs_dc; break;
1246     case AARCH64_OPND_SYSREG_IC: sysins_ops = aarch64_sys_regs_ic; break;
1247     case AARCH64_OPND_SYSREG_TLBI: sysins_ops = aarch64_sys_regs_tlbi; break;
1248     default: assert (0); return FALSE;
1249     }
1250 
1251   for (i = 0; sysins_ops[i].name != NULL; ++i)
1252     if (sysins_ops[i].value == value)
1253       {
1254 	info->sysins_op = sysins_ops + i;
1255 	DEBUG_TRACE ("%s found value: %x, has_xt: %d, i: %d.",
1256 		     info->sysins_op->name,
1257 		     (unsigned)info->sysins_op->value,
1258 		     aarch64_sys_ins_reg_has_xt (info->sysins_op), i);
1259 	return TRUE;
1260       }
1261 
1262   return FALSE;
1263 }
1264 
1265 /* Decode the memory barrier option operand for e.g. DMB <option>|#<imm>.  */
1266 
1267 bfd_boolean
1268 aarch64_ext_barrier (const aarch64_operand *self ATTRIBUTE_UNUSED,
1269 		     aarch64_opnd_info *info,
1270 		     aarch64_insn code,
1271 		     const aarch64_inst *inst ATTRIBUTE_UNUSED,
1272 		     aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1273 {
1274   /* CRm */
1275   info->barrier = aarch64_barrier_options + extract_field (FLD_CRm, code, 0);
1276   return TRUE;
1277 }
1278 
1279 /* Decode the prefetch operation option operand for e.g.
1280      PRFM <prfop>, [<Xn|SP>{, #<pimm>}].  */
1281 
1282 bfd_boolean
1283 aarch64_ext_prfop (const aarch64_operand *self ATTRIBUTE_UNUSED,
1284 		   aarch64_opnd_info *info,
1285 		   aarch64_insn code, const aarch64_inst *inst ATTRIBUTE_UNUSED,
1286 		   aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1287 {
1288   /* prfop in Rt */
1289   info->prfop = aarch64_prfops + extract_field (FLD_Rt, code, 0);
1290   return TRUE;
1291 }
1292 
1293 /* Decode the hint number for an alias taking an operand.  Set info->hint_option
1294    to the matching name/value pair in aarch64_hint_options.  */
1295 
1296 bfd_boolean
1297 aarch64_ext_hint (const aarch64_operand *self ATTRIBUTE_UNUSED,
1298 		  aarch64_opnd_info *info,
1299 		  aarch64_insn code,
1300 		  const aarch64_inst *inst ATTRIBUTE_UNUSED,
1301 		  aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1302 {
1303   /* CRm:op2.  */
1304   unsigned hint_number;
1305   int i;
1306 
1307   hint_number = extract_fields (code, 0, 2, FLD_CRm, FLD_op2);
1308 
1309   for (i = 0; aarch64_hint_options[i].name != NULL; i++)
1310     {
1311       if (hint_number == aarch64_hint_options[i].value)
1312 	{
1313 	  info->hint_option = &(aarch64_hint_options[i]);
1314 	  return TRUE;
1315 	}
1316     }
1317 
1318   return FALSE;
1319 }
1320 
1321 /* Decode the extended register operand for e.g.
1322      STR <Qt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}].  */
1323 bfd_boolean
1324 aarch64_ext_reg_extended (const aarch64_operand *self ATTRIBUTE_UNUSED,
1325 			  aarch64_opnd_info *info,
1326 			  aarch64_insn code,
1327 			  const aarch64_inst *inst ATTRIBUTE_UNUSED,
1328 			  aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1329 {
1330   aarch64_insn value;
1331 
1332   /* Rm */
1333   info->reg.regno = extract_field (FLD_Rm, code, 0);
1334   /* option */
1335   value = extract_field (FLD_option, code, 0);
1336   info->shifter.kind =
1337     aarch64_get_operand_modifier_from_value (value, TRUE /* extend_p */);
1338   /* imm3 */
1339   info->shifter.amount = extract_field (FLD_imm3, code,  0);
1340 
1341   /* This makes the constraint checking happy.  */
1342   info->shifter.operator_present = 1;
1343 
1344   /* Assume inst->operands[0].qualifier has been resolved.  */
1345   assert (inst->operands[0].qualifier != AARCH64_OPND_QLF_NIL);
1346   info->qualifier = AARCH64_OPND_QLF_W;
1347   if (inst->operands[0].qualifier == AARCH64_OPND_QLF_X
1348       && (info->shifter.kind == AARCH64_MOD_UXTX
1349 	  || info->shifter.kind == AARCH64_MOD_SXTX))
1350     info->qualifier = AARCH64_OPND_QLF_X;
1351 
1352   return TRUE;
1353 }
1354 
1355 /* Decode the shifted register operand for e.g.
1356      SUBS <Xd>, <Xn>, <Xm> {, <shift> #<amount>}.  */
1357 bfd_boolean
1358 aarch64_ext_reg_shifted (const aarch64_operand *self ATTRIBUTE_UNUSED,
1359 			 aarch64_opnd_info *info,
1360 			 aarch64_insn code,
1361 			 const aarch64_inst *inst ATTRIBUTE_UNUSED,
1362 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1363 {
1364   aarch64_insn value;
1365 
1366   /* Rm */
1367   info->reg.regno = extract_field (FLD_Rm, code, 0);
1368   /* shift */
1369   value = extract_field (FLD_shift, code, 0);
1370   info->shifter.kind =
1371     aarch64_get_operand_modifier_from_value (value, FALSE /* extend_p */);
1372   if (info->shifter.kind == AARCH64_MOD_ROR
1373       && inst->opcode->iclass != log_shift)
1374     /* ROR is not available for the shifted register operand in arithmetic
1375        instructions.  */
1376     return FALSE;
1377   /* imm6 */
1378   info->shifter.amount = extract_field (FLD_imm6, code,  0);
1379 
1380   /* This makes the constraint checking happy.  */
1381   info->shifter.operator_present = 1;
1382 
1383   return TRUE;
1384 }
1385 
1386 /* Decode an SVE address [<base>, #<offset>*<factor>, MUL VL],
1387    where <offset> is given by the OFFSET parameter and where <factor> is
1388    1 plus SELF's operand-dependent value.  fields[0] specifies the field
1389    that holds <base>.  */
1390 static bfd_boolean
1391 aarch64_ext_sve_addr_reg_mul_vl (const aarch64_operand *self,
1392 				 aarch64_opnd_info *info, aarch64_insn code,
1393 				 int64_t offset)
1394 {
1395   info->addr.base_regno = extract_field (self->fields[0], code, 0);
1396   info->addr.offset.imm = offset * (1 + get_operand_specific_data (self));
1397   info->addr.offset.is_reg = FALSE;
1398   info->addr.writeback = FALSE;
1399   info->addr.preind = TRUE;
1400   if (offset != 0)
1401     info->shifter.kind = AARCH64_MOD_MUL_VL;
1402   info->shifter.amount = 1;
1403   info->shifter.operator_present = (info->addr.offset.imm != 0);
1404   info->shifter.amount_present = FALSE;
1405   return TRUE;
1406 }
1407 
1408 /* Decode an SVE address [<base>, #<simm4>*<factor>, MUL VL],
1409    where <simm4> is a 4-bit signed value and where <factor> is 1 plus
1410    SELF's operand-dependent value.  fields[0] specifies the field that
1411    holds <base>.  <simm4> is encoded in the SVE_imm4 field.  */
1412 bfd_boolean
1413 aarch64_ext_sve_addr_ri_s4xvl (const aarch64_operand *self,
1414 			       aarch64_opnd_info *info, aarch64_insn code,
1415 			       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1416 			       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1417 {
1418   int offset;
1419 
1420   offset = extract_field (FLD_SVE_imm4, code, 0);
1421   offset = ((offset + 8) & 15) - 8;
1422   return aarch64_ext_sve_addr_reg_mul_vl (self, info, code, offset);
1423 }
1424 
1425 /* Decode an SVE address [<base>, #<simm6>*<factor>, MUL VL],
1426    where <simm6> is a 6-bit signed value and where <factor> is 1 plus
1427    SELF's operand-dependent value.  fields[0] specifies the field that
1428    holds <base>.  <simm6> is encoded in the SVE_imm6 field.  */
1429 bfd_boolean
1430 aarch64_ext_sve_addr_ri_s6xvl (const aarch64_operand *self,
1431 			       aarch64_opnd_info *info, aarch64_insn code,
1432 			       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1433 			       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1434 {
1435   int offset;
1436 
1437   offset = extract_field (FLD_SVE_imm6, code, 0);
1438   offset = (((offset + 32) & 63) - 32);
1439   return aarch64_ext_sve_addr_reg_mul_vl (self, info, code, offset);
1440 }
1441 
1442 /* Decode an SVE address [<base>, #<simm9>*<factor>, MUL VL],
1443    where <simm9> is a 9-bit signed value and where <factor> is 1 plus
1444    SELF's operand-dependent value.  fields[0] specifies the field that
1445    holds <base>.  <simm9> is encoded in the concatenation of the SVE_imm6
1446    and imm3 fields, with imm3 being the less-significant part.  */
1447 bfd_boolean
1448 aarch64_ext_sve_addr_ri_s9xvl (const aarch64_operand *self,
1449 			       aarch64_opnd_info *info,
1450 			       aarch64_insn code,
1451 			       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1452 			       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1453 {
1454   int offset;
1455 
1456   offset = extract_fields (code, 0, 2, FLD_SVE_imm6, FLD_imm3);
1457   offset = (((offset + 256) & 511) - 256);
1458   return aarch64_ext_sve_addr_reg_mul_vl (self, info, code, offset);
1459 }
1460 
1461 /* Decode an SVE address [<base>, #<offset> << <shift>], where <offset>
1462    is given by the OFFSET parameter and where <shift> is SELF's operand-
1463    dependent value.  fields[0] specifies the base register field <base>.  */
1464 static bfd_boolean
1465 aarch64_ext_sve_addr_reg_imm (const aarch64_operand *self,
1466 			      aarch64_opnd_info *info, aarch64_insn code,
1467 			      int64_t offset)
1468 {
1469   info->addr.base_regno = extract_field (self->fields[0], code, 0);
1470   info->addr.offset.imm = offset * (1 << get_operand_specific_data (self));
1471   info->addr.offset.is_reg = FALSE;
1472   info->addr.writeback = FALSE;
1473   info->addr.preind = TRUE;
1474   info->shifter.operator_present = FALSE;
1475   info->shifter.amount_present = FALSE;
1476   return TRUE;
1477 }
1478 
1479 /* Decode an SVE address [X<n>, #<SVE_imm4> << <shift>], where <SVE_imm4>
1480    is a 4-bit signed number and where <shift> is SELF's operand-dependent
1481    value.  fields[0] specifies the base register field.  */
1482 bfd_boolean
1483 aarch64_ext_sve_addr_ri_s4 (const aarch64_operand *self,
1484 			    aarch64_opnd_info *info, aarch64_insn code,
1485 			    const aarch64_inst *inst ATTRIBUTE_UNUSED,
1486 			    aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1487 {
1488   int offset = sign_extend (extract_field (FLD_SVE_imm4, code, 0), 3);
1489   return aarch64_ext_sve_addr_reg_imm (self, info, code, offset);
1490 }
1491 
1492 /* Decode an SVE address [X<n>, #<SVE_imm6> << <shift>], where <SVE_imm6>
1493    is a 6-bit unsigned number and where <shift> is SELF's operand-dependent
1494    value.  fields[0] specifies the base register field.  */
1495 bfd_boolean
1496 aarch64_ext_sve_addr_ri_u6 (const aarch64_operand *self,
1497 			    aarch64_opnd_info *info, aarch64_insn code,
1498 			    const aarch64_inst *inst ATTRIBUTE_UNUSED,
1499 			    aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1500 {
1501   int offset = extract_field (FLD_SVE_imm6, code, 0);
1502   return aarch64_ext_sve_addr_reg_imm (self, info, code, offset);
1503 }
1504 
1505 /* Decode an SVE address [X<n>, X<m>{, LSL #<shift>}], where <shift>
1506    is SELF's operand-dependent value.  fields[0] specifies the base
1507    register field and fields[1] specifies the offset register field.  */
1508 bfd_boolean
1509 aarch64_ext_sve_addr_rr_lsl (const aarch64_operand *self,
1510 			     aarch64_opnd_info *info, aarch64_insn code,
1511 			     const aarch64_inst *inst ATTRIBUTE_UNUSED,
1512 			     aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1513 {
1514   int index_regno;
1515 
1516   index_regno = extract_field (self->fields[1], code, 0);
1517   if (index_regno == 31 && (self->flags & OPD_F_NO_ZR) != 0)
1518     return FALSE;
1519 
1520   info->addr.base_regno = extract_field (self->fields[0], code, 0);
1521   info->addr.offset.regno = index_regno;
1522   info->addr.offset.is_reg = TRUE;
1523   info->addr.writeback = FALSE;
1524   info->addr.preind = TRUE;
1525   info->shifter.kind = AARCH64_MOD_LSL;
1526   info->shifter.amount = get_operand_specific_data (self);
1527   info->shifter.operator_present = (info->shifter.amount != 0);
1528   info->shifter.amount_present = (info->shifter.amount != 0);
1529   return TRUE;
1530 }
1531 
1532 /* Decode an SVE address [X<n>, Z<m>.<T>, (S|U)XTW {#<shift>}], where
1533    <shift> is SELF's operand-dependent value.  fields[0] specifies the
1534    base register field, fields[1] specifies the offset register field and
1535    fields[2] is a single-bit field that selects SXTW over UXTW.  */
1536 bfd_boolean
1537 aarch64_ext_sve_addr_rz_xtw (const aarch64_operand *self,
1538 			     aarch64_opnd_info *info, aarch64_insn code,
1539 			     const aarch64_inst *inst ATTRIBUTE_UNUSED,
1540 			     aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1541 {
1542   info->addr.base_regno = extract_field (self->fields[0], code, 0);
1543   info->addr.offset.regno = extract_field (self->fields[1], code, 0);
1544   info->addr.offset.is_reg = TRUE;
1545   info->addr.writeback = FALSE;
1546   info->addr.preind = TRUE;
1547   if (extract_field (self->fields[2], code, 0))
1548     info->shifter.kind = AARCH64_MOD_SXTW;
1549   else
1550     info->shifter.kind = AARCH64_MOD_UXTW;
1551   info->shifter.amount = get_operand_specific_data (self);
1552   info->shifter.operator_present = TRUE;
1553   info->shifter.amount_present = (info->shifter.amount != 0);
1554   return TRUE;
1555 }
1556 
1557 /* Decode an SVE address [Z<n>.<T>, #<imm5> << <shift>], where <imm5> is a
1558    5-bit unsigned number and where <shift> is SELF's operand-dependent value.
1559    fields[0] specifies the base register field.  */
1560 bfd_boolean
1561 aarch64_ext_sve_addr_zi_u5 (const aarch64_operand *self,
1562 			    aarch64_opnd_info *info, aarch64_insn code,
1563 			    const aarch64_inst *inst ATTRIBUTE_UNUSED,
1564 			    aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1565 {
1566   int offset = extract_field (FLD_imm5, code, 0);
1567   return aarch64_ext_sve_addr_reg_imm (self, info, code, offset);
1568 }
1569 
1570 /* Decode an SVE address [Z<n>.<T>, Z<m>.<T>{, <modifier> {#<msz>}}],
1571    where <modifier> is given by KIND and where <msz> is a 2-bit unsigned
1572    number.  fields[0] specifies the base register field and fields[1]
1573    specifies the offset register field.  */
1574 static bfd_boolean
1575 aarch64_ext_sve_addr_zz (const aarch64_operand *self, aarch64_opnd_info *info,
1576 			 aarch64_insn code, enum aarch64_modifier_kind kind)
1577 {
1578   info->addr.base_regno = extract_field (self->fields[0], code, 0);
1579   info->addr.offset.regno = extract_field (self->fields[1], code, 0);
1580   info->addr.offset.is_reg = TRUE;
1581   info->addr.writeback = FALSE;
1582   info->addr.preind = TRUE;
1583   info->shifter.kind = kind;
1584   info->shifter.amount = extract_field (FLD_SVE_msz, code, 0);
1585   info->shifter.operator_present = (kind != AARCH64_MOD_LSL
1586 				    || info->shifter.amount != 0);
1587   info->shifter.amount_present = (info->shifter.amount != 0);
1588   return TRUE;
1589 }
1590 
1591 /* Decode an SVE address [Z<n>.<T>, Z<m>.<T>{, LSL #<msz>}], where
1592    <msz> is a 2-bit unsigned number.  fields[0] specifies the base register
1593    field and fields[1] specifies the offset register field.  */
1594 bfd_boolean
1595 aarch64_ext_sve_addr_zz_lsl (const aarch64_operand *self,
1596 			     aarch64_opnd_info *info, aarch64_insn code,
1597 			     const aarch64_inst *inst ATTRIBUTE_UNUSED,
1598 			     aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1599 {
1600   return aarch64_ext_sve_addr_zz (self, info, code, AARCH64_MOD_LSL);
1601 }
1602 
1603 /* Decode an SVE address [Z<n>.<T>, Z<m>.<T>, SXTW {#<msz>}], where
1604    <msz> is a 2-bit unsigned number.  fields[0] specifies the base register
1605    field and fields[1] specifies the offset register field.  */
1606 bfd_boolean
1607 aarch64_ext_sve_addr_zz_sxtw (const aarch64_operand *self,
1608 			      aarch64_opnd_info *info, aarch64_insn code,
1609 			      const aarch64_inst *inst ATTRIBUTE_UNUSED,
1610 			      aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1611 {
1612   return aarch64_ext_sve_addr_zz (self, info, code, AARCH64_MOD_SXTW);
1613 }
1614 
1615 /* Decode an SVE address [Z<n>.<T>, Z<m>.<T>, UXTW {#<msz>}], where
1616    <msz> is a 2-bit unsigned number.  fields[0] specifies the base register
1617    field and fields[1] specifies the offset register field.  */
1618 bfd_boolean
1619 aarch64_ext_sve_addr_zz_uxtw (const aarch64_operand *self,
1620 			      aarch64_opnd_info *info, aarch64_insn code,
1621 			      const aarch64_inst *inst ATTRIBUTE_UNUSED,
1622 			      aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1623 {
1624   return aarch64_ext_sve_addr_zz (self, info, code, AARCH64_MOD_UXTW);
1625 }
1626 
1627 /* Finish decoding an SVE arithmetic immediate, given that INFO already
1628    has the raw field value and that the low 8 bits decode to VALUE.  */
1629 static bfd_boolean
1630 decode_sve_aimm (aarch64_opnd_info *info, int64_t value)
1631 {
1632   info->shifter.kind = AARCH64_MOD_LSL;
1633   info->shifter.amount = 0;
1634   if (info->imm.value & 0x100)
1635     {
1636       if (value == 0)
1637 	/* Decode 0x100 as #0, LSL #8.  */
1638 	info->shifter.amount = 8;
1639       else
1640 	value *= 256;
1641     }
1642   info->shifter.operator_present = (info->shifter.amount != 0);
1643   info->shifter.amount_present = (info->shifter.amount != 0);
1644   info->imm.value = value;
1645   return TRUE;
1646 }
1647 
1648 /* Decode an SVE ADD/SUB immediate.  */
1649 bfd_boolean
1650 aarch64_ext_sve_aimm (const aarch64_operand *self,
1651 		      aarch64_opnd_info *info, const aarch64_insn code,
1652 		      const aarch64_inst *inst,
1653 		      aarch64_operand_error *errors)
1654 {
1655   return (aarch64_ext_imm (self, info, code, inst, errors)
1656 	  && decode_sve_aimm (info, (uint8_t) info->imm.value));
1657 }
1658 
1659 /* Decode an SVE CPY/DUP immediate.  */
1660 bfd_boolean
1661 aarch64_ext_sve_asimm (const aarch64_operand *self,
1662 		       aarch64_opnd_info *info, const aarch64_insn code,
1663 		       const aarch64_inst *inst,
1664 		       aarch64_operand_error *errors)
1665 {
1666   return (aarch64_ext_imm (self, info, code, inst, errors)
1667 	  && decode_sve_aimm (info, (int8_t) info->imm.value));
1668 }
1669 
1670 /* Decode a single-bit immediate that selects between #0.5 and #1.0.
1671    The fields array specifies which field to use.  */
1672 bfd_boolean
1673 aarch64_ext_sve_float_half_one (const aarch64_operand *self,
1674 				aarch64_opnd_info *info, aarch64_insn code,
1675 				const aarch64_inst *inst ATTRIBUTE_UNUSED,
1676 				aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1677 {
1678   if (extract_field (self->fields[0], code, 0))
1679     info->imm.value = 0x3f800000;
1680   else
1681     info->imm.value = 0x3f000000;
1682   info->imm.is_fp = TRUE;
1683   return TRUE;
1684 }
1685 
1686 /* Decode a single-bit immediate that selects between #0.5 and #2.0.
1687    The fields array specifies which field to use.  */
1688 bfd_boolean
1689 aarch64_ext_sve_float_half_two (const aarch64_operand *self,
1690 				aarch64_opnd_info *info, aarch64_insn code,
1691 				const aarch64_inst *inst ATTRIBUTE_UNUSED,
1692 				aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1693 {
1694   if (extract_field (self->fields[0], code, 0))
1695     info->imm.value = 0x40000000;
1696   else
1697     info->imm.value = 0x3f000000;
1698   info->imm.is_fp = TRUE;
1699   return TRUE;
1700 }
1701 
1702 /* Decode a single-bit immediate that selects between #0.0 and #1.0.
1703    The fields array specifies which field to use.  */
1704 bfd_boolean
1705 aarch64_ext_sve_float_zero_one (const aarch64_operand *self,
1706 				aarch64_opnd_info *info, aarch64_insn code,
1707 				const aarch64_inst *inst ATTRIBUTE_UNUSED,
1708 				aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1709 {
1710   if (extract_field (self->fields[0], code, 0))
1711     info->imm.value = 0x3f800000;
1712   else
1713     info->imm.value = 0x0;
1714   info->imm.is_fp = TRUE;
1715   return TRUE;
1716 }
1717 
1718 /* Decode Zn[MM], where MM has a 7-bit triangular encoding.  The fields
1719    array specifies which field to use for Zn.  MM is encoded in the
1720    concatenation of imm5 and SVE_tszh, with imm5 being the less
1721    significant part.  */
1722 bfd_boolean
1723 aarch64_ext_sve_index (const aarch64_operand *self,
1724 		       aarch64_opnd_info *info, aarch64_insn code,
1725 		       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1726 		       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1727 {
1728   int val;
1729 
1730   info->reglane.regno = extract_field (self->fields[0], code, 0);
1731   val = extract_fields (code, 0, 2, FLD_SVE_tszh, FLD_imm5);
1732   if ((val & 31) == 0)
1733     return 0;
1734   while ((val & 1) == 0)
1735     val /= 2;
1736   info->reglane.index = val / 2;
1737   return TRUE;
1738 }
1739 
1740 /* Decode a logical immediate for the MOV alias of SVE DUPM.  */
1741 bfd_boolean
1742 aarch64_ext_sve_limm_mov (const aarch64_operand *self,
1743 			  aarch64_opnd_info *info, const aarch64_insn code,
1744 			  const aarch64_inst *inst,
1745 			  aarch64_operand_error *errors)
1746 {
1747   int esize = aarch64_get_qualifier_esize (inst->operands[0].qualifier);
1748   return (aarch64_ext_limm (self, info, code, inst, errors)
1749 	  && aarch64_sve_dupm_mov_immediate_p (info->imm.value, esize));
1750 }
1751 
1752 /* Decode Zn[MM], where Zn occupies the least-significant part of the field
1753    and where MM occupies the most-significant part.  The operand-dependent
1754    value specifies the number of bits in Zn.  */
1755 bfd_boolean
1756 aarch64_ext_sve_quad_index (const aarch64_operand *self,
1757 			    aarch64_opnd_info *info, aarch64_insn code,
1758 			    const aarch64_inst *inst ATTRIBUTE_UNUSED,
1759 			    aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1760 {
1761   unsigned int reg_bits = get_operand_specific_data (self);
1762   unsigned int val = extract_all_fields (self, code);
1763   info->reglane.regno = val & ((1 << reg_bits) - 1);
1764   info->reglane.index = val >> reg_bits;
1765   return TRUE;
1766 }
1767 
1768 /* Decode {Zn.<T> - Zm.<T>}.  The fields array specifies which field
1769    to use for Zn.  The opcode-dependent value specifies the number
1770    of registers in the list.  */
1771 bfd_boolean
1772 aarch64_ext_sve_reglist (const aarch64_operand *self,
1773 			 aarch64_opnd_info *info, aarch64_insn code,
1774 			 const aarch64_inst *inst ATTRIBUTE_UNUSED,
1775 			 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1776 {
1777   info->reglist.first_regno = extract_field (self->fields[0], code, 0);
1778   info->reglist.num_regs = get_opcode_dependent_value (inst->opcode);
1779   return TRUE;
1780 }
1781 
1782 /* Decode <pattern>{, MUL #<amount>}.  The fields array specifies which
1783    fields to use for <pattern>.  <amount> - 1 is encoded in the SVE_imm4
1784    field.  */
1785 bfd_boolean
1786 aarch64_ext_sve_scale (const aarch64_operand *self,
1787 		       aarch64_opnd_info *info, aarch64_insn code,
1788 		       const aarch64_inst *inst, aarch64_operand_error *errors)
1789 {
1790   int val;
1791 
1792   if (!aarch64_ext_imm (self, info, code, inst, errors))
1793     return FALSE;
1794   val = extract_field (FLD_SVE_imm4, code, 0);
1795   info->shifter.kind = AARCH64_MOD_MUL;
1796   info->shifter.amount = val + 1;
1797   info->shifter.operator_present = (val != 0);
1798   info->shifter.amount_present = (val != 0);
1799   return TRUE;
1800 }
1801 
1802 /* Return the top set bit in VALUE, which is expected to be relatively
1803    small.  */
1804 static uint64_t
1805 get_top_bit (uint64_t value)
1806 {
1807   while ((value & -value) != value)
1808     value -= value & -value;
1809   return value;
1810 }
1811 
1812 /* Decode an SVE shift-left immediate.  */
1813 bfd_boolean
1814 aarch64_ext_sve_shlimm (const aarch64_operand *self,
1815 			aarch64_opnd_info *info, const aarch64_insn code,
1816 			const aarch64_inst *inst, aarch64_operand_error *errors)
1817 {
1818   if (!aarch64_ext_imm (self, info, code, inst, errors)
1819       || info->imm.value == 0)
1820     return FALSE;
1821 
1822   info->imm.value -= get_top_bit (info->imm.value);
1823   return TRUE;
1824 }
1825 
1826 /* Decode an SVE shift-right immediate.  */
1827 bfd_boolean
1828 aarch64_ext_sve_shrimm (const aarch64_operand *self,
1829 			aarch64_opnd_info *info, const aarch64_insn code,
1830 			const aarch64_inst *inst, aarch64_operand_error *errors)
1831 {
1832   if (!aarch64_ext_imm (self, info, code, inst, errors)
1833       || info->imm.value == 0)
1834     return FALSE;
1835 
1836   info->imm.value = get_top_bit (info->imm.value) * 2 - info->imm.value;
1837   return TRUE;
1838 }
1839 
1840 /* Bitfields that are commonly used to encode certain operands' information
1841    may be partially used as part of the base opcode in some instructions.
1842    For example, the bit 1 of the field 'size' in
1843      FCVTXN <Vb><d>, <Va><n>
1844    is actually part of the base opcode, while only size<0> is available
1845    for encoding the register type.  Another example is the AdvSIMD
1846    instruction ORR (register), in which the field 'size' is also used for
1847    the base opcode, leaving only the field 'Q' available to encode the
1848    vector register arrangement specifier '8B' or '16B'.
1849 
1850    This function tries to deduce the qualifier from the value of partially
1851    constrained field(s).  Given the VALUE of such a field or fields, the
1852    qualifiers CANDIDATES and the MASK (indicating which bits are valid for
1853    operand encoding), the function returns the matching qualifier or
1854    AARCH64_OPND_QLF_NIL if nothing matches.
1855 
1856    N.B. CANDIDATES is a group of possible qualifiers that are valid for
1857    one operand; it has a maximum of AARCH64_MAX_QLF_SEQ_NUM qualifiers and
1858    may end with AARCH64_OPND_QLF_NIL.  */
1859 
1860 static enum aarch64_opnd_qualifier
1861 get_qualifier_from_partial_encoding (aarch64_insn value,
1862 				     const enum aarch64_opnd_qualifier* \
1863 				     candidates,
1864 				     aarch64_insn mask)
1865 {
1866   int i;
1867   DEBUG_TRACE ("enter with value: %d, mask: %d", (int)value, (int)mask);
1868   for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
1869     {
1870       aarch64_insn standard_value;
1871       if (candidates[i] == AARCH64_OPND_QLF_NIL)
1872 	break;
1873       standard_value = aarch64_get_qualifier_standard_value (candidates[i]);
1874       if ((standard_value & mask) == (value & mask))
1875 	return candidates[i];
1876     }
1877   return AARCH64_OPND_QLF_NIL;
1878 }
1879 
1880 /* Given a list of qualifier sequences, return all possible valid qualifiers
1881    for operand IDX in QUALIFIERS.
1882    Assume QUALIFIERS is an array whose length is large enough.  */
1883 
1884 static void
1885 get_operand_possible_qualifiers (int idx,
1886 				 const aarch64_opnd_qualifier_seq_t *list,
1887 				 enum aarch64_opnd_qualifier *qualifiers)
1888 {
1889   int i;
1890   for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
1891     if ((qualifiers[i] = list[i][idx]) == AARCH64_OPND_QLF_NIL)
1892       break;
1893 }
1894 
1895 /* Decode the size Q field for e.g. SHADD.
1896    We tag one operand with the qualifer according to the code;
1897    whether the qualifier is valid for this opcode or not, it is the
1898    duty of the semantic checking.  */
1899 
1900 static int
1901 decode_sizeq (aarch64_inst *inst)
1902 {
1903   int idx;
1904   enum aarch64_opnd_qualifier qualifier;
1905   aarch64_insn code;
1906   aarch64_insn value, mask;
1907   enum aarch64_field_kind fld_sz;
1908   enum aarch64_opnd_qualifier candidates[AARCH64_MAX_QLF_SEQ_NUM];
1909 
1910   if (inst->opcode->iclass == asisdlse
1911      || inst->opcode->iclass == asisdlsep
1912      || inst->opcode->iclass == asisdlso
1913      || inst->opcode->iclass == asisdlsop)
1914     fld_sz = FLD_vldst_size;
1915   else
1916     fld_sz = FLD_size;
1917 
1918   code = inst->value;
1919   value = extract_fields (code, inst->opcode->mask, 2, fld_sz, FLD_Q);
1920   /* Obtain the info that which bits of fields Q and size are actually
1921      available for operand encoding.  Opcodes like FMAXNM and FMLA have
1922      size[1] unavailable.  */
1923   mask = extract_fields (~inst->opcode->mask, 0, 2, fld_sz, FLD_Q);
1924 
1925   /* The index of the operand we are going to tag a qualifier and the qualifer
1926      itself are reasoned from the value of the size and Q fields and the
1927      possible valid qualifier lists.  */
1928   idx = aarch64_select_operand_for_sizeq_field_coding (inst->opcode);
1929   DEBUG_TRACE ("key idx: %d", idx);
1930 
1931   /* For most related instruciton, size:Q are fully available for operand
1932      encoding.  */
1933   if (mask == 0x7)
1934     {
1935       inst->operands[idx].qualifier = get_vreg_qualifier_from_value (value);
1936       return 1;
1937     }
1938 
1939   get_operand_possible_qualifiers (idx, inst->opcode->qualifiers_list,
1940 				   candidates);
1941 #ifdef DEBUG_AARCH64
1942   if (debug_dump)
1943     {
1944       int i;
1945       for (i = 0; candidates[i] != AARCH64_OPND_QLF_NIL
1946 	   && i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
1947 	DEBUG_TRACE ("qualifier %d: %s", i,
1948 		     aarch64_get_qualifier_name(candidates[i]));
1949       DEBUG_TRACE ("%d, %d", (int)value, (int)mask);
1950     }
1951 #endif /* DEBUG_AARCH64 */
1952 
1953   qualifier = get_qualifier_from_partial_encoding (value, candidates, mask);
1954 
1955   if (qualifier == AARCH64_OPND_QLF_NIL)
1956     return 0;
1957 
1958   inst->operands[idx].qualifier = qualifier;
1959   return 1;
1960 }
1961 
1962 /* Decode size[0]:Q, i.e. bit 22 and bit 30, for
1963      e.g. FCVTN<Q> <Vd>.<Tb>, <Vn>.<Ta>.  */
1964 
1965 static int
1966 decode_asimd_fcvt (aarch64_inst *inst)
1967 {
1968   aarch64_field field = {0, 0};
1969   aarch64_insn value;
1970   enum aarch64_opnd_qualifier qualifier;
1971 
1972   gen_sub_field (FLD_size, 0, 1, &field);
1973   value = extract_field_2 (&field, inst->value, 0);
1974   qualifier = value == 0 ? AARCH64_OPND_QLF_V_4S
1975     : AARCH64_OPND_QLF_V_2D;
1976   switch (inst->opcode->op)
1977     {
1978     case OP_FCVTN:
1979     case OP_FCVTN2:
1980       /* FCVTN<Q> <Vd>.<Tb>, <Vn>.<Ta>.  */
1981       inst->operands[1].qualifier = qualifier;
1982       break;
1983     case OP_FCVTL:
1984     case OP_FCVTL2:
1985       /* FCVTL<Q> <Vd>.<Ta>, <Vn>.<Tb>.  */
1986       inst->operands[0].qualifier = qualifier;
1987       break;
1988     default:
1989       assert (0);
1990       return 0;
1991     }
1992 
1993   return 1;
1994 }
1995 
1996 /* Decode size[0], i.e. bit 22, for
1997      e.g. FCVTXN <Vb><d>, <Va><n>.  */
1998 
1999 static int
2000 decode_asisd_fcvtxn (aarch64_inst *inst)
2001 {
2002   aarch64_field field = {0, 0};
2003   gen_sub_field (FLD_size, 0, 1, &field);
2004   if (!extract_field_2 (&field, inst->value, 0))
2005     return 0;
2006   inst->operands[0].qualifier = AARCH64_OPND_QLF_S_S;
2007   return 1;
2008 }
2009 
2010 /* Decode the 'opc' field for e.g. FCVT <Dd>, <Sn>.  */
2011 static int
2012 decode_fcvt (aarch64_inst *inst)
2013 {
2014   enum aarch64_opnd_qualifier qualifier;
2015   aarch64_insn value;
2016   const aarch64_field field = {15, 2};
2017 
2018   /* opc dstsize */
2019   value = extract_field_2 (&field, inst->value, 0);
2020   switch (value)
2021     {
2022     case 0: qualifier = AARCH64_OPND_QLF_S_S; break;
2023     case 1: qualifier = AARCH64_OPND_QLF_S_D; break;
2024     case 3: qualifier = AARCH64_OPND_QLF_S_H; break;
2025     default: return 0;
2026     }
2027   inst->operands[0].qualifier = qualifier;
2028 
2029   return 1;
2030 }
2031 
2032 /* Do miscellaneous decodings that are not common enough to be driven by
2033    flags.  */
2034 
2035 static int
2036 do_misc_decoding (aarch64_inst *inst)
2037 {
2038   unsigned int value;
2039   switch (inst->opcode->op)
2040     {
2041     case OP_FCVT:
2042       return decode_fcvt (inst);
2043 
2044     case OP_FCVTN:
2045     case OP_FCVTN2:
2046     case OP_FCVTL:
2047     case OP_FCVTL2:
2048       return decode_asimd_fcvt (inst);
2049 
2050     case OP_FCVTXN_S:
2051       return decode_asisd_fcvtxn (inst);
2052 
2053     case OP_MOV_P_P:
2054     case OP_MOVS_P_P:
2055       value = extract_field (FLD_SVE_Pn, inst->value, 0);
2056       return (value == extract_field (FLD_SVE_Pm, inst->value, 0)
2057 	      && value == extract_field (FLD_SVE_Pg4_10, inst->value, 0));
2058 
2059     case OP_MOV_Z_P_Z:
2060       return (extract_field (FLD_SVE_Zd, inst->value, 0)
2061 	      == extract_field (FLD_SVE_Zm_16, inst->value, 0));
2062 
2063     case OP_MOV_Z_V:
2064       /* Index must be zero.  */
2065       value = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_imm5);
2066       return value > 0 && value <= 16 && value == (value & -value);
2067 
2068     case OP_MOV_Z_Z:
2069       return (extract_field (FLD_SVE_Zn, inst->value, 0)
2070 	      == extract_field (FLD_SVE_Zm_16, inst->value, 0));
2071 
2072     case OP_MOV_Z_Zi:
2073       /* Index must be nonzero.  */
2074       value = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_imm5);
2075       return value > 0 && value != (value & -value);
2076 
2077     case OP_MOVM_P_P_P:
2078       return (extract_field (FLD_SVE_Pd, inst->value, 0)
2079 	      == extract_field (FLD_SVE_Pm, inst->value, 0));
2080 
2081     case OP_MOVZS_P_P_P:
2082     case OP_MOVZ_P_P_P:
2083       return (extract_field (FLD_SVE_Pn, inst->value, 0)
2084 	      == extract_field (FLD_SVE_Pm, inst->value, 0));
2085 
2086     case OP_NOTS_P_P_P_Z:
2087     case OP_NOT_P_P_P_Z:
2088       return (extract_field (FLD_SVE_Pm, inst->value, 0)
2089 	      == extract_field (FLD_SVE_Pg4_10, inst->value, 0));
2090 
2091     default:
2092       return 0;
2093     }
2094 }
2095 
2096 /* Opcodes that have fields shared by multiple operands are usually flagged
2097    with flags.  In this function, we detect such flags, decode the related
2098    field(s) and store the information in one of the related operands.  The
2099    'one' operand is not any operand but one of the operands that can
2100    accommadate all the information that has been decoded.  */
2101 
2102 static int
2103 do_special_decoding (aarch64_inst *inst)
2104 {
2105   int idx;
2106   aarch64_insn value;
2107   /* Condition for truly conditional executed instructions, e.g. b.cond.  */
2108   if (inst->opcode->flags & F_COND)
2109     {
2110       value = extract_field (FLD_cond2, inst->value, 0);
2111       inst->cond = get_cond_from_value (value);
2112     }
2113   /* 'sf' field.  */
2114   if (inst->opcode->flags & F_SF)
2115     {
2116       idx = select_operand_for_sf_field_coding (inst->opcode);
2117       value = extract_field (FLD_sf, inst->value, 0);
2118       inst->operands[idx].qualifier = get_greg_qualifier_from_value (value);
2119       if ((inst->opcode->flags & F_N)
2120 	  && extract_field (FLD_N, inst->value, 0) != value)
2121 	return 0;
2122     }
2123   /* 'sf' field.  */
2124   if (inst->opcode->flags & F_LSE_SZ)
2125     {
2126       idx = select_operand_for_sf_field_coding (inst->opcode);
2127       value = extract_field (FLD_lse_sz, inst->value, 0);
2128       inst->operands[idx].qualifier = get_greg_qualifier_from_value (value);
2129     }
2130   /* size:Q fields.  */
2131   if (inst->opcode->flags & F_SIZEQ)
2132     return decode_sizeq (inst);
2133 
2134   if (inst->opcode->flags & F_FPTYPE)
2135     {
2136       idx = select_operand_for_fptype_field_coding (inst->opcode);
2137       value = extract_field (FLD_type, inst->value, 0);
2138       switch (value)
2139 	{
2140 	case 0: inst->operands[idx].qualifier = AARCH64_OPND_QLF_S_S; break;
2141 	case 1: inst->operands[idx].qualifier = AARCH64_OPND_QLF_S_D; break;
2142 	case 3: inst->operands[idx].qualifier = AARCH64_OPND_QLF_S_H; break;
2143 	default: return 0;
2144 	}
2145     }
2146 
2147   if (inst->opcode->flags & F_SSIZE)
2148     {
2149       /* N.B. some opcodes like FCMGT <V><d>, <V><n>, #0 have the size[1] as part
2150 	 of the base opcode.  */
2151       aarch64_insn mask;
2152       enum aarch64_opnd_qualifier candidates[AARCH64_MAX_QLF_SEQ_NUM];
2153       idx = select_operand_for_scalar_size_field_coding (inst->opcode);
2154       value = extract_field (FLD_size, inst->value, inst->opcode->mask);
2155       mask = extract_field (FLD_size, ~inst->opcode->mask, 0);
2156       /* For most related instruciton, the 'size' field is fully available for
2157 	 operand encoding.  */
2158       if (mask == 0x3)
2159 	inst->operands[idx].qualifier = get_sreg_qualifier_from_value (value);
2160       else
2161 	{
2162 	  get_operand_possible_qualifiers (idx, inst->opcode->qualifiers_list,
2163 					   candidates);
2164 	  inst->operands[idx].qualifier
2165 	    = get_qualifier_from_partial_encoding (value, candidates, mask);
2166 	}
2167     }
2168 
2169   if (inst->opcode->flags & F_T)
2170     {
2171       /* Num of consecutive '0's on the right side of imm5<3:0>.  */
2172       int num = 0;
2173       unsigned val, Q;
2174       assert (aarch64_get_operand_class (inst->opcode->operands[0])
2175 	      == AARCH64_OPND_CLASS_SIMD_REG);
2176       /* imm5<3:0>	q	<t>
2177 	 0000		x	reserved
2178 	 xxx1		0	8b
2179 	 xxx1		1	16b
2180 	 xx10		0	4h
2181 	 xx10		1	8h
2182 	 x100		0	2s
2183 	 x100		1	4s
2184 	 1000		0	reserved
2185 	 1000		1	2d  */
2186       val = extract_field (FLD_imm5, inst->value, 0);
2187       while ((val & 0x1) == 0 && ++num <= 3)
2188 	val >>= 1;
2189       if (num > 3)
2190 	return 0;
2191       Q = (unsigned) extract_field (FLD_Q, inst->value, inst->opcode->mask);
2192       inst->operands[0].qualifier =
2193 	get_vreg_qualifier_from_value ((num << 1) | Q);
2194     }
2195 
2196   if (inst->opcode->flags & F_GPRSIZE_IN_Q)
2197     {
2198       /* Use Rt to encode in the case of e.g.
2199 	 STXP <Ws>, <Xt1>, <Xt2>, [<Xn|SP>{,#0}].  */
2200       idx = aarch64_operand_index (inst->opcode->operands, AARCH64_OPND_Rt);
2201       if (idx == -1)
2202 	{
2203 	  /* Otherwise use the result operand, which has to be a integer
2204 	     register.  */
2205 	  assert (aarch64_get_operand_class (inst->opcode->operands[0])
2206 		  == AARCH64_OPND_CLASS_INT_REG);
2207 	  idx = 0;
2208 	}
2209       assert (idx == 0 || idx == 1);
2210       value = extract_field (FLD_Q, inst->value, 0);
2211       inst->operands[idx].qualifier = get_greg_qualifier_from_value (value);
2212     }
2213 
2214   if (inst->opcode->flags & F_LDS_SIZE)
2215     {
2216       aarch64_field field = {0, 0};
2217       assert (aarch64_get_operand_class (inst->opcode->operands[0])
2218 	      == AARCH64_OPND_CLASS_INT_REG);
2219       gen_sub_field (FLD_opc, 0, 1, &field);
2220       value = extract_field_2 (&field, inst->value, 0);
2221       inst->operands[0].qualifier
2222 	= value ? AARCH64_OPND_QLF_W : AARCH64_OPND_QLF_X;
2223     }
2224 
2225   /* Miscellaneous decoding; done as the last step.  */
2226   if (inst->opcode->flags & F_MISC)
2227     return do_misc_decoding (inst);
2228 
2229   return 1;
2230 }
2231 
2232 /* Converters converting a real opcode instruction to its alias form.  */
2233 
2234 /* ROR <Wd>, <Ws>, #<shift>
2235      is equivalent to:
2236    EXTR <Wd>, <Ws>, <Ws>, #<shift>.  */
2237 static int
2238 convert_extr_to_ror (aarch64_inst *inst)
2239 {
2240   if (inst->operands[1].reg.regno == inst->operands[2].reg.regno)
2241     {
2242       copy_operand_info (inst, 2, 3);
2243       inst->operands[3].type = AARCH64_OPND_NIL;
2244       return 1;
2245     }
2246   return 0;
2247 }
2248 
2249 /* UXTL<Q> <Vd>.<Ta>, <Vn>.<Tb>
2250      is equivalent to:
2251    USHLL<Q> <Vd>.<Ta>, <Vn>.<Tb>, #0.  */
2252 static int
2253 convert_shll_to_xtl (aarch64_inst *inst)
2254 {
2255   if (inst->operands[2].imm.value == 0)
2256     {
2257       inst->operands[2].type = AARCH64_OPND_NIL;
2258       return 1;
2259     }
2260   return 0;
2261 }
2262 
2263 /* Convert
2264      UBFM <Xd>, <Xn>, #<shift>, #63.
2265    to
2266      LSR <Xd>, <Xn>, #<shift>.  */
2267 static int
2268 convert_bfm_to_sr (aarch64_inst *inst)
2269 {
2270   int64_t imms, val;
2271 
2272   imms = inst->operands[3].imm.value;
2273   val = inst->operands[2].qualifier == AARCH64_OPND_QLF_imm_0_31 ? 31 : 63;
2274   if (imms == val)
2275     {
2276       inst->operands[3].type = AARCH64_OPND_NIL;
2277       return 1;
2278     }
2279 
2280   return 0;
2281 }
2282 
2283 /* Convert MOV to ORR.  */
2284 static int
2285 convert_orr_to_mov (aarch64_inst *inst)
2286 {
2287   /* MOV <Vd>.<T>, <Vn>.<T>
2288      is equivalent to:
2289      ORR <Vd>.<T>, <Vn>.<T>, <Vn>.<T>.  */
2290   if (inst->operands[1].reg.regno == inst->operands[2].reg.regno)
2291     {
2292       inst->operands[2].type = AARCH64_OPND_NIL;
2293       return 1;
2294     }
2295   return 0;
2296 }
2297 
2298 /* When <imms> >= <immr>, the instruction written:
2299      SBFX <Xd>, <Xn>, #<lsb>, #<width>
2300    is equivalent to:
2301      SBFM <Xd>, <Xn>, #<lsb>, #(<lsb>+<width>-1).  */
2302 
2303 static int
2304 convert_bfm_to_bfx (aarch64_inst *inst)
2305 {
2306   int64_t immr, imms;
2307 
2308   immr = inst->operands[2].imm.value;
2309   imms = inst->operands[3].imm.value;
2310   if (imms >= immr)
2311     {
2312       int64_t lsb = immr;
2313       inst->operands[2].imm.value = lsb;
2314       inst->operands[3].imm.value = imms + 1 - lsb;
2315       /* The two opcodes have different qualifiers for
2316 	 the immediate operands; reset to help the checking.  */
2317       reset_operand_qualifier (inst, 2);
2318       reset_operand_qualifier (inst, 3);
2319       return 1;
2320     }
2321 
2322   return 0;
2323 }
2324 
2325 /* When <imms> < <immr>, the instruction written:
2326      SBFIZ <Xd>, <Xn>, #<lsb>, #<width>
2327    is equivalent to:
2328      SBFM <Xd>, <Xn>, #((64-<lsb>)&0x3f), #(<width>-1).  */
2329 
2330 static int
2331 convert_bfm_to_bfi (aarch64_inst *inst)
2332 {
2333   int64_t immr, imms, val;
2334 
2335   immr = inst->operands[2].imm.value;
2336   imms = inst->operands[3].imm.value;
2337   val = inst->operands[2].qualifier == AARCH64_OPND_QLF_imm_0_31 ? 32 : 64;
2338   if (imms < immr)
2339     {
2340       inst->operands[2].imm.value = (val - immr) & (val - 1);
2341       inst->operands[3].imm.value = imms + 1;
2342       /* The two opcodes have different qualifiers for
2343 	 the immediate operands; reset to help the checking.  */
2344       reset_operand_qualifier (inst, 2);
2345       reset_operand_qualifier (inst, 3);
2346       return 1;
2347     }
2348 
2349   return 0;
2350 }
2351 
2352 /* The instruction written:
2353      BFC <Xd>, #<lsb>, #<width>
2354    is equivalent to:
2355      BFM <Xd>, XZR, #((64-<lsb>)&0x3f), #(<width>-1).  */
2356 
2357 static int
2358 convert_bfm_to_bfc (aarch64_inst *inst)
2359 {
2360   int64_t immr, imms, val;
2361 
2362   /* Should have been assured by the base opcode value.  */
2363   assert (inst->operands[1].reg.regno == 0x1f);
2364 
2365   immr = inst->operands[2].imm.value;
2366   imms = inst->operands[3].imm.value;
2367   val = inst->operands[2].qualifier == AARCH64_OPND_QLF_imm_0_31 ? 32 : 64;
2368   if (imms < immr)
2369     {
2370       /* Drop XZR from the second operand.  */
2371       copy_operand_info (inst, 1, 2);
2372       copy_operand_info (inst, 2, 3);
2373       inst->operands[3].type = AARCH64_OPND_NIL;
2374 
2375       /* Recalculate the immediates.  */
2376       inst->operands[1].imm.value = (val - immr) & (val - 1);
2377       inst->operands[2].imm.value = imms + 1;
2378 
2379       /* The two opcodes have different qualifiers for the operands; reset to
2380 	 help the checking.  */
2381       reset_operand_qualifier (inst, 1);
2382       reset_operand_qualifier (inst, 2);
2383       reset_operand_qualifier (inst, 3);
2384 
2385       return 1;
2386     }
2387 
2388   return 0;
2389 }
2390 
2391 /* The instruction written:
2392      LSL <Xd>, <Xn>, #<shift>
2393    is equivalent to:
2394      UBFM <Xd>, <Xn>, #((64-<shift>)&0x3f), #(63-<shift>).  */
2395 
2396 static int
2397 convert_ubfm_to_lsl (aarch64_inst *inst)
2398 {
2399   int64_t immr = inst->operands[2].imm.value;
2400   int64_t imms = inst->operands[3].imm.value;
2401   int64_t val
2402     = inst->operands[2].qualifier == AARCH64_OPND_QLF_imm_0_31 ? 31 : 63;
2403 
2404   if ((immr == 0 && imms == val) || immr == imms + 1)
2405     {
2406       inst->operands[3].type = AARCH64_OPND_NIL;
2407       inst->operands[2].imm.value = val - imms;
2408       return 1;
2409     }
2410 
2411   return 0;
2412 }
2413 
2414 /* CINC <Wd>, <Wn>, <cond>
2415      is equivalent to:
2416    CSINC <Wd>, <Wn>, <Wn>, invert(<cond>)
2417      where <cond> is not AL or NV.  */
2418 
2419 static int
2420 convert_from_csel (aarch64_inst *inst)
2421 {
2422   if (inst->operands[1].reg.regno == inst->operands[2].reg.regno
2423       && (inst->operands[3].cond->value & 0xe) != 0xe)
2424     {
2425       copy_operand_info (inst, 2, 3);
2426       inst->operands[2].cond = get_inverted_cond (inst->operands[3].cond);
2427       inst->operands[3].type = AARCH64_OPND_NIL;
2428       return 1;
2429     }
2430   return 0;
2431 }
2432 
2433 /* CSET <Wd>, <cond>
2434      is equivalent to:
2435    CSINC <Wd>, WZR, WZR, invert(<cond>)
2436      where <cond> is not AL or NV.  */
2437 
2438 static int
2439 convert_csinc_to_cset (aarch64_inst *inst)
2440 {
2441   if (inst->operands[1].reg.regno == 0x1f
2442       && inst->operands[2].reg.regno == 0x1f
2443       && (inst->operands[3].cond->value & 0xe) != 0xe)
2444     {
2445       copy_operand_info (inst, 1, 3);
2446       inst->operands[1].cond = get_inverted_cond (inst->operands[3].cond);
2447       inst->operands[3].type = AARCH64_OPND_NIL;
2448       inst->operands[2].type = AARCH64_OPND_NIL;
2449       return 1;
2450     }
2451   return 0;
2452 }
2453 
2454 /* MOV <Wd>, #<imm>
2455      is equivalent to:
2456    MOVZ <Wd>, #<imm16>, LSL #<shift>.
2457 
2458    A disassembler may output ORR, MOVZ and MOVN as a MOV mnemonic, except when
2459    ORR has an immediate that could be generated by a MOVZ or MOVN instruction,
2460    or where a MOVN has an immediate that could be encoded by MOVZ, or where
2461    MOVZ/MOVN #0 have a shift amount other than LSL #0, in which case the
2462    machine-instruction mnemonic must be used.  */
2463 
2464 static int
2465 convert_movewide_to_mov (aarch64_inst *inst)
2466 {
2467   uint64_t value = inst->operands[1].imm.value;
2468   /* MOVZ/MOVN #0 have a shift amount other than LSL #0.  */
2469   if (value == 0 && inst->operands[1].shifter.amount != 0)
2470     return 0;
2471   inst->operands[1].type = AARCH64_OPND_IMM_MOV;
2472   inst->operands[1].shifter.kind = AARCH64_MOD_NONE;
2473   value <<= inst->operands[1].shifter.amount;
2474   /* As an alias convertor, it has to be clear that the INST->OPCODE
2475      is the opcode of the real instruction.  */
2476   if (inst->opcode->op == OP_MOVN)
2477     {
2478       int is32 = inst->operands[0].qualifier == AARCH64_OPND_QLF_W;
2479       value = ~value;
2480       /* A MOVN has an immediate that could be encoded by MOVZ.  */
2481       if (aarch64_wide_constant_p (value, is32, NULL))
2482 	return 0;
2483     }
2484   inst->operands[1].imm.value = value;
2485   inst->operands[1].shifter.amount = 0;
2486   return 1;
2487 }
2488 
2489 /* MOV <Wd>, #<imm>
2490      is equivalent to:
2491    ORR <Wd>, WZR, #<imm>.
2492 
2493    A disassembler may output ORR, MOVZ and MOVN as a MOV mnemonic, except when
2494    ORR has an immediate that could be generated by a MOVZ or MOVN instruction,
2495    or where a MOVN has an immediate that could be encoded by MOVZ, or where
2496    MOVZ/MOVN #0 have a shift amount other than LSL #0, in which case the
2497    machine-instruction mnemonic must be used.  */
2498 
2499 static int
2500 convert_movebitmask_to_mov (aarch64_inst *inst)
2501 {
2502   int is32;
2503   uint64_t value;
2504 
2505   /* Should have been assured by the base opcode value.  */
2506   assert (inst->operands[1].reg.regno == 0x1f);
2507   copy_operand_info (inst, 1, 2);
2508   is32 = inst->operands[0].qualifier == AARCH64_OPND_QLF_W;
2509   inst->operands[1].type = AARCH64_OPND_IMM_MOV;
2510   value = inst->operands[1].imm.value;
2511   /* ORR has an immediate that could be generated by a MOVZ or MOVN
2512      instruction.  */
2513   if (inst->operands[0].reg.regno != 0x1f
2514       && (aarch64_wide_constant_p (value, is32, NULL)
2515 	  || aarch64_wide_constant_p (~value, is32, NULL)))
2516     return 0;
2517 
2518   inst->operands[2].type = AARCH64_OPND_NIL;
2519   return 1;
2520 }
2521 
2522 /* Some alias opcodes are disassembled by being converted from their real-form.
2523    N.B. INST->OPCODE is the real opcode rather than the alias.  */
2524 
2525 static int
2526 convert_to_alias (aarch64_inst *inst, const aarch64_opcode *alias)
2527 {
2528   switch (alias->op)
2529     {
2530     case OP_ASR_IMM:
2531     case OP_LSR_IMM:
2532       return convert_bfm_to_sr (inst);
2533     case OP_LSL_IMM:
2534       return convert_ubfm_to_lsl (inst);
2535     case OP_CINC:
2536     case OP_CINV:
2537     case OP_CNEG:
2538       return convert_from_csel (inst);
2539     case OP_CSET:
2540     case OP_CSETM:
2541       return convert_csinc_to_cset (inst);
2542     case OP_UBFX:
2543     case OP_BFXIL:
2544     case OP_SBFX:
2545       return convert_bfm_to_bfx (inst);
2546     case OP_SBFIZ:
2547     case OP_BFI:
2548     case OP_UBFIZ:
2549       return convert_bfm_to_bfi (inst);
2550     case OP_BFC:
2551       return convert_bfm_to_bfc (inst);
2552     case OP_MOV_V:
2553       return convert_orr_to_mov (inst);
2554     case OP_MOV_IMM_WIDE:
2555     case OP_MOV_IMM_WIDEN:
2556       return convert_movewide_to_mov (inst);
2557     case OP_MOV_IMM_LOG:
2558       return convert_movebitmask_to_mov (inst);
2559     case OP_ROR_IMM:
2560       return convert_extr_to_ror (inst);
2561     case OP_SXTL:
2562     case OP_SXTL2:
2563     case OP_UXTL:
2564     case OP_UXTL2:
2565       return convert_shll_to_xtl (inst);
2566     default:
2567       return 0;
2568     }
2569 }
2570 
2571 static bfd_boolean
2572 aarch64_opcode_decode (const aarch64_opcode *, const aarch64_insn,
2573 		       aarch64_inst *, int, aarch64_operand_error *errors);
2574 
2575 /* Given the instruction information in *INST, check if the instruction has
2576    any alias form that can be used to represent *INST.  If the answer is yes,
2577    update *INST to be in the form of the determined alias.  */
2578 
2579 /* In the opcode description table, the following flags are used in opcode
2580    entries to help establish the relations between the real and alias opcodes:
2581 
2582 	F_ALIAS:	opcode is an alias
2583 	F_HAS_ALIAS:	opcode has alias(es)
2584 	F_P1
2585 	F_P2
2586 	F_P3:		Disassembly preference priority 1-3 (the larger the
2587 			higher).  If nothing is specified, it is the priority
2588 			0 by default, i.e. the lowest priority.
2589 
2590    Although the relation between the machine and the alias instructions are not
2591    explicitly described, it can be easily determined from the base opcode
2592    values, masks and the flags F_ALIAS and F_HAS_ALIAS in their opcode
2593    description entries:
2594 
2595    The mask of an alias opcode must be equal to or a super-set (i.e. more
2596    constrained) of that of the aliased opcode; so is the base opcode value.
2597 
2598    if (opcode_has_alias (real) && alias_opcode_p (opcode)
2599        && (opcode->mask & real->mask) == real->mask
2600        && (real->mask & opcode->opcode) == (real->mask & real->opcode))
2601    then OPCODE is an alias of, and only of, the REAL instruction
2602 
2603    The alias relationship is forced flat-structured to keep related algorithm
2604    simple; an opcode entry cannot be flagged with both F_ALIAS and F_HAS_ALIAS.
2605 
2606    During the disassembling, the decoding decision tree (in
2607    opcodes/aarch64-dis-2.c) always returns an machine instruction opcode entry;
2608    if the decoding of such a machine instruction succeeds (and -Mno-aliases is
2609    not specified), the disassembler will check whether there is any alias
2610    instruction exists for this real instruction.  If there is, the disassembler
2611    will try to disassemble the 32-bit binary again using the alias's rule, or
2612    try to convert the IR to the form of the alias.  In the case of the multiple
2613    aliases, the aliases are tried one by one from the highest priority
2614    (currently the flag F_P3) to the lowest priority (no priority flag), and the
2615    first succeeds first adopted.
2616 
2617    You may ask why there is a need for the conversion of IR from one form to
2618    another in handling certain aliases.  This is because on one hand it avoids
2619    adding more operand code to handle unusual encoding/decoding; on other
2620    hand, during the disassembling, the conversion is an effective approach to
2621    check the condition of an alias (as an alias may be adopted only if certain
2622    conditions are met).
2623 
2624    In order to speed up the alias opcode lookup, aarch64-gen has preprocessed
2625    aarch64_opcode_table and generated aarch64_find_alias_opcode and
2626    aarch64_find_next_alias_opcode (in opcodes/aarch64-dis-2.c) to help.  */
2627 
2628 static void
2629 determine_disassembling_preference (struct aarch64_inst *inst,
2630 				    aarch64_operand_error *errors)
2631 {
2632   const aarch64_opcode *opcode;
2633   const aarch64_opcode *alias;
2634 
2635   opcode = inst->opcode;
2636 
2637   /* This opcode does not have an alias, so use itself.  */
2638   if (!opcode_has_alias (opcode))
2639     return;
2640 
2641   alias = aarch64_find_alias_opcode (opcode);
2642   assert (alias);
2643 
2644 #ifdef DEBUG_AARCH64
2645   if (debug_dump)
2646     {
2647       const aarch64_opcode *tmp = alias;
2648       printf ("####   LIST    orderd: ");
2649       while (tmp)
2650 	{
2651 	  printf ("%s, ", tmp->name);
2652 	  tmp = aarch64_find_next_alias_opcode (tmp);
2653 	}
2654       printf ("\n");
2655     }
2656 #endif /* DEBUG_AARCH64 */
2657 
2658   for (; alias; alias = aarch64_find_next_alias_opcode (alias))
2659     {
2660       DEBUG_TRACE ("try %s", alias->name);
2661       assert (alias_opcode_p (alias) || opcode_has_alias (opcode));
2662 
2663       /* An alias can be a pseudo opcode which will never be used in the
2664 	 disassembly, e.g. BIC logical immediate is such a pseudo opcode
2665 	 aliasing AND.  */
2666       if (pseudo_opcode_p (alias))
2667 	{
2668 	  DEBUG_TRACE ("skip pseudo %s", alias->name);
2669 	  continue;
2670 	}
2671 
2672       if ((inst->value & alias->mask) != alias->opcode)
2673 	{
2674 	  DEBUG_TRACE ("skip %s as base opcode not match", alias->name);
2675 	  continue;
2676 	}
2677       /* No need to do any complicated transformation on operands, if the alias
2678 	 opcode does not have any operand.  */
2679       if (aarch64_num_of_operands (alias) == 0 && alias->opcode == inst->value)
2680 	{
2681 	  DEBUG_TRACE ("succeed with 0-operand opcode %s", alias->name);
2682 	  aarch64_replace_opcode (inst, alias);
2683 	  return;
2684 	}
2685       if (alias->flags & F_CONV)
2686 	{
2687 	  aarch64_inst copy;
2688 	  memcpy (&copy, inst, sizeof (aarch64_inst));
2689 	  /* ALIAS is the preference as long as the instruction can be
2690 	     successfully converted to the form of ALIAS.  */
2691 	  if (convert_to_alias (&copy, alias) == 1)
2692 	    {
2693 	      aarch64_replace_opcode (&copy, alias);
2694 	      assert (aarch64_match_operands_constraint (&copy, NULL));
2695 	      DEBUG_TRACE ("succeed with %s via conversion", alias->name);
2696 	      memcpy (inst, &copy, sizeof (aarch64_inst));
2697 	      return;
2698 	    }
2699 	}
2700       else
2701 	{
2702 	  /* Directly decode the alias opcode.  */
2703 	  aarch64_inst temp;
2704 	  memset (&temp, '\0', sizeof (aarch64_inst));
2705 	  if (aarch64_opcode_decode (alias, inst->value, &temp, 1, errors) == 1)
2706 	    {
2707 	      DEBUG_TRACE ("succeed with %s via direct decoding", alias->name);
2708 	      memcpy (inst, &temp, sizeof (aarch64_inst));
2709 	      return;
2710 	    }
2711 	}
2712     }
2713 }
2714 
2715 /* Some instructions (including all SVE ones) use the instruction class
2716    to describe how a qualifiers_list index is represented in the instruction
2717    encoding.  If INST is such an instruction, decode the appropriate fields
2718    and fill in the operand qualifiers accordingly.  Return true if no
2719    problems are found.  */
2720 
2721 static bfd_boolean
2722 aarch64_decode_variant_using_iclass (aarch64_inst *inst)
2723 {
2724   int i, variant;
2725 
2726   variant = 0;
2727   switch (inst->opcode->iclass)
2728     {
2729     case sve_cpy:
2730       variant = extract_fields (inst->value, 0, 2, FLD_size, FLD_SVE_M_14);
2731       break;
2732 
2733     case sve_index:
2734       i = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_imm5);
2735       if ((i & 31) == 0)
2736 	return FALSE;
2737       while ((i & 1) == 0)
2738 	{
2739 	  i >>= 1;
2740 	  variant += 1;
2741 	}
2742       break;
2743 
2744     case sve_limm:
2745       /* Pick the smallest applicable element size.  */
2746       if ((inst->value & 0x20600) == 0x600)
2747 	variant = 0;
2748       else if ((inst->value & 0x20400) == 0x400)
2749 	variant = 1;
2750       else if ((inst->value & 0x20000) == 0)
2751 	variant = 2;
2752       else
2753 	variant = 3;
2754       break;
2755 
2756     case sve_misc:
2757       /* sve_misc instructions have only a single variant.  */
2758       break;
2759 
2760     case sve_movprfx:
2761       variant = extract_fields (inst->value, 0, 2, FLD_size, FLD_SVE_M_16);
2762       break;
2763 
2764     case sve_pred_zm:
2765       variant = extract_field (FLD_SVE_M_4, inst->value, 0);
2766       break;
2767 
2768     case sve_shift_pred:
2769       i = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_SVE_tszl_8);
2770     sve_shift:
2771       if (i == 0)
2772 	return FALSE;
2773       while (i != 1)
2774 	{
2775 	  i >>= 1;
2776 	  variant += 1;
2777 	}
2778       break;
2779 
2780     case sve_shift_unpred:
2781       i = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_SVE_tszl_19);
2782       goto sve_shift;
2783 
2784     case sve_size_bhs:
2785       variant = extract_field (FLD_size, inst->value, 0);
2786       if (variant >= 3)
2787 	return FALSE;
2788       break;
2789 
2790     case sve_size_bhsd:
2791       variant = extract_field (FLD_size, inst->value, 0);
2792       break;
2793 
2794     case sve_size_hsd:
2795       i = extract_field (FLD_size, inst->value, 0);
2796       if (i < 1)
2797 	return FALSE;
2798       variant = i - 1;
2799       break;
2800 
2801     case sve_size_sd:
2802       variant = extract_field (FLD_SVE_sz, inst->value, 0);
2803       break;
2804 
2805     default:
2806       /* No mapping between instruction class and qualifiers.  */
2807       return TRUE;
2808     }
2809 
2810   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2811     inst->operands[i].qualifier = inst->opcode->qualifiers_list[variant][i];
2812   return TRUE;
2813 }
2814 /* Decode the CODE according to OPCODE; fill INST.  Return 0 if the decoding
2815    fails, which meanes that CODE is not an instruction of OPCODE; otherwise
2816    return 1.
2817 
2818    If OPCODE has alias(es) and NOALIASES_P is 0, an alias opcode may be
2819    determined and used to disassemble CODE; this is done just before the
2820    return.  */
2821 
2822 static bfd_boolean
2823 aarch64_opcode_decode (const aarch64_opcode *opcode, const aarch64_insn code,
2824 		       aarch64_inst *inst, int noaliases_p,
2825 		       aarch64_operand_error *errors)
2826 {
2827   int i;
2828 
2829   DEBUG_TRACE ("enter with %s", opcode->name);
2830 
2831   assert (opcode && inst);
2832 
2833   /* Clear inst.  */
2834   memset (inst, '\0', sizeof (aarch64_inst));
2835 
2836   /* Check the base opcode.  */
2837   if ((code & opcode->mask) != (opcode->opcode & opcode->mask))
2838     {
2839       DEBUG_TRACE ("base opcode match FAIL");
2840       goto decode_fail;
2841     }
2842 
2843   inst->opcode = opcode;
2844   inst->value = code;
2845 
2846   /* Assign operand codes and indexes.  */
2847   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2848     {
2849       if (opcode->operands[i] == AARCH64_OPND_NIL)
2850 	break;
2851       inst->operands[i].type = opcode->operands[i];
2852       inst->operands[i].idx = i;
2853     }
2854 
2855   /* Call the opcode decoder indicated by flags.  */
2856   if (opcode_has_special_coder (opcode) && do_special_decoding (inst) == 0)
2857     {
2858       DEBUG_TRACE ("opcode flag-based decoder FAIL");
2859       goto decode_fail;
2860     }
2861 
2862   /* Possibly use the instruction class to determine the correct
2863      qualifier.  */
2864   if (!aarch64_decode_variant_using_iclass (inst))
2865     {
2866       DEBUG_TRACE ("iclass-based decoder FAIL");
2867       goto decode_fail;
2868     }
2869 
2870   /* Call operand decoders.  */
2871   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2872     {
2873       const aarch64_operand *opnd;
2874       enum aarch64_opnd type;
2875 
2876       type = opcode->operands[i];
2877       if (type == AARCH64_OPND_NIL)
2878 	break;
2879       opnd = &aarch64_operands[type];
2880       if (operand_has_extractor (opnd)
2881 	  && (! aarch64_extract_operand (opnd, &inst->operands[i], code, inst,
2882 					 errors)))
2883 	{
2884 	  DEBUG_TRACE ("operand decoder FAIL at operand %d", i);
2885 	  goto decode_fail;
2886 	}
2887     }
2888 
2889   /* If the opcode has a verifier, then check it now.  */
2890   if (opcode->verifier && ! opcode->verifier (opcode, code))
2891     {
2892       DEBUG_TRACE ("operand verifier FAIL");
2893       goto decode_fail;
2894     }
2895 
2896   /* Match the qualifiers.  */
2897   if (aarch64_match_operands_constraint (inst, NULL) == 1)
2898     {
2899       /* Arriving here, the CODE has been determined as a valid instruction
2900 	 of OPCODE and *INST has been filled with information of this OPCODE
2901 	 instruction.  Before the return, check if the instruction has any
2902 	 alias and should be disassembled in the form of its alias instead.
2903 	 If the answer is yes, *INST will be updated.  */
2904       if (!noaliases_p)
2905 	determine_disassembling_preference (inst, errors);
2906       DEBUG_TRACE ("SUCCESS");
2907       return TRUE;
2908     }
2909   else
2910     {
2911       DEBUG_TRACE ("constraint matching FAIL");
2912     }
2913 
2914 decode_fail:
2915   return FALSE;
2916 }
2917 
2918 /* This does some user-friendly fix-up to *INST.  It is currently focus on
2919    the adjustment of qualifiers to help the printed instruction
2920    recognized/understood more easily.  */
2921 
2922 static void
2923 user_friendly_fixup (aarch64_inst *inst)
2924 {
2925   switch (inst->opcode->iclass)
2926     {
2927     case testbranch:
2928       /* TBNZ Xn|Wn, #uimm6, label
2929 	 Test and Branch Not Zero: conditionally jumps to label if bit number
2930 	 uimm6 in register Xn is not zero.  The bit number implies the width of
2931 	 the register, which may be written and should be disassembled as Wn if
2932 	 uimm is less than 32. Limited to a branch offset range of +/- 32KiB.
2933 	 */
2934       if (inst->operands[1].imm.value < 32)
2935 	inst->operands[0].qualifier = AARCH64_OPND_QLF_W;
2936       break;
2937     default: break;
2938     }
2939 }
2940 
2941 /* Decode INSN and fill in *INST the instruction information.  An alias
2942    opcode may be filled in *INSN if NOALIASES_P is FALSE.  Return zero on
2943    success.  */
2944 
2945 int
2946 aarch64_decode_insn (aarch64_insn insn, aarch64_inst *inst,
2947 		     bfd_boolean noaliases_p,
2948 		     aarch64_operand_error *errors)
2949 {
2950   const aarch64_opcode *opcode = aarch64_opcode_lookup (insn);
2951 
2952 #ifdef DEBUG_AARCH64
2953   if (debug_dump)
2954     {
2955       const aarch64_opcode *tmp = opcode;
2956       printf ("\n");
2957       DEBUG_TRACE ("opcode lookup:");
2958       while (tmp != NULL)
2959 	{
2960 	  aarch64_verbose ("  %s", tmp->name);
2961 	  tmp = aarch64_find_next_opcode (tmp);
2962 	}
2963     }
2964 #endif /* DEBUG_AARCH64 */
2965 
2966   /* A list of opcodes may have been found, as aarch64_opcode_lookup cannot
2967      distinguish some opcodes, e.g. SSHR and MOVI, which almost share the same
2968      opcode field and value, apart from the difference that one of them has an
2969      extra field as part of the opcode, but such a field is used for operand
2970      encoding in other opcode(s) ('immh' in the case of the example).  */
2971   while (opcode != NULL)
2972     {
2973       /* But only one opcode can be decoded successfully for, as the
2974 	 decoding routine will check the constraint carefully.  */
2975       if (aarch64_opcode_decode (opcode, insn, inst, noaliases_p, errors) == 1)
2976 	return ERR_OK;
2977       opcode = aarch64_find_next_opcode (opcode);
2978     }
2979 
2980   return ERR_UND;
2981 }
2982 
2983 /* Print operands.  */
2984 
2985 static void
2986 print_operands (bfd_vma pc, const aarch64_opcode *opcode,
2987 		const aarch64_opnd_info *opnds, struct disassemble_info *info)
2988 {
2989   int i, pcrel_p, num_printed;
2990   char *notes = NULL;
2991   for (i = 0, num_printed = 0; i < AARCH64_MAX_OPND_NUM; ++i)
2992     {
2993       char str[128];
2994       /* We regard the opcode operand info more, however we also look into
2995 	 the inst->operands to support the disassembling of the optional
2996 	 operand.
2997 	 The two operand code should be the same in all cases, apart from
2998 	 when the operand can be optional.  */
2999       if (opcode->operands[i] == AARCH64_OPND_NIL
3000 	  || opnds[i].type == AARCH64_OPND_NIL)
3001 	break;
3002 
3003       /* Generate the operand string in STR.  */
3004       aarch64_print_operand (str, sizeof (str), pc, opcode, opnds, i, &pcrel_p,
3005 			     &info->target, &notes);
3006 
3007       /* Print the delimiter (taking account of omitted operand(s)).  */
3008       if (str[0] != '\0')
3009 	(*info->fprintf_func) (info->stream, "%s",
3010 			       num_printed++ == 0 ? "\t" : ", ");
3011 
3012       /* Print the operand.  */
3013       if (pcrel_p)
3014 	(*info->print_address_func) (info->target, info);
3015       else
3016 	(*info->fprintf_func) (info->stream, "%s", str);
3017     }
3018 
3019     if (notes && !no_notes)
3020       (*info->fprintf_func) (info->stream, "\t; note: %s", notes);
3021 }
3022 
3023 /* Set NAME to a copy of INST's mnemonic with the "." suffix removed.  */
3024 
3025 static void
3026 remove_dot_suffix (char *name, const aarch64_inst *inst)
3027 {
3028   char *ptr;
3029   size_t len;
3030 
3031   ptr = strchr (inst->opcode->name, '.');
3032   assert (ptr && inst->cond);
3033   len = ptr - inst->opcode->name;
3034   assert (len < 8);
3035   strncpy (name, inst->opcode->name, len);
3036   name[len] = '\0';
3037 }
3038 
3039 /* Print the instruction mnemonic name.  */
3040 
3041 static void
3042 print_mnemonic_name (const aarch64_inst *inst, struct disassemble_info *info)
3043 {
3044   if (inst->opcode->flags & F_COND)
3045     {
3046       /* For instructions that are truly conditionally executed, e.g. b.cond,
3047 	 prepare the full mnemonic name with the corresponding condition
3048 	 suffix.  */
3049       char name[8];
3050 
3051       remove_dot_suffix (name, inst);
3052       (*info->fprintf_func) (info->stream, "%s.%s", name, inst->cond->names[0]);
3053     }
3054   else
3055     (*info->fprintf_func) (info->stream, "%s", inst->opcode->name);
3056 }
3057 
3058 /* Decide whether we need to print a comment after the operands of
3059    instruction INST.  */
3060 
3061 static void
3062 print_comment (const aarch64_inst *inst, struct disassemble_info *info)
3063 {
3064   if (inst->opcode->flags & F_COND)
3065     {
3066       char name[8];
3067       unsigned int i, num_conds;
3068 
3069       remove_dot_suffix (name, inst);
3070       num_conds = ARRAY_SIZE (inst->cond->names);
3071       for (i = 1; i < num_conds && inst->cond->names[i]; ++i)
3072 	(*info->fprintf_func) (info->stream, "%s %s.%s",
3073 			       i == 1 ? "  //" : ",",
3074 			       name, inst->cond->names[i]);
3075     }
3076 }
3077 
3078 /* Print the instruction according to *INST.  */
3079 
3080 static void
3081 print_aarch64_insn (bfd_vma pc, const aarch64_inst *inst,
3082 		    struct disassemble_info *info)
3083 {
3084   print_mnemonic_name (inst, info);
3085   print_operands (pc, inst->opcode, inst->operands, info);
3086   print_comment (inst, info);
3087 }
3088 
3089 /* Entry-point of the instruction disassembler and printer.  */
3090 
3091 static void
3092 print_insn_aarch64_word (bfd_vma pc,
3093 			 uint32_t word,
3094 			 struct disassemble_info *info,
3095 			 aarch64_operand_error *errors)
3096 {
3097   static const char *err_msg[6] =
3098     {
3099       [ERR_OK]   = "_",
3100       [-ERR_UND] = "undefined",
3101       [-ERR_UNP] = "unpredictable",
3102       [-ERR_NYI] = "NYI"
3103     };
3104 
3105   int ret;
3106   aarch64_inst inst;
3107 
3108   info->insn_info_valid = 1;
3109   info->branch_delay_insns = 0;
3110   info->data_size = 0;
3111   info->target = 0;
3112   info->target2 = 0;
3113 
3114   if (info->flags & INSN_HAS_RELOC)
3115     /* If the instruction has a reloc associated with it, then
3116        the offset field in the instruction will actually be the
3117        addend for the reloc.  (If we are using REL type relocs).
3118        In such cases, we can ignore the pc when computing
3119        addresses, since the addend is not currently pc-relative.  */
3120     pc = 0;
3121 
3122   ret = aarch64_decode_insn (word, &inst, no_aliases, errors);
3123 
3124   if (((word >> 21) & 0x3ff) == 1)
3125     {
3126       /* RESERVED for ALES.  */
3127       assert (ret != ERR_OK);
3128       ret = ERR_NYI;
3129     }
3130 
3131   switch (ret)
3132     {
3133     case ERR_UND:
3134     case ERR_UNP:
3135     case ERR_NYI:
3136       /* Handle undefined instructions.  */
3137       info->insn_type = dis_noninsn;
3138       (*info->fprintf_func) (info->stream,".inst\t0x%08x ; %s",
3139 			     word, err_msg[-ret]);
3140       break;
3141     case ERR_OK:
3142       user_friendly_fixup (&inst);
3143       print_aarch64_insn (pc, &inst, info);
3144       break;
3145     default:
3146       abort ();
3147     }
3148 }
3149 
3150 /* Disallow mapping symbols ($x, $d etc) from
3151    being displayed in symbol relative addresses.  */
3152 
3153 bfd_boolean
3154 aarch64_symbol_is_valid (asymbol * sym,
3155 			 struct disassemble_info * info ATTRIBUTE_UNUSED)
3156 {
3157   const char * name;
3158 
3159   if (sym == NULL)
3160     return FALSE;
3161 
3162   name = bfd_asymbol_name (sym);
3163 
3164   return name
3165     && (name[0] != '$'
3166 	|| (name[1] != 'x' && name[1] != 'd')
3167 	|| (name[2] != '\0' && name[2] != '.'));
3168 }
3169 
3170 /* Print data bytes on INFO->STREAM.  */
3171 
3172 static void
3173 print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED,
3174 		 uint32_t word,
3175 		 struct disassemble_info *info,
3176 		 aarch64_operand_error *errors ATTRIBUTE_UNUSED)
3177 {
3178   switch (info->bytes_per_chunk)
3179     {
3180     case 1:
3181       info->fprintf_func (info->stream, ".byte\t0x%02x", word);
3182       break;
3183     case 2:
3184       info->fprintf_func (info->stream, ".short\t0x%04x", word);
3185       break;
3186     case 4:
3187       info->fprintf_func (info->stream, ".word\t0x%08x", word);
3188       break;
3189     default:
3190       abort ();
3191     }
3192 }
3193 
3194 /* Try to infer the code or data type from a symbol.
3195    Returns nonzero if *MAP_TYPE was set.  */
3196 
3197 static int
3198 get_sym_code_type (struct disassemble_info *info, int n,
3199 		   enum map_type *map_type)
3200 {
3201   elf_symbol_type *es;
3202   unsigned int type;
3203   const char *name;
3204 
3205   /* If the symbol is in a different section, ignore it.  */
3206   if (info->section != NULL && info->section != info->symtab[n]->section)
3207     return FALSE;
3208 
3209   es = *(elf_symbol_type **)(info->symtab + n);
3210   type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
3211 
3212   /* If the symbol has function type then use that.  */
3213   if (type == STT_FUNC)
3214     {
3215       *map_type = MAP_INSN;
3216       return TRUE;
3217     }
3218 
3219   /* Check for mapping symbols.  */
3220   name = bfd_asymbol_name(info->symtab[n]);
3221   if (name[0] == '$'
3222       && (name[1] == 'x' || name[1] == 'd')
3223       && (name[2] == '\0' || name[2] == '.'))
3224     {
3225       *map_type = (name[1] == 'x' ? MAP_INSN : MAP_DATA);
3226       return TRUE;
3227     }
3228 
3229   return FALSE;
3230 }
3231 
3232 /* Entry-point of the AArch64 disassembler.  */
3233 
3234 int
3235 print_insn_aarch64 (bfd_vma pc,
3236 		    struct disassemble_info *info)
3237 {
3238   bfd_byte	buffer[INSNLEN];
3239   int		status;
3240   void		(*printer) (bfd_vma, uint32_t, struct disassemble_info *,
3241 			    aarch64_operand_error *);
3242   bfd_boolean   found = FALSE;
3243   unsigned int	size = 4;
3244   unsigned long	data;
3245   aarch64_operand_error errors;
3246 
3247   if (info->disassembler_options)
3248     {
3249       set_default_aarch64_dis_options (info);
3250 
3251       parse_aarch64_dis_options (info->disassembler_options);
3252 
3253       /* To avoid repeated parsing of these options, we remove them here.  */
3254       info->disassembler_options = NULL;
3255     }
3256 
3257   /* Aarch64 instructions are always little-endian */
3258   info->endian_code = BFD_ENDIAN_LITTLE;
3259 
3260   /* First check the full symtab for a mapping symbol, even if there
3261      are no usable non-mapping symbols for this address.  */
3262   if (info->symtab_size != 0
3263       && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour)
3264     {
3265       enum map_type type = MAP_INSN;
3266       int last_sym = -1;
3267       bfd_vma addr;
3268       int n;
3269 
3270       if (pc <= last_mapping_addr)
3271 	last_mapping_sym = -1;
3272 
3273       /* Start scanning at the start of the function, or wherever
3274 	 we finished last time.  */
3275       n = info->symtab_pos + 1;
3276       if (n < last_mapping_sym)
3277 	n = last_mapping_sym;
3278 
3279       /* Scan up to the location being disassembled.  */
3280       for (; n < info->symtab_size; n++)
3281 	{
3282 	  addr = bfd_asymbol_value (info->symtab[n]);
3283 	  if (addr > pc)
3284 	    break;
3285 	  if (get_sym_code_type (info, n, &type))
3286 	    {
3287 	      last_sym = n;
3288 	      found = TRUE;
3289 	    }
3290 	}
3291 
3292       if (!found)
3293 	{
3294 	  n = info->symtab_pos;
3295 	  if (n < last_mapping_sym)
3296 	    n = last_mapping_sym;
3297 
3298 	  /* No mapping symbol found at this address.  Look backwards
3299 	     for a preceeding one.  */
3300 	  for (; n >= 0; n--)
3301 	    {
3302 	      if (get_sym_code_type (info, n, &type))
3303 		{
3304 		  last_sym = n;
3305 		  found = TRUE;
3306 		  break;
3307 		}
3308 	    }
3309 	}
3310 
3311       last_mapping_sym = last_sym;
3312       last_type = type;
3313 
3314       /* Look a little bit ahead to see if we should print out
3315 	 less than four bytes of data.  If there's a symbol,
3316 	 mapping or otherwise, after two bytes then don't
3317 	 print more.  */
3318       if (last_type == MAP_DATA)
3319 	{
3320 	  size = 4 - (pc & 3);
3321 	  for (n = last_sym + 1; n < info->symtab_size; n++)
3322 	    {
3323 	      addr = bfd_asymbol_value (info->symtab[n]);
3324 	      if (addr > pc)
3325 		{
3326 		  if (addr - pc < size)
3327 		    size = addr - pc;
3328 		  break;
3329 		}
3330 	    }
3331 	  /* If the next symbol is after three bytes, we need to
3332 	     print only part of the data, so that we can use either
3333 	     .byte or .short.  */
3334 	  if (size == 3)
3335 	    size = (pc & 1) ? 1 : 2;
3336 	}
3337     }
3338 
3339   if (last_type == MAP_DATA)
3340     {
3341       /* size was set above.  */
3342       info->bytes_per_chunk = size;
3343       info->display_endian = info->endian;
3344       printer = print_insn_data;
3345     }
3346   else
3347     {
3348       info->bytes_per_chunk = size = INSNLEN;
3349       info->display_endian = info->endian_code;
3350       printer = print_insn_aarch64_word;
3351     }
3352 
3353   status = (*info->read_memory_func) (pc, buffer, size, info);
3354   if (status != 0)
3355     {
3356       (*info->memory_error_func) (status, pc, info);
3357       return -1;
3358     }
3359 
3360   data = bfd_get_bits (buffer, size * 8,
3361 		       info->display_endian == BFD_ENDIAN_BIG);
3362 
3363   (*printer) (pc, data, info, &errors);
3364 
3365   return size;
3366 }
3367 
3368 void
3369 print_aarch64_disassembler_options (FILE *stream)
3370 {
3371   fprintf (stream, _("\n\
3372 The following AARCH64 specific disassembler options are supported for use\n\
3373 with the -M switch (multiple options should be separated by commas):\n"));
3374 
3375   fprintf (stream, _("\n\
3376   no-aliases         Don't print instruction aliases.\n"));
3377 
3378   fprintf (stream, _("\n\
3379   aliases            Do print instruction aliases.\n"));
3380 
3381   fprintf (stream, _("\n\
3382   no-notes         Don't print instruction notes.\n"));
3383 
3384   fprintf (stream, _("\n\
3385   notes            Do print instruction notes.\n"));
3386 
3387 #ifdef DEBUG_AARCH64
3388   fprintf (stream, _("\n\
3389   debug_dump         Temp switch for debug trace.\n"));
3390 #endif /* DEBUG_AARCH64 */
3391 
3392   fprintf (stream, _("\n"));
3393 }
3394