Coverage Report

Created: 2023-08-28 06:31

/src/binutils-gdb/opcodes/aarch64-dis.c
Line
Count
Source (jump to first uncovered line)
1
/* aarch64-dis.c -- AArch64 disassembler.
2
   Copyright (C) 2009-2023 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 <stdint.h>
23
#include "disassemble.h"
24
#include "libiberty.h"
25
#include "opintl.h"
26
#include "aarch64-dis.h"
27
#include "elf-bfd.h"
28
#include "safe-ctype.h"
29
#include "obstack.h"
30
31
#define obstack_chunk_alloc xmalloc
32
#define obstack_chunk_free free
33
34
21.4M
#define INSNLEN 4
35
36
/* This character is used to encode style information within the output
37
   buffers.  See get_style_text and print_operands for more details.  */
38
304M
#define STYLE_MARKER_CHAR '\002'
39
40
/* Cached mapping symbol state.  */
41
enum map_type
42
{
43
  MAP_INSN,
44
  MAP_DATA
45
};
46
47
static aarch64_feature_set arch_variant; /* See select_aarch64_variant.  */
48
static enum map_type last_type;
49
static int last_mapping_sym = -1;
50
static bfd_vma last_stop_offset = 0;
51
static bfd_vma last_mapping_addr = 0;
52
53
/* Other options */
54
static int no_aliases = 0;  /* If set disassemble as most general inst.  */
55
static int no_notes = 1; /* If set do not print disassemble notes in the
56
          output as comments.  */
57
58
/* Currently active instruction sequence.  */
59
static aarch64_instr_sequence insn_sequence;
60
61
static void
62
set_default_aarch64_dis_options (struct disassemble_info *info ATTRIBUTE_UNUSED)
63
0
{
64
0
}
65
66
static void
67
parse_aarch64_dis_option (const char *option, unsigned int len ATTRIBUTE_UNUSED)
68
0
{
69
  /* Try to match options that are simple flags */
70
0
  if (startswith (option, "no-aliases"))
71
0
    {
72
0
      no_aliases = 1;
73
0
      return;
74
0
    }
75
76
0
  if (startswith (option, "aliases"))
77
0
    {
78
0
      no_aliases = 0;
79
0
      return;
80
0
    }
81
82
0
  if (startswith (option, "no-notes"))
83
0
    {
84
0
      no_notes = 1;
85
0
      return;
86
0
    }
87
88
0
  if (startswith (option, "notes"))
89
0
    {
90
0
      no_notes = 0;
91
0
      return;
92
0
    }
93
94
#ifdef DEBUG_AARCH64
95
  if (startswith (option, "debug_dump"))
96
    {
97
      debug_dump = 1;
98
      return;
99
    }
100
#endif /* DEBUG_AARCH64 */
101
102
  /* Invalid option.  */
103
0
  opcodes_error_handler (_("unrecognised disassembler option: %s"), option);
104
0
}
105
106
static void
107
parse_aarch64_dis_options (const char *options)
108
0
{
109
0
  const char *option_end;
110
111
0
  if (options == NULL)
112
0
    return;
113
114
0
  while (*options != '\0')
115
0
    {
116
      /* Skip empty options.  */
117
0
      if (*options == ',')
118
0
  {
119
0
    options++;
120
0
    continue;
121
0
  }
122
123
      /* We know that *options is neither NUL or a comma.  */
124
0
      option_end = options + 1;
125
0
      while (*option_end != ',' && *option_end != '\0')
126
0
  option_end++;
127
128
0
      parse_aarch64_dis_option (options, option_end - options);
129
130
      /* Go on to the next one.  If option_end points to a comma, it
131
   will be skipped above.  */
132
0
      options = option_end;
133
0
    }
134
0
}
135

136
/* Functions doing the instruction disassembling.  */
137
138
/* The unnamed arguments consist of the number of fields and information about
139
   these fields where the VALUE will be extracted from CODE and returned.
140
   MASK can be zero or the base mask of the opcode.
141
142
   N.B. the fields are required to be in such an order than the most signficant
143
   field for VALUE comes the first, e.g. the <index> in
144
    SQDMLAL <Va><d>, <Vb><n>, <Vm>.<Ts>[<index>]
145
   is encoded in H:L:M in some cases, the fields H:L:M should be passed in
146
   the order of H, L, M.  */
147
148
aarch64_insn
149
extract_fields (aarch64_insn code, aarch64_insn mask, ...)
150
2.03M
{
151
2.03M
  uint32_t num;
152
2.03M
  const aarch64_field *field;
153
2.03M
  enum aarch64_field_kind kind;
154
2.03M
  va_list va;
155
156
2.03M
  va_start (va, mask);
157
2.03M
  num = va_arg (va, uint32_t);
158
2.03M
  assert (num <= 5);
159
2.03M
  aarch64_insn value = 0x0;
160
6.78M
  while (num--)
161
4.74M
    {
162
4.74M
      kind = va_arg (va, enum aarch64_field_kind);
163
4.74M
      field = &fields[kind];
164
4.74M
      value <<= field->width;
165
4.74M
      value |= extract_field (kind, code, mask);
166
4.74M
    }
167
2.03M
  va_end (va);
168
2.03M
  return value;
169
2.03M
}
170
171
/* Extract the value of all fields in SELF->fields after START from
172
   instruction CODE.  The least significant bit comes from the final field.  */
173
174
static aarch64_insn
175
extract_all_fields_after (const aarch64_operand *self, unsigned int start,
176
        aarch64_insn code)
177
5.08M
{
178
5.08M
  aarch64_insn value;
179
5.08M
  unsigned int i;
180
5.08M
  enum aarch64_field_kind kind;
181
182
5.08M
  value = 0;
183
5.08M
  for (i = start;
184
11.2M
       i < ARRAY_SIZE (self->fields) && self->fields[i] != FLD_NIL; ++i)
185
6.11M
    {
186
6.11M
      kind = self->fields[i];
187
6.11M
      value <<= fields[kind].width;
188
6.11M
      value |= extract_field (kind, code, 0);
189
6.11M
    }
190
5.08M
  return value;
191
5.08M
}
192
193
/* Extract the value of all fields in SELF->fields from instruction CODE.
194
   The least significant bit comes from the final field.  */
195
196
static aarch64_insn
197
extract_all_fields (const aarch64_operand *self, aarch64_insn code)
198
5.07M
{
199
5.07M
  return extract_all_fields_after (self, 0, code);
200
5.07M
}
201
202
/* Sign-extend bit I of VALUE.  */
203
static inline uint64_t
204
sign_extend (aarch64_insn value, unsigned i)
205
3.09M
{
206
3.09M
  uint64_t ret, sign;
207
208
3.09M
  assert (i < 32);
209
3.09M
  ret = value;
210
3.09M
  sign = (uint64_t) 1 << i;
211
3.09M
  return ((ret & (sign + sign - 1)) ^ sign) - sign;
212
3.09M
}
213
214
/* N.B. the following inline helpfer functions create a dependency on the
215
   order of operand qualifier enumerators.  */
216
217
/* Given VALUE, return qualifier for a general purpose register.  */
218
static inline enum aarch64_opnd_qualifier
219
get_greg_qualifier_from_value (aarch64_insn value)
220
3.83M
{
221
3.83M
  enum aarch64_opnd_qualifier qualifier = AARCH64_OPND_QLF_W + value;
222
3.83M
  assert (value <= 0x1
223
3.83M
    && aarch64_get_qualifier_standard_value (qualifier) == value);
224
3.83M
  return qualifier;
225
3.83M
}
226
227
/* Given VALUE, return qualifier for a vector register.  This does not support
228
   decoding instructions that accept the 2H vector type.  */
229
230
static inline enum aarch64_opnd_qualifier
231
get_vreg_qualifier_from_value (aarch64_insn value)
232
286k
{
233
286k
  enum aarch64_opnd_qualifier qualifier = AARCH64_OPND_QLF_V_8B + value;
234
235
  /* Instructions using vector type 2H should not call this function.  Skip over
236
     the 2H qualifier.  */
237
286k
  if (qualifier >= AARCH64_OPND_QLF_V_2H)
238
208k
    qualifier += 1;
239
240
286k
  assert (value <= 0x8
241
286k
    && aarch64_get_qualifier_standard_value (qualifier) == value);
242
286k
  return qualifier;
243
286k
}
244
245
/* Given VALUE, return qualifier for an FP or AdvSIMD scalar register.  */
246
static inline enum aarch64_opnd_qualifier
247
get_sreg_qualifier_from_value (aarch64_insn value)
248
266k
{
249
266k
  enum aarch64_opnd_qualifier qualifier = AARCH64_OPND_QLF_S_B + value;
250
251
266k
  assert (value <= 0x4
252
266k
    && aarch64_get_qualifier_standard_value (qualifier) == value);
253
266k
  return qualifier;
254
266k
}
255
256
/* Given the instruction in *INST which is probably half way through the
257
   decoding and our caller wants to know the expected qualifier for operand
258
   I.  Return such a qualifier if we can establish it; otherwise return
259
   AARCH64_OPND_QLF_NIL.  */
260
261
static aarch64_opnd_qualifier_t
262
get_expected_qualifier (const aarch64_inst *inst, int i)
263
1.54M
{
264
1.54M
  aarch64_opnd_qualifier_seq_t qualifiers;
265
  /* Should not be called if the qualifier is known.  */
266
1.54M
  assert (inst->operands[i].qualifier == AARCH64_OPND_QLF_NIL);
267
1.54M
  int invalid_count;
268
1.54M
  if (aarch64_find_best_match (inst, inst->opcode->qualifiers_list,
269
1.54M
             i, qualifiers, &invalid_count))
270
1.50M
    return qualifiers[i];
271
36.1k
  else
272
36.1k
    return AARCH64_OPND_QLF_NIL;
273
1.54M
}
274
275
/* Operand extractors.  */
276
277
bool
278
aarch64_ext_none (const aarch64_operand *self ATTRIBUTE_UNUSED,
279
      aarch64_opnd_info *info ATTRIBUTE_UNUSED,
280
      const aarch64_insn code ATTRIBUTE_UNUSED,
281
      const aarch64_inst *inst ATTRIBUTE_UNUSED,
282
      aarch64_operand_error *errors ATTRIBUTE_UNUSED)
