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