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