283
226
{
284
226
  return true;
285
226
}
286
287
bool
288
aarch64_ext_regno (const aarch64_operand *self, aarch64_opnd_info *info,
289
       const aarch64_insn code,
290
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
291
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
292
13.0M
{
293
13.0M
  info->reg.regno = (extract_field (self->fields[0], code, 0)
294
13.0M
         + get_operand_specific_data (self));
295
13.0M
  return true;
296
13.0M
}
297
298
bool
299
aarch64_ext_regno_pair (const aarch64_operand *self ATTRIBUTE_UNUSED, aarch64_opnd_info *info,
300
       const aarch64_insn code ATTRIBUTE_UNUSED,
301
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
302
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
303
4.07k
{
304
4.07k
  assert (info->idx == 1
305
4.07k
    || info->idx ==3);
306
4.07k
  info->reg.regno = inst->operands[info->idx - 1].reg.regno + 1;
307
4.07k
  return true;
308
4.07k
}
309
310
/* e.g. IC <ic_op>{, <Xt>}.  */
311
bool
312
aarch64_ext_regrt_sysins (const aarch64_operand *self, aarch64_opnd_info *info,
313
        const aarch64_insn code,
314
        const aarch64_inst *inst ATTRIBUTE_UNUSED,
315
        aarch64_operand_error *errors ATTRIBUTE_UNUSED)
316
262
{
317
262
  info->reg.regno = extract_field (self->fields[0], code, 0);
318
262
  assert (info->idx == 1
319
262
    && (aarch64_get_operand_class (inst->operands[0].type)
320
262
        == AARCH64_OPND_CLASS_SYSTEM));
321
  /* This will make the constraint checking happy and more importantly will
322
     help the disassembler determine whether this operand is optional or
323
     not.  */
324
262
  info->present = aarch64_sys_ins_reg_has_xt (inst->operands[0].sysins_op);
325
326
262
  return true;
327
262
}
328
329
/* e.g. SQDMLAL <Va><d>, <Vb><n>, <Vm>.<Ts>[<index>].  */
330
bool
331
aarch64_ext_reglane (const aarch64_operand *self, aarch64_opnd_info *info,
332
         const aarch64_insn code,
333
         const aarch64_inst *inst ATTRIBUTE_UNUSED,
334
         aarch64_operand_error *errors ATTRIBUTE_UNUSED)
335
124k
{
336
  /* regno */
337
124k
  info->reglane.regno = extract_field (self->fields[0], code,
338
124k
               inst->opcode->mask);
339
340
  /* Index and/or type.  */
341
124k
  if (inst->opcode->iclass == asisdone
342
124k
    || inst->opcode->iclass == asimdins)
343
11.0k
    {
344
11.0k
      if (info->type == AARCH64_OPND_En
345
11.0k
    && inst->opcode->operands[0] == AARCH64_OPND_Ed)
346
3.78k
  {
347
3.78k
    unsigned shift;
348
    /* index2 for e.g. INS <Vd>.<Ts>[<index1>], <Vn>.<Ts>[<index2>].  */
349
3.78k
    assert (info->idx == 1);  /* Vn */
350
3.78k
    aarch64_insn value = extract_field (FLD_imm4_11, code, 0);
351
    /* Depend on AARCH64_OPND_Ed to determine the qualifier.  */
352
3.78k
    info->qualifier = get_expected_qualifier (inst, info->idx);
353
3.78k
    shift = get_logsz (aarch64_get_qualifier_esize (info->qualifier));
354
3.78k
    info->reglane.index = value >> shift;
355
3.78k
  }
356
7.24k
      else
357
7.24k
  {
358
    /* index and type for e.g. DUP <V><d>, <Vn>.<T>[<index>].
359
       imm5<3:0>  <V>
360
       0000 RESERVED
361
       xxx1 B
362
       xx10 H
363
       x100 S
364
       1000 D  */
365
7.24k
    int pos = -1;
366
7.24k
    aarch64_insn value = extract_field (FLD_imm5, code, 0);
367
18.0k
    while (++pos <= 3 && (value & 0x1) == 0)
368
10.7k
      value >>= 1;
369
7.24k
    if (pos > 3)
370
867
      return false;
371
6.38k
    info->qualifier = get_sreg_qualifier_from_value (pos);
372
6.38k
    info->reglane.index = (unsigned) (value >> 1);
373
6.38k
  }
374
11.0k
    }
375
113k
  else if (inst->opcode->iclass == dotproduct)
376
8.61k
    {
377
      /* Need information in other operand(s) to help decoding.  */
378
8.61k
      info->qualifier = get_expected_qualifier (inst, info->idx);
379
8.61k
      switch (info->qualifier)
380
8.61k
  {
381
3.98k
  case AARCH64_OPND_QLF_S_4B:
382
4.94k
  case AARCH64_OPND_QLF_S_2H:
383
    /* L:H */
384
4.94k
    info->reglane.index = extract_fields (code, 0, 2, FLD_H, FLD_L);
385
4.94k
    info->reglane.regno &= 0x1f;
386
4.94k
    break;
387
3.66k
  default:
388
3.66k
    return false;
389
8.61k
  }
390
8.61k
    }
391
104k
  else if (inst->opcode->iclass == cryptosm3)
392
1.67k
    {
393
      /* index for e.g. SM3TT2A <Vd>.4S, <Vn>.4S, <Vm>S[<imm2>].  */
394
1.67k
      info->reglane.index = extract_field (FLD_SM3_imm2, code, 0);
395
1.67k
    }
396
103k
  else
397
103k
    {
398
      /* Index only for e.g. SQDMLAL <Va><d>, <Vb><n>, <Vm>.<Ts>[<index>]
399
         or SQDMLAL <Va><d>, <Vb><n>, <Vm>.<Ts>[<index>].  */
400
401
      /* Need information in other operand(s) to help decoding.  */
402
103k
      info->qualifier = get_expected_qualifier (inst, info->idx);
403
103k
      switch (info->qualifier)
404
103k
  {
405
50.0k
  case AARCH64_OPND_QLF_S_H:
406
50.0k
    if (info->type == AARCH64_OPND_Em16)
407
40.9k
      {
408
        /* h:l:m */
409
40.9k
        info->reglane.index = extract_fields (code, 0, 3, FLD_H, FLD_L,
410
40.9k
                FLD_M);
411
40.9k
        info->reglane.regno &= 0xf;
412
40.9k
      }
413
9.08k
    else
414
9.08k
      {
415
        /* h:l */
416
9.08k
        info->reglane.index = extract_fields (code, 0, 2, FLD_H, FLD_L);
417
9.08k
      }
418
50.0k
    break;
419
18.4k
  case AARCH64_OPND_QLF_S_S:
420
    /* h:l */
421
18.4k
    info->reglane.index = extract_fields (code, 0, 2, FLD_H, FLD_L);
422
18.4k
    break;
423
2.25k
  case AARCH64_OPND_QLF_S_D:
424
    /* H */
425
2.25k
    info->reglane.index = extract_field (FLD_H, code, 0);
426
2.25k
    break;
427
32.5k
  default:
428
32.5k
    return false;
429
103k
  }
430
431
70.7k
      if (inst->opcode->op == OP_FCMLA_ELEM
432
70.7k
    && info->qualifier != AARCH64_OPND_QLF_S_H)
433
2.14k
  {
434
    /* Complex operand takes two elements.  */
435
2.14k
    if (info->reglane.index & 1)
436
950
      return false;
437
1.19k
    info->reglane.index /= 2;
438
1.19k
  }
439
70.7k
    }
440
441
86.6k
  return true;
442
124k
}
443
444
bool
445
aarch64_ext_reglist (const aarch64_operand *self, aarch64_opnd_info *info,
446
         const aarch64_insn code,
447
         const aarch64_inst *inst ATTRIBUTE_UNUSED,
448
         aarch64_operand_error *errors ATTRIBUTE_UNUSED)
449
17.3k
{
450
  /* R */
451
17.3k
  info->reglist.first_regno = extract_field (self->fields[0], code, 0);
452
  /* len */
453
17.3k
  info->reglist.num_regs = extract_field (FLD_len, code, 0) + 1;
454
17.3k
  info->reglist.stride = 1;
455
17.3k
  return true;
456
17.3k
}
457
458
/* Decode Rt and opcode fields of Vt in AdvSIMD load/store instructions.  */
459
bool
460
aarch64_ext_ldst_reglist (const aarch64_operand *self ATTRIBUTE_UNUSED,
461
        aarch64_opnd_info *info, const aarch64_insn code,
462
        const aarch64_inst *inst,
463
        aarch64_operand_error *errors ATTRIBUTE_UNUSED)
464
100k
{
465
100k
  aarch64_insn value;
466
  /* Number of elements in each structure to be loaded/stored.  */
467
100k
  unsigned expected_num = get_opcode_dependent_value (inst->opcode);
468
469
100k
  struct
470
100k
    {
471
100k
      unsigned is_reserved;
472
100k
      unsigned num_regs;
473
100k
      unsigned num_elements;
474
100k
    } data [] =
475
100k
  {   {0, 4, 4},
476
100k
      {1, 4, 4},
477
100k
      {0, 4, 1},
478
100k
      {0, 4, 2},
479
100k
      {0, 3, 3},
480
100k
      {1, 3, 3},
481
100k
      {0, 3, 1},
482
100k
      {0, 1, 1},
483
100k
      {0, 2, 2},
484
100k
      {1, 2, 2},
485
100k
      {0, 2, 1},
486
100k
  };
487
488
  /* Rt */
489
100k
  info->reglist.first_regno = extract_field (FLD_Rt, code, 0);
490
  /* opcode */
491
100k
  value = extract_field (FLD_opcode, code, 0);
492
  /* PR 21595: Check for a bogus value.  */
493
100k
  if (value >= ARRAY_SIZE (data))
494
38.5k
    return false;
495
62.1k
  if (expected_num != data[value].num_elements || data[value].is_reserved)
496
39.1k
    return false;
497
22.9k
  info->reglist.num_regs = data[value].num_regs;
498
22.9k
  info->reglist.stride = 1;
499
500
22.9k
  return true;
501
62.1k
}
502
503
/* Decode Rt and S fields of Vt in AdvSIMD load single structure to all
504
   lanes instructions.  */
505
bool
506
aarch64_ext_ldst_reglist_r (const aarch64_operand *self ATTRIBUTE_UNUSED,
507
          aarch64_opnd_info *info, const aarch64_insn code,
508
          const aarch64_inst *inst,
509
          aarch64_operand_error *errors ATTRIBUTE_UNUSED)
510
2.70k
{
511
2.70k
  aarch64_insn value;
512
513
  /* Rt */
514
2.70k
  info->reglist.first_regno = extract_field (FLD_Rt, code, 0);
515
  /* S */
516
2.70k
  value = extract_field (FLD_S, code, 0);
517
518
  /* Number of registers is equal to the number of elements in
519
     each structure to be loaded/stored.  */
520
2.70k
  info->reglist.num_regs = get_opcode_dependent_value (inst->opcode);
521
2.70k
  assert (info->reglist.num_regs >= 1 && info->reglist.num_regs <= 4);
522
523
  /* Except when it is LD1R.  */
524
2.70k
  if (info->reglist.num_regs == 1 && value == (aarch64_insn) 1)
525
0
    info->reglist.num_regs = 2;
526
527
2.70k
  info->reglist.stride = 1;
528
2.70k
  return true;
529
2.70k
}
530
531
/* Decode Q, opcode<2:1>, S, size and Rt fields of Vt in AdvSIMD
532
   load/store single element instructions.  */
533
bool
534
aarch64_ext_ldst_elemlist (const aarch64_operand *self ATTRIBUTE_UNUSED,
535
         aarch64_opnd_info *info, const aarch64_insn code,
536
         const aarch64_inst *inst ATTRIBUTE_UNUSED,
537
         aarch64_operand_error *errors ATTRIBUTE_UNUSED)
538
60.2k
{
539
60.2k
  aarch64_field field = {0, 0};
540
60.2k
  aarch64_insn QSsize;    /* fields Q:S:size.  */
541
60.2k
  aarch64_insn opcodeh2;  /* opcode<2:1> */
542
543
  /* Rt */
544
60.2k
  info->reglist.first_regno = extract_field (FLD_Rt, code, 0);
545
546
  /* Decode the index, opcode<2:1> and size.  */
547
60.2k
  gen_sub_field (FLD_asisdlso_opcode, 1, 2, &field);
548
60.2k
  opcodeh2 = extract_field_2 (&field, code, 0);
549
60.2k
  QSsize = extract_fields (code, 0, 3, FLD_Q, FLD_S, FLD_vldst_size);
550
60.2k
  switch (opcodeh2)
551
60.2k
    {
552
21.8k
    case 0x0:
553
21.8k
      info->qualifier = AARCH64_OPND_QLF_S_B;
554
      /* Index encoded in "Q:S:size".  */
555
21.8k
      info->reglist.index = QSsize;
556
21.8k
      break;
557
15.4k
    case 0x1:
558
15.4k
      if (QSsize & 0x1)
559
  /* UND.  */
560
5.72k
  return false;
561
9.74k
      info->qualifier = AARCH64_OPND_QLF_S_H;
562
      /* Index encoded in "Q:S:size<1>".  */
563
9.74k
      info->reglist.index = QSsize >> 1;
564
9.74k
      break;
565
10.3k
    case 0x2:
566
10.3k
      if ((QSsize >> 1) & 0x1)
567
  /* UND.  */
568
5.06k
  return false;
569
5.24k
      if ((QSsize & 0x1) == 0)
570
2.86k
  {
571
2.86k
    info->qualifier = AARCH64_OPND_QLF_S_S;
572
    /* Index encoded in "Q:S".  */
573
2.86k
    info->reglist.index = QSsize >> 2;
574
2.86k
  }
575
2.37k
      else
576
2.37k
  {
577
2.37k
    if (extract_field (FLD_S, code, 0))
578
      /* UND */
579
949
      return false;
580
1.42k
    info->qualifier = AARCH64_OPND_QLF_S_D;
581
    /* Index encoded in "Q".  */
582
1.42k
    info->reglist.index = QSsize >> 3;
583
1.42k
  }
584
4.29k
      break;
585
12.6k
    default:
586
12.6k
      return false;
587
60.2k
    }
588
589
35.9k
  info->reglist.has_index = 1;
590
35.9k
  info->reglist.num_regs = 0;
591
35.9k
  info->reglist.stride = 1;
592
  /* Number of registers is equal to the number of elements in
593
     each structure to be loaded/stored.  */
594
35.9k
  info->reglist.num_regs = get_opcode_dependent_value (inst->opcode);
595
35.9k
  assert (info->reglist.num_regs >= 1 && info->reglist.num_regs <= 4);
596
597
35.9k
  return true;
598
35.9k
}
599
600
/* Decode fields immh:immb and/or Q for e.g.
601
   SSHR <Vd>.<T>, <Vn>.<T>, #<shift>
602
   or SSHR <V><d>, <V><n>, #<shift>.  */
603
604
bool
605
aarch64_ext_advsimd_imm_shift (const aarch64_operand *self ATTRIBUTE_UNUSED,
606
             aarch64_opnd_info *info, const aarch64_insn code,
607
             const aarch64_inst *inst,
608
             aarch64_operand_error *errors ATTRIBUTE_UNUSED)
609
48.9k
{
610
48.9k
  int pos;
611
48.9k
  aarch64_insn Q, imm, immh;
612
48.9k
  enum aarch64_insn_class iclass = inst->opcode->iclass;
613
614
48.9k
  immh = extract_field (FLD_immh, code, 0);
615
48.9k
  if (immh == 0)
616
3.82k
    return false;
617
45.1k
  imm = extract_fields (code, 0, 2, FLD_immh, FLD_immb);
618
45.1k
  pos = 4;
619
  /* Get highest set bit in immh.  */
620
75.8k
  while (--pos >= 0 && (immh & 0x8) == 0)
621
30.6k
    immh <<= 1;
622
623
45.1k
  assert ((iclass == asimdshf || iclass == asisdshf)
624
45.1k
    && (info->type == AARCH64_OPND_IMM_VLSR
625
45.1k
        || info->type == AARCH64_OPND_IMM_VLSL));
626
627
45.1k
  if (iclass == asimdshf)
628
31.0k
    {
629
31.0k
      Q = extract_field (FLD_Q, code, 0);
630
      /* immh Q <T>
631
   0000 x SEE AdvSIMD modified immediate
632
   0001 0 8B
633
   0001 1 16B
634
   001x 0 4H
635
   001x 1 8H
636
   01xx 0 2S
637
   01xx 1 4S
638
   1xxx 0 RESERVED
639
   1xxx 1 2D  */
640
31.0k
      info->qualifier =
641
31.0k
  get_vreg_qualifier_from_value ((pos << 1) | (int) Q);
642
31.0k
    }
643
14.0k
  else
644
14.0k
    info->qualifier = get_sreg_qualifier_from_value (pos);
645
646
45.1k
  if (info->type == AARCH64_OPND_IMM_VLSR)
647
    /* immh <shift>
648
       0000 SEE AdvSIMD modified immediate
649
       0001 (16-UInt(immh:immb))
650
       001x (32-UInt(immh:immb))
651
       01xx (64-UInt(immh:immb))
652
       1xxx (128-UInt(immh:immb))  */
653
30.9k
    info->imm.value = (16 << pos) - imm;
654
14.2k
  else
655
    /* immh:immb
656
       immh <shift>
657
       0000 SEE AdvSIMD modified immediate
658
       0001 (UInt(immh:immb)-8)
659
       001x (UInt(immh:immb)-16)
660
       01xx (UInt(immh:immb)-32)
661
       1xxx (UInt(immh:immb)-64)  */
662
14.2k
    info->imm.value = imm - (8 << pos);
663
664
45.1k
  return true;
665
45.1k
}
666
667
/* Decode shift immediate for e.g. sshr (imm).  */
668
bool
669
aarch64_ext_shll_imm (const aarch64_operand *self ATTRIBUTE_UNUSED,
670
          aarch64_opnd_info *info, const aarch64_insn code,
671
          const aarch64_inst *inst ATTRIBUTE_UNUSED,
672
          aarch64_operand_error *errors ATTRIBUTE_UNUSED)
673
49
{
674
49
  int64_t imm;
675
49
  aarch64_insn val;
676
49
  val = extract_field (FLD_size, code, 0);
677
49
  switch (val)
678
49
    {
679
4
    case 0: imm = 8; break;
680
22
    case 1: imm = 16; break;
681
23
    case 2: imm = 32; break;
682
0
    default: return false;
683
49
    }
684
49
  info->imm.value = imm;
685
49
  return true;
686
49
}
687
688
/* Decode imm for e.g. BFM <Wd>, <Wn>, #<immr>, #<imms>.
689
   value in the field(s) will be extracted as unsigned immediate value.  */
690
bool
691
aarch64_ext_imm (const aarch64_operand *self, aarch64_opnd_info *info,
692
     const aarch64_insn code,
693
     const aarch64_inst *inst,
694
     aarch64_operand_error *errors ATTRIBUTE_UNUSED)
695
5.04M
{
696
5.04M
  uint64_t imm;
697
698
5.04M
  imm = extract_all_fields (self, code);
699
700
5.04M
  if (operand_need_sign_extension (self))
701
2.11M
    imm = sign_extend (imm, get_operand_fields_width (self) - 1);
702
703
5.04M
  if (operand_need_shift_by_two (self))
704
1.38M
    imm <<= 2;
705
3.65M
  else if (operand_need_shift_by_three (self))
706
0
    imm <<= 3;
707
3.65M
  else if (operand_need_shift_by_four (self))
708
7.10k
    imm <<= 4;
709
710
5.04M
  if (info->type == AARCH64_OPND_ADDR_ADRP)
711
283k
    imm <<= 12;
712
713
5.04M
  if (inst->operands[0].type == AARCH64_OPND_PSTATEFIELD
714
5.04M
      && inst->operands[0].sysreg.flags & F_IMM_IN_CRM)
715
0
    imm &= PSTATE_DECODE_CRM_IMM (inst->operands[0].sysreg.flags);
716
717
5.04M
  info->imm.value = imm;
718
5.04M
  return true;
719
5.04M
}
720
721
/* Decode imm and its shifter for e.g. MOVZ <Wd>, #<imm16>{, LSL #<shift>}.  */
722
bool
723
aarch64_ext_imm_half (const aarch64_operand *self, aarch64_opnd_info *info,
724
          const aarch64_insn code,
725
          const aarch64_inst *inst ATTRIBUTE_UNUSED,
726
          aarch64_operand_error *errors)
727
202k
{
728
202k
  aarch64_ext_imm (self, info, code, inst, errors);
729
202k
  info->shifter.kind = AARCH64_MOD_LSL;
730
202k
  info->shifter.amount = extract_field (FLD_hw, code, 0) << 4;
731
202k
  return true;
732
202k
}
733
734
/* Decode cmode and "a:b:c:d:e:f:g:h" for e.g.
735
     MOVI <Vd>.<T>, #<imm8> {, LSL #<amount>}.  */
736
bool
737
aarch64_ext_advsimd_imm_modified (const aarch64_operand *self ATTRIBUTE_UNUSED,
738
          aarch64_opnd_info *info,
739
          const aarch64_insn code,
740
          const aarch64_inst *inst ATTRIBUTE_UNUSED,
741
          aarch64_operand_error *errors ATTRIBUTE_UNUSED)
742
4.00k
{
743
4.00k
  uint64_t imm;
744
4.00k
  enum aarch64_opnd_qualifier opnd0_qualifier = inst->operands[0].qualifier;
745
4.00k
  aarch64_field field = {0, 0};
746
747
4.00k
  assert (info->idx == 1);
748
749
4.00k
  if (info->type == AARCH64_OPND_SIMD_FPIMM)
750
790
    info->imm.is_fp = 1;
751
752
  /* a:b:c:d:e:f:g:h */
753
4.00k
  imm = extract_fields (code, 0, 2, FLD_abc, FLD_defgh);
754
4.00k
  if (!info->imm.is_fp && aarch64_get_qualifier_esize (opnd0_qualifier) == 8)
755
67
    {
756
      /* Either MOVI <Dd>, #<imm>
757
   or     MOVI <Vd>.2D, #<imm>.
758
   <imm> is a 64-bit immediate
759
   'aaaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffffgggggggghhhhhhhh',
760
   encoded in "a:b:c:d:e:f:g:h".  */
761
67
      int i;
762
67
      unsigned abcdefgh = imm;
763
603
      for (imm = 0ull, i = 0; i < 8; i++)
764
536
  if (((abcdefgh >> i) & 0x1) != 0)
765
254
    imm |= 0xffull << (8 * i);
766
67
    }
767
4.00k
  info->imm.value = imm;
768
769
  /* cmode */
770
4.00k
  info->qualifier = get_expected_qualifier (inst, info->idx);
771
4.00k
  switch (info->qualifier)
772
4.00k
    {
773
857
    case AARCH64_OPND_QLF_NIL:
774
      /* no shift */
775
857
      info->shifter.kind = AARCH64_MOD_NONE;
776
857
      return 1;
777
2.84k
    case AARCH64_OPND_QLF_LSL:
778
      /* shift zeros */
779
2.84k
      info->shifter.kind = AARCH64_MOD_LSL;
780
2.84k
      switch (aarch64_get_qualifier_esize (opnd0_qualifier))
781
2.84k
  {
782
1.70k
  case 4: gen_sub_field (FLD_cmode, 1, 2, &field); break; /* per word */
783
997
  case 2: gen_sub_field (FLD_cmode, 1, 1, &field); break; /* per half */
784
147
  case 1: gen_sub_field (FLD_cmode, 1, 0, &field); break; /* per byte */
785
0
  default: return false;
786
2.84k
  }
787
      /* 00: 0; 01: 8; 10:16; 11:24.  */
788
2.84k
      info->shifter.amount = extract_field_2 (&field, code, 0) << 3;
789
2.84k
      break;
790
300
    case AARCH64_OPND_QLF_MSL:
791
      /* shift ones */
792
300
      info->shifter.kind = AARCH64_MOD_MSL;
793
300
      gen_sub_field (FLD_cmode, 0, 1, &field);    /* per word */
794
300
      info->shifter.amount = extract_field_2 (&field, code, 0) ? 16 : 8;
795
300
      break;
796
0
    default:
797
0
      return false;
798
4.00k
    }
799
800
3.14k
  return true;
801
4.00k
}
802
803
/* Decode an 8-bit floating-point immediate.  */
804
bool
805
aarch64_ext_fpimm (const aarch64_operand *self, aarch64_opnd_info *info,
806
       const aarch64_insn code,
807
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
808
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
809
2.58k
{
810
2.58k
  info->imm.value = extract_all_fields (self, code);
811
2.58k
  info->imm.is_fp = 1;
812
2.58k
  return true;
813
2.58k
}
814
815
/* Decode a 1-bit rotate immediate (#90 or #270).  */
816
bool
817
aarch64_ext_imm_rotate1 (const aarch64_operand *self, aarch64_opnd_info *info,
818
       const aarch64_insn code,
819
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
820
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
821
2.38k
{
822
2.38k
  uint64_t rot = extract_field (self->fields[0], code, 0);
823
2.38k
  assert (rot < 2U);
824
2.38k
  info->imm.value = rot * 180 + 90;
825
2.38k
  return true;
826
2.38k
}
827
828
/* Decode a 2-bit rotate immediate (#0, #90, #180 or #270).  */
829
bool
830
aarch64_ext_imm_rotate2 (const aarch64_operand *self, aarch64_opnd_info *info,
831
       const aarch64_insn code,
832
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
833
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
834
32.1k
{
835
32.1k
  uint64_t rot = extract_field (self->fields[0], code, 0);
836
32.1k
  assert (rot < 4U);
837
32.1k
  info->imm.value = rot * 90;
838
32.1k
  return true;
839
32.1k
}
840
841
/* Decode scale for e.g. SCVTF <Dd>, <Wn>, #<fbits>.  */
842
bool
843
aarch64_ext_fbits (const aarch64_operand *self ATTRIBUTE_UNUSED,
844
       aarch64_opnd_info *info, const aarch64_insn code,
845
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
846
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
847
6.02k
{
848
6.02k
  info->imm.value = 64- extract_field (FLD_scale, code, 0);
849
6.02k
  return true;
850
6.02k
}
851
852
/* Decode arithmetic immediate for e.g.
853
     SUBS <Wd>, <Wn|WSP>, #<imm> {, <shift>}.  */
854
bool
855
aarch64_ext_aimm (const aarch64_operand *self ATTRIBUTE_UNUSED,
856
      aarch64_opnd_info *info, const aarch64_insn code,
857
      const aarch64_inst *inst ATTRIBUTE_UNUSED,
858
      aarch64_operand_error *errors ATTRIBUTE_UNUSED)
859
764k
{
860
764k
  aarch64_insn value;
861
862
764k
  info->shifter.kind = AARCH64_MOD_LSL;
863
  /* shift */
864
764k
  value = extract_field (FLD_shift, code, 0);
865
764k
  if (value >= 2)
866
214k
    return false;
867
549k
  info->shifter.amount = value ? 12 : 0;
868
  /* imm12 (unsigned) */
869
549k
  info->imm.value = extract_field (FLD_imm12, code, 0);
870
871
549k
  return true;
872
764k
}
873
874
/* Return true if VALUE is a valid logical immediate encoding, storing the
875
   decoded value in *RESULT if so.  ESIZE is the number of bytes in the
876
   decoded immediate.  */
877
static bool
878
decode_limm (uint32_t esize, aarch64_insn value, int64_t *result)
879
546k
{
880
546k
  uint64_t imm, mask;
881
546k
  uint32_t N, R, S;
882
546k
  unsigned simd_size;
883
884
  /* value is N:immr:imms.  */
885
546k
  S = value & 0x3f;
886
546k
  R = (value >> 6) & 0x3f;
887
546k
  N = (value >> 12) & 0x1;
888
889
  /* The immediate value is S+1 bits to 1, left rotated by SIMDsize - R
890
     (in other words, right rotated by R), then replicated.  */
891
546k
  if (N != 0)
892
219k
    {
893
219k
      simd_size = 64;
894
219k
      mask = 0xffffffffffffffffull;
895
219k
    }
896
327k
  else
897
327k
    {
898
327k
      switch (S)
899
327k
  {
900
237k
  case 0x00 ... 0x1f: /* 0xxxxx */ simd_size = 32;           break;
901
44.3k
  case 0x20 ... 0x2f: /* 10xxxx */ simd_size = 16; S &= 0xf; break;
902
21.5k
  case 0x30 ... 0x37: /* 110xxx */ simd_size =  8; S &= 0x7; break;
903
12.0k
  case 0x38 ... 0x3b: /* 1110xx */ simd_size =  4; S &= 0x3; break;
904
5.88k
  case 0x3c ... 0x3d: /* 11110x */ simd_size =  2; S &= 0x1; break;
905
5.76k
  default: return false;
906
327k
  }
907
321k
      mask = (1ull << simd_size) - 1;
908
      /* Top bits are IGNORED.  */
909
321k
      R &= simd_size - 1;
910
321k
    }
911
912
541k
  if (simd_size > esize * 8)
913
129k
    return false;
914
915
  /* NOTE: if S = simd_size - 1 we get 0xf..f which is rejected.  */
916
412k
  if (S == simd_size - 1)
917
10.1k
    return false;
918
  /* S+1 consecutive bits to 1.  */
919
  /* NOTE: S can't be 63 due to detection above.  */
920
401k
  imm = (1ull << (S + 1)) - 1;
921
  /* Rotate to the left by simd_size - R.  */
922
401k
  if (R != 0)
923
336k
    imm = ((imm << (simd_size - R)) & mask) | (imm >> R);
924
  /* Replicate the value according to SIMD size.  */
925
401k
  switch (simd_size)
926
401k
    {
927
3.72k
    case  2: imm = (imm <<  2) | imm;
928
      /* Fall through.  */
929
13.3k
    case  4: imm = (imm <<  4) | imm;
930
      /* Fall through.  */
931
33.4k
    case  8: imm = (imm <<  8) | imm;
932
      /* Fall through.  */
933
76.5k
    case 16: imm = (imm << 16) | imm;
934
      /* Fall through.  */
935
312k
    case 32: imm = (imm << 32) | imm;
936
      /* Fall through.  */
937
401k
    case 64: break;
938
0
    default: return 0;
939
401k
    }
940
941
401k
  *result = imm & ~((uint64_t) -1 << (esize * 4) << (esize * 4));
942
943
401k
  return true;
944
401k
}
945
946
/* Decode a logical immediate for e.g. ORR <Wd|WSP>, <Wn>, #<imm>.  */
947
bool
948
aarch64_ext_limm (const aarch64_operand *self,
949
      aarch64_opnd_info *info, const aarch64_insn code,
950
      const aarch64_inst *inst,
951
      aarch64_operand_error *errors ATTRIBUTE_UNUSED)
952
546k
{
953
546k
  uint32_t esize;
954
546k
  aarch64_insn value;
955
956
546k
  value = extract_fields (code, 0, 3, self->fields[0], self->fields[1],
957
546k
        self->fields[2]);
958
546k
  esize = aarch64_get_qualifier_esize (inst->operands[0].qualifier);
959
546k
  return decode_limm (esize, value, &info->imm.value);
960
546k
}
961
962
/* Decode a logical immediate for the BIC alias of AND (etc.).  */
963
bool
964
aarch64_ext_inv_limm (const aarch64_operand *self,
965
          aarch64_opnd_info *info, const aarch64_insn code,
966
          const aarch64_inst *inst,
967
          aarch64_operand_error *errors)
968
0
{
969
0
  if (!aarch64_ext_limm (self, info, code, inst, errors))
970
0
    return false;
971
0
  info->imm.value = ~info->imm.value;
972
0
  return true;
973
0
}
974
975
/* Decode Ft for e.g. STR <Qt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}]
976
   or LDP <Qt1>, <Qt2>, [<Xn|SP>], #<imm>.  */
977
bool
978
aarch64_ext_ft (const aarch64_operand *self ATTRIBUTE_UNUSED,
979
    aarch64_opnd_info *info,
980
    const aarch64_insn code, const aarch64_inst *inst,
981
    aarch64_operand_error *errors ATTRIBUTE_UNUSED)
982
1.09M
{
983
1.09M
  aarch64_insn value;
984
985
  /* Rt */
986
1.09M
  info->reg.regno = extract_field (FLD_Rt, code, 0);
987
988
  /* size */
989
1.09M
  value = extract_field (FLD_ldst_size, code, 0);
990
1.09M
  if (inst->opcode->iclass == ldstpair_indexed
991
1.09M
      || inst->opcode->iclass == ldstnapair_offs
992
1.09M
      || inst->opcode->iclass == ldstpair_off
993
1.09M
      || inst->opcode->iclass == loadlit)
994
720k
    {
995
720k
      enum aarch64_opnd_qualifier qualifier;
996
720k
      switch (value)
997
720k
  {
998
183k
  case 0: qualifier = AARCH64_OPND_QLF_S_S; break;
999
219k
  case 1: qualifier = AARCH64_OPND_QLF_S_D; break;
1000
154k
  case 2: qualifier = AARCH64_OPND_QLF_S_Q; break;
1001
163k
  default: return false;
1002
720k
  }
1003
557k
      info->qualifier = qualifier;
1004
557k
    }
1005
371k
  else
1006
371k
    {
1007
      /* opc1:size */
1008
371k
      value = extract_fields (code, 0, 2, FLD_opc1, FLD_ldst_size);
1009
371k
      if (value > 0x4)
1010
143k
  return false;
1011
227k
      info->qualifier = get_sreg_qualifier_from_value (value);
1012
227k
    }
1013
1014
785k
  return true;
1015
1.09M
}
1016
1017
/* Decode the address operand for e.g. STXRB <Ws>, <Wt>, [<Xn|SP>{,#0}].  */
1018
bool
1019
aarch64_ext_addr_simple (const aarch64_operand *self ATTRIBUTE_UNUSED,
1020
       aarch64_opnd_info *info,
1021
       aarch64_insn code,
1022
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1023
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1024
295k
{
1025
  /* Rn */
1026
295k
  info->addr.base_regno = extract_field (FLD_Rn, code, 0);
1027
295k
  return true;
1028
295k
}
1029
1030
/* Decode the address operand for e.g.
1031
     stlur <Xt>, [<Xn|SP>{, <amount>}].  */
1032
bool
1033
aarch64_ext_addr_offset (const aarch64_operand *self ATTRIBUTE_UNUSED,
1034
       aarch64_opnd_info *info,
1035
       aarch64_insn code, const aarch64_inst *inst,
1036
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1037
23.5k
{
1038
23.5k
  info->qualifier = get_expected_qualifier (inst, info->idx);
1039
1040
  /* Rn */
1041
23.5k
  info->addr.base_regno = extract_field (self->fields[0], code, 0);
1042
1043
  /* simm9 */
1044
23.5k
  aarch64_insn imm = extract_fields (code, 0, 1, self->fields[1]);
1045
23.5k
  info->addr.offset.imm = sign_extend (imm, 8);
1046
23.5k
  if (extract_field (self->fields[2], code, 0) == 1) {
1047
0
    info->addr.writeback = 1;
1048
0
    info->addr.preind = 1;
1049
0
  }
1050
23.5k
  return true;
1051
23.5k
}
1052
1053
/* Decode the address operand for e.g.
1054
     STR <Qt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}].  */
1055
bool
1056
aarch64_ext_addr_regoff (const aarch64_operand *self ATTRIBUTE_UNUSED,
1057
       aarch64_opnd_info *info,
1058
       aarch64_insn code, const aarch64_inst *inst,
1059
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1060
62.9k
{
1061
62.9k
  aarch64_insn S, value;
1062
1063
  /* Rn */
1064
62.9k
  info->addr.base_regno = extract_field (FLD_Rn, code, 0);
1065
  /* Rm */
1066
62.9k
  info->addr.offset.regno = extract_field (FLD_Rm, code, 0);
1067
  /* option */
1068
62.9k
  value = extract_field (FLD_option, code, 0);
1069
62.9k
  info->shifter.kind =
1070
62.9k
    aarch64_get_operand_modifier_from_value (value, true /* extend_p */);
1071
  /* Fix-up the shifter kind; although the table-driven approach is
1072
     efficient, it is slightly inflexible, thus needing this fix-up.  */
1073
62.9k
  if (info->shifter.kind == AARCH64_MOD_UXTX)
1074
10.9k
    info->shifter.kind = AARCH64_MOD_LSL;
1075
  /* S */
1076
62.9k
  S = extract_field (FLD_S, code, 0);
1077
62.9k
  if (S == 0)
1078
21.5k
    {
1079
21.5k
      info->shifter.amount = 0;
1080
21.5k
      info->shifter.amount_present = 0;
1081
21.5k
    }
1082
41.3k
  else
1083
41.3k
    {
1084
41.3k
      int size;
1085
      /* Need information in other operand(s) to help achieve the decoding
1086
   from 'S' field.  */
1087
41.3k
      info->qualifier = get_expected_qualifier (inst, info->idx);
1088
      /* Get the size of the data element that is accessed, which may be
1089
   different from that of the source register size, e.g. in strb/ldrb.  */
1090
41.3k
      size = aarch64_get_qualifier_esize (info->qualifier);
1091
41.3k
      info->shifter.amount = get_logsz (size);
1092
41.3k
      info->shifter.amount_present = 1;
1093
41.3k
    }
1094
1095
62.9k
  return true;
1096
62.9k
}
1097
1098
/* Decode the address operand for e.g. LDRSW <Xt>, [<Xn|SP>], #<simm>.  */
1099
bool
1100
aarch64_ext_addr_simm (const aarch64_operand *self, aarch64_opnd_info *info,
1101
           aarch64_insn code, const aarch64_inst *inst,
1102
           aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1103
940k
{
1104
940k
  aarch64_insn imm;
1105
940k
  info->qualifier = get_expected_qualifier (inst, info->idx);
1106
1107
  /* Rn */
1108
940k
  info->addr.base_regno = extract_field (FLD_Rn, code, 0);
1109
  /* simm (imm9 or imm7)  */
1110
940k
  imm = extract_field (self->fields[0], code, 0);
1111
940k
  info->addr.offset.imm = sign_extend (imm, fields[self->fields[0]].width - 1);
1112
940k
  if (self->fields[0] == FLD_imm7
1113
940k
      || info->qualifier == AARCH64_OPND_QLF_imm_tag)
1114
    /* scaled immediate in ld/st pair instructions.  */
1115
755k
    info->addr.offset.imm *= aarch64_get_qualifier_esize (info->qualifier);
1116
  /* qualifier */
1117
940k
  if (inst->opcode->iclass == ldst_unscaled
1118
940k
      || inst->opcode->iclass == ldstnapair_offs
1119
940k
      || inst->opcode->iclass == ldstpair_off
1120
940k
      || inst->opcode->iclass == ldst_unpriv)
1121
537k
    info->addr.writeback = 0;
1122
403k
  else
1123
403k
    {
1124
      /* pre/post- index */
1125
403k
      info->addr.writeback = 1;
1126
403k
      if (extract_field (self->fields[1], code, 0) == 1)
1127
199k
  info->addr.preind = 1;
1128
204k
      else
1129
204k
  info->addr.postind = 1;
1130
403k
    }
1131
1132
940k
  return true;
1133
940k
}
1134
1135
/* Decode the address operand for e.g. LDRSW <Xt>, [<Xn|SP>{, #<simm>}].  */
1136
bool
1137
aarch64_ext_addr_uimm12 (const aarch64_operand *self, aarch64_opnd_info *info,
1138
       aarch64_insn code,
1139
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1140
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1141
400k
{
1142
400k
  int shift;
1143
400k
  info->qualifier = get_expected_qualifier (inst, info->idx);
1144
400k
  shift = get_logsz (aarch64_get_qualifier_esize (info->qualifier));
1145
  /* Rn */
1146
400k
  info->addr.base_regno = extract_field (self->fields[0], code, 0);
1147
  /* uimm12 */
1148
400k
  info->addr.offset.imm = extract_field (self->fields[1], code, 0) << shift;
1149
400k
  return true;
1150
400k
}
1151
1152
/* Decode the address operand for e.g. LDRAA <Xt>, [<Xn|SP>{, #<simm>}].  */
1153
bool
1154
aarch64_ext_addr_simm10 (const aarch64_operand *self, aarch64_opnd_info *info,
1155
       aarch64_insn code,
1156
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1157
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1158
16.6k
{
1159
16.6k
  aarch64_insn imm;
1160
1161
16.6k
  info->qualifier = get_expected_qualifier (inst, info->idx);
1162
  /* Rn */
1163
16.6k
  info->addr.base_regno = extract_field (self->fields[0], code, 0);
1164
  /* simm10 */
1165
16.6k
  imm = extract_fields (code, 0, 2, self->fields[1], self->fields[2]);
1166
16.6k
  info->addr.offset.imm = sign_extend (imm, 9) << 3;
1167
16.6k
  if (extract_field (self->fields[3], code, 0) == 1) {
1168
10.2k
    info->addr.writeback = 1;
1169
10.2k
    info->addr.preind = 1;
1170
10.2k
  }
1171
16.6k
  return true;
1172
16.6k
}
1173
1174
/* Decode the address operand for e.g.
1175
     LD1 {<Vt>.<T>, <Vt2>.<T>, <Vt3>.<T>}, [<Xn|SP>], <Xm|#<amount>>.  */
1176
bool
1177
aarch64_ext_simd_addr_post (const aarch64_operand *self ATTRIBUTE_UNUSED,
1178
          aarch64_opnd_info *info,
1179
          aarch64_insn code, const aarch64_inst *inst,
1180
          aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1181
41.4k
{
1182
  /* The opcode dependent area stores the number of elements in
1183
     each structure to be loaded/stored.  */
1184
41.4k
  int is_ld1r = get_opcode_dependent_value (inst->opcode) == 1;
1185
1186
  /* Rn */
1187
41.4k
  info->addr.base_regno = extract_field (FLD_Rn, code, 0);
1188
  /* Rm | #<amount>  */
1189
41.4k
  info->addr.offset.regno = extract_field (FLD_Rm, code, 0);
1190
41.4k
  if (info->addr.offset.regno == 31)
1191
1.60k
    {
1192
1.60k
      if (inst->opcode->operands[0] == AARCH64_OPND_LVt_AL)
1193
  /* Special handling of loading single structure to all lane.  */
1194
140
  info->addr.offset.imm = (is_ld1r ? 1
1195
140
         : inst->operands[0].reglist.num_regs)
1196
140
    * aarch64_get_qualifier_esize (inst->operands[0].qualifier);
1197
1.46k
      else
1198
1.46k
  info->addr.offset.imm = inst->operands[0].reglist.num_regs
1199
1.46k
    * aarch64_get_qualifier_esize (inst->operands[0].qualifier)
1200
1.46k
    * aarch64_get_qualifier_nelem (inst->operands[0].qualifier);
1201
1.60k
    }
1202
39.7k
  else
1203
39.7k
    info->addr.offset.is_reg = 1;
1204
41.4k
  info->addr.writeback = 1;
1205
1206
41.4k
  return true;
1207
41.4k
}
1208
1209
/* Decode the condition operand for e.g. CSEL <Xd>, <Xn>, <Xm>, <cond>.  */
1210
bool
1211
aarch64_ext_cond (const aarch64_operand *self ATTRIBUTE_UNUSED,
1212
      aarch64_opnd_info *info,
1213
      aarch64_insn code, const aarch64_inst *inst ATTRIBUTE_UNUSED,
1214
      aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1215
40.8k
{
1216
40.8k
  aarch64_insn value;
1217
  /* cond */
1218
40.8k
  value = extract_field (FLD_cond, code, 0);
1219
40.8k
  info->cond = get_cond_from_value (value);
1220
40.8k
  return true;
1221
40.8k
}
1222
1223
/* Decode the system register operand for e.g. MRS <Xt>, <systemreg>.  */
1224
bool
1225
aarch64_ext_sysreg (const aarch64_operand *self ATTRIBUTE_UNUSED,
1226
        aarch64_opnd_info *info,
1227
        aarch64_insn code,
1228
        const aarch64_inst *inst ATTRIBUTE_UNUSED,
1229
        aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1230
9.38k
{
1231
  /* op0:op1:CRn:CRm:op2 */
1232
9.38k
  info->sysreg.value = extract_fields (code, 0, 5, FLD_op0, FLD_op1, FLD_CRn,
1233
9.38k
               FLD_CRm, FLD_op2);
1234
9.38k
  info->sysreg.flags = 0;
1235
1236
  /* If a system instruction, check which restrictions should be on the register
1237
     value during decoding, these will be enforced then.  */
1238
9.38k
  if (inst->opcode->iclass == ic_system)
1239
9.38k
    {
1240
      /* Check to see if it's read-only, else check if it's write only.
1241
   if it's both or unspecified don't care.  */
1242
9.38k
      if ((inst->opcode->flags & (F_SYS_READ | F_SYS_WRITE)) == F_SYS_READ)
1243
3.96k
  info->sysreg.flags = F_REG_READ;
1244
5.42k
      else if ((inst->opcode->flags & (F_SYS_READ | F_SYS_WRITE))
1245
5.42k
         == F_SYS_WRITE)
1246
5.42k
  info->sysreg.flags = F_REG_WRITE;
1247
9.38k
    }
1248
1249
9.38k
  return true;
1250
9.38k
}
1251
1252
/* Decode the PSTATE field operand for e.g. MSR <pstatefield>, #<imm>.  */
1253
bool
1254
aarch64_ext_pstatefield (const aarch64_operand *self ATTRIBUTE_UNUSED,
1255
       aarch64_opnd_info *info, aarch64_insn code,
1256
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1257
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1258
380
{
1259
380
  int i;
1260
380
  aarch64_insn fld_crm = extract_field (FLD_CRm, code, 0);
1261
  /* op1:op2 */
1262
380
  info->pstatefield = extract_fields (code, 0, 2, FLD_op1, FLD_op2);
1263
691
  for (i = 0; aarch64_pstatefields[i].name != NULL; ++i)
1264
676
    if (aarch64_pstatefields[i].value == (aarch64_insn)info->pstatefield)
1265
395
      {
1266
        /* PSTATEFIELD name can be encoded partially in CRm[3:1].  */
1267
395
        uint32_t flags = aarch64_pstatefields[i].flags;
1268
395
        if ((flags & F_REG_IN_CRM)
1269
395
            && ((fld_crm & 0xe) != PSTATE_DECODE_CRM (flags)))
1270
30
          continue;
1271
365
        info->sysreg.flags = flags;
1272
365
        return true;
1273
395
      }
1274
  /* Reserved value in <pstatefield>.  */
1275
15
  return false;
1276
380
}
1277
1278
/* Decode the system instruction op operand for e.g. AT <at_op>, <Xt>.  */
1279
bool
1280
aarch64_ext_sysins_op (const aarch64_operand *self ATTRIBUTE_UNUSED,
1281
           aarch64_opnd_info *info,
1282
           aarch64_insn code,
1283
           const aarch64_inst *inst ATTRIBUTE_UNUSED,
1284
           aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1285
6.86k
{
1286
6.86k
  int i;
1287
6.86k
  aarch64_insn value;
1288
6.86k
  const aarch64_sys_ins_reg *sysins_ops;
1289
  /* op0:op1:CRn:CRm:op2 */
1290
6.86k
  value = extract_fields (code, 0, 5,
1291
6.86k
        FLD_op0, FLD_op1, FLD_CRn,
1292
6.86k
        FLD_CRm, FLD_op2);
1293
1294
6.86k
  switch (info->type)
1295
6.86k
    {
1296
1.52k
    case AARCH64_OPND_SYSREG_AT: sysins_ops = aarch64_sys_regs_at; break;
1297
1.60k
    case AARCH64_OPND_SYSREG_DC: sysins_ops = aarch64_sys_regs_dc; break;
1298
1.86k
    case AARCH64_OPND_SYSREG_IC: sysins_ops = aarch64_sys_regs_ic; break;
1299
1.86k
    case AARCH64_OPND_SYSREG_TLBI: sysins_ops = aarch64_sys_regs_tlbi; break;
1300
0
    case AARCH64_OPND_SYSREG_SR:
1301
0
  sysins_ops = aarch64_sys_regs_sr;
1302
   /* Let's remove op2 for rctx.  Refer to comments in the definition of
1303
      aarch64_sys_regs_sr[].  */
1304
0
  value = value & ~(0x7);
1305
0
  break;
1306
0
    default: return false;
1307
6.86k
    }
1308
1309
232k
  for (i = 0; sysins_ops[i].name != NULL; ++i)
1310
226k
    if (sysins_ops[i].value == value)
1311
367
      {
1312
367
  info->sysins_op = sysins_ops + i;
1313
367
  DEBUG_TRACE ("%s found value: %x, has_xt: %d, i: %d.",
1314
367
         info->sysins_op->name,
1315
367
         (unsigned)info->sysins_op->value,
1316
367
         aarch64_sys_ins_reg_has_xt (info->sysins_op), i);
1317
367
  return true;
1318
367
      }
1319
1320
6.50k
  return false;
1321
6.86k
}
1322
1323
/* Decode the memory barrier option operand for e.g. DMB <option>|#<imm>.  */
1324
1325
bool
1326
aarch64_ext_barrier (const aarch64_operand *self ATTRIBUTE_UNUSED,
1327
         aarch64_opnd_info *info,
1328
         aarch64_insn code,
1329
         const aarch64_inst *inst ATTRIBUTE_UNUSED,
1330
         aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1331
398
{
1332
  /* CRm */
1333
398
  info->barrier = aarch64_barrier_options + extract_field (FLD_CRm, code, 0);
1334
398
  return true;
1335
398
}
1336
1337
/* Decode the memory barrier option operand for DSB <option>nXS|#<imm>.  */
1338
1339
bool
1340
aarch64_ext_barrier_dsb_nxs (const aarch64_operand *self ATTRIBUTE_UNUSED,
1341
         aarch64_opnd_info *info,
1342
         aarch64_insn code,
1343
         const aarch64_inst *inst ATTRIBUTE_UNUSED,
1344
         aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1345
36
{
1346
  /* For the DSB nXS barrier variant immediate is encoded in 2-bit field.  */
1347
36
  aarch64_insn field = extract_field (FLD_CRm_dsb_nxs, code, 0);
1348
36
  info->barrier = aarch64_barrier_dsb_nxs_options + field;
1349
36
  return true;
1350
36
}
1351
1352
/* Decode the prefetch operation option operand for e.g.
1353
     PRFM <prfop>, [<Xn|SP>{, #<pimm>}].  */
1354
1355
bool
1356
aarch64_ext_prfop (const aarch64_operand *self ATTRIBUTE_UNUSED,
1357
       aarch64_opnd_info *info,
1358
       aarch64_insn code, const aarch64_inst *inst ATTRIBUTE_UNUSED,
1359
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1360
69.2k
{
1361
  /* prfop in Rt */
1362
69.2k
  info->prfop = aarch64_prfops + extract_field (FLD_Rt, code, 0);
1363
69.2k
  return true;
1364
69.2k
}
1365
1366
/* Decode the hint number for an alias taking an operand.  Set info->hint_option
1367
   to the matching name/value pair in aarch64_hint_options.  */
1368
1369
bool
1370
aarch64_ext_hint (const aarch64_operand *self ATTRIBUTE_UNUSED,
1371
      aarch64_opnd_info *info,
1372
      aarch64_insn code,
1373
      const aarch64_inst *inst ATTRIBUTE_UNUSED,
1374
      aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1375
534
{
1376
  /* CRm:op2.  */
1377
534
  unsigned hint_number;
1378
534
  int i;
1379
1380
534
  hint_number = extract_fields (code, 0, 2, FLD_CRm, FLD_op2);
1381
1382
2.63k
  for (i = 0; aarch64_hint_options[i].name != NULL; i++)
1383
2.63k
    {
1384
2.63k
      if (hint_number == HINT_VAL (aarch64_hint_options[i].value))
1385
534
  {
1386
534
    info->hint_option = &(aarch64_hint_options[i]);
1387
534
    return true;
1388
534
  }
1389
2.63k
    }
1390
1391
0
  return false;
1392
534
}
1393
1394
/* Decode the extended register operand for e.g.
1395
     STR <Qt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}].  */
1396
bool
1397
aarch64_ext_reg_extended (const aarch64_operand *self ATTRIBUTE_UNUSED,
1398
        aarch64_opnd_info *info,
1399
        aarch64_insn code,
1400
        const aarch64_inst *inst ATTRIBUTE_UNUSED,
1401
        aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1402
72.4k
{
1403
72.4k
  aarch64_insn value;
1404
1405
  /* Rm */
1406
72.4k
  info->reg.regno = extract_field (FLD_Rm, code, 0);
1407
  /* option */
1408
72.4k
  value = extract_field (FLD_option, code, 0);
1409
72.4k
  info->shifter.kind =
1410
72.4k
    aarch64_get_operand_modifier_from_value (value, true /* extend_p */);
1411
  /* imm3 */
1412
72.4k
  info->shifter.amount = extract_field (FLD_imm3_10, code,  0);
1413
1414
  /* This makes the constraint checking happy.  */
1415
72.4k
  info->shifter.operator_present = 1;
1416
1417
  /* Assume inst->operands[0].qualifier has been resolved.  */
1418
72.4k
  assert (inst->operands[0].qualifier != AARCH64_OPND_QLF_NIL);
1419
72.4k
  info->qualifier = AARCH64_OPND_QLF_W;
1420
72.4k
  if (inst->operands[0].qualifier == AARCH64_OPND_QLF_X
1421
72.4k
      && (info->shifter.kind == AARCH64_MOD_UXTX
1422
28.5k
    || info->shifter.kind == AARCH64_MOD_SXTX))
1423
9.00k
    info->qualifier = AARCH64_OPND_QLF_X;
1424
1425
72.4k
  return true;
1426
72.4k
}
1427
1428
/* Decode the shifted register operand for e.g.
1429
     SUBS <Xd>, <Xn>, <Xm> {, <shift> #<amount>}.  */
1430
bool
1431
aarch64_ext_reg_shifted (const aarch64_operand *self ATTRIBUTE_UNUSED,
1432
       aarch64_opnd_info *info,
1433
       aarch64_insn code,
1434
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1435
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1436
978k
{
1437
978k
  aarch64_insn value;
1438
1439
  /* Rm */
1440
978k
  info->reg.regno = extract_field (FLD_Rm, code, 0);
1441
  /* shift */
1442
978k
  value = extract_field (FLD_shift, code, 0);
1443
978k
  info->shifter.kind =
1444
978k
    aarch64_get_operand_modifier_from_value (value, false /* extend_p */);
1445
978k
  if (info->shifter.kind == AARCH64_MOD_ROR
1446
978k
      && inst->opcode->iclass != log_shift)
1447
    /* ROR is not available for the shifted register operand in arithmetic
1448
       instructions.  */
1449
46.5k
    return false;
1450
  /* imm6 */
1451
932k
  info->shifter.amount = extract_field (FLD_imm6_10, code,  0);
1452
1453
  /* This makes the constraint checking happy.  */
1454
932k
  info->shifter.operator_present = 1;
1455
1456
932k
  return true;
1457
978k
}
1458
1459
/* Decode an SVE address [<base>, #<offset>*<factor>, MUL VL],
1460
   where <offset> is given by the OFFSET parameter and where <factor> is
1461
   1 plus SELF's operand-dependent value.  fields[0] specifies the field
1462
   that holds <base>.  */
1463
static bool
1464
aarch64_ext_sve_addr_reg_mul_vl (const aarch64_operand *self,
1465
         aarch64_opnd_info *info, aarch64_insn code,
1466
         int64_t offset)
1467
112k
{
1468
112k
  info->addr.base_regno = extract_field (self->fields[0], code, 0);
1469
112k
  info->addr.offset.imm = offset * (1 + get_operand_specific_data (self));
1470
112k
  info->addr.offset.is_reg = false;
1471
112k
  info->addr.writeback = false;
1472
112k
  info->addr.preind = true;
1473
112k
  if (offset != 0)
1474
107k
    info->shifter.kind = AARCH64_MOD_MUL_VL;
1475
112k
  info->shifter.amount = 1;
1476
112k
  info->shifter.operator_present = (info->addr.offset.imm != 0);
1477
112k
  info->shifter.amount_present = false;
1478
112k
  return true;
1479
112k
}
1480
1481
/* Decode an SVE address [<base>, #<simm4>*<factor>, MUL VL],
1482
   where <simm4> is a 4-bit signed value and where <factor> is 1 plus
1483
   SELF's operand-dependent value.  fields[0] specifies the field that
1484
   holds <base>.  <simm4> is encoded in the SVE_imm4 field.  */
1485
bool
1486
aarch64_ext_sve_addr_ri_s4xvl (const aarch64_operand *self,
1487
             aarch64_opnd_info *info, aarch64_insn code,
1488
             const aarch64_inst *inst ATTRIBUTE_UNUSED,
1489
             aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1490
99.6k
{
1491
99.6k
  int offset;
1492
1493
99.6k
  offset = extract_field (FLD_SVE_imm4, code, 0);
1494
99.6k
  offset = ((offset + 8) & 15) - 8;
1495
99.6k
  return aarch64_ext_sve_addr_reg_mul_vl (self, info, code, offset);
1496
99.6k
}
1497
1498
/* Decode an SVE address [<base>, #<simm6>*<factor>, MUL VL],
1499
   where <simm6> is a 6-bit signed value and where <factor> is 1 plus
1500
   SELF's operand-dependent value.  fields[0] specifies the field that
1501
   holds <base>.  <simm6> is encoded in the SVE_imm6 field.  */
1502
bool
1503
aarch64_ext_sve_addr_ri_s6xvl (const aarch64_operand *self,
1504
             aarch64_opnd_info *info, aarch64_insn code,
1505
             const aarch64_inst *inst ATTRIBUTE_UNUSED,
1506
             aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1507
3.98k
{
1508
3.98k
  int offset;
1509
1510
3.98k
  offset = extract_field (FLD_SVE_imm6, code, 0);
1511
3.98k
  offset = (((offset + 32) & 63) - 32);
1512
3.98k
  return aarch64_ext_sve_addr_reg_mul_vl (self, info, code, offset);
1513
3.98k
}
1514
1515
/* Decode an SVE address [<base>, #<simm9>*<factor>, MUL VL],
1516
   where <simm9> is a 9-bit signed value and where <factor> is 1 plus
1517
   SELF's operand-dependent value.  fields[0] specifies the field that
1518
   holds <base>.  <simm9> is encoded in the concatenation of the SVE_imm6
1519
   and imm3 fields, with imm3 being the less-significant part.  */
1520
bool
1521
aarch64_ext_sve_addr_ri_s9xvl (const aarch64_operand *self,
1522
             aarch64_opnd_info *info,
1523
             aarch64_insn code,
1524
             const aarch64_inst *inst ATTRIBUTE_UNUSED,
1525
             aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1526
8.94k
{
1527
8.94k
  int offset;
1528
1529
8.94k
  offset = extract_fields (code, 0, 2, FLD_SVE_imm6, FLD_imm3_10);
1530
8.94k
  offset = (((offset + 256) & 511) - 256);
1531
8.94k
  return aarch64_ext_sve_addr_reg_mul_vl (self, info, code, offset);
1532
8.94k
}
1533
1534
/* Decode an SVE address [<base>, #<offset> << <shift>], where <offset>
1535
   is given by the OFFSET parameter and where <shift> is SELF's operand-
1536
   dependent value.  fields[0] specifies the base register field <base>.  */
1537
static bool
1538
aarch64_ext_sve_addr_reg_imm (const aarch64_operand *self,
1539
            aarch64_opnd_info *info, aarch64_insn code,
1540
            int64_t offset)
1541
59.8k
{
1542
59.8k
  info->addr.base_regno = extract_field (self->fields[0], code, 0);
1543
59.8k
  info->addr.offset.imm = offset * (1 << get_operand_specific_data (self));
1544
59.8k
  info->addr.offset.is_reg = false;
1545
59.8k
  info->addr.writeback = false;
1546
59.8k
  info->addr.preind = true;
1547
59.8k
  info->shifter.operator_present = false;
1548
59.8k
  info->shifter.amount_present = false;
1549
59.8k
  return true;
1550
59.8k
}
1551
1552
/* Decode an SVE address [X<n>, #<SVE_imm4> << <shift>], where <SVE_imm4>
1553
   is a 4-bit signed number and where <shift> is SELF's operand-dependent
1554
   value.  fields[0] specifies the base register field.  */
1555
bool
1556
aarch64_ext_sve_addr_ri_s4 (const aarch64_operand *self,
1557
          aarch64_opnd_info *info, aarch64_insn code,
1558
          const aarch64_inst *inst ATTRIBUTE_UNUSED,
1559
          aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1560
2.94k
{
1561
2.94k
  int offset = sign_extend (extract_field (FLD_SVE_imm4, code, 0), 3);
1562
2.94k
  return aarch64_ext_sve_addr_reg_imm (self, info, code, offset);
1563
2.94k
}
1564
1565
/* Decode an SVE address [X<n>, #<SVE_imm6> << <shift>], where <SVE_imm6>
1566
   is a 6-bit unsigned number and where <shift> is SELF's operand-dependent
1567
   value.  fields[0] specifies the base register field.  */
1568
bool
1569
aarch64_ext_sve_addr_ri_u6 (const aarch64_operand *self,
1570
          aarch64_opnd_info *info, aarch64_insn code,
1571
          const aarch64_inst *inst ATTRIBUTE_UNUSED,
1572
          aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1573
31.6k
{
1574
31.6k
  int offset = extract_field (FLD_SVE_imm6, code, 0);
1575
31.6k
  return aarch64_ext_sve_addr_reg_imm (self, info, code, offset);
1576
31.6k
}
1577
1578
/* Decode an SVE address [X<n>, X<m>{, LSL #<shift>}], where <shift>
1579
   is SELF's operand-dependent value.  fields[0] specifies the base
1580
   register field and fields[1] specifies the offset register field.  */
1581
bool
1582
aarch64_ext_sve_addr_rr_lsl (const aarch64_operand *self,
1583
           aarch64_opnd_info *info, aarch64_insn code,
1584
           const aarch64_inst *inst ATTRIBUTE_UNUSED,
1585
           aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1586
209k
{
1587
209k
  int index_regno;
1588
1589
209k
  index_regno = extract_field (self->fields[1], code, 0);
1590
209k
  if (index_regno == 31 && (self->flags & OPD_F_NO_ZR) != 0)
1591
2.54k
    return false;
1592
1593
207k
  info->addr.base_regno = extract_field (self->fields[0], code, 0);
1594
207k
  info->addr.offset.regno = index_regno;
1595
207k
  info->addr.offset.is_reg = true;
1596
207k
  info->addr.writeback = false;
1597
207k
  info->addr.preind = true;
1598
207k
  info->shifter.kind = AARCH64_MOD_LSL;
1599
207k
  info->shifter.amount = get_operand_specific_data (self);
1600
207k
  info->shifter.operator_present = (info->shifter.amount != 0);
1601
207k
  info->shifter.amount_present = (info->shifter.amount != 0);
1602
207k
  return true;
1603
209k
}
1604
1605
/* Decode an SVE address [X<n>, Z<m>.<T>, (S|U)XTW {#<shift>}], where
1606
   <shift> is SELF's operand-dependent value.  fields[0] specifies the
1607
   base register field, fields[1] specifies the offset register field and
1608
   fields[2] is a single-bit field that selects SXTW over UXTW.  */
1609
bool
1610
aarch64_ext_sve_addr_rz_xtw (const aarch64_operand *self,
1611
           aarch64_opnd_info *info, aarch64_insn code,
1612
           const aarch64_inst *inst ATTRIBUTE_UNUSED,
1613
           aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1614
114k
{
1615
114k
  info->addr.base_regno = extract_field (self->fields[0], code, 0);
1616
114k
  info->addr.offset.regno = extract_field (self->fields[1], code, 0);
1617
114k
  info->addr.offset.is_reg = true;
1618
114k
  info->addr.writeback = false;
1619
114k
  info->addr.preind = true;
1620
114k
  if (extract_field (self->fields[2], code, 0))
1621
56.0k
    info->shifter.kind = AARCH64_MOD_SXTW;
1622
58.7k
  else
1623
58.7k
    info->shifter.kind = AARCH64_MOD_UXTW;
1624
114k
  info->shifter.amount = get_operand_specific_data (self);
1625
114k
  info->shifter.operator_present = true;
1626
114k
  info->shifter.amount_present = (info->shifter.amount != 0);
1627
114k
  return true;
1628
114k
}
1629
1630
/* Decode an SVE address [Z<n>.<T>, #<imm5> << <shift>], where <imm5> is a
1631
   5-bit unsigned number and where <shift> is SELF's operand-dependent value.
1632
   fields[0] specifies the base register field.  */
1633
bool
1634
aarch64_ext_sve_addr_zi_u5 (const aarch64_operand *self,
1635
          aarch64_opnd_info *info, aarch64_insn code,
1636
          const aarch64_inst *inst ATTRIBUTE_UNUSED,
1637
          aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1638
25.2k
{
1639
25.2k
  int offset = extract_field (FLD_imm5, code, 0);
1640
25.2k
  return aarch64_ext_sve_addr_reg_imm (self, info, code, offset);
1641
25.2k
}
1642
1643
/* Decode an SVE address [Z<n>.<T>, Z<m>.<T>{, <modifier> {#<msz>}}],
1644
   where <modifier> is given by KIND and where <msz> is a 2-bit unsigned
1645
   number.  fields[0] specifies the base register field and fields[1]
1646
   specifies the offset register field.  */
1647
static bool
1648
aarch64_ext_sve_addr_zz (const aarch64_operand *self, aarch64_opnd_info *info,
1649
       aarch64_insn code, enum aarch64_modifier_kind kind)
1650
2.63k
{
1651
2.63k
  info->addr.base_regno = extract_field (self->fields[0], code, 0);
1652
2.63k
  info->addr.offset.regno = extract_field (self->fields[1], code, 0);
1653
2.63k
  info->addr.offset.is_reg = true;
1654
2.63k
  info->addr.writeback = false;
1655
2.63k
  info->addr.preind = true;
1656
2.63k
  info->shifter.kind = kind;
1657
2.63k
  info->shifter.amount = extract_field (FLD_SVE_msz, code, 0);
1658
2.63k
  info->shifter.operator_present = (kind != AARCH64_MOD_LSL
1659
2.63k
            || info->shifter.amount != 0);
1660
2.63k
  info->shifter.amount_present = (info->shifter.amount != 0);
1661
2.63k
  return true;
1662
2.63k
}
1663
1664
/* Decode an SVE address [Z<n>.<T>, Z<m>.<T>{, LSL #<msz>}], where
1665
   <msz> is a 2-bit unsigned number.  fields[0] specifies the base register
1666
   field and fields[1] specifies the offset register field.  */
1667
bool
1668
aarch64_ext_sve_addr_zz_lsl (const aarch64_operand *self,
1669
           aarch64_opnd_info *info, aarch64_insn code,
1670
           const aarch64_inst *inst ATTRIBUTE_UNUSED,
1671
           aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1672
1.19k
{
1673
1.19k
  return aarch64_ext_sve_addr_zz (self, info, code, AARCH64_MOD_LSL);
1674
1.19k
}
1675
1676
/* Decode an SVE address [Z<n>.<T>, Z<m>.<T>, SXTW {#<msz>}], where
1677
   <msz> is a 2-bit unsigned number.  fields[0] specifies the base register
1678
   field and fields[1] specifies the offset register field.  */
1679
bool
1680
aarch64_ext_sve_addr_zz_sxtw (const aarch64_operand *self,
1681
            aarch64_opnd_info *info, aarch64_insn code,
1682
            const aarch64_inst *inst ATTRIBUTE_UNUSED,
1683
            aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1684
329
{
1685
329
  return aarch64_ext_sve_addr_zz (self, info, code, AARCH64_MOD_SXTW);
1686
329
}
1687
1688
/* Decode an SVE address [Z<n>.<T>, Z<m>.<T>, UXTW {#<msz>}], where
1689
   <msz> is a 2-bit unsigned number.  fields[0] specifies the base register
1690
   field and fields[1] specifies the offset register field.  */
1691
bool
1692
aarch64_ext_sve_addr_zz_uxtw (const aarch64_operand *self,
1693
            aarch64_opnd_info *info, aarch64_insn code,
1694
            const aarch64_inst *inst ATTRIBUTE_UNUSED,
1695
            aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1696
1.10k
{
1697
1.10k
  return aarch64_ext_sve_addr_zz (self, info, code, AARCH64_MOD_UXTW);
1698
1.10k
}
1699
1700
/* Finish decoding an SVE arithmetic immediate, given that INFO already
1701
   has the raw field value and that the low 8 bits decode to VALUE.  */
1702
static bool
1703
decode_sve_aimm (aarch64_opnd_info *info, int64_t value)
1704
34.7k
{
1705
34.7k
  info->shifter.kind = AARCH64_MOD_LSL;
1706
34.7k
  info->shifter.amount = 0;
1707
34.7k
  if (info->imm.value & 0x100)
1708
5.36k
    {
1709
5.36k
      if (value == 0)
1710
  /* Decode 0x100 as #0, LSL #8.  */
1711
33
  info->shifter.amount = 8;
1712
5.33k
      else
1713
5.33k
  value *= 256;
1714
5.36k
    }
1715
34.7k
  info->shifter.operator_present = (info->shifter.amount != 0);
1716
34.7k
  info->shifter.amount_present = (info->shifter.amount != 0);
1717
34.7k
  info->imm.value = value;
1718
34.7k
  return true;
1719
34.7k
}
1720
1721
/* Decode an SVE ADD/SUB immediate.  */
1722
bool
1723
aarch64_ext_sve_aimm (const aarch64_operand *self,
1724
          aarch64_opnd_info *info, const aarch64_insn code,
1725
          const aarch64_inst *inst,
1726
          aarch64_operand_error *errors)
1727
2.29k
{
1728
2.29k
  return (aarch64_ext_imm (self, info, code, inst, errors)
1729
2.29k
    && decode_sve_aimm (info, (uint8_t) info->imm.value));
1730
2.29k
}
1731
1732
bool
1733
aarch64_ext_sve_aligned_reglist (const aarch64_operand *self,
1734
         aarch64_opnd_info *info, aarch64_insn code,
1735
         const aarch64_inst *inst ATTRIBUTE_UNUSED,
1736
         aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1737
33.2k
{
1738
33.2k
  unsigned int num_regs = get_operand_specific_data (self);
1739
33.2k
  unsigned int val = extract_field (self->fields[0], code, 0);
1740
33.2k
  info->reglist.first_regno = val * num_regs;
1741
33.2k
  info->reglist.num_regs = num_regs;
1742
33.2k
  info->reglist.stride = 1;
1743
33.2k
  return true;
1744
33.2k
}
1745
1746
/* Decode an SVE CPY/DUP immediate.  */
1747
bool
1748
aarch64_ext_sve_asimm (const aarch64_operand *self,
1749
           aarch64_opnd_info *info, const aarch64_insn code,
1750
           const aarch64_inst *inst,
1751
           aarch64_operand_error *errors)
1752
32.4k
{
1753
32.4k
  return (aarch64_ext_imm (self, info, code, inst, errors)
1754
32.4k
    && decode_sve_aimm (info, (int8_t) info->imm.value));
1755
32.4k
}
1756
1757
/* Decode a single-bit immediate that selects between #0.5 and #1.0.
1758
   The fields array specifies which field to use.  */
1759
bool
1760
aarch64_ext_sve_float_half_one (const aarch64_operand *self,
1761
        aarch64_opnd_info *info, aarch64_insn code,
1762
        const aarch64_inst *inst ATTRIBUTE_UNUSED,
1763
        aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1764
73
{
1765
73
  if (extract_field (self->fields[0], code, 0))
1766
70
    info->imm.value = 0x3f800000;
1767
3
  else
1768
3
    info->imm.value = 0x3f000000;
1769
73
  info->imm.is_fp = true;
1770
73
  return true;
1771
73
}
1772
1773
/* Decode a single-bit immediate that selects between #0.5 and #2.0.
1774
   The fields array specifies which field to use.  */
1775
bool
1776
aarch64_ext_sve_float_half_two (const aarch64_operand *self,
1777
        aarch64_opnd_info *info, aarch64_insn code,
1778
        const aarch64_inst *inst ATTRIBUTE_UNUSED,
1779
        aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1780
10
{
1781
10
  if (extract_field (self->fields[0], code, 0))
1782
1
    info->imm.value = 0x40000000;
1783
9
  else
1784
9
    info->imm.value = 0x3f000000;
1785
10
  info->imm.is_fp = true;
1786
10
  return true;
1787
10
}
1788
1789
/* Decode a single-bit immediate that selects between #0.0 and #1.0.
1790
   The fields array specifies which field to use.  */
1791
bool
1792
aarch64_ext_sve_float_zero_one (const aarch64_operand *self,
1793
        aarch64_opnd_info *info, aarch64_insn code,
1794
        const aarch64_inst *inst ATTRIBUTE_UNUSED,
1795
        aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1796
10
{
1797
10
  if (extract_field (self->fields[0], code, 0))
1798
10
    info->imm.value = 0x3f800000;
1799
0
  else
1800
0
    info->imm.value = 0x0;
1801
10
  info->imm.is_fp = true;
1802
10
  return true;
1803
10
}
1804
1805
/* Decode ZA tile vector, vector indicator, vector selector, qualifier and
1806
   immediate on numerous SME instruction fields such as MOVA.  */
1807
bool
1808
aarch64_ext_sme_za_hv_tiles (const aarch64_operand *self,
1809
                             aarch64_opnd_info *info, aarch64_insn code,
1810
                             const aarch64_inst *inst ATTRIBUTE_UNUSED,
1811
                             aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1812
66.0k
{
1813
66.0k
  int fld_size = extract_field (self->fields[0], code, 0);
1814
66.0k
  int fld_q = extract_field (self->fields[1], code, 0);
1815
66.0k
  int fld_v = extract_field (self->fields[2], code, 0);
1816
66.0k
  int fld_rv = extract_field (self->fields[3], code, 0);
1817
66.0k
  int fld_zan_imm = extract_field (self->fields[4], code, 0);
1818
1819
  /* Deduce qualifier encoded in size and Q fields.  */
1820
66.0k
  if (fld_size == 0)
1821
16.0k
    {
1822
16.0k
      info->indexed_za.regno = 0;
1823
16.0k
      info->indexed_za.index.imm = fld_zan_imm;
1824
16.0k
    }
1825
50.0k
  else if (fld_size == 1)
1826
6.52k
    {
1827
6.52k
      info->indexed_za.regno = fld_zan_imm >> 3;
1828
6.52k
      info->indexed_za.index.imm = fld_zan_imm & 0x07;
1829
6.52k
    }
1830
43.4k
  else if (fld_size == 2)
1831
6.30k
    {
1832
6.30k
      info->indexed_za.regno = fld_zan_imm >> 2;
1833
6.30k
      info->indexed_za.index.imm = fld_zan_imm & 0x03;
1834
6.30k
    }
1835
37.1k
  else if (fld_size == 3 && fld_q == 0)
1836
28.5k
    {
1837
28.5k
      info->indexed_za.regno = fld_zan_imm >> 1;
1838
28.5k
      info->indexed_za.index.imm = fld_zan_imm & 0x01;
1839
28.5k
    }
1840
8.58k
  else if (fld_size == 3 && fld_q == 1)
1841
8.58k
    {
1842
8.58k
      info->indexed_za.regno = fld_zan_imm;
1843
8.58k
      info->indexed_za.index.imm = 0;
1844
8.58k
    }
1845
0
  else
1846
0
    return false;
1847
1848
66.0k
  info->indexed_za.index.regno = fld_rv + 12;
1849
66.0k
  info->indexed_za.v = fld_v;
1850
1851
66.0k
  return true;
1852
66.0k
}
1853
1854
bool
1855
aarch64_ext_sme_za_hv_tiles_range (const aarch64_operand *self,
1856
           aarch64_opnd_info *info, aarch64_insn code,
1857
           const aarch64_inst *inst ATTRIBUTE_UNUSED,
1858
           aarch64_operand_error *errors
1859
             ATTRIBUTE_UNUSED)
1860
716
{
1861
716
  int ebytes = aarch64_get_qualifier_esize (info->qualifier);
1862
716
  int range_size = get_opcode_dependent_value (inst->opcode);
1863
716
  int fld_v = extract_field (self->fields[0], code, 0);
1864
716
  int fld_rv = extract_field (self->fields[1], code, 0);
1865
716
  int fld_zan_imm = extract_field (self->fields[2], code, 0);
1866
716
  int max_value = 16 / range_size / ebytes;
1867
1868
716
  if (max_value == 0)
1869
35
    max_value = 1;
1870
1871
716
  int regno = fld_zan_imm / max_value;
1872
716
  if (regno >= ebytes)
1873
4
    return false;
1874
1875
712
  info->indexed_za.regno = regno;
1876
712
  info->indexed_za.index.imm = (fld_zan_imm % max_value) * range_size;
1877
712
  info->indexed_za.index.countm1 = range_size - 1;
1878
712
  info->indexed_za.index.regno = fld_rv + 12;
1879
712
  info->indexed_za.v = fld_v;
1880
1881
712
  return true;
1882
716
}
1883
1884
/* Decode in SME instruction ZERO list of up to eight 64-bit element tile names
1885
   separated by commas, encoded in the "imm8" field.
1886
1887
   For programmer convenience an assembler must also accept the names of
1888
   32-bit, 16-bit and 8-bit element tiles which are converted into the
1889
   corresponding set of 64-bit element tiles.
1890
*/
1891
bool
1892
aarch64_ext_sme_za_list (const aarch64_operand *self,
1893
                         aarch64_opnd_info *info, aarch64_insn code,
1894
                         const aarch64_inst *inst ATTRIBUTE_UNUSED,
1895
                         aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1896
0
{
1897
0
  int mask = extract_field (self->fields[0], code, 0);
1898
0
  info->imm.value = mask;
1899
0
  return true;
1900
0
}
1901
1902
/* Decode ZA array vector select register (Rv field), optional vector and
1903
   memory offset (imm4_11 field).
1904
*/
1905
bool
1906
aarch64_ext_sme_za_array (const aarch64_operand *self,
1907
                          aarch64_opnd_info *info, aarch64_insn code,
1908
                          const aarch64_inst *inst,
1909
                          aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1910
19.6k
{
1911
19.6k
  int regno = extract_field (self->fields[0], code, 0);
1912
19.6k
  if (info->type == AARCH64_OPND_SME_ZA_array_off4)
1913
876
    regno += 12;
1914
18.7k
  else
1915
18.7k
    regno += 8;
1916
19.6k
  int imm = extract_field (self->fields[1], code, 0);
1917
19.6k
  int num_offsets = get_operand_specific_data (self);
1918
19.6k
  if (num_offsets == 0)
1919
4.37k
    num_offsets = 1;
1920
19.6k
  info->indexed_za.index.regno = regno;
1921
19.6k
  info->indexed_za.index.imm = imm * num_offsets;
1922
19.6k
  info->indexed_za.index.countm1 = num_offsets - 1;
1923
19.6k
  info->indexed_za.group_size = get_opcode_dependent_value (inst->opcode);
1924
19.6k
  return true;
1925
19.6k
}
1926
1927
bool
1928
aarch64_ext_sme_addr_ri_u4xvl (const aarch64_operand *self,
1929
                               aarch64_opnd_info *info, aarch64_insn code,
1930
                               const aarch64_inst *inst ATTRIBUTE_UNUSED,
1931
                               aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1932
876
{
1933
876
  int regno = extract_field (self->fields[0], code, 0);
1934
876
  int imm = extract_field (self->fields[1], code, 0);
1935
876
  info->addr.base_regno = regno;
1936
876
  info->addr.offset.imm = imm;
1937
  /* MUL VL operator is always present for this operand.  */
1938
876
  info->shifter.kind = AARCH64_MOD_MUL_VL;
1939
876
  info->shifter.operator_present = (imm != 0);
1940
876
  return true;
1941
876
}
1942
1943
/* Decode {SM|ZA} filed for SMSTART and SMSTOP instructions.  */
1944
bool
1945
aarch64_ext_sme_sm_za (const aarch64_operand *self,
1946
                       aarch64_opnd_info *info, aarch64_insn code,
1947
                       const aarch64_inst *inst ATTRIBUTE_UNUSED,
1948
                       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1949
10
{
1950
10
  info->pstatefield = 0x1b;
1951
10
  aarch64_insn fld_crm = extract_field (self->fields[0], code, 0);
1952
10
  fld_crm >>= 1;    /* CRm[3:1].  */
1953
1954
10
  if (fld_crm == 0x1)
1955
0
    info->reg.regno = 's';
1956
10
  else if (fld_crm == 0x2)
1957
0
    info->reg.regno = 'z';
1958
10
  else
1959
10
    return false;
1960
1961
0
  return true;
1962
10
}
1963
1964
bool
1965
aarch64_ext_sme_pred_reg_with_index (const aarch64_operand *self,
1966
             aarch64_opnd_info *info, aarch64_insn code,
1967
             const aarch64_inst *inst ATTRIBUTE_UNUSED,
1968
             aarch64_operand_error *errors ATTRIBUTE_UNUSED)
1969
1.81k
{
1970
1.81k
  aarch64_insn fld_rm = extract_field (self->fields[0], code, 0);
1971
1.81k
  aarch64_insn fld_pn = extract_field (self->fields[1], code, 0);
1972
1.81k
  aarch64_insn fld_i1 = extract_field (self->fields[2], code, 0);
1973
1.81k
  aarch64_insn fld_tszh = extract_field (self->fields[3], code, 0);
1974
1.81k
  aarch64_insn fld_tszl = extract_field (self->fields[4], code, 0);
1975
1.81k
  int imm;
1976
1977
1.81k
  info->indexed_za.regno = fld_pn;
1978
1.81k
  info->indexed_za.index.regno = fld_rm + 12;
1979
1980
1.81k
  if (fld_tszl & 0x1)
1981
766
    imm = (fld_i1 << 3) | (fld_tszh << 2) | (fld_tszl >> 1);
1982
1.04k
  else if (fld_tszl & 0x2)
1983
749
    imm = (fld_i1 << 2) | (fld_tszh << 1) | (fld_tszl >> 2);
1984
295
  else if (fld_tszl & 0x4)
1985
112
    imm = (fld_i1 << 1) | fld_tszh;
1986
183
  else if (fld_tszh)
1987
183
    imm = fld_i1;
1988
0
  else
1989
0
    return false;
1990
1991
1.81k
  info->indexed_za.index.imm = imm;
1992
1.81k
  return true;
1993
1.81k
}
1994
1995
/* Decode Zn[MM], where MM has a 7-bit triangular encoding.  The fields
1996
   array specifies which field to use for Zn.  MM is encoded in the
1997
   concatenation of imm5 and SVE_tszh, with imm5 being the less
1998
   significant part.  */
1999
bool
2000
aarch64_ext_sve_index (const aarch64_operand *self,
2001
           aarch64_opnd_info *info, aarch64_insn code,
2002
           const aarch64_inst *inst ATTRIBUTE_UNUSED,
2003
           aarch64_operand_error *errors ATTRIBUTE_UNUSED)
2004
1.71k
{
2005
1.71k
  int val;
2006
2007
1.71k
  info->reglane.regno = extract_field (self->fields[0], code, 0);
2008
1.71k
  val = extract_fields (code, 0, 2, FLD_SVE_tszh, FLD_imm5);
2009
1.71k
  if ((val & 31) == 0)
2010
0
    return 0;
2011
2.71k
  while ((val & 1) == 0)
2012
1.00k
    val /= 2;
2013
1.71k
  info->reglane.index = val / 2;
2014
1.71k
  return true;
2015
1.71k
}
2016
2017
/* Decode a logical immediate for the MOV alias of SVE DUPM.  */
2018
bool
2019
aarch64_ext_sve_limm_mov (const aarch64_operand *self,
2020
        aarch64_opnd_info *info, const aarch64_insn code,
2021
        const aarch64_inst *inst,
2022
        aarch64_operand_error *errors)
2023
2.43k
{
2024
2.43k
  int esize = aarch64_get_qualifier_esize (inst->operands[0].qualifier);
2025
2.43k
  return (aarch64_ext_limm (self, info, code, inst, errors)
2026
2.43k
    && aarch64_sve_dupm_mov_immediate_p (info->imm.value, esize));
2027
2.43k
}
2028
2029
/* Decode Zn[MM], where Zn occupies the least-significant part of the field
2030
   and where MM occupies the most-significant part.  The operand-dependent
2031
   value specifies the number of bits in Zn.  */
2032
bool
2033
aarch64_ext_sve_quad_index (const aarch64_operand *self,
2034
          aarch64_opnd_info *info, aarch64_insn code,
2035
          const aarch64_inst *inst ATTRIBUTE_UNUSED,
2036
          aarch64_operand_error *errors ATTRIBUTE_UNUSED)
2037
26.1k
{
2038
26.1k
  unsigned int reg_bits = get_operand_specific_data (self);
2039
26.1k
  unsigned int val = extract_all_fields (self, code);
2040
26.1k
  info->reglane.regno = val & ((1 << reg_bits) - 1);
2041
26.1k
  info->reglane.index = val >> reg_bits;
2042
26.1k
  return true;
2043
26.1k
}
2044
2045
/* Decode {Zn.<T> - Zm.<T>}.  The fields array specifies which field
2046
   to use for Zn.  The opcode-dependent value specifies the number
2047
   of registers in the list.  */
2048
bool
2049
aarch64_ext_sve_reglist (const aarch64_operand *self,
2050
       aarch64_opnd_info *info, aarch64_insn code,
2051
       const aarch64_inst *inst ATTRIBUTE_UNUSED,
2052
       aarch64_operand_error *errors ATTRIBUTE_UNUSED)
2053
375k
{
2054
375k
  info->reglist.first_regno = extract_field (self->fields[0], code, 0);
2055
375k
  info->reglist.num_regs = get_opcode_dependent_value (inst->opcode);
2056
375k
  info->reglist.stride = 1;
2057
375k
  return true;
2058
375k
}
2059
2060
/* Decode a strided register list.  The first field holds the top bit
2061
   (0 or 16) and the second field holds the lower bits.  The stride is
2062
   16 divided by the list length.  */
2063
bool
2064
aarch64_ext_sve_strided_reglist (const aarch64_operand *self,
2065
         aarch64_opnd_info *info, aarch64_insn code,
2066
         const aarch64_inst *inst ATTRIBUTE_UNUSED,
2067
         aarch64_operand_error *errors
2068
           ATTRIBUTE_UNUSED)
2069
13.6k
{
2070
13.6k
  unsigned int upper = extract_field (self->fields[0], code, 0);
2071
13.6k
  unsigned int lower = extract_field (self->fields[1], code, 0);
2072
13.6k
  info->reglist.first_regno = upper * 16 + lower;
2073
13.6k
  info->reglist.num_regs = get_operand_specific_data (self);
2074
13.6k
  info->reglist.stride = 16 / info->reglist.num_regs;
2075
13.6k
  return true;
2076
13.6k
}
2077
2078
/* Decode <pattern>{, MUL #<amount>}.  The fields array specifies which
2079
   fields to use for <pattern>.  <amount> - 1 is encoded in the SVE_imm4
2080
   field.  */
2081
bool
2082
aarch64_ext_sve_scale (const aarch64_operand *self,
2083
           aarch64_opnd_info *info, aarch64_insn code,
2084
           const aarch64_inst *inst, aarch64_operand_error *errors)
2085
6.81k
{
2086
6.81k
  int val;
2087
2088
6.81k
  if (!aarch64_ext_imm (self, info, code, inst, errors))
2089
0
    return false;
2090
6.81k
  val = extract_field (FLD_SVE_imm4, code, 0);
2091
6.81k
  info->shifter.kind = AARCH64_MOD_MUL;
2092
6.81k
  info->shifter.amount = val + 1;
2093
6.81k
  info->shifter.operator_present = (val != 0);
2094
6.81k
  info->shifter.amount_present = (val != 0);
2095
6.81k
  return true;
2096
6.81k
}
2097
2098
/* Return the top set bit in VALUE, which is expected to be relatively
2099
   small.  */
2100
static uint64_t
2101
get_top_bit (uint64_t value)
2102
14.7k
{
2103
56.8k
  while ((value & -value) != value)
2104
42.1k
    value -= value & -value;
2105
14.7k
  return value;
2106
14.7k
}
2107
2108
/* Decode an SVE shift-left immediate.  */
2109
bool
2110
aarch64_ext_sve_shlimm (const aarch64_operand *self,
2111
      aarch64_opnd_info *info, const aarch64_insn code,
2112
      const aarch64_inst *inst, aarch64_operand_error *errors)
2113
2.76k
{
2114
2.76k
  if (!aarch64_ext_imm (self, info, code, inst, errors)
2115
2.76k
      || info->imm.value == 0)
2116
0
    return false;
2117
2118
2.76k
  info->imm.value -= get_top_bit (info->imm.value);
2119
2.76k
  return true;
2120
2.76k
}
2121
2122
/* Decode an SVE shift-right immediate.  */
2123
bool
2124
aarch64_ext_sve_shrimm (const aarch64_operand *self,
2125
      aarch64_opnd_info *info, const aarch64_insn code,
2126
      const aarch64_inst *inst, aarch64_operand_error *errors)
2127
11.9k
{
2128
11.9k
  if (!aarch64_ext_imm (self, info, code, inst, errors)
2129
11.9k
      || info->imm.value == 0)
2130
0
    return false;
2131
2132
11.9k
  info->imm.value = get_top_bit (info->imm.value) * 2 - info->imm.value;
2133
11.9k
  return true;
2134
11.9k
}
2135
2136
/* Decode X0-X30.  Register 31 is unallocated.  */
2137
bool
2138
aarch64_ext_x0_to_x30 (const aarch64_operand *self, aarch64_opnd_info *info,
2139
           const aarch64_insn code,
2140
           const aarch64_inst *inst ATTRIBUTE_UNUSED,
2141
           aarch64_operand_error *errors ATTRIBUTE_UNUSED)
2142
37.3k
{
2143
37.3k
  info->reg.regno = extract_field (self->fields[0], code, 0);
2144
37.3k
  return info->reg.regno <= 30;
2145
37.3k
}
2146
2147
/* Decode an indexed register, with the first field being the register
2148
   number and the remaining fields being the index.  */
2149
bool
2150
aarch64_ext_simple_index (const aarch64_operand *self, aarch64_opnd_info *info,
2151
        const aarch64_insn code,
2152
        const aarch64_inst *inst ATTRIBUTE_UNUSED,
2153
        aarch64_operand_error *errors ATTRIBUTE_UNUSED)
2154
14.6k
{
2155
14.6k
  int bias = get_operand_specific_data (self);
2156
14.6k
  info->reglane.regno = extract_field (self->fields[0], code, 0) + bias;
2157
14.6k
  info->reglane.index = extract_all_fields_after (self, 1, code);
2158
14.6k
  return true;
2159
14.6k
}
2160
2161
/* Decode a plain shift-right immediate, when there is only a single
2162
   element size.  */
2163
bool
2164
aarch64_ext_plain_shrimm (const aarch64_operand *self, aarch64_opnd_info *info,
2165
        const aarch64_insn code,
2166
        const aarch64_inst *inst ATTRIBUTE_UNUSED,
2167
        aarch64_operand_error *errors ATTRIBUTE_UNUSED)
2168
91
{
2169
91
  unsigned int base = 1 << get_operand_field_width (self, 0);
2170
91
  info->imm.value = base - extract_field (self->fields[0], code, 0);
2171
91
  return true;
2172
91
}
2173

2174
/* Bitfields that are commonly used to encode certain operands' information
2175
   may be partially used as part of the base opcode in some instructions.
2176
   For example, the bit 1 of the field 'size' in
2177
     FCVTXN <Vb><d>, <Va><n>
2178
   is actually part of the base opcode, while only size<0> is available
2179
   for encoding the register type.  Another example is the AdvSIMD
2180
   instruction ORR (register), in which the field 'size' is also used for
2181
   the base opcode, leaving only the field 'Q' available to encode the
2182
   vector register arrangement specifier '8B' or '16B'.
2183
2184
   This function tries to deduce the qualifier from the value of partially
2185
   constrained field(s).  Given the VALUE of such a field or fields, the
2186
   qualifiers CANDIDATES and the MASK (indicating which bits are valid for
2187
   operand encoding), the function returns the matching qualifier or
2188
   AARCH64_OPND_QLF_NIL if nothing matches.
2189
2190
   N.B. CANDIDATES is a group of possible qualifiers that are valid for
2191
   one operand; it has a maximum of AARCH64_MAX_QLF_SEQ_NUM qualifiers and
2192
   may end with AARCH64_OPND_QLF_NIL.  */
2193
2194
static enum aarch64_opnd_qualifier
2195
get_qualifier_from_partial_encoding (aarch64_insn value,
2196
             const enum aarch64_opnd_qualifier* \
2197
             candidates,
2198
             aarch64_insn mask)
2199
152k
{
2200
152k
  int i;
2201
152k
  DEBUG_TRACE ("enter with value: %d, mask: %d", (int)value, (int)mask);
2202
287k
  for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
2203
287k
    {
2204
287k
      aarch64_insn standard_value;
2205
287k
      if (candidates[i] == AARCH64_OPND_QLF_NIL)
2206
32.3k
  break;
2207
255k
      standard_value = aarch64_get_qualifier_standard_value (candidates[i]);
2208
255k
      if ((standard_value & mask) == (value & mask))
2209
120k
  return candidates[i];
2210
255k
    }
2211
32.3k
  return AARCH64_OPND_QLF_NIL;
2212
152k
}
2213
2214
/* Given a list of qualifier sequences, return all possible valid qualifiers
2215
   for operand IDX in QUALIFIERS.
2216
   Assume QUALIFIERS is an array whose length is large enough.  */
2217
2218
static void
2219
get_operand_possible_qualifiers (int idx,
2220
         const aarch64_opnd_qualifier_seq_t *list,
2221
         enum aarch64_opnd_qualifier *qualifiers)
2222
152k
{
2223
152k
  int i;
2224
508k
  for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
2225
508k
    if ((qualifiers[i] = list[i][idx]) == AARCH64_OPND_QLF_NIL)
2226
152k
      break;
2227
152k
}
2228
2229
/* Decode the size Q field for e.g. SHADD.
2230
   We tag one operand with the qualifer according to the code;
2231
   whether the qualifier is valid for this opcode or not, it is the
2232
   duty of the semantic checking.  */
2233
2234
static int
2235
decode_sizeq (aarch64_inst *inst)
2236
395k
{
2237
395k
  int idx;
2238
395k
  enum aarch64_opnd_qualifier qualifier;
2239
395k
  aarch64_insn code;
2240
395k
  aarch64_insn value, mask;
2241
395k
  enum aarch64_field_kind fld_sz;
2242
395k
  enum aarch64_opnd_qualifier candidates[AARCH64_MAX_QLF_SEQ_NUM];
2243
2244
395k
  if (inst->opcode->iclass == asisdlse
2245
395k
     || inst->opcode->iclass == asisdlsep
2246
395k
     || inst->opcode->iclass == asisdlso
2247
395k
     || inst->opcode->iclass == asisdlsop)
2248
103k
    fld_sz = FLD_vldst_size;
2249
292k
  else
2250
292k
    fld_sz = FLD_size;
2251
2252
395k
  code = inst->value;
2253
395k
  value = extract_fields (code, inst->opcode->mask, 2, fld_sz, FLD_Q);
2254
  /* Obtain the info that which bits of fields Q and size are actually
2255
     available for operand encoding.  Opcodes like FMAXNM and FMLA have
2256
     size[1] unavailable.  */
2257
395k
  mask = extract_fields (~inst->opcode->mask, 0, 2, fld_sz, FLD_Q);
2258
2259
  /* The index of the operand we are going to tag a qualifier and the qualifer
2260
     itself are reasoned from the value of the size and Q fields and the
2261
     possible valid qualifier lists.  */
2262
395k
  idx = aarch64_select_operand_for_sizeq_field_coding (inst->opcode);
2263
395k
  DEBUG_TRACE ("key idx: %d", idx);
2264
2265
  /* For most related instruciton, size:Q are fully available for operand
2266
     encoding.  */
2267
395k
  if (mask == 0x7)
2268
250k
    {
2269
250k
      inst->operands[idx].qualifier = get_vreg_qualifier_from_value (value);
2270
250k
      return 1;
2271
250k
    }
2272
2273
144k
  get_operand_possible_qualifiers (idx, inst->opcode->qualifiers_list,
2274
144k
           candidates);
2275
#ifdef DEBUG_AARCH64
2276
  if (debug_dump)
2277
    {
2278
      int i;
2279
      for (i = 0; candidates[i] != AARCH64_OPND_QLF_NIL
2280
     && i < AARCH64_MAX_QLF_SEQ_NUM; ++i)
2281
  DEBUG_TRACE ("qualifier %d: %s", i,
2282
         aarch64_get_qualifier_name(candidates[i]));
2283
      DEBUG_TRACE ("%d, %d", (int)value, (int)mask);
2284
    }
2285
#endif /* DEBUG_AARCH64 */
2286
2287
144k
  qualifier = get_qualifier_from_partial_encoding (value, candidates, mask);
2288
2289
144k
  if (qualifier == AARCH64_OPND_QLF_NIL)
2290
32.3k
    return 0;
2291
2292
112k
  inst->operands[idx].qualifier = qualifier;
2293
112k
  return 1;
2294
144k
}
2295
2296
/* Decode size[0]:Q, i.e. bit 22 and bit 30, for
2297
     e.g. FCVTN<Q> <Vd>.<Tb>, <Vn>.<Ta>.  */
2298
2299
static int
2300
decode_asimd_fcvt (aarch64_inst *inst)
2301
260
{
2302
260
  aarch64_field field = {0, 0};
2303
260
  aarch64_insn value;
2304
260
  enum aarch64_opnd_qualifier qualifier;
2305
2306
260
  gen_sub_field (FLD_size, 0, 1, &field);
2307
260
  value = extract_field_2 (&field, inst->value, 0);
2308
260
  qualifier = value == 0 ? AARCH64_OPND_QLF_V_4S
2309
260
    : AARCH64_OPND_QLF_V_2D;
2310
260
  switch (inst->opcode->op)
2311
260
    {
2312
256
    case OP_FCVTN:
2313
257
    case OP_FCVTN2:
2314
      /* FCVTN<Q> <Vd>.<Tb>, <Vn>.<Ta>.  */
2315
257
      inst->operands[1].qualifier = qualifier;
2316
257
      break;
2317
0
    case OP_FCVTL:
2318
3
    case OP_FCVTL2:
2319
      /* FCVTL<Q> <Vd>.<Ta>, <Vn>.<Tb>.  */
2320
3
      inst->operands[0].qualifier = qualifier;
2321
3
      break;
2322
0
    default:
2323
0
      return 0;
2324
260
    }
2325
2326
260
  return 1;
2327
260
}
2328
2329
/* Decode size[0], i.e. bit 22, for
2330
     e.g. FCVTXN <Vb><d>, <Va><n>.  */
2331
2332
static int
2333
decode_asisd_fcvtxn (aarch64_inst *inst)
2334
6
{
2335
6
  aarch64_field field = {0, 0};
2336
6
  gen_sub_field (FLD_size, 0, 1, &field);
2337
6
  if (!extract_field_2 (&field, inst->value, 0))
2338
1
    return 0;
2339
5
  inst->operands[0].qualifier = AARCH64_OPND_QLF_S_S;
2340
5
  return 1;
2341
6
}
2342
2343
/* Decode the 'opc' field for e.g. FCVT <Dd>, <Sn>.  */
2344
static int
2345
decode_fcvt (aarch64_inst *inst)
2346
75
{
2347
75
  enum aarch64_opnd_qualifier qualifier;
2348
75
  aarch64_insn value;
2349
75
  const aarch64_field field = {15, 2};
2350
2351
  /* opc dstsize */
2352
75
  value = extract_field_2 (&field, inst->value, 0);
2353
75
  switch (value)
2354
75
    {
2355
32
    case 0: qualifier = AARCH64_OPND_QLF_S_S; break;
2356
11
    case 1: qualifier = AARCH64_OPND_QLF_S_D; break;
2357
4
    case 3: qualifier = AARCH64_OPND_QLF_S_H; break;
2358
28
    default: return 0;
2359
75
    }
2360
47
  inst->operands[0].qualifier = qualifier;
2361
2362
47
  return 1;
2363
75
}
2364
2365
/* Do miscellaneous decodings that are not common enough to be driven by
2366
   flags.  */
2367
2368
static int
2369
do_misc_decoding (aarch64_inst *inst)
2370
15.8k
{
2371
15.8k
  unsigned int value;
2372
15.8k
  switch (inst->opcode->op)
2373
15.8k
    {
2374
75
    case OP_FCVT:
2375
75
      return decode_fcvt (inst);
2376
2377
256
    case OP_FCVTN:
2378
257
    case OP_FCVTN2:
2379
257
    case OP_FCVTL:
2380
260
    case OP_FCVTL2:
2381
260
      return decode_asimd_fcvt (inst);
2382
2383
6
    case OP_FCVTXN_S:
2384
6
      return decode_asisd_fcvtxn (inst);
2385
2386
554
    case OP_MOV_P_P:
2387
842
    case OP_MOVS_P_P:
2388
842
      value = extract_field (FLD_SVE_Pn, inst->value, 0);
2389
842
      return (value == extract_field (FLD_SVE_Pm, inst->value, 0)
2390
842
        && value == extract_field (FLD_SVE_Pg4_10, inst->value, 0));
2391
2392
10.8k
    case OP_MOV_Z_P_Z:
2393
10.8k
      return (extract_field (FLD_SVE_Zd, inst->value, 0)
2394
10.8k
        == extract_field (FLD_SVE_Zm_16, inst->value, 0));
2395
2396
53
    case OP_MOV_Z_V:
2397
      /* Index must be zero.  */
2398
53
      value = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_imm5);
2399
53
      return value > 0 && value <= 16 && value == (value & -value);
2400
2401
245
    case OP_MOV_Z_Z:
2402
245
      return (extract_field (FLD_SVE_Zn, inst->value, 0)
2403
245
        == extract_field (FLD_SVE_Zm_16, inst->value, 0));
2404
2405
884
    case OP_MOV_Z_Zi:
2406
      /* Index must be nonzero.  */
2407
884
      value = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_imm5);
2408
884
      return value > 0 && value != (value & -value);
2409
2410
187
    case OP_MOVM_P_P_P:
2411
187
      return (extract_field (FLD_SVE_Pd, inst->value, 0)
2412
187
        == extract_field (FLD_SVE_Pm, inst->value, 0));
2413
2414
242
    case OP_MOVZS_P_P_P:
2415
1.36k
    case OP_MOVZ_P_P_P:
2416
1.36k
      return (extract_field (FLD_SVE_Pn, inst->value, 0)
2417
1.36k
        == extract_field (FLD_SVE_Pm, inst->value, 0));
2418
2419
146
    case OP_NOTS_P_P_P_Z:
2420
447
    case OP_NOT_P_P_P_Z:
2421
447
      return (extract_field (FLD_SVE_Pm, inst->value, 0)
2422
447
        == extract_field (FLD_SVE_Pg4_10, inst->value, 0));
2423
2424
554
    default:
2425
554
      return 0;
2426
15.8k
    }
2427
15.8k
}
2428
2429
/* Opcodes that have fields shared by multiple operands are usually flagged
2430
   with flags.  In this function, we detect such flags, decode the related
2431
   field(s) and store the information in one of the related operands.  The
2432
   'one' operand is not any operand but one of the operands that can
2433
   accommadate all the information that has been decoded.  */
2434
2435
static int
2436
do_special_decoding (aarch64_inst *inst)
2437
4.53M
{
2438
4.53M
  int idx;
2439
4.53M
  aarch64_insn value;
2440
  /* Condition for truly conditional executed instructions, e.g. b.cond.  */
2441
4.53M
  if (inst->opcode->flags & F_COND)
2442
70.2k
    {
2443
70.2k
      value = extract_field (FLD_cond2, inst->value, 0);
2444
70.2k
      inst->cond = get_cond_from_value (value);
2445
70.2k
    }
2446
  /* 'sf' field.  */
2447
4.53M
  if (inst->opcode->flags & F_SF)
2448
3.46M
    {
2449
3.46M
      idx = select_operand_for_sf_field_coding (inst->opcode);
2450
3.46M
      value = extract_field (FLD_sf, inst->value, 0);
2451
3.46M
      inst->operands[idx].qualifier = get_greg_qualifier_from_value (value);
2452
3.46M
      if ((inst->opcode->flags & F_N)
2453
3.46M
    && extract_field (FLD_N, inst->value, 0) != value)
2454
125k
  return 0;
2455
3.46M
    }
2456
  /* 'sf' field.  */
2457
4.40M
  if (inst->opcode->flags & F_LSE_SZ)
2458
20.3k
    {
2459
20.3k
      idx = select_operand_for_sf_field_coding (inst->opcode);
2460
20.3k
      value = extract_field (FLD_lse_sz, inst->value, 0);
2461
20.3k
      inst->operands[idx].qualifier = get_greg_qualifier_from_value (value);
2462
20.3k
    }
2463
  /* size:Q fields.  */
2464
4.40M
  if (inst->opcode->flags & F_SIZEQ)
2465
395k
    return decode_sizeq (inst);
2466
2467
4.00M
  if (inst->opcode->flags & F_FPTYPE)
2468
114k
    {
2469
114k
      idx = select_operand_for_fptype_field_coding (inst->opcode);
2470
114k
      value = extract_field (FLD_type, inst->value, 0);
2471
114k
      switch (value)
2472
114k
  {
2473
32.9k
  case 0: inst->operands[idx].qualifier = AARCH64_OPND_QLF_S_S; break;
2474
16.9k
  case 1: inst->operands[idx].qualifier = AARCH64_OPND_QLF_S_D; break;
2475
32.3k
  case 3: inst->operands[idx].qualifier = AARCH64_OPND_QLF_S_H; break;
2476
31.6k
  default: return 0;
2477
114k
  }
2478
114k
    }
2479
2480
3.97M
  if (inst->opcode->flags & F_SSIZE)
2481
26.1k
    {
2482
      /* N.B. some opcodes like FCMGT <V><d>, <V><n>, #0 have the size[1] as part
2483
   of the base opcode.  */
2484
26.1k
      aarch64_insn mask;
2485
26.1k
      enum aarch64_opnd_qualifier candidates[AARCH64_MAX_QLF_SEQ_NUM];
2486
26.1k
      idx = select_operand_for_scalar_size_field_coding (inst->opcode);
2487
26.1k
      value = extract_field (FLD_size, inst->value, inst->opcode->mask);
2488
26.1k
      mask = extract_field (FLD_size, ~inst->opcode->mask, 0);
2489
      /* For most related instruciton, the 'size' field is fully available for
2490
   operand encoding.  */
2491
26.1k
      if (mask == 0x3)
2492
18.1k
  inst->operands[idx].qualifier = get_sreg_qualifier_from_value (value);
2493
8.03k
      else
2494
8.03k
  {
2495
8.03k
    get_operand_possible_qualifiers (idx, inst->opcode->qualifiers_list,
2496
8.03k
             candidates);
2497
8.03k
    inst->operands[idx].qualifier
2498
8.03k
      = get_qualifier_from_partial_encoding (value, candidates, mask);
2499
8.03k
  }
2500
26.1k
    }
2501
2502
3.97M
  if (inst->opcode->flags & F_T)
2503
5.81k
    {
2504
      /* Num of consecutive '0's on the right side of imm5<3:0>.  */
2505
5.81k
      int num = 0;
2506
5.81k
      unsigned val, Q;
2507
5.81k
      assert (aarch64_get_operand_class (inst->opcode->operands[0])
2508
5.81k
        == AARCH64_OPND_CLASS_SIMD_REG);
2509
      /* imm5<3:0>  q <t>
2510
   0000   x reserved
2511
   xxx1   0 8b
2512
   xxx1   1 16b
2513
   xx10   0 4h
2514
   xx10   1 8h
2515
   x100   0 2s
2516
   x100   1 4s
2517
   1000   0 reserved
2518
   1000   1 2d  */
2519
5.81k
      val = extract_field (FLD_imm5, inst->value, 0);
2520
13.9k
      while ((val & 0x1) == 0 && ++num <= 3)
2521
8.17k
  val >>= 1;
2522
5.81k
      if (num > 3)
2523
1.23k
  return 0;
2524
4.57k
      Q = (unsigned) extract_field (FLD_Q, inst->value, inst->opcode->mask);
2525
4.57k
      inst->operands[0].qualifier =
2526
4.57k
  get_vreg_qualifier_from_value ((num << 1) | Q);
2527
4.57k
    }
2528
2529
3.97M
  if (inst->opcode->flags & F_GPRSIZE_IN_Q)
2530
346k
    {
2531
      /* Use Rt to encode in the case of e.g.
2532
   STXP <Ws>, <Xt1>, <Xt2>, [<Xn|SP>{,#0}].  */
2533
346k
      idx = aarch64_operand_index (inst->opcode->operands, AARCH64_OPND_Rt);
2534
346k
      if (idx == -1)
2535
2.06k
  {
2536
    /* Otherwise use the result operand, which has to be a integer
2537
       register.  */
2538
2.06k
    assert (aarch64_get_operand_class (inst->opcode->operands[0])
2539
2.06k
      == AARCH64_OPND_CLASS_INT_REG);
2540
2.06k
    idx = 0;
2541
2.06k
  }
2542
346k
      assert (idx == 0 || idx == 1);
2543
346k
      value = extract_field (FLD_Q, inst->value, 0);
2544
346k
      inst->operands[idx].qualifier = get_greg_qualifier_from_value (value);
2545
346k
    }
2546
2547
3.97M
  if (inst->opcode->flags & F_LDS_SIZE)
2548
75.0k
    {
2549
75.0k
      aarch64_field field = {0, 0};
2550
75.0k
      assert (aarch64_get_operand_class (inst->opcode->operands[0])
2551
75.0k
        == AARCH64_OPND_CLASS_INT_REG);
2552
75.0k
      gen_sub_field (FLD_opc, 0, 1, &field);
2553
75.0k
      value = extract_field_2 (&field, inst->value, 0);
2554
75.0k
      inst->operands[0].qualifier
2555
75.0k
  = value ? AARCH64_OPND_QLF_W : AARCH64_OPND_QLF_X;
2556
75.0k
    }
2557
2558
  /* Miscellaneous decoding; done as the last step.  */
2559
3.97M
  if (inst->opcode->flags & F_MISC)
2560
15.8k
    return do_misc_decoding (inst);
2561
2562
3.96M
  return 1;
2563
3.97M
}
2564
2565
/* Converters converting a real opcode instruction to its alias form.  */
2566
2567
/* ROR <Wd>, <Ws>, #<shift>
2568
     is equivalent to:
2569
   EXTR <Wd>, <Ws>, <Ws>, #<shift>.  */
2570
static int
2571
convert_extr_to_ror (aarch64_inst *inst)
2572
6.95k
{
2573
6.95k
  if (inst->operands[1].reg.regno == inst->operands[2].reg.regno)
2574
345
    {
2575
345
      copy_operand_info (inst, 2, 3);
2576
345
      inst->operands[3].type = AARCH64_OPND_NIL;
2577
345
      return 1;
2578
345
    }
2579
6.61k
  return 0;
2580
6.95k
}
2581
2582
/* UXTL<Q> <Vd>.<Ta>, <Vn>.<Tb>
2583
     is equivalent to:
2584
   USHLL<Q> <Vd>.<Ta>, <Vn>.<Tb>, #0.  */
2585
static int
2586
convert_shll_to_xtl (aarch64_inst *inst)
2587
421
{
2588
421
  if (inst->operands[2].imm.value == 0)
2589
368
    {
2590
368
      inst->operands[2].type = AARCH64_OPND_NIL;
2591
368
      return 1;
2592
368
    }
2593
53
  return 0;
2594
421
}
2595
2596
/* Convert
2597
     UBFM <Xd>, <Xn>, #<shift>, #63.
2598
   to
2599
     LSR <Xd>, <Xn>, #<shift>.  */
2600
static int
2601
convert_bfm_to_sr (aarch64_inst *inst)
2602
69.2k
{
2603
69.2k
  int64_t imms, val;
2604
2605
69.2k
  imms = inst->operands[3].imm.value;
2606
69.2k
  val = inst->operands[2].qualifier == AARCH64_OPND_QLF_imm_0_31 ? 31 : 63;
2607
69.2k
  if (imms == val)
2608
1.31k
    {
2609
1.31k
      inst->operands[3].type = AARCH64_OPND_NIL;
2610
1.31k
      return 1;
2611
1.31k
    }
2612
2613
67.9k
  return 0;
2614
69.2k
}
2615
2616
/* Convert MOV to ORR.  */
2617
static int
2618
convert_orr_to_mov (aarch64_inst *inst)
2619
240
{
2620
  /* MOV <Vd>.<T>, <Vn>.<T>
2621
     is equivalent to:
2622
     ORR <Vd>.<T>, <Vn>.<T>, <Vn>.<T>.  */
2623
240
  if (inst->operands[1].reg.regno == inst->operands[2].reg.regno)
2624
4
    {
2625
4
      inst->operands[2].type = AARCH64_OPND_NIL;
2626
4
      return 1;
2627
4
    }
2628
236
  return 0;
2629
240
}
2630
2631
/* When <imms> >= <immr>, the instruction written:
2632
     SBFX <Xd>, <Xn>, #<lsb>, #<width>
2633
   is equivalent to:
2634
     SBFM <Xd>, <Xn>, #<lsb>, #(<lsb>+<width>-1).  */
2635
2636
static int
2637
convert_bfm_to_bfx (aarch64_inst *inst)
2638
82.1k
{
2639
82.1k
  int64_t immr, imms;
2640
2641
82.1k
  immr = inst->operands[2].imm.value;
2642
82.1k
  imms = inst->operands[3].imm.value;
2643
82.1k
  if (imms >= immr)
2644
26.9k
    {
2645
26.9k
      int64_t lsb = immr;
2646
26.9k
      inst->operands[2].imm.value = lsb;
2647
26.9k
      inst->operands[3].imm.value = imms + 1 - lsb;
2648
      /* The two opcodes have different qualifiers for
2649
   the immediate operands; reset to help the checking.  */
2650
26.9k
      reset_operand_qualifier (inst, 2);
2651
26.9k
      reset_operand_qualifier (inst, 3);
2652
26.9k
      return 1;
2653
26.9k
    }
2654
2655
55.2k
  return 0;
2656
82.1k
}
2657
2658
/* When <imms> < <immr>, the instruction written:
2659
     SBFIZ <Xd>, <Xn>, #<lsb>, #<width>
2660
   is equivalent to:
2661
     SBFM <Xd>, <Xn>, #((64-<lsb>)&0x3f), #(<width>-1).  */
2662
2663
static int
2664
convert_bfm_to_bfi (aarch64_inst *inst)
2665
55.2k
{
2666
55.2k
  int64_t immr, imms, val;
2667
2668
55.2k
  immr = inst->operands[2].imm.value;
2669
55.2k
  imms = inst->operands[3].imm.value;
2670
55.2k
  val = inst->operands[2].qualifier == AARCH64_OPND_QLF_imm_0_31 ? 32 : 64;
2671
55.2k
  if (imms < immr)
2672
55.2k
    {
2673
55.2k
      inst->operands[2].imm.value = (val - immr) & (val - 1);
2674
55.2k
      inst->operands[3].imm.value = imms + 1;
2675
      /* The two opcodes have different qualifiers for
2676
   the immediate operands; reset to help the checking.  */
2677
55.2k
      reset_operand_qualifier (inst, 2);
2678
55.2k
      reset_operand_qualifier (inst, 3);
2679
55.2k
      return 1;
2680
55.2k
    }
2681
2682
0
  return 0;
2683
55.2k
}
2684
2685
/* The instruction written:
2686
     BFC <Xd>, #<lsb>, #<width>
2687
   is equivalent to:
2688
     BFM <Xd>, XZR, #((64-<lsb>)&0x3f), #(<width>-1).  */
2689
2690
static int
2691
convert_bfm_to_bfc (aarch64_inst *inst)
2692
597
{
2693
597
  int64_t immr, imms, val;
2694
2695
  /* Should have been assured by the base opcode value.  */
2696
597
  assert (inst->operands[1].reg.regno == 0x1f);
2697
2698
597
  immr = inst->operands[2].imm.value;
2699
597
  imms = inst->operands[3].imm.value;
2700
597
  val = inst->operands[2].qualifier == AARCH64_OPND_QLF_imm_0_31 ? 32 : 64;
2701
597
  if (imms < immr)
2702
263
    {
2703
      /* Drop XZR from the second operand.  */
2704
263
      copy_operand_info (inst, 1, 2);
2705
263
      copy_operand_info (inst, 2, 3);
2706
263
      inst->operands[3].type = AARCH64_OPND_NIL;
2707
2708
      /* Recalculate the immediates.  */
2709
263
      inst->operands[1].imm.value = (val - immr) & (val - 1);
2710
263
      inst->operands[2].imm.value = imms + 1;
2711
2712
      /* The two opcodes have different qualifiers for the operands; reset to
2713
   help the checking.  */
2714
263
      reset_operand_qualifier (inst, 1);
2715
263
      reset_operand_qualifier (inst, 2);
2716
263
      reset_operand_qualifier (inst, 3);
2717
2718
263
      return 1;
2719
263
    }
2720
2721
334
  return 0;
2722
597
}
2723
2724
/* The instruction written:
2725
     LSL <Xd>, <Xn>, #<shift>
2726
   is equivalent to:
2727
     UBFM <Xd>, <Xn>, #((64-<shift>)&0x3f), #(63-<shift>).  */
2728
2729
static int
2730
convert_ubfm_to_lsl (aarch64_inst *inst)
2731
15.3k
{
2732
15.3k
  int64_t immr = inst->operands[2].imm.value;
2733
15.3k
  int64_t imms = inst->operands[3].imm.value;
2734
15.3k
  int64_t val
2735
15.3k
    = inst->operands[2].qualifier == AARCH64_OPND_QLF_imm_0_31 ? 31 : 63;
2736
2737
15.3k
  if ((immr == 0 && imms == val) || immr == imms + 1)
2738
447
    {
2739
447
      inst->operands[3].type = AARCH64_OPND_NIL;
2740
447
      inst->operands[2].imm.value = val - imms;
2741
447
      return 1;
2742
447
    }
2743
2744
14.8k
  return 0;
2745
15.3k
}
2746
2747
/* CINC <Wd>, <Wn>, <cond>
2748
     is equivalent to:
2749
   CSINC <Wd>, <Wn>, <Wn>, invert(<cond>)
2750
     where <cond> is not AL or NV.  */
2751
2752
static int
2753
convert_from_csel (aarch64_inst *inst)
2754
7.60k
{
2755
7.60k
  if (inst->operands[1].reg.regno == inst->operands[2].reg.regno
2756
7.60k
      && (inst->operands[3].cond->value & 0xe) != 0xe)
2757
244
    {
2758
244
      copy_operand_info (inst, 2, 3);
2759
244
      inst->operands[2].cond = get_inverted_cond (inst->operands[3].cond);
2760
244
      inst->operands[3].type = AARCH64_OPND_NIL;
2761
244
      return 1;
2762
244
    }
2763
7.36k
  return 0;
2764
7.60k
}
2765
2766
/* CSET <Wd>, <cond>
2767
     is equivalent to:
2768
   CSINC <Wd>, WZR, WZR, invert(<cond>)
2769
     where <cond> is not AL or NV.  */
2770
2771
static int
2772
convert_csinc_to_cset (aarch64_inst *inst)
2773
722
{
2774
722
  if (inst->operands[1].reg.regno == 0x1f
2775
722
      && inst->operands[2].reg.regno == 0x1f
2776
722
      && (inst->operands[3].cond->value & 0xe) != 0xe)
2777
722
    {
2778
722
      copy_operand_info (inst, 1, 3);
2779
722
      inst->operands[1].cond = get_inverted_cond (inst->operands[3].cond);
2780
722
      inst->operands[3].type = AARCH64_OPND_NIL;
2781
722
      inst->operands[2].type = AARCH64_OPND_NIL;
2782
722
      return 1;
2783
722
    }
2784
0
  return 0;
2785
722
}
2786
2787
/* MOV <Wd>, #<imm>
2788
     is equivalent to:
2789
   MOVZ <Wd>, #<imm16_5>, LSL #<shift>.
2790
2791
   A disassembler may output ORR, MOVZ and MOVN as a MOV mnemonic, except when
2792
   ORR has an immediate that could be generated by a MOVZ or MOVN instruction,
2793
   or where a MOVN has an immediate that could be encoded by MOVZ, or where
2794
   MOVZ/MOVN #0 have a shift amount other than LSL #0, in which case the
2795
   machine-instruction mnemonic must be used.  */
2796
2797
static int
2798
convert_movewide_to_mov (aarch64_inst *inst)
2799
113k
{
2800
113k
  uint64_t value = inst->operands[1].imm.value;
2801
  /* MOVZ/MOVN #0 have a shift amount other than LSL #0.  */
2802
113k
  if (value == 0 && inst->operands[1].shifter.amount != 0)
2803
51
    return 0;
2804
113k
  inst->operands[1].type = AARCH64_OPND_IMM_MOV;
2805
113k
  inst->operands[1].shifter.kind = AARCH64_MOD_NONE;
2806
113k
  value <<= inst->operands[1].shifter.amount;
2807
  /* As an alias convertor, it has to be clear that the INST->OPCODE
2808
     is the opcode of the real instruction.  */
2809
113k
  if (inst->opcode->op == OP_MOVN)
2810
65.2k
    {
2811
65.2k
      int is32 = inst->operands[0].qualifier == AARCH64_OPND_QLF_W;
2812
65.2k
      value = ~value;
2813
      /* A MOVN has an immediate that could be encoded by MOVZ.  */
2814
65.2k
      if (aarch64_wide_constant_p (value, is32, NULL))
2815
1
  return 0;
2816
65.2k
    }
2817
113k
  inst->operands[1].imm.value = value;
2818
113k
  inst->operands[1].shifter.amount = 0;
2819
113k
  return 1;
2820
113k
}
2821
2822
/* MOV <Wd>, #<imm>
2823
     is equivalent to:
2824
   ORR <Wd>, WZR, #<imm>.
2825
2826
   A disassembler may output ORR, MOVZ and MOVN as a MOV mnemonic, except when
2827
   ORR has an immediate that could be generated by a MOVZ or MOVN instruction,
2828
   or where a MOVN has an immediate that could be encoded by MOVZ, or where
2829
   MOVZ/MOVN #0 have a shift amount other than LSL #0, in which case the
2830
   machine-instruction mnemonic must be used.  */
2831
2832
static int
2833
convert_movebitmask_to_mov (aarch64_inst *inst)
2834
1.38k
{
2835
1.38k
  int is32;
2836
1.38k
  uint64_t value;
2837
2838
  /* Should have been assured by the base opcode value.  */
2839
1.38k
  assert (inst->operands[1].reg.regno == 0x1f);
2840
1.38k
  copy_operand_info (inst, 1, 2);
2841
1.38k
  is32 = inst->operands[0].qualifier == AARCH64_OPND_QLF_W;
2842
1.38k
  inst->operands[1].type = AARCH64_OPND_IMM_MOV;
2843
1.38k
  value = inst->operands[1].imm.value;
2844
  /* ORR has an immediate that could be generated by a MOVZ or MOVN
2845
     instruction.  */
2846
1.38k
  if (inst->operands[0].reg.regno != 0x1f
2847
1.38k
      && (aarch64_wide_constant_p (value, is32, NULL)
2848
1.15k
    || aarch64_wide_constant_p (~value, is32, NULL)))
2849
398
    return 0;
2850
2851
986
  inst->operands[2].type = AARCH64_OPND_NIL;
2852
986
  return 1;
2853
1.38k
}
2854
2855
/* Some alias opcodes are disassembled by being converted from their real-form.
2856
   N.B. INST->OPCODE is the real opcode rather than the alias.  */
2857
2858
static int
2859
convert_to_alias (aarch64_inst *inst, const aarch64_opcode *alias)
2860
353k
{
2861
353k
  switch (alias->op)
2862
353k
    {
2863
53.4k
    case OP_ASR_IMM:
2864
69.2k
    case OP_LSR_IMM:
2865
69.2k
      return convert_bfm_to_sr (inst);
2866
15.3k
    case OP_LSL_IMM:
2867
15.3k
      return convert_ubfm_to_lsl (inst);
2868
2.43k
    case OP_CINC:
2869
5.03k
    case OP_CINV:
2870
7.60k
    case OP_CNEG:
2871
7.60k
      return convert_from_csel (inst);
2872
653
    case OP_CSET:
2873
722
    case OP_CSETM:
2874
722
      return convert_csinc_to_cset (inst);
2875
14.8k
    case OP_UBFX:
2876
29.5k
    case OP_BFXIL:
2877
82.1k
    case OP_SBFX:
2878
82.1k
      return convert_bfm_to_bfx (inst);
2879
41.4k
    case OP_SBFIZ:
2880
47.5k
    case OP_BFI:
2881
55.2k
    case OP_UBFIZ:
2882
55.2k
      return convert_bfm_to_bfi (inst);
2883
597
    case OP_BFC:
2884
597
      return convert_bfm_to_bfc (inst);
2885
240
    case OP_MOV_V:
2886
240
      return convert_orr_to_mov (inst);
2887
48.1k
    case OP_MOV_IMM_WIDE:
2888
113k
    case OP_MOV_IMM_WIDEN:
2889
113k
      return convert_movewide_to_mov (inst);
2890
1.38k
    case OP_MOV_IMM_LOG:
2891
1.38k
      return convert_movebitmask_to_mov (inst);
2892
6.95k
    case OP_ROR_IMM:
2893
6.95k
      return convert_extr_to_ror (inst);
2894
37
    case OP_SXTL:
2895
58
    case OP_SXTL2:
2896
386
    case OP_UXTL:
2897
421
    case OP_UXTL2:
2898
421
      return convert_shll_to_xtl (inst);
2899
0
    default:
2900
0
      return 0;
2901
353k
    }
2902
353k
}
2903
2904
static bool
2905
aarch64_opcode_decode (const aarch64_opcode *, const aarch64_insn,
2906
           aarch64_inst *, int, aarch64_operand_error *errors);
2907
2908
/* Given the instruction information in *INST, check if the instruction has
2909
   any alias form that can be used to represent *INST.  If the answer is yes,
2910
   update *INST to be in the form of the determined alias.  */
2911
2912
/* In the opcode description table, the following flags are used in opcode
2913
   entries to help establish the relations between the real and alias opcodes:
2914
2915
  F_ALIAS:  opcode is an alias
2916
  F_HAS_ALIAS:  opcode has alias(es)
2917
  F_P1
2918
  F_P2
2919
  F_P3:   Disassembly preference priority 1-3 (the larger the
2920
      higher).  If nothing is specified, it is the priority
2921
      0 by default, i.e. the lowest priority.
2922
2923
   Although the relation between the machine and the alias instructions are not
2924
   explicitly described, it can be easily determined from the base opcode
2925
   values, masks and the flags F_ALIAS and F_HAS_ALIAS in their opcode
2926
   description entries:
2927
2928
   The mask of an alias opcode must be equal to or a super-set (i.e. more
2929
   constrained) of that of the aliased opcode; so is the base opcode value.
2930
2931
   if (opcode_has_alias (real) && alias_opcode_p (opcode)
2932
       && (opcode->mask & real->mask) == real->mask
2933
       && (real->mask & opcode->opcode) == (real->mask & real->opcode))
2934
   then OPCODE is an alias of, and only of, the REAL instruction
2935
2936
   The alias relationship is forced flat-structured to keep related algorithm
2937
   simple; an opcode entry cannot be flagged with both F_ALIAS and F_HAS_ALIAS.
2938
2939
   During the disassembling, the decoding decision tree (in
2940
   opcodes/aarch64-dis-2.c) always returns an machine instruction opcode entry;
2941
   if the decoding of such a machine instruction succeeds (and -Mno-aliases is
2942
   not specified), the disassembler will check whether there is any alias
2943
   instruction exists for this real instruction.  If there is, the disassembler
2944
   will try to disassemble the 32-bit binary again using the alias's rule, or
2945
   try to convert the IR to the form of the alias.  In the case of the multiple
2946
   aliases, the aliases are tried one by one from the highest priority
2947
   (currently the flag F_P3) to the lowest priority (no priority flag), and the
2948
   first succeeds first adopted.
2949
2950
   You may ask why there is a need for the conversion of IR from one form to
2951
   another in handling certain aliases.  This is because on one hand it avoids
2952
   adding more operand code to handle unusual encoding/decoding; on other
2953
   hand, during the disassembling, the conversion is an effective approach to
2954
   check the condition of an alias (as an alias may be adopted only if certain
2955
   conditions are met).
2956
2957
   In order to speed up the alias opcode lookup, aarch64-gen has preprocessed
2958
   aarch64_opcode_table and generated aarch64_find_alias_opcode and
2959
   aarch64_find_next_alias_opcode (in opcodes/aarch64-dis-2.c) to help.  */
2960
2961
static void
2962
determine_disassembling_preference (struct aarch64_inst *inst,
2963
            aarch64_operand_error *errors)
2964
8.59M
{
2965
8.59M
  const aarch64_opcode *opcode;
2966
8.59M
  const aarch64_opcode *alias;
2967
2968
8.59M
  opcode = inst->opcode;
2969
2970
  /* This opcode does not have an alias, so use itself.  */
2971
8.59M
  if (!opcode_has_alias (opcode))
2972
7.54M
    return;
2973
2974
1.04M
  alias = aarch64_find_alias_opcode (opcode);
2975
1.04M
  assert (alias);
2976
2977
#ifdef DEBUG_AARCH64
2978
  if (debug_dump)
2979
    {
2980
      const aarch64_opcode *tmp = alias;
2981
      printf ("####   LIST    orderd: ");
2982
      while (tmp)
2983
  {
2984
    printf ("%s, ", tmp->name);
2985
    tmp = aarch64_find_next_alias_opcode (tmp);
2986
  }
2987
      printf ("\n");
2988
    }
2989
#endif /* DEBUG_AARCH64 */
2990
2991
2.29M
  for (; alias; alias = aarch64_find_next_alias_opcode (alias))
2992
2.29M
    {
2993
2.29M
      DEBUG_TRACE ("try %s", alias->name);
2994
2.29M
      assert (alias_opcode_p (alias) || opcode_has_alias (opcode));
2995
2996
      /* An alias can be a pseudo opcode which will never be used in the
2997
   disassembly, e.g. BIC logical immediate is such a pseudo opcode
2998
   aliasing AND.  */
2999
2.29M
      if (pseudo_opcode_p (alias))
3000
171k
  {
3001
171k
    DEBUG_TRACE ("skip pseudo %s", alias->name);
3002
171k
    continue;
3003
171k
  }
3004
3005
2.12M
      if ((inst->value & alias->mask) != alias->opcode)
3006
898k
  {
3007
898k
    DEBUG_TRACE ("skip %s as base opcode not match", alias->name);
3008
898k
    continue;
3009
898k
  }
3010
3011
1.22M
      if (!AARCH64_CPU_HAS_FEATURE (arch_variant, *alias->avariant))
3012
26
  {
3013
26
    DEBUG_TRACE ("skip %s: we're missing features", alias->name);
3014
26
    continue;
3015
26
  }
3016
3017
      /* No need to do any complicated transformation on operands, if the alias
3018
   opcode does not have any operand.  */
3019
1.22M
      if (aarch64_num_of_operands (alias) == 0 && alias->opcode == inst->value)
3020
94
  {
3021
94
    DEBUG_TRACE ("succeed with 0-operand opcode %s", alias->name);
3022
94
    aarch64_replace_opcode (inst, alias);
3023
94
    return;
3024
94
  }
3025
1.22M
      if (alias->flags & F_CONV)
3026
353k
  {
3027
353k
    aarch64_inst copy;
3028
353k
    memcpy (&copy, inst, sizeof (aarch64_inst));
3029
    /* ALIAS is the preference as long as the instruction can be
3030
       successfully converted to the form of ALIAS.  */
3031
353k
    if (convert_to_alias (&copy, alias) == 1)
3032
200k
      {
3033
200k
        aarch64_replace_opcode (&copy, alias);
3034
200k
        if (aarch64_match_operands_constraint (&copy, NULL) != 1)
3035
0
    {
3036
0
      DEBUG_TRACE ("FAILED with alias %s ", alias->name);
3037
0
    }
3038
200k
        else
3039
200k
    {
3040
200k
      DEBUG_TRACE ("succeed with %s via conversion", alias->name);
3041
200k
      memcpy (inst, &copy, sizeof (aarch64_inst));
3042
200k
    }
3043
200k
        return;
3044
200k
      }
3045
353k
  }
3046
868k
      else
3047
868k
  {
3048
    /* Directly decode the alias opcode.  */
3049
868k
    aarch64_inst temp;
3050
868k
    memset (&temp, '\0', sizeof (aarch64_inst));
3051
868k
    if (aarch64_opcode_decode (alias, inst->value, &temp, 1, errors) == 1)
3052
844k
      {
3053
844k
        DEBUG_TRACE ("succeed with %s via direct decoding", alias->name);
3054
844k
        memcpy (inst, &temp, sizeof (aarch64_inst));
3055
844k
        return;
3056
844k
      }
3057
868k
  }
3058
1.22M
    }
3059
1.04M
}
3060
3061
/* Some instructions (including all SVE ones) use the instruction class
3062
   to describe how a qualifiers_list index is represented in the instruction
3063
   encoding.  If INST is such an instruction, decode the appropriate fields
3064
   and fill in the operand qualifiers accordingly.  Return true if no
3065
   problems are found.  */
3066
3067
static bool
3068
aarch64_decode_variant_using_iclass (aarch64_inst *inst)
3069
10.7M
{
3070
10.7M
  int i, variant;
3071
3072
10.7M
  variant = 0;
3073
10.7M
  switch (inst->opcode->iclass)
3074
10.7M
    {
3075
16.6k
    case sme_mov:
3076
16.6k
      variant = extract_fields (inst->value, 0, 2, FLD_SME_Q, FLD_SME_size_22);
3077
16.6k
      if (variant >= 4 && variant < 7)
3078
3.81k
  return false;
3079
12.8k
      if (variant == 7)
3080
215
  variant = 4;
3081
12.8k
      break;
3082
3083
2.69k
    case sme_psel:
3084
2.69k
      i = extract_fields (inst->value, 0, 2, FLD_SME_tszh, FLD_SME_tszl);
3085
2.69k
      if (i == 0)
3086
884
  return false;
3087
3.33k
      while ((i & 1) == 0)
3088
1.52k
  {
3089
1.52k
    i >>= 1;
3090
1.52k
    variant += 1;
3091
1.52k
  }
3092
1.81k
      break;
3093
3094
214
    case sme_shift:
3095
214
      i = extract_field (FLD_SVE_tszh, inst->value, 0);
3096
214
      goto sve_shift;
3097
3098
208
    case sme_size_12_bhs:
3099
208
      variant = extract_field (FLD_SME_size_12, inst->value, 0);
3100
208
      if (variant >= 3)
3101
23
  return false;
3102
185
      break;
3103
3104
185
    case sme_size_12_hs:
3105
33
      variant = extract_field (FLD_SME_size_12, inst->value, 0);
3106
33
      if (variant != 1 && variant != 2)
3107
33
  return false;
3108
0
      variant -= 1;
3109
0
      break;
3110
3111
5.02k
    case sme_size_22:
3112
5.02k
      variant = extract_field (FLD_SME_size_22, inst->value, 0);
3113
5.02k
      break;
3114
3115
1.04k
    case sme_size_22_hsd:
3116
1.04k
      variant = extract_field (FLD_SME_size_22, inst->value, 0);
3117
1.04k
      if (variant < 1)
3118
216
  return false;
3119
831
      variant -= 1;
3120
831
      break;
3121
3122
0
    case sme_sz_23:
3123
0
      variant = extract_field (FLD_SME_sz_23, inst->value, 0);
3124
0
      break;
3125
3126
31.7k
    case sve_cpy:
3127
31.7k
      variant = extract_fields (inst->value, 0, 2, FLD_size, FLD_SVE_M_14);
3128
31.7k
      break;
3129
3130
1.98k
    case sve_index:
3131
1.98k
      i = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_imm5);
3132
1.98k
      if ((i & 31) == 0)
3133
212
  return false;
3134
2.88k
      while ((i & 1) == 0)
3135
1.11k
  {
3136
1.11k
    i >>= 1;
3137
1.11k
    variant += 1;
3138
1.11k
  }
3139
1.76k
      break;
3140
3141
48.3k
    case sve_limm:
3142
      /* Pick the smallest applicable element size.  */
3143
48.3k
      if ((inst->value & 0x20600) == 0x600)
3144
6.63k
  variant = 0;
3145
41.7k
      else if ((inst->value & 0x20400) == 0x400)
3146
4.80k
  variant = 1;
3147
36.9k
      else if ((inst->value & 0x20000) == 0)
3148
31.9k
  variant = 2;
3149
5.00k
      else
3150
5.00k
  variant = 3;
3151
48.3k
      break;
3152
3153
36
    case sme2_mov:
3154
      /* .D is preferred over the other sizes in disassembly.  */
3155
36
      variant = 3;
3156
36
      break;
3157
3158
85.8k
    case sme_misc:
3159
638k
    case sve_misc:
3160
      /* These instructions have only a single variant.  */
3161
638k
      break;
3162
3163
332
    case sve_movprfx:
3164
332
      variant = extract_fields (inst->value, 0, 2, FLD_size, FLD_SVE_M_16);
3165
332
      break;
3166
3167
57
    case sve_pred_zm:
3168
57
      variant = extract_field (FLD_SVE_M_4, inst->value, 0);
3169
57
      break;
3170
3171
3.66k
    case sve_shift_pred:
3172
3.66k
      i = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_SVE_tszl_8);
3173
5.45k
    sve_shift:
3174
5.45k
      if (i == 0)
3175
1.10k
  return false;
3176
12.0k
      while (i != 1)
3177
7.72k
  {
3178
7.72k
    i >>= 1;
3179
7.72k
    variant += 1;
3180
7.72k
  }
3181
4.35k
      break;
3182
3183
1.57k
    case sve_shift_unpred:
3184
1.57k
      i = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_SVE_tszl_19);
3185
1.57k
      goto sve_shift;
3186
3187
20.7k
    case sve_size_bhs:
3188
20.7k
      variant = extract_field (FLD_size, inst->value, 0);
3189
20.7k
      if (variant >= 3)
3190
4.64k
  return false;
3191
16.0k
      break;
3192
3193
227k
    case sve_size_bhsd:
3194
227k
      variant = extract_field (FLD_size, inst->value, 0);
3195
227k
      break;
3196
3197
168k
    case sve_size_hsd:
3198
168k
      i = extract_field (FLD_size, inst->value, 0);
3199
168k
      if (i < 1)
3200
43.7k
  return false;
3201
124k
      variant = i - 1;
3202
124k
      break;
3203
3204
169
    case sme_fp_sd:
3205
2.42k
    case sme_int_sd:
3206
4.61k
    case sve_size_bh:
3207
11.1k
    case sve_size_sd:
3208
11.1k
      variant = extract_field (FLD_SVE_sz, inst->value, 0);
3209
11.1k
      break;
3210
3211
6.61k
    case sve_size_sd2:
3212
6.61k
      variant = extract_field (FLD_SVE_sz2, inst->value, 0);
3213
6.61k
      break;
3214
3215
181
    case sve_size_hsd2:
3216
181
      i = extract_field (FLD_SVE_size, inst->value, 0);
3217
181
      if (i < 1)
3218
151
  return false;
3219
30
      variant = i - 1;
3220
30
      break;
3221
3222
1.72k
    case sve_size_13:
3223
      /* Ignore low bit of this field since that is set in the opcode for
3224
   instructions of this iclass.  */
3225
1.72k
      i = (extract_field (FLD_size, inst->value, 0) & 2);
3226
1.72k
      variant = (i >> 1);
3227
1.72k
      break;
3228
3229
3.28k
    case sve_shift_tsz_bhsd:
3230
3.28k
      i = extract_fields (inst->value, 0, 2, FLD_SVE_tszh, FLD_SVE_tszl_19);
3231
3.28k
      if (i == 0)
3232
803
  return false;
3233
7.58k
      while (i != 1)
3234
5.10k
  {
3235
5.10k
    i >>= 1;
3236
5.10k
    variant += 1;
3237
5.10k
  }
3238
2.47k
      break;
3239
3240
273
    case sve_size_tsz_bhs:
3241
273
      i = extract_fields (inst->value, 0, 2, FLD_SVE_sz, FLD_SVE_tszl_19);
3242
273
      if (i == 0)
3243
7
  return false;
3244
435
      while (i != 1)
3245
279
  {
3246
279
    if (i & 1)
3247
110
      return false;
3248
169
    i >>= 1;
3249
169
    variant += 1;
3250
169
  }
3251
156
      break;
3252
3253
8.76k
    case sve_shift_tsz_hsd:
3254
8.76k
      i = extract_fields (inst->value, 0, 2, FLD_SVE_sz, FLD_SVE_tszl_19);
3255
8.76k
      if (i == 0)
3256
872
  return false;
3257
20.7k
      while (i != 1)
3258
12.8k
  {
3259
12.8k
    i >>= 1;
3260
12.8k
    variant += 1;
3261
12.8k
  }
3262
7.89k
      break;
3263
3264
9.55M
    default:
3265
      /* No mapping between instruction class and qualifiers.  */
3266
9.55M
      return true;
3267
10.7M
    }
3268
3269
8.00M
  for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
3270
6.86M
    inst->operands[i].qualifier = inst->opcode->qualifiers_list[variant][i];
3271
1.14M
  return true;
3272
10.7M
}
3273
/* Decode the CODE according to OPCODE; fill INST.  Return 0 if the decoding
3274
   fails, which meanes that CODE is not an instruction of OPCODE; otherwise
3275
   return 1.
3276
3277
   If OPCODE has alias(es) and NOALIASES_P is 0, an alias opcode may be
3278
   determined and used to disassemble CODE; this is done just before the
3279
   return.  */
3280
3281
static bool
3282
aarch64_opcode_decode (const aarch64_opcode *opcode, const aarch64_insn code,
3283
           aarch64_inst *inst, int noaliases_p,
3284
           aarch64_operand_error *errors)
3285
26.5M
{
3286
26.5M
  int i;
3287
3288
26.5M
  DEBUG_TRACE ("enter with %s", opcode->name);
3289
3290
26.5M
  assert (opcode && inst);
3291
3292
  /* Clear inst.  */
3293
26.5M
  memset (inst, '\0', sizeof (aarch64_inst));
3294
3295
  /* Check the base opcode.  */
3296
26.5M
  if ((code & opcode->mask) != (opcode->opcode & opcode->mask))
3297
15.5M
    {
3298
15.5M
      DEBUG_TRACE ("base opcode match FAIL");
3299
15.5M
      goto decode_fail;
3300
15.5M
    }
3301
3302
10.9M
  inst->opcode = opcode;
3303
10.9M
  inst->value = code;
3304
3305
  /* Assign operand codes and indexes.  */
3306
37.4M
  for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
3307
37.4M
    {
3308
37.4M
      if (opcode->operands[i] == AARCH64_OPND_NIL)
3309
10.9M
  break;
3310
26.4M
      inst->operands[i].type = opcode->operands[i];
3311
26.4M
      inst->operands[i].idx = i;
3312
26.4M
    }
3313
3314
  /* Call the opcode decoder indicated by flags.  */
3315
10.9M
  if (opcode_has_special_coder (opcode) && do_special_decoding (inst) == 0)
3316
203k
    {
3317
203k
      DEBUG_TRACE ("opcode flag-based decoder FAIL");
3318
203k
      goto decode_fail;
3319
203k
    }
3320
3321
  /* Possibly use the instruction class to determine the correct
3322
     qualifier.  */
3323
10.7M
  if (!aarch64_decode_variant_using_iclass (inst))
3324
56.6k
    {
3325
56.6k
      DEBUG_TRACE ("iclass-based decoder FAIL");
3326
56.6k
      goto decode_fail;
3327
56.6k
    }
3328
3329
  /* Call operand decoders.  */
3330
34.7M
  for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
3331
34.7M
    {
3332
34.7M
      const aarch64_operand *opnd;
3333
34.7M
      enum aarch64_opnd type;
3334
3335
34.7M
      type = opcode->operands[i];
3336
34.7M
      if (type == AARCH64_OPND_NIL)
3337
9.82M
  break;
3338
24.9M
      opnd = &aarch64_operands[type];
3339
24.9M
      if (operand_has_extractor (opnd)
3340
24.9M
    && (! aarch64_extract_operand (opnd, &inst->operands[i], code, inst,
3341
24.9M
           errors)))
3342
867k
  {
3343
867k
    DEBUG_TRACE ("operand decoder FAIL at operand %d", i);
3344
867k
    goto decode_fail;
3345
867k
  }
3346
24.9M
    }
3347
3348
  /* If the opcode has a verifier, then check it now.  */
3349
9.82M
  if (opcode->verifier
3350
9.82M
      && opcode->verifier (inst, code, 0, false, errors, NULL) != ERR_OK)
3351
7.74k
    {
3352
7.74k
      DEBUG_TRACE ("operand verifier FAIL");
3353
7.74k
      goto decode_fail;
3354
7.74k
    }
3355
3356
  /* Match the qualifiers.  */
3357
9.82M
  if (aarch64_match_operands_constraint (inst, NULL) == 1)
3358
9.43M
    {
3359
      /* Arriving here, the CODE has been determined as a valid instruction
3360
   of OPCODE and *INST has been filled with information of this OPCODE
3361
   instruction.  Before the return, check if the instruction has any
3362
   alias and should be disassembled in the form of its alias instead.
3363
   If the answer is yes, *INST will be updated.  */
3364
9.43M
      if (!noaliases_p)
3365
8.59M
  determine_disassembling_preference (inst, errors);
3366
9.43M
      DEBUG_TRACE ("SUCCESS");
3367
9.43M
      return true;
3368
9.43M
    }
3369
385k
  else
3370
385k
    {
3371
385k
      DEBUG_TRACE ("constraint matching FAIL");
3372
385k
    }
3373
3374
17.1M
 decode_fail:
3375
17.1M
  return false;
3376
9.82M
}
3377

3378
/* This does some user-friendly fix-up to *INST.  It is currently focus on
3379
   the adjustment of qualifiers to help the printed instruction
3380
   recognized/understood more easily.  */
3381
3382
static void
3383
user_friendly_fixup (aarch64_inst *inst)
3384
8.59M
{
3385
8.59M
  switch (inst->opcode->iclass)
3386
8.59M
    {
3387
247k
    case testbranch:
3388
      /* TBNZ Xn|Wn, #uimm6, label
3389
   Test and Branch Not Zero: conditionally jumps to label if bit number
3390
   uimm6 in register Xn is not zero.  The bit number implies the width of
3391
   the register, which may be written and should be disassembled as Wn if
3392
   uimm is less than 32. Limited to a branch offset range of +/- 32KiB.
3393
   */
3394
247k
      if (inst->operands[1].imm.value < 32)
3395
154k
  inst->operands[0].qualifier = AARCH64_OPND_QLF_W;
3396
247k
      break;
3397
8.34M
    default: break;
3398
8.59M
    }
3399
8.59M
}
3400
3401
/* Decode INSN and fill in *INST the instruction information.  An alias
3402
   opcode may be filled in *INSN if NOALIASES_P is FALSE.  Return zero on
3403
   success.  */
3404
3405
enum err_type
3406
aarch64_decode_insn (aarch64_insn insn, aarch64_inst *inst,
3407
         bool noaliases_p,
3408
         aarch64_operand_error *errors)
3409
21.4M
{
3410
21.4M
  const aarch64_opcode *opcode = aarch64_opcode_lookup (insn);
3411
3412
#ifdef DEBUG_AARCH64
3413
  if (debug_dump)
3414
    {
3415
      const aarch64_opcode *tmp = opcode;
3416
      printf ("\n");
3417
      DEBUG_TRACE ("opcode lookup:");
3418
      while (tmp != NULL)
3419
  {
3420
    aarch64_verbose ("  %s", tmp->name);
3421
    tmp = aarch64_find_next_opcode (tmp);
3422
  }
3423
    }
3424
#endif /* DEBUG_AARCH64 */
3425
3426
  /* A list of opcodes may have been found, as aarch64_opcode_lookup cannot
3427
     distinguish some opcodes, e.g. SSHR and MOVI, which almost share the same
3428
     opcode field and value, apart from the difference that one of them has an
3429
     extra field as part of the opcode, but such a field is used for operand
3430
     encoding in other opcode(s) ('immh' in the case of the example).  */
3431
38.5M
  while (opcode != NULL)
3432
25.6M
    {
3433
      /* But only one opcode can be decoded successfully for, as the
3434
   decoding routine will check the constraint carefully.  */
3435
25.6M
      if (aarch64_opcode_decode (opcode, insn, inst, noaliases_p, errors) == 1)
3436
8.59M
  return ERR_OK;
3437
17.0M
      opcode = aarch64_find_next_opcode (opcode);
3438
17.0M
    }
3439
3440
12.8M
  return ERR_UND;
3441
21.4M
}
3442
3443
/* Return a short string to indicate a switch to STYLE.  These strings
3444
   will be embedded into the disassembled operand text (as produced by
3445
   aarch64_print_operand), and then spotted in the print_operands function
3446
   so that the disassembler output can be split by style.  */
3447
3448
static const char *
3449
get_style_text (enum disassembler_style style)
3450
47.1M
{
3451
47.1M
  static bool init = false;
3452
47.1M
  static char formats[16][4];
3453
47.1M
  unsigned num;
3454
3455
  /* First time through we build a string for every possible format.  This
3456
     code relies on there being no more than 16 different styles (there's
3457
     an assert below for this).  */
3458
47.1M
  if (!init)
3459
2
    {
3460
2
      int i;
3461
3462
34
      for (i = 0; i <= 0xf; ++i)
3463
32
  {
3464
32
    int res = snprintf (&formats[i][0], sizeof (formats[i]), "%c%x%c",
3465
32
            STYLE_MARKER_CHAR, i, STYLE_MARKER_CHAR);
3466
32
    assert (res == 3);
3467
32
  }
3468
3469
2
      init = true;
3470
2
    }
3471
3472
  /* Return the string that marks switching to STYLE.  */
3473
47.1M
  num = (unsigned) style;
3474
47.1M
  assert (style <= 0xf);
3475
47.1M
  return formats[num];
3476
47.1M
}
3477
3478
/* Callback used by aarch64_print_operand to apply STYLE to the
3479
   disassembler output created from FMT and ARGS.  The STYLER object holds
3480
   any required state.  Must return a pointer to a string (created from FMT
3481
   and ARGS) that will continue to be valid until the complete disassembled
3482
   instruction has been printed.
3483
3484
   We return a string that includes two embedded style markers, the first,
3485
   places at the start of the string, indicates a switch to STYLE, and the
3486
   second, placed at the end of the string, indicates a switch back to the
3487
   default text style.
3488
3489
   Later, when we print the operand text we take care to collapse any
3490
   adjacent style markers, and to ignore any style markers that appear at
3491
   the very end of a complete operand string.  */
3492
3493
static const char *aarch64_apply_style (struct aarch64_styler *styler,
3494
          enum disassembler_style style,
3495
          const char *fmt,
3496
          va_list args)
3497
23.5M
{
3498
23.5M
  int res;
3499
23.5M
  char *ptr, *tmp;
3500
23.5M
  struct obstack *stack = (struct obstack *) styler->state;
3501
23.5M
  va_list ap;
3502
3503
  /* These are the two strings for switching styles.  */
3504
23.5M
  const char *style_on = get_style_text (style);
3505
23.5M
  const char *style_off = get_style_text (dis_style_text);
3506
3507
  /* Calculate space needed once FMT and ARGS are expanded.  */
3508
23.5M
  va_copy (ap, args);
3509
23.5M
  res = vsnprintf (NULL, 0, fmt, ap);
3510
23.5M
  va_end (ap);
3511
23.5M
  assert (res >= 0);
3512
3513
  /* Allocate space on the obstack for the expanded FMT and ARGS, as well
3514
     as the two strings for switching styles, then write all of these
3515
     strings onto the obstack.  */
3516
23.5M
  ptr = (char *) obstack_alloc (stack, res + strlen (style_on)
3517
23.5M
        + strlen (style_off) + 1);
3518
23.5M
  tmp = stpcpy (ptr, style_on);
3519
23.5M
  res = vsnprintf (tmp, (res + 1), fmt, args);
3520
23.5M
  assert (res >= 0);
3521
23.5M
  tmp += res;
3522
23.5M
  strcpy (tmp, style_off);
3523
3524
23.5M
  return ptr;
3525
23.5M
}
3526
3527
/* Print operands.  */
3528
3529
static void
3530
print_operands (bfd_vma pc, const aarch64_opcode *opcode,
3531
    const aarch64_opnd_info *opnds, struct disassemble_info *info,
3532
    bool *has_notes)
3533
8.59M
{
3534
8.59M
  char *notes = NULL;
3535
8.59M
  int i, pcrel_p, num_printed;
3536
8.59M
  struct aarch64_styler styler;
3537
8.59M
  struct obstack content;
3538
8.59M
  obstack_init (&content);
3539
3540
8.59M
  styler.apply_style = aarch64_apply_style;
3541
8.59M
  styler.state = (void *) &content;
3542
3543
27.8M
  for (i = 0, num_printed = 0; i < AARCH64_MAX_OPND_NUM; ++i)
3544
27.8M
    {
3545
27.8M
      char str[128];
3546
27.8M
      char cmt[128];
3547
3548
      /* We regard the opcode operand info more, however we also look into
3549
   the inst->operands to support the disassembling of the optional
3550
   operand.
3551
   The two operand code should be the same in all cases, apart from
3552
   when the operand can be optional.  */
3553
27.8M
      if (opcode->operands[i] == AARCH64_OPND_NIL
3554
27.8M
    || opnds[i].type == AARCH64_OPND_NIL)
3555
8.59M
  break;
3556
3557
      /* Generate the operand string in STR.  */
3558
19.2M
      aarch64_print_operand (str, sizeof (str), pc, opcode, opnds, i, &pcrel_p,
3559
19.2M
           &info->target, &notes, cmt, sizeof (cmt),
3560
19.2M
           arch_variant, &styler);
3561
3562
      /* Print the delimiter (taking account of omitted operand(s)).  */
3563
19.2M
      if (str[0] != '\0')
3564
19.2M
  (*info->fprintf_styled_func) (info->stream, dis_style_text, "%s",
3565
19.2M
              num_printed++ == 0 ? "\t" : ", ");
3566
3567
      /* Print the operand.  */
3568
19.2M
      if (pcrel_p)
3569
2.09M
  (*info->print_address_func) (info->target, info);
3570
17.1M
      else
3571
17.1M
  {
3572
    /* This operand came from aarch64_print_operand, and will include
3573
       embedded strings indicating which style each character should
3574
       have.  In the following code we split the text based on
3575
       CURR_STYLE, and call the styled print callback to print each
3576
       block of text in the appropriate style.  */
3577
17.1M
    char *start, *curr;
3578
17.1M
    enum disassembler_style curr_style = dis_style_text;
3579
3580
17.1M
    start = curr = str;
3581
17.1M
    do
3582
148M
      {
3583
148M
        if (*curr == '\0'
3584
148M
      || (*curr == STYLE_MARKER_CHAR
3585
130M
          && ISXDIGIT (*(curr + 1))
3586
130M
          && *(curr + 2) == STYLE_MARKER_CHAR))
3587
60.1M
    {
3588
      /* Output content between our START position and CURR.  */
3589
60.1M
      int len = curr - start;
3590
60.1M
      if (len > 0)
3591
31.2M
        {
3592
31.2M
          if ((*info->fprintf_styled_func) (info->stream,
3593
31.2M
              curr_style,
3594
31.2M
              "%.*s",
3595
31.2M
              len, start) < 0)
3596
0
      break;
3597
31.2M
        }
3598
3599
60.1M
      if (*curr == '\0')
3600
17.1M
        break;
3601
3602
      /* Skip over the initial STYLE_MARKER_CHAR.  */
3603
42.9M
      ++curr;
3604
3605
      /* Update the CURR_STYLE.  As there are less than 16
3606
         styles, it is possible, that if the input is corrupted
3607
         in some way, that we might set CURR_STYLE to an
3608
         invalid value.  Don't worry though, we check for this
3609
         situation.  */
3610
42.9M
      if (*curr >= '0' && *curr <= '9')
3611
42.9M
        curr_style = (enum disassembler_style) (*curr - '0');
3612
0
      else if (*curr >= 'a' && *curr <= 'f')
3613
0
        curr_style = (enum disassembler_style) (*curr - 'a' + 10);
3614
0
      else
3615
0
        curr_style = dis_style_text;
3616
3617
      /* Check for an invalid style having been selected.  This
3618
         should never happen, but it doesn't hurt to be a
3619
         little paranoid.  */
3620
42.9M
      if (curr_style > dis_style_comment_start)
3621
0
        curr_style = dis_style_text;
3622
3623
      /* Skip the hex character, and the closing STYLE_MARKER_CHAR.  */
3624
42.9M
      curr += 2;
3625
3626
      /* Reset the START to after the style marker.  */
3627
42.9M
      start = curr;
3628
42.9M
    }
3629
88.0M
        else
3630
88.0M
    ++curr;
3631
148M
      }
3632
17.1M
    while (true);
3633
17.1M
  }
3634
3635
      /* Print the comment.  This works because only the last operand ever
3636
   adds a comment.  If that ever changes then we'll need to be
3637
   smarter here.  */
3638
19.2M
      if (cmt[0] != '\0')
3639
135k
  (*info->fprintf_styled_func) (info->stream, dis_style_comment_start,
3640
135k
              "\t// %s", cmt);
3641
19.2M
    }
3642
3643
8.59M
    if (notes && !no_notes)
3644
0
      {
3645
0
  *has_notes = true;
3646
0
  (*info->fprintf_styled_func) (info->stream, dis_style_comment_start,
3647
0
              "  // note: %s", notes);
3648
0
      }
3649
3650
8.59M
    obstack_free (&content, NULL);
3651
8.59M
}
3652
3653
/* Set NAME to a copy of INST's mnemonic with the "." suffix removed.  */
3654
3655
static void
3656
remove_dot_suffix (char *name, const aarch64_inst *inst)
3657
140k
{
3658
140k
  char *ptr;
3659
140k
  size_t len;
3660
3661
140k
  ptr = strchr (inst->opcode->name, '.');
3662
140k
  assert (ptr && inst->cond);
3663
140k
  len = ptr - inst->opcode->name;
3664
140k
  assert (len < 8);
3665
140k
  strncpy (name, inst->opcode->name, len);
3666
140k
  name[len] = '\0';
3667
140k
}
3668
3669
/* Print the instruction mnemonic name.  */
3670
3671
static void
3672
print_mnemonic_name (const aarch64_inst *inst, struct disassemble_info *info)
3673
8.59M
{
3674
8.59M
  if (inst->opcode->flags & F_COND)
3675
70.2k
    {
3676
      /* For instructions that are truly conditionally executed, e.g. b.cond,
3677
   prepare the full mnemonic name with the corresponding condition
3678
   suffix.  */
3679
70.2k
      char name[8];
3680
3681
70.2k
      remove_dot_suffix (name, inst);
3682
70.2k
      (*info->fprintf_styled_func) (info->stream, dis_style_mnemonic,
3683
70.2k
            "%s.%s", name, inst->cond->names[0]);
3684
70.2k
    }
3685
8.52M
  else
3686
8.52M
    (*info->fprintf_styled_func) (info->stream, dis_style_mnemonic,
3687
8.52M
          "%s", inst->opcode->name);
3688
8.59M
}
3689
3690
/* Decide whether we need to print a comment after the operands of
3691
   instruction INST.  */
3692
3693
static void
3694
print_comment (const aarch64_inst *inst, struct disassemble_info *info)
3695
8.59M
{
3696
8.59M
  if (inst->opcode->flags & F_COND)
3697
70.2k
    {
3698
70.2k
      char name[8];
3699
70.2k
      unsigned int i, num_conds;
3700
3701
70.2k
      remove_dot_suffix (name, inst);
3702
70.2k
      num_conds = ARRAY_SIZE (inst->cond->names);
3703
127k
      for (i = 1; i < num_conds && inst->cond->names[i]; ++i)
3704
57.4k
  (*info->fprintf_styled_func) (info->stream, dis_style_comment_start,
3705
57.4k
              "%s %s.%s",
3706
57.4k
              i == 1 ? "  //" : ",",
3707
57.4k
              name, inst->cond->names[i]);
3708
70.2k
    }
3709
8.59M
}
3710
3711
/* Build notes from verifiers into a string for printing.  */
3712
3713
static void
3714
print_verifier_notes (aarch64_operand_error *detail,
3715
          struct disassemble_info *info)
3716
11.9k
{
3717
11.9k
  if (no_notes)
3718
11.9k
    return;
3719
3720
  /* The output of the verifier cannot be a fatal error, otherwise the assembly
3721
     would not have succeeded.  We can safely ignore these.  */
3722
0
  assert (detail->non_fatal);
3723
3724
0
  (*info->fprintf_styled_func) (info->stream, dis_style_comment_start,
3725
0
        "  // note: ");
3726
0
  switch (detail->kind)
3727
0
    {
3728
0
    case AARCH64_OPDE_A_SHOULD_FOLLOW_B:
3729
0
      (*info->fprintf_styled_func) (info->stream, dis_style_text,
3730
0
            _("this `%s' should have an immediately"
3731
0
              " preceding `%s'"),
3732
0
            detail->data[0].s, detail->data[1].s);
3733
0
      break;
3734
3735
0
    case AARCH64_OPDE_EXPECTED_A_AFTER_B:
3736
0
      (*info->fprintf_styled_func) (info->stream, dis_style_text,
3737
0
            _("expected `%s' after previous `%s'"),
3738
0
            detail->data[0].s, detail->data[1].s);
3739
0
      break;
3740
3741
0
    default:
3742
0
      assert (detail->error);
3743
0
      (*info->fprintf_styled_func) (info->stream, dis_style_text,
3744
0
            "%s", detail->error);
3745
0
      if (detail->index >= 0)
3746
0
  (*info->fprintf_styled_func) (info->stream, dis_style_text,
3747
0
              " at operand %d", detail->index + 1);
3748
0
      break;
3749
0
    }
3750
0
}
3751
3752
/* Print the instruction according to *INST.  */
3753
3754
static void
3755
print_aarch64_insn (bfd_vma pc, const aarch64_inst *inst,
3756
        const aarch64_insn code,
3757
        struct disassemble_info *info,
3758
        aarch64_operand_error *mismatch_details)
3759
8.59M
{
3760
8.59M
  bool has_notes = false;
3761
3762
8.59M
  print_mnemonic_name (inst, info);
3763
8.59M
  print_operands (pc, inst->opcode, inst->operands, info, &has_notes);
3764
8.59M
  print_comment (inst, info);
3765
3766
  /* We've already printed a note, not enough space to print more so exit.
3767
     Usually notes shouldn't overlap so it shouldn't happen that we have a note
3768
     from a register and instruction at the same time.  */
3769
8.59M
  if (has_notes)
3770
0
    return;
3771
3772
  /* Always run constraint verifiers, this is needed because constraints need to
3773
     maintain a global state regardless of whether the instruction has the flag
3774
     set or not.  */
3775
8.59M
  enum err_type result = verify_constraints (inst, code, pc, false,
3776
8.59M
               mismatch_details, &insn_sequence);
3777
8.59M
  switch (result)
3778
8.59M
    {
3779
11.9k
    case ERR_VFI:
3780
11.9k
      print_verifier_notes (mismatch_details, info);
3781
11.9k
      break;
3782
0
    case ERR_UND:
3783
0
    case ERR_UNP:
3784
0
    case ERR_NYI:
3785
8.57M
    default:
3786
8.57M
      break;
3787
8.59M
    }
3788
8.59M
}
3789
3790
/* Entry-point of the instruction disassembler and printer.  */
3791
3792
static void
3793
print_insn_aarch64_word (bfd_vma pc,
3794
       uint32_t word,
3795
       struct disassemble_info *info,
3796
       aarch64_operand_error *errors)
3797
21.4M
{
3798
21.4M
  static const char *err_msg[ERR_NR_ENTRIES+1] =
3799
21.4M
    {
3800
21.4M
      [ERR_OK]  = "_",
3801
21.4M
      [ERR_UND] = "undefined",
3802
21.4M
      [ERR_UNP] = "unpredictable",
3803
21.4M
      [ERR_NYI] = "NYI"
3804
21.4M
    };
3805
3806
21.4M
  enum err_type ret;
3807
21.4M
  aarch64_inst inst;
3808
3809
21.4M
  info->insn_info_valid = 1;
3810
21.4M
  info->branch_delay_insns = 0;
3811
21.4M
  info->data_size = 0;
3812
21.4M
  info->target = 0;
3813
21.4M
  info->target2 = 0;
3814
3815
21.4M
  if (info->flags & INSN_HAS_RELOC)
3816
    /* If the instruction has a reloc associated with it, then
3817
       the offset field in the instruction will actually be the
3818
       addend for the reloc.  (If we are using REL type relocs).
3819
       In such cases, we can ignore the pc when computing
3820
       addresses, since the addend is not currently pc-relative.  */
3821
1
    pc = 0;
3822
3823
21.4M
  ret = aarch64_decode_insn (word, &inst, no_aliases, errors);
3824
3825
21.4M
  if (((word >> 21) & 0x3ff) == 1)
3826
142k
    {
3827
      /* RESERVED for ALES.  */
3828
142k
      assert (ret != ERR_OK);
3829
142k
      ret = ERR_NYI;
3830
142k
    }
3831
3832
21.4M
  switch (ret)
3833
21.4M
    {
3834
12.7M
    case ERR_UND:
3835
12.7M
    case ERR_UNP:
3836
12.8M
    case ERR_NYI:
3837
      /* Handle undefined instructions.  */
3838
12.8M
      info->insn_type = dis_noninsn;
3839
12.8M
      (*info->fprintf_styled_func) (info->stream,
3840
12.8M
            dis_style_assembler_directive,
3841
12.8M
            ".inst\t");
3842
12.8M
      (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
3843
12.8M
            "0x%08x", word);
3844
12.8M
      (*info->fprintf_styled_func) (info->stream, dis_style_comment_start,
3845
12.8M
            " ; %s", err_msg[ret]);
3846
12.8M
      break;
3847
8.59M
    case ERR_OK:
3848
8.59M
      user_friendly_fixup (&inst);
3849
8.59M
      print_aarch64_insn (pc, &inst, word, info, errors);
3850
8.59M
      break;
3851
0
    default:
3852
0
      abort ();
3853
21.4M
    }
3854
21.4M
}
3855
3856
/* Disallow mapping symbols ($x, $d etc) from
3857
   being displayed in symbol relative addresses.  */
3858
3859
bool
3860
aarch64_symbol_is_valid (asymbol * sym,
3861
       struct disassemble_info * info ATTRIBUTE_UNUSED)
3862
103k
{
3863
103k
  const char * name;
3864
3865
103k
  if (sym == NULL)
3866
0
    return false;
3867
3868
103k
  name = bfd_asymbol_name (sym);
3869
3870
103k
  return name
3871
103k
    && (name[0] != '$'
3872
103k
  || (name[1] != 'x' && name[1] != 'd')
3873
103k
  || (name[2] != '\0' && name[2] != '.'));
3874
103k
}
3875
3876
/* Print data bytes on INFO->STREAM.  */
3877
3878
static void
3879
print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED,
3880
     uint32_t word,
3881
     struct disassemble_info *info,
3882
     aarch64_operand_error *errors ATTRIBUTE_UNUSED)
3883
0
{
3884
0
  switch (info->bytes_per_chunk)
3885
0
    {
3886
0
    case 1:
3887
0
      info->fprintf_styled_func (info->stream, dis_style_assembler_directive,
3888
0
         ".byte\t");
3889
0
      info->fprintf_styled_func (info->stream, dis_style_immediate,
3890
0
         "0x%02x", word);
3891
0
      break;
3892
0
    case 2:
3893
0
      info->fprintf_styled_func (info->stream, dis_style_assembler_directive,
3894
0
         ".short\t");
3895
0
      info->fprintf_styled_func (info->stream, dis_style_immediate,
3896
0
         "0x%04x", word);
3897
0
      break;
3898
0
    case 4:
3899
0
      info->fprintf_styled_func (info->stream, dis_style_assembler_directive,
3900
0
         ".word\t");
3901
0
      info->fprintf_styled_func (info->stream, dis_style_immediate,
3902
0
         "0x%08x", word);
3903
0
      break;
3904
0
    default:
3905
0
      abort ();
3906
0
    }
3907
0
}
3908
3909
/* Try to infer the code or data type from a symbol.
3910
   Returns nonzero if *MAP_TYPE was set.  */
3911
3912
static int
3913
get_sym_code_type (struct disassemble_info *info, int n,
3914
       enum map_type *map_type)
3915
3.21M
{
3916
3.21M
  asymbol * as;
3917
3.21M
  elf_symbol_type *es;
3918
3.21M
  unsigned int type;
3919
3.21M
  const char *name;
3920
3921
  /* If the symbol is in a different section, ignore it.  */
3922
3.21M
  if (info->section != NULL && info->section != info->symtab[n]->section)
3923
877k
    return false;
3924
3925
2.34M
  if (n >= info->symtab_size)
3926
0
    return false;
3927
3928
2.34M
  as = info->symtab[n];
3929
2.34M
  if (bfd_asymbol_flavour (as) != bfd_target_elf_flavour)
3930
82.0k
    return false;
3931
2.25M
  es = (elf_symbol_type *) as;
3932
3933
2.25M
  type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
3934
3935
  /* If the symbol has function type then use that.  */
3936
2.25M
  if (type == STT_FUNC)
3937
144k
    {
3938
144k
      *map_type = MAP_INSN;
3939
144k
      return true;
3940
144k
    }
3941
3942
  /* Check for mapping symbols.  */
3943
2.11M
  name = bfd_asymbol_name(info->symtab[n]);
3944
2.11M
  if (name[0] == '$'
3945
2.11M
      && (name[1] == 'x' || name[1] == 'd')
3946
2.11M
      && (name[2] == '\0' || name[2] == '.'))
3947
0
    {
3948
0
      *map_type = (name[1] == 'x' ? MAP_INSN : MAP_DATA);
3949
0
      return true;
3950
0
    }
3951
3952
2.11M
  return false;
3953
2.11M
}
3954
3955
/* Set the feature bits in arch_variant in order to get the correct disassembly
3956
   for the chosen architecture variant.
3957
3958
   Currently we only restrict disassembly for Armv8-R and otherwise enable all
3959
   non-R-profile features.  */
3960
static void
3961
select_aarch64_variant (unsigned mach)
3962
2
{
3963
2
  switch (mach)
3964
2
    {
3965
0
    case bfd_mach_aarch64_8R:
3966
0
      arch_variant = AARCH64_ARCH_V8R;
3967
0
      break;
3968
2
    default:
3969
2
      arch_variant = AARCH64_ANY & ~(AARCH64_FEATURE_V8R);
3970
2
    }
3971
2
}
3972
3973
/* Entry-point of the AArch64 disassembler.  */
3974
3975
int
3976
print_insn_aarch64 (bfd_vma pc,
3977
        struct disassemble_info *info)
3978
21.4M
{
3979
21.4M
  bfd_byte  buffer[INSNLEN];
3980
21.4M
  int   status;
3981
21.4M
  void    (*printer) (bfd_vma, uint32_t, struct disassemble_info *,
3982
21.4M
          aarch64_operand_error *);
3983
21.4M
  bool   found = false;
3984
21.4M
  unsigned int  size = 4;
3985
21.4M
  unsigned long data;
3986
21.4M
  aarch64_operand_error errors;
3987
21.4M
  static bool set_features;
3988
3989
21.4M
  if (info->disassembler_options)
3990
0
    {
3991
0
      set_default_aarch64_dis_options (info);
3992
3993
0
      parse_aarch64_dis_options (info->disassembler_options);
3994
3995
      /* To avoid repeated parsing of these options, we remove them here.  */
3996
0
      info->disassembler_options = NULL;
3997
0
    }
3998
3999
21.4M
  if (!set_features)
4000
2
    {
4001
2
      select_aarch64_variant (info->mach);
4002
2
      set_features = true;
4003
2
    }
4004
4005
  /* Aarch64 instructions are always little-endian */
4006
21.4M
  info->endian_code = BFD_ENDIAN_LITTLE;
4007
4008
  /* Default to DATA.  A text section is required by the ABI to contain an
4009
     INSN mapping symbol at the start.  A data section has no such
4010
     requirement, hence if no mapping symbol is found the section must
4011
     contain only data.  This however isn't very useful if the user has
4012
     fully stripped the binaries.  If this is the case use the section
4013
     attributes to determine the default.  If we have no section default to
4014
     INSN as well, as we may be disassembling some raw bytes on a baremetal
4015
     HEX file or similar.  */
4016
21.4M
  enum map_type type = MAP_DATA;
4017
21.4M
  if ((info->section && info->section->flags & SEC_CODE) || !info->section)
4018
12.8M
    type = MAP_INSN;
4019
4020
  /* First check the full symtab for a mapping symbol, even if there
4021
     are no usable non-mapping symbols for this address.  */
4022
21.4M
  if (info->symtab_size != 0
4023
21.4M
      && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour)
4024
202k
    {
4025
202k
      int last_sym = -1;
4026
202k
      bfd_vma addr, section_vma = 0;
4027
202k
      bool can_use_search_opt_p;
4028
202k
      int n;
4029
4030
202k
      if (pc <= last_mapping_addr)
4031
1
  last_mapping_sym = -1;
4032
4033
      /* Start scanning at the start of the function, or wherever
4034
   we finished last time.  */
4035
202k
      n = info->symtab_pos + 1;
4036
4037
      /* If the last stop offset is different from the current one it means we
4038
   are disassembling a different glob of bytes.  As such the optimization
4039
   would not be safe and we should start over.  */
4040
202k
      can_use_search_opt_p = last_mapping_sym >= 0
4041
202k
           && info->stop_offset == last_stop_offset;
4042
4043
202k
      if (n >= last_mapping_sym && can_use_search_opt_p)
4044
142k
  n = last_mapping_sym;
4045
4046
      /* Look down while we haven't passed the location being disassembled.
4047
   The reason for this is that there's no defined order between a symbol
4048
   and an mapping symbol that may be at the same address.  We may have to
4049
   look at least one position ahead.  */
4050
1.22M
      for (; n < info->symtab_size; n++)
4051
1.22M
  {
4052
1.22M
    addr = bfd_asymbol_value (info->symtab[n]);
4053
1.22M
    if (addr > pc)
4054
202k
      break;
4055
1.02M
    if (get_sym_code_type (info, n, &type))
4056
142k
      {
4057
142k
        last_sym = n;
4058
142k
        found = true;
4059
142k
      }
4060
1.02M
  }
4061
4062
202k
      if (!found)
4063
59.8k
  {
4064
59.8k
    n = info->symtab_pos;
4065
59.8k
    if (n >= last_mapping_sym && can_use_search_opt_p)
4066
0
      n = last_mapping_sym;
4067
4068
    /* No mapping symbol found at this address.  Look backwards
4069
       for a preceeding one, but don't go pass the section start
4070
       otherwise a data section with no mapping symbol can pick up
4071
       a text mapping symbol of a preceeding section.  The documentation
4072
       says section can be NULL, in which case we will seek up all the
4073
       way to the top.  */
4074
59.8k
    if (info->section)
4075
59.8k
      section_vma = info->section->vma;
4076
4077
2.25M
    for (; n >= 0; n--)
4078
2.22M
      {
4079
2.22M
        addr = bfd_asymbol_value (info->symtab[n]);
4080
2.22M
        if (addr < section_vma)
4081
30.5k
    break;
4082
4083
2.19M
        if (get_sym_code_type (info, n, &type))
4084
1.39k
    {
4085
1.39k
      last_sym = n;
4086
1.39k
      found = true;
4087
1.39k
      break;
4088
1.39k
    }
4089
2.19M
      }
4090
59.8k
  }
4091
4092
202k
      last_mapping_sym = last_sym;
4093
202k
      last_type = type;
4094
202k
      last_stop_offset = info->stop_offset;
4095
4096
      /* Look a little bit ahead to see if we should print out
4097
   less than four bytes of data.  If there's a symbol,
4098
   mapping or otherwise, after two bytes then don't
4099
   print more.  */
4100
202k
      if (last_type == MAP_DATA)
4101
57.4k
  {
4102
57.4k
    size = 4 - (pc & 3);
4103
50.7M
    for (n = last_sym + 1; n < info->symtab_size; n++)
4104
50.7M
      {
4105
50.7M
        addr = bfd_asymbol_value (info->symtab[n]);
4106
50.7M
        if (addr > pc)
4107
57.4k
    {
4108
57.4k
      if (addr - pc < size)
4109
1
        size = addr - pc;
4110
57.4k
      break;
4111
57.4k
    }
4112
50.7M
      }
4113
    /* If the next symbol is after three bytes, we need to
4114
       print only part of the data, so that we can use either
4115
       .byte or .short.  */
4116
57.4k
    if (size == 3)
4117
2
      size = (pc & 1) ? 1 : 2;
4118
57.4k
  }
4119
202k
    }
4120
21.2M
  else
4121
21.2M
    last_type = type;
4122
4123
  /* PR 10263: Disassemble data if requested to do so by the user.  */
4124
21.4M
  if (last_type == MAP_DATA && ((info->flags & DISASSEMBLE_DATA) == 0))
4125
0
    {
4126
      /* size was set above.  */
4127
0
      info->bytes_per_chunk = size;
4128
0
      info->display_endian = info->endian;
4129
0
      printer = print_insn_data;
4130
0
    }
4131
21.4M
  else
4132
21.4M
    {
4133
21.4M
      info->bytes_per_chunk = size = INSNLEN;
4134
21.4M
      info->display_endian = info->endian_code;
4135
21.4M
      printer = print_insn_aarch64_word;
4136
21.4M
    }
4137
4138
21.4M
  status = (*info->read_memory_func) (pc, buffer, size, info);
4139
21.4M
  if (status != 0)
4140
8.27k
    {
4141
8.27k
      (*info->memory_error_func) (status, pc, info);
4142
8.27k
      return -1;
4143
8.27k
    }
4144
4145
21.4M
  data = bfd_get_bits (buffer, size * 8,
4146
21.4M
           info->display_endian == BFD_ENDIAN_BIG);
4147
4148
21.4M
  (*printer) (pc, data, info, &errors);
4149
4150
21.4M
  return size;
4151
21.4M
}
4152

4153
void
4154
print_aarch64_disassembler_options (FILE *stream)
4155
0
{
4156
0
  fprintf (stream, _("\n\
4157
0
The following AARCH64 specific disassembler options are supported for use\n\
4158
0
with the -M switch (multiple options should be separated by commas):\n"));
4159
4160
0
  fprintf (stream, _("\n\
4161
0
  no-aliases         Don't print instruction aliases.\n"));
4162
4163
0
  fprintf (stream, _("\n\
4164
0
  aliases            Do print instruction aliases.\n"));
4165
4166
0
  fprintf (stream, _("\n\
4167
0
  no-notes         Don't print instruction notes.\n"));
4168
4169
0
  fprintf (stream, _("\n\
4170
0
  notes            Do print instruction notes.\n"));
4171
4172
#ifdef DEBUG_AARCH64
4173
  fprintf (stream, _("\n\
4174
  debug_dump         Temp switch for debug trace.\n"));
4175
#endif /* DEBUG_AARCH64 */
4176
4177
0
  fprintf (stream, _("\n"));
4178
0
}