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