]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-aarch64.c
[Morello] Capability sealing and unsealing instructions
[thirdparty/binutils-gdb.git] / gas / config / tc-aarch64.c
CommitLineData
a06ea964
NC
1/* tc-aarch64.c -- Assemble for the AArch64 ISA
2
b3adc24a 3 Copyright (C) 2009-2020 Free Software Foundation, Inc.
a06ea964
NC
4 Contributed by ARM Ltd.
5
6 This file is part of GAS.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the license, or
11 (at your option) any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; see the file COPYING3. If not,
20 see <http://www.gnu.org/licenses/>. */
21
22#include "as.h"
23#include <limits.h>
24#include <stdarg.h>
25#include "bfd_stdint.h"
26#define NO_RELOC 0
27#include "safe-ctype.h"
28#include "subsegs.h"
29#include "obstack.h"
8b21361b 30#include "cpu-aarch64.h"
a06ea964
NC
31
32#ifdef OBJ_ELF
33#include "elf/aarch64.h"
34#include "dw2gencfi.h"
35#endif
36
37#include "dwarf2dbg.h"
38
39/* Types of processor to assemble for. */
40#ifndef CPU_DEFAULT
41#define CPU_DEFAULT AARCH64_ARCH_V8
42#endif
43
44#define streq(a, b) (strcmp (a, b) == 0)
45
f4c51f60
JW
46#define END_OF_INSN '\0'
47
3979cf50
SP
48#define MAP_CUR_INSN (AARCH64_CPU_HAS_FEATURE (cpu_variant, \
49 AARCH64_FEATURE_C64) \
50 ? MAP_C64 : MAP_INSN)
51
8b21361b
SP
52#define IS_C64 (AARCH64_CPU_HAS_FEATURE (cpu_variant, AARCH64_FEATURE_C64) \
53 ? 1 : 0)
54
a06ea964
NC
55static aarch64_feature_set cpu_variant;
56
57/* Variables that we set while parsing command-line options. Once all
58 options have been read we re-process these values to set the real
59 assembly flags. */
60static const aarch64_feature_set *mcpu_cpu_opt = NULL;
61static const aarch64_feature_set *march_cpu_opt = NULL;
62
63/* Constants for known architecture features. */
64static const aarch64_feature_set cpu_default = CPU_DEFAULT;
65
7e84b55d
TC
66/* Currently active instruction sequence. */
67static aarch64_instr_sequence *insn_sequence = NULL;
68
a06ea964
NC
69#ifdef OBJ_ELF
70/* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
71static symbolS *GOT_symbol;
cec5225b 72
69091a2c
YZ
73/* Which ABI to use. */
74enum aarch64_abi_type
75{
3c0367d0
JW
76 AARCH64_ABI_NONE = 0,
77 AARCH64_ABI_LP64 = 1,
78 AARCH64_ABI_ILP32 = 2
69091a2c
YZ
79};
80
3c0367d0
JW
81#ifndef DEFAULT_ARCH
82#define DEFAULT_ARCH "aarch64"
83#endif
84
85/* DEFAULT_ARCH is initialized in gas/configure.tgt. */
86static const char *default_arch = DEFAULT_ARCH;
87
69091a2c 88/* AArch64 ABI for the output file. */
3c0367d0 89static enum aarch64_abi_type aarch64_abi = AARCH64_ABI_NONE;
69091a2c 90
cec5225b
YZ
91/* When non-zero, program to a 32-bit model, in which the C data types
92 int, long and all pointer types are 32-bit objects (ILP32); or to a
93 64-bit model, in which the C int type is 32-bits but the C long type
94 and all pointer types are 64-bit objects (LP64). */
69091a2c 95#define ilp32_p (aarch64_abi == AARCH64_ABI_ILP32)
a06ea964
NC
96#endif
97
f06935a5 98enum vector_el_type
a06ea964
NC
99{
100 NT_invtype = -1,
101 NT_b,
102 NT_h,
103 NT_s,
104 NT_d,
d50c751e
RS
105 NT_q,
106 NT_zero,
107 NT_merge
a06ea964
NC
108};
109
8f9a77af 110/* Bits for DEFINED field in vector_type_el. */
f11ad6bc
RS
111#define NTA_HASTYPE 1
112#define NTA_HASINDEX 2
113#define NTA_HASVARWIDTH 4
a06ea964 114
8f9a77af 115struct vector_type_el
a06ea964 116{
f06935a5 117 enum vector_el_type type;
a06ea964
NC
118 unsigned char defined;
119 unsigned width;
120 int64_t index;
121};
122
123#define FIXUP_F_HAS_EXPLICIT_SHIFT 0x00000001
f0070c1e 124#define FIXUP_F_C64 0x00000002
a06ea964
NC
125
126struct reloc
127{
128 bfd_reloc_code_real_type type;
129 expressionS exp;
130 int pc_rel;
131 enum aarch64_opnd opnd;
132 uint32_t flags;
133 unsigned need_libopcodes_p : 1;
134};
135
136struct aarch64_instruction
137{
138 /* libopcodes structure for instruction intermediate representation. */
139 aarch64_inst base;
140 /* Record assembly errors found during the parsing. */
141 struct
142 {
143 enum aarch64_operand_error_kind kind;
144 const char *error;
145 } parsing_error;
146 /* The condition that appears in the assembly line. */
147 int cond;
148 /* Relocation information (including the GAS internal fixup). */
149 struct reloc reloc;
150 /* Need to generate an immediate in the literal pool. */
151 unsigned gen_lit_pool : 1;
152};
153
154typedef struct aarch64_instruction aarch64_instruction;
155
156static aarch64_instruction inst;
157
158static bfd_boolean parse_operands (char *, const aarch64_opcode *);
159static bfd_boolean programmer_friendly_fixup (aarch64_instruction *);
160
7e84b55d
TC
161#ifdef OBJ_ELF
162# define now_instr_sequence seg_info \
163 (now_seg)->tc_segment_info_data.insn_sequence
164#else
165static struct aarch64_instr_sequence now_instr_sequence;
166#endif
167
33eaf5de 168/* Diagnostics inline function utilities.
a06ea964 169
33eaf5de 170 These are lightweight utilities which should only be called by parse_operands
a06ea964
NC
171 and other parsers. GAS processes each assembly line by parsing it against
172 instruction template(s), in the case of multiple templates (for the same
173 mnemonic name), those templates are tried one by one until one succeeds or
174 all fail. An assembly line may fail a few templates before being
175 successfully parsed; an error saved here in most cases is not a user error
176 but an error indicating the current template is not the right template.
177 Therefore it is very important that errors can be saved at a low cost during
178 the parsing; we don't want to slow down the whole parsing by recording
179 non-user errors in detail.
180
33eaf5de 181 Remember that the objective is to help GAS pick up the most appropriate
a06ea964
NC
182 error message in the case of multiple templates, e.g. FMOV which has 8
183 templates. */
184
185static inline void
186clear_error (void)
187{
188 inst.parsing_error.kind = AARCH64_OPDE_NIL;
189 inst.parsing_error.error = NULL;
190}
191
192static inline bfd_boolean
193error_p (void)
194{
195 return inst.parsing_error.kind != AARCH64_OPDE_NIL;
196}
197
198static inline const char *
199get_error_message (void)
200{
201 return inst.parsing_error.error;
202}
203
a06ea964
NC
204static inline enum aarch64_operand_error_kind
205get_error_kind (void)
206{
207 return inst.parsing_error.kind;
208}
209
a06ea964
NC
210static inline void
211set_error (enum aarch64_operand_error_kind kind, const char *error)
212{
213 inst.parsing_error.kind = kind;
214 inst.parsing_error.error = error;
215}
216
217static inline void
218set_recoverable_error (const char *error)
219{
220 set_error (AARCH64_OPDE_RECOVERABLE, error);
221}
222
223/* Use the DESC field of the corresponding aarch64_operand entry to compose
224 the error message. */
225static inline void
226set_default_error (void)
227{
228 set_error (AARCH64_OPDE_SYNTAX_ERROR, NULL);
229}
230
231static inline void
232set_syntax_error (const char *error)
233{
234 set_error (AARCH64_OPDE_SYNTAX_ERROR, error);
235}
236
237static inline void
238set_first_syntax_error (const char *error)
239{
240 if (! error_p ())
241 set_error (AARCH64_OPDE_SYNTAX_ERROR, error);
242}
243
244static inline void
245set_fatal_syntax_error (const char *error)
246{
247 set_error (AARCH64_OPDE_FATAL_SYNTAX_ERROR, error);
248}
249\f
a06ea964
NC
250/* Return value for certain parsers when the parsing fails; those parsers
251 return the information of the parsed result, e.g. register number, on
252 success. */
253#define PARSE_FAIL -1
254
255/* This is an invalid condition code that means no conditional field is
256 present. */
257#define COND_ALWAYS 0x10
258
a06ea964
NC
259typedef struct
260{
261 const char *template;
262 uint32_t value;
263} asm_nzcv;
264
265struct reloc_entry
266{
267 char *name;
268 bfd_reloc_code_real_type reloc;
269};
270
a06ea964
NC
271/* Macros to define the register types and masks for the purpose
272 of parsing. */
273
274#undef AARCH64_REG_TYPES
275#define AARCH64_REG_TYPES \
276 BASIC_REG_TYPE(R_32) /* w[0-30] */ \
277 BASIC_REG_TYPE(R_64) /* x[0-30] */ \
278 BASIC_REG_TYPE(SP_32) /* wsp */ \
279 BASIC_REG_TYPE(SP_64) /* sp */ \
280 BASIC_REG_TYPE(Z_32) /* wzr */ \
281 BASIC_REG_TYPE(Z_64) /* xzr */ \
282 BASIC_REG_TYPE(FP_B) /* b[0-31] *//* NOTE: keep FP_[BHSDQ] consecutive! */\
283 BASIC_REG_TYPE(FP_H) /* h[0-31] */ \
284 BASIC_REG_TYPE(FP_S) /* s[0-31] */ \
285 BASIC_REG_TYPE(FP_D) /* d[0-31] */ \
286 BASIC_REG_TYPE(FP_Q) /* q[0-31] */ \
3493da5c
SP
287 BASIC_REG_TYPE(CA_N) /* c[0-30] */ \
288 BASIC_REG_TYPE(CA_SP) /* csp */ \
289 BASIC_REG_TYPE(CA_Z) /* czr */ \
290 BASIC_REG_TYPE(CA_D) /* ddc */ \
a06ea964 291 BASIC_REG_TYPE(VN) /* v[0-31] */ \
f11ad6bc
RS
292 BASIC_REG_TYPE(ZN) /* z[0-31] */ \
293 BASIC_REG_TYPE(PN) /* p[0-15] */ \
e1b988bb 294 /* Typecheck: any 64-bit int reg (inc SP exc XZR). */ \
a06ea964 295 MULTI_REG_TYPE(R64_SP, REG_TYPE(R_64) | REG_TYPE(SP_64)) \
4df068de
RS
296 /* Typecheck: same, plus SVE registers. */ \
297 MULTI_REG_TYPE(SVE_BASE, REG_TYPE(R_64) | REG_TYPE(SP_64) \
298 | REG_TYPE(ZN)) \
e1b988bb
RS
299 /* Typecheck: x[0-30], w[0-30] or [xw]zr. */ \
300 MULTI_REG_TYPE(R_Z, REG_TYPE(R_32) | REG_TYPE(R_64) \
301 | REG_TYPE(Z_32) | REG_TYPE(Z_64)) \
4df068de
RS
302 /* Typecheck: same, plus SVE registers. */ \
303 MULTI_REG_TYPE(SVE_OFFSET, REG_TYPE(R_32) | REG_TYPE(R_64) \
304 | REG_TYPE(Z_32) | REG_TYPE(Z_64) \
305 | REG_TYPE(ZN)) \
e1b988bb
RS
306 /* Typecheck: x[0-30], w[0-30] or {w}sp. */ \
307 MULTI_REG_TYPE(R_SP, REG_TYPE(R_32) | REG_TYPE(R_64) \
308 | REG_TYPE(SP_32) | REG_TYPE(SP_64)) \
309 /* Typecheck: any int (inc {W}SP inc [WX]ZR). */ \
a06ea964
NC
310 MULTI_REG_TYPE(R_Z_SP, REG_TYPE(R_32) | REG_TYPE(R_64) \
311 | REG_TYPE(SP_32) | REG_TYPE(SP_64) \
312 | REG_TYPE(Z_32) | REG_TYPE(Z_64)) \
313 /* Typecheck: any [BHSDQ]P FP. */ \
314 MULTI_REG_TYPE(BHSDQ, REG_TYPE(FP_B) | REG_TYPE(FP_H) \
315 | REG_TYPE(FP_S) | REG_TYPE(FP_D) | REG_TYPE(FP_Q)) \
e1b988bb 316 /* Typecheck: any int or [BHSDQ]P FP or V reg (exc SP inc [WX]ZR). */ \
a06ea964
NC
317 MULTI_REG_TYPE(R_Z_BHSDQ_V, REG_TYPE(R_32) | REG_TYPE(R_64) \
318 | REG_TYPE(Z_32) | REG_TYPE(Z_64) | REG_TYPE(VN) \
319 | REG_TYPE(FP_B) | REG_TYPE(FP_H) \
320 | REG_TYPE(FP_S) | REG_TYPE(FP_D) | REG_TYPE(FP_Q)) \
5b2b928e
JB
321 /* Typecheck: as above, but also Zn, Pn, and {W}SP. This should only \
322 be used for SVE instructions, since Zn and Pn are valid symbols \
c0890d26 323 in other contexts. */ \
5b2b928e
JB
324 MULTI_REG_TYPE(R_Z_SP_BHSDQ_VZP, REG_TYPE(R_32) | REG_TYPE(R_64) \
325 | REG_TYPE(SP_32) | REG_TYPE(SP_64) \
c0890d26
RS
326 | REG_TYPE(Z_32) | REG_TYPE(Z_64) | REG_TYPE(VN) \
327 | REG_TYPE(FP_B) | REG_TYPE(FP_H) \
328 | REG_TYPE(FP_S) | REG_TYPE(FP_D) | REG_TYPE(FP_Q) \
329 | REG_TYPE(ZN) | REG_TYPE(PN)) \
a06ea964
NC
330 /* Any integer register; used for error messages only. */ \
331 MULTI_REG_TYPE(R_N, REG_TYPE(R_32) | REG_TYPE(R_64) \
332 | REG_TYPE(SP_32) | REG_TYPE(SP_64) \
333 | REG_TYPE(Z_32) | REG_TYPE(Z_64)) \
3493da5c
SP
334 /* Typecheck: any capability register (inc CSP) */ \
335 MULTI_REG_TYPE(CA_N_SP, REG_TYPE(CA_N) | REG_TYPE(CA_SP)) \
336 MULTI_REG_TYPE(CA_N_Z, REG_TYPE(CA_N) | REG_TYPE(CA_Z)) \
a06ea964
NC
337 /* Pseudo type to mark the end of the enumerator sequence. */ \
338 BASIC_REG_TYPE(MAX)
339
340#undef BASIC_REG_TYPE
341#define BASIC_REG_TYPE(T) REG_TYPE_##T,
342#undef MULTI_REG_TYPE
343#define MULTI_REG_TYPE(T,V) BASIC_REG_TYPE(T)
344
345/* Register type enumerators. */
8a0b252a 346typedef enum aarch64_reg_type_
a06ea964
NC
347{
348 /* A list of REG_TYPE_*. */
349 AARCH64_REG_TYPES
350} aarch64_reg_type;
351
352#undef BASIC_REG_TYPE
353#define BASIC_REG_TYPE(T) 1 << REG_TYPE_##T,
354#undef REG_TYPE
355#define REG_TYPE(T) (1 << REG_TYPE_##T)
356#undef MULTI_REG_TYPE
357#define MULTI_REG_TYPE(T,V) V,
358
8a0b252a
TS
359/* Structure for a hash table entry for a register. */
360typedef struct
361{
362 const char *name;
363 unsigned char number;
364 ENUM_BITFIELD (aarch64_reg_type_) type : 8;
365 unsigned char builtin;
366} reg_entry;
367
a06ea964
NC
368/* Values indexed by aarch64_reg_type to assist the type checking. */
369static const unsigned reg_type_masks[] =
370{
371 AARCH64_REG_TYPES
372};
373
374#undef BASIC_REG_TYPE
375#undef REG_TYPE
376#undef MULTI_REG_TYPE
377#undef AARCH64_REG_TYPES
378
379/* Diagnostics used when we don't get a register of the expected type.
380 Note: this has to synchronized with aarch64_reg_type definitions
381 above. */
382static const char *
383get_reg_expected_msg (aarch64_reg_type reg_type)
384{
385 const char *msg;
386
387 switch (reg_type)
388 {
389 case REG_TYPE_R_32:
390 msg = N_("integer 32-bit register expected");
391 break;
392 case REG_TYPE_R_64:
393 msg = N_("integer 64-bit register expected");
394 break;
395 case REG_TYPE_R_N:
396 msg = N_("integer register expected");
397 break;
e1b988bb
RS
398 case REG_TYPE_R64_SP:
399 msg = N_("64-bit integer or SP register expected");
400 break;
4df068de
RS
401 case REG_TYPE_SVE_BASE:
402 msg = N_("base register expected");
403 break;
e1b988bb
RS
404 case REG_TYPE_R_Z:
405 msg = N_("integer or zero register expected");
406 break;
4df068de
RS
407 case REG_TYPE_SVE_OFFSET:
408 msg = N_("offset register expected");
409 break;
e1b988bb
RS
410 case REG_TYPE_R_SP:
411 msg = N_("integer or SP register expected");
412 break;
a06ea964
NC
413 case REG_TYPE_R_Z_SP:
414 msg = N_("integer, zero or SP register expected");
415 break;
416 case REG_TYPE_FP_B:
417 msg = N_("8-bit SIMD scalar register expected");
418 break;
419 case REG_TYPE_FP_H:
420 msg = N_("16-bit SIMD scalar or floating-point half precision "
421 "register expected");
422 break;
423 case REG_TYPE_FP_S:
424 msg = N_("32-bit SIMD scalar or floating-point single precision "
425 "register expected");
426 break;
427 case REG_TYPE_FP_D:
428 msg = N_("64-bit SIMD scalar or floating-point double precision "
429 "register expected");
430 break;
431 case REG_TYPE_FP_Q:
432 msg = N_("128-bit SIMD scalar or floating-point quad precision "
433 "register expected");
434 break;
a06ea964 435 case REG_TYPE_R_Z_BHSDQ_V:
5b2b928e 436 case REG_TYPE_R_Z_SP_BHSDQ_VZP:
a06ea964
NC
437 msg = N_("register expected");
438 break;
439 case REG_TYPE_BHSDQ: /* any [BHSDQ]P FP */
440 msg = N_("SIMD scalar or floating-point register expected");
441 break;
442 case REG_TYPE_VN: /* any V reg */
443 msg = N_("vector register expected");
444 break;
f11ad6bc
RS
445 case REG_TYPE_ZN:
446 msg = N_("SVE vector register expected");
447 break;
448 case REG_TYPE_PN:
449 msg = N_("SVE predicate register expected");
450 break;
3493da5c
SP
451 case REG_TYPE_CA_N:
452 msg = N_("Capability register C0 - C30 expected");
453 break;
454 case REG_TYPE_CA_SP:
455 msg = N_("Capability register CSP expected");
456 break;
457 case REG_TYPE_CA_N_SP:
458 msg = N_("Capability register C0 - C30 or CSP expected");
459 break;
460 case REG_TYPE_CA_Z:
461 msg = N_("Capability register CZR expected");
462 break;
a06ea964
NC
463 default:
464 as_fatal (_("invalid register type %d"), reg_type);
465 }
466 return msg;
467}
468
469/* Some well known registers that we refer to directly elsewhere. */
470#define REG_SP 31
c469c864 471#define REG_ZR 31
a06ea964
NC
472
473/* Instructions take 4 bytes in the object file. */
474#define INSN_SIZE 4
475
629310ab
ML
476static htab_t aarch64_ops_hsh;
477static htab_t aarch64_cond_hsh;
478static htab_t aarch64_shift_hsh;
479static htab_t aarch64_sys_regs_hsh;
480static htab_t aarch64_pstatefield_hsh;
481static htab_t aarch64_sys_regs_ic_hsh;
482static htab_t aarch64_sys_regs_dc_hsh;
483static htab_t aarch64_sys_regs_at_hsh;
484static htab_t aarch64_sys_regs_tlbi_hsh;
485static htab_t aarch64_sys_regs_sr_hsh;
486static htab_t aarch64_reg_hsh;
487static htab_t aarch64_barrier_opt_hsh;
488static htab_t aarch64_nzcv_hsh;
489static htab_t aarch64_pldop_hsh;
490static htab_t aarch64_hint_opt_hsh;
a06ea964
NC
491
492/* Stuff needed to resolve the label ambiguity
493 As:
494 ...
495 label: <insn>
496 may differ from:
497 ...
498 label:
499 <insn> */
500
501static symbolS *last_label_seen;
502
503/* Literal pool structure. Held on a per-section
504 and per-sub-section basis. */
505
506#define MAX_LITERAL_POOL_SIZE 1024
55d9b4c1
NC
507typedef struct literal_expression
508{
509 expressionS exp;
510 /* If exp.op == O_big then this bignum holds a copy of the global bignum value. */
511 LITTLENUM_TYPE * bignum;
512} literal_expression;
513
a06ea964
NC
514typedef struct literal_pool
515{
55d9b4c1 516 literal_expression literals[MAX_LITERAL_POOL_SIZE];
a06ea964
NC
517 unsigned int next_free_entry;
518 unsigned int id;
519 symbolS *symbol;
520 segT section;
521 subsegT sub_section;
522 int size;
523 struct literal_pool *next;
524} literal_pool;
525
526/* Pointer to a linked list of literal pools. */
527static literal_pool *list_of_pools = NULL;
528\f
529/* Pure syntax. */
530
531/* This array holds the chars that always start a comment. If the
532 pre-processor is disabled, these aren't very useful. */
533const char comment_chars[] = "";
534
535/* This array holds the chars that only start a comment at the beginning of
536 a line. If the line seems to have the form '# 123 filename'
537 .line and .file directives will appear in the pre-processed output. */
538/* Note that input_file.c hand checks for '#' at the beginning of the
539 first line of the input file. This is because the compiler outputs
540 #NO_APP at the beginning of its output. */
541/* Also note that comments like this one will always work. */
542const char line_comment_chars[] = "#";
543
544const char line_separator_chars[] = ";";
545
546/* Chars that can be used to separate mant
547 from exp in floating point numbers. */
548const char EXP_CHARS[] = "eE";
549
550/* Chars that mean this number is a floating point constant. */
551/* As in 0f12.456 */
552/* or 0d1.2345e12 */
553
b20d3859 554const char FLT_CHARS[] = "rRsSfFdDxXeEpPhH";
a06ea964
NC
555
556/* Prefix character that indicates the start of an immediate value. */
557#define is_immediate_prefix(C) ((C) == '#')
558
559/* Separator character handling. */
560
561#define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
562
563static inline bfd_boolean
564skip_past_char (char **str, char c)
565{
566 if (**str == c)
567 {
568 (*str)++;
569 return TRUE;
570 }
571 else
572 return FALSE;
573}
574
575#define skip_past_comma(str) skip_past_char (str, ',')
576
577/* Arithmetic expressions (possibly involving symbols). */
578
a06ea964
NC
579static bfd_boolean in_my_get_expression_p = FALSE;
580
581/* Third argument to my_get_expression. */
582#define GE_NO_PREFIX 0
583#define GE_OPT_PREFIX 1
584
585/* Return TRUE if the string pointed by *STR is successfully parsed
586 as an valid expression; *EP will be filled with the information of
587 such an expression. Otherwise return FALSE. */
588
589static bfd_boolean
590my_get_expression (expressionS * ep, char **str, int prefix_mode,
591 int reject_absent)
592{
593 char *save_in;
594 segT seg;
595 int prefix_present_p = 0;
596
597 switch (prefix_mode)
598 {
599 case GE_NO_PREFIX:
600 break;
601 case GE_OPT_PREFIX:
602 if (is_immediate_prefix (**str))
603 {
604 (*str)++;
605 prefix_present_p = 1;
606 }
607 break;
608 default:
609 abort ();
610 }
611
612 memset (ep, 0, sizeof (expressionS));
613
614 save_in = input_line_pointer;
615 input_line_pointer = *str;
616 in_my_get_expression_p = TRUE;
617 seg = expression (ep);
618 in_my_get_expression_p = FALSE;
619
620 if (ep->X_op == O_illegal || (reject_absent && ep->X_op == O_absent))
621 {
622 /* We found a bad expression in md_operand(). */
623 *str = input_line_pointer;
624 input_line_pointer = save_in;
625 if (prefix_present_p && ! error_p ())
626 set_fatal_syntax_error (_("bad expression"));
627 else
628 set_first_syntax_error (_("bad expression"));
629 return FALSE;
630 }
631
632#ifdef OBJ_AOUT
633 if (seg != absolute_section
634 && seg != text_section
635 && seg != data_section
636 && seg != bss_section && seg != undefined_section)
637 {
638 set_syntax_error (_("bad segment"));
639 *str = input_line_pointer;
640 input_line_pointer = save_in;
641 return FALSE;
642 }
643#else
644 (void) seg;
645#endif
646
a06ea964
NC
647 *str = input_line_pointer;
648 input_line_pointer = save_in;
649 return TRUE;
650}
651
652/* Turn a string in input_line_pointer into a floating point constant
653 of type TYPE, and store the appropriate bytes in *LITP. The number
654 of LITTLENUMS emitted is stored in *SIZEP. An error message is
655 returned, or NULL on OK. */
656
6d4af3c2 657const char *
a06ea964
NC
658md_atof (int type, char *litP, int *sizeP)
659{
eb5bbc48
MM
660 /* If this is a bfloat16 type, then parse it slightly differently -
661 as it does not follow the IEEE standard exactly. */
662 if (type == 'b')
663 {
664 char * t;
665 LITTLENUM_TYPE words[MAX_LITTLENUMS];
666 FLONUM_TYPE generic_float;
667
668 t = atof_ieee_detail (input_line_pointer, 1, 8, words, &generic_float);
669
670 if (t)
671 input_line_pointer = t;
672 else
673 return _("invalid floating point number");
674
675 switch (generic_float.sign)
676 {
677 /* Is +Inf. */
678 case 'P':
679 words[0] = 0x7f80;
680 break;
681
682 /* Is -Inf. */
683 case 'N':
684 words[0] = 0xff80;
685 break;
686
687 /* Is NaN. */
688 /* bfloat16 has two types of NaN - quiet and signalling.
689 Quiet NaN has bit[6] == 1 && faction != 0, whereas
690 signalling Nan's have bit[0] == 0 && fraction != 0.
691 Chose this specific encoding as it is the same form
692 as used by other IEEE 754 encodings in GAS. */
693 case 0:
694 words[0] = 0x7fff;
695 break;
696
697 default:
698 break;
699 }
700
701 *sizeP = 2;
702
703 md_number_to_chars (litP, (valueT) words[0], sizeof (LITTLENUM_TYPE));
704
705 return NULL;
706 }
707
a06ea964
NC
708 return ieee_md_atof (type, litP, sizeP, target_big_endian);
709}
710
711/* We handle all bad expressions here, so that we can report the faulty
712 instruction in the error message. */
713void
714md_operand (expressionS * exp)
715{
716 if (in_my_get_expression_p)
717 exp->X_op = O_illegal;
718}
719
720/* Immediate values. */
721
722/* Errors may be set multiple times during parsing or bit encoding
723 (particularly in the Neon bits), but usually the earliest error which is set
724 will be the most meaningful. Avoid overwriting it with later (cascading)
725 errors by calling this function. */
726
727static void
728first_error (const char *error)
729{
730 if (! error_p ())
731 set_syntax_error (error);
732}
733
2b0f3761 734/* Similar to first_error, but this function accepts formatted error
a06ea964
NC
735 message. */
736static void
737first_error_fmt (const char *format, ...)
738{
739 va_list args;
740 enum
741 { size = 100 };
742 /* N.B. this single buffer will not cause error messages for different
743 instructions to pollute each other; this is because at the end of
744 processing of each assembly line, error message if any will be
745 collected by as_bad. */
746 static char buffer[size];
747
748 if (! error_p ())
749 {
3e0baa28 750 int ret ATTRIBUTE_UNUSED;
a06ea964
NC
751 va_start (args, format);
752 ret = vsnprintf (buffer, size, format, args);
753 know (ret <= size - 1 && ret >= 0);
754 va_end (args);
755 set_syntax_error (buffer);
756 }
757}
758
759/* Register parsing. */
760
761/* Generic register parser which is called by other specialized
762 register parsers.
763 CCP points to what should be the beginning of a register name.
764 If it is indeed a valid register name, advance CCP over it and
765 return the reg_entry structure; otherwise return NULL.
766 It does not issue diagnostics. */
767
768static reg_entry *
769parse_reg (char **ccp)
770{
771 char *start = *ccp;
772 char *p;
773 reg_entry *reg;
774
775#ifdef REGISTER_PREFIX
776 if (*start != REGISTER_PREFIX)
777 return NULL;
778 start++;
779#endif
780
781 p = start;
782 if (!ISALPHA (*p) || !is_name_beginner (*p))
783 return NULL;
784
785 do
786 p++;
787 while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
788
629310ab 789 reg = (reg_entry *) str_hash_find_n (aarch64_reg_hsh, start, p - start);
a06ea964
NC
790
791 if (!reg)
792 return NULL;
793
794 *ccp = p;
795 return reg;
796}
797
798/* Return TRUE if REG->TYPE is a valid type of TYPE; otherwise
799 return FALSE. */
800static bfd_boolean
801aarch64_check_reg_type (const reg_entry *reg, aarch64_reg_type type)
802{
e1b988bb 803 return (reg_type_masks[type] & (1 << reg->type)) != 0;
a06ea964
NC
804}
805
4df068de
RS
806/* Try to parse a base or offset register. Allow SVE base and offset
807 registers if REG_TYPE includes SVE registers. Return the register
808 entry on success, setting *QUALIFIER to the register qualifier.
809 Return null otherwise.
e1b988bb 810
a06ea964
NC
811 Note that this function does not issue any diagnostics. */
812
e1b988bb 813static const reg_entry *
4df068de
RS
814aarch64_addr_reg_parse (char **ccp, aarch64_reg_type reg_type,
815 aarch64_opnd_qualifier_t *qualifier)
a06ea964
NC
816{
817 char *str = *ccp;
818 const reg_entry *reg = parse_reg (&str);
819
820 if (reg == NULL)
e1b988bb 821 return NULL;
a06ea964
NC
822
823 switch (reg->type)
824 {
e1b988bb 825 case REG_TYPE_R_32:
a06ea964 826 case REG_TYPE_SP_32:
e1b988bb
RS
827 case REG_TYPE_Z_32:
828 *qualifier = AARCH64_OPND_QLF_W;
a06ea964 829 break;
e1b988bb 830
a06ea964 831 case REG_TYPE_R_64:
e1b988bb 832 case REG_TYPE_SP_64:
a06ea964 833 case REG_TYPE_Z_64:
e1b988bb 834 *qualifier = AARCH64_OPND_QLF_X;
a06ea964 835 break;
e1b988bb 836
4df068de
RS
837 case REG_TYPE_ZN:
838 if ((reg_type_masks[reg_type] & (1 << REG_TYPE_ZN)) == 0
839 || str[0] != '.')
840 return NULL;
841 switch (TOLOWER (str[1]))
842 {
843 case 's':
844 *qualifier = AARCH64_OPND_QLF_S_S;
845 break;
846 case 'd':
847 *qualifier = AARCH64_OPND_QLF_S_D;
848 break;
849 default:
850 return NULL;
851 }
852 str += 2;
853 break;
854
3493da5c
SP
855 case REG_TYPE_CA_N:
856 case REG_TYPE_CA_SP:
857 *qualifier = AARCH64_OPND_QLF_CA;
858 break;
859
a06ea964 860 default:
e1b988bb 861 return NULL;
a06ea964
NC
862 }
863
864 *ccp = str;
865
e1b988bb 866 return reg;
a06ea964
NC
867}
868
4df068de
RS
869/* Try to parse a base or offset register. Return the register entry
870 on success, setting *QUALIFIER to the register qualifier. Return null
871 otherwise.
872
873 Note that this function does not issue any diagnostics. */
874
875static const reg_entry *
876aarch64_reg_parse_32_64 (char **ccp, aarch64_opnd_qualifier_t *qualifier)
877{
878 return aarch64_addr_reg_parse (ccp, REG_TYPE_R_Z_SP, qualifier);
879}
880
f11ad6bc
RS
881/* Parse the qualifier of a vector register or vector element of type
882 REG_TYPE. Fill in *PARSED_TYPE and return TRUE if the parsing
883 succeeds; otherwise return FALSE.
a06ea964
NC
884
885 Accept only one occurrence of:
65a55fbb 886 4b 8b 16b 2h 4h 8h 2s 4s 1d 2d
a06ea964
NC
887 b h s d q */
888static bfd_boolean
f11ad6bc
RS
889parse_vector_type_for_operand (aarch64_reg_type reg_type,
890 struct vector_type_el *parsed_type, char **str)
a06ea964
NC
891{
892 char *ptr = *str;
893 unsigned width;
894 unsigned element_size;
f06935a5 895 enum vector_el_type type;
a06ea964
NC
896
897 /* skip '.' */
d50c751e 898 gas_assert (*ptr == '.');
a06ea964
NC
899 ptr++;
900
f11ad6bc 901 if (reg_type == REG_TYPE_ZN || reg_type == REG_TYPE_PN || !ISDIGIT (*ptr))
a06ea964
NC
902 {
903 width = 0;
904 goto elt_size;
905 }
906 width = strtoul (ptr, &ptr, 10);
907 if (width != 1 && width != 2 && width != 4 && width != 8 && width != 16)
908 {
909 first_error_fmt (_("bad size %d in vector width specifier"), width);
910 return FALSE;
911 }
912
dc1e8a47 913 elt_size:
a06ea964
NC
914 switch (TOLOWER (*ptr))
915 {
916 case 'b':
917 type = NT_b;
918 element_size = 8;
919 break;
920 case 'h':
921 type = NT_h;
922 element_size = 16;
923 break;
924 case 's':
925 type = NT_s;
926 element_size = 32;
927 break;
928 case 'd':
929 type = NT_d;
930 element_size = 64;
931 break;
932 case 'q':
582e12bf 933 if (reg_type == REG_TYPE_ZN || width == 1)
a06ea964
NC
934 {
935 type = NT_q;
936 element_size = 128;
937 break;
938 }
939 /* fall through. */
940 default:
941 if (*ptr != '\0')
942 first_error_fmt (_("unexpected character `%c' in element size"), *ptr);
943 else
944 first_error (_("missing element size"));
945 return FALSE;
946 }
65a55fbb
TC
947 if (width != 0 && width * element_size != 64
948 && width * element_size != 128
949 && !(width == 2 && element_size == 16)
950 && !(width == 4 && element_size == 8))
a06ea964
NC
951 {
952 first_error_fmt (_
953 ("invalid element size %d and vector size combination %c"),
954 width, *ptr);
955 return FALSE;
956 }
957 ptr++;
958
959 parsed_type->type = type;
960 parsed_type->width = width;
961
962 *str = ptr;
963
964 return TRUE;
965}
966
d50c751e
RS
967/* *STR contains an SVE zero/merge predication suffix. Parse it into
968 *PARSED_TYPE and point *STR at the end of the suffix. */
969
970static bfd_boolean
971parse_predication_for_operand (struct vector_type_el *parsed_type, char **str)
972{
973 char *ptr = *str;
974
975 /* Skip '/'. */
976 gas_assert (*ptr == '/');
977 ptr++;
978 switch (TOLOWER (*ptr))
979 {
980 case 'z':
981 parsed_type->type = NT_zero;
982 break;
983 case 'm':
984 parsed_type->type = NT_merge;
985 break;
986 default:
987 if (*ptr != '\0' && *ptr != ',')
988 first_error_fmt (_("unexpected character `%c' in predication type"),
989 *ptr);
990 else
991 first_error (_("missing predication type"));
992 return FALSE;
993 }
994 parsed_type->width = 0;
995 *str = ptr + 1;
996 return TRUE;
997}
998
a06ea964
NC
999/* Parse a register of the type TYPE.
1000
1001 Return PARSE_FAIL if the string pointed by *CCP is not a valid register
1002 name or the parsed register is not of TYPE.
1003
1004 Otherwise return the register number, and optionally fill in the actual
1005 type of the register in *RTYPE when multiple alternatives were given, and
1006 return the register shape and element index information in *TYPEINFO.
1007
1008 IN_REG_LIST should be set with TRUE if the caller is parsing a register
1009 list. */
1010
1011static int
1012parse_typed_reg (char **ccp, aarch64_reg_type type, aarch64_reg_type *rtype,
8f9a77af 1013 struct vector_type_el *typeinfo, bfd_boolean in_reg_list)
a06ea964
NC
1014{
1015 char *str = *ccp;
1016 const reg_entry *reg = parse_reg (&str);
8f9a77af
RS
1017 struct vector_type_el atype;
1018 struct vector_type_el parsetype;
a06ea964
NC
1019 bfd_boolean is_typed_vecreg = FALSE;
1020
1021 atype.defined = 0;
1022 atype.type = NT_invtype;
1023 atype.width = -1;
1024 atype.index = 0;
1025
1026 if (reg == NULL)
1027 {
1028 if (typeinfo)
1029 *typeinfo = atype;
1030 set_default_error ();
1031 return PARSE_FAIL;
1032 }
1033
1034 if (! aarch64_check_reg_type (reg, type))
1035 {
1036 DEBUG_TRACE ("reg type check failed");
1037 set_default_error ();
1038 return PARSE_FAIL;
1039 }
1040 type = reg->type;
1041
f11ad6bc 1042 if ((type == REG_TYPE_VN || type == REG_TYPE_ZN || type == REG_TYPE_PN)
d50c751e 1043 && (*str == '.' || (type == REG_TYPE_PN && *str == '/')))
a06ea964 1044 {
d50c751e
RS
1045 if (*str == '.')
1046 {
1047 if (!parse_vector_type_for_operand (type, &parsetype, &str))
1048 return PARSE_FAIL;
1049 }
1050 else
1051 {
1052 if (!parse_predication_for_operand (&parsetype, &str))
1053 return PARSE_FAIL;
1054 }
a235d3ae 1055
a06ea964
NC
1056 /* Register if of the form Vn.[bhsdq]. */
1057 is_typed_vecreg = TRUE;
1058
f11ad6bc
RS
1059 if (type == REG_TYPE_ZN || type == REG_TYPE_PN)
1060 {
1061 /* The width is always variable; we don't allow an integer width
1062 to be specified. */
1063 gas_assert (parsetype.width == 0);
1064 atype.defined |= NTA_HASVARWIDTH | NTA_HASTYPE;
1065 }
1066 else if (parsetype.width == 0)
a06ea964
NC
1067 /* Expect index. In the new scheme we cannot have
1068 Vn.[bhsdq] represent a scalar. Therefore any
1069 Vn.[bhsdq] should have an index following it.
33eaf5de 1070 Except in reglists of course. */
a06ea964
NC
1071 atype.defined |= NTA_HASINDEX;
1072 else
1073 atype.defined |= NTA_HASTYPE;
1074
1075 atype.type = parsetype.type;
1076 atype.width = parsetype.width;
1077 }
1078
1079 if (skip_past_char (&str, '['))
1080 {
1081 expressionS exp;
1082
1083 /* Reject Sn[index] syntax. */
1084 if (!is_typed_vecreg)
1085 {
1086 first_error (_("this type of register can't be indexed"));
1087 return PARSE_FAIL;
1088 }
1089
535b785f 1090 if (in_reg_list)
a06ea964
NC
1091 {
1092 first_error (_("index not allowed inside register list"));
1093 return PARSE_FAIL;
1094 }
1095
1096 atype.defined |= NTA_HASINDEX;
1097
1098 my_get_expression (&exp, &str, GE_NO_PREFIX, 1);
1099
1100 if (exp.X_op != O_constant)
1101 {
1102 first_error (_("constant expression required"));
1103 return PARSE_FAIL;
1104 }
1105
1106 if (! skip_past_char (&str, ']'))
1107 return PARSE_FAIL;
1108
1109 atype.index = exp.X_add_number;
1110 }
1111 else if (!in_reg_list && (atype.defined & NTA_HASINDEX) != 0)
1112 {
1113 /* Indexed vector register expected. */
1114 first_error (_("indexed vector register expected"));
1115 return PARSE_FAIL;
1116 }
1117
1118 /* A vector reg Vn should be typed or indexed. */
1119 if (type == REG_TYPE_VN && atype.defined == 0)
1120 {
1121 first_error (_("invalid use of vector register"));
1122 }
1123
1124 if (typeinfo)
1125 *typeinfo = atype;
1126
1127 if (rtype)
1128 *rtype = type;
1129
1130 *ccp = str;
1131
1132 return reg->number;
1133}
1134
1135/* Parse register.
1136
1137 Return the register number on success; return PARSE_FAIL otherwise.
1138
1139 If RTYPE is not NULL, return in *RTYPE the (possibly restricted) type of
1140 the register (e.g. NEON double or quad reg when either has been requested).
1141
1142 If this is a NEON vector register with additional type information, fill
1143 in the struct pointed to by VECTYPE (if non-NULL).
1144
1145 This parser does not handle register list. */
1146
1147static int
1148aarch64_reg_parse (char **ccp, aarch64_reg_type type,
8f9a77af 1149 aarch64_reg_type *rtype, struct vector_type_el *vectype)
a06ea964 1150{
8f9a77af 1151 struct vector_type_el atype;
a06ea964
NC
1152 char *str = *ccp;
1153 int reg = parse_typed_reg (&str, type, rtype, &atype,
1154 /*in_reg_list= */ FALSE);
1155
1156 if (reg == PARSE_FAIL)
1157 return PARSE_FAIL;
1158
1159 if (vectype)
1160 *vectype = atype;
1161
1162 *ccp = str;
1163
1164 return reg;
1165}
1166
1167static inline bfd_boolean
8f9a77af 1168eq_vector_type_el (struct vector_type_el e1, struct vector_type_el e2)
a06ea964
NC
1169{
1170 return
1171 e1.type == e2.type
1172 && e1.defined == e2.defined
1173 && e1.width == e2.width && e1.index == e2.index;
1174}
1175
10d76650
RS
1176/* This function parses a list of vector registers of type TYPE.
1177 On success, it returns the parsed register list information in the
1178 following encoded format:
a06ea964
NC
1179
1180 bit 18-22 | 13-17 | 7-11 | 2-6 | 0-1
1181 4th regno | 3rd regno | 2nd regno | 1st regno | num_of_reg
1182
1183 The information of the register shape and/or index is returned in
1184 *VECTYPE.
1185
1186 It returns PARSE_FAIL if the register list is invalid.
1187
1188 The list contains one to four registers.
1189 Each register can be one of:
1190 <Vt>.<T>[<index>]
1191 <Vt>.<T>
1192 All <T> should be identical.
1193 All <index> should be identical.
1194 There are restrictions on <Vt> numbers which are checked later
1195 (by reg_list_valid_p). */
1196
1197static int
10d76650
RS
1198parse_vector_reg_list (char **ccp, aarch64_reg_type type,
1199 struct vector_type_el *vectype)
a06ea964
NC
1200{
1201 char *str = *ccp;
1202 int nb_regs;
8f9a77af 1203 struct vector_type_el typeinfo, typeinfo_first;
a06ea964
NC
1204 int val, val_range;
1205 int in_range;
1206 int ret_val;
1207 int i;
1208 bfd_boolean error = FALSE;
1209 bfd_boolean expect_index = FALSE;
1210
1211 if (*str != '{')
1212 {
1213 set_syntax_error (_("expecting {"));
1214 return PARSE_FAIL;
1215 }
1216 str++;
1217
1218 nb_regs = 0;
1219 typeinfo_first.defined = 0;
1220 typeinfo_first.type = NT_invtype;
1221 typeinfo_first.width = -1;
1222 typeinfo_first.index = 0;
1223 ret_val = 0;
1224 val = -1;
1225 val_range = -1;
1226 in_range = 0;
1227 do
1228 {
1229 if (in_range)
1230 {
1231 str++; /* skip over '-' */
1232 val_range = val;
1233 }
10d76650 1234 val = parse_typed_reg (&str, type, NULL, &typeinfo,
a06ea964
NC
1235 /*in_reg_list= */ TRUE);
1236 if (val == PARSE_FAIL)
1237 {
1238 set_first_syntax_error (_("invalid vector register in list"));
1239 error = TRUE;
1240 continue;
1241 }
1242 /* reject [bhsd]n */
f11ad6bc 1243 if (type == REG_TYPE_VN && typeinfo.defined == 0)
a06ea964
NC
1244 {
1245 set_first_syntax_error (_("invalid scalar register in list"));
1246 error = TRUE;
1247 continue;
1248 }
1249
1250 if (typeinfo.defined & NTA_HASINDEX)
1251 expect_index = TRUE;
1252
1253 if (in_range)
1254 {
1255 if (val < val_range)
1256 {
1257 set_first_syntax_error
1258 (_("invalid range in vector register list"));
1259 error = TRUE;
1260 }
1261 val_range++;
1262 }
1263 else
1264 {
1265 val_range = val;
1266 if (nb_regs == 0)
1267 typeinfo_first = typeinfo;
8f9a77af 1268 else if (! eq_vector_type_el (typeinfo_first, typeinfo))
a06ea964
NC
1269 {
1270 set_first_syntax_error
1271 (_("type mismatch in vector register list"));
1272 error = TRUE;
1273 }
1274 }
1275 if (! error)
1276 for (i = val_range; i <= val; i++)
1277 {
1278 ret_val |= i << (5 * nb_regs);
1279 nb_regs++;
1280 }
1281 in_range = 0;
1282 }
1283 while (skip_past_comma (&str) || (in_range = 1, *str == '-'));
1284
1285 skip_whitespace (str);
1286 if (*str != '}')
1287 {
1288 set_first_syntax_error (_("end of vector register list not found"));
1289 error = TRUE;
1290 }
1291 str++;
1292
1293 skip_whitespace (str);
1294
1295 if (expect_index)
1296 {
1297 if (skip_past_char (&str, '['))
1298 {
1299 expressionS exp;
1300
1301 my_get_expression (&exp, &str, GE_NO_PREFIX, 1);
1302 if (exp.X_op != O_constant)
1303 {
1304 set_first_syntax_error (_("constant expression required."));
1305 error = TRUE;
1306 }
1307 if (! skip_past_char (&str, ']'))
1308 error = TRUE;
1309 else
1310 typeinfo_first.index = exp.X_add_number;
1311 }
1312 else
1313 {
1314 set_first_syntax_error (_("expected index"));
1315 error = TRUE;
1316 }
1317 }
1318
1319 if (nb_regs > 4)
1320 {
1321 set_first_syntax_error (_("too many registers in vector register list"));
1322 error = TRUE;
1323 }
1324 else if (nb_regs == 0)
1325 {
1326 set_first_syntax_error (_("empty vector register list"));
1327 error = TRUE;
1328 }
1329
1330 *ccp = str;
1331 if (! error)
1332 *vectype = typeinfo_first;
1333
1334 return error ? PARSE_FAIL : (ret_val << 2) | (nb_regs - 1);
1335}
1336
1337/* Directives: register aliases. */
1338
1339static reg_entry *
1340insert_reg_alias (char *str, int number, aarch64_reg_type type)
1341{
1342 reg_entry *new;
1343 const char *name;
1344
629310ab 1345 if ((new = str_hash_find (aarch64_reg_hsh, str)) != 0)
a06ea964
NC
1346 {
1347 if (new->builtin)
1348 as_warn (_("ignoring attempt to redefine built-in register '%s'"),
1349 str);
1350
1351 /* Only warn about a redefinition if it's not defined as the
1352 same register. */
1353 else if (new->number != number || new->type != type)
1354 as_warn (_("ignoring redefinition of register alias '%s'"), str);
1355
1356 return NULL;
1357 }
1358
1359 name = xstrdup (str);
add39d23 1360 new = XNEW (reg_entry);
a06ea964
NC
1361
1362 new->name = name;
1363 new->number = number;
1364 new->type = type;
1365 new->builtin = FALSE;
1366
fe0e921f 1367 str_hash_insert (aarch64_reg_hsh, name, new, 0);
a06ea964
NC
1368
1369 return new;
1370}
1371
1372/* Look for the .req directive. This is of the form:
1373
1374 new_register_name .req existing_register_name
1375
1376 If we find one, or if it looks sufficiently like one that we want to
1377 handle any error here, return TRUE. Otherwise return FALSE. */
1378
1379static bfd_boolean
1380create_register_alias (char *newname, char *p)
1381{
1382 const reg_entry *old;
1383 char *oldname, *nbuf;
1384 size_t nlen;
1385
1386 /* The input scrubber ensures that whitespace after the mnemonic is
1387 collapsed to single spaces. */
1388 oldname = p;
1389 if (strncmp (oldname, " .req ", 6) != 0)
1390 return FALSE;
1391
1392 oldname += 6;
1393 if (*oldname == '\0')
1394 return FALSE;
1395
629310ab 1396 old = str_hash_find (aarch64_reg_hsh, oldname);
a06ea964
NC
1397 if (!old)
1398 {
1399 as_warn (_("unknown register '%s' -- .req ignored"), oldname);
1400 return TRUE;
1401 }
1402
1403 /* If TC_CASE_SENSITIVE is defined, then newname already points to
1404 the desired alias name, and p points to its end. If not, then
1405 the desired alias name is in the global original_case_string. */
1406#ifdef TC_CASE_SENSITIVE
1407 nlen = p - newname;
1408#else
1409 newname = original_case_string;
1410 nlen = strlen (newname);
1411#endif
1412
29a2809e 1413 nbuf = xmemdup0 (newname, nlen);
a06ea964
NC
1414
1415 /* Create aliases under the new name as stated; an all-lowercase
1416 version of the new name; and an all-uppercase version of the new
1417 name. */
1418 if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
1419 {
1420 for (p = nbuf; *p; p++)
1421 *p = TOUPPER (*p);
1422
1423 if (strncmp (nbuf, newname, nlen))
1424 {
1425 /* If this attempt to create an additional alias fails, do not bother
1426 trying to create the all-lower case alias. We will fail and issue
1427 a second, duplicate error message. This situation arises when the
1428 programmer does something like:
1429 foo .req r0
1430 Foo .req r1
1431 The second .req creates the "Foo" alias but then fails to create
1432 the artificial FOO alias because it has already been created by the
1433 first .req. */
1434 if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
e1fa0163
NC
1435 {
1436 free (nbuf);
1437 return TRUE;
1438 }
a06ea964
NC
1439 }
1440
1441 for (p = nbuf; *p; p++)
1442 *p = TOLOWER (*p);
1443
1444 if (strncmp (nbuf, newname, nlen))
1445 insert_reg_alias (nbuf, old->number, old->type);
1446 }
1447
e1fa0163 1448 free (nbuf);
a06ea964
NC
1449 return TRUE;
1450}
1451
1452/* Should never be called, as .req goes between the alias and the
1453 register name, not at the beginning of the line. */
1454static void
1455s_req (int a ATTRIBUTE_UNUSED)
1456{
1457 as_bad (_("invalid syntax for .req directive"));
1458}
1459
1460/* The .unreq directive deletes an alias which was previously defined
1461 by .req. For example:
1462
1463 my_alias .req r11
1464 .unreq my_alias */
1465
1466static void
1467s_unreq (int a ATTRIBUTE_UNUSED)
1468{
1469 char *name;
1470 char saved_char;
1471
1472 name = input_line_pointer;
1473
1474 while (*input_line_pointer != 0
1475 && *input_line_pointer != ' ' && *input_line_pointer != '\n')
1476 ++input_line_pointer;
1477
1478 saved_char = *input_line_pointer;
1479 *input_line_pointer = 0;
1480
1481 if (!*name)
1482 as_bad (_("invalid syntax for .unreq directive"));
1483 else
1484 {
629310ab 1485 reg_entry *reg = str_hash_find (aarch64_reg_hsh, name);
a06ea964
NC
1486
1487 if (!reg)
1488 as_bad (_("unknown register alias '%s'"), name);
1489 else if (reg->builtin)
1490 as_warn (_("ignoring attempt to undefine built-in register '%s'"),
1491 name);
1492 else
1493 {
1494 char *p;
1495 char *nbuf;
1496
629310ab 1497 str_hash_delete (aarch64_reg_hsh, name);
a06ea964
NC
1498 free ((char *) reg->name);
1499 free (reg);
1500
1501 /* Also locate the all upper case and all lower case versions.
1502 Do not complain if we cannot find one or the other as it
1503 was probably deleted above. */
1504
1505 nbuf = strdup (name);
1506 for (p = nbuf; *p; p++)
1507 *p = TOUPPER (*p);
629310ab 1508 reg = str_hash_find (aarch64_reg_hsh, nbuf);
a06ea964
NC
1509 if (reg)
1510 {
629310ab 1511 str_hash_delete (aarch64_reg_hsh, nbuf);
a06ea964
NC
1512 free ((char *) reg->name);
1513 free (reg);
1514 }
1515
1516 for (p = nbuf; *p; p++)
1517 *p = TOLOWER (*p);
629310ab 1518 reg = str_hash_find (aarch64_reg_hsh, nbuf);
a06ea964
NC
1519 if (reg)
1520 {
629310ab 1521 str_hash_delete (aarch64_reg_hsh, nbuf);
a06ea964
NC
1522 free ((char *) reg->name);
1523 free (reg);
1524 }
1525
1526 free (nbuf);
1527 }
1528 }
1529
1530 *input_line_pointer = saved_char;
1531 demand_empty_rest_of_line ();
1532}
1533
1534/* Directives: Instruction set selection. */
1535
1536#ifdef OBJ_ELF
1537/* This code is to handle mapping symbols as defined in the ARM AArch64 ELF
1538 spec. (See "Mapping symbols", section 4.5.4, ARM AAELF64 version 0.05).
1539 Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
1540 and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped. */
1541
1542/* Create a new mapping symbol for the transition to STATE. */
1543
1544static void
1545make_mapping_symbol (enum mstate state, valueT value, fragS * frag)
1546{
1547 symbolS *symbolP;
1548 const char *symname;
1549 int type;
1550
1551 switch (state)
1552 {
1553 case MAP_DATA:
1554 symname = "$d";
1555 type = BSF_NO_FLAGS;
1556 break;
1557 case MAP_INSN:
1558 symname = "$x";
1559 type = BSF_NO_FLAGS;
1560 break;
3979cf50
SP
1561 case MAP_C64:
1562 symname = "$c";
1563 type = BSF_NO_FLAGS;
1564 break;
a06ea964
NC
1565 default:
1566 abort ();
1567 }
1568
e01e1cee 1569 symbolP = symbol_new (symname, now_seg, frag, value);
a06ea964
NC
1570 symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
1571
8b21361b
SP
1572 if (state == MAP_C64)
1573 AARCH64_SET_C64 (symbolP, 1);
1574 else if (state == MAP_INSN)
1575 AARCH64_SET_C64 (symbolP, 0);
1576
a06ea964
NC
1577 /* Save the mapping symbols for future reference. Also check that
1578 we do not place two mapping symbols at the same offset within a
1579 frag. We'll handle overlap between frags in
1580 check_mapping_symbols.
1581
1582 If .fill or other data filling directive generates zero sized data,
1583 the mapping symbol for the following code will have the same value
1584 as the one generated for the data filling directive. In this case,
1585 we replace the old symbol with the new one at the same address. */
1586 if (value == 0)
1587 {
1588 if (frag->tc_frag_data.first_map != NULL)
1589 {
1590 know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
1591 symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP,
1592 &symbol_lastP);
1593 }
1594 frag->tc_frag_data.first_map = symbolP;
1595 }
1596 if (frag->tc_frag_data.last_map != NULL)
1597 {
1598 know (S_GET_VALUE (frag->tc_frag_data.last_map) <=
1599 S_GET_VALUE (symbolP));
1600 if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
1601 symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP,
1602 &symbol_lastP);
1603 }
1604 frag->tc_frag_data.last_map = symbolP;
1605}
1606
1607/* We must sometimes convert a region marked as code to data during
1608 code alignment, if an odd number of bytes have to be padded. The
1609 code mapping symbol is pushed to an aligned address. */
1610
1611static void
1612insert_data_mapping_symbol (enum mstate state,
1613 valueT value, fragS * frag, offsetT bytes)
1614{
1615 /* If there was already a mapping symbol, remove it. */
1616 if (frag->tc_frag_data.last_map != NULL
1617 && S_GET_VALUE (frag->tc_frag_data.last_map) ==
1618 frag->fr_address + value)
1619 {
1620 symbolS *symp = frag->tc_frag_data.last_map;
1621
1622 if (value == 0)
1623 {
1624 know (frag->tc_frag_data.first_map == symp);
1625 frag->tc_frag_data.first_map = NULL;
1626 }
1627 frag->tc_frag_data.last_map = NULL;
1628 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
1629 }
1630
1631 make_mapping_symbol (MAP_DATA, value, frag);
1632 make_mapping_symbol (state, value + bytes, frag);
1633}
1634
1635static void mapping_state_2 (enum mstate state, int max_chars);
1636
1637/* Set the mapping state to STATE. Only call this when about to
1638 emit some STATE bytes to the file. */
1639
1640void
1641mapping_state (enum mstate state)
1642{
1643 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
1644
3979cf50 1645 if (state == MAP_CUR_INSN)
a578ef7e
JW
1646 /* AArch64 instructions require 4-byte alignment. When emitting
1647 instructions into any section, record the appropriate section
1648 alignment. */
1649 record_alignment (now_seg, 2);
1650
448eb63d
RL
1651 if (mapstate == state)
1652 /* The mapping symbol has already been emitted.
1653 There is nothing else to do. */
1654 return;
1655
c1baaddf 1656#define TRANSITION(from, to) (mapstate == (from) && state == (to))
a97902de
RL
1657 if (TRANSITION (MAP_UNDEFINED, MAP_DATA) && !subseg_text_p (now_seg))
1658 /* Emit MAP_DATA within executable section in order. Otherwise, it will be
c1baaddf 1659 evaluated later in the next else. */
a06ea964 1660 return;
3979cf50 1661 else if (TRANSITION (MAP_UNDEFINED, MAP_CUR_INSN))
c1baaddf
RL
1662 {
1663 /* Only add the symbol if the offset is > 0:
1664 if we're at the first frag, check it's size > 0;
1665 if we're not at the first frag, then for sure
1666 the offset is > 0. */
1667 struct frag *const frag_first = seg_info (now_seg)->frchainP->frch_root;
1668 const int add_symbol = (frag_now != frag_first)
1669 || (frag_now_fix () > 0);
1670
1671 if (add_symbol)
1672 make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
1673 }
1674#undef TRANSITION
a06ea964
NC
1675
1676 mapping_state_2 (state, 0);
a06ea964
NC
1677}
1678
1679/* Same as mapping_state, but MAX_CHARS bytes have already been
1680 allocated. Put the mapping symbol that far back. */
1681
1682static void
1683mapping_state_2 (enum mstate state, int max_chars)
1684{
1685 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
1686
1687 if (!SEG_NORMAL (now_seg))
1688 return;
1689
1690 if (mapstate == state)
1691 /* The mapping symbol has already been emitted.
1692 There is nothing else to do. */
1693 return;
1694
1695 seg_info (now_seg)->tc_segment_info_data.mapstate = state;
1696 make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
1697}
1698#else
1699#define mapping_state(x) /* nothing */
1700#define mapping_state_2(x, y) /* nothing */
1701#endif
1702
1703/* Directives: sectioning and alignment. */
1704
1705static void
1706s_bss (int ignore ATTRIBUTE_UNUSED)
1707{
1708 /* We don't support putting frags in the BSS segment, we fake it by
1709 marking in_bss, then looking at s_skip for clues. */
1710 subseg_set (bss_section, 0);
1711 demand_empty_rest_of_line ();
1712 mapping_state (MAP_DATA);
1713}
1714
1715static void
1716s_even (int ignore ATTRIBUTE_UNUSED)
1717{
1718 /* Never make frag if expect extra pass. */
1719 if (!need_pass_2)
1720 frag_align (1, 0, 0);
1721
1722 record_alignment (now_seg, 1);
1723
1724 demand_empty_rest_of_line ();
1725}
1726
1727/* Directives: Literal pools. */
1728
1729static literal_pool *
1730find_literal_pool (int size)
1731{
1732 literal_pool *pool;
1733
1734 for (pool = list_of_pools; pool != NULL; pool = pool->next)
1735 {
1736 if (pool->section == now_seg
1737 && pool->sub_section == now_subseg && pool->size == size)
1738 break;
1739 }
1740
1741 return pool;
1742}
1743
1744static literal_pool *
1745find_or_make_literal_pool (int size)
1746{
1747 /* Next literal pool ID number. */
1748 static unsigned int latest_pool_num = 1;
1749 literal_pool *pool;
1750
1751 pool = find_literal_pool (size);
1752
1753 if (pool == NULL)
1754 {
1755 /* Create a new pool. */
add39d23 1756 pool = XNEW (literal_pool);
a06ea964
NC
1757 if (!pool)
1758 return NULL;
1759
1760 /* Currently we always put the literal pool in the current text
1761 section. If we were generating "small" model code where we
1762 knew that all code and initialised data was within 1MB then
1763 we could output literals to mergeable, read-only data
1764 sections. */
1765
1766 pool->next_free_entry = 0;
1767 pool->section = now_seg;
1768 pool->sub_section = now_subseg;
1769 pool->size = size;
1770 pool->next = list_of_pools;
1771 pool->symbol = NULL;
1772
1773 /* Add it to the list. */
1774 list_of_pools = pool;
1775 }
1776
1777 /* New pools, and emptied pools, will have a NULL symbol. */
1778 if (pool->symbol == NULL)
1779 {
1780 pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
e01e1cee 1781 &zero_address_frag, 0);
a06ea964
NC
1782 pool->id = latest_pool_num++;
1783 }
1784
1785 /* Done. */
1786 return pool;
1787}
1788
1789/* Add the literal of size SIZE in *EXP to the relevant literal pool.
1790 Return TRUE on success, otherwise return FALSE. */
1791static bfd_boolean
1792add_to_lit_pool (expressionS *exp, int size)
1793{
1794 literal_pool *pool;
1795 unsigned int entry;
1796
1797 pool = find_or_make_literal_pool (size);
1798
1799 /* Check if this literal value is already in the pool. */
1800 for (entry = 0; entry < pool->next_free_entry; entry++)
1801 {
55d9b4c1
NC
1802 expressionS * litexp = & pool->literals[entry].exp;
1803
1804 if ((litexp->X_op == exp->X_op)
a06ea964 1805 && (exp->X_op == O_constant)
55d9b4c1
NC
1806 && (litexp->X_add_number == exp->X_add_number)
1807 && (litexp->X_unsigned == exp->X_unsigned))
a06ea964
NC
1808 break;
1809
55d9b4c1 1810 if ((litexp->X_op == exp->X_op)
a06ea964 1811 && (exp->X_op == O_symbol)
55d9b4c1
NC
1812 && (litexp->X_add_number == exp->X_add_number)
1813 && (litexp->X_add_symbol == exp->X_add_symbol)
1814 && (litexp->X_op_symbol == exp->X_op_symbol))
a06ea964
NC
1815 break;
1816 }
1817
1818 /* Do we need to create a new entry? */
1819 if (entry == pool->next_free_entry)
1820 {
1821 if (entry >= MAX_LITERAL_POOL_SIZE)
1822 {
1823 set_syntax_error (_("literal pool overflow"));
1824 return FALSE;
1825 }
1826
55d9b4c1 1827 pool->literals[entry].exp = *exp;
a06ea964 1828 pool->next_free_entry += 1;
55d9b4c1
NC
1829 if (exp->X_op == O_big)
1830 {
1831 /* PR 16688: Bignums are held in a single global array. We must
1832 copy and preserve that value now, before it is overwritten. */
add39d23
TS
1833 pool->literals[entry].bignum = XNEWVEC (LITTLENUM_TYPE,
1834 exp->X_add_number);
55d9b4c1
NC
1835 memcpy (pool->literals[entry].bignum, generic_bignum,
1836 CHARS_PER_LITTLENUM * exp->X_add_number);
1837 }
1838 else
1839 pool->literals[entry].bignum = NULL;
a06ea964
NC
1840 }
1841
1842 exp->X_op = O_symbol;
1843 exp->X_add_number = ((int) entry) * size;
1844 exp->X_add_symbol = pool->symbol;
1845
1846 return TRUE;
1847}
1848
1849/* Can't use symbol_new here, so have to create a symbol and then at
33eaf5de 1850 a later date assign it a value. That's what these functions do. */
a06ea964
NC
1851
1852static void
1853symbol_locate (symbolS * symbolP,
1854 const char *name,/* It is copied, the caller can modify. */
1855 segT segment, /* Segment identifier (SEG_<something>). */
1856 valueT valu, /* Symbol value. */
1857 fragS * frag) /* Associated fragment. */
1858{
e57e6ddc 1859 size_t name_length;
a06ea964
NC
1860 char *preserved_copy_of_name;
1861
1862 name_length = strlen (name) + 1; /* +1 for \0. */
1863 obstack_grow (&notes, name, name_length);
1864 preserved_copy_of_name = obstack_finish (&notes);
1865
1866#ifdef tc_canonicalize_symbol_name
1867 preserved_copy_of_name =
1868 tc_canonicalize_symbol_name (preserved_copy_of_name);
1869#endif
1870
1871 S_SET_NAME (symbolP, preserved_copy_of_name);
1872
1873 S_SET_SEGMENT (symbolP, segment);
1874 S_SET_VALUE (symbolP, valu);
1875 symbol_clear_list_pointers (symbolP);
1876
1877 symbol_set_frag (symbolP, frag);
1878
1879 /* Link to end of symbol chain. */
1880 {
1881 extern int symbol_table_frozen;
1882
1883 if (symbol_table_frozen)
1884 abort ();
1885 }
1886
1887 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
1888
1889 obj_symbol_new_hook (symbolP);
1890
1891#ifdef tc_symbol_new_hook
1892 tc_symbol_new_hook (symbolP);
1893#endif
1894
1895#ifdef DEBUG_SYMS
1896 verify_symbol_chain (symbol_rootP, symbol_lastP);
1897#endif /* DEBUG_SYMS */
1898}
1899
1900
1901static void
1902s_ltorg (int ignored ATTRIBUTE_UNUSED)
1903{
1904 unsigned int entry;
1905 literal_pool *pool;
1906 char sym_name[20];
1907 int align;
1908
67a32447 1909 for (align = 2; align <= 4; align++)
a06ea964
NC
1910 {
1911 int size = 1 << align;
1912
1913 pool = find_literal_pool (size);
1914 if (pool == NULL || pool->symbol == NULL || pool->next_free_entry == 0)
1915 continue;
1916
a06ea964
NC
1917 /* Align pool as you have word accesses.
1918 Only make a frag if we have to. */
1919 if (!need_pass_2)
1920 frag_align (align, 0, 0);
1921
7ea12e5c
NC
1922 mapping_state (MAP_DATA);
1923
a06ea964
NC
1924 record_alignment (now_seg, align);
1925
1926 sprintf (sym_name, "$$lit_\002%x", pool->id);
1927
1928 symbol_locate (pool->symbol, sym_name, now_seg,
1929 (valueT) frag_now_fix (), frag_now);
1930 symbol_table_insert (pool->symbol);
1931
1932 for (entry = 0; entry < pool->next_free_entry; entry++)
55d9b4c1
NC
1933 {
1934 expressionS * exp = & pool->literals[entry].exp;
1935
1936 if (exp->X_op == O_big)
1937 {
1938 /* PR 16688: Restore the global bignum value. */
1939 gas_assert (pool->literals[entry].bignum != NULL);
1940 memcpy (generic_bignum, pool->literals[entry].bignum,
1941 CHARS_PER_LITTLENUM * exp->X_add_number);
1942 }
1943
1944 /* First output the expression in the instruction to the pool. */
1945 emit_expr (exp, size); /* .word|.xword */
1946
1947 if (exp->X_op == O_big)
1948 {
1949 free (pool->literals[entry].bignum);
1950 pool->literals[entry].bignum = NULL;
1951 }
1952 }
a06ea964
NC
1953
1954 /* Mark the pool as empty. */
1955 pool->next_free_entry = 0;
1956 pool->symbol = NULL;
1957 }
1958}
1959
1960#ifdef OBJ_ELF
1961/* Forward declarations for functions below, in the MD interface
1962 section. */
1963static fixS *fix_new_aarch64 (fragS *, int, short, expressionS *, int, int);
1964static struct reloc_table_entry * find_reloc_table_entry (char **);
1965
1966/* Directives: Data. */
1967/* N.B. the support for relocation suffix in this directive needs to be
1968 implemented properly. */
1969
1970static void
1971s_aarch64_elf_cons (int nbytes)
1972{
1973 expressionS exp;
1974
1975#ifdef md_flush_pending_output
1976 md_flush_pending_output ();
1977#endif
1978
1979 if (is_it_end_of_statement ())
1980 {
1981 demand_empty_rest_of_line ();
1982 return;
1983 }
1984
1985#ifdef md_cons_align
1986 md_cons_align (nbytes);
1987#endif
1988
1989 mapping_state (MAP_DATA);
1990 do
1991 {
1992 struct reloc_table_entry *reloc;
1993
1994 expression (&exp);
1995
1996 if (exp.X_op != O_symbol)
1997 emit_expr (&exp, (unsigned int) nbytes);
1998 else
1999 {
2000 skip_past_char (&input_line_pointer, '#');
2001 if (skip_past_char (&input_line_pointer, ':'))
2002 {
2003 reloc = find_reloc_table_entry (&input_line_pointer);
2004 if (reloc == NULL)
2005 as_bad (_("unrecognized relocation suffix"));
2006 else
2007 as_bad (_("unimplemented relocation suffix"));
2008 ignore_rest_of_line ();
2009 return;
2010 }
2011 else
2012 emit_expr (&exp, (unsigned int) nbytes);
2013 }
2014 }
2015 while (*input_line_pointer++ == ',');
2016
2017 /* Put terminator back into stream. */
2018 input_line_pointer--;
2019 demand_empty_rest_of_line ();
2020}
2021
f166ae01
SN
2022/* Mark symbol that it follows a variant PCS convention. */
2023
2024static void
2025s_variant_pcs (int ignored ATTRIBUTE_UNUSED)
2026{
2027 char *name;
2028 char c;
2029 symbolS *sym;
2030 asymbol *bfdsym;
2031 elf_symbol_type *elfsym;
2032
2033 c = get_symbol_name (&name);
2034 if (!*name)
2035 as_bad (_("Missing symbol name in directive"));
2036 sym = symbol_find_or_make (name);
2037 restore_line_pointer (c);
2038 demand_empty_rest_of_line ();
2039 bfdsym = symbol_get_bfdsym (sym);
c1229f84 2040 elfsym = elf_symbol_from (bfdsym);
f166ae01
SN
2041 gas_assert (elfsym);
2042 elfsym->internal_elf_sym.st_other |= STO_AARCH64_VARIANT_PCS;
2043}
a06ea964
NC
2044#endif /* OBJ_ELF */
2045
2046/* Output a 32-bit word, but mark as an instruction. */
2047
2048static void
2049s_aarch64_inst (int ignored ATTRIBUTE_UNUSED)
2050{
2051 expressionS exp;
2052
2053#ifdef md_flush_pending_output
2054 md_flush_pending_output ();
2055#endif
2056
2057 if (is_it_end_of_statement ())
2058 {
2059 demand_empty_rest_of_line ();
2060 return;
2061 }
2062
a97902de 2063 /* Sections are assumed to start aligned. In executable section, there is no
c1baaddf 2064 MAP_DATA symbol pending. So we only align the address during
3979cf50 2065 MAP_DATA --> MAP_CUR_INSN transition.
eb9d6cc9 2066 For other sections, this is not guaranteed. */
c1baaddf 2067 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
eb9d6cc9 2068 if (!need_pass_2 && subseg_text_p (now_seg) && mapstate == MAP_DATA)
a06ea964 2069 frag_align_code (2, 0);
c1baaddf 2070
a06ea964 2071#ifdef OBJ_ELF
3979cf50 2072 mapping_state (MAP_CUR_INSN);
a06ea964
NC
2073#endif
2074
2075 do
2076 {
2077 expression (&exp);
2078 if (exp.X_op != O_constant)
2079 {
2080 as_bad (_("constant expression required"));
2081 ignore_rest_of_line ();
2082 return;
2083 }
2084
2085 if (target_big_endian)
2086 {
2087 unsigned int val = exp.X_add_number;
2088 exp.X_add_number = SWAP_32 (val);
2089 }
2090 emit_expr (&exp, 4);
2091 }
2092 while (*input_line_pointer++ == ',');
2093
2094 /* Put terminator back into stream. */
2095 input_line_pointer--;
2096 demand_empty_rest_of_line ();
2097}
2098
3a67e1a6
ST
2099static void
2100s_aarch64_cfi_b_key_frame (int ignored ATTRIBUTE_UNUSED)
2101{
2102 demand_empty_rest_of_line ();
2103 struct fde_entry *fde = frchain_now->frch_cfi_data->cur_fde_data;
2104 fde->pauth_key = AARCH64_PAUTH_KEY_B;
2105}
2106
a06ea964 2107#ifdef OBJ_ELF
43a357f9
RL
2108/* Emit BFD_RELOC_AARCH64_TLSDESC_ADD on the next ADD instruction. */
2109
2110static void
2111s_tlsdescadd (int ignored ATTRIBUTE_UNUSED)
2112{
2113 expressionS exp;
2114
2115 expression (&exp);
2116 frag_grow (4);
2117 fix_new_aarch64 (frag_now, frag_more (0) - frag_now->fr_literal, 4, &exp, 0,
2118 BFD_RELOC_AARCH64_TLSDESC_ADD);
2119
2120 demand_empty_rest_of_line ();
2121}
2122
a06ea964
NC
2123/* Emit BFD_RELOC_AARCH64_TLSDESC_CALL on the next BLR instruction. */
2124
2125static void
2126s_tlsdesccall (int ignored ATTRIBUTE_UNUSED)
2127{
2128 expressionS exp;
2129
2130 /* Since we're just labelling the code, there's no need to define a
2131 mapping symbol. */
2132 expression (&exp);
2133 /* Make sure there is enough room in this frag for the following
2134 blr. This trick only works if the blr follows immediately after
2135 the .tlsdesc directive. */
2136 frag_grow (4);
2137 fix_new_aarch64 (frag_now, frag_more (0) - frag_now->fr_literal, 4, &exp, 0,
2138 BFD_RELOC_AARCH64_TLSDESC_CALL);
2139
2140 demand_empty_rest_of_line ();
2141}
43a357f9
RL
2142
2143/* Emit BFD_RELOC_AARCH64_TLSDESC_LDR on the next LDR instruction. */
2144
2145static void
2146s_tlsdescldr (int ignored ATTRIBUTE_UNUSED)
2147{
2148 expressionS exp;
2149
2150 expression (&exp);
2151 frag_grow (4);
2152 fix_new_aarch64 (frag_now, frag_more (0) - frag_now->fr_literal, 4, &exp, 0,
2153 BFD_RELOC_AARCH64_TLSDESC_LDR);
2154
2155 demand_empty_rest_of_line ();
2156}
a06ea964
NC
2157#endif /* OBJ_ELF */
2158
2159static void s_aarch64_arch (int);
2160static void s_aarch64_cpu (int);
ae527cd8 2161static void s_aarch64_arch_extension (int);
a06ea964
NC
2162
2163/* This table describes all the machine specific pseudo-ops the assembler
2164 has to support. The fields are:
2165 pseudo-op name without dot
2166 function to call to execute this pseudo-op
2167 Integer arg to pass to the function. */
2168
2169const pseudo_typeS md_pseudo_table[] = {
2170 /* Never called because '.req' does not start a line. */
2171 {"req", s_req, 0},
2172 {"unreq", s_unreq, 0},
2173 {"bss", s_bss, 0},
2174 {"even", s_even, 0},
2175 {"ltorg", s_ltorg, 0},
2176 {"pool", s_ltorg, 0},
2177 {"cpu", s_aarch64_cpu, 0},
2178 {"arch", s_aarch64_arch, 0},
ae527cd8 2179 {"arch_extension", s_aarch64_arch_extension, 0},
a06ea964 2180 {"inst", s_aarch64_inst, 0},
3a67e1a6 2181 {"cfi_b_key_frame", s_aarch64_cfi_b_key_frame, 0},
a06ea964 2182#ifdef OBJ_ELF
43a357f9 2183 {"tlsdescadd", s_tlsdescadd, 0},
a06ea964 2184 {"tlsdesccall", s_tlsdesccall, 0},
43a357f9 2185 {"tlsdescldr", s_tlsdescldr, 0},
a06ea964
NC
2186 {"word", s_aarch64_elf_cons, 4},
2187 {"long", s_aarch64_elf_cons, 4},
2188 {"xword", s_aarch64_elf_cons, 8},
2189 {"dword", s_aarch64_elf_cons, 8},
f166ae01 2190 {"variant_pcs", s_variant_pcs, 0},
a06ea964 2191#endif
b20d3859 2192 {"float16", float_cons, 'h'},
eb5bbc48 2193 {"bfloat16", float_cons, 'b'},
a06ea964
NC
2194 {0, 0, 0}
2195};
2196\f
2197
2198/* Check whether STR points to a register name followed by a comma or the
2199 end of line; REG_TYPE indicates which register types are checked
2200 against. Return TRUE if STR is such a register name; otherwise return
2201 FALSE. The function does not intend to produce any diagnostics, but since
2202 the register parser aarch64_reg_parse, which is called by this function,
2203 does produce diagnostics, we call clear_error to clear any diagnostics
2204 that may be generated by aarch64_reg_parse.
2205 Also, the function returns FALSE directly if there is any user error
2206 present at the function entry. This prevents the existing diagnostics
2207 state from being spoiled.
2208 The function currently serves parse_constant_immediate and
2209 parse_big_immediate only. */
2210static bfd_boolean
2211reg_name_p (char *str, aarch64_reg_type reg_type)
2212{
2213 int reg;
2214
2215 /* Prevent the diagnostics state from being spoiled. */
2216 if (error_p ())
2217 return FALSE;
2218
2219 reg = aarch64_reg_parse (&str, reg_type, NULL, NULL);
2220
2221 /* Clear the parsing error that may be set by the reg parser. */
2222 clear_error ();
2223
2224 if (reg == PARSE_FAIL)
2225 return FALSE;
2226
2227 skip_whitespace (str);
f405494f 2228 if (*str == ',' || is_end_of_line[(unsigned char) *str])
a06ea964
NC
2229 return TRUE;
2230
2231 return FALSE;
2232}
2233
2234/* Parser functions used exclusively in instruction operands. */
2235
2236/* Parse an immediate expression which may not be constant.
2237
2238 To prevent the expression parser from pushing a register name
2239 into the symbol table as an undefined symbol, firstly a check is
1799c0d0
RS
2240 done to find out whether STR is a register of type REG_TYPE followed
2241 by a comma or the end of line. Return FALSE if STR is such a string. */
a06ea964
NC
2242
2243static bfd_boolean
1799c0d0
RS
2244parse_immediate_expression (char **str, expressionS *exp,
2245 aarch64_reg_type reg_type)
a06ea964 2246{
1799c0d0 2247 if (reg_name_p (*str, reg_type))
a06ea964
NC
2248 {
2249 set_recoverable_error (_("immediate operand required"));
2250 return FALSE;
2251 }
2252
2253 my_get_expression (exp, str, GE_OPT_PREFIX, 1);
2254
2255 if (exp->X_op == O_absent)
2256 {
2257 set_fatal_syntax_error (_("missing immediate expression"));
2258 return FALSE;
2259 }
2260
2261 return TRUE;
2262}
2263
2264/* Constant immediate-value read function for use in insn parsing.
2265 STR points to the beginning of the immediate (with the optional
1799c0d0
RS
2266 leading #); *VAL receives the value. REG_TYPE says which register
2267 names should be treated as registers rather than as symbolic immediates.
a06ea964
NC
2268
2269 Return TRUE on success; otherwise return FALSE. */
2270
2271static bfd_boolean
1799c0d0 2272parse_constant_immediate (char **str, int64_t *val, aarch64_reg_type reg_type)
a06ea964
NC
2273{
2274 expressionS exp;
2275
1799c0d0 2276 if (! parse_immediate_expression (str, &exp, reg_type))
a06ea964
NC
2277 return FALSE;
2278
2279 if (exp.X_op != O_constant)
2280 {
2281 set_syntax_error (_("constant expression required"));
2282 return FALSE;
2283 }
2284
2285 *val = exp.X_add_number;
2286 return TRUE;
2287}
2288
2289static uint32_t
2290encode_imm_float_bits (uint32_t imm)
2291{
2292 return ((imm >> 19) & 0x7f) /* b[25:19] -> b[6:0] */
2293 | ((imm >> (31 - 7)) & 0x80); /* b[31] -> b[7] */
2294}
2295
62b0d0d5
YZ
2296/* Return TRUE if the single-precision floating-point value encoded in IMM
2297 can be expressed in the AArch64 8-bit signed floating-point format with
2298 3-bit exponent and normalized 4 bits of precision; in other words, the
2299 floating-point value must be expressable as
2300 (+/-) n / 16 * power (2, r)
2301 where n and r are integers such that 16 <= n <=31 and -3 <= r <= 4. */
2302
a06ea964
NC
2303static bfd_boolean
2304aarch64_imm_float_p (uint32_t imm)
2305{
62b0d0d5
YZ
2306 /* If a single-precision floating-point value has the following bit
2307 pattern, it can be expressed in the AArch64 8-bit floating-point
2308 format:
2309
2310 3 32222222 2221111111111
a06ea964 2311 1 09876543 21098765432109876543210
62b0d0d5
YZ
2312 n Eeeeeexx xxxx0000000000000000000
2313
2314 where n, e and each x are either 0 or 1 independently, with
2315 E == ~ e. */
a06ea964 2316
62b0d0d5
YZ
2317 uint32_t pattern;
2318
2319 /* Prepare the pattern for 'Eeeeee'. */
2320 if (((imm >> 30) & 0x1) == 0)
2321 pattern = 0x3e000000;
a06ea964 2322 else
62b0d0d5
YZ
2323 pattern = 0x40000000;
2324
2325 return (imm & 0x7ffff) == 0 /* lower 19 bits are 0. */
2326 && ((imm & 0x7e000000) == pattern); /* bits 25 - 29 == ~ bit 30. */
a06ea964
NC
2327}
2328
04a3379a
RS
2329/* Return TRUE if the IEEE double value encoded in IMM can be expressed
2330 as an IEEE float without any loss of precision. Store the value in
2331 *FPWORD if so. */
62b0d0d5 2332
a06ea964 2333static bfd_boolean
04a3379a 2334can_convert_double_to_float (uint64_t imm, uint32_t *fpword)
62b0d0d5
YZ
2335{
2336 /* If a double-precision floating-point value has the following bit
04a3379a 2337 pattern, it can be expressed in a float:
62b0d0d5 2338
04a3379a
RS
2339 6 66655555555 5544 44444444 33333333 33222222 22221111 111111
2340 3 21098765432 1098 76543210 98765432 10987654 32109876 54321098 76543210
2341 n E~~~eeeeeee ssss ssssssss ssssssss SSS00000 00000000 00000000 00000000
62b0d0d5 2342
04a3379a
RS
2343 -----------------------------> nEeeeeee esssssss ssssssss sssssSSS
2344 if Eeee_eeee != 1111_1111
2345
2346 where n, e, s and S are either 0 or 1 independently and where ~ is the
2347 inverse of E. */
62b0d0d5
YZ
2348
2349 uint32_t pattern;
2350 uint32_t high32 = imm >> 32;
04a3379a 2351 uint32_t low32 = imm;
62b0d0d5 2352
04a3379a
RS
2353 /* Lower 29 bits need to be 0s. */
2354 if ((imm & 0x1fffffff) != 0)
62b0d0d5
YZ
2355 return FALSE;
2356
2357 /* Prepare the pattern for 'Eeeeeeeee'. */
2358 if (((high32 >> 30) & 0x1) == 0)
04a3379a 2359 pattern = 0x38000000;
62b0d0d5
YZ
2360 else
2361 pattern = 0x40000000;
2362
04a3379a
RS
2363 /* Check E~~~. */
2364 if ((high32 & 0x78000000) != pattern)
62b0d0d5 2365 return FALSE;
04a3379a
RS
2366
2367 /* Check Eeee_eeee != 1111_1111. */
2368 if ((high32 & 0x7ff00000) == 0x47f00000)
2369 return FALSE;
2370
2371 *fpword = ((high32 & 0xc0000000) /* 1 n bit and 1 E bit. */
2372 | ((high32 << 3) & 0x3ffffff8) /* 7 e and 20 s bits. */
2373 | (low32 >> 29)); /* 3 S bits. */
2374 return TRUE;
62b0d0d5
YZ
2375}
2376
165d4950
RS
2377/* Return true if we should treat OPERAND as a double-precision
2378 floating-point operand rather than a single-precision one. */
2379static bfd_boolean
2380double_precision_operand_p (const aarch64_opnd_info *operand)
2381{
2382 /* Check for unsuffixed SVE registers, which are allowed
2383 for LDR and STR but not in instructions that require an
2384 immediate. We get better error messages if we arbitrarily
2385 pick one size, parse the immediate normally, and then
2386 report the match failure in the normal way. */
2387 return (operand->qualifier == AARCH64_OPND_QLF_NIL
2388 || aarch64_get_qualifier_esize (operand->qualifier) == 8);
2389}
2390
62b0d0d5
YZ
2391/* Parse a floating-point immediate. Return TRUE on success and return the
2392 value in *IMMED in the format of IEEE754 single-precision encoding.
2393 *CCP points to the start of the string; DP_P is TRUE when the immediate
2394 is expected to be in double-precision (N.B. this only matters when
1799c0d0
RS
2395 hexadecimal representation is involved). REG_TYPE says which register
2396 names should be treated as registers rather than as symbolic immediates.
62b0d0d5 2397
874d7e6e
RS
2398 This routine accepts any IEEE float; it is up to the callers to reject
2399 invalid ones. */
62b0d0d5
YZ
2400
2401static bfd_boolean
1799c0d0
RS
2402parse_aarch64_imm_float (char **ccp, int *immed, bfd_boolean dp_p,
2403 aarch64_reg_type reg_type)
a06ea964
NC
2404{
2405 char *str = *ccp;
2406 char *fpnum;
2407 LITTLENUM_TYPE words[MAX_LITTLENUMS];
62b0d0d5
YZ
2408 int64_t val = 0;
2409 unsigned fpword = 0;
2410 bfd_boolean hex_p = FALSE;
a06ea964
NC
2411
2412 skip_past_char (&str, '#');
2413
a06ea964
NC
2414 fpnum = str;
2415 skip_whitespace (fpnum);
2416
2417 if (strncmp (fpnum, "0x", 2) == 0)
62b0d0d5
YZ
2418 {
2419 /* Support the hexadecimal representation of the IEEE754 encoding.
2420 Double-precision is expected when DP_P is TRUE, otherwise the
2421 representation should be in single-precision. */
1799c0d0 2422 if (! parse_constant_immediate (&str, &val, reg_type))
62b0d0d5
YZ
2423 goto invalid_fp;
2424
2425 if (dp_p)
2426 {
04a3379a 2427 if (!can_convert_double_to_float (val, &fpword))
62b0d0d5
YZ
2428 goto invalid_fp;
2429 }
2430 else if ((uint64_t) val > 0xffffffff)
2431 goto invalid_fp;
2432 else
2433 fpword = val;
2434
2435 hex_p = TRUE;
2436 }
66881839
TC
2437 else if (reg_name_p (str, reg_type))
2438 {
2439 set_recoverable_error (_("immediate operand required"));
2440 return FALSE;
a06ea964
NC
2441 }
2442
62b0d0d5 2443 if (! hex_p)
a06ea964 2444 {
a06ea964
NC
2445 int i;
2446
62b0d0d5
YZ
2447 if ((str = atof_ieee (str, 's', words)) == NULL)
2448 goto invalid_fp;
2449
a06ea964
NC
2450 /* Our FP word must be 32 bits (single-precision FP). */
2451 for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
2452 {
2453 fpword <<= LITTLENUM_NUMBER_OF_BITS;
2454 fpword |= words[i];
2455 }
62b0d0d5 2456 }
a06ea964 2457
874d7e6e
RS
2458 *immed = fpword;
2459 *ccp = str;
2460 return TRUE;
a06ea964 2461
dc1e8a47 2462 invalid_fp:
a06ea964
NC
2463 set_fatal_syntax_error (_("invalid floating-point constant"));
2464 return FALSE;
2465}
2466
2467/* Less-generic immediate-value read function with the possibility of loading
2468 a big (64-bit) immediate, as required by AdvSIMD Modified immediate
2469 instructions.
2470
2471 To prevent the expression parser from pushing a register name into the
2472 symbol table as an undefined symbol, a check is firstly done to find
1799c0d0
RS
2473 out whether STR is a register of type REG_TYPE followed by a comma or
2474 the end of line. Return FALSE if STR is such a register. */
a06ea964
NC
2475
2476static bfd_boolean
1799c0d0 2477parse_big_immediate (char **str, int64_t *imm, aarch64_reg_type reg_type)
a06ea964
NC
2478{
2479 char *ptr = *str;
2480
1799c0d0 2481 if (reg_name_p (ptr, reg_type))
a06ea964
NC
2482 {
2483 set_syntax_error (_("immediate operand required"));
2484 return FALSE;
2485 }
2486
2487 my_get_expression (&inst.reloc.exp, &ptr, GE_OPT_PREFIX, 1);
2488
2489 if (inst.reloc.exp.X_op == O_constant)
2490 *imm = inst.reloc.exp.X_add_number;
2491
2492 *str = ptr;
2493
2494 return TRUE;
2495}
2496
2497/* Set operand IDX of the *INSTR that needs a GAS internal fixup.
2498 if NEED_LIBOPCODES is non-zero, the fixup will need
2499 assistance from the libopcodes. */
2500
2501static inline void
2502aarch64_set_gas_internal_fixup (struct reloc *reloc,
2503 const aarch64_opnd_info *operand,
2504 int need_libopcodes_p)
2505{
2506 reloc->type = BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP;
2507 reloc->opnd = operand->type;
2508 if (need_libopcodes_p)
2509 reloc->need_libopcodes_p = 1;
2510};
2511
2512/* Return TRUE if the instruction needs to be fixed up later internally by
2513 the GAS; otherwise return FALSE. */
2514
2515static inline bfd_boolean
2516aarch64_gas_internal_fixup_p (void)
2517{
2518 return inst.reloc.type == BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP;
2519}
2520
33eaf5de 2521/* Assign the immediate value to the relevant field in *OPERAND if
a06ea964
NC
2522 RELOC->EXP is a constant expression; otherwise, flag that *OPERAND
2523 needs an internal fixup in a later stage.
2524 ADDR_OFF_P determines whether it is the field ADDR.OFFSET.IMM or
2525 IMM.VALUE that may get assigned with the constant. */
2526static inline void
2527assign_imm_if_const_or_fixup_later (struct reloc *reloc,
2528 aarch64_opnd_info *operand,
2529 int addr_off_p,
2530 int need_libopcodes_p,
2531 int skip_p)
2532{
2533 if (reloc->exp.X_op == O_constant)
2534 {
2535 if (addr_off_p)
2536 operand->addr.offset.imm = reloc->exp.X_add_number;
2537 else
2538 operand->imm.value = reloc->exp.X_add_number;
2539 reloc->type = BFD_RELOC_UNUSED;
2540 }
2541 else
2542 {
2543 aarch64_set_gas_internal_fixup (reloc, operand, need_libopcodes_p);
2544 /* Tell libopcodes to ignore this operand or not. This is helpful
2545 when one of the operands needs to be fixed up later but we need
2546 libopcodes to check the other operands. */
2547 operand->skip = skip_p;
2548 }
2549}
2550
2551/* Relocation modifiers. Each entry in the table contains the textual
2552 name for the relocation which may be placed before a symbol used as
2553 a load/store offset, or add immediate. It must be surrounded by a
2554 leading and trailing colon, for example:
2555
2556 ldr x0, [x1, #:rello:varsym]
2557 add x0, x1, #:rello:varsym */
2558
2559struct reloc_table_entry
2560{
2561 const char *name;
2562 int pc_rel;
6f4a313b 2563 bfd_reloc_code_real_type adr_type;
a06ea964
NC
2564 bfd_reloc_code_real_type adrp_type;
2565 bfd_reloc_code_real_type movw_type;
2566 bfd_reloc_code_real_type add_type;
2567 bfd_reloc_code_real_type ldst_type;
74ad790c 2568 bfd_reloc_code_real_type ld_literal_type;
a06ea964
NC
2569};
2570
2571static struct reloc_table_entry reloc_table[] = {
2572 /* Low 12 bits of absolute address: ADD/i and LDR/STR */
2573 {"lo12", 0,
6f4a313b 2574 0, /* adr_type */
a06ea964
NC
2575 0,
2576 0,
2577 BFD_RELOC_AARCH64_ADD_LO12,
74ad790c
MS
2578 BFD_RELOC_AARCH64_LDST_LO12,
2579 0},
a06ea964
NC
2580
2581 /* Higher 21 bits of pc-relative page offset: ADRP */
2582 {"pg_hi21", 1,
6f4a313b 2583 0, /* adr_type */
a06ea964
NC
2584 BFD_RELOC_AARCH64_ADR_HI21_PCREL,
2585 0,
2586 0,
74ad790c 2587 0,
a06ea964
NC
2588 0},
2589
2590 /* Higher 21 bits of pc-relative page offset: ADRP, no check */
2591 {"pg_hi21_nc", 1,
6f4a313b 2592 0, /* adr_type */
a06ea964
NC
2593 BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL,
2594 0,
2595 0,
74ad790c 2596 0,
a06ea964
NC
2597 0},
2598
2599 /* Most significant bits 0-15 of unsigned address/value: MOVZ */
2600 {"abs_g0", 0,
6f4a313b 2601 0, /* adr_type */
a06ea964
NC
2602 0,
2603 BFD_RELOC_AARCH64_MOVW_G0,
2604 0,
74ad790c 2605 0,
a06ea964
NC
2606 0},
2607
2608 /* Most significant bits 0-15 of signed address/value: MOVN/Z */
2609 {"abs_g0_s", 0,
6f4a313b 2610 0, /* adr_type */
a06ea964
NC
2611 0,
2612 BFD_RELOC_AARCH64_MOVW_G0_S,
2613 0,
74ad790c 2614 0,
a06ea964
NC
2615 0},
2616
2617 /* Less significant bits 0-15 of address/value: MOVK, no check */
2618 {"abs_g0_nc", 0,
6f4a313b 2619 0, /* adr_type */
a06ea964
NC
2620 0,
2621 BFD_RELOC_AARCH64_MOVW_G0_NC,
2622 0,
74ad790c 2623 0,
a06ea964
NC
2624 0},
2625
2626 /* Most significant bits 16-31 of unsigned address/value: MOVZ */
2627 {"abs_g1", 0,
6f4a313b 2628 0, /* adr_type */
a06ea964
NC
2629 0,
2630 BFD_RELOC_AARCH64_MOVW_G1,
2631 0,
74ad790c 2632 0,
a06ea964
NC
2633 0},
2634
2635 /* Most significant bits 16-31 of signed address/value: MOVN/Z */
2636 {"abs_g1_s", 0,
6f4a313b 2637 0, /* adr_type */
a06ea964
NC
2638 0,
2639 BFD_RELOC_AARCH64_MOVW_G1_S,
2640 0,
74ad790c 2641 0,
a06ea964
NC
2642 0},
2643
2644 /* Less significant bits 16-31 of address/value: MOVK, no check */
2645 {"abs_g1_nc", 0,
6f4a313b 2646 0, /* adr_type */
a06ea964
NC
2647 0,
2648 BFD_RELOC_AARCH64_MOVW_G1_NC,
2649 0,
74ad790c 2650 0,
a06ea964
NC
2651 0},
2652
2653 /* Most significant bits 32-47 of unsigned address/value: MOVZ */
2654 {"abs_g2", 0,
6f4a313b 2655 0, /* adr_type */
a06ea964
NC
2656 0,
2657 BFD_RELOC_AARCH64_MOVW_G2,
2658 0,
74ad790c 2659 0,
a06ea964
NC
2660 0},
2661
2662 /* Most significant bits 32-47 of signed address/value: MOVN/Z */
2663 {"abs_g2_s", 0,
6f4a313b 2664 0, /* adr_type */
a06ea964
NC
2665 0,
2666 BFD_RELOC_AARCH64_MOVW_G2_S,
2667 0,
74ad790c 2668 0,
a06ea964
NC
2669 0},
2670
2671 /* Less significant bits 32-47 of address/value: MOVK, no check */
2672 {"abs_g2_nc", 0,
6f4a313b 2673 0, /* adr_type */
a06ea964
NC
2674 0,
2675 BFD_RELOC_AARCH64_MOVW_G2_NC,
2676 0,
74ad790c 2677 0,
a06ea964
NC
2678 0},
2679
2680 /* Most significant bits 48-63 of signed/unsigned address/value: MOVZ */
2681 {"abs_g3", 0,
6f4a313b 2682 0, /* adr_type */
a06ea964
NC
2683 0,
2684 BFD_RELOC_AARCH64_MOVW_G3,
2685 0,
74ad790c 2686 0,
a06ea964 2687 0},
4aa2c5e2 2688
32247401
RL
2689 /* Most significant bits 0-15 of signed/unsigned address/value: MOVZ */
2690 {"prel_g0", 1,
2691 0, /* adr_type */
2692 0,
2693 BFD_RELOC_AARCH64_MOVW_PREL_G0,
2694 0,
2695 0,
2696 0},
2697
2698 /* Most significant bits 0-15 of signed/unsigned address/value: MOVK */
2699 {"prel_g0_nc", 1,
2700 0, /* adr_type */
2701 0,
2702 BFD_RELOC_AARCH64_MOVW_PREL_G0_NC,
2703 0,
2704 0,
2705 0},
2706
2707 /* Most significant bits 16-31 of signed/unsigned address/value: MOVZ */
2708 {"prel_g1", 1,
2709 0, /* adr_type */
2710 0,
2711 BFD_RELOC_AARCH64_MOVW_PREL_G1,
2712 0,
2713 0,
2714 0},
2715
2716 /* Most significant bits 16-31 of signed/unsigned address/value: MOVK */
2717 {"prel_g1_nc", 1,
2718 0, /* adr_type */
2719 0,
2720 BFD_RELOC_AARCH64_MOVW_PREL_G1_NC,
2721 0,
2722 0,
2723 0},
2724
2725 /* Most significant bits 32-47 of signed/unsigned address/value: MOVZ */
2726 {"prel_g2", 1,
2727 0, /* adr_type */
2728 0,
2729 BFD_RELOC_AARCH64_MOVW_PREL_G2,
2730 0,
2731 0,
2732 0},
2733
2734 /* Most significant bits 32-47 of signed/unsigned address/value: MOVK */
2735 {"prel_g2_nc", 1,
2736 0, /* adr_type */
2737 0,
2738 BFD_RELOC_AARCH64_MOVW_PREL_G2_NC,
2739 0,
2740 0,
2741 0},
2742
2743 /* Most significant bits 48-63 of signed/unsigned address/value: MOVZ */
2744 {"prel_g3", 1,
2745 0, /* adr_type */
2746 0,
2747 BFD_RELOC_AARCH64_MOVW_PREL_G3,
2748 0,
2749 0,
2750 0},
2751
a06ea964
NC
2752 /* Get to the page containing GOT entry for a symbol. */
2753 {"got", 1,
6f4a313b 2754 0, /* adr_type */
a06ea964
NC
2755 BFD_RELOC_AARCH64_ADR_GOT_PAGE,
2756 0,
2757 0,
74ad790c 2758 0,
4aa2c5e2
MS
2759 BFD_RELOC_AARCH64_GOT_LD_PREL19},
2760
a06ea964
NC
2761 /* 12 bit offset into the page containing GOT entry for that symbol. */
2762 {"got_lo12", 0,
6f4a313b 2763 0, /* adr_type */
a06ea964
NC
2764 0,
2765 0,
2766 0,
74ad790c
MS
2767 BFD_RELOC_AARCH64_LD_GOT_LO12_NC,
2768 0},
a06ea964 2769
ca632371
RL
2770 /* 0-15 bits of address/value: MOVk, no check. */
2771 {"gotoff_g0_nc", 0,
2772 0, /* adr_type */
2773 0,
2774 BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC,
2775 0,
2776 0,
2777 0},
2778
654248e7
RL
2779 /* Most significant bits 16-31 of address/value: MOVZ. */
2780 {"gotoff_g1", 0,
2781 0, /* adr_type */
2782 0,
2783 BFD_RELOC_AARCH64_MOVW_GOTOFF_G1,
2784 0,
2785 0,
2786 0},
2787
87f5fbcc
RL
2788 /* 15 bit offset into the page containing GOT entry for that symbol. */
2789 {"gotoff_lo15", 0,
2790 0, /* adr_type */
2791 0,
2792 0,
2793 0,
2794 BFD_RELOC_AARCH64_LD64_GOTOFF_LO15,
2795 0},
2796
3b957e5b
RL
2797 /* Get to the page containing GOT TLS entry for a symbol */
2798 {"gottprel_g0_nc", 0,
2799 0, /* adr_type */
2800 0,
2801 BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC,
2802 0,
2803 0,
2804 0},
2805
2806 /* Get to the page containing GOT TLS entry for a symbol */
2807 {"gottprel_g1", 0,
2808 0, /* adr_type */
2809 0,
2810 BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1,
2811 0,
2812 0,
2813 0},
2814
a06ea964
NC
2815 /* Get to the page containing GOT TLS entry for a symbol */
2816 {"tlsgd", 0,
3c12b054 2817 BFD_RELOC_AARCH64_TLSGD_ADR_PREL21, /* adr_type */
a06ea964
NC
2818 BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21,
2819 0,
2820 0,
74ad790c 2821 0,
a06ea964
NC
2822 0},
2823
2824 /* 12 bit offset into the page containing GOT TLS entry for a symbol */
2825 {"tlsgd_lo12", 0,
6f4a313b 2826 0, /* adr_type */
a06ea964
NC
2827 0,
2828 0,
2829 BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC,
74ad790c 2830 0,
a06ea964
NC
2831 0},
2832
3e8286c0
RL
2833 /* Lower 16 bits address/value: MOVk. */
2834 {"tlsgd_g0_nc", 0,
2835 0, /* adr_type */
2836 0,
2837 BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC,
2838 0,
2839 0,
2840 0},
2841
1aa66fb1
RL
2842 /* Most significant bits 16-31 of address/value: MOVZ. */
2843 {"tlsgd_g1", 0,
2844 0, /* adr_type */
2845 0,
2846 BFD_RELOC_AARCH64_TLSGD_MOVW_G1,
2847 0,
2848 0,
2849 0},
2850
a06ea964
NC
2851 /* Get to the page containing GOT TLS entry for a symbol */
2852 {"tlsdesc", 0,
389b8029 2853 BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21, /* adr_type */
418009c2 2854 BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21,
a06ea964
NC
2855 0,
2856 0,
74ad790c 2857 0,
1ada945d 2858 BFD_RELOC_AARCH64_TLSDESC_LD_PREL19},
a06ea964
NC
2859
2860 /* 12 bit offset into the page containing GOT TLS entry for a symbol */
2861 {"tlsdesc_lo12", 0,
6f4a313b 2862 0, /* adr_type */
a06ea964
NC
2863 0,
2864 0,
f955cccf 2865 BFD_RELOC_AARCH64_TLSDESC_ADD_LO12,
74ad790c
MS
2866 BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC,
2867 0},
a06ea964 2868
6c37fedc
JW
2869 /* Get to the page containing GOT TLS entry for a symbol.
2870 The same as GD, we allocate two consecutive GOT slots
2871 for module index and module offset, the only difference
33eaf5de 2872 with GD is the module offset should be initialized to
6c37fedc
JW
2873 zero without any outstanding runtime relocation. */
2874 {"tlsldm", 0,
2875 BFD_RELOC_AARCH64_TLSLD_ADR_PREL21, /* adr_type */
1107e076 2876 BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21,
6c37fedc
JW
2877 0,
2878 0,
2879 0,
2880 0},
2881
a12fad50
JW
2882 /* 12 bit offset into the page containing GOT TLS entry for a symbol */
2883 {"tlsldm_lo12_nc", 0,
2884 0, /* adr_type */
2885 0,
2886 0,
2887 BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC,
2888 0,
2889 0},
2890
70151fb5
JW
2891 /* 12 bit offset into the module TLS base address. */
2892 {"dtprel_lo12", 0,
2893 0, /* adr_type */
2894 0,
2895 0,
2896 BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12,
4c562523 2897 BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12,
70151fb5
JW
2898 0},
2899
13289c10
JW
2900 /* Same as dtprel_lo12, no overflow check. */
2901 {"dtprel_lo12_nc", 0,
2902 0, /* adr_type */
2903 0,
2904 0,
2905 BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC,
4c562523 2906 BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC,
13289c10
JW
2907 0},
2908
49df5539
JW
2909 /* bits[23:12] of offset to the module TLS base address. */
2910 {"dtprel_hi12", 0,
2911 0, /* adr_type */
2912 0,
2913 0,
2914 BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12,
2915 0,
2916 0},
2917
2918 /* bits[15:0] of offset to the module TLS base address. */
2919 {"dtprel_g0", 0,
2920 0, /* adr_type */
2921 0,
2922 BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0,
2923 0,
2924 0,
2925 0},
2926
2927 /* No overflow check version of BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0. */
2928 {"dtprel_g0_nc", 0,
2929 0, /* adr_type */
2930 0,
2931 BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC,
2932 0,
2933 0,
2934 0},
2935
2936 /* bits[31:16] of offset to the module TLS base address. */
2937 {"dtprel_g1", 0,
2938 0, /* adr_type */
2939 0,
2940 BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1,
2941 0,
2942 0,
2943 0},
2944
2945 /* No overflow check version of BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1. */
2946 {"dtprel_g1_nc", 0,
2947 0, /* adr_type */
2948 0,
2949 BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC,
2950 0,
2951 0,
2952 0},
2953
2954 /* bits[47:32] of offset to the module TLS base address. */
2955 {"dtprel_g2", 0,
2956 0, /* adr_type */
2957 0,
2958 BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2,
2959 0,
2960 0,
2961 0},
2962
43a357f9
RL
2963 /* Lower 16 bit offset into GOT entry for a symbol */
2964 {"tlsdesc_off_g0_nc", 0,
2965 0, /* adr_type */
2966 0,
2967 BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC,
2968 0,
2969 0,
2970 0},
2971
2972 /* Higher 16 bit offset into GOT entry for a symbol */
2973 {"tlsdesc_off_g1", 0,
2974 0, /* adr_type */
2975 0,
2976 BFD_RELOC_AARCH64_TLSDESC_OFF_G1,
2977 0,
2978 0,
2979 0},
2980
a06ea964
NC
2981 /* Get to the page containing GOT TLS entry for a symbol */
2982 {"gottprel", 0,
6f4a313b 2983 0, /* adr_type */
a06ea964
NC
2984 BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21,
2985 0,
2986 0,
74ad790c 2987 0,
043bf05a 2988 BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19},
a06ea964
NC
2989
2990 /* 12 bit offset into the page containing GOT TLS entry for a symbol */
2991 {"gottprel_lo12", 0,
6f4a313b 2992 0, /* adr_type */
a06ea964
NC
2993 0,
2994 0,
2995 0,
74ad790c
MS
2996 BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC,
2997 0},
a06ea964
NC
2998
2999 /* Get tp offset for a symbol. */
3000 {"tprel", 0,
6f4a313b 3001 0, /* adr_type */
a06ea964
NC
3002 0,
3003 0,
3004 BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12,
74ad790c 3005 0,
a06ea964
NC
3006 0},
3007
3008 /* Get tp offset for a symbol. */
3009 {"tprel_lo12", 0,
6f4a313b 3010 0, /* adr_type */
a06ea964
NC
3011 0,
3012 0,
3013 BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12,
84f1b9fb 3014 BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12,
a06ea964
NC
3015 0},
3016
3017 /* Get tp offset for a symbol. */
3018 {"tprel_hi12", 0,
6f4a313b 3019 0, /* adr_type */
a06ea964
NC
3020 0,
3021 0,
3022 BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12,
74ad790c 3023 0,
a06ea964
NC
3024 0},
3025
3026 /* Get tp offset for a symbol. */
3027 {"tprel_lo12_nc", 0,
6f4a313b 3028 0, /* adr_type */
a06ea964
NC
3029 0,
3030 0,
3031 BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC,
84f1b9fb 3032 BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12_NC,
a06ea964
NC
3033 0},
3034
3035 /* Most significant bits 32-47 of address/value: MOVZ. */
3036 {"tprel_g2", 0,
6f4a313b 3037 0, /* adr_type */
a06ea964
NC
3038 0,
3039 BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2,
3040 0,
74ad790c 3041 0,
a06ea964
NC
3042 0},
3043
3044 /* Most significant bits 16-31 of address/value: MOVZ. */
3045 {"tprel_g1", 0,
6f4a313b 3046 0, /* adr_type */
a06ea964
NC
3047 0,
3048 BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1,
3049 0,
74ad790c 3050 0,
a06ea964
NC
3051 0},
3052
3053 /* Most significant bits 16-31 of address/value: MOVZ, no check. */
3054 {"tprel_g1_nc", 0,
6f4a313b 3055 0, /* adr_type */
a06ea964
NC
3056 0,
3057 BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC,
3058 0,
74ad790c 3059 0,
a06ea964
NC
3060 0},
3061
3062 /* Most significant bits 0-15 of address/value: MOVZ. */
3063 {"tprel_g0", 0,
6f4a313b 3064 0, /* adr_type */
a06ea964
NC
3065 0,
3066 BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0,
3067 0,
74ad790c 3068 0,
a06ea964
NC
3069 0},
3070
3071 /* Most significant bits 0-15 of address/value: MOVZ, no check. */
3072 {"tprel_g0_nc", 0,
6f4a313b 3073 0, /* adr_type */
a06ea964
NC
3074 0,
3075 BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC,
3076 0,
74ad790c 3077 0,
a06ea964 3078 0},
a921b5bd
JW
3079
3080 /* 15bit offset from got entry to base address of GOT table. */
3081 {"gotpage_lo15", 0,
3082 0,
3083 0,
3084 0,
3085 0,
3086 BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15,
3087 0},
3d715ce4
JW
3088
3089 /* 14bit offset from got entry to base address of GOT table. */
3090 {"gotpage_lo14", 0,
3091 0,
3092 0,
3093 0,
3094 0,
3095 BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14,
3096 0},
a06ea964
NC
3097};
3098
3099/* Given the address of a pointer pointing to the textual name of a
3100 relocation as may appear in assembler source, attempt to find its
3101 details in reloc_table. The pointer will be updated to the character
3102 after the trailing colon. On failure, NULL will be returned;
3103 otherwise return the reloc_table_entry. */
3104
3105static struct reloc_table_entry *
3106find_reloc_table_entry (char **str)
3107{
3108 unsigned int i;
3109 for (i = 0; i < ARRAY_SIZE (reloc_table); i++)
3110 {
3111 int length = strlen (reloc_table[i].name);
3112
3113 if (strncasecmp (reloc_table[i].name, *str, length) == 0
3114 && (*str)[length] == ':')
3115 {
3116 *str += (length + 1);
3117 return &reloc_table[i];
3118 }
3119 }
3120
3121 return NULL;
3122}
3123
3124/* Mode argument to parse_shift and parser_shifter_operand. */
3125enum parse_shift_mode
3126{
98907a70 3127 SHIFTED_NONE, /* no shifter allowed */
a06ea964
NC
3128 SHIFTED_ARITH_IMM, /* "rn{,lsl|lsr|asl|asr|uxt|sxt #n}" or
3129 "#imm{,lsl #n}" */
3130 SHIFTED_LOGIC_IMM, /* "rn{,lsl|lsr|asl|asr|ror #n}" or
3131 "#imm" */
3132 SHIFTED_LSL, /* bare "lsl #n" */
2442d846 3133 SHIFTED_MUL, /* bare "mul #n" */
a06ea964 3134 SHIFTED_LSL_MSL, /* "lsl|msl #n" */
98907a70 3135 SHIFTED_MUL_VL, /* "mul vl" */
a06ea964
NC
3136 SHIFTED_REG_OFFSET /* [su]xtw|sxtx {#n} or lsl #n */
3137};
3138
3139/* Parse a <shift> operator on an AArch64 data processing instruction.
3140 Return TRUE on success; otherwise return FALSE. */
3141static bfd_boolean
3142parse_shift (char **str, aarch64_opnd_info *operand, enum parse_shift_mode mode)
3143{
3144 const struct aarch64_name_value_pair *shift_op;
3145 enum aarch64_modifier_kind kind;
3146 expressionS exp;
3147 int exp_has_prefix;
3148 char *s = *str;
3149 char *p = s;
3150
3151 for (p = *str; ISALPHA (*p); p++)
3152 ;
3153
3154 if (p == *str)
3155 {
3156 set_syntax_error (_("shift expression expected"));
3157 return FALSE;
3158 }
3159
629310ab 3160 shift_op = str_hash_find_n (aarch64_shift_hsh, *str, p - *str);
a06ea964
NC
3161
3162 if (shift_op == NULL)
3163 {
3164 set_syntax_error (_("shift operator expected"));
3165 return FALSE;
3166 }
3167
3168 kind = aarch64_get_operand_modifier (shift_op);
3169
3170 if (kind == AARCH64_MOD_MSL && mode != SHIFTED_LSL_MSL)
3171 {
3172 set_syntax_error (_("invalid use of 'MSL'"));
3173 return FALSE;
3174 }
3175
2442d846 3176 if (kind == AARCH64_MOD_MUL
98907a70
RS
3177 && mode != SHIFTED_MUL
3178 && mode != SHIFTED_MUL_VL)
2442d846
RS
3179 {
3180 set_syntax_error (_("invalid use of 'MUL'"));
3181 return FALSE;
3182 }
3183
a06ea964
NC
3184 switch (mode)
3185 {
3186 case SHIFTED_LOGIC_IMM:
535b785f 3187 if (aarch64_extend_operator_p (kind))
a06ea964
NC
3188 {
3189 set_syntax_error (_("extending shift is not permitted"));
3190 return FALSE;
3191 }
3192 break;
3193
3194 case SHIFTED_ARITH_IMM:
3195 if (kind == AARCH64_MOD_ROR)
3196 {
3197 set_syntax_error (_("'ROR' shift is not permitted"));
3198 return FALSE;
3199 }
3200 break;
3201
3202 case SHIFTED_LSL:
3203 if (kind != AARCH64_MOD_LSL)
3204 {
3205 set_syntax_error (_("only 'LSL' shift is permitted"));
3206 return FALSE;
3207 }
3208 break;
3209
2442d846
RS
3210 case SHIFTED_MUL:
3211 if (kind != AARCH64_MOD_MUL)
3212 {
3213 set_syntax_error (_("only 'MUL' is permitted"));
3214 return FALSE;
3215 }
3216 break;
3217
98907a70
RS
3218 case SHIFTED_MUL_VL:
3219 /* "MUL VL" consists of two separate tokens. Require the first
3220 token to be "MUL" and look for a following "VL". */
3221 if (kind == AARCH64_MOD_MUL)
3222 {
3223 skip_whitespace (p);
3224 if (strncasecmp (p, "vl", 2) == 0 && !ISALPHA (p[2]))
3225 {
3226 p += 2;
3227 kind = AARCH64_MOD_MUL_VL;
3228 break;
3229 }
3230 }
3231 set_syntax_error (_("only 'MUL VL' is permitted"));
3232 return FALSE;
3233
a06ea964
NC
3234 case SHIFTED_REG_OFFSET:
3235 if (kind != AARCH64_MOD_UXTW && kind != AARCH64_MOD_LSL
3236 && kind != AARCH64_MOD_SXTW && kind != AARCH64_MOD_SXTX)
3237 {
3238 set_fatal_syntax_error
3239 (_("invalid shift for the register offset addressing mode"));
3240 return FALSE;
3241 }
3242 break;
3243
3244 case SHIFTED_LSL_MSL:
3245 if (kind != AARCH64_MOD_LSL && kind != AARCH64_MOD_MSL)
3246 {
3247 set_syntax_error (_("invalid shift operator"));
3248 return FALSE;
3249 }
3250 break;
3251
3252 default:
3253 abort ();
3254 }
3255
3256 /* Whitespace can appear here if the next thing is a bare digit. */
3257 skip_whitespace (p);
3258
3259 /* Parse shift amount. */
3260 exp_has_prefix = 0;
98907a70 3261 if ((mode == SHIFTED_REG_OFFSET && *p == ']') || kind == AARCH64_MOD_MUL_VL)
a06ea964
NC
3262 exp.X_op = O_absent;
3263 else
3264 {
3265 if (is_immediate_prefix (*p))
3266 {
3267 p++;
3268 exp_has_prefix = 1;
3269 }
3270 my_get_expression (&exp, &p, GE_NO_PREFIX, 0);
3271 }
98907a70
RS
3272 if (kind == AARCH64_MOD_MUL_VL)
3273 /* For consistency, give MUL VL the same shift amount as an implicit
3274 MUL #1. */
3275 operand->shifter.amount = 1;
3276 else if (exp.X_op == O_absent)
a06ea964 3277 {
535b785f 3278 if (!aarch64_extend_operator_p (kind) || exp_has_prefix)
a06ea964
NC
3279 {
3280 set_syntax_error (_("missing shift amount"));
3281 return FALSE;
3282 }
3283 operand->shifter.amount = 0;
3284 }
3285 else if (exp.X_op != O_constant)
3286 {
3287 set_syntax_error (_("constant shift amount required"));
3288 return FALSE;
3289 }
2442d846
RS
3290 /* For parsing purposes, MUL #n has no inherent range. The range
3291 depends on the operand and will be checked by operand-specific
3292 routines. */
3293 else if (kind != AARCH64_MOD_MUL
3294 && (exp.X_add_number < 0 || exp.X_add_number > 63))
a06ea964
NC
3295 {
3296 set_fatal_syntax_error (_("shift amount out of range 0 to 63"));
3297 return FALSE;
3298 }
3299 else
3300 {
3301 operand->shifter.amount = exp.X_add_number;
3302 operand->shifter.amount_present = 1;
3303 }
3304
3305 operand->shifter.operator_present = 1;
3306 operand->shifter.kind = kind;
3307
3308 *str = p;
3309 return TRUE;
3310}
3311
3312/* Parse a <shifter_operand> for a data processing instruction:
3313
3314 #<immediate>
3315 #<immediate>, LSL #imm
3316
3317 Validation of immediate operands is deferred to md_apply_fix.
3318
3319 Return TRUE on success; otherwise return FALSE. */
3320
3321static bfd_boolean
3322parse_shifter_operand_imm (char **str, aarch64_opnd_info *operand,
3323 enum parse_shift_mode mode)
3324{
3325 char *p;
3326
3327 if (mode != SHIFTED_ARITH_IMM && mode != SHIFTED_LOGIC_IMM)
3328 return FALSE;
3329
3330 p = *str;
3331
3332 /* Accept an immediate expression. */
3333 if (! my_get_expression (&inst.reloc.exp, &p, GE_OPT_PREFIX, 1))
3334 return FALSE;
3335
3336 /* Accept optional LSL for arithmetic immediate values. */
3337 if (mode == SHIFTED_ARITH_IMM && skip_past_comma (&p))
3338 if (! parse_shift (&p, operand, SHIFTED_LSL))
3339 return FALSE;
3340
3341 /* Not accept any shifter for logical immediate values. */
3342 if (mode == SHIFTED_LOGIC_IMM && skip_past_comma (&p)
3343 && parse_shift (&p, operand, mode))
3344 {
3345 set_syntax_error (_("unexpected shift operator"));
3346 return FALSE;
3347 }
3348
3349 *str = p;
3350 return TRUE;
3351}
3352
3353/* Parse a <shifter_operand> for a data processing instruction:
3354
3355 <Rm>
3356 <Rm>, <shift>
3357 #<immediate>
3358 #<immediate>, LSL #imm
3359
3360 where <shift> is handled by parse_shift above, and the last two
3361 cases are handled by the function above.
3362
3363 Validation of immediate operands is deferred to md_apply_fix.
3364
3365 Return TRUE on success; otherwise return FALSE. */
3366
3367static bfd_boolean
3368parse_shifter_operand (char **str, aarch64_opnd_info *operand,
3369 enum parse_shift_mode mode)
3370{
e1b988bb
RS
3371 const reg_entry *reg;
3372 aarch64_opnd_qualifier_t qualifier;
a06ea964
NC
3373 enum aarch64_operand_class opd_class
3374 = aarch64_get_operand_class (operand->type);
3375
e1b988bb
RS
3376 reg = aarch64_reg_parse_32_64 (str, &qualifier);
3377 if (reg)
a06ea964
NC
3378 {
3379 if (opd_class == AARCH64_OPND_CLASS_IMMEDIATE)
3380 {
3381 set_syntax_error (_("unexpected register in the immediate operand"));
3382 return FALSE;
3383 }
3384
e1b988bb 3385 if (!aarch64_check_reg_type (reg, REG_TYPE_R_Z))
a06ea964 3386 {
e1b988bb 3387 set_syntax_error (_(get_reg_expected_msg (REG_TYPE_R_Z)));
a06ea964
NC
3388 return FALSE;
3389 }
3390
e1b988bb
RS
3391 operand->reg.regno = reg->number;
3392 operand->qualifier = qualifier;
a06ea964
NC
3393
3394 /* Accept optional shift operation on register. */
3395 if (! skip_past_comma (str))
3396 return TRUE;
3397
3398 if (! parse_shift (str, operand, mode))
3399 return FALSE;
3400
3401 return TRUE;
3402 }
3403 else if (opd_class == AARCH64_OPND_CLASS_MODIFIED_REG)
3404 {
3405 set_syntax_error
3406 (_("integer register expected in the extended/shifted operand "
3407 "register"));
3408 return FALSE;
3409 }
3410
3411 /* We have a shifted immediate variable. */
3412 return parse_shifter_operand_imm (str, operand, mode);
3413}
3414
3415/* Return TRUE on success; return FALSE otherwise. */
3416
3417static bfd_boolean
3418parse_shifter_operand_reloc (char **str, aarch64_opnd_info *operand,
3419 enum parse_shift_mode mode)
3420{
3421 char *p = *str;
3422
3423 /* Determine if we have the sequence of characters #: or just :
3424 coming next. If we do, then we check for a :rello: relocation
3425 modifier. If we don't, punt the whole lot to
3426 parse_shifter_operand. */
3427
3428 if ((p[0] == '#' && p[1] == ':') || p[0] == ':')
3429 {
3430 struct reloc_table_entry *entry;
3431
3432 if (p[0] == '#')
3433 p += 2;
3434 else
3435 p++;
3436 *str = p;
3437
3438 /* Try to parse a relocation. Anything else is an error. */
3439 if (!(entry = find_reloc_table_entry (str)))
3440 {
3441 set_syntax_error (_("unknown relocation modifier"));
3442 return FALSE;
3443 }
3444
3445 if (entry->add_type == 0)
3446 {
3447 set_syntax_error
3448 (_("this relocation modifier is not allowed on this instruction"));
3449 return FALSE;
3450 }
3451
3452 /* Save str before we decompose it. */
3453 p = *str;
3454
3455 /* Next, we parse the expression. */
3456 if (! my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX, 1))
3457 return FALSE;
3458
3459 /* Record the relocation type (use the ADD variant here). */
3460 inst.reloc.type = entry->add_type;
3461 inst.reloc.pc_rel = entry->pc_rel;
3462
3463 /* If str is empty, we've reached the end, stop here. */
3464 if (**str == '\0')
3465 return TRUE;
3466
55d9b4c1 3467 /* Otherwise, we have a shifted reloc modifier, so rewind to
a06ea964
NC
3468 recover the variable name and continue parsing for the shifter. */
3469 *str = p;
3470 return parse_shifter_operand_imm (str, operand, mode);
3471 }
3472
3473 return parse_shifter_operand (str, operand, mode);
3474}
3475
3476/* Parse all forms of an address expression. Information is written
3477 to *OPERAND and/or inst.reloc.
3478
3479 The A64 instruction set has the following addressing modes:
3480
3481 Offset
4df068de
RS
3482 [base] // in SIMD ld/st structure
3483 [base{,#0}] // in ld/st exclusive
a06ea964
NC
3484 [base{,#imm}]
3485 [base,Xm{,LSL #imm}]
3486 [base,Xm,SXTX {#imm}]
3487 [base,Wm,(S|U)XTW {#imm}]
3488 Pre-indexed
1820262b 3489 [base]! // in ldraa/ldrab exclusive
a06ea964
NC
3490 [base,#imm]!
3491 Post-indexed
3492 [base],#imm
4df068de 3493 [base],Xm // in SIMD ld/st structure
a06ea964
NC
3494 PC-relative (literal)
3495 label
4df068de 3496 SVE:
98907a70 3497 [base,#imm,MUL VL]
4df068de
RS
3498 [base,Zm.D{,LSL #imm}]
3499 [base,Zm.S,(S|U)XTW {#imm}]
3500 [base,Zm.D,(S|U)XTW {#imm}] // ignores top 32 bits of Zm.D elements
3501 [Zn.S,#imm]
3502 [Zn.D,#imm]
c469c864 3503 [Zn.S{, Xm}]
4df068de
RS
3504 [Zn.S,Zm.S{,LSL #imm}] // in ADR
3505 [Zn.D,Zm.D{,LSL #imm}] // in ADR
3506 [Zn.D,Zm.D,(S|U)XTW {#imm}] // in ADR
a06ea964
NC
3507
3508 (As a convenience, the notation "=immediate" is permitted in conjunction
3509 with the pc-relative literal load instructions to automatically place an
3510 immediate value or symbolic address in a nearby literal pool and generate
3511 a hidden label which references it.)
3512
3513 Upon a successful parsing, the address structure in *OPERAND will be
3514 filled in the following way:
3515
3516 .base_regno = <base>
3517 .offset.is_reg // 1 if the offset is a register
3518 .offset.imm = <imm>
3519 .offset.regno = <Rm>
3520
3521 For different addressing modes defined in the A64 ISA:
3522
3523 Offset
3524 .pcrel=0; .preind=1; .postind=0; .writeback=0
3525 Pre-indexed
3526 .pcrel=0; .preind=1; .postind=0; .writeback=1
3527 Post-indexed
3528 .pcrel=0; .preind=0; .postind=1; .writeback=1
3529 PC-relative (literal)
3530 .pcrel=1; .preind=1; .postind=0; .writeback=0
3531
3532 The shift/extension information, if any, will be stored in .shifter.
4df068de
RS
3533 The base and offset qualifiers will be stored in *BASE_QUALIFIER and
3534 *OFFSET_QUALIFIER respectively, with NIL being used if there's no
3535 corresponding register.
a06ea964 3536
4df068de 3537 BASE_TYPE says which types of base register should be accepted and
98907a70
RS
3538 OFFSET_TYPE says the same for offset registers. IMM_SHIFT_MODE
3539 is the type of shifter that is allowed for immediate offsets,
3540 or SHIFTED_NONE if none.
3541
3542 In all other respects, it is the caller's responsibility to check
3543 for addressing modes not supported by the instruction, and to set
3544 inst.reloc.type. */
a06ea964
NC
3545
3546static bfd_boolean
4df068de
RS
3547parse_address_main (char **str, aarch64_opnd_info *operand,
3548 aarch64_opnd_qualifier_t *base_qualifier,
3549 aarch64_opnd_qualifier_t *offset_qualifier,
98907a70
RS
3550 aarch64_reg_type base_type, aarch64_reg_type offset_type,
3551 enum parse_shift_mode imm_shift_mode)
a06ea964
NC
3552{
3553 char *p = *str;
e1b988bb 3554 const reg_entry *reg;
a06ea964
NC
3555 expressionS *exp = &inst.reloc.exp;
3556
4df068de
RS
3557 *base_qualifier = AARCH64_OPND_QLF_NIL;
3558 *offset_qualifier = AARCH64_OPND_QLF_NIL;
a06ea964
NC
3559 if (! skip_past_char (&p, '['))
3560 {
3561 /* =immediate or label. */
3562 operand->addr.pcrel = 1;
3563 operand->addr.preind = 1;
3564
f41aef5f
RE
3565 /* #:<reloc_op>:<symbol> */
3566 skip_past_char (&p, '#');
73866052 3567 if (skip_past_char (&p, ':'))
f41aef5f 3568 {
6f4a313b 3569 bfd_reloc_code_real_type ty;
f41aef5f
RE
3570 struct reloc_table_entry *entry;
3571
3572 /* Try to parse a relocation modifier. Anything else is
3573 an error. */
3574 entry = find_reloc_table_entry (&p);
3575 if (! entry)
3576 {
3577 set_syntax_error (_("unknown relocation modifier"));
3578 return FALSE;
3579 }
3580
6f4a313b
MS
3581 switch (operand->type)
3582 {
3583 case AARCH64_OPND_ADDR_PCREL21:
3584 /* adr */
3585 ty = entry->adr_type;
3586 break;
3587
3588 default:
74ad790c 3589 ty = entry->ld_literal_type;
6f4a313b
MS
3590 break;
3591 }
3592
3593 if (ty == 0)
f41aef5f
RE
3594 {
3595 set_syntax_error
3596 (_("this relocation modifier is not allowed on this "
3597 "instruction"));
3598 return FALSE;
3599 }
3600
3601 /* #:<reloc_op>: */
3602 if (! my_get_expression (exp, &p, GE_NO_PREFIX, 1))
3603 {
3604 set_syntax_error (_("invalid relocation expression"));
3605 return FALSE;
3606 }
a06ea964 3607
f41aef5f 3608 /* #:<reloc_op>:<expr> */
6f4a313b
MS
3609 /* Record the relocation type. */
3610 inst.reloc.type = ty;
f41aef5f
RE
3611 inst.reloc.pc_rel = entry->pc_rel;
3612 }
3613 else
a06ea964 3614 {
f41aef5f
RE
3615
3616 if (skip_past_char (&p, '='))
3617 /* =immediate; need to generate the literal in the literal pool. */
3618 inst.gen_lit_pool = 1;
3619
3620 if (!my_get_expression (exp, &p, GE_NO_PREFIX, 1))
3621 {
3622 set_syntax_error (_("invalid address"));
3623 return FALSE;
3624 }
a06ea964
NC
3625 }
3626
3627 *str = p;
3628 return TRUE;
3629 }
3630
3631 /* [ */
3632
4df068de
RS
3633 reg = aarch64_addr_reg_parse (&p, base_type, base_qualifier);
3634 if (!reg || !aarch64_check_reg_type (reg, base_type))
a06ea964 3635 {
4df068de 3636 set_syntax_error (_(get_reg_expected_msg (base_type)));
a06ea964
NC
3637 return FALSE;
3638 }
e1b988bb 3639 operand->addr.base_regno = reg->number;
a06ea964
NC
3640
3641 /* [Xn */
3642 if (skip_past_comma (&p))
3643 {
3644 /* [Xn, */
3645 operand->addr.preind = 1;
3646
4df068de 3647 reg = aarch64_addr_reg_parse (&p, offset_type, offset_qualifier);
e1b988bb 3648 if (reg)
a06ea964 3649 {
4df068de 3650 if (!aarch64_check_reg_type (reg, offset_type))
e1b988bb 3651 {
4df068de 3652 set_syntax_error (_(get_reg_expected_msg (offset_type)));
e1b988bb
RS
3653 return FALSE;
3654 }
3655
a06ea964 3656 /* [Xn,Rm */
e1b988bb 3657 operand->addr.offset.regno = reg->number;
a06ea964
NC
3658 operand->addr.offset.is_reg = 1;
3659 /* Shifted index. */
3660 if (skip_past_comma (&p))
3661 {
3662 /* [Xn,Rm, */
3663 if (! parse_shift (&p, operand, SHIFTED_REG_OFFSET))
3664 /* Use the diagnostics set in parse_shift, so not set new
3665 error message here. */
3666 return FALSE;
3667 }
3668 /* We only accept:
c469c864 3669 [base,Xm] # For vector plus scalar SVE2 indexing.
a06ea964
NC
3670 [base,Xm{,LSL #imm}]
3671 [base,Xm,SXTX {#imm}]
3672 [base,Wm,(S|U)XTW {#imm}] */
3673 if (operand->shifter.kind == AARCH64_MOD_NONE
3674 || operand->shifter.kind == AARCH64_MOD_LSL
3675 || operand->shifter.kind == AARCH64_MOD_SXTX)
3676 {
4df068de 3677 if (*offset_qualifier == AARCH64_OPND_QLF_W)
a06ea964
NC
3678 {
3679 set_syntax_error (_("invalid use of 32-bit register offset"));
3680 return FALSE;
3681 }
4df068de 3682 if (aarch64_get_qualifier_esize (*base_qualifier)
c469c864
MM
3683 != aarch64_get_qualifier_esize (*offset_qualifier)
3684 && (operand->type != AARCH64_OPND_SVE_ADDR_ZX
3685 || *base_qualifier != AARCH64_OPND_QLF_S_S
3686 || *offset_qualifier != AARCH64_OPND_QLF_X))
4df068de
RS
3687 {
3688 set_syntax_error (_("offset has different size from base"));
3689 return FALSE;
3690 }
a06ea964 3691 }
4df068de 3692 else if (*offset_qualifier == AARCH64_OPND_QLF_X)
a06ea964
NC
3693 {
3694 set_syntax_error (_("invalid use of 64-bit register offset"));
3695 return FALSE;
3696 }
3697 }
3698 else
3699 {
3700 /* [Xn,#:<reloc_op>:<symbol> */
3701 skip_past_char (&p, '#');
73866052 3702 if (skip_past_char (&p, ':'))
a06ea964
NC
3703 {
3704 struct reloc_table_entry *entry;
3705
3706 /* Try to parse a relocation modifier. Anything else is
3707 an error. */
3708 if (!(entry = find_reloc_table_entry (&p)))
3709 {
3710 set_syntax_error (_("unknown relocation modifier"));
3711 return FALSE;
3712 }
3713
3714 if (entry->ldst_type == 0)
3715 {
3716 set_syntax_error
3717 (_("this relocation modifier is not allowed on this "
3718 "instruction"));
3719 return FALSE;
3720 }
3721
3722 /* [Xn,#:<reloc_op>: */
3723 /* We now have the group relocation table entry corresponding to
3724 the name in the assembler source. Next, we parse the
3725 expression. */
3726 if (! my_get_expression (exp, &p, GE_NO_PREFIX, 1))
3727 {
3728 set_syntax_error (_("invalid relocation expression"));
3729 return FALSE;
3730 }
3731
3732 /* [Xn,#:<reloc_op>:<expr> */
3733 /* Record the load/store relocation type. */
3734 inst.reloc.type = entry->ldst_type;
3735 inst.reloc.pc_rel = entry->pc_rel;
3736 }
98907a70 3737 else
a06ea964 3738 {
98907a70
RS
3739 if (! my_get_expression (exp, &p, GE_OPT_PREFIX, 1))
3740 {
3741 set_syntax_error (_("invalid expression in the address"));
3742 return FALSE;
3743 }
3744 /* [Xn,<expr> */
3745 if (imm_shift_mode != SHIFTED_NONE && skip_past_comma (&p))
3746 /* [Xn,<expr>,<shifter> */
3747 if (! parse_shift (&p, operand, imm_shift_mode))
3748 return FALSE;
a06ea964 3749 }
a06ea964
NC
3750 }
3751 }
3752
3753 if (! skip_past_char (&p, ']'))
3754 {
3755 set_syntax_error (_("']' expected"));
3756 return FALSE;
3757 }
3758
3759 if (skip_past_char (&p, '!'))
3760 {
3761 if (operand->addr.preind && operand->addr.offset.is_reg)
3762 {
3763 set_syntax_error (_("register offset not allowed in pre-indexed "
3764 "addressing mode"));
3765 return FALSE;
3766 }
3767 /* [Xn]! */
3768 operand->addr.writeback = 1;
3769 }
3770 else if (skip_past_comma (&p))
3771 {
3772 /* [Xn], */
3773 operand->addr.postind = 1;
3774 operand->addr.writeback = 1;
3775
3776 if (operand->addr.preind)
3777 {
3778 set_syntax_error (_("cannot combine pre- and post-indexing"));
3779 return FALSE;
3780 }
3781
4df068de 3782 reg = aarch64_reg_parse_32_64 (&p, offset_qualifier);
73866052 3783 if (reg)
a06ea964
NC
3784 {
3785 /* [Xn],Xm */
e1b988bb 3786 if (!aarch64_check_reg_type (reg, REG_TYPE_R_64))
a06ea964 3787 {
e1b988bb 3788 set_syntax_error (_(get_reg_expected_msg (REG_TYPE_R_64)));
a06ea964
NC
3789 return FALSE;
3790 }
e1b988bb
RS
3791
3792 operand->addr.offset.regno = reg->number;
a06ea964
NC
3793 operand->addr.offset.is_reg = 1;
3794 }
3795 else if (! my_get_expression (exp, &p, GE_OPT_PREFIX, 1))
3796 {
3797 /* [Xn],#expr */
3798 set_syntax_error (_("invalid expression in the address"));
3799 return FALSE;
3800 }
3801 }
3802
3803 /* If at this point neither .preind nor .postind is set, we have a
1820262b
DB
3804 bare [Rn]{!}; only accept [Rn]! as a shorthand for [Rn,#0]! for ldraa and
3805 ldrab, accept [Rn] as a shorthand for [Rn,#0].
c469c864
MM
3806 For SVE2 vector plus scalar offsets, allow [Zn.<T>] as shorthand for
3807 [Zn.<T>, xzr]. */
a06ea964
NC
3808 if (operand->addr.preind == 0 && operand->addr.postind == 0)
3809 {
550fd7bf 3810 if (operand->addr.writeback)
a06ea964 3811 {
1820262b
DB
3812 if (operand->type == AARCH64_OPND_ADDR_SIMM10)
3813 {
3814 /* Accept [Rn]! as a shorthand for [Rn,#0]! */
3815 operand->addr.offset.is_reg = 0;
3816 operand->addr.offset.imm = 0;
3817 operand->addr.preind = 1;
3818 }
3819 else
3820 {
3821 /* Reject [Rn]! */
3822 set_syntax_error (_("missing offset in the pre-indexed address"));
3823 return FALSE;
3824 }
a06ea964 3825 }
1820262b 3826 else
c469c864 3827 {
1820262b
DB
3828 operand->addr.preind = 1;
3829 if (operand->type == AARCH64_OPND_SVE_ADDR_ZX)
3830 {
3831 operand->addr.offset.is_reg = 1;
3832 operand->addr.offset.regno = REG_ZR;
3833 *offset_qualifier = AARCH64_OPND_QLF_X;
3834 }
3835 else
3836 {
3837 inst.reloc.exp.X_op = O_constant;
3838 inst.reloc.exp.X_add_number = 0;
3839 }
c469c864 3840 }
a06ea964
NC
3841 }
3842
3843 *str = p;
3844 return TRUE;
3845}
3846
73866052
RS
3847/* Parse a base AArch64 address (as opposed to an SVE one). Return TRUE
3848 on success. */
a06ea964 3849static bfd_boolean
73866052 3850parse_address (char **str, aarch64_opnd_info *operand)
a06ea964 3851{
4df068de 3852 aarch64_opnd_qualifier_t base_qualifier, offset_qualifier;
3493da5c
SP
3853
3854 aarch64_reg_type base;
3855
3856 if (AARCH64_CPU_HAS_FEATURE (cpu_variant, AARCH64_FEATURE_C64))
3857 base = REG_TYPE_CA_N_SP;
3858 else
3859 base = REG_TYPE_R64_SP;
3860
4df068de 3861 return parse_address_main (str, operand, &base_qualifier, &offset_qualifier,
3493da5c 3862 base, REG_TYPE_R_Z, SHIFTED_NONE);
4df068de
RS
3863}
3864
98907a70 3865/* Parse an address in which SVE vector registers and MUL VL are allowed.
4df068de
RS
3866 The arguments have the same meaning as for parse_address_main.
3867 Return TRUE on success. */
3868static bfd_boolean
3869parse_sve_address (char **str, aarch64_opnd_info *operand,
3870 aarch64_opnd_qualifier_t *base_qualifier,
3871 aarch64_opnd_qualifier_t *offset_qualifier)
3872{
3873 return parse_address_main (str, operand, base_qualifier, offset_qualifier,
98907a70
RS
3874 REG_TYPE_SVE_BASE, REG_TYPE_SVE_OFFSET,
3875 SHIFTED_MUL_VL);
a06ea964
NC
3876}
3877
3878/* Parse an operand for a MOVZ, MOVN or MOVK instruction.
3879 Return TRUE on success; otherwise return FALSE. */
3880static bfd_boolean
3881parse_half (char **str, int *internal_fixup_p)
3882{
671eeb28 3883 char *p = *str;
a06ea964 3884
a06ea964
NC
3885 skip_past_char (&p, '#');
3886
3887 gas_assert (internal_fixup_p);
3888 *internal_fixup_p = 0;
3889
3890 if (*p == ':')
3891 {
3892 struct reloc_table_entry *entry;
3893
3894 /* Try to parse a relocation. Anything else is an error. */
3895 ++p;
3896 if (!(entry = find_reloc_table_entry (&p)))
3897 {
3898 set_syntax_error (_("unknown relocation modifier"));
3899 return FALSE;
3900 }
3901
3902 if (entry->movw_type == 0)
3903 {
3904 set_syntax_error
3905 (_("this relocation modifier is not allowed on this instruction"));
3906 return FALSE;
3907 }
3908
3909 inst.reloc.type = entry->movw_type;
3910 }
3911 else
3912 *internal_fixup_p = 1;
3913
a06ea964
NC
3914 if (! my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, 1))
3915 return FALSE;
3916
3917 *str = p;
3918 return TRUE;
3919}
3920
3921/* Parse an operand for an ADRP instruction:
3922 ADRP <Xd>, <label>
3923 Return TRUE on success; otherwise return FALSE. */
3924
3925static bfd_boolean
3926parse_adrp (char **str)
3927{
3928 char *p;
3929
3930 p = *str;
3931 if (*p == ':')
3932 {
3933 struct reloc_table_entry *entry;
3934
3935 /* Try to parse a relocation. Anything else is an error. */
3936 ++p;
3937 if (!(entry = find_reloc_table_entry (&p)))
3938 {
3939 set_syntax_error (_("unknown relocation modifier"));
3940 return FALSE;
3941 }
3942
3943 if (entry->adrp_type == 0)
3944 {
3945 set_syntax_error
3946 (_("this relocation modifier is not allowed on this instruction"));
3947 return FALSE;
3948 }
3949
3950 inst.reloc.type = entry->adrp_type;
3951 }
3952 else
3953 inst.reloc.type = BFD_RELOC_AARCH64_ADR_HI21_PCREL;
3954
3955 inst.reloc.pc_rel = 1;
3956
3957 if (! my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, 1))
3958 return FALSE;
3959
3960 *str = p;
3961 return TRUE;
3962}
3963
3964/* Miscellaneous. */
3965
245d2e3f
RS
3966/* Parse a symbolic operand such as "pow2" at *STR. ARRAY is an array
3967 of SIZE tokens in which index I gives the token for field value I,
3968 or is null if field value I is invalid. REG_TYPE says which register
3969 names should be treated as registers rather than as symbolic immediates.
3970
3971 Return true on success, moving *STR past the operand and storing the
3972 field value in *VAL. */
3973
3974static int
3975parse_enum_string (char **str, int64_t *val, const char *const *array,
3976 size_t size, aarch64_reg_type reg_type)
3977{
3978 expressionS exp;
3979 char *p, *q;
3980 size_t i;
3981
3982 /* Match C-like tokens. */
3983 p = q = *str;
3984 while (ISALNUM (*q))
3985 q++;
3986
3987 for (i = 0; i < size; ++i)
3988 if (array[i]
3989 && strncasecmp (array[i], p, q - p) == 0
3990 && array[i][q - p] == 0)
3991 {
3992 *val = i;
3993 *str = q;
3994 return TRUE;
3995 }
3996
3997 if (!parse_immediate_expression (&p, &exp, reg_type))
3998 return FALSE;
3999
4000 if (exp.X_op == O_constant
4001 && (uint64_t) exp.X_add_number < size)
4002 {
4003 *val = exp.X_add_number;
4004 *str = p;
4005 return TRUE;
4006 }
4007
4008 /* Use the default error for this operand. */
4009 return FALSE;
4010}
4011
a06ea964
NC
4012/* Parse an option for a preload instruction. Returns the encoding for the
4013 option, or PARSE_FAIL. */
4014
4015static int
4016parse_pldop (char **str)
4017{
4018 char *p, *q;
4019 const struct aarch64_name_value_pair *o;
4020
4021 p = q = *str;
4022 while (ISALNUM (*q))
4023 q++;
4024
629310ab 4025 o = str_hash_find_n (aarch64_pldop_hsh, p, q - p);
a06ea964
NC
4026 if (!o)
4027 return PARSE_FAIL;
4028
4029 *str = q;
4030 return o->value;
4031}
4032
4033/* Parse an option for a barrier instruction. Returns the encoding for the
4034 option, or PARSE_FAIL. */
4035
4036static int
4037parse_barrier (char **str)
4038{
4039 char *p, *q;
05cfb0d8 4040 const struct aarch64_name_value_pair *o;
a06ea964
NC
4041
4042 p = q = *str;
4043 while (ISALPHA (*q))
4044 q++;
4045
629310ab 4046 o = str_hash_find_n (aarch64_barrier_opt_hsh, p, q - p);
a06ea964
NC
4047 if (!o)
4048 return PARSE_FAIL;
4049
4050 *str = q;
4051 return o->value;
4052}
4053
1e6f4800
MW
4054/* Parse an operand for a PSB barrier. Set *HINT_OPT to the hint-option record
4055 return 0 if successful. Otherwise return PARSE_FAIL. */
4056
4057static int
4058parse_barrier_psb (char **str,
4059 const struct aarch64_name_value_pair ** hint_opt)
4060{
4061 char *p, *q;
4062 const struct aarch64_name_value_pair *o;
4063
4064 p = q = *str;
4065 while (ISALPHA (*q))
4066 q++;
4067
629310ab 4068 o = str_hash_find_n (aarch64_hint_opt_hsh, p, q - p);
1e6f4800
MW
4069 if (!o)
4070 {
4071 set_fatal_syntax_error
c2e5c986 4072 ( _("unknown or missing option to PSB/TSB"));
1e6f4800
MW
4073 return PARSE_FAIL;
4074 }
4075
4076 if (o->value != 0x11)
4077 {
4078 /* PSB only accepts option name 'CSYNC'. */
4079 set_syntax_error
c2e5c986 4080 (_("the specified option is not accepted for PSB/TSB"));
1e6f4800
MW
4081 return PARSE_FAIL;
4082 }
4083
4084 *str = q;
4085 *hint_opt = o;
4086 return 0;
4087}
4088
ff605452
SD
4089/* Parse an operand for BTI. Set *HINT_OPT to the hint-option record
4090 return 0 if successful. Otherwise return PARSE_FAIL. */
4091
4092static int
4093parse_bti_operand (char **str,
4094 const struct aarch64_name_value_pair ** hint_opt)
4095{
4096 char *p, *q;
4097 const struct aarch64_name_value_pair *o;
4098
4099 p = q = *str;
4100 while (ISALPHA (*q))
4101 q++;
4102
629310ab 4103 o = str_hash_find_n (aarch64_hint_opt_hsh, p, q - p);
ff605452
SD
4104 if (!o)
4105 {
4106 set_fatal_syntax_error
4107 ( _("unknown option to BTI"));
4108 return PARSE_FAIL;
4109 }
4110
4111 switch (o->value)
4112 {
4113 /* Valid BTI operands. */
4114 case HINT_OPD_C:
4115 case HINT_OPD_J:
4116 case HINT_OPD_JC:
4117 break;
4118
4119 default:
4120 set_syntax_error
4121 (_("unknown option to BTI"));
4122 return PARSE_FAIL;
4123 }
4124
4125 *str = q;
4126 *hint_opt = o;
4127 return 0;
4128}
4129
a06ea964 4130/* Parse a system register or a PSTATE field name for an MSR/MRS instruction.
a203d9b7 4131 Returns the encoding for the option, or PARSE_FAIL.
a06ea964
NC
4132
4133 If IMPLE_DEFINED_P is non-zero, the function will also try to parse the
72ca8fad
MW
4134 implementation defined system register name S<op0>_<op1>_<Cn>_<Cm>_<op2>.
4135
4136 If PSTATEFIELD_P is non-zero, the function will parse the name as a PSTATE
4137 field, otherwise as a system register.
4138*/
a06ea964
NC
4139
4140static int
629310ab 4141parse_sys_reg (char **str, htab_t sys_regs,
561a72d4
TC
4142 int imple_defined_p, int pstatefield_p,
4143 uint32_t* flags)
a06ea964
NC
4144{
4145 char *p, *q;
fa63795f 4146 char buf[AARCH64_MAX_SYSREG_NAME_LEN];
49eec193 4147 const aarch64_sys_reg *o;
a06ea964
NC
4148 int value;
4149
4150 p = buf;
4151 for (q = *str; ISALNUM (*q) || *q == '_'; q++)
fa63795f 4152 if (p < buf + (sizeof (buf) - 1))
a06ea964
NC
4153 *p++ = TOLOWER (*q);
4154 *p = '\0';
fa63795f
AC
4155
4156 /* If the name is longer than AARCH64_MAX_SYSREG_NAME_LEN then it cannot be a
4157 valid system register. This is enforced by construction of the hash
4158 table. */
4159 if (p - buf != q - *str)
4160 return PARSE_FAIL;
a06ea964 4161
629310ab 4162 o = str_hash_find (sys_regs, buf);
a06ea964
NC
4163 if (!o)
4164 {
4165 if (!imple_defined_p)
4166 return PARSE_FAIL;
4167 else
4168 {
df7b4545 4169 /* Parse S<op0>_<op1>_<Cn>_<Cm>_<op2>. */
a06ea964 4170 unsigned int op0, op1, cn, cm, op2;
df7b4545
JW
4171
4172 if (sscanf (buf, "s%u_%u_c%u_c%u_%u", &op0, &op1, &cn, &cm, &op2)
4173 != 5)
a06ea964 4174 return PARSE_FAIL;
df7b4545 4175 if (op0 > 3 || op1 > 7 || cn > 15 || cm > 15 || op2 > 7)
a06ea964
NC
4176 return PARSE_FAIL;
4177 value = (op0 << 14) | (op1 << 11) | (cn << 7) | (cm << 3) | op2;
561a72d4
TC
4178 if (flags)
4179 *flags = 0;
a06ea964
NC
4180 }
4181 }
4182 else
49eec193 4183 {
72ca8fad
MW
4184 if (pstatefield_p && !aarch64_pstatefield_supported_p (cpu_variant, o))
4185 as_bad (_("selected processor does not support PSTATE field "
4186 "name '%s'"), buf);
f7cb161e 4187 if (!pstatefield_p
38cf07a6
AC
4188 && !aarch64_sys_ins_reg_supported_p (cpu_variant, o->name,
4189 o->value, o->flags, o->features))
72ca8fad
MW
4190 as_bad (_("selected processor does not support system register "
4191 "name '%s'"), buf);
f7cb161e 4192 if (aarch64_sys_reg_deprecated_p (o->flags))
49eec193 4193 as_warn (_("system register name '%s' is deprecated and may be "
72ca8fad 4194 "removed in a future release"), buf);
49eec193 4195 value = o->value;
561a72d4
TC
4196 if (flags)
4197 *flags = o->flags;
49eec193 4198 }
a06ea964
NC
4199
4200 *str = q;
4201 return value;
4202}
4203
4204/* Parse a system reg for ic/dc/at/tlbi instructions. Returns the table entry
4205 for the option, or NULL. */
4206
4207static const aarch64_sys_ins_reg *
629310ab 4208parse_sys_ins_reg (char **str, htab_t sys_ins_regs)
a06ea964
NC
4209{
4210 char *p, *q;
fa63795f 4211 char buf[AARCH64_MAX_SYSREG_NAME_LEN];
a06ea964
NC
4212 const aarch64_sys_ins_reg *o;
4213
4214 p = buf;
4215 for (q = *str; ISALNUM (*q) || *q == '_'; q++)
fa63795f 4216 if (p < buf + (sizeof (buf) - 1))
a06ea964
NC
4217 *p++ = TOLOWER (*q);
4218 *p = '\0';
4219
fa63795f
AC
4220 /* If the name is longer than AARCH64_MAX_SYSREG_NAME_LEN then it cannot be a
4221 valid system register. This is enforced by construction of the hash
4222 table. */
4223 if (p - buf != q - *str)
4224 return NULL;
4225
629310ab 4226 o = str_hash_find (sys_ins_regs, buf);
a06ea964
NC
4227 if (!o)
4228 return NULL;
4229
38cf07a6
AC
4230 if (!aarch64_sys_ins_reg_supported_p (cpu_variant,
4231 o->name, o->value, o->flags, 0))
d6bf7ce6
MW
4232 as_bad (_("selected processor does not support system register "
4233 "name '%s'"), buf);
f7cb161e
PW
4234 if (aarch64_sys_reg_deprecated_p (o->flags))
4235 as_warn (_("system register name '%s' is deprecated and may be "
4236 "removed in a future release"), buf);
d6bf7ce6 4237
a06ea964
NC
4238 *str = q;
4239 return o;
4240}
4241\f
4242#define po_char_or_fail(chr) do { \
4243 if (! skip_past_char (&str, chr)) \
4244 goto failure; \
4245} while (0)
4246
4247#define po_reg_or_fail(regtype) do { \
4248 val = aarch64_reg_parse (&str, regtype, &rtype, NULL); \
4249 if (val == PARSE_FAIL) \
4250 { \
4251 set_default_error (); \
4252 goto failure; \
4253 } \
4254 } while (0)
4255
e1b988bb
RS
4256#define po_int_reg_or_fail(reg_type) do { \
4257 reg = aarch64_reg_parse_32_64 (&str, &qualifier); \
4258 if (!reg || !aarch64_check_reg_type (reg, reg_type)) \
a06ea964
NC
4259 { \
4260 set_default_error (); \
4261 goto failure; \
4262 } \
e1b988bb
RS
4263 info->reg.regno = reg->number; \
4264 info->qualifier = qualifier; \
a06ea964
NC
4265 } while (0)
4266
4267#define po_imm_nc_or_fail() do { \
1799c0d0 4268 if (! parse_constant_immediate (&str, &val, imm_reg_type)) \
a06ea964
NC
4269 goto failure; \
4270 } while (0)
4271
4272#define po_imm_or_fail(min, max) do { \
1799c0d0 4273 if (! parse_constant_immediate (&str, &val, imm_reg_type)) \
a06ea964
NC
4274 goto failure; \
4275 if (val < min || val > max) \
4276 { \
4277 set_fatal_syntax_error (_("immediate value out of range "\
4278#min " to "#max)); \
4279 goto failure; \
4280 } \
4281 } while (0)
4282
245d2e3f
RS
4283#define po_enum_or_fail(array) do { \
4284 if (!parse_enum_string (&str, &val, array, \
4285 ARRAY_SIZE (array), imm_reg_type)) \
4286 goto failure; \
4287 } while (0)
4288
a06ea964
NC
4289#define po_misc_or_fail(expr) do { \
4290 if (!expr) \
4291 goto failure; \
4292 } while (0)
4293\f
4294/* encode the 12-bit imm field of Add/sub immediate */
4295static inline uint32_t
4296encode_addsub_imm (uint32_t imm)
4297{
4298 return imm << 10;
4299}
4300
4301/* encode the shift amount field of Add/sub immediate */
4302static inline uint32_t
4303encode_addsub_imm_shift_amount (uint32_t cnt)
4304{
4305 return cnt << 22;
4306}
4307
4308
4309/* encode the imm field of Adr instruction */
4310static inline uint32_t
4311encode_adr_imm (uint32_t imm)
4312{
4313 return (((imm & 0x3) << 29) /* [1:0] -> [30:29] */
4314 | ((imm & (0x7ffff << 2)) << 3)); /* [20:2] -> [23:5] */
4315}
4316
4317/* encode the immediate field of Move wide immediate */
4318static inline uint32_t
4319encode_movw_imm (uint32_t imm)
4320{
4321 return imm << 5;
4322}
4323
4324/* encode the 26-bit offset of unconditional branch */
4325static inline uint32_t
4326encode_branch_ofs_26 (uint32_t ofs)
4327{
4328 return ofs & ((1 << 26) - 1);
4329}
4330
4331/* encode the 19-bit offset of conditional branch and compare & branch */
4332static inline uint32_t
4333encode_cond_branch_ofs_19 (uint32_t ofs)
4334{
4335 return (ofs & ((1 << 19) - 1)) << 5;
4336}
4337
4338/* encode the 19-bit offset of ld literal */
4339static inline uint32_t
4340encode_ld_lit_ofs_19 (uint32_t ofs)
4341{
4342 return (ofs & ((1 << 19) - 1)) << 5;
4343}
4344
4345/* Encode the 14-bit offset of test & branch. */
4346static inline uint32_t
4347encode_tst_branch_ofs_14 (uint32_t ofs)
4348{
4349 return (ofs & ((1 << 14) - 1)) << 5;
4350}
4351
4352/* Encode the 16-bit imm field of svc/hvc/smc. */
4353static inline uint32_t
4354encode_svc_imm (uint32_t imm)
4355{
4356 return imm << 5;
4357}
4358
4359/* Reencode add(s) to sub(s), or sub(s) to add(s). */
4360static inline uint32_t
4361reencode_addsub_switch_add_sub (uint32_t opcode)
4362{
4363 return opcode ^ (1 << 30);
4364}
4365
4366static inline uint32_t
4367reencode_movzn_to_movz (uint32_t opcode)
4368{
4369 return opcode | (1 << 30);
4370}
4371
4372static inline uint32_t
4373reencode_movzn_to_movn (uint32_t opcode)
4374{
4375 return opcode & ~(1 << 30);
4376}
4377
4378/* Overall per-instruction processing. */
4379
4380/* We need to be able to fix up arbitrary expressions in some statements.
4381 This is so that we can handle symbols that are an arbitrary distance from
4382 the pc. The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
4383 which returns part of an address in a form which will be valid for
4384 a data instruction. We do this by pushing the expression into a symbol
4385 in the expr_section, and creating a fix for that. */
4386
4387static fixS *
4388fix_new_aarch64 (fragS * frag,
4389 int where,
f7cb161e
PW
4390 short int size,
4391 expressionS * exp,
4392 int pc_rel,
4393 int reloc)
a06ea964
NC
4394{
4395 fixS *new_fix;
4396
4397 switch (exp->X_op)
4398 {
4399 case O_constant:
4400 case O_symbol:
4401 case O_add:
4402 case O_subtract:
4403 new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc);
4404 break;
4405
4406 default:
4407 new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0,
4408 pc_rel, reloc);
4409 break;
4410 }
4411 return new_fix;
4412}
4413\f
4414/* Diagnostics on operands errors. */
4415
a52e6fd3
YZ
4416/* By default, output verbose error message.
4417 Disable the verbose error message by -mno-verbose-error. */
4418static int verbose_error_p = 1;
a06ea964
NC
4419
4420#ifdef DEBUG_AARCH64
4421/* N.B. this is only for the purpose of debugging. */
4422const char* operand_mismatch_kind_names[] =
4423{
4424 "AARCH64_OPDE_NIL",
4425 "AARCH64_OPDE_RECOVERABLE",
4426 "AARCH64_OPDE_SYNTAX_ERROR",
4427 "AARCH64_OPDE_FATAL_SYNTAX_ERROR",
4428 "AARCH64_OPDE_INVALID_VARIANT",
4429 "AARCH64_OPDE_OUT_OF_RANGE",
4430 "AARCH64_OPDE_UNALIGNED",
4431 "AARCH64_OPDE_REG_LIST",
4432 "AARCH64_OPDE_OTHER_ERROR",
4433};
4434#endif /* DEBUG_AARCH64 */
4435
4436/* Return TRUE if LHS is of higher severity than RHS, otherwise return FALSE.
4437
4438 When multiple errors of different kinds are found in the same assembly
4439 line, only the error of the highest severity will be picked up for
4440 issuing the diagnostics. */
4441
4442static inline bfd_boolean
4443operand_error_higher_severity_p (enum aarch64_operand_error_kind lhs,
4444 enum aarch64_operand_error_kind rhs)
4445{
4446 gas_assert (AARCH64_OPDE_RECOVERABLE > AARCH64_OPDE_NIL);
4447 gas_assert (AARCH64_OPDE_SYNTAX_ERROR > AARCH64_OPDE_RECOVERABLE);
4448 gas_assert (AARCH64_OPDE_FATAL_SYNTAX_ERROR > AARCH64_OPDE_SYNTAX_ERROR);
4449 gas_assert (AARCH64_OPDE_INVALID_VARIANT > AARCH64_OPDE_FATAL_SYNTAX_ERROR);
4450 gas_assert (AARCH64_OPDE_OUT_OF_RANGE > AARCH64_OPDE_INVALID_VARIANT);
4451 gas_assert (AARCH64_OPDE_UNALIGNED > AARCH64_OPDE_OUT_OF_RANGE);
4452 gas_assert (AARCH64_OPDE_REG_LIST > AARCH64_OPDE_UNALIGNED);
4453 gas_assert (AARCH64_OPDE_OTHER_ERROR > AARCH64_OPDE_REG_LIST);
4454 return lhs > rhs;
4455}
4456
4457/* Helper routine to get the mnemonic name from the assembly instruction
4458 line; should only be called for the diagnosis purpose, as there is
4459 string copy operation involved, which may affect the runtime
4460 performance if used in elsewhere. */
4461
4462static const char*
4463get_mnemonic_name (const char *str)
4464{
4465 static char mnemonic[32];
4466 char *ptr;
4467
4468 /* Get the first 15 bytes and assume that the full name is included. */
4469 strncpy (mnemonic, str, 31);
4470 mnemonic[31] = '\0';
4471
4472 /* Scan up to the end of the mnemonic, which must end in white space,
4473 '.', or end of string. */
4474 for (ptr = mnemonic; is_part_of_name(*ptr); ++ptr)
4475 ;
4476
4477 *ptr = '\0';
4478
4479 /* Append '...' to the truncated long name. */
4480 if (ptr - mnemonic == 31)
4481 mnemonic[28] = mnemonic[29] = mnemonic[30] = '.';
4482
4483 return mnemonic;
4484}
4485
4486static void
4487reset_aarch64_instruction (aarch64_instruction *instruction)
4488{
4489 memset (instruction, '\0', sizeof (aarch64_instruction));
4490 instruction->reloc.type = BFD_RELOC_UNUSED;
4491}
4492
33eaf5de 4493/* Data structures storing one user error in the assembly code related to
a06ea964
NC
4494 operands. */
4495
4496struct operand_error_record
4497{
4498 const aarch64_opcode *opcode;
4499 aarch64_operand_error detail;
4500 struct operand_error_record *next;
4501};
4502
4503typedef struct operand_error_record operand_error_record;
4504
4505struct operand_errors
4506{
4507 operand_error_record *head;
4508 operand_error_record *tail;
4509};
4510
4511typedef struct operand_errors operand_errors;
4512
4513/* Top-level data structure reporting user errors for the current line of
4514 the assembly code.
4515 The way md_assemble works is that all opcodes sharing the same mnemonic
4516 name are iterated to find a match to the assembly line. In this data
4517 structure, each of the such opcodes will have one operand_error_record
4518 allocated and inserted. In other words, excessive errors related with
4519 a single opcode are disregarded. */
4520operand_errors operand_error_report;
4521
4522/* Free record nodes. */
4523static operand_error_record *free_opnd_error_record_nodes = NULL;
4524
4525/* Initialize the data structure that stores the operand mismatch
4526 information on assembling one line of the assembly code. */
4527static void
4528init_operand_error_report (void)
4529{
4530 if (operand_error_report.head != NULL)
4531 {
4532 gas_assert (operand_error_report.tail != NULL);
4533 operand_error_report.tail->next = free_opnd_error_record_nodes;
4534 free_opnd_error_record_nodes = operand_error_report.head;
4535 operand_error_report.head = NULL;
4536 operand_error_report.tail = NULL;
4537 return;
4538 }
4539 gas_assert (operand_error_report.tail == NULL);
4540}
4541
4542/* Return TRUE if some operand error has been recorded during the
4543 parsing of the current assembly line using the opcode *OPCODE;
4544 otherwise return FALSE. */
4545static inline bfd_boolean
4546opcode_has_operand_error_p (const aarch64_opcode *opcode)
4547{
4548 operand_error_record *record = operand_error_report.head;
4549 return record && record->opcode == opcode;
4550}
4551
4552/* Add the error record *NEW_RECORD to operand_error_report. The record's
4553 OPCODE field is initialized with OPCODE.
4554 N.B. only one record for each opcode, i.e. the maximum of one error is
4555 recorded for each instruction template. */
4556
4557static void
4558add_operand_error_record (const operand_error_record* new_record)
4559{
4560 const aarch64_opcode *opcode = new_record->opcode;
4561 operand_error_record* record = operand_error_report.head;
4562
4563 /* The record may have been created for this opcode. If not, we need
4564 to prepare one. */
4565 if (! opcode_has_operand_error_p (opcode))
4566 {
4567 /* Get one empty record. */
4568 if (free_opnd_error_record_nodes == NULL)
4569 {
325801bd 4570 record = XNEW (operand_error_record);
a06ea964
NC
4571 }
4572 else
4573 {
4574 record = free_opnd_error_record_nodes;
4575 free_opnd_error_record_nodes = record->next;
4576 }
4577 record->opcode = opcode;
4578 /* Insert at the head. */
4579 record->next = operand_error_report.head;
4580 operand_error_report.head = record;
4581 if (operand_error_report.tail == NULL)
4582 operand_error_report.tail = record;
4583 }
4584 else if (record->detail.kind != AARCH64_OPDE_NIL
4585 && record->detail.index <= new_record->detail.index
4586 && operand_error_higher_severity_p (record->detail.kind,
4587 new_record->detail.kind))
4588 {
4589 /* In the case of multiple errors found on operands related with a
4590 single opcode, only record the error of the leftmost operand and
4591 only if the error is of higher severity. */
4592 DEBUG_TRACE ("error %s on operand %d not added to the report due to"
4593 " the existing error %s on operand %d",
4594 operand_mismatch_kind_names[new_record->detail.kind],
4595 new_record->detail.index,
4596 operand_mismatch_kind_names[record->detail.kind],
4597 record->detail.index);
4598 return;
4599 }
4600
4601 record->detail = new_record->detail;
4602}
4603
4604static inline void
4605record_operand_error_info (const aarch64_opcode *opcode,
4606 aarch64_operand_error *error_info)
4607{
4608 operand_error_record record;
4609 record.opcode = opcode;
4610 record.detail = *error_info;
4611 add_operand_error_record (&record);
4612}
4613
4614/* Record an error of kind KIND and, if ERROR is not NULL, of the detailed
4615 error message *ERROR, for operand IDX (count from 0). */
4616
4617static void
4618record_operand_error (const aarch64_opcode *opcode, int idx,
4619 enum aarch64_operand_error_kind kind,
4620 const char* error)
4621{
4622 aarch64_operand_error info;
4623 memset(&info, 0, sizeof (info));
4624 info.index = idx;
4625 info.kind = kind;
4626 info.error = error;
2a9b2c1a 4627 info.non_fatal = FALSE;
a06ea964
NC
4628 record_operand_error_info (opcode, &info);
4629}
4630
4631static void
4632record_operand_error_with_data (const aarch64_opcode *opcode, int idx,
4633 enum aarch64_operand_error_kind kind,
4634 const char* error, const int *extra_data)
4635{
4636 aarch64_operand_error info;
4637 info.index = idx;
4638 info.kind = kind;
4639 info.error = error;
4640 info.data[0] = extra_data[0];
4641 info.data[1] = extra_data[1];
4642 info.data[2] = extra_data[2];
2a9b2c1a 4643 info.non_fatal = FALSE;
a06ea964
NC
4644 record_operand_error_info (opcode, &info);
4645}
4646
4647static void
4648record_operand_out_of_range_error (const aarch64_opcode *opcode, int idx,
4649 const char* error, int lower_bound,
4650 int upper_bound)
4651{
4652 int data[3] = {lower_bound, upper_bound, 0};
4653 record_operand_error_with_data (opcode, idx, AARCH64_OPDE_OUT_OF_RANGE,
4654 error, data);
4655}
4656
4657/* Remove the operand error record for *OPCODE. */
4658static void ATTRIBUTE_UNUSED
4659remove_operand_error_record (const aarch64_opcode *opcode)
4660{
4661 if (opcode_has_operand_error_p (opcode))
4662 {
4663 operand_error_record* record = operand_error_report.head;
4664 gas_assert (record != NULL && operand_error_report.tail != NULL);
4665 operand_error_report.head = record->next;
4666 record->next = free_opnd_error_record_nodes;
4667 free_opnd_error_record_nodes = record;
4668 if (operand_error_report.head == NULL)
4669 {
4670 gas_assert (operand_error_report.tail == record);
4671 operand_error_report.tail = NULL;
4672 }
4673 }
4674}
4675
4676/* Given the instruction in *INSTR, return the index of the best matched
4677 qualifier sequence in the list (an array) headed by QUALIFIERS_LIST.
4678
4679 Return -1 if there is no qualifier sequence; return the first match
4680 if there is multiple matches found. */
4681
4682static int
4683find_best_match (const aarch64_inst *instr,
4684 const aarch64_opnd_qualifier_seq_t *qualifiers_list)
4685{
4686 int i, num_opnds, max_num_matched, idx;
4687
4688 num_opnds = aarch64_num_of_operands (instr->opcode);
4689 if (num_opnds == 0)
4690 {
4691 DEBUG_TRACE ("no operand");
4692 return -1;
4693 }
4694
4695 max_num_matched = 0;
4989adac 4696 idx = 0;
a06ea964
NC
4697
4698 /* For each pattern. */
4699 for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i, ++qualifiers_list)
4700 {
4701 int j, num_matched;
4702 const aarch64_opnd_qualifier_t *qualifiers = *qualifiers_list;
4703
4704 /* Most opcodes has much fewer patterns in the list. */
535b785f 4705 if (empty_qualifier_sequence_p (qualifiers))
a06ea964
NC
4706 {
4707 DEBUG_TRACE_IF (i == 0, "empty list of qualifier sequence");
a06ea964
NC
4708 break;
4709 }
4710
4711 for (j = 0, num_matched = 0; j < num_opnds; ++j, ++qualifiers)
4712 if (*qualifiers == instr->operands[j].qualifier)
4713 ++num_matched;
4714
4715 if (num_matched > max_num_matched)
4716 {
4717 max_num_matched = num_matched;
4718 idx = i;
4719 }
4720 }
4721
4722 DEBUG_TRACE ("return with %d", idx);
4723 return idx;
4724}
4725
33eaf5de 4726/* Assign qualifiers in the qualifier sequence (headed by QUALIFIERS) to the
a06ea964
NC
4727 corresponding operands in *INSTR. */
4728
4729static inline void
4730assign_qualifier_sequence (aarch64_inst *instr,
4731 const aarch64_opnd_qualifier_t *qualifiers)
4732{
4733 int i = 0;
4734 int num_opnds = aarch64_num_of_operands (instr->opcode);
4735 gas_assert (num_opnds);
4736 for (i = 0; i < num_opnds; ++i, ++qualifiers)
4737 instr->operands[i].qualifier = *qualifiers;
4738}
4739
4740/* Print operands for the diagnosis purpose. */
4741
4742static void
4743print_operands (char *buf, const aarch64_opcode *opcode,
4744 const aarch64_opnd_info *opnds)
4745{
4746 int i;
4747
4748 for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
4749 {
08d3b0cc 4750 char str[128];
a06ea964
NC
4751
4752 /* We regard the opcode operand info more, however we also look into
4753 the inst->operands to support the disassembling of the optional
4754 operand.
4755 The two operand code should be the same in all cases, apart from
4756 when the operand can be optional. */
4757 if (opcode->operands[i] == AARCH64_OPND_NIL
4758 || opnds[i].type == AARCH64_OPND_NIL)
4759 break;
4760
4761 /* Generate the operand string in STR. */
7d02540a 4762 aarch64_print_operand (str, sizeof (str), 0, opcode, opnds, i, NULL, NULL,
38cf07a6 4763 NULL, cpu_variant);
a06ea964
NC
4764
4765 /* Delimiter. */
4766 if (str[0] != '\0')
ad43e107 4767 strcat (buf, i == 0 ? " " : ", ");
a06ea964
NC
4768
4769 /* Append the operand string. */
4770 strcat (buf, str);
4771 }
4772}
4773
4774/* Send to stderr a string as information. */
4775
4776static void
4777output_info (const char *format, ...)
4778{
3b4dbbbf 4779 const char *file;
a06ea964
NC
4780 unsigned int line;
4781 va_list args;
4782
3b4dbbbf 4783 file = as_where (&line);
a06ea964
NC
4784 if (file)
4785 {
4786 if (line != 0)
4787 fprintf (stderr, "%s:%u: ", file, line);
4788 else
4789 fprintf (stderr, "%s: ", file);
4790 }
4791 fprintf (stderr, _("Info: "));
4792 va_start (args, format);
4793 vfprintf (stderr, format, args);
4794 va_end (args);
4795 (void) putc ('\n', stderr);
4796}
4797
4798/* Output one operand error record. */
4799
4800static void
4801output_operand_error_record (const operand_error_record *record, char *str)
4802{
28f013d5
JB
4803 const aarch64_operand_error *detail = &record->detail;
4804 int idx = detail->index;
a06ea964 4805 const aarch64_opcode *opcode = record->opcode;
28f013d5 4806 enum aarch64_opnd opd_code = (idx >= 0 ? opcode->operands[idx]
a06ea964 4807 : AARCH64_OPND_NIL);
a06ea964 4808
7d02540a
TC
4809 typedef void (*handler_t)(const char *format, ...);
4810 handler_t handler = detail->non_fatal ? as_warn : as_bad;
4811
a06ea964
NC
4812 switch (detail->kind)
4813 {
4814 case AARCH64_OPDE_NIL:
4815 gas_assert (0);
4816 break;
a06ea964
NC
4817 case AARCH64_OPDE_SYNTAX_ERROR:
4818 case AARCH64_OPDE_RECOVERABLE:
4819 case AARCH64_OPDE_FATAL_SYNTAX_ERROR:
4820 case AARCH64_OPDE_OTHER_ERROR:
a06ea964
NC
4821 /* Use the prepared error message if there is, otherwise use the
4822 operand description string to describe the error. */
4823 if (detail->error != NULL)
4824 {
28f013d5 4825 if (idx < 0)
7d02540a 4826 handler (_("%s -- `%s'"), detail->error, str);
a06ea964 4827 else
7d02540a
TC
4828 handler (_("%s at operand %d -- `%s'"),
4829 detail->error, idx + 1, str);
a06ea964
NC
4830 }
4831 else
28f013d5
JB
4832 {
4833 gas_assert (idx >= 0);
7d02540a
TC
4834 handler (_("operand %d must be %s -- `%s'"), idx + 1,
4835 aarch64_get_operand_desc (opd_code), str);
28f013d5 4836 }
a06ea964
NC
4837 break;
4838
4839 case AARCH64_OPDE_INVALID_VARIANT:
7d02540a 4840 handler (_("operand mismatch -- `%s'"), str);
a06ea964
NC
4841 if (verbose_error_p)
4842 {
4843 /* We will try to correct the erroneous instruction and also provide
4844 more information e.g. all other valid variants.
4845
4846 The string representation of the corrected instruction and other
4847 valid variants are generated by
4848
4849 1) obtaining the intermediate representation of the erroneous
4850 instruction;
4851 2) manipulating the IR, e.g. replacing the operand qualifier;
4852 3) printing out the instruction by calling the printer functions
4853 shared with the disassembler.
4854
4855 The limitation of this method is that the exact input assembly
4856 line cannot be accurately reproduced in some cases, for example an
4857 optional operand present in the actual assembly line will be
4858 omitted in the output; likewise for the optional syntax rules,
4859 e.g. the # before the immediate. Another limitation is that the
4860 assembly symbols and relocation operations in the assembly line
4861 currently cannot be printed out in the error report. Last but not
4862 least, when there is other error(s) co-exist with this error, the
4863 'corrected' instruction may be still incorrect, e.g. given
4864 'ldnp h0,h1,[x0,#6]!'
4865 this diagnosis will provide the version:
4866 'ldnp s0,s1,[x0,#6]!'
4867 which is still not right. */
4868 size_t len = strlen (get_mnemonic_name (str));
4869 int i, qlf_idx;
4870 bfd_boolean result;
08d3b0cc 4871 char buf[2048];
a06ea964
NC
4872 aarch64_inst *inst_base = &inst.base;
4873 const aarch64_opnd_qualifier_seq_t *qualifiers_list;
4874
4875 /* Init inst. */
4876 reset_aarch64_instruction (&inst);
4877 inst_base->opcode = opcode;
4878
4879 /* Reset the error report so that there is no side effect on the
4880 following operand parsing. */
4881 init_operand_error_report ();
4882
4883 /* Fill inst. */
4884 result = parse_operands (str + len, opcode)
4885 && programmer_friendly_fixup (&inst);
4886 gas_assert (result);
3979cf50
SP
4887 result = aarch64_opcode_encode (cpu_variant, opcode, inst_base,
4888 &inst_base->value, NULL, NULL,
4889 insn_sequence);
a06ea964
NC
4890 gas_assert (!result);
4891
4892 /* Find the most matched qualifier sequence. */
4893 qlf_idx = find_best_match (inst_base, opcode->qualifiers_list);
4894 gas_assert (qlf_idx > -1);
4895
4896 /* Assign the qualifiers. */
4897 assign_qualifier_sequence (inst_base,
4898 opcode->qualifiers_list[qlf_idx]);
4899
4900 /* Print the hint. */
4901 output_info (_(" did you mean this?"));
08d3b0cc 4902 snprintf (buf, sizeof (buf), "\t%s", get_mnemonic_name (str));
a06ea964
NC
4903 print_operands (buf, opcode, inst_base->operands);
4904 output_info (_(" %s"), buf);
4905
4906 /* Print out other variant(s) if there is any. */
4907 if (qlf_idx != 0 ||
4908 !empty_qualifier_sequence_p (opcode->qualifiers_list[1]))
4909 output_info (_(" other valid variant(s):"));
4910
4911 /* For each pattern. */
4912 qualifiers_list = opcode->qualifiers_list;
4913 for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i, ++qualifiers_list)
4914 {
4915 /* Most opcodes has much fewer patterns in the list.
4916 First NIL qualifier indicates the end in the list. */
535b785f 4917 if (empty_qualifier_sequence_p (*qualifiers_list))
a06ea964
NC
4918 break;
4919
4920 if (i != qlf_idx)
4921 {
4922 /* Mnemonics name. */
08d3b0cc 4923 snprintf (buf, sizeof (buf), "\t%s", get_mnemonic_name (str));
a06ea964
NC
4924
4925 /* Assign the qualifiers. */
4926 assign_qualifier_sequence (inst_base, *qualifiers_list);
4927
4928 /* Print instruction. */
4929 print_operands (buf, opcode, inst_base->operands);
4930
4931 output_info (_(" %s"), buf);
4932 }
4933 }
4934 }
4935 break;
4936
0c608d6b 4937 case AARCH64_OPDE_UNTIED_OPERAND:
7d02540a
TC
4938 handler (_("operand %d must be the same register as operand 1 -- `%s'"),
4939 detail->index + 1, str);
0c608d6b
RS
4940 break;
4941
a06ea964 4942 case AARCH64_OPDE_OUT_OF_RANGE:
f5555712 4943 if (detail->data[0] != detail->data[1])
7d02540a
TC
4944 handler (_("%s out of range %d to %d at operand %d -- `%s'"),
4945 detail->error ? detail->error : _("immediate value"),
4946 detail->data[0], detail->data[1], idx + 1, str);
f5555712 4947 else
7d02540a
TC
4948 handler (_("%s must be %d at operand %d -- `%s'"),
4949 detail->error ? detail->error : _("immediate value"),
4950 detail->data[0], idx + 1, str);
a06ea964
NC
4951 break;
4952
4953 case AARCH64_OPDE_REG_LIST:
4954 if (detail->data[0] == 1)
7d02540a
TC
4955 handler (_("invalid number of registers in the list; "
4956 "only 1 register is expected at operand %d -- `%s'"),
4957 idx + 1, str);
a06ea964 4958 else
7d02540a
TC
4959 handler (_("invalid number of registers in the list; "
4960 "%d registers are expected at operand %d -- `%s'"),
4961 detail->data[0], idx + 1, str);
a06ea964
NC
4962 break;
4963
4964 case AARCH64_OPDE_UNALIGNED:
7d02540a
TC
4965 handler (_("immediate value must be a multiple of "
4966 "%d at operand %d -- `%s'"),
4967 detail->data[0], idx + 1, str);
a06ea964
NC
4968 break;
4969
4970 default:
4971 gas_assert (0);
4972 break;
4973 }
4974}
4975
4976/* Process and output the error message about the operand mismatching.
4977
4978 When this function is called, the operand error information had
4979 been collected for an assembly line and there will be multiple
33eaf5de 4980 errors in the case of multiple instruction templates; output the
7d02540a
TC
4981 error message that most closely describes the problem.
4982
4983 The errors to be printed can be filtered on printing all errors
4984 or only non-fatal errors. This distinction has to be made because
4985 the error buffer may already be filled with fatal errors we don't want to
4986 print due to the different instruction templates. */
a06ea964
NC
4987
4988static void
7d02540a 4989output_operand_error_report (char *str, bfd_boolean non_fatal_only)
a06ea964 4990{
261dde89
SP
4991 int largest_error_pos, largest_error_pos2;
4992 const char *msg = NULL, *msg2 = NULL;
a06ea964
NC
4993 enum aarch64_operand_error_kind kind;
4994 operand_error_record *curr;
4995 operand_error_record *head = operand_error_report.head;
261dde89 4996 operand_error_record *record = NULL, *record2 = NULL;
a06ea964
NC
4997
4998 /* No error to report. */
4999 if (head == NULL)
5000 return;
5001
5002 gas_assert (head != NULL && operand_error_report.tail != NULL);
5003
5004 /* Only one error. */
5005 if (head == operand_error_report.tail)
5006 {
7d02540a
TC
5007 /* If the only error is a non-fatal one and we don't want to print it,
5008 just exit. */
5009 if (!non_fatal_only || head->detail.non_fatal)
5010 {
5011 DEBUG_TRACE ("single opcode entry with error kind: %s",
5012 operand_mismatch_kind_names[head->detail.kind]);
5013 output_operand_error_record (head, str);
5014 }
a06ea964
NC
5015 return;
5016 }
5017
5018 /* Find the error kind of the highest severity. */
33eaf5de 5019 DEBUG_TRACE ("multiple opcode entries with error kind");
a06ea964
NC
5020 kind = AARCH64_OPDE_NIL;
5021 for (curr = head; curr != NULL; curr = curr->next)
5022 {
5023 gas_assert (curr->detail.kind != AARCH64_OPDE_NIL);
5024 DEBUG_TRACE ("\t%s", operand_mismatch_kind_names[curr->detail.kind]);
a68f4cd2
TC
5025 if (operand_error_higher_severity_p (curr->detail.kind, kind)
5026 && (!non_fatal_only || (non_fatal_only && curr->detail.non_fatal)))
a06ea964
NC
5027 kind = curr->detail.kind;
5028 }
a68f4cd2
TC
5029
5030 gas_assert (kind != AARCH64_OPDE_NIL || non_fatal_only);
a06ea964
NC
5031
5032 /* Pick up one of errors of KIND to report. */
5033 largest_error_pos = -2; /* Index can be -1 which means unknown index. */
261dde89 5034 largest_error_pos2 = -2; /* Index can be -1 which means unknown index. */
a06ea964
NC
5035 for (curr = head; curr != NULL; curr = curr->next)
5036 {
7d02540a
TC
5037 /* If we don't want to print non-fatal errors then don't consider them
5038 at all. */
5039 if (curr->detail.kind != kind
af81c43b 5040 || (non_fatal_only && !curr->detail.non_fatal))
a06ea964
NC
5041 continue;
5042 /* If there are multiple errors, pick up the one with the highest
5043 mismatching operand index. In the case of multiple errors with
5044 the equally highest operand index, pick up the first one or the
5045 first one with non-NULL error message. */
261dde89 5046 if (AARCH64_CPU_HAS_FEATURE (cpu_variant, *curr->opcode->avariant))
a06ea964 5047 {
261dde89
SP
5048 if (curr->detail.index > largest_error_pos
5049 || (curr->detail.index == largest_error_pos && msg == NULL
5050 && curr->detail.error != NULL))
5051 {
5052 largest_error_pos = curr->detail.index;
5053 record = curr;
5054 msg = record->detail.error;
5055 }
5056 }
5057 else
5058 {
5059 if (curr->detail.index > largest_error_pos2
5060 || (curr->detail.index == largest_error_pos2 && msg2 == NULL
5061 && curr->detail.error != NULL))
5062 {
5063 largest_error_pos2 = curr->detail.index;
5064 record2 = curr;
5065 msg2 = record2->detail.error;
5066 }
a06ea964
NC
5067 }
5068 }
5069
261dde89
SP
5070 /* No errors in enabled cpu feature variants, look for errors in the disabled
5071 ones. XXX we should do this segregation when prioritizing too. */
5072 if (!record)
5073 {
5074 largest_error_pos = largest_error_pos2;
5075 record = record2;
5076 msg = msg2;
5077 }
5078
7d02540a
TC
5079 /* The way errors are collected in the back-end is a bit non-intuitive. But
5080 essentially, because each operand template is tried recursively you may
5081 always have errors collected from the previous tried OPND. These are
5082 usually skipped if there is one successful match. However now with the
5083 non-fatal errors we have to ignore those previously collected hard errors
5084 when we're only interested in printing the non-fatal ones. This condition
5085 prevents us from printing errors that are not appropriate, since we did
5086 match a condition, but it also has warnings that it wants to print. */
5087 if (non_fatal_only && !record)
5088 return;
5089
a06ea964
NC
5090 gas_assert (largest_error_pos != -2 && record != NULL);
5091 DEBUG_TRACE ("Pick up error kind %s to report",
5092 operand_mismatch_kind_names[record->detail.kind]);
5093
5094 /* Output. */
5095 output_operand_error_record (record, str);
5096}
5097\f
5098/* Write an AARCH64 instruction to buf - always little-endian. */
5099static void
5100put_aarch64_insn (char *buf, uint32_t insn)
5101{
5102 unsigned char *where = (unsigned char *) buf;
5103 where[0] = insn;
5104 where[1] = insn >> 8;
5105 where[2] = insn >> 16;
5106 where[3] = insn >> 24;
5107}
5108
5109static uint32_t
5110get_aarch64_insn (char *buf)
5111{
5112 unsigned char *where = (unsigned char *) buf;
5113 uint32_t result;
4f7cc141
AM
5114 result = ((where[0] | (where[1] << 8) | (where[2] << 16)
5115 | ((uint32_t) where[3] << 24)));
a06ea964
NC
5116 return result;
5117}
5118
5119static void
5120output_inst (struct aarch64_inst *new_inst)
5121{
5122 char *to = NULL;
5123
5124 to = frag_more (INSN_SIZE);
5125
5126 frag_now->tc_frag_data.recorded = 1;
5127
5128 put_aarch64_insn (to, inst.base.value);
5129
5130 if (inst.reloc.type != BFD_RELOC_UNUSED)
5131 {
5132 fixS *fixp = fix_new_aarch64 (frag_now, to - frag_now->fr_literal,
5133 INSN_SIZE, &inst.reloc.exp,
5134 inst.reloc.pc_rel,
5135 inst.reloc.type);
5136 DEBUG_TRACE ("Prepared relocation fix up");
5137 /* Don't check the addend value against the instruction size,
5138 that's the job of our code in md_apply_fix(). */
5139 fixp->fx_no_overflow = 1;
5140 if (new_inst != NULL)
5141 fixp->tc_fix_data.inst = new_inst;
5142 if (aarch64_gas_internal_fixup_p ())
5143 {
5144 gas_assert (inst.reloc.opnd != AARCH64_OPND_NIL);
5145 fixp->tc_fix_data.opnd = inst.reloc.opnd;
5146 fixp->fx_addnumber = inst.reloc.flags;
5147 }
f0070c1e
SP
5148 if (inst.reloc.flags & FIXUP_F_C64)
5149 fixp->tc_fix_data.c64 = TRUE;
a06ea964
NC
5150 }
5151
5152 dwarf2_emit_insn (INSN_SIZE);
5153}
5154
5155/* Link together opcodes of the same name. */
5156
5157struct templates
5158{
5159 aarch64_opcode *opcode;
5160 struct templates *next;
5161};
5162
5163typedef struct templates templates;
5164
5165static templates *
5166lookup_mnemonic (const char *start, int len)
5167{
5168 templates *templ = NULL;
5169
629310ab 5170 templ = str_hash_find_n (aarch64_ops_hsh, start, len);
a06ea964
NC
5171 return templ;
5172}
5173
5174/* Subroutine of md_assemble, responsible for looking up the primary
5175 opcode from the mnemonic the user wrote. STR points to the
5176 beginning of the mnemonic. */
5177
5178static templates *
5179opcode_lookup (char **str)
5180{
bb7eff52 5181 char *end, *base, *dot;
a06ea964
NC
5182 const aarch64_cond *cond;
5183 char condname[16];
5184 int len;
5185
5186 /* Scan up to the end of the mnemonic, which must end in white space,
5187 '.', or end of string. */
bb7eff52 5188 dot = 0;
a06ea964 5189 for (base = end = *str; is_part_of_name(*end); end++)
bb7eff52
RS
5190 if (*end == '.' && !dot)
5191 dot = end;
a06ea964 5192
bb7eff52 5193 if (end == base || dot == base)
a06ea964
NC
5194 return 0;
5195
5196 inst.cond = COND_ALWAYS;
5197
5198 /* Handle a possible condition. */
bb7eff52 5199 if (dot)
a06ea964 5200 {
629310ab 5201 cond = str_hash_find_n (aarch64_cond_hsh, dot + 1, end - dot - 1);
a06ea964
NC
5202 if (cond)
5203 {
5204 inst.cond = cond->value;
bb7eff52 5205 *str = end;
a06ea964
NC
5206 }
5207 else
5208 {
bb7eff52 5209 *str = dot;
a06ea964
NC
5210 return 0;
5211 }
bb7eff52 5212 len = dot - base;
a06ea964
NC
5213 }
5214 else
bb7eff52
RS
5215 {
5216 *str = end;
5217 len = end - base;
5218 }
a06ea964
NC
5219
5220 if (inst.cond == COND_ALWAYS)
5221 {
5222 /* Look for unaffixed mnemonic. */
5223 return lookup_mnemonic (base, len);
5224 }
5225 else if (len <= 13)
5226 {
5227 /* append ".c" to mnemonic if conditional */
5228 memcpy (condname, base, len);
5229 memcpy (condname + len, ".c", 2);
5230 base = condname;
5231 len += 2;
5232 return lookup_mnemonic (base, len);
5233 }
5234
5235 return NULL;
5236}
5237
8f9a77af
RS
5238/* Internal helper routine converting a vector_type_el structure *VECTYPE
5239 to a corresponding operand qualifier. */
a06ea964
NC
5240
5241static inline aarch64_opnd_qualifier_t
8f9a77af 5242vectype_to_qualifier (const struct vector_type_el *vectype)
a06ea964 5243{
f06935a5 5244 /* Element size in bytes indexed by vector_el_type. */
a06ea964
NC
5245 const unsigned char ele_size[5]
5246 = {1, 2, 4, 8, 16};
65f2205d
MW
5247 const unsigned int ele_base [5] =
5248 {
a3b3345a 5249 AARCH64_OPND_QLF_V_4B,
3067d3b9 5250 AARCH64_OPND_QLF_V_2H,
65f2205d
MW
5251 AARCH64_OPND_QLF_V_2S,
5252 AARCH64_OPND_QLF_V_1D,
5253 AARCH64_OPND_QLF_V_1Q
5254 };
a06ea964
NC
5255
5256 if (!vectype->defined || vectype->type == NT_invtype)
5257 goto vectype_conversion_fail;
5258
d50c751e
RS
5259 if (vectype->type == NT_zero)
5260 return AARCH64_OPND_QLF_P_Z;
5261 if (vectype->type == NT_merge)
5262 return AARCH64_OPND_QLF_P_M;
5263
a06ea964
NC
5264 gas_assert (vectype->type >= NT_b && vectype->type <= NT_q);
5265
f11ad6bc 5266 if (vectype->defined & (NTA_HASINDEX | NTA_HASVARWIDTH))
00c2093f
TC
5267 {
5268 /* Special case S_4B. */
5269 if (vectype->type == NT_b && vectype->width == 4)
5270 return AARCH64_OPND_QLF_S_4B;
5271
df678013
MM
5272 /* Special case S_2H. */
5273 if (vectype->type == NT_h && vectype->width == 2)
5274 return AARCH64_OPND_QLF_S_2H;
5275
00c2093f
TC
5276 /* Vector element register. */
5277 return AARCH64_OPND_QLF_S_B + vectype->type;
5278 }
a06ea964
NC
5279 else
5280 {
5281 /* Vector register. */
5282 int reg_size = ele_size[vectype->type] * vectype->width;
5283 unsigned offset;
65f2205d 5284 unsigned shift;
3067d3b9 5285 if (reg_size != 16 && reg_size != 8 && reg_size != 4)
a06ea964 5286 goto vectype_conversion_fail;
65f2205d
MW
5287
5288 /* The conversion is by calculating the offset from the base operand
5289 qualifier for the vector type. The operand qualifiers are regular
5290 enough that the offset can established by shifting the vector width by
5291 a vector-type dependent amount. */
5292 shift = 0;
5293 if (vectype->type == NT_b)
a3b3345a 5294 shift = 3;
3067d3b9 5295 else if (vectype->type == NT_h || vectype->type == NT_s)
65f2205d
MW
5296 shift = 2;
5297 else if (vectype->type >= NT_d)
5298 shift = 1;
5299 else
5300 gas_assert (0);
5301
5302 offset = ele_base [vectype->type] + (vectype->width >> shift);
a3b3345a 5303 gas_assert (AARCH64_OPND_QLF_V_4B <= offset
65f2205d
MW
5304 && offset <= AARCH64_OPND_QLF_V_1Q);
5305 return offset;
a06ea964
NC
5306 }
5307
dc1e8a47 5308 vectype_conversion_fail:
a06ea964
NC
5309 first_error (_("bad vector arrangement type"));
5310 return AARCH64_OPND_QLF_NIL;
5311}
5312
5313/* Process an optional operand that is found omitted from the assembly line.
5314 Fill *OPERAND for such an operand of type TYPE. OPCODE points to the
5315 instruction's opcode entry while IDX is the index of this omitted operand.
5316 */
5317
5318static void
5319process_omitted_operand (enum aarch64_opnd type, const aarch64_opcode *opcode,
5320 int idx, aarch64_opnd_info *operand)
5321{
5322 aarch64_insn default_value = get_optional_operand_default_value (opcode);
5323 gas_assert (optional_operand_p (opcode, idx));
5324 gas_assert (!operand->present);
5325
5326 switch (type)
5327 {
adffaa8e 5328 case AARCH64_OPND_Can:
a06ea964
NC
5329 case AARCH64_OPND_Rd:
5330 case AARCH64_OPND_Rn:
5331 case AARCH64_OPND_Rm:
5332 case AARCH64_OPND_Rt:
5333 case AARCH64_OPND_Rt2:
bd7ceb8d 5334 case AARCH64_OPND_Rt_SP:
a06ea964
NC
5335 case AARCH64_OPND_Rs:
5336 case AARCH64_OPND_Ra:
5337 case AARCH64_OPND_Rt_SYS:
5338 case AARCH64_OPND_Rd_SP:
5339 case AARCH64_OPND_Rn_SP:
c84364ec 5340 case AARCH64_OPND_Rm_SP:
a06ea964
NC
5341 case AARCH64_OPND_Fd:
5342 case AARCH64_OPND_Fn:
5343 case AARCH64_OPND_Fm:
5344 case AARCH64_OPND_Fa:
5345 case AARCH64_OPND_Ft:
5346 case AARCH64_OPND_Ft2:
5347 case AARCH64_OPND_Sd:
5348 case AARCH64_OPND_Sn:
5349 case AARCH64_OPND_Sm:
f42f1a1d 5350 case AARCH64_OPND_Va:
a06ea964
NC
5351 case AARCH64_OPND_Vd:
5352 case AARCH64_OPND_Vn:
5353 case AARCH64_OPND_Vm:
5354 case AARCH64_OPND_VdD1:
5355 case AARCH64_OPND_VnD1:
5356 operand->reg.regno = default_value;
5357 break;
5358
5359 case AARCH64_OPND_Ed:
5360 case AARCH64_OPND_En:
5361 case AARCH64_OPND_Em:
369c9167 5362 case AARCH64_OPND_Em16:
f42f1a1d 5363 case AARCH64_OPND_SM3_IMM2:
a06ea964
NC
5364 operand->reglane.regno = default_value;
5365 break;
5366
5367 case AARCH64_OPND_IDX:
5368 case AARCH64_OPND_BIT_NUM:
5369 case AARCH64_OPND_IMMR:
5370 case AARCH64_OPND_IMMS:
5371 case AARCH64_OPND_SHLL_IMM:
5372 case AARCH64_OPND_IMM_VLSL:
5373 case AARCH64_OPND_IMM_VLSR:
5374 case AARCH64_OPND_CCMP_IMM:
5375 case AARCH64_OPND_FBITS:
5376 case AARCH64_OPND_UIMM4:
5377 case AARCH64_OPND_UIMM3_OP1:
5378 case AARCH64_OPND_UIMM3_OP2:
5379 case AARCH64_OPND_IMM:
f42f1a1d 5380 case AARCH64_OPND_IMM_2:
a06ea964
NC
5381 case AARCH64_OPND_WIDTH:
5382 case AARCH64_OPND_UIMM7:
5383 case AARCH64_OPND_NZCV:
245d2e3f
RS
5384 case AARCH64_OPND_SVE_PATTERN:
5385 case AARCH64_OPND_SVE_PRFOP:
a06ea964
NC
5386 operand->imm.value = default_value;
5387 break;
5388
2442d846
RS
5389 case AARCH64_OPND_SVE_PATTERN_SCALED:
5390 operand->imm.value = default_value;
5391 operand->shifter.kind = AARCH64_MOD_MUL;
5392 operand->shifter.amount = 1;
5393 break;
5394
a06ea964
NC
5395 case AARCH64_OPND_EXCEPTION:
5396 inst.reloc.type = BFD_RELOC_UNUSED;
5397 break;
5398
5399 case AARCH64_OPND_BARRIER_ISB:
5400 operand->barrier = aarch64_barrier_options + default_value;
ff605452
SD
5401 break;
5402
5403 case AARCH64_OPND_BTI_TARGET:
5404 operand->hint_option = aarch64_hint_options + default_value;
5405 break;
a06ea964
NC
5406
5407 default:
5408 break;
5409 }
5410}
5411
5412/* Process the relocation type for move wide instructions.
5413 Return TRUE on success; otherwise return FALSE. */
5414
5415static bfd_boolean
5416process_movw_reloc_info (void)
5417{
5418 int is32;
5419 unsigned shift;
5420
5421 is32 = inst.base.operands[0].qualifier == AARCH64_OPND_QLF_W ? 1 : 0;
5422
5423 if (inst.base.opcode->op == OP_MOVK)
5424 switch (inst.reloc.type)
5425 {
5426 case BFD_RELOC_AARCH64_MOVW_G0_S:
5427 case BFD_RELOC_AARCH64_MOVW_G1_S:
5428 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
5429 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
5430 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
5431 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
5432 case BFD_RELOC_AARCH64_MOVW_PREL_G3:
1aa66fb1 5433 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
a06ea964 5434 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
a06ea964 5435 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
a06ea964
NC
5436 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
5437 set_syntax_error
5438 (_("the specified relocation type is not allowed for MOVK"));
5439 return FALSE;
5440 default:
5441 break;
5442 }
5443
5444 switch (inst.reloc.type)
5445 {
5446 case BFD_RELOC_AARCH64_MOVW_G0:
a06ea964 5447 case BFD_RELOC_AARCH64_MOVW_G0_NC:
f09c556a 5448 case BFD_RELOC_AARCH64_MOVW_G0_S:
ca632371 5449 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
32247401
RL
5450 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
5451 case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
43a357f9 5452 case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
3e8286c0 5453 case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
3b957e5b 5454 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
49df5539
JW
5455 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
5456 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
a06ea964
NC
5457 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
5458 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
5459 shift = 0;
5460 break;
5461 case BFD_RELOC_AARCH64_MOVW_G1:
a06ea964 5462 case BFD_RELOC_AARCH64_MOVW_G1_NC:
f09c556a 5463 case BFD_RELOC_AARCH64_MOVW_G1_S:
654248e7 5464 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
32247401
RL
5465 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
5466 case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
43a357f9 5467 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
1aa66fb1 5468 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
3b957e5b 5469 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
49df5539
JW
5470 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
5471 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
a06ea964
NC
5472 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
5473 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
5474 shift = 16;
5475 break;
5476 case BFD_RELOC_AARCH64_MOVW_G2:
a06ea964 5477 case BFD_RELOC_AARCH64_MOVW_G2_NC:
f09c556a 5478 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
5479 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
5480 case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
49df5539 5481 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
a06ea964
NC
5482 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
5483 if (is32)
5484 {
5485 set_fatal_syntax_error
5486 (_("the specified relocation type is not allowed for 32-bit "
5487 "register"));
5488 return FALSE;
5489 }
5490 shift = 32;
5491 break;
5492 case BFD_RELOC_AARCH64_MOVW_G3:
32247401 5493 case BFD_RELOC_AARCH64_MOVW_PREL_G3:
a06ea964
NC
5494 if (is32)
5495 {
5496 set_fatal_syntax_error
5497 (_("the specified relocation type is not allowed for 32-bit "
5498 "register"));
5499 return FALSE;
5500 }
5501 shift = 48;
5502 break;
5503 default:
5504 /* More cases should be added when more MOVW-related relocation types
5505 are supported in GAS. */
5506 gas_assert (aarch64_gas_internal_fixup_p ());
5507 /* The shift amount should have already been set by the parser. */
5508 return TRUE;
5509 }
5510 inst.base.operands[1].shifter.amount = shift;
5511 return TRUE;
5512}
5513
33eaf5de 5514/* A primitive log calculator. */
a06ea964
NC
5515
5516static inline unsigned int
5517get_logsz (unsigned int size)
5518{
5519 const unsigned char ls[16] =
5520 {0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4};
5521 if (size > 16)
5522 {
5523 gas_assert (0);
5524 return -1;
5525 }
5526 gas_assert (ls[size - 1] != (unsigned char)-1);
5527 return ls[size - 1];
5528}
5529
5530/* Determine and return the real reloc type code for an instruction
5531 with the pseudo reloc type code BFD_RELOC_AARCH64_LDST_LO12. */
5532
5533static inline bfd_reloc_code_real_type
5534ldst_lo12_determine_real_reloc_type (void)
5535{
4c562523 5536 unsigned logsz;
a06ea964
NC
5537 enum aarch64_opnd_qualifier opd0_qlf = inst.base.operands[0].qualifier;
5538 enum aarch64_opnd_qualifier opd1_qlf = inst.base.operands[1].qualifier;
5539
84f1b9fb 5540 const bfd_reloc_code_real_type reloc_ldst_lo12[5][5] = {
4c562523
JW
5541 {
5542 BFD_RELOC_AARCH64_LDST8_LO12,
5543 BFD_RELOC_AARCH64_LDST16_LO12,
5544 BFD_RELOC_AARCH64_LDST32_LO12,
5545 BFD_RELOC_AARCH64_LDST64_LO12,
a06ea964 5546 BFD_RELOC_AARCH64_LDST128_LO12
4c562523
JW
5547 },
5548 {
5549 BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12,
5550 BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12,
5551 BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12,
5552 BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12,
5553 BFD_RELOC_AARCH64_NONE
5554 },
5555 {
5556 BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC,
5557 BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC,
5558 BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC,
5559 BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC,
5560 BFD_RELOC_AARCH64_NONE
84f1b9fb
RL
5561 },
5562 {
5563 BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12,
5564 BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12,
5565 BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12,
5566 BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12,
5567 BFD_RELOC_AARCH64_NONE
5568 },
5569 {
5570 BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC,
5571 BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,
5572 BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,
5573 BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,
5574 BFD_RELOC_AARCH64_NONE
4c562523 5575 }
a06ea964
NC
5576 };
5577
4c562523
JW
5578 gas_assert (inst.reloc.type == BFD_RELOC_AARCH64_LDST_LO12
5579 || inst.reloc.type == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12
5580 || (inst.reloc.type
84f1b9fb
RL
5581 == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC)
5582 || (inst.reloc.type
5583 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12)
5584 || (inst.reloc.type
5585 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12_NC));
a06ea964
NC
5586 gas_assert (inst.base.opcode->operands[1] == AARCH64_OPND_ADDR_UIMM12);
5587
5588 if (opd1_qlf == AARCH64_OPND_QLF_NIL)
5589 opd1_qlf =
5590 aarch64_get_expected_qualifier (inst.base.opcode->qualifiers_list,
5591 1, opd0_qlf, 0);
5592 gas_assert (opd1_qlf != AARCH64_OPND_QLF_NIL);
5593
5594 logsz = get_logsz (aarch64_get_qualifier_esize (opd1_qlf));
4c562523 5595 if (inst.reloc.type == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12
84f1b9fb
RL
5596 || inst.reloc.type == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC
5597 || inst.reloc.type == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12
5598 || inst.reloc.type == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12_NC)
4c562523
JW
5599 gas_assert (logsz <= 3);
5600 else
5601 gas_assert (logsz <= 4);
a06ea964 5602
4c562523 5603 /* In reloc.c, these pseudo relocation types should be defined in similar
33eaf5de 5604 order as above reloc_ldst_lo12 array. Because the array index calculation
4c562523
JW
5605 below relies on this. */
5606 return reloc_ldst_lo12[inst.reloc.type - BFD_RELOC_AARCH64_LDST_LO12][logsz];
a06ea964
NC
5607}
5608
5609/* Check whether a register list REGINFO is valid. The registers must be
5610 numbered in increasing order (modulo 32), in increments of one or two.
5611
5612 If ACCEPT_ALTERNATE is non-zero, the register numbers should be in
5613 increments of two.
5614
5615 Return FALSE if such a register list is invalid, otherwise return TRUE. */
5616
5617static bfd_boolean
5618reg_list_valid_p (uint32_t reginfo, int accept_alternate)
5619{
5620 uint32_t i, nb_regs, prev_regno, incr;
5621
5622 nb_regs = 1 + (reginfo & 0x3);
5623 reginfo >>= 2;
5624 prev_regno = reginfo & 0x1f;
5625 incr = accept_alternate ? 2 : 1;
5626
5627 for (i = 1; i < nb_regs; ++i)
5628 {
5629 uint32_t curr_regno;
5630 reginfo >>= 5;
5631 curr_regno = reginfo & 0x1f;
5632 if (curr_regno != ((prev_regno + incr) & 0x1f))
5633 return FALSE;
5634 prev_regno = curr_regno;
5635 }
5636
5637 return TRUE;
5638}
5639
3e2ac3d2
SP
5640static bfd_boolean
5641parse_perms (char **str, aarch64_opnd_info *info)
5642{
5643 char *p = *str;
5644 char c;
5645 aarch64_insn perms = 0;
5646
5647 /* Numeric value of permissions. */
5648 if (ISDIGIT (*p) || (*p == '#' && p++))
5649 {
5650 perms = *p - '0';
5651 if (p[1] > 0 || perms > 7)
5652 {
5653 set_syntax_error (_("invalid permission value"));
5654 return FALSE;
5655 }
5656 p += 2;
5657 goto out;
5658 }
5659
5660 /* Permission specifier mnemonics r, w and x, in that order. Do not accept
5661 jumbled up sequences such as rxw, wrx, etc. and also reject duplicate
5662 permissions such as rrxw. */
5663 while ((c = *p++) != '\0')
5664 {
5665 aarch64_insn i = get_perm_bit (c);
5666 if (i > 7 || i & perms || (i - 1) & perms)
5667 {
5668 set_syntax_error (_("invalid permissions"));
5669 return FALSE;
5670 }
5671 perms |= i;
5672 }
5673
5674out:
5675 *str = p - 1;
5676 info->perm = perms;
5677 return TRUE;
5678}
5679
a06ea964
NC
5680/* Generic instruction operand parser. This does no encoding and no
5681 semantic validation; it merely squirrels values away in the inst
5682 structure. Returns TRUE or FALSE depending on whether the
5683 specified grammar matched. */
5684
5685static bfd_boolean
5686parse_operands (char *str, const aarch64_opcode *opcode)
5687{
5688 int i;
5689 char *backtrack_pos = 0;
5690 const enum aarch64_opnd *operands = opcode->operands;
1799c0d0 5691 aarch64_reg_type imm_reg_type;
a06ea964
NC
5692
5693 clear_error ();
5694 skip_whitespace (str);
5695
c0890d26 5696 if (AARCH64_CPU_HAS_FEATURE (AARCH64_FEATURE_SVE, *opcode->avariant))
5b2b928e 5697 imm_reg_type = REG_TYPE_R_Z_SP_BHSDQ_VZP;
c0890d26
RS
5698 else
5699 imm_reg_type = REG_TYPE_R_Z_BHSDQ_V;
1799c0d0 5700
a06ea964
NC
5701 for (i = 0; operands[i] != AARCH64_OPND_NIL; i++)
5702 {
5703 int64_t val;
e1b988bb 5704 const reg_entry *reg;
a06ea964
NC
5705 int comma_skipped_p = 0;
5706 aarch64_reg_type rtype;
8f9a77af 5707 struct vector_type_el vectype;
4df068de 5708 aarch64_opnd_qualifier_t qualifier, base_qualifier, offset_qualifier;
a06ea964 5709 aarch64_opnd_info *info = &inst.base.operands[i];
f11ad6bc 5710 aarch64_reg_type reg_type;
a06ea964
NC
5711
5712 DEBUG_TRACE ("parse operand %d", i);
5713
5714 /* Assign the operand code. */
5715 info->type = operands[i];
5716
5717 if (optional_operand_p (opcode, i))
5718 {
5719 /* Remember where we are in case we need to backtrack. */
5720 gas_assert (!backtrack_pos);
5721 backtrack_pos = str;
5722 }
5723
33eaf5de 5724 /* Expect comma between operands; the backtrack mechanism will take
a06ea964
NC
5725 care of cases of omitted optional operand. */
5726 if (i > 0 && ! skip_past_char (&str, ','))
5727 {
5728 set_syntax_error (_("comma expected between operands"));
5729 goto failure;
5730 }
5731 else
5732 comma_skipped_p = 1;
5733
5734 switch (operands[i])
5735 {
5736 case AARCH64_OPND_Rd:
5737 case AARCH64_OPND_Rn:
5738 case AARCH64_OPND_Rm:
5739 case AARCH64_OPND_Rt:
5740 case AARCH64_OPND_Rt2:
5741 case AARCH64_OPND_Rs:
5742 case AARCH64_OPND_Ra:
5743 case AARCH64_OPND_Rt_SYS:
ee804238 5744 case AARCH64_OPND_PAIRREG:
047cd301 5745 case AARCH64_OPND_SVE_Rm:
e1b988bb 5746 po_int_reg_or_fail (REG_TYPE_R_Z);
a06ea964
NC
5747 break;
5748
5749 case AARCH64_OPND_Rd_SP:
5750 case AARCH64_OPND_Rn_SP:
bd7ceb8d 5751 case AARCH64_OPND_Rt_SP:
047cd301 5752 case AARCH64_OPND_SVE_Rn_SP:
c84364ec 5753 case AARCH64_OPND_Rm_SP:
e1b988bb 5754 po_int_reg_or_fail (REG_TYPE_R_SP);
a06ea964
NC
5755 break;
5756
dc64c2ba 5757 case AARCH64_OPND_A64C_Rm_EXT:
a06ea964
NC
5758 case AARCH64_OPND_Rm_EXT:
5759 case AARCH64_OPND_Rm_SFT:
5760 po_misc_or_fail (parse_shifter_operand
dc64c2ba
SP
5761 (&str, info, (operands[i] == AARCH64_OPND_Rm_SFT
5762 ? SHIFTED_LOGIC_IMM
5763 : SHIFTED_ARITH_IMM)));
a06ea964
NC
5764 if (!info->shifter.operator_present)
5765 {
5766 /* Default to LSL if not present. Libopcodes prefers shifter
5767 kind to be explicit. */
5768 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
5769 info->shifter.kind = AARCH64_MOD_LSL;
5770 /* For Rm_EXT, libopcodes will carry out further check on whether
5771 or not stack pointer is used in the instruction (Recall that
5772 "the extend operator is not optional unless at least one of
5773 "Rd" or "Rn" is '11111' (i.e. WSP)"). */
5774 }
5775 break;
5776
5777 case AARCH64_OPND_Fd:
5778 case AARCH64_OPND_Fn:
5779 case AARCH64_OPND_Fm:
5780 case AARCH64_OPND_Fa:
5781 case AARCH64_OPND_Ft:
5782 case AARCH64_OPND_Ft2:
5783 case AARCH64_OPND_Sd:
5784 case AARCH64_OPND_Sn:
5785 case AARCH64_OPND_Sm:
047cd301
RS
5786 case AARCH64_OPND_SVE_VZn:
5787 case AARCH64_OPND_SVE_Vd:
5788 case AARCH64_OPND_SVE_Vm:
5789 case AARCH64_OPND_SVE_Vn:
a06ea964
NC
5790 val = aarch64_reg_parse (&str, REG_TYPE_BHSDQ, &rtype, NULL);
5791 if (val == PARSE_FAIL)
5792 {
5793 first_error (_(get_reg_expected_msg (REG_TYPE_BHSDQ)));
5794 goto failure;
5795 }
5796 gas_assert (rtype >= REG_TYPE_FP_B && rtype <= REG_TYPE_FP_Q);
5797
5798 info->reg.regno = val;
5799 info->qualifier = AARCH64_OPND_QLF_S_B + (rtype - REG_TYPE_FP_B);
5800 break;
5801
f11ad6bc
RS
5802 case AARCH64_OPND_SVE_Pd:
5803 case AARCH64_OPND_SVE_Pg3:
5804 case AARCH64_OPND_SVE_Pg4_5:
5805 case AARCH64_OPND_SVE_Pg4_10:
5806 case AARCH64_OPND_SVE_Pg4_16:
5807 case AARCH64_OPND_SVE_Pm:
5808 case AARCH64_OPND_SVE_Pn:
5809 case AARCH64_OPND_SVE_Pt:
5810 reg_type = REG_TYPE_PN;
5811 goto vector_reg;
5812
5813 case AARCH64_OPND_SVE_Za_5:
5814 case AARCH64_OPND_SVE_Za_16:
5815 case AARCH64_OPND_SVE_Zd:
5816 case AARCH64_OPND_SVE_Zm_5:
5817 case AARCH64_OPND_SVE_Zm_16:
5818 case AARCH64_OPND_SVE_Zn:
5819 case AARCH64_OPND_SVE_Zt:
5820 reg_type = REG_TYPE_ZN;
5821 goto vector_reg;
5822
f42f1a1d 5823 case AARCH64_OPND_Va:
a06ea964
NC
5824 case AARCH64_OPND_Vd:
5825 case AARCH64_OPND_Vn:
5826 case AARCH64_OPND_Vm:
f11ad6bc
RS
5827 reg_type = REG_TYPE_VN;
5828 vector_reg:
5829 val = aarch64_reg_parse (&str, reg_type, NULL, &vectype);
a06ea964
NC
5830 if (val == PARSE_FAIL)
5831 {
f11ad6bc 5832 first_error (_(get_reg_expected_msg (reg_type)));
a06ea964
NC
5833 goto failure;
5834 }
5835 if (vectype.defined & NTA_HASINDEX)
5836 goto failure;
5837
5838 info->reg.regno = val;
f11ad6bc
RS
5839 if ((reg_type == REG_TYPE_PN || reg_type == REG_TYPE_ZN)
5840 && vectype.type == NT_invtype)
5841 /* Unqualified Pn and Zn registers are allowed in certain
5842 contexts. Rely on F_STRICT qualifier checking to catch
5843 invalid uses. */
5844 info->qualifier = AARCH64_OPND_QLF_NIL;
5845 else
5846 {
5847 info->qualifier = vectype_to_qualifier (&vectype);
5848 if (info->qualifier == AARCH64_OPND_QLF_NIL)
5849 goto failure;
5850 }
a06ea964
NC
5851 break;
5852
5853 case AARCH64_OPND_VdD1:
5854 case AARCH64_OPND_VnD1:
5855 val = aarch64_reg_parse (&str, REG_TYPE_VN, NULL, &vectype);
5856 if (val == PARSE_FAIL)
5857 {
5858 set_first_syntax_error (_(get_reg_expected_msg (REG_TYPE_VN)));
5859 goto failure;
5860 }
5861 if (vectype.type != NT_d || vectype.index != 1)
5862 {
5863 set_fatal_syntax_error
5864 (_("the top half of a 128-bit FP/SIMD register is expected"));
5865 goto failure;
5866 }
5867 info->reg.regno = val;
5868 /* N.B: VdD1 and VnD1 are treated as an fp or advsimd scalar register
5869 here; it is correct for the purpose of encoding/decoding since
5870 only the register number is explicitly encoded in the related
5871 instructions, although this appears a bit hacky. */
5872 info->qualifier = AARCH64_OPND_QLF_S_D;
5873 break;
5874
582e12bf
RS
5875 case AARCH64_OPND_SVE_Zm3_INDEX:
5876 case AARCH64_OPND_SVE_Zm3_22_INDEX:
116adc27 5877 case AARCH64_OPND_SVE_Zm3_11_INDEX:
31e36ab3 5878 case AARCH64_OPND_SVE_Zm4_11_INDEX:
582e12bf 5879 case AARCH64_OPND_SVE_Zm4_INDEX:
f11ad6bc
RS
5880 case AARCH64_OPND_SVE_Zn_INDEX:
5881 reg_type = REG_TYPE_ZN;
5882 goto vector_reg_index;
5883
a06ea964
NC
5884 case AARCH64_OPND_Ed:
5885 case AARCH64_OPND_En:
5886 case AARCH64_OPND_Em:
369c9167 5887 case AARCH64_OPND_Em16:
f42f1a1d 5888 case AARCH64_OPND_SM3_IMM2:
f11ad6bc
RS
5889 reg_type = REG_TYPE_VN;
5890 vector_reg_index:
5891 val = aarch64_reg_parse (&str, reg_type, NULL, &vectype);
a06ea964
NC
5892 if (val == PARSE_FAIL)
5893 {
f11ad6bc 5894 first_error (_(get_reg_expected_msg (reg_type)));
a06ea964
NC
5895 goto failure;
5896 }
5897 if (vectype.type == NT_invtype || !(vectype.defined & NTA_HASINDEX))
5898 goto failure;
5899
5900 info->reglane.regno = val;
5901 info->reglane.index = vectype.index;
5902 info->qualifier = vectype_to_qualifier (&vectype);
5903 if (info->qualifier == AARCH64_OPND_QLF_NIL)
5904 goto failure;
5905 break;
5906
f11ad6bc
RS
5907 case AARCH64_OPND_SVE_ZnxN:
5908 case AARCH64_OPND_SVE_ZtxN:
5909 reg_type = REG_TYPE_ZN;
5910 goto vector_reg_list;
5911
a06ea964
NC
5912 case AARCH64_OPND_LVn:
5913 case AARCH64_OPND_LVt:
5914 case AARCH64_OPND_LVt_AL:
5915 case AARCH64_OPND_LEt:
f11ad6bc
RS
5916 reg_type = REG_TYPE_VN;
5917 vector_reg_list:
5918 if (reg_type == REG_TYPE_ZN
5919 && get_opcode_dependent_value (opcode) == 1
5920 && *str != '{')
a06ea964 5921 {
f11ad6bc
RS
5922 val = aarch64_reg_parse (&str, reg_type, NULL, &vectype);
5923 if (val == PARSE_FAIL)
5924 {
5925 first_error (_(get_reg_expected_msg (reg_type)));
5926 goto failure;
5927 }
5928 info->reglist.first_regno = val;
5929 info->reglist.num_regs = 1;
5930 }
5931 else
5932 {
5933 val = parse_vector_reg_list (&str, reg_type, &vectype);
5934 if (val == PARSE_FAIL)
5935 goto failure;
163b2c58 5936
f11ad6bc
RS
5937 if (! reg_list_valid_p (val, /* accept_alternate */ 0))
5938 {
5939 set_fatal_syntax_error (_("invalid register list"));
5940 goto failure;
5941 }
163b2c58
BW
5942
5943 if (vectype.width != 0 && *str != ',')
5944 {
5945 set_fatal_syntax_error
5946 (_("expected element type rather than vector type"));
5947 goto failure;
5948 }
5949
f11ad6bc
RS
5950 info->reglist.first_regno = (val >> 2) & 0x1f;
5951 info->reglist.num_regs = (val & 0x3) + 1;
a06ea964 5952 }
a06ea964
NC
5953 if (operands[i] == AARCH64_OPND_LEt)
5954 {
5955 if (!(vectype.defined & NTA_HASINDEX))
5956 goto failure;
5957 info->reglist.has_index = 1;
5958 info->reglist.index = vectype.index;
5959 }
f11ad6bc
RS
5960 else
5961 {
5962 if (vectype.defined & NTA_HASINDEX)
5963 goto failure;
5964 if (!(vectype.defined & NTA_HASTYPE))
5965 {
5966 if (reg_type == REG_TYPE_ZN)
5967 set_fatal_syntax_error (_("missing type suffix"));
5968 goto failure;
5969 }
5970 }
a06ea964
NC
5971 info->qualifier = vectype_to_qualifier (&vectype);
5972 if (info->qualifier == AARCH64_OPND_QLF_NIL)
5973 goto failure;
5974 break;
5975
ec145252
SP
5976 case AARCH64_OPND_Can:
5977 case AARCH64_OPND_Cam:
5978 case AARCH64_OPND_Cas:
5979 case AARCH64_OPND_Cad:
5980 case AARCH64_OPND_Cat:
5981 case AARCH64_OPND_Cat2:
5982 po_reg_or_fail (REG_TYPE_CA_N_Z);
5983 if (opcode->op == OP_MOV_C_ZR && operands[i] == AARCH64_OPND_Can
5984 && val != 31)
5985 {
5986 set_fatal_syntax_error (_(get_reg_expected_msg (REG_TYPE_CA_Z)));
5987 goto failure;
5988 }
5989 if (val > 31)
5990 {
5991 set_fatal_syntax_error (_(get_reg_expected_msg (REG_TYPE_CA_N)));
5992 goto failure;
5993 }
5994 info->reg.regno = val;
5995 info->qualifier = AARCH64_OPND_QLF_CA;
5996 break;
5997
adffaa8e
SP
5998 case AARCH64_OPND_A64C_CST_REG:
5999 po_reg_or_fail (REG_TYPE_CA_N);
6000 if (val != 29
6001 && (opcode->iclass == br_sealed))
6002 {
6003 set_fatal_syntax_error
6004 (_(N_ ("Capability register c29 expected")));
6005 goto failure;
6006 }
6007 info->reg.regno = val;
6008 info->qualifier = AARCH64_OPND_QLF_CA;
6009 break;
6010
6011 case AARCH64_OPND_Cam_SP:
ec145252
SP
6012 case AARCH64_OPND_Can_SP:
6013 case AARCH64_OPND_Cad_SP:
6014 po_reg_or_fail (REG_TYPE_CA_N_SP);
6015 info->reg.regno = val;
6016 info->qualifier = AARCH64_OPND_QLF_CA;
6017 break;
6018
a6a51754
RL
6019 case AARCH64_OPND_CRn:
6020 case AARCH64_OPND_CRm:
a06ea964 6021 {
a6a51754
RL
6022 char prefix = *(str++);
6023 if (prefix != 'c' && prefix != 'C')
6024 goto failure;
6025
6026 po_imm_nc_or_fail ();
6027 if (val > 15)
6028 {
6029 set_fatal_syntax_error (_(N_ ("C0 - C15 expected")));
6030 goto failure;
6031 }
6032 info->qualifier = AARCH64_OPND_QLF_CR;
6033 info->imm.value = val;
6034 break;
a06ea964 6035 }
a06ea964
NC
6036
6037 case AARCH64_OPND_SHLL_IMM:
6038 case AARCH64_OPND_IMM_VLSR:
6039 po_imm_or_fail (1, 64);
6040 info->imm.value = val;
6041 break;
6042
9e5e0b29 6043 case AARCH64_OPND_A64C_IMM8:
a06ea964 6044 case AARCH64_OPND_CCMP_IMM:
e950b345 6045 case AARCH64_OPND_SIMM5:
a06ea964 6046 case AARCH64_OPND_FBITS:
b83b4b13 6047 case AARCH64_OPND_TME_UIMM16:
a06ea964 6048 case AARCH64_OPND_UIMM4:
193614f2
SD
6049 case AARCH64_OPND_UIMM4_ADDG:
6050 case AARCH64_OPND_UIMM10:
a06ea964
NC
6051 case AARCH64_OPND_UIMM3_OP1:
6052 case AARCH64_OPND_UIMM3_OP2:
6053 case AARCH64_OPND_IMM_VLSL:
6054 case AARCH64_OPND_IMM:
f42f1a1d 6055 case AARCH64_OPND_IMM_2:
a06ea964 6056 case AARCH64_OPND_WIDTH:
e950b345
RS
6057 case AARCH64_OPND_SVE_INV_LIMM:
6058 case AARCH64_OPND_SVE_LIMM:
6059 case AARCH64_OPND_SVE_LIMM_MOV:
6060 case AARCH64_OPND_SVE_SHLIMM_PRED:
6061 case AARCH64_OPND_SVE_SHLIMM_UNPRED:
28ed815a 6062 case AARCH64_OPND_SVE_SHLIMM_UNPRED_22:
e950b345
RS
6063 case AARCH64_OPND_SVE_SHRIMM_PRED:
6064 case AARCH64_OPND_SVE_SHRIMM_UNPRED:
3c17238b 6065 case AARCH64_OPND_SVE_SHRIMM_UNPRED_22:
e950b345
RS
6066 case AARCH64_OPND_SVE_SIMM5:
6067 case AARCH64_OPND_SVE_SIMM5B:
6068 case AARCH64_OPND_SVE_SIMM6:
6069 case AARCH64_OPND_SVE_SIMM8:
6070 case AARCH64_OPND_SVE_UIMM3:
6071 case AARCH64_OPND_SVE_UIMM7:
6072 case AARCH64_OPND_SVE_UIMM8:
6073 case AARCH64_OPND_SVE_UIMM8_53:
c2c4ff8d
SN
6074 case AARCH64_OPND_IMM_ROT1:
6075 case AARCH64_OPND_IMM_ROT2:
6076 case AARCH64_OPND_IMM_ROT3:
582e12bf
RS
6077 case AARCH64_OPND_SVE_IMM_ROT1:
6078 case AARCH64_OPND_SVE_IMM_ROT2:
adccc507 6079 case AARCH64_OPND_SVE_IMM_ROT3:
a06ea964
NC
6080 po_imm_nc_or_fail ();
6081 info->imm.value = val;
6082 break;
6083
e950b345
RS
6084 case AARCH64_OPND_SVE_AIMM:
6085 case AARCH64_OPND_SVE_ASIMM:
6086 po_imm_nc_or_fail ();
6087 info->imm.value = val;
6088 skip_whitespace (str);
6089 if (skip_past_comma (&str))
6090 po_misc_or_fail (parse_shift (&str, info, SHIFTED_LSL));
6091 else
6092 inst.base.operands[i].shifter.kind = AARCH64_MOD_LSL;
6093 break;
6094
245d2e3f
RS
6095 case AARCH64_OPND_SVE_PATTERN:
6096 po_enum_or_fail (aarch64_sve_pattern_array);
6097 info->imm.value = val;
6098 break;
6099
2442d846
RS
6100 case AARCH64_OPND_SVE_PATTERN_SCALED:
6101 po_enum_or_fail (aarch64_sve_pattern_array);
6102 info->imm.value = val;
6103 if (skip_past_comma (&str)
6104 && !parse_shift (&str, info, SHIFTED_MUL))
6105 goto failure;
6106 if (!info->shifter.operator_present)
6107 {
6108 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
6109 info->shifter.kind = AARCH64_MOD_MUL;
6110 info->shifter.amount = 1;
6111 }
6112 break;
6113
245d2e3f
RS
6114 case AARCH64_OPND_SVE_PRFOP:
6115 po_enum_or_fail (aarch64_sve_prfop_array);
6116 info->imm.value = val;
6117 break;
6118
a06ea964
NC
6119 case AARCH64_OPND_UIMM7:
6120 po_imm_or_fail (0, 127);
6121 info->imm.value = val;
6122 break;
6123
6124 case AARCH64_OPND_IDX:
f42f1a1d 6125 case AARCH64_OPND_MASK:
a06ea964
NC
6126 case AARCH64_OPND_BIT_NUM:
6127 case AARCH64_OPND_IMMR:
6128 case AARCH64_OPND_IMMS:
6129 po_imm_or_fail (0, 63);
6130 info->imm.value = val;
6131 break;
6132
adffaa8e
SP
6133 case AARCH64_OPND_A64C_IMMV4:
6134 po_imm_nc_or_fail ();
6135 if (val != 4)
6136 {
6137 set_fatal_syntax_error (_("immediate #4 expected"));
6138 goto failure;
6139 }
6140 info->imm.value = 4;
6141 break;
6142
a06ea964
NC
6143 case AARCH64_OPND_IMM0:
6144 po_imm_nc_or_fail ();
6145 if (val != 0)
6146 {
6147 set_fatal_syntax_error (_("immediate zero expected"));
6148 goto failure;
6149 }
6150 info->imm.value = 0;
6151 break;
6152
6153 case AARCH64_OPND_FPIMM0:
6154 {
6155 int qfloat;
6156 bfd_boolean res1 = FALSE, res2 = FALSE;
6157 /* N.B. -0.0 will be rejected; although -0.0 shouldn't be rejected,
6158 it is probably not worth the effort to support it. */
1799c0d0
RS
6159 if (!(res1 = parse_aarch64_imm_float (&str, &qfloat, FALSE,
6160 imm_reg_type))
6a9deabe
RS
6161 && (error_p ()
6162 || !(res2 = parse_constant_immediate (&str, &val,
6163 imm_reg_type))))
a06ea964
NC
6164 goto failure;
6165 if ((res1 && qfloat == 0) || (res2 && val == 0))
6166 {
6167 info->imm.value = 0;
6168 info->imm.is_fp = 1;
6169 break;
6170 }
6171 set_fatal_syntax_error (_("immediate zero expected"));
6172 goto failure;
6173 }
6174
6175 case AARCH64_OPND_IMM_MOV:
6176 {
6177 char *saved = str;
8db49cc2
WN
6178 if (reg_name_p (str, REG_TYPE_R_Z_SP) ||
6179 reg_name_p (str, REG_TYPE_VN))
a06ea964
NC
6180 goto failure;
6181 str = saved;
6182 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6183 GE_OPT_PREFIX, 1));
6184 /* The MOV immediate alias will be fixed up by fix_mov_imm_insn
6185 later. fix_mov_imm_insn will try to determine a machine
6186 instruction (MOVZ, MOVN or ORR) for it and will issue an error
6187 message if the immediate cannot be moved by a single
6188 instruction. */
6189 aarch64_set_gas_internal_fixup (&inst.reloc, info, 1);
6190 inst.base.operands[i].skip = 1;
6191 }
6192 break;
6193
6194 case AARCH64_OPND_SIMD_IMM:
6195 case AARCH64_OPND_SIMD_IMM_SFT:
1799c0d0 6196 if (! parse_big_immediate (&str, &val, imm_reg_type))
a06ea964
NC
6197 goto failure;
6198 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6199 /* addr_off_p */ 0,
6200 /* need_libopcodes_p */ 1,
6201 /* skip_p */ 1);
6202 /* Parse shift.
6203 N.B. although AARCH64_OPND_SIMD_IMM doesn't permit any
6204 shift, we don't check it here; we leave the checking to
6205 the libopcodes (operand_general_constraint_met_p). By
6206 doing this, we achieve better diagnostics. */
6207 if (skip_past_comma (&str)
6208 && ! parse_shift (&str, info, SHIFTED_LSL_MSL))
6209 goto failure;
6210 if (!info->shifter.operator_present
6211 && info->type == AARCH64_OPND_SIMD_IMM_SFT)
6212 {
6213 /* Default to LSL if not present. Libopcodes prefers shifter
6214 kind to be explicit. */
6215 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
6216 info->shifter.kind = AARCH64_MOD_LSL;
6217 }
6218 break;
6219
6220 case AARCH64_OPND_FPIMM:
6221 case AARCH64_OPND_SIMD_FPIMM:
165d4950 6222 case AARCH64_OPND_SVE_FPIMM8:
a06ea964
NC
6223 {
6224 int qfloat;
165d4950
RS
6225 bfd_boolean dp_p;
6226
6227 dp_p = double_precision_operand_p (&inst.base.operands[0]);
6a9deabe 6228 if (!parse_aarch64_imm_float (&str, &qfloat, dp_p, imm_reg_type)
874d7e6e 6229 || !aarch64_imm_float_p (qfloat))
a06ea964 6230 {
6a9deabe
RS
6231 if (!error_p ())
6232 set_fatal_syntax_error (_("invalid floating-point"
6233 " constant"));
a06ea964
NC
6234 goto failure;
6235 }
6236 inst.base.operands[i].imm.value = encode_imm_float_bits (qfloat);
6237 inst.base.operands[i].imm.is_fp = 1;
6238 }
6239 break;
6240
165d4950
RS
6241 case AARCH64_OPND_SVE_I1_HALF_ONE:
6242 case AARCH64_OPND_SVE_I1_HALF_TWO:
6243 case AARCH64_OPND_SVE_I1_ZERO_ONE:
6244 {
6245 int qfloat;
6246 bfd_boolean dp_p;
6247
6248 dp_p = double_precision_operand_p (&inst.base.operands[0]);
6249 if (!parse_aarch64_imm_float (&str, &qfloat, dp_p, imm_reg_type))
6250 {
6251 if (!error_p ())
6252 set_fatal_syntax_error (_("invalid floating-point"
6253 " constant"));
6254 goto failure;
6255 }
6256 inst.base.operands[i].imm.value = qfloat;
6257 inst.base.operands[i].imm.is_fp = 1;
6258 }
6259 break;
6260
a06ea964
NC
6261 case AARCH64_OPND_LIMM:
6262 po_misc_or_fail (parse_shifter_operand (&str, info,
6263 SHIFTED_LOGIC_IMM));
6264 if (info->shifter.operator_present)
6265 {
6266 set_fatal_syntax_error
6267 (_("shift not allowed for bitmask immediate"));
6268 goto failure;
6269 }
6270 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6271 /* addr_off_p */ 0,
6272 /* need_libopcodes_p */ 1,
6273 /* skip_p */ 1);
6274 break;
6275
0bd71233
SP
6276 case AARCH64_OPND_A64C_IMM6_EXT:
6277 po_misc_or_fail (parse_shifter_operand_imm (&str, info,
6278 SHIFTED_ARITH_IMM));
6279
6280 /* Try to coerce into shifted form if the immediate is out of
6281 range. */
6282 if (inst.reloc.exp.X_add_number > 63 && (info->imm.value & 16) == 0
6283 && (inst.reloc.exp.X_add_number >> 4) <= 64
6284 && info->shifter.amount == 0)
6285 {
6286 info->shifter.amount = 4;
6287 info->shifter.kind = AARCH64_MOD_LSL;
6288 info->imm.value = inst.reloc.exp.X_add_number >> 4;
6289 }
6290 else
6291 info->imm.value = inst.reloc.exp.X_add_number;
6292 break;
6293
a06ea964 6294 case AARCH64_OPND_AIMM:
dc64c2ba
SP
6295 case AARCH64_OPND_A64C_AIMM:
6296 if (opcode->op == OP_ADD || opcode->op == OP_A64C_ADD)
a06ea964
NC
6297 /* ADD may have relocation types. */
6298 po_misc_or_fail (parse_shifter_operand_reloc (&str, info,
6299 SHIFTED_ARITH_IMM));
6300 else
6301 po_misc_or_fail (parse_shifter_operand (&str, info,
6302 SHIFTED_ARITH_IMM));
6303 switch (inst.reloc.type)
6304 {
6305 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
6306 info->shifter.amount = 12;
6307 break;
6308 case BFD_RELOC_UNUSED:
6309 aarch64_set_gas_internal_fixup (&inst.reloc, info, 0);
6310 if (info->shifter.kind != AARCH64_MOD_NONE)
6311 inst.reloc.flags = FIXUP_F_HAS_EXPLICIT_SHIFT;
6312 inst.reloc.pc_rel = 0;
6313 break;
6314 default:
6315 break;
6316 }
6317 info->imm.value = 0;
6318 if (!info->shifter.operator_present)
6319 {
6320 /* Default to LSL if not present. Libopcodes prefers shifter
6321 kind to be explicit. */
6322 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
6323 info->shifter.kind = AARCH64_MOD_LSL;
6324 }
6325 break;
6326
6327 case AARCH64_OPND_HALF:
6328 {
6329 /* #<imm16> or relocation. */
6330 int internal_fixup_p;
6331 po_misc_or_fail (parse_half (&str, &internal_fixup_p));
6332 if (internal_fixup_p)
6333 aarch64_set_gas_internal_fixup (&inst.reloc, info, 0);
6334 skip_whitespace (str);
6335 if (skip_past_comma (&str))
6336 {
6337 /* {, LSL #<shift>} */
6338 if (! aarch64_gas_internal_fixup_p ())
6339 {
6340 set_fatal_syntax_error (_("can't mix relocation modifier "
6341 "with explicit shift"));
6342 goto failure;
6343 }
6344 po_misc_or_fail (parse_shift (&str, info, SHIFTED_LSL));
6345 }
6346 else
6347 inst.base.operands[i].shifter.amount = 0;
6348 inst.base.operands[i].shifter.kind = AARCH64_MOD_LSL;
6349 inst.base.operands[i].imm.value = 0;
6350 if (! process_movw_reloc_info ())
6351 goto failure;
6352 }
6353 break;
6354
6355 case AARCH64_OPND_EXCEPTION:
09c1e68a 6356 case AARCH64_OPND_UNDEFINED:
1799c0d0
RS
6357 po_misc_or_fail (parse_immediate_expression (&str, &inst.reloc.exp,
6358 imm_reg_type));
a06ea964
NC
6359 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6360 /* addr_off_p */ 0,
6361 /* need_libopcodes_p */ 0,
6362 /* skip_p */ 1);
6363 break;
6364
6365 case AARCH64_OPND_NZCV:
6366 {
629310ab 6367 const asm_nzcv *nzcv = str_hash_find_n (aarch64_nzcv_hsh, str, 4);
a06ea964
NC
6368 if (nzcv != NULL)
6369 {
6370 str += 4;
6371 info->imm.value = nzcv->value;
6372 break;
6373 }
6374 po_imm_or_fail (0, 15);
6375 info->imm.value = val;
6376 }
6377 break;
6378
3e2ac3d2
SP
6379 case AARCH64_OPND_PERM:
6380 po_misc_or_fail (parse_perms (&str, info));
6381 break;
6382
7ce74d61
SP
6383 case AARCH64_OPND_FORM:
6384 {
6385 char *start = str;
6386 do
6387 str++;
6388 while (ISALPHA (*str));
6389 info->form = get_form_from_str (start, str - start);
6390 if (info->form == NULL)
6391 {
6392 set_syntax_error (_("invalid form"));
6393 goto failure;
6394 }
6395 }
6396 break;
6397
a06ea964 6398 case AARCH64_OPND_COND:
68a64283 6399 case AARCH64_OPND_COND1:
bb7eff52
RS
6400 {
6401 char *start = str;
6402 do
6403 str++;
6404 while (ISALPHA (*str));
629310ab 6405 info->cond = str_hash_find_n (aarch64_cond_hsh, start, str - start);
bb7eff52
RS
6406 if (info->cond == NULL)
6407 {
6408 set_syntax_error (_("invalid condition"));
6409 goto failure;
6410 }
6411 else if (operands[i] == AARCH64_OPND_COND1
6412 && (info->cond->value & 0xe) == 0xe)
6413 {
6414 /* Do not allow AL or NV. */
6415 set_default_error ();
6416 goto failure;
6417 }
6418 }
a06ea964
NC
6419 break;
6420
6421 case AARCH64_OPND_ADDR_ADRP:
6422 po_misc_or_fail (parse_adrp (&str));
6423 /* Clear the value as operand needs to be relocated. */
6424 info->imm.value = 0;
6425 break;
6426
6427 case AARCH64_OPND_ADDR_PCREL14:
6428 case AARCH64_OPND_ADDR_PCREL19:
6429 case AARCH64_OPND_ADDR_PCREL21:
6430 case AARCH64_OPND_ADDR_PCREL26:
73866052 6431 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6432 if (!info->addr.pcrel)
6433 {
6434 set_syntax_error (_("invalid pc-relative address"));
6435 goto failure;
6436 }
6437 if (inst.gen_lit_pool
6438 && (opcode->iclass != loadlit || opcode->op == OP_PRFM_LIT))
6439 {
6440 /* Only permit "=value" in the literal load instructions.
6441 The literal will be generated by programmer_friendly_fixup. */
6442 set_syntax_error (_("invalid use of \"=immediate\""));
6443 goto failure;
6444 }
6445 if (inst.reloc.exp.X_op == O_symbol && find_reloc_table_entry (&str))
6446 {
6447 set_syntax_error (_("unrecognized relocation suffix"));
6448 goto failure;
6449 }
6450 if (inst.reloc.exp.X_op == O_constant && !inst.gen_lit_pool)
6451 {
6452 info->imm.value = inst.reloc.exp.X_add_number;
6453 inst.reloc.type = BFD_RELOC_UNUSED;
6454 }
6455 else
6456 {
f0070c1e
SP
6457 bfd_boolean c64 = AARCH64_CPU_HAS_FEATURE (cpu_variant,
6458 AARCH64_FEATURE_C64);
6459
a06ea964 6460 info->imm.value = 0;
f41aef5f
RE
6461 if (inst.reloc.type == BFD_RELOC_UNUSED)
6462 switch (opcode->iclass)
6463 {
6464 case compbranch:
6465 case condbranch:
6466 /* e.g. CBZ or B.COND */
6467 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL19);
6468 inst.reloc.type = BFD_RELOC_AARCH64_BRANCH19;
6469 break;
6470 case testbranch:
6471 /* e.g. TBZ */
6472 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL14);
6473 inst.reloc.type = BFD_RELOC_AARCH64_TSTBR14;
6474 break;
6475 case branch_imm:
6476 /* e.g. B or BL */
6477 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL26);
6478 inst.reloc.type =
6479 (opcode->op == OP_BL) ? BFD_RELOC_AARCH64_CALL26
6480 : BFD_RELOC_AARCH64_JUMP26;
6481 break;
6482 case loadlit:
6483 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL19);
6484 inst.reloc.type = BFD_RELOC_AARCH64_LD_LO19_PCREL;
6485 break;
6486 case pcreladdr:
6487 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL21);
6488 inst.reloc.type = BFD_RELOC_AARCH64_ADR_LO21_PCREL;
8b21361b
SP
6489 if (inst.reloc.exp.X_op == O_symbol
6490 && inst.reloc.exp.X_add_symbol != NULL)
6491 {
6492 symbolS *sym = inst.reloc.exp.X_add_symbol;
6493
6494 /* We set LSB for C64 local functions. We do not do
6495 this for local labels even in code section because
6496 it could be embedded data. */
6497 if (S_IS_DEFINED (sym) && AARCH64_IS_C64 (sym)
6498 && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION))
6499 {
6500 inst.reloc.exp.X_add_number += 1;
6501 }
6502 }
6503
f41aef5f
RE
6504 break;
6505 default:
6506 gas_assert (0);
6507 abort ();
6508 }
f0070c1e
SP
6509 if (c64)
6510 inst.reloc.flags = FIXUP_F_C64;
a06ea964
NC
6511 inst.reloc.pc_rel = 1;
6512 }
6513 break;
6514
6515 case AARCH64_OPND_ADDR_SIMPLE:
6516 case AARCH64_OPND_SIMD_ADDR_SIMPLE:
e1b988bb
RS
6517 {
6518 /* [<Xn|SP>{, #<simm>}] */
6519 char *start = str;
6520 /* First use the normal address-parsing routines, to get
6521 the usual syntax errors. */
73866052 6522 po_misc_or_fail (parse_address (&str, info));
e1b988bb
RS
6523 if (info->addr.pcrel || info->addr.offset.is_reg
6524 || !info->addr.preind || info->addr.postind
550fd7bf 6525 || info->addr.writeback)
e1b988bb
RS
6526 {
6527 set_syntax_error (_("invalid addressing mode"));
6528 goto failure;
6529 }
6530
6531 /* Then retry, matching the specific syntax of these addresses. */
6532 str = start;
6533 po_char_or_fail ('[');
3493da5c
SP
6534 po_reg_or_fail (AARCH64_CPU_HAS_FEATURE (cpu_variant,
6535 AARCH64_FEATURE_C64)
6536 ? REG_TYPE_CA_N_SP : REG_TYPE_R64_SP);
6537
e1b988bb
RS
6538 /* Accept optional ", #0". */
6539 if (operands[i] == AARCH64_OPND_ADDR_SIMPLE
6540 && skip_past_char (&str, ','))
6541 {
6542 skip_past_char (&str, '#');
6543 if (! skip_past_char (&str, '0'))
6544 {
6545 set_fatal_syntax_error
6546 (_("the optional immediate offset can only be 0"));
6547 goto failure;
6548 }
6549 }
6550 po_char_or_fail (']');
6551 break;
6552 }
a06ea964
NC
6553
6554 case AARCH64_OPND_ADDR_REGOFF:
6555 /* [<Xn|SP>, <R><m>{, <extend> {<amount>}}] */
73866052 6556 po_misc_or_fail (parse_address (&str, info));
4df068de 6557 regoff_addr:
a06ea964
NC
6558 if (info->addr.pcrel || !info->addr.offset.is_reg
6559 || !info->addr.preind || info->addr.postind
6560 || info->addr.writeback)
6561 {
6562 set_syntax_error (_("invalid addressing mode"));
6563 goto failure;
6564 }
6565 if (!info->shifter.operator_present)
6566 {
6567 /* Default to LSL if not present. Libopcodes prefers shifter
6568 kind to be explicit. */
6569 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
6570 info->shifter.kind = AARCH64_MOD_LSL;
6571 }
6572 /* Qualifier to be deduced by libopcodes. */
6573 break;
6574
6575 case AARCH64_OPND_ADDR_SIMM7:
73866052 6576 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6577 if (info->addr.pcrel || info->addr.offset.is_reg
6578 || (!info->addr.preind && !info->addr.postind))
6579 {
6580 set_syntax_error (_("invalid addressing mode"));
6581 goto failure;
6582 }
73866052
RS
6583 if (inst.reloc.type != BFD_RELOC_UNUSED)
6584 {
6585 set_syntax_error (_("relocation not allowed"));
6586 goto failure;
6587 }
a06ea964
NC
6588 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6589 /* addr_off_p */ 1,
6590 /* need_libopcodes_p */ 1,
6591 /* skip_p */ 0);
6592 break;
6593
6594 case AARCH64_OPND_ADDR_SIMM9:
6595 case AARCH64_OPND_ADDR_SIMM9_2:
fb3265b3
SD
6596 case AARCH64_OPND_ADDR_SIMM11:
6597 case AARCH64_OPND_ADDR_SIMM13:
73866052 6598 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6599 if (info->addr.pcrel || info->addr.offset.is_reg
6600 || (!info->addr.preind && !info->addr.postind)
6601 || (operands[i] == AARCH64_OPND_ADDR_SIMM9_2
6602 && info->addr.writeback))
6603 {
6604 set_syntax_error (_("invalid addressing mode"));
6605 goto failure;
6606 }
6607 if (inst.reloc.type != BFD_RELOC_UNUSED)
6608 {
6609 set_syntax_error (_("relocation not allowed"));
6610 goto failure;
6611 }
6612 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6613 /* addr_off_p */ 1,
6614 /* need_libopcodes_p */ 1,
6615 /* skip_p */ 0);
6616 break;
6617
3f06e550 6618 case AARCH64_OPND_ADDR_SIMM10:
f42f1a1d 6619 case AARCH64_OPND_ADDR_OFFSET:
3f06e550
SN
6620 po_misc_or_fail (parse_address (&str, info));
6621 if (info->addr.pcrel || info->addr.offset.is_reg
6622 || !info->addr.preind || info->addr.postind)
6623 {
6624 set_syntax_error (_("invalid addressing mode"));
6625 goto failure;
6626 }
6627 if (inst.reloc.type != BFD_RELOC_UNUSED)
6628 {
6629 set_syntax_error (_("relocation not allowed"));
6630 goto failure;
6631 }
6632 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6633 /* addr_off_p */ 1,
6634 /* need_libopcodes_p */ 1,
6635 /* skip_p */ 0);
6636 break;
6637
a06ea964 6638 case AARCH64_OPND_ADDR_UIMM12:
73866052 6639 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6640 if (info->addr.pcrel || info->addr.offset.is_reg
6641 || !info->addr.preind || info->addr.writeback)
6642 {
6643 set_syntax_error (_("invalid addressing mode"));
6644 goto failure;
6645 }
6646 if (inst.reloc.type == BFD_RELOC_UNUSED)
6647 aarch64_set_gas_internal_fixup (&inst.reloc, info, 1);
4c562523
JW
6648 else if (inst.reloc.type == BFD_RELOC_AARCH64_LDST_LO12
6649 || (inst.reloc.type
6650 == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12)
6651 || (inst.reloc.type
84f1b9fb
RL
6652 == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC)
6653 || (inst.reloc.type
6654 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12)
6655 || (inst.reloc.type
6656 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12_NC))
a06ea964
NC
6657 inst.reloc.type = ldst_lo12_determine_real_reloc_type ();
6658 /* Leave qualifier to be determined by libopcodes. */
6659 break;
6660
6661 case AARCH64_OPND_SIMD_ADDR_POST:
6662 /* [<Xn|SP>], <Xm|#<amount>> */
73866052 6663 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6664 if (!info->addr.postind || !info->addr.writeback)
6665 {
6666 set_syntax_error (_("invalid addressing mode"));
6667 goto failure;
6668 }
6669 if (!info->addr.offset.is_reg)
6670 {
6671 if (inst.reloc.exp.X_op == O_constant)
6672 info->addr.offset.imm = inst.reloc.exp.X_add_number;
6673 else
6674 {
6675 set_fatal_syntax_error
ab3b8fcf 6676 (_("writeback value must be an immediate constant"));
a06ea964
NC
6677 goto failure;
6678 }
6679 }
6680 /* No qualifier. */
6681 break;
6682
582e12bf 6683 case AARCH64_OPND_SVE_ADDR_RI_S4x16:
8382113f 6684 case AARCH64_OPND_SVE_ADDR_RI_S4x32:
98907a70
RS
6685 case AARCH64_OPND_SVE_ADDR_RI_S4xVL:
6686 case AARCH64_OPND_SVE_ADDR_RI_S4x2xVL:
6687 case AARCH64_OPND_SVE_ADDR_RI_S4x3xVL:
6688 case AARCH64_OPND_SVE_ADDR_RI_S4x4xVL:
6689 case AARCH64_OPND_SVE_ADDR_RI_S6xVL:
6690 case AARCH64_OPND_SVE_ADDR_RI_S9xVL:
4df068de
RS
6691 case AARCH64_OPND_SVE_ADDR_RI_U6:
6692 case AARCH64_OPND_SVE_ADDR_RI_U6x2:
6693 case AARCH64_OPND_SVE_ADDR_RI_U6x4:
6694 case AARCH64_OPND_SVE_ADDR_RI_U6x8:
98907a70
RS
6695 /* [X<n>{, #imm, MUL VL}]
6696 [X<n>{, #imm}]
4df068de
RS
6697 but recognizing SVE registers. */
6698 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6699 &offset_qualifier));
6700 if (base_qualifier != AARCH64_OPND_QLF_X)
6701 {
6702 set_syntax_error (_("invalid addressing mode"));
6703 goto failure;
6704 }
6705 sve_regimm:
6706 if (info->addr.pcrel || info->addr.offset.is_reg
6707 || !info->addr.preind || info->addr.writeback)
6708 {
6709 set_syntax_error (_("invalid addressing mode"));
6710 goto failure;
6711 }
6712 if (inst.reloc.type != BFD_RELOC_UNUSED
6713 || inst.reloc.exp.X_op != O_constant)
6714 {
6715 /* Make sure this has priority over
6716 "invalid addressing mode". */
6717 set_fatal_syntax_error (_("constant offset required"));
6718 goto failure;
6719 }
6720 info->addr.offset.imm = inst.reloc.exp.X_add_number;
6721 break;
6722
c8d59609
NC
6723 case AARCH64_OPND_SVE_ADDR_R:
6724 /* [<Xn|SP>{, <R><m>}]
6725 but recognizing SVE registers. */
6726 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6727 &offset_qualifier));
6728 if (offset_qualifier == AARCH64_OPND_QLF_NIL)
6729 {
6730 offset_qualifier = AARCH64_OPND_QLF_X;
6731 info->addr.offset.is_reg = 1;
6732 info->addr.offset.regno = 31;
6733 }
6734 else if (base_qualifier != AARCH64_OPND_QLF_X
6735 || offset_qualifier != AARCH64_OPND_QLF_X)
6736 {
6737 set_syntax_error (_("invalid addressing mode"));
6738 goto failure;
6739 }
6740 goto regoff_addr;
6741
4df068de
RS
6742 case AARCH64_OPND_SVE_ADDR_RR:
6743 case AARCH64_OPND_SVE_ADDR_RR_LSL1:
6744 case AARCH64_OPND_SVE_ADDR_RR_LSL2:
6745 case AARCH64_OPND_SVE_ADDR_RR_LSL3:
6746 case AARCH64_OPND_SVE_ADDR_RX:
6747 case AARCH64_OPND_SVE_ADDR_RX_LSL1:
6748 case AARCH64_OPND_SVE_ADDR_RX_LSL2:
6749 case AARCH64_OPND_SVE_ADDR_RX_LSL3:
6750 /* [<Xn|SP>, <R><m>{, lsl #<amount>}]
6751 but recognizing SVE registers. */
6752 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6753 &offset_qualifier));
6754 if (base_qualifier != AARCH64_OPND_QLF_X
6755 || offset_qualifier != AARCH64_OPND_QLF_X)
6756 {
6757 set_syntax_error (_("invalid addressing mode"));
6758 goto failure;
6759 }
6760 goto regoff_addr;
6761
6762 case AARCH64_OPND_SVE_ADDR_RZ:
6763 case AARCH64_OPND_SVE_ADDR_RZ_LSL1:
6764 case AARCH64_OPND_SVE_ADDR_RZ_LSL2:
6765 case AARCH64_OPND_SVE_ADDR_RZ_LSL3:
6766 case AARCH64_OPND_SVE_ADDR_RZ_XTW_14:
6767 case AARCH64_OPND_SVE_ADDR_RZ_XTW_22:
6768 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_14:
6769 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_22:
6770 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_14:
6771 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_22:
6772 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_14:
6773 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_22:
6774 /* [<Xn|SP>, Z<m>.D{, LSL #<amount>}]
6775 [<Xn|SP>, Z<m>.<T>, <extend> {#<amount>}] */
6776 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6777 &offset_qualifier));
6778 if (base_qualifier != AARCH64_OPND_QLF_X
6779 || (offset_qualifier != AARCH64_OPND_QLF_S_S
6780 && offset_qualifier != AARCH64_OPND_QLF_S_D))
6781 {
6782 set_syntax_error (_("invalid addressing mode"));
6783 goto failure;
6784 }
6785 info->qualifier = offset_qualifier;
6786 goto regoff_addr;
6787
c469c864
MM
6788 case AARCH64_OPND_SVE_ADDR_ZX:
6789 /* [Zn.<T>{, <Xm>}]. */
6790 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6791 &offset_qualifier));
6792 /* Things to check:
6793 base_qualifier either S_S or S_D
6794 offset_qualifier must be X
6795 */
6796 if ((base_qualifier != AARCH64_OPND_QLF_S_S
6797 && base_qualifier != AARCH64_OPND_QLF_S_D)
6798 || offset_qualifier != AARCH64_OPND_QLF_X)
6799 {
6800 set_syntax_error (_("invalid addressing mode"));
6801 goto failure;
6802 }
6803 info->qualifier = base_qualifier;
6804 if (!info->addr.offset.is_reg || info->addr.pcrel
6805 || !info->addr.preind || info->addr.writeback
6806 || info->shifter.operator_present != 0)
6807 {
6808 set_syntax_error (_("invalid addressing mode"));
6809 goto failure;
6810 }
6811 info->shifter.kind = AARCH64_MOD_LSL;
6812 break;
6813
6814
4df068de
RS
6815 case AARCH64_OPND_SVE_ADDR_ZI_U5:
6816 case AARCH64_OPND_SVE_ADDR_ZI_U5x2:
6817 case AARCH64_OPND_SVE_ADDR_ZI_U5x4:
6818 case AARCH64_OPND_SVE_ADDR_ZI_U5x8:
6819 /* [Z<n>.<T>{, #imm}] */
6820 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6821 &offset_qualifier));
6822 if (base_qualifier != AARCH64_OPND_QLF_S_S
6823 && base_qualifier != AARCH64_OPND_QLF_S_D)
6824 {
6825 set_syntax_error (_("invalid addressing mode"));
6826 goto failure;
6827 }
6828 info->qualifier = base_qualifier;
6829 goto sve_regimm;
6830
6831 case AARCH64_OPND_SVE_ADDR_ZZ_LSL:
6832 case AARCH64_OPND_SVE_ADDR_ZZ_SXTW:
6833 case AARCH64_OPND_SVE_ADDR_ZZ_UXTW:
6834 /* [Z<n>.<T>, Z<m>.<T>{, LSL #<amount>}]
6835 [Z<n>.D, Z<m>.D, <extend> {#<amount>}]
6836
6837 We don't reject:
6838
6839 [Z<n>.S, Z<m>.S, <extend> {#<amount>}]
6840
6841 here since we get better error messages by leaving it to
6842 the qualifier checking routines. */
6843 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6844 &offset_qualifier));
6845 if ((base_qualifier != AARCH64_OPND_QLF_S_S
6846 && base_qualifier != AARCH64_OPND_QLF_S_D)
6847 || offset_qualifier != base_qualifier)
6848 {
6849 set_syntax_error (_("invalid addressing mode"));
6850 goto failure;
6851 }
6852 info->qualifier = base_qualifier;
6853 goto regoff_addr;
6854
a06ea964 6855 case AARCH64_OPND_SYSREG:
7d02540a
TC
6856 {
6857 uint32_t sysreg_flags;
6858 if ((val = parse_sys_reg (&str, aarch64_sys_regs_hsh, 1, 0,
6859 &sysreg_flags)) == PARSE_FAIL)
6860 {
6861 set_syntax_error (_("unknown or missing system register name"));
6862 goto failure;
6863 }
6864 inst.base.operands[i].sysreg.value = val;
6865 inst.base.operands[i].sysreg.flags = sysreg_flags;
6866 break;
6867 }
a06ea964
NC
6868
6869 case AARCH64_OPND_PSTATEFIELD:
561a72d4 6870 if ((val = parse_sys_reg (&str, aarch64_pstatefield_hsh, 0, 1, NULL))
a3251895 6871 == PARSE_FAIL)
a06ea964
NC
6872 {
6873 set_syntax_error (_("unknown or missing PSTATE field name"));
6874 goto failure;
6875 }
6876 inst.base.operands[i].pstatefield = val;
6877 break;
6878
6879 case AARCH64_OPND_SYSREG_IC:
6880 inst.base.operands[i].sysins_op =
6881 parse_sys_ins_reg (&str, aarch64_sys_regs_ic_hsh);
6882 goto sys_reg_ins;
2ac435d4 6883
a06ea964
NC
6884 case AARCH64_OPND_SYSREG_DC:
6885 inst.base.operands[i].sysins_op =
6886 parse_sys_ins_reg (&str, aarch64_sys_regs_dc_hsh);
6887 goto sys_reg_ins;
2ac435d4 6888
a06ea964
NC
6889 case AARCH64_OPND_SYSREG_AT:
6890 inst.base.operands[i].sysins_op =
6891 parse_sys_ins_reg (&str, aarch64_sys_regs_at_hsh);
6892 goto sys_reg_ins;
2ac435d4
SD
6893
6894 case AARCH64_OPND_SYSREG_SR:
6895 inst.base.operands[i].sysins_op =
6896 parse_sys_ins_reg (&str, aarch64_sys_regs_sr_hsh);
6897 goto sys_reg_ins;
6898
a06ea964
NC
6899 case AARCH64_OPND_SYSREG_TLBI:
6900 inst.base.operands[i].sysins_op =
6901 parse_sys_ins_reg (&str, aarch64_sys_regs_tlbi_hsh);
dc1e8a47 6902 sys_reg_ins:
a06ea964
NC
6903 if (inst.base.operands[i].sysins_op == NULL)
6904 {
6905 set_fatal_syntax_error ( _("unknown or missing operation name"));
6906 goto failure;
6907 }
6908 break;
6909
6910 case AARCH64_OPND_BARRIER:
6911 case AARCH64_OPND_BARRIER_ISB:
6912 val = parse_barrier (&str);
6913 if (val != PARSE_FAIL
6914 && operands[i] == AARCH64_OPND_BARRIER_ISB && val != 0xf)
6915 {
6916 /* ISB only accepts options name 'sy'. */
6917 set_syntax_error
6918 (_("the specified option is not accepted in ISB"));
6919 /* Turn off backtrack as this optional operand is present. */
6920 backtrack_pos = 0;
6921 goto failure;
6922 }
6923 /* This is an extension to accept a 0..15 immediate. */
6924 if (val == PARSE_FAIL)
6925 po_imm_or_fail (0, 15);
6926 info->barrier = aarch64_barrier_options + val;
6927 break;
6928
6929 case AARCH64_OPND_PRFOP:
6930 val = parse_pldop (&str);
6931 /* This is an extension to accept a 0..31 immediate. */
6932 if (val == PARSE_FAIL)
6933 po_imm_or_fail (0, 31);
6934 inst.base.operands[i].prfop = aarch64_prfops + val;
6935 break;
6936
1e6f4800
MW
6937 case AARCH64_OPND_BARRIER_PSB:
6938 val = parse_barrier_psb (&str, &(info->hint_option));
6939 if (val == PARSE_FAIL)
6940 goto failure;
6941 break;
6942
ff605452
SD
6943 case AARCH64_OPND_BTI_TARGET:
6944 val = parse_bti_operand (&str, &(info->hint_option));
6945 if (val == PARSE_FAIL)
6946 goto failure;
6947 break;
6948
a06ea964
NC
6949 default:
6950 as_fatal (_("unhandled operand code %d"), operands[i]);
6951 }
6952
6953 /* If we get here, this operand was successfully parsed. */
6954 inst.base.operands[i].present = 1;
6955 continue;
6956
dc1e8a47 6957 failure:
a06ea964
NC
6958 /* The parse routine should already have set the error, but in case
6959 not, set a default one here. */
6960 if (! error_p ())
6961 set_default_error ();
6962
6963 if (! backtrack_pos)
6964 goto parse_operands_return;
6965
f4c51f60
JW
6966 {
6967 /* We reach here because this operand is marked as optional, and
6968 either no operand was supplied or the operand was supplied but it
6969 was syntactically incorrect. In the latter case we report an
6970 error. In the former case we perform a few more checks before
6971 dropping through to the code to insert the default operand. */
6972
6973 char *tmp = backtrack_pos;
6974 char endchar = END_OF_INSN;
6975
6976 if (i != (aarch64_num_of_operands (opcode) - 1))
6977 endchar = ',';
6978 skip_past_char (&tmp, ',');
6979
6980 if (*tmp != endchar)
6981 /* The user has supplied an operand in the wrong format. */
6982 goto parse_operands_return;
6983
6984 /* Make sure there is not a comma before the optional operand.
6985 For example the fifth operand of 'sys' is optional:
6986
6987 sys #0,c0,c0,#0, <--- wrong
6988 sys #0,c0,c0,#0 <--- correct. */
6989 if (comma_skipped_p && i && endchar == END_OF_INSN)
6990 {
6991 set_fatal_syntax_error
6992 (_("unexpected comma before the omitted optional operand"));
6993 goto parse_operands_return;
6994 }
6995 }
6996
a06ea964
NC
6997 /* Reaching here means we are dealing with an optional operand that is
6998 omitted from the assembly line. */
6999 gas_assert (optional_operand_p (opcode, i));
7000 info->present = 0;
7001 process_omitted_operand (operands[i], opcode, i, info);
7002
7003 /* Try again, skipping the optional operand at backtrack_pos. */
7004 str = backtrack_pos;
7005 backtrack_pos = 0;
7006
a06ea964
NC
7007 /* Clear any error record after the omitted optional operand has been
7008 successfully handled. */
7009 clear_error ();
7010 }
7011
7012 /* Check if we have parsed all the operands. */
7013 if (*str != '\0' && ! error_p ())
7014 {
7015 /* Set I to the index of the last present operand; this is
7016 for the purpose of diagnostics. */
7017 for (i -= 1; i >= 0 && !inst.base.operands[i].present; --i)
7018 ;
7019 set_fatal_syntax_error
7020 (_("unexpected characters following instruction"));
7021 }
7022
dc1e8a47 7023 parse_operands_return:
a06ea964
NC
7024
7025 if (error_p ())
7026 {
7027 DEBUG_TRACE ("parsing FAIL: %s - %s",
7028 operand_mismatch_kind_names[get_error_kind ()],
7029 get_error_message ());
7030 /* Record the operand error properly; this is useful when there
7031 are multiple instruction templates for a mnemonic name, so that
7032 later on, we can select the error that most closely describes
7033 the problem. */
7034 record_operand_error (opcode, i, get_error_kind (),
7035 get_error_message ());
7036 return FALSE;
7037 }
7038 else
7039 {
7040 DEBUG_TRACE ("parsing SUCCESS");
7041 return TRUE;
7042 }
7043}
7044
7045/* It does some fix-up to provide some programmer friendly feature while
7046 keeping the libopcodes happy, i.e. libopcodes only accepts
7047 the preferred architectural syntax.
7048 Return FALSE if there is any failure; otherwise return TRUE. */
7049
7050static bfd_boolean
7051programmer_friendly_fixup (aarch64_instruction *instr)
7052{
7053 aarch64_inst *base = &instr->base;
7054 const aarch64_opcode *opcode = base->opcode;
7055 enum aarch64_op op = opcode->op;
7056 aarch64_opnd_info *operands = base->operands;
7057
7058 DEBUG_TRACE ("enter");
7059
7060 switch (opcode->iclass)
7061 {
7062 case testbranch:
7063 /* TBNZ Xn|Wn, #uimm6, label
7064 Test and Branch Not Zero: conditionally jumps to label if bit number
7065 uimm6 in register Xn is not zero. The bit number implies the width of
7066 the register, which may be written and should be disassembled as Wn if
7067 uimm is less than 32. */
7068 if (operands[0].qualifier == AARCH64_OPND_QLF_W)
7069 {
7070 if (operands[1].imm.value >= 32)
7071 {
7072 record_operand_out_of_range_error (opcode, 1, _("immediate value"),
7073 0, 31);
7074 return FALSE;
7075 }
7076 operands[0].qualifier = AARCH64_OPND_QLF_X;
7077 }
7078 break;
7079 case loadlit:
7080 /* LDR Wt, label | =value
7081 As a convenience assemblers will typically permit the notation
7082 "=value" in conjunction with the pc-relative literal load instructions
7083 to automatically place an immediate value or symbolic address in a
7084 nearby literal pool and generate a hidden label which references it.
7085 ISREG has been set to 0 in the case of =value. */
7086 if (instr->gen_lit_pool
7087 && (op == OP_LDR_LIT || op == OP_LDRV_LIT || op == OP_LDRSW_LIT))
7088 {
7089 int size = aarch64_get_qualifier_esize (operands[0].qualifier);
7090 if (op == OP_LDRSW_LIT)
7091 size = 4;
7092 if (instr->reloc.exp.X_op != O_constant
67a32447 7093 && instr->reloc.exp.X_op != O_big
a06ea964
NC
7094 && instr->reloc.exp.X_op != O_symbol)
7095 {
7096 record_operand_error (opcode, 1,
7097 AARCH64_OPDE_FATAL_SYNTAX_ERROR,
7098 _("constant expression expected"));
7099 return FALSE;
7100 }
7101 if (! add_to_lit_pool (&instr->reloc.exp, size))
7102 {
7103 record_operand_error (opcode, 1,
7104 AARCH64_OPDE_OTHER_ERROR,
7105 _("literal pool insertion failed"));
7106 return FALSE;
7107 }
7108 }
7109 break;
a06ea964
NC
7110 case log_shift:
7111 case bitfield:
7112 /* UXT[BHW] Wd, Wn
7113 Unsigned Extend Byte|Halfword|Word: UXT[BH] is architectural alias
7114 for UBFM Wd,Wn,#0,#7|15, while UXTW is pseudo instruction which is
7115 encoded using ORR Wd, WZR, Wn (MOV Wd,Wn).
7116 A programmer-friendly assembler should accept a destination Xd in
7117 place of Wd, however that is not the preferred form for disassembly.
7118 */
7119 if ((op == OP_UXTB || op == OP_UXTH || op == OP_UXTW)
7120 && operands[1].qualifier == AARCH64_OPND_QLF_W
7121 && operands[0].qualifier == AARCH64_OPND_QLF_X)
7122 operands[0].qualifier = AARCH64_OPND_QLF_W;
7123 break;
7124
7125 case addsub_ext:
7126 {
7127 /* In the 64-bit form, the final register operand is written as Wm
7128 for all but the (possibly omitted) UXTX/LSL and SXTX
7129 operators.
7130 As a programmer-friendly assembler, we accept e.g.
7131 ADDS <Xd>, <Xn|SP>, <Xm>{, UXTB {#<amount>}} and change it to
7132 ADDS <Xd>, <Xn|SP>, <Wm>{, UXTB {#<amount>}}. */
7133 int idx = aarch64_operand_index (opcode->operands,
7134 AARCH64_OPND_Rm_EXT);
7135 gas_assert (idx == 1 || idx == 2);
7136 if (operands[0].qualifier == AARCH64_OPND_QLF_X
7137 && operands[idx].qualifier == AARCH64_OPND_QLF_X
7138 && operands[idx].shifter.kind != AARCH64_MOD_LSL
7139 && operands[idx].shifter.kind != AARCH64_MOD_UXTX
7140 && operands[idx].shifter.kind != AARCH64_MOD_SXTX)
7141 operands[idx].qualifier = AARCH64_OPND_QLF_W;
7142 }
7143 break;
7144
7145 default:
7146 break;
7147 }
7148
7149 DEBUG_TRACE ("exit with SUCCESS");
7150 return TRUE;
7151}
7152
5c47e525 7153/* Check for loads and stores that will cause unpredictable behavior. */
54a28c4c
JW
7154
7155static void
7156warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
7157{
7158 aarch64_inst *base = &instr->base;
7159 const aarch64_opcode *opcode = base->opcode;
7160 const aarch64_opnd_info *opnds = base->operands;
7161 switch (opcode->iclass)
7162 {
7163 case ldst_pos:
7164 case ldst_imm9:
3f06e550 7165 case ldst_imm10:
54a28c4c
JW
7166 case ldst_unscaled:
7167 case ldst_unpriv:
5c47e525
RE
7168 /* Loading/storing the base register is unpredictable if writeback. */
7169 if ((aarch64_get_operand_class (opnds[0].type)
7170 == AARCH64_OPND_CLASS_INT_REG)
7171 && opnds[0].reg.regno == opnds[1].addr.base_regno
4bf8c6e8 7172 && opnds[1].addr.base_regno != REG_SP
69105ce4
SD
7173 /* Exempt STG/STZG/ST2G/STZ2G. */
7174 && !(opnds[1].type == AARCH64_OPND_ADDR_SIMM13)
54a28c4c 7175 && opnds[1].addr.writeback)
5c47e525 7176 as_warn (_("unpredictable transfer with writeback -- `%s'"), str);
54a28c4c 7177 break;
503ba600 7178
54a28c4c
JW
7179 case ldstpair_off:
7180 case ldstnapair_offs:
7181 case ldstpair_indexed:
5c47e525
RE
7182 /* Loading/storing the base register is unpredictable if writeback. */
7183 if ((aarch64_get_operand_class (opnds[0].type)
7184 == AARCH64_OPND_CLASS_INT_REG)
7185 && (opnds[0].reg.regno == opnds[2].addr.base_regno
7186 || opnds[1].reg.regno == opnds[2].addr.base_regno)
4bf8c6e8 7187 && opnds[2].addr.base_regno != REG_SP
fb3265b3
SD
7188 /* Exempt STGP. */
7189 && !(opnds[2].type == AARCH64_OPND_ADDR_SIMM11)
54a28c4c 7190 && opnds[2].addr.writeback)
5c47e525
RE
7191 as_warn (_("unpredictable transfer with writeback -- `%s'"), str);
7192 /* Load operations must load different registers. */
54a28c4c
JW
7193 if ((opcode->opcode & (1 << 22))
7194 && opnds[0].reg.regno == opnds[1].reg.regno)
7195 as_warn (_("unpredictable load of register pair -- `%s'"), str);
7196 break;
ee943970
RR
7197
7198 case ldstexcl:
7199 /* It is unpredictable if the destination and status registers are the
7200 same. */
7201 if ((aarch64_get_operand_class (opnds[0].type)
7202 == AARCH64_OPND_CLASS_INT_REG)
7203 && (aarch64_get_operand_class (opnds[1].type)
7204 == AARCH64_OPND_CLASS_INT_REG)
7205 && (opnds[0].reg.regno == opnds[1].reg.regno
7206 || opnds[0].reg.regno == opnds[2].reg.regno))
7207 as_warn (_("unpredictable: identical transfer and status registers"
7208 " --`%s'"),
7209 str);
7210
7211 break;
7212
54a28c4c
JW
7213 default:
7214 break;
7215 }
7216}
7217
4f5d2536
TC
7218static void
7219force_automatic_sequence_close (void)
7220{
7221 if (now_instr_sequence.instr)
7222 {
7223 as_warn (_("previous `%s' sequence has not been closed"),
7224 now_instr_sequence.instr->opcode->name);
7225 init_insn_sequence (NULL, &now_instr_sequence);
7226 }
7227}
7228
a06ea964
NC
7229/* A wrapper function to interface with libopcodes on encoding and
7230 record the error message if there is any.
7231
7232 Return TRUE on success; otherwise return FALSE. */
7233
7234static bfd_boolean
7235do_encode (const aarch64_opcode *opcode, aarch64_inst *instr,
7236 aarch64_insn *code)
7237{
7238 aarch64_operand_error error_info;
7d02540a 7239 memset (&error_info, '\0', sizeof (error_info));
a06ea964 7240 error_info.kind = AARCH64_OPDE_NIL;
3979cf50
SP
7241 if (aarch64_opcode_encode (cpu_variant, opcode, instr, code, NULL,
7242 &error_info, insn_sequence)
7d02540a 7243 && !error_info.non_fatal)
a06ea964 7244 return TRUE;
7d02540a
TC
7245
7246 gas_assert (error_info.kind != AARCH64_OPDE_NIL);
7247 record_operand_error_info (opcode, &error_info);
7248 return error_info.non_fatal;
a06ea964
NC
7249}
7250
7251#ifdef DEBUG_AARCH64
7252static inline void
7253dump_opcode_operands (const aarch64_opcode *opcode)
7254{
7255 int i = 0;
7256 while (opcode->operands[i] != AARCH64_OPND_NIL)
7257 {
7258 aarch64_verbose ("\t\t opnd%d: %s", i,
7259 aarch64_get_operand_name (opcode->operands[i])[0] != '\0'
7260 ? aarch64_get_operand_name (opcode->operands[i])
7261 : aarch64_get_operand_desc (opcode->operands[i]));
7262 ++i;
7263 }
7264}
7265#endif /* DEBUG_AARCH64 */
7266
7267/* This is the guts of the machine-dependent assembler. STR points to a
7268 machine dependent instruction. This function is supposed to emit
7269 the frags/bytes it assembles to. */
7270
7271void
7272md_assemble (char *str)
7273{
7274 char *p = str;
7275 templates *template;
7276 aarch64_opcode *opcode;
7277 aarch64_inst *inst_base;
7278 unsigned saved_cond;
7279
7280 /* Align the previous label if needed. */
7281 if (last_label_seen != NULL)
7282 {
7283 symbol_set_frag (last_label_seen, frag_now);
7284 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
7285 S_SET_SEGMENT (last_label_seen, now_seg);
7286 }
7287
7e84b55d
TC
7288 /* Update the current insn_sequence from the segment. */
7289 insn_sequence = &seg_info (now_seg)->tc_segment_info_data.insn_sequence;
7290
a06ea964
NC
7291 inst.reloc.type = BFD_RELOC_UNUSED;
7292
7293 DEBUG_TRACE ("\n\n");
7294 DEBUG_TRACE ("==============================");
7295 DEBUG_TRACE ("Enter md_assemble with %s", str);
7296
7297 template = opcode_lookup (&p);
7298 if (!template)
7299 {
7300 /* It wasn't an instruction, but it might be a register alias of
7301 the form alias .req reg directive. */
7302 if (!create_register_alias (str, p))
7303 as_bad (_("unknown mnemonic `%s' -- `%s'"), get_mnemonic_name (str),
7304 str);
7305 return;
7306 }
7307
7308 skip_whitespace (p);
7309 if (*p == ',')
7310 {
7311 as_bad (_("unexpected comma after the mnemonic name `%s' -- `%s'"),
7312 get_mnemonic_name (str), str);
7313 return;
7314 }
7315
7316 init_operand_error_report ();
7317
eb9d6cc9
RL
7318 /* Sections are assumed to start aligned. In executable section, there is no
7319 MAP_DATA symbol pending. So we only align the address during
3979cf50 7320 MAP_DATA --> MAP_CUR_INSN transition.
eb9d6cc9
RL
7321 For other sections, this is not guaranteed. */
7322 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
7323 if (!need_pass_2 && subseg_text_p (now_seg) && mapstate == MAP_DATA)
7324 frag_align_code (2, 0);
7325
a06ea964
NC
7326 saved_cond = inst.cond;
7327 reset_aarch64_instruction (&inst);
7328 inst.cond = saved_cond;
7329
7330 /* Iterate through all opcode entries with the same mnemonic name. */
7331 do
7332 {
7333 opcode = template->opcode;
7334
7335 DEBUG_TRACE ("opcode %s found", opcode->name);
7336#ifdef DEBUG_AARCH64
7337 if (debug_dump)
7338 dump_opcode_operands (opcode);
7339#endif /* DEBUG_AARCH64 */
7340
3979cf50 7341 mapping_state (MAP_CUR_INSN);
a06ea964
NC
7342
7343 inst_base = &inst.base;
7344 inst_base->opcode = opcode;
7345
7346 /* Truly conditionally executed instructions, e.g. b.cond. */
7347 if (opcode->flags & F_COND)
7348 {
7349 gas_assert (inst.cond != COND_ALWAYS);
7350 inst_base->cond = get_cond_from_value (inst.cond);
7351 DEBUG_TRACE ("condition found %s", inst_base->cond->names[0]);
7352 }
7353 else if (inst.cond != COND_ALWAYS)
7354 {
7355 /* It shouldn't arrive here, where the assembly looks like a
7356 conditional instruction but the found opcode is unconditional. */
7357 gas_assert (0);
7358 continue;
7359 }
7360
7361 if (parse_operands (p, opcode)
7362 && programmer_friendly_fixup (&inst)
7363 && do_encode (inst_base->opcode, &inst.base, &inst_base->value))
7364 {
3f06bfce
YZ
7365 /* Check that this instruction is supported for this CPU. */
7366 if (!opcode->avariant
93d8990c 7367 || !AARCH64_CPU_HAS_ALL_FEATURES (cpu_variant, *opcode->avariant))
3f06bfce
YZ
7368 {
7369 as_bad (_("selected processor does not support `%s'"), str);
7370 return;
7371 }
7372
54a28c4c
JW
7373 warn_unpredictable_ldst (&inst, str);
7374
a06ea964
NC
7375 if (inst.reloc.type == BFD_RELOC_UNUSED
7376 || !inst.reloc.need_libopcodes_p)
7377 output_inst (NULL);
7378 else
7379 {
7380 /* If there is relocation generated for the instruction,
7381 store the instruction information for the future fix-up. */
7382 struct aarch64_inst *copy;
7383 gas_assert (inst.reloc.type != BFD_RELOC_UNUSED);
325801bd 7384 copy = XNEW (struct aarch64_inst);
a06ea964
NC
7385 memcpy (copy, &inst.base, sizeof (struct aarch64_inst));
7386 output_inst (copy);
7387 }
7d02540a
TC
7388
7389 /* Issue non-fatal messages if any. */
7390 output_operand_error_report (str, TRUE);
a06ea964
NC
7391 return;
7392 }
7393
7394 template = template->next;
7395 if (template != NULL)
7396 {
7397 reset_aarch64_instruction (&inst);
7398 inst.cond = saved_cond;
7399 }
7400 }
7401 while (template != NULL);
7402
7403 /* Issue the error messages if any. */
7d02540a 7404 output_operand_error_report (str, FALSE);
a06ea964
NC
7405}
7406
7407/* Various frobbings of labels and their addresses. */
7408
7409void
7410aarch64_start_line_hook (void)
7411{
7412 last_label_seen = NULL;
7413}
7414
7415void
7416aarch64_frob_label (symbolS * sym)
7417{
7418 last_label_seen = sym;
7419
8b21361b
SP
7420 AARCH64_SET_C64 (sym, IS_C64);
7421
a06ea964
NC
7422 dwarf2_emit_label (sym);
7423}
7424
4f5d2536
TC
7425void
7426aarch64_frob_section (asection *sec ATTRIBUTE_UNUSED)
7427{
7428 /* Check to see if we have a block to close. */
7429 force_automatic_sequence_close ();
7430}
7431
a06ea964
NC
7432int
7433aarch64_data_in_code (void)
7434{
7435 if (!strncmp (input_line_pointer + 1, "data:", 5))
7436 {
7437 *input_line_pointer = '/';
7438 input_line_pointer += 5;
7439 *input_line_pointer = 0;
7440 return 1;
7441 }
7442
7443 return 0;
7444}
7445
7446char *
7447aarch64_canonicalize_symbol_name (char *name)
7448{
7449 int len;
7450
7451 if ((len = strlen (name)) > 5 && streq (name + len - 5, "/data"))
7452 *(name + len - 5) = 0;
7453
7454 return name;
7455}
7456\f
7457/* Table of all register names defined by default. The user can
7458 define additional names with .req. Note that all register names
7459 should appear in both upper and lowercase variants. Some registers
7460 also have mixed-case names. */
7461
7462#define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE }
8975f864 7463#define REGDEF_ALIAS(s, n, t) { #s, n, REG_TYPE_##t, FALSE}
a06ea964 7464#define REGNUM(p,n,t) REGDEF(p##n, n, t)
f11ad6bc 7465#define REGSET16(p,t) \
a06ea964
NC
7466 REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
7467 REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
7468 REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
f11ad6bc
RS
7469 REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
7470#define REGSET31(p,t) \
7471 REGSET16(p, t), \
a06ea964
NC
7472 REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
7473 REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
7474 REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
7475 REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t)
7476#define REGSET(p,t) \
7477 REGSET31(p,t), REGNUM(p,31,t)
7478
7479/* These go into aarch64_reg_hsh hash-table. */
7480static const reg_entry reg_names[] = {
7481 /* Integer registers. */
7482 REGSET31 (x, R_64), REGSET31 (X, R_64),
7483 REGSET31 (w, R_32), REGSET31 (W, R_32),
7484
8975f864 7485 REGDEF_ALIAS (ip0, 16, R_64), REGDEF_ALIAS (IP0, 16, R_64),
f10e937a 7486 REGDEF_ALIAS (ip1, 17, R_64), REGDEF_ALIAS (IP1, 17, R_64),
8975f864
RR
7487 REGDEF_ALIAS (fp, 29, R_64), REGDEF_ALIAS (FP, 29, R_64),
7488 REGDEF_ALIAS (lr, 30, R_64), REGDEF_ALIAS (LR, 30, R_64),
a06ea964
NC
7489 REGDEF (wsp, 31, SP_32), REGDEF (WSP, 31, SP_32),
7490 REGDEF (sp, 31, SP_64), REGDEF (SP, 31, SP_64),
7491
7492 REGDEF (wzr, 31, Z_32), REGDEF (WZR, 31, Z_32),
7493 REGDEF (xzr, 31, Z_64), REGDEF (XZR, 31, Z_64),
7494
3493da5c
SP
7495 /* Capability Registers. */
7496 REGSET31 (c, CA_N), REGSET31 (C, CA_N),
7497 REGDEF (csp, 31, CA_SP), REGDEF (CSP, 31, CA_SP),
7498 REGDEF (czr, 31, CA_Z), REGDEF (CZR, 31, CA_Z),
7499 REGDEF (ddc, 33, CA_D), REGDEF (DDC, 33, CA_D),
7500 REGDEF_ALIAS (clr, 30, CA_N), REGDEF_ALIAS (CLR, 30, CA_N),
7501
a06ea964
NC
7502 /* Floating-point single precision registers. */
7503 REGSET (s, FP_S), REGSET (S, FP_S),
7504
7505 /* Floating-point double precision registers. */
7506 REGSET (d, FP_D), REGSET (D, FP_D),
7507
7508 /* Floating-point half precision registers. */
7509 REGSET (h, FP_H), REGSET (H, FP_H),
7510
7511 /* Floating-point byte precision registers. */
7512 REGSET (b, FP_B), REGSET (B, FP_B),
7513
7514 /* Floating-point quad precision registers. */
7515 REGSET (q, FP_Q), REGSET (Q, FP_Q),
7516
7517 /* FP/SIMD registers. */
7518 REGSET (v, VN), REGSET (V, VN),
f11ad6bc
RS
7519
7520 /* SVE vector registers. */
7521 REGSET (z, ZN), REGSET (Z, ZN),
7522
7523 /* SVE predicate registers. */
7524 REGSET16 (p, PN), REGSET16 (P, PN)
a06ea964
NC
7525};
7526
7527#undef REGDEF
8975f864 7528#undef REGDEF_ALIAS
a06ea964 7529#undef REGNUM
f11ad6bc
RS
7530#undef REGSET16
7531#undef REGSET31
a06ea964
NC
7532#undef REGSET
7533
7534#define N 1
7535#define n 0
7536#define Z 1
7537#define z 0
7538#define C 1
7539#define c 0
7540#define V 1
7541#define v 0
7542#define B(a,b,c,d) (((a) << 3) | ((b) << 2) | ((c) << 1) | (d))
7543static const asm_nzcv nzcv_names[] = {
7544 {"nzcv", B (n, z, c, v)},
7545 {"nzcV", B (n, z, c, V)},
7546 {"nzCv", B (n, z, C, v)},
7547 {"nzCV", B (n, z, C, V)},
7548 {"nZcv", B (n, Z, c, v)},
7549 {"nZcV", B (n, Z, c, V)},
7550 {"nZCv", B (n, Z, C, v)},
7551 {"nZCV", B (n, Z, C, V)},
7552 {"Nzcv", B (N, z, c, v)},
7553 {"NzcV", B (N, z, c, V)},
7554 {"NzCv", B (N, z, C, v)},
7555 {"NzCV", B (N, z, C, V)},
7556 {"NZcv", B (N, Z, c, v)},
7557 {"NZcV", B (N, Z, c, V)},
7558 {"NZCv", B (N, Z, C, v)},
7559 {"NZCV", B (N, Z, C, V)}
7560};
7561
7562#undef N
7563#undef n
7564#undef Z
7565#undef z
7566#undef C
7567#undef c
7568#undef V
7569#undef v
7570#undef B
7571\f
7572/* MD interface: bits in the object file. */
7573
7574/* Turn an integer of n bytes (in val) into a stream of bytes appropriate
7575 for use in the a.out file, and stores them in the array pointed to by buf.
7576 This knows about the endian-ness of the target machine and does
7577 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
7578 2 (short) and 4 (long) Floating numbers are put out as a series of
7579 LITTLENUMS (shorts, here at least). */
7580
7581void
7582md_number_to_chars (char *buf, valueT val, int n)
7583{
7584 if (target_big_endian)
7585 number_to_chars_bigendian (buf, val, n);
7586 else
7587 number_to_chars_littleendian (buf, val, n);
7588}
7589
7590/* MD interface: Sections. */
7591
7592/* Estimate the size of a frag before relaxing. Assume everything fits in
7593 4 bytes. */
7594
7595int
7596md_estimate_size_before_relax (fragS * fragp, segT segtype ATTRIBUTE_UNUSED)
7597{
7598 fragp->fr_var = 4;
7599 return 4;
7600}
7601
7602/* Round up a section size to the appropriate boundary. */
7603
7604valueT
7605md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
7606{
7607 return size;
7608}
7609
7610/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
f803aa8e
DPT
7611 of an rs_align_code fragment.
7612
7613 Here we fill the frag with the appropriate info for padding the
7614 output stream. The resulting frag will consist of a fixed (fr_fix)
7615 and of a repeating (fr_var) part.
7616
7617 The fixed content is always emitted before the repeating content and
7618 these two parts are used as follows in constructing the output:
7619 - the fixed part will be used to align to a valid instruction word
7620 boundary, in case that we start at a misaligned address; as no
7621 executable instruction can live at the misaligned location, we
7622 simply fill with zeros;
7623 - the variable part will be used to cover the remaining padding and
7624 we fill using the AArch64 NOP instruction.
7625
7626 Note that the size of a RS_ALIGN_CODE fragment is always 7 to provide
7627 enough storage space for up to 3 bytes for padding the back to a valid
7628 instruction alignment and exactly 4 bytes to store the NOP pattern. */
a06ea964
NC
7629
7630void
7631aarch64_handle_align (fragS * fragP)
7632{
7633 /* NOP = d503201f */
7634 /* AArch64 instructions are always little-endian. */
d9235011 7635 static unsigned char const aarch64_noop[4] = { 0x1f, 0x20, 0x03, 0xd5 };
a06ea964
NC
7636
7637 int bytes, fix, noop_size;
7638 char *p;
a06ea964
NC
7639
7640 if (fragP->fr_type != rs_align_code)
7641 return;
7642
7643 bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
7644 p = fragP->fr_literal + fragP->fr_fix;
a06ea964
NC
7645
7646#ifdef OBJ_ELF
7647 gas_assert (fragP->tc_frag_data.recorded);
7648#endif
7649
a06ea964 7650 noop_size = sizeof (aarch64_noop);
a06ea964 7651
f803aa8e
DPT
7652 fix = bytes & (noop_size - 1);
7653 if (fix)
a06ea964 7654 {
a06ea964 7655#ifdef OBJ_ELF
3979cf50 7656 insert_data_mapping_symbol (MAP_CUR_INSN, fragP->fr_fix, fragP, fix);
a06ea964
NC
7657#endif
7658 memset (p, 0, fix);
7659 p += fix;
f803aa8e 7660 fragP->fr_fix += fix;
a06ea964
NC
7661 }
7662
f803aa8e
DPT
7663 if (noop_size)
7664 memcpy (p, aarch64_noop, noop_size);
7665 fragP->fr_var = noop_size;
a06ea964
NC
7666}
7667
7668/* Perform target specific initialisation of a frag.
7669 Note - despite the name this initialisation is not done when the frag
7670 is created, but only when its type is assigned. A frag can be created
7671 and used a long time before its type is set, so beware of assuming that
33eaf5de 7672 this initialisation is performed first. */
a06ea964
NC
7673
7674#ifndef OBJ_ELF
7675void
7676aarch64_init_frag (fragS * fragP ATTRIBUTE_UNUSED,
7677 int max_chars ATTRIBUTE_UNUSED)
7678{
7679}
7680
7681#else /* OBJ_ELF is defined. */
7682void
7683aarch64_init_frag (fragS * fragP, int max_chars)
7684{
7685 /* Record a mapping symbol for alignment frags. We will delete this
7686 later if the alignment ends up empty. */
7687 if (!fragP->tc_frag_data.recorded)
c7ad08e6
RL
7688 fragP->tc_frag_data.recorded = 1;
7689
e8d84ca1
NC
7690 /* PR 21809: Do not set a mapping state for debug sections
7691 - it just confuses other tools. */
fd361982 7692 if (bfd_section_flags (now_seg) & SEC_DEBUGGING)
e8d84ca1
NC
7693 return;
7694
c7ad08e6 7695 switch (fragP->fr_type)
a06ea964 7696 {
c7ad08e6
RL
7697 case rs_align_test:
7698 case rs_fill:
7699 mapping_state_2 (MAP_DATA, max_chars);
7700 break;
7ea12e5c
NC
7701 case rs_align:
7702 /* PR 20364: We can get alignment frags in code sections,
7703 so do not just assume that we should use the MAP_DATA state. */
3979cf50 7704 mapping_state_2 (subseg_text_p (now_seg) ? MAP_CUR_INSN : MAP_DATA, max_chars);
7ea12e5c 7705 break;
c7ad08e6 7706 case rs_align_code:
3979cf50 7707 mapping_state_2 (MAP_CUR_INSN, max_chars);
c7ad08e6
RL
7708 break;
7709 default:
7710 break;
a06ea964
NC
7711 }
7712}
7713\f
7714/* Initialize the DWARF-2 unwind information for this procedure. */
7715
7716void
7717tc_aarch64_frame_initial_instructions (void)
7718{
7719 cfi_add_CFA_def_cfa (REG_SP, 0);
7720}
7721#endif /* OBJ_ELF */
7722
7723/* Convert REGNAME to a DWARF-2 register number. */
7724
7725int
7726tc_aarch64_regname_to_dw2regnum (char *regname)
7727{
7728 const reg_entry *reg = parse_reg (&regname);
7729 if (reg == NULL)
7730 return -1;
7731
7732 switch (reg->type)
7733 {
7734 case REG_TYPE_SP_32:
7735 case REG_TYPE_SP_64:
7736 case REG_TYPE_R_32:
7737 case REG_TYPE_R_64:
a2cac51c
RH
7738 return reg->number;
7739
a06ea964
NC
7740 case REG_TYPE_FP_B:
7741 case REG_TYPE_FP_H:
7742 case REG_TYPE_FP_S:
7743 case REG_TYPE_FP_D:
7744 case REG_TYPE_FP_Q:
a2cac51c
RH
7745 return reg->number + 64;
7746
a06ea964
NC
7747 default:
7748 break;
7749 }
7750 return -1;
7751}
7752
cec5225b
YZ
7753/* Implement DWARF2_ADDR_SIZE. */
7754
7755int
7756aarch64_dwarf2_addr_size (void)
7757{
7758#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7759 if (ilp32_p)
7760 return 4;
7761#endif
7762 return bfd_arch_bits_per_address (stdoutput) / 8;
7763}
7764
a06ea964
NC
7765/* MD interface: Symbol and relocation handling. */
7766
7767/* Return the address within the segment that a PC-relative fixup is
7768 relative to. For AArch64 PC-relative fixups applied to instructions
7769 are generally relative to the location plus AARCH64_PCREL_OFFSET bytes. */
7770
7771long
7772md_pcrel_from_section (fixS * fixP, segT seg)
7773{
7774 offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
7775
7776 /* If this is pc-relative and we are going to emit a relocation
7777 then we just want to put out any pipeline compensation that the linker
7778 will need. Otherwise we want to use the calculated base. */
7779 if (fixP->fx_pcrel
7780 && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
7781 || aarch64_force_relocation (fixP)))
7782 base = 0;
7783
7784 /* AArch64 should be consistent for all pc-relative relocations. */
7785 return base + AARCH64_PCREL_OFFSET;
7786}
7787
7788/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
7789 Otherwise we have no need to default values of symbols. */
7790
7791symbolS *
7792md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
7793{
7794#ifdef OBJ_ELF
7795 if (name[0] == '_' && name[1] == 'G'
7796 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
7797 {
7798 if (!GOT_symbol)
7799 {
7800 if (symbol_find (name))
7801 as_bad (_("GOT already in the symbol table"));
7802
7803 GOT_symbol = symbol_new (name, undefined_section,
e01e1cee 7804 &zero_address_frag, 0);
a06ea964
NC
7805 }
7806
7807 return GOT_symbol;
7808 }
7809#endif
7810
7811 return 0;
7812}
7813
7814/* Return non-zero if the indicated VALUE has overflowed the maximum
7815 range expressible by a unsigned number with the indicated number of
7816 BITS. */
7817
7818static bfd_boolean
7819unsigned_overflow (valueT value, unsigned bits)
7820{
7821 valueT lim;
7822 if (bits >= sizeof (valueT) * 8)
7823 return FALSE;
7824 lim = (valueT) 1 << bits;
7825 return (value >= lim);
7826}
7827
7828
7829/* Return non-zero if the indicated VALUE has overflowed the maximum
7830 range expressible by an signed number with the indicated number of
7831 BITS. */
7832
7833static bfd_boolean
7834signed_overflow (offsetT value, unsigned bits)
7835{
7836 offsetT lim;
7837 if (bits >= sizeof (offsetT) * 8)
7838 return FALSE;
7839 lim = (offsetT) 1 << (bits - 1);
7840 return (value < -lim || value >= lim);
7841}
7842
7843/* Given an instruction in *INST, which is expected to be a scaled, 12-bit,
7844 unsigned immediate offset load/store instruction, try to encode it as
7845 an unscaled, 9-bit, signed immediate offset load/store instruction.
7846 Return TRUE if it is successful; otherwise return FALSE.
7847
7848 As a programmer-friendly assembler, LDUR/STUR instructions can be generated
7849 in response to the standard LDR/STR mnemonics when the immediate offset is
7850 unambiguous, i.e. when it is negative or unaligned. */
7851
7852static bfd_boolean
7853try_to_encode_as_unscaled_ldst (aarch64_inst *instr)
7854{
7855 int idx;
7856 enum aarch64_op new_op;
7857 const aarch64_opcode *new_opcode;
7858
7859 gas_assert (instr->opcode->iclass == ldst_pos);
7860
7861 switch (instr->opcode->op)
7862 {
7863 case OP_LDRB_POS:new_op = OP_LDURB; break;
7864 case OP_STRB_POS: new_op = OP_STURB; break;
7865 case OP_LDRSB_POS: new_op = OP_LDURSB; break;
7866 case OP_LDRH_POS: new_op = OP_LDURH; break;
7867 case OP_STRH_POS: new_op = OP_STURH; break;
7868 case OP_LDRSH_POS: new_op = OP_LDURSH; break;
7869 case OP_LDR_POS: new_op = OP_LDUR; break;
7870 case OP_STR_POS: new_op = OP_STUR; break;
7871 case OP_LDRF_POS: new_op = OP_LDURV; break;
7872 case OP_STRF_POS: new_op = OP_STURV; break;
7873 case OP_LDRSW_POS: new_op = OP_LDURSW; break;
7874 case OP_PRFM_POS: new_op = OP_PRFUM; break;
7875 default: new_op = OP_NIL; break;
7876 }
7877
7878 if (new_op == OP_NIL)
7879 return FALSE;
7880
7881 new_opcode = aarch64_get_opcode (new_op);
7882 gas_assert (new_opcode != NULL);
7883
7884 DEBUG_TRACE ("Check programmer-friendly STURB/LDURB -> STRB/LDRB: %d == %d",
7885 instr->opcode->op, new_opcode->op);
7886
7887 aarch64_replace_opcode (instr, new_opcode);
7888
7889 /* Clear up the ADDR_SIMM9's qualifier; otherwise the
7890 qualifier matching may fail because the out-of-date qualifier will
7891 prevent the operand being updated with a new and correct qualifier. */
7892 idx = aarch64_operand_index (instr->opcode->operands,
7893 AARCH64_OPND_ADDR_SIMM9);
7894 gas_assert (idx == 1);
7895 instr->operands[idx].qualifier = AARCH64_OPND_QLF_NIL;
7896
7897 DEBUG_TRACE ("Found LDURB entry to encode programmer-friendly LDRB");
7898
3979cf50
SP
7899 if (!aarch64_opcode_encode (cpu_variant, instr->opcode, instr, &instr->value,
7900 NULL, NULL, insn_sequence))
a06ea964
NC
7901 return FALSE;
7902
7903 return TRUE;
7904}
7905
7906/* Called by fix_insn to fix a MOV immediate alias instruction.
7907
7908 Operand for a generic move immediate instruction, which is an alias
7909 instruction that generates a single MOVZ, MOVN or ORR instruction to loads
7910 a 32-bit/64-bit immediate value into general register. An assembler error
7911 shall result if the immediate cannot be created by a single one of these
7912 instructions. If there is a choice, then to ensure reversability an
7913 assembler must prefer a MOVZ to MOVN, and MOVZ or MOVN to ORR. */
7914
7915static void
7916fix_mov_imm_insn (fixS *fixP, char *buf, aarch64_inst *instr, offsetT value)
7917{
7918 const aarch64_opcode *opcode;
7919
7920 /* Need to check if the destination is SP/ZR. The check has to be done
7921 before any aarch64_replace_opcode. */
7922 int try_mov_wide_p = !aarch64_stack_pointer_p (&instr->operands[0]);
7923 int try_mov_bitmask_p = !aarch64_zero_register_p (&instr->operands[0]);
7924
7925 instr->operands[1].imm.value = value;
7926 instr->operands[1].skip = 0;
7927
7928 if (try_mov_wide_p)
7929 {
7930 /* Try the MOVZ alias. */
7931 opcode = aarch64_get_opcode (OP_MOV_IMM_WIDE);
7932 aarch64_replace_opcode (instr, opcode);
3979cf50 7933 if (aarch64_opcode_encode (cpu_variant, instr->opcode, instr,
7e84b55d 7934 &instr->value, NULL, NULL, insn_sequence))
a06ea964
NC
7935 {
7936 put_aarch64_insn (buf, instr->value);
7937 return;
7938 }
7939 /* Try the MOVK alias. */
7940 opcode = aarch64_get_opcode (OP_MOV_IMM_WIDEN);
7941 aarch64_replace_opcode (instr, opcode);
3979cf50 7942 if (aarch64_opcode_encode (cpu_variant, instr->opcode, instr,
7e84b55d 7943 &instr->value, NULL, NULL, insn_sequence))
a06ea964
NC
7944 {
7945 put_aarch64_insn (buf, instr->value);
7946 return;
7947 }
7948 }
7949
7950 if (try_mov_bitmask_p)
7951 {
7952 /* Try the ORR alias. */
7953 opcode = aarch64_get_opcode (OP_MOV_IMM_LOG);
7954 aarch64_replace_opcode (instr, opcode);
3979cf50 7955 if (aarch64_opcode_encode (cpu_variant, instr->opcode, instr,
7e84b55d 7956 &instr->value, NULL, NULL, insn_sequence))
a06ea964
NC
7957 {
7958 put_aarch64_insn (buf, instr->value);
7959 return;
7960 }
7961 }
7962
7963 as_bad_where (fixP->fx_file, fixP->fx_line,
7964 _("immediate cannot be moved by a single instruction"));
7965}
7966
7967/* An instruction operand which is immediate related may have symbol used
7968 in the assembly, e.g.
7969
7970 mov w0, u32
7971 .set u32, 0x00ffff00
7972
7973 At the time when the assembly instruction is parsed, a referenced symbol,
7974 like 'u32' in the above example may not have been seen; a fixS is created
7975 in such a case and is handled here after symbols have been resolved.
7976 Instruction is fixed up with VALUE using the information in *FIXP plus
7977 extra information in FLAGS.
7978
7979 This function is called by md_apply_fix to fix up instructions that need
7980 a fix-up described above but does not involve any linker-time relocation. */
7981
7982static void
7983fix_insn (fixS *fixP, uint32_t flags, offsetT value)
7984{
7985 int idx;
7986 uint32_t insn;
7987 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
7988 enum aarch64_opnd opnd = fixP->tc_fix_data.opnd;
7989 aarch64_inst *new_inst = fixP->tc_fix_data.inst;
7990
7991 if (new_inst)
7992 {
7993 /* Now the instruction is about to be fixed-up, so the operand that
7994 was previously marked as 'ignored' needs to be unmarked in order
7995 to get the encoding done properly. */
7996 idx = aarch64_operand_index (new_inst->opcode->operands, opnd);
7997 new_inst->operands[idx].skip = 0;
7998 }
7999
8000 gas_assert (opnd != AARCH64_OPND_NIL);
8001
8002 switch (opnd)
8003 {
8004 case AARCH64_OPND_EXCEPTION:
09c1e68a 8005 case AARCH64_OPND_UNDEFINED:
a06ea964
NC
8006 if (unsigned_overflow (value, 16))
8007 as_bad_where (fixP->fx_file, fixP->fx_line,
8008 _("immediate out of range"));
8009 insn = get_aarch64_insn (buf);
09c1e68a 8010 insn |= (opnd == AARCH64_OPND_EXCEPTION) ? encode_svc_imm (value) : value;
a06ea964
NC
8011 put_aarch64_insn (buf, insn);
8012 break;
8013
8014 case AARCH64_OPND_AIMM:
dc64c2ba 8015 case AARCH64_OPND_A64C_AIMM:
a06ea964
NC
8016 /* ADD or SUB with immediate.
8017 NOTE this assumes we come here with a add/sub shifted reg encoding
8018 3 322|2222|2 2 2 21111 111111
8019 1 098|7654|3 2 1 09876 543210 98765 43210
8020 0b000000 sf 000|1011|shift 0 Rm imm6 Rn Rd ADD
8021 2b000000 sf 010|1011|shift 0 Rm imm6 Rn Rd ADDS
8022 4b000000 sf 100|1011|shift 0 Rm imm6 Rn Rd SUB
8023 6b000000 sf 110|1011|shift 0 Rm imm6 Rn Rd SUBS
8024 ->
8025 3 322|2222|2 2 221111111111
8026 1 098|7654|3 2 109876543210 98765 43210
8027 11000000 sf 001|0001|shift imm12 Rn Rd ADD
8028 31000000 sf 011|0001|shift imm12 Rn Rd ADDS
8029 51000000 sf 101|0001|shift imm12 Rn Rd SUB
8030 71000000 sf 111|0001|shift imm12 Rn Rd SUBS
8031 Fields sf Rn Rd are already set. */
8032 insn = get_aarch64_insn (buf);
8033 if (value < 0)
8034 {
8035 /* Add <-> sub. */
8036 insn = reencode_addsub_switch_add_sub (insn);
8037 value = -value;
8038 }
8039
8040 if ((flags & FIXUP_F_HAS_EXPLICIT_SHIFT) == 0
8041 && unsigned_overflow (value, 12))
8042 {
8043 /* Try to shift the value by 12 to make it fit. */
8044 if (((value >> 12) << 12) == value
8045 && ! unsigned_overflow (value, 12 + 12))
8046 {
8047 value >>= 12;
8048 insn |= encode_addsub_imm_shift_amount (1);
8049 }
8050 }
8051
8052 if (unsigned_overflow (value, 12))
8053 as_bad_where (fixP->fx_file, fixP->fx_line,
8054 _("immediate out of range"));
8055
8056 insn |= encode_addsub_imm (value);
8057
8058 put_aarch64_insn (buf, insn);
8059 break;
8060
8061 case AARCH64_OPND_SIMD_IMM:
8062 case AARCH64_OPND_SIMD_IMM_SFT:
8063 case AARCH64_OPND_LIMM:
8064 /* Bit mask immediate. */
8065 gas_assert (new_inst != NULL);
8066 idx = aarch64_operand_index (new_inst->opcode->operands, opnd);
8067 new_inst->operands[idx].imm.value = value;
3979cf50 8068 if (aarch64_opcode_encode (cpu_variant, new_inst->opcode, new_inst,
7e84b55d 8069 &new_inst->value, NULL, NULL, insn_sequence))
a06ea964
NC
8070 put_aarch64_insn (buf, new_inst->value);
8071 else
8072 as_bad_where (fixP->fx_file, fixP->fx_line,
8073 _("invalid immediate"));
8074 break;
8075
8076 case AARCH64_OPND_HALF:
8077 /* 16-bit unsigned immediate. */
8078 if (unsigned_overflow (value, 16))
8079 as_bad_where (fixP->fx_file, fixP->fx_line,
8080 _("immediate out of range"));
8081 insn = get_aarch64_insn (buf);
8082 insn |= encode_movw_imm (value & 0xffff);
8083 put_aarch64_insn (buf, insn);
8084 break;
8085
8086 case AARCH64_OPND_IMM_MOV:
8087 /* Operand for a generic move immediate instruction, which is
8088 an alias instruction that generates a single MOVZ, MOVN or ORR
8089 instruction to loads a 32-bit/64-bit immediate value into general
8090 register. An assembler error shall result if the immediate cannot be
8091 created by a single one of these instructions. If there is a choice,
8092 then to ensure reversability an assembler must prefer a MOVZ to MOVN,
8093 and MOVZ or MOVN to ORR. */
8094 gas_assert (new_inst != NULL);
8095 fix_mov_imm_insn (fixP, buf, new_inst, value);
8096 break;
8097
8098 case AARCH64_OPND_ADDR_SIMM7:
8099 case AARCH64_OPND_ADDR_SIMM9:
8100 case AARCH64_OPND_ADDR_SIMM9_2:
3f06e550 8101 case AARCH64_OPND_ADDR_SIMM10:
a06ea964 8102 case AARCH64_OPND_ADDR_UIMM12:
fb3265b3
SD
8103 case AARCH64_OPND_ADDR_SIMM11:
8104 case AARCH64_OPND_ADDR_SIMM13:
a06ea964
NC
8105 /* Immediate offset in an address. */
8106 insn = get_aarch64_insn (buf);
8107
8108 gas_assert (new_inst != NULL && new_inst->value == insn);
8109 gas_assert (new_inst->opcode->operands[1] == opnd
8110 || new_inst->opcode->operands[2] == opnd);
8111
8112 /* Get the index of the address operand. */
8113 if (new_inst->opcode->operands[1] == opnd)
8114 /* e.g. STR <Xt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}]. */
8115 idx = 1;
8116 else
8117 /* e.g. LDP <Qt1>, <Qt2>, [<Xn|SP>{, #<imm>}]. */
8118 idx = 2;
8119
8120 /* Update the resolved offset value. */
8121 new_inst->operands[idx].addr.offset.imm = value;
8122
8123 /* Encode/fix-up. */
3979cf50 8124 if (aarch64_opcode_encode (cpu_variant, new_inst->opcode, new_inst,
7e84b55d 8125 &new_inst->value, NULL, NULL, insn_sequence))
a06ea964
NC
8126 {
8127 put_aarch64_insn (buf, new_inst->value);
8128 break;
8129 }
8130 else if (new_inst->opcode->iclass == ldst_pos
8131 && try_to_encode_as_unscaled_ldst (new_inst))
8132 {
8133 put_aarch64_insn (buf, new_inst->value);
8134 break;
8135 }
8136
8137 as_bad_where (fixP->fx_file, fixP->fx_line,
8138 _("immediate offset out of range"));
8139 break;
8140
8141 default:
8142 gas_assert (0);
8143 as_fatal (_("unhandled operand code %d"), opnd);
8144 }
8145}
8146
8147/* Apply a fixup (fixP) to segment data, once it has been determined
8148 by our caller that we have all the info we need to fix it up.
8149
8150 Parameter valP is the pointer to the value of the bits. */
8151
8152void
8153md_apply_fix (fixS * fixP, valueT * valP, segT seg)
8154{
8155 offsetT value = *valP;
8156 uint32_t insn;
8157 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
8158 int scale;
8159 unsigned flags = fixP->fx_addnumber;
8160
8161 DEBUG_TRACE ("\n\n");
8162 DEBUG_TRACE ("~~~~~~~~~~~~~~~~~~~~~~~~~");
8163 DEBUG_TRACE ("Enter md_apply_fix");
8164
8165 gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
8166
8167 /* Note whether this will delete the relocation. */
8168
8169 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
8170 fixP->fx_done = 1;
8171
8172 /* Process the relocations. */
8173 switch (fixP->fx_r_type)
8174 {
8175 case BFD_RELOC_NONE:
8176 /* This will need to go in the object file. */
8177 fixP->fx_done = 0;
8178 break;
8179
8180 case BFD_RELOC_8:
8181 case BFD_RELOC_8_PCREL:
8182 if (fixP->fx_done || !seg->use_rela_p)
8183 md_number_to_chars (buf, value, 1);
8184 break;
8185
8186 case BFD_RELOC_16:
8187 case BFD_RELOC_16_PCREL:
8188 if (fixP->fx_done || !seg->use_rela_p)
8189 md_number_to_chars (buf, value, 2);
8190 break;
8191
8192 case BFD_RELOC_32:
8193 case BFD_RELOC_32_PCREL:
8194 if (fixP->fx_done || !seg->use_rela_p)
8195 md_number_to_chars (buf, value, 4);
8196 break;
8197
8198 case BFD_RELOC_64:
8199 case BFD_RELOC_64_PCREL:
8200 if (fixP->fx_done || !seg->use_rela_p)
8201 md_number_to_chars (buf, value, 8);
8202 break;
8203
8204 case BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP:
8205 /* We claim that these fixups have been processed here, even if
8206 in fact we generate an error because we do not have a reloc
8207 for them, so tc_gen_reloc() will reject them. */
8208 fixP->fx_done = 1;
8209 if (fixP->fx_addsy && !S_IS_DEFINED (fixP->fx_addsy))
8210 {
8211 as_bad_where (fixP->fx_file, fixP->fx_line,
8212 _("undefined symbol %s used as an immediate value"),
8213 S_GET_NAME (fixP->fx_addsy));
8214 goto apply_fix_return;
8215 }
8216 fix_insn (fixP, flags, value);
8217 break;
8218
8219 case BFD_RELOC_AARCH64_LD_LO19_PCREL:
a06ea964
NC
8220 if (fixP->fx_done || !seg->use_rela_p)
8221 {
89d2a2a3
MS
8222 if (value & 3)
8223 as_bad_where (fixP->fx_file, fixP->fx_line,
8224 _("pc-relative load offset not word aligned"));
8225 if (signed_overflow (value, 21))
8226 as_bad_where (fixP->fx_file, fixP->fx_line,
8227 _("pc-relative load offset out of range"));
a06ea964
NC
8228 insn = get_aarch64_insn (buf);
8229 insn |= encode_ld_lit_ofs_19 (value >> 2);
8230 put_aarch64_insn (buf, insn);
8231 }
8232 break;
8233
8234 case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
a06ea964
NC
8235 if (fixP->fx_done || !seg->use_rela_p)
8236 {
89d2a2a3
MS
8237 if (signed_overflow (value, 21))
8238 as_bad_where (fixP->fx_file, fixP->fx_line,
8239 _("pc-relative address offset out of range"));
a06ea964
NC
8240 insn = get_aarch64_insn (buf);
8241 insn |= encode_adr_imm (value);
8242 put_aarch64_insn (buf, insn);
8243 }
8244 break;
8245
8246 case BFD_RELOC_AARCH64_BRANCH19:
a06ea964
NC
8247 if (fixP->fx_done || !seg->use_rela_p)
8248 {
89d2a2a3
MS
8249 if (value & 3)
8250 as_bad_where (fixP->fx_file, fixP->fx_line,
8251 _("conditional branch target not word aligned"));
8252 if (signed_overflow (value, 21))
8253 as_bad_where (fixP->fx_file, fixP->fx_line,
8254 _("conditional branch out of range"));
a06ea964
NC
8255 insn = get_aarch64_insn (buf);
8256 insn |= encode_cond_branch_ofs_19 (value >> 2);
8257 put_aarch64_insn (buf, insn);
8258 }
8259 break;
8260
8261 case BFD_RELOC_AARCH64_TSTBR14:
a06ea964
NC
8262 if (fixP->fx_done || !seg->use_rela_p)
8263 {
89d2a2a3
MS
8264 if (value & 3)
8265 as_bad_where (fixP->fx_file, fixP->fx_line,
8266 _("conditional branch target not word aligned"));
8267 if (signed_overflow (value, 16))
8268 as_bad_where (fixP->fx_file, fixP->fx_line,
8269 _("conditional branch out of range"));
a06ea964
NC
8270 insn = get_aarch64_insn (buf);
8271 insn |= encode_tst_branch_ofs_14 (value >> 2);
8272 put_aarch64_insn (buf, insn);
8273 }
8274 break;
8275
a06ea964 8276 case BFD_RELOC_AARCH64_CALL26:
f09c556a 8277 case BFD_RELOC_AARCH64_JUMP26:
a06ea964
NC
8278 if (fixP->fx_done || !seg->use_rela_p)
8279 {
89d2a2a3
MS
8280 if (value & 3)
8281 as_bad_where (fixP->fx_file, fixP->fx_line,
8282 _("branch target not word aligned"));
8283 if (signed_overflow (value, 28))
8284 as_bad_where (fixP->fx_file, fixP->fx_line,
8285 _("branch out of range"));
a06ea964
NC
8286 insn = get_aarch64_insn (buf);
8287 insn |= encode_branch_ofs_26 (value >> 2);
8288 put_aarch64_insn (buf, insn);
8289 }
8290 break;
8291
8292 case BFD_RELOC_AARCH64_MOVW_G0:
a06ea964 8293 case BFD_RELOC_AARCH64_MOVW_G0_NC:
f09c556a 8294 case BFD_RELOC_AARCH64_MOVW_G0_S:
ca632371 8295 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
32247401
RL
8296 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
8297 case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
a06ea964
NC
8298 scale = 0;
8299 goto movw_common;
8300 case BFD_RELOC_AARCH64_MOVW_G1:
a06ea964 8301 case BFD_RELOC_AARCH64_MOVW_G1_NC:
f09c556a 8302 case BFD_RELOC_AARCH64_MOVW_G1_S:
654248e7 8303 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
32247401
RL
8304 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
8305 case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
a06ea964
NC
8306 scale = 16;
8307 goto movw_common;
43a357f9
RL
8308 case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
8309 scale = 0;
8310 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8311 /* Should always be exported to object file, see
8312 aarch64_force_relocation(). */
8313 gas_assert (!fixP->fx_done);
8314 gas_assert (seg->use_rela_p);
8315 goto movw_common;
8316 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
8317 scale = 16;
8318 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8319 /* Should always be exported to object file, see
8320 aarch64_force_relocation(). */
8321 gas_assert (!fixP->fx_done);
8322 gas_assert (seg->use_rela_p);
8323 goto movw_common;
a06ea964 8324 case BFD_RELOC_AARCH64_MOVW_G2:
a06ea964 8325 case BFD_RELOC_AARCH64_MOVW_G2_NC:
f09c556a 8326 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
8327 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
8328 case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
a06ea964
NC
8329 scale = 32;
8330 goto movw_common;
8331 case BFD_RELOC_AARCH64_MOVW_G3:
32247401 8332 case BFD_RELOC_AARCH64_MOVW_PREL_G3:
a06ea964
NC
8333 scale = 48;
8334 movw_common:
8335 if (fixP->fx_done || !seg->use_rela_p)
8336 {
8337 insn = get_aarch64_insn (buf);
8338
8339 if (!fixP->fx_done)
8340 {
8341 /* REL signed addend must fit in 16 bits */
8342 if (signed_overflow (value, 16))
8343 as_bad_where (fixP->fx_file, fixP->fx_line,
8344 _("offset out of range"));
8345 }
8346 else
8347 {
8348 /* Check for overflow and scale. */
8349 switch (fixP->fx_r_type)
8350 {
8351 case BFD_RELOC_AARCH64_MOVW_G0:
8352 case BFD_RELOC_AARCH64_MOVW_G1:
8353 case BFD_RELOC_AARCH64_MOVW_G2:
8354 case BFD_RELOC_AARCH64_MOVW_G3:
654248e7 8355 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
43a357f9 8356 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
a06ea964
NC
8357 if (unsigned_overflow (value, scale + 16))
8358 as_bad_where (fixP->fx_file, fixP->fx_line,
8359 _("unsigned value out of range"));
8360 break;
8361 case BFD_RELOC_AARCH64_MOVW_G0_S:
8362 case BFD_RELOC_AARCH64_MOVW_G1_S:
8363 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
8364 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
8365 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
8366 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
a06ea964
NC
8367 /* NOTE: We can only come here with movz or movn. */
8368 if (signed_overflow (value, scale + 16))
8369 as_bad_where (fixP->fx_file, fixP->fx_line,
8370 _("signed value out of range"));
8371 if (value < 0)
8372 {
8373 /* Force use of MOVN. */
8374 value = ~value;
8375 insn = reencode_movzn_to_movn (insn);
8376 }
8377 else
8378 {
8379 /* Force use of MOVZ. */
8380 insn = reencode_movzn_to_movz (insn);
8381 }
8382 break;
8383 default:
8384 /* Unchecked relocations. */
8385 break;
8386 }
8387 value >>= scale;
8388 }
8389
8390 /* Insert value into MOVN/MOVZ/MOVK instruction. */
8391 insn |= encode_movw_imm (value & 0xffff);
8392
8393 put_aarch64_insn (buf, insn);
8394 }
8395 break;
8396
a6bb11b2
YZ
8397 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC:
8398 fixP->fx_r_type = (ilp32_p
8399 ? BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC
8400 : BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC);
8401 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8402 /* Should always be exported to object file, see
8403 aarch64_force_relocation(). */
8404 gas_assert (!fixP->fx_done);
8405 gas_assert (seg->use_rela_p);
8406 break;
8407
8408 case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC:
8409 fixP->fx_r_type = (ilp32_p
8410 ? BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC
f955cccf 8411 : BFD_RELOC_AARCH64_TLSDESC_LD64_LO12);
a6bb11b2
YZ
8412 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8413 /* Should always be exported to object file, see
8414 aarch64_force_relocation(). */
8415 gas_assert (!fixP->fx_done);
8416 gas_assert (seg->use_rela_p);
8417 break;
8418
f955cccf 8419 case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
2c0a3565 8420 case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
389b8029 8421 case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
2c0a3565 8422 case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
f955cccf 8423 case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
1ada945d 8424 case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
a06ea964 8425 case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
2c0a3565 8426 case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
3c12b054 8427 case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
3e8286c0 8428 case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
1aa66fb1 8429 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
a06ea964 8430 case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
a6bb11b2 8431 case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
2c0a3565 8432 case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
043bf05a 8433 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
3b957e5b
RL
8434 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
8435 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
49df5539 8436 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12:
70151fb5 8437 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12:
13289c10 8438 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC:
a12fad50 8439 case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
1107e076 8440 case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6c37fedc 8441 case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
4c562523
JW
8442 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12:
8443 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
8444 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12:
8445 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
8446 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12:
8447 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
8448 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
8449 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
49df5539
JW
8450 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
8451 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
8452 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
8453 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
8454 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
84f1b9fb
RL
8455 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
8456 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
8457 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
8458 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
8459 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
8460 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
8461 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
8462 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
a06ea964 8463 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
2c0a3565 8464 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
a06ea964 8465 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
a06ea964
NC
8466 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
8467 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
2c0a3565
MS
8468 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
8469 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
8470 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
a06ea964
NC
8471 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8472 /* Should always be exported to object file, see
8473 aarch64_force_relocation(). */
8474 gas_assert (!fixP->fx_done);
8475 gas_assert (seg->use_rela_p);
8476 break;
8477
a6bb11b2
YZ
8478 case BFD_RELOC_AARCH64_LD_GOT_LO12_NC:
8479 /* Should always be exported to object file, see
8480 aarch64_force_relocation(). */
8481 fixP->fx_r_type = (ilp32_p
8482 ? BFD_RELOC_AARCH64_LD32_GOT_LO12_NC
8483 : BFD_RELOC_AARCH64_LD64_GOT_LO12_NC);
8484 gas_assert (!fixP->fx_done);
8485 gas_assert (seg->use_rela_p);
8486 break;
8487
a06ea964 8488 case BFD_RELOC_AARCH64_ADD_LO12:
f09c556a
JW
8489 case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
8490 case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
8491 case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
8492 case BFD_RELOC_AARCH64_GOT_LD_PREL19:
8493 case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
3d715ce4 8494 case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
87f5fbcc 8495 case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
a921b5bd 8496 case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
f09c556a
JW
8497 case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
8498 case BFD_RELOC_AARCH64_LDST128_LO12:
a06ea964
NC
8499 case BFD_RELOC_AARCH64_LDST16_LO12:
8500 case BFD_RELOC_AARCH64_LDST32_LO12:
8501 case BFD_RELOC_AARCH64_LDST64_LO12:
f09c556a 8502 case BFD_RELOC_AARCH64_LDST8_LO12:
a06ea964
NC
8503 /* Should always be exported to object file, see
8504 aarch64_force_relocation(). */
8505 gas_assert (!fixP->fx_done);
8506 gas_assert (seg->use_rela_p);
8507 break;
8508
8509 case BFD_RELOC_AARCH64_TLSDESC_ADD:
a06ea964 8510 case BFD_RELOC_AARCH64_TLSDESC_CALL:
f09c556a 8511 case BFD_RELOC_AARCH64_TLSDESC_LDR:
a06ea964
NC
8512 break;
8513
b97e87cc
NC
8514 case BFD_RELOC_UNUSED:
8515 /* An error will already have been reported. */
8516 break;
8517
a06ea964
NC
8518 default:
8519 as_bad_where (fixP->fx_file, fixP->fx_line,
8520 _("unexpected %s fixup"),
8521 bfd_get_reloc_code_name (fixP->fx_r_type));
8522 break;
8523 }
8524
dc1e8a47 8525 apply_fix_return:
a06ea964
NC
8526 /* Free the allocated the struct aarch64_inst.
8527 N.B. currently there are very limited number of fix-up types actually use
8528 this field, so the impact on the performance should be minimal . */
9fbb53c7 8529 free (fixP->tc_fix_data.inst);
a06ea964
NC
8530
8531 return;
8532}
8533
8534/* Translate internal representation of relocation info to BFD target
8535 format. */
8536
8537arelent *
8538tc_gen_reloc (asection * section, fixS * fixp)
8539{
8540 arelent *reloc;
8541 bfd_reloc_code_real_type code;
8542
325801bd 8543 reloc = XNEW (arelent);
a06ea964 8544
325801bd 8545 reloc->sym_ptr_ptr = XNEW (asymbol *);
a06ea964
NC
8546 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
8547 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
8548
8549 if (fixp->fx_pcrel)
8550 {
8551 if (section->use_rela_p)
8552 fixp->fx_offset -= md_pcrel_from_section (fixp, section);
8553 else
8554 fixp->fx_offset = reloc->address;
8555 }
8556 reloc->addend = fixp->fx_offset;
8557
8558 code = fixp->fx_r_type;
8559 switch (code)
8560 {
8561 case BFD_RELOC_16:
8562 if (fixp->fx_pcrel)
8563 code = BFD_RELOC_16_PCREL;
8564 break;
8565
8566 case BFD_RELOC_32:
8567 if (fixp->fx_pcrel)
8568 code = BFD_RELOC_32_PCREL;
8569 break;
8570
8571 case BFD_RELOC_64:
8572 if (fixp->fx_pcrel)
8573 code = BFD_RELOC_64_PCREL;
8574 break;
8575
8576 default:
8577 break;
8578 }
8579
8580 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
8581 if (reloc->howto == NULL)
8582 {
8583 as_bad_where (fixp->fx_file, fixp->fx_line,
8584 _
8585 ("cannot represent %s relocation in this object file format"),
8586 bfd_get_reloc_code_name (code));
8587 return NULL;
8588 }
8589
8590 return reloc;
8591}
8592
8593/* This fix_new is called by cons via TC_CONS_FIX_NEW. */
8594
8595void
8596cons_fix_new_aarch64 (fragS * frag, int where, int size, expressionS * exp)
8597{
8598 bfd_reloc_code_real_type type;
8599 int pcrel = 0;
8600
8601 /* Pick a reloc.
8602 FIXME: @@ Should look at CPU word size. */
8603 switch (size)
8604 {
8605 case 1:
8606 type = BFD_RELOC_8;
8607 break;
8608 case 2:
8609 type = BFD_RELOC_16;
8610 break;
8611 case 4:
8612 type = BFD_RELOC_32;
8613 break;
8614 case 8:
8615 type = BFD_RELOC_64;
8616 break;
8617 default:
8618 as_bad (_("cannot do %u-byte relocation"), size);
8619 type = BFD_RELOC_UNUSED;
8620 break;
8621 }
8622
8623 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
8624}
8625
8626int
8627aarch64_force_relocation (struct fix *fixp)
8628{
8629 switch (fixp->fx_r_type)
8630 {
8631 case BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP:
8632 /* Perform these "immediate" internal relocations
8633 even if the symbol is extern or weak. */
8634 return 0;
8635
a6bb11b2 8636 case BFD_RELOC_AARCH64_LD_GOT_LO12_NC:
f09c556a
JW
8637 case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC:
8638 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC:
a6bb11b2
YZ
8639 /* Pseudo relocs that need to be fixed up according to
8640 ilp32_p. */
8641 return 0;
8642
2c0a3565
MS
8643 case BFD_RELOC_AARCH64_ADD_LO12:
8644 case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
8645 case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
8646 case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
8647 case BFD_RELOC_AARCH64_GOT_LD_PREL19:
8648 case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
3d715ce4 8649 case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
87f5fbcc 8650 case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
a921b5bd 8651 case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
2c0a3565
MS
8652 case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
8653 case BFD_RELOC_AARCH64_LDST128_LO12:
8654 case BFD_RELOC_AARCH64_LDST16_LO12:
8655 case BFD_RELOC_AARCH64_LDST32_LO12:
8656 case BFD_RELOC_AARCH64_LDST64_LO12:
8657 case BFD_RELOC_AARCH64_LDST8_LO12:
f955cccf 8658 case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
2c0a3565 8659 case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
389b8029 8660 case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
2c0a3565 8661 case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
f955cccf 8662 case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
1ada945d 8663 case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
43a357f9
RL
8664 case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
8665 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
a06ea964 8666 case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
2c0a3565 8667 case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
3c12b054 8668 case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
3e8286c0 8669 case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
1aa66fb1 8670 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
a06ea964 8671 case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
a6bb11b2 8672 case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
2c0a3565 8673 case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
043bf05a 8674 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
3b957e5b
RL
8675 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
8676 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
8677 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12:
70151fb5 8678 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12:
13289c10 8679 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC:
a12fad50 8680 case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
1107e076 8681 case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6c37fedc 8682 case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
4c562523
JW
8683 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12:
8684 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
8685 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12:
8686 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
8687 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12:
8688 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
8689 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
8690 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
49df5539
JW
8691 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
8692 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
8693 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
8694 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
8695 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
84f1b9fb
RL
8696 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
8697 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
8698 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
8699 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
8700 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
8701 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
8702 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
8703 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
a06ea964 8704 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
2c0a3565 8705 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
a06ea964 8706 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
a06ea964
NC
8707 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
8708 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
2c0a3565
MS
8709 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
8710 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
8711 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
a06ea964
NC
8712 /* Always leave these relocations for the linker. */
8713 return 1;
8714
f0070c1e
SP
8715 case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
8716 case BFD_RELOC_AARCH64_BRANCH19:
8717 case BFD_RELOC_AARCH64_TSTBR14:
8718 case BFD_RELOC_AARCH64_CALL26:
8719 case BFD_RELOC_AARCH64_JUMP26:
8720 gas_assert (fixp->fx_addsy != NULL);
8721
8722 /* A jump/call destination will get adjusted to section+offset only
8723 if both caller and callee are of the same type. */
8724 if (symbol_section_p (fixp->fx_addsy))
8725 break;
8726
8727 if ((fixp->tc_fix_data.c64
8728 && !AARCH64_IS_C64 (fixp->fx_addsy))
8729 || (!fixp->tc_fix_data.c64
8730 && AARCH64_IS_C64 (fixp->fx_addsy)))
8731 return 1;
8732
8733 break;
8734
a06ea964
NC
8735 default:
8736 break;
8737 }
8738
8739 return generic_force_reloc (fixp);
8740}
8741
8742#ifdef OBJ_ELF
8743
3c0367d0
JW
8744/* Implement md_after_parse_args. This is the earliest time we need to decide
8745 ABI. If no -mabi specified, the ABI will be decided by target triplet. */
8746
8747void
8748aarch64_after_parse_args (void)
8749{
8750 if (aarch64_abi != AARCH64_ABI_NONE)
8751 return;
8752
8753 /* DEFAULT_ARCH will have ":32" extension if it's configured for ILP32. */
8754 if (strlen (default_arch) > 7 && strcmp (default_arch + 7, ":32") == 0)
8755 aarch64_abi = AARCH64_ABI_ILP32;
8756 else
8757 aarch64_abi = AARCH64_ABI_LP64;
8758}
8759
a06ea964
NC
8760const char *
8761elf64_aarch64_target_format (void)
8762{
12400dcc
AM
8763#ifdef TE_CLOUDABI
8764 /* FIXME: What to do for ilp32_p ? */
8765 if (target_big_endian)
8766 return "elf64-bigaarch64-cloudabi";
8767 else
8768 return "elf64-littleaarch64-cloudabi";
8769#else
a06ea964 8770 if (target_big_endian)
cec5225b 8771 return ilp32_p ? "elf32-bigaarch64" : "elf64-bigaarch64";
a06ea964 8772 else
cec5225b 8773 return ilp32_p ? "elf32-littleaarch64" : "elf64-littleaarch64";
12400dcc 8774#endif
a06ea964
NC
8775}
8776
8777void
8778aarch64elf_frob_symbol (symbolS * symp, int *puntp)
8779{
8780 elf_frob_symbol (symp, puntp);
8781}
8782#endif
8783
8784/* MD interface: Finalization. */
8785
8786/* A good place to do this, although this was probably not intended
8787 for this kind of use. We need to dump the literal pool before
8788 references are made to a null symbol pointer. */
8789
8790void
8791aarch64_cleanup (void)
8792{
8793 literal_pool *pool;
8794
8795 for (pool = list_of_pools; pool; pool = pool->next)
8796 {
8797 /* Put it at the end of the relevant section. */
8798 subseg_set (pool->section, pool->sub_section);
8799 s_ltorg (0);
8800 }
8801}
8802
8803#ifdef OBJ_ELF
8804/* Remove any excess mapping symbols generated for alignment frags in
8805 SEC. We may have created a mapping symbol before a zero byte
8806 alignment; remove it if there's a mapping symbol after the
8807 alignment. */
8808static void
8809check_mapping_symbols (bfd * abfd ATTRIBUTE_UNUSED, asection * sec,
8810 void *dummy ATTRIBUTE_UNUSED)
8811{
8812 segment_info_type *seginfo = seg_info (sec);
8813 fragS *fragp;
8814
8815 if (seginfo == NULL || seginfo->frchainP == NULL)
8816 return;
8817
8818 for (fragp = seginfo->frchainP->frch_root;
8819 fragp != NULL; fragp = fragp->fr_next)
8820 {
8821 symbolS *sym = fragp->tc_frag_data.last_map;
8822 fragS *next = fragp->fr_next;
8823
8824 /* Variable-sized frags have been converted to fixed size by
8825 this point. But if this was variable-sized to start with,
8826 there will be a fixed-size frag after it. So don't handle
8827 next == NULL. */
8828 if (sym == NULL || next == NULL)
8829 continue;
8830
8831 if (S_GET_VALUE (sym) < next->fr_address)
8832 /* Not at the end of this frag. */
8833 continue;
8834 know (S_GET_VALUE (sym) == next->fr_address);
8835
8836 do
8837 {
8838 if (next->tc_frag_data.first_map != NULL)
8839 {
8840 /* Next frag starts with a mapping symbol. Discard this
8841 one. */
8842 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
8843 break;
8844 }
8845
8846 if (next->fr_next == NULL)
8847 {
8848 /* This mapping symbol is at the end of the section. Discard
8849 it. */
8850 know (next->fr_fix == 0 && next->fr_var == 0);
8851 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
8852 break;
8853 }
8854
8855 /* As long as we have empty frags without any mapping symbols,
8856 keep looking. */
8857 /* If the next frag is non-empty and does not start with a
8858 mapping symbol, then this mapping symbol is required. */
8859 if (next->fr_address != next->fr_next->fr_address)
8860 break;
8861
8862 next = next->fr_next;
8863 }
8864 while (next != NULL);
8865 }
8866}
8867#endif
8868
8b21361b
SP
8869/* Avoid relocations from using section symbols in some cases. */
8870bfd_boolean
8871aarch64_fix_adjustable (struct fix *fixP)
8872{
8873 switch (fixP->fx_r_type)
8874 {
f0070c1e
SP
8875 /* We need to retain symbol information when jumping between A64 and C64
8876 states or between two C64 functions. In the C64 -> C64 situation it's
8877 really only a corner case that breaks when symbols get replaced with
8878 section symbols; this is when the jump distance is longer than what a
8879 branch instruction can handle and we want to branch through a stub.
8880 In such a case, the linker needs to know the symbol types of the
8881 source and the destination and section symbols are an unreliable
8882 source of this information. */
8b21361b
SP
8883 case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
8884 case BFD_RELOC_AARCH64_ADD_LO12:
8885 case BFD_RELOC_AARCH64_BRANCH19:
8886 case BFD_RELOC_AARCH64_TSTBR14:
8887 case BFD_RELOC_AARCH64_JUMP26:
8888 case BFD_RELOC_AARCH64_CALL26:
f0070c1e 8889 if (fixP->tc_fix_data.c64 || AARCH64_IS_C64 (fixP->fx_addsy))
8b21361b
SP
8890 return FALSE;
8891 break;
8892 default:
8893 break;
8894 }
8895
8896 return TRUE;
8897}
8898
a06ea964
NC
8899/* Adjust the symbol table. */
8900
8901void
8902aarch64_adjust_symtab (void)
8903{
8904#ifdef OBJ_ELF
8b21361b
SP
8905 symbolS * sym;
8906
8907 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
8908 {
8909 if (AARCH64_IS_C64 (sym)
8910 && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION))
8911 {
8912 elf_symbol_type * elf_sym;
8913
8914 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
8915
8916 if (!bfd_is_aarch64_special_symbol_name
8917 (elf_sym->symbol.name, BFD_AARCH64_SPECIAL_SYM_TYPE_ANY))
8918 elf_sym->internal_elf_sym.st_target_internal = ST_BRANCH_TO_C64;
8919 }
8920 }
8921
a06ea964
NC
8922 /* Remove any overlapping mapping symbols generated by alignment frags. */
8923 bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
8924 /* Now do generic ELF adjustments. */
8925 elf_adjust_symtab ();
8926#endif
8927}
8928
8929static void
629310ab 8930checked_hash_insert (htab_t table, const char *key, void *value)
a06ea964 8931{
fe0e921f 8932 str_hash_insert (table, key, value, 0);
a06ea964
NC
8933}
8934
fa63795f 8935static void
629310ab 8936sysreg_hash_insert (htab_t table, const char *key, void *value)
fa63795f
AC
8937{
8938 gas_assert (strlen (key) < AARCH64_MAX_SYSREG_NAME_LEN);
8939 checked_hash_insert (table, key, value);
8940}
8941
a06ea964
NC
8942static void
8943fill_instruction_hash_table (void)
8944{
8945 aarch64_opcode *opcode = aarch64_opcode_table;
8946
8947 while (opcode->name != NULL)
8948 {
8949 templates *templ, *new_templ;
629310ab 8950 templ = str_hash_find (aarch64_ops_hsh, opcode->name);
a06ea964 8951
add39d23 8952 new_templ = XNEW (templates);
a06ea964
NC
8953 new_templ->opcode = opcode;
8954 new_templ->next = NULL;
8955
8956 if (!templ)
8957 checked_hash_insert (aarch64_ops_hsh, opcode->name, (void *) new_templ);
8958 else
8959 {
8960 new_templ->next = templ->next;
8961 templ->next = new_templ;
8962 }
8963 ++opcode;
8964 }
8965}
8966
8967static inline void
8968convert_to_upper (char *dst, const char *src, size_t num)
8969{
8970 unsigned int i;
8971 for (i = 0; i < num && *src != '\0'; ++i, ++dst, ++src)
8972 *dst = TOUPPER (*src);
8973 *dst = '\0';
8974}
8975
8976/* Assume STR point to a lower-case string, allocate, convert and return
8977 the corresponding upper-case string. */
8978static inline const char*
8979get_upper_str (const char *str)
8980{
8981 char *ret;
8982 size_t len = strlen (str);
325801bd 8983 ret = XNEWVEC (char, len + 1);
a06ea964
NC
8984 convert_to_upper (ret, str, len);
8985 return ret;
8986}
8987
8988/* MD interface: Initialization. */
8989
8990void
8991md_begin (void)
8992{
8993 unsigned mach;
8994 unsigned int i;
8995
f16c3d4f
AM
8996 aarch64_ops_hsh = str_htab_create ();
8997 aarch64_cond_hsh = str_htab_create ();
8998 aarch64_shift_hsh = str_htab_create ();
8999 aarch64_sys_regs_hsh = str_htab_create ();
9000 aarch64_pstatefield_hsh = str_htab_create ();
9001 aarch64_sys_regs_ic_hsh = str_htab_create ();
9002 aarch64_sys_regs_dc_hsh = str_htab_create ();
9003 aarch64_sys_regs_at_hsh = str_htab_create ();
9004 aarch64_sys_regs_tlbi_hsh = str_htab_create ();
9005 aarch64_sys_regs_sr_hsh = str_htab_create ();
9006 aarch64_reg_hsh = str_htab_create ();
9007 aarch64_barrier_opt_hsh = str_htab_create ();
9008 aarch64_nzcv_hsh = str_htab_create ();
9009 aarch64_pldop_hsh = str_htab_create ();
9010 aarch64_hint_opt_hsh = str_htab_create ();
a06ea964
NC
9011
9012 fill_instruction_hash_table ();
9013
9014 for (i = 0; aarch64_sys_regs[i].name != NULL; ++i)
fa63795f 9015 sysreg_hash_insert (aarch64_sys_regs_hsh, aarch64_sys_regs[i].name,
a06ea964
NC
9016 (void *) (aarch64_sys_regs + i));
9017
9018 for (i = 0; aarch64_pstatefields[i].name != NULL; ++i)
fa63795f 9019 sysreg_hash_insert (aarch64_pstatefield_hsh,
a06ea964
NC
9020 aarch64_pstatefields[i].name,
9021 (void *) (aarch64_pstatefields + i));
9022
875880c6 9023 for (i = 0; aarch64_sys_regs_ic[i].name != NULL; i++)
fa63795f 9024 sysreg_hash_insert (aarch64_sys_regs_ic_hsh,
875880c6 9025 aarch64_sys_regs_ic[i].name,
a06ea964
NC
9026 (void *) (aarch64_sys_regs_ic + i));
9027
875880c6 9028 for (i = 0; aarch64_sys_regs_dc[i].name != NULL; i++)
fa63795f 9029 sysreg_hash_insert (aarch64_sys_regs_dc_hsh,
875880c6 9030 aarch64_sys_regs_dc[i].name,
a06ea964
NC
9031 (void *) (aarch64_sys_regs_dc + i));
9032
875880c6 9033 for (i = 0; aarch64_sys_regs_at[i].name != NULL; i++)
fa63795f 9034 sysreg_hash_insert (aarch64_sys_regs_at_hsh,
875880c6 9035 aarch64_sys_regs_at[i].name,
a06ea964
NC
9036 (void *) (aarch64_sys_regs_at + i));
9037
875880c6 9038 for (i = 0; aarch64_sys_regs_tlbi[i].name != NULL; i++)
fa63795f 9039 sysreg_hash_insert (aarch64_sys_regs_tlbi_hsh,
875880c6 9040 aarch64_sys_regs_tlbi[i].name,
a06ea964
NC
9041 (void *) (aarch64_sys_regs_tlbi + i));
9042
2ac435d4 9043 for (i = 0; aarch64_sys_regs_sr[i].name != NULL; i++)
fa63795f 9044 sysreg_hash_insert (aarch64_sys_regs_sr_hsh,
2ac435d4
SD
9045 aarch64_sys_regs_sr[i].name,
9046 (void *) (aarch64_sys_regs_sr + i));
9047
a06ea964
NC
9048 for (i = 0; i < ARRAY_SIZE (reg_names); i++)
9049 checked_hash_insert (aarch64_reg_hsh, reg_names[i].name,
9050 (void *) (reg_names + i));
9051
9052 for (i = 0; i < ARRAY_SIZE (nzcv_names); i++)
9053 checked_hash_insert (aarch64_nzcv_hsh, nzcv_names[i].template,
9054 (void *) (nzcv_names + i));
9055
9056 for (i = 0; aarch64_operand_modifiers[i].name != NULL; i++)
9057 {
9058 const char *name = aarch64_operand_modifiers[i].name;
9059 checked_hash_insert (aarch64_shift_hsh, name,
9060 (void *) (aarch64_operand_modifiers + i));
9061 /* Also hash the name in the upper case. */
9062 checked_hash_insert (aarch64_shift_hsh, get_upper_str (name),
9063 (void *) (aarch64_operand_modifiers + i));
9064 }
9065
9066 for (i = 0; i < ARRAY_SIZE (aarch64_conds); i++)
9067 {
9068 unsigned int j;
9069 /* A condition code may have alias(es), e.g. "cc", "lo" and "ul" are
9070 the same condition code. */
9071 for (j = 0; j < ARRAY_SIZE (aarch64_conds[i].names); ++j)
9072 {
9073 const char *name = aarch64_conds[i].names[j];
9074 if (name == NULL)
9075 break;
9076 checked_hash_insert (aarch64_cond_hsh, name,
9077 (void *) (aarch64_conds + i));
9078 /* Also hash the name in the upper case. */
9079 checked_hash_insert (aarch64_cond_hsh, get_upper_str (name),
9080 (void *) (aarch64_conds + i));
9081 }
9082 }
9083
9084 for (i = 0; i < ARRAY_SIZE (aarch64_barrier_options); i++)
9085 {
9086 const char *name = aarch64_barrier_options[i].name;
9087 /* Skip xx00 - the unallocated values of option. */
9088 if ((i & 0x3) == 0)
9089 continue;
9090 checked_hash_insert (aarch64_barrier_opt_hsh, name,
9091 (void *) (aarch64_barrier_options + i));
9092 /* Also hash the name in the upper case. */
9093 checked_hash_insert (aarch64_barrier_opt_hsh, get_upper_str (name),
9094 (void *) (aarch64_barrier_options + i));
9095 }
9096
9097 for (i = 0; i < ARRAY_SIZE (aarch64_prfops); i++)
9098 {
9099 const char* name = aarch64_prfops[i].name;
a1ccaec9
YZ
9100 /* Skip the unallocated hint encodings. */
9101 if (name == NULL)
a06ea964
NC
9102 continue;
9103 checked_hash_insert (aarch64_pldop_hsh, name,
9104 (void *) (aarch64_prfops + i));
9105 /* Also hash the name in the upper case. */
9106 checked_hash_insert (aarch64_pldop_hsh, get_upper_str (name),
9107 (void *) (aarch64_prfops + i));
9108 }
9109
1e6f4800
MW
9110 for (i = 0; aarch64_hint_options[i].name != NULL; i++)
9111 {
9112 const char* name = aarch64_hint_options[i].name;
0a821c4f 9113 const char* upper_name = get_upper_str(name);
1e6f4800
MW
9114
9115 checked_hash_insert (aarch64_hint_opt_hsh, name,
9116 (void *) (aarch64_hint_options + i));
0a821c4f
AP
9117
9118 /* Also hash the name in the upper case if not the same. */
9119 if (strcmp (name, upper_name) != 0)
9120 checked_hash_insert (aarch64_hint_opt_hsh, upper_name,
9121 (void *) (aarch64_hint_options + i));
1e6f4800
MW
9122 }
9123
a06ea964
NC
9124 /* Set the cpu variant based on the command-line options. */
9125 if (!mcpu_cpu_opt)
9126 mcpu_cpu_opt = march_cpu_opt;
9127
9128 if (!mcpu_cpu_opt)
9129 mcpu_cpu_opt = &cpu_default;
9130
9131 cpu_variant = *mcpu_cpu_opt;
9132
9133 /* Record the CPU type. */
cec5225b 9134 mach = ilp32_p ? bfd_mach_aarch64_ilp32 : bfd_mach_aarch64;
a06ea964
NC
9135
9136 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
9137}
9138
9139/* Command line processing. */
9140
9141const char *md_shortopts = "m:";
9142
9143#ifdef AARCH64_BI_ENDIAN
9144#define OPTION_EB (OPTION_MD_BASE + 0)
9145#define OPTION_EL (OPTION_MD_BASE + 1)
9146#else
9147#if TARGET_BYTES_BIG_ENDIAN
9148#define OPTION_EB (OPTION_MD_BASE + 0)
9149#else
9150#define OPTION_EL (OPTION_MD_BASE + 1)
9151#endif
9152#endif
9153
9154struct option md_longopts[] = {
9155#ifdef OPTION_EB
9156 {"EB", no_argument, NULL, OPTION_EB},
9157#endif
9158#ifdef OPTION_EL
9159 {"EL", no_argument, NULL, OPTION_EL},
9160#endif
9161 {NULL, no_argument, NULL, 0}
9162};
9163
9164size_t md_longopts_size = sizeof (md_longopts);
9165
9166struct aarch64_option_table
9167{
e0471c16
TS
9168 const char *option; /* Option name to match. */
9169 const char *help; /* Help information. */
a06ea964
NC
9170 int *var; /* Variable to change. */
9171 int value; /* What to change it to. */
9172 char *deprecated; /* If non-null, print this message. */
9173};
9174
9175static struct aarch64_option_table aarch64_opts[] = {
9176 {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
9177 {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
9178 NULL},
9179#ifdef DEBUG_AARCH64
9180 {"mdebug-dump", N_("temporary switch for dumping"), &debug_dump, 1, NULL},
9181#endif /* DEBUG_AARCH64 */
9182 {"mverbose-error", N_("output verbose error messages"), &verbose_error_p, 1,
9183 NULL},
a52e6fd3
YZ
9184 {"mno-verbose-error", N_("do not output verbose error messages"),
9185 &verbose_error_p, 0, NULL},
a06ea964
NC
9186 {NULL, NULL, NULL, 0, NULL}
9187};
9188
9189struct aarch64_cpu_option_table
9190{
e0471c16 9191 const char *name;
a06ea964
NC
9192 const aarch64_feature_set value;
9193 /* The canonical name of the CPU, or NULL to use NAME converted to upper
9194 case. */
9195 const char *canonical_name;
9196};
9197
9198/* This list should, at a minimum, contain all the cpu names
9199 recognized by GCC. */
9200static const struct aarch64_cpu_option_table aarch64_cpus[] = {
9201 {"all", AARCH64_ANY, NULL},
546053ac
DZ
9202 {"cortex-a34", AARCH64_FEATURE (AARCH64_ARCH_V8,
9203 AARCH64_FEATURE_CRC), "Cortex-A34"},
9c352f1c
JG
9204 {"cortex-a35", AARCH64_FEATURE (AARCH64_ARCH_V8,
9205 AARCH64_FEATURE_CRC), "Cortex-A35"},
aa31c464
JW
9206 {"cortex-a53", AARCH64_FEATURE (AARCH64_ARCH_V8,
9207 AARCH64_FEATURE_CRC), "Cortex-A53"},
9208 {"cortex-a57", AARCH64_FEATURE (AARCH64_ARCH_V8,
9209 AARCH64_FEATURE_CRC), "Cortex-A57"},
2abdd192
JW
9210 {"cortex-a72", AARCH64_FEATURE (AARCH64_ARCH_V8,
9211 AARCH64_FEATURE_CRC), "Cortex-A72"},
1aa70332
KT
9212 {"cortex-a73", AARCH64_FEATURE (AARCH64_ARCH_V8,
9213 AARCH64_FEATURE_CRC), "Cortex-A73"},
1e292627 9214 {"cortex-a55", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
1c5c938a 9215 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16 | AARCH64_FEATURE_DOTPROD),
1e292627
JG
9216 "Cortex-A55"},
9217 {"cortex-a75", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
1c5c938a 9218 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16 | AARCH64_FEATURE_DOTPROD),
1e292627 9219 "Cortex-A75"},
c2a0f929 9220 {"cortex-a76", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9221 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16 | AARCH64_FEATURE_DOTPROD),
9222 "Cortex-A76"},
546053ac
DZ
9223 {"cortex-a76ae", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9224 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9225 | AARCH64_FEATURE_DOTPROD
9226 | AARCH64_FEATURE_SSBS),
9227 "Cortex-A76AE"},
9228 {"cortex-a77", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9229 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9230 | AARCH64_FEATURE_DOTPROD
9231 | AARCH64_FEATURE_SSBS),
9232 "Cortex-A77"},
9233 {"cortex-a65", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9234 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9235 | AARCH64_FEATURE_DOTPROD
9236 | AARCH64_FEATURE_SSBS),
9237 "Cortex-A65"},
9238 {"cortex-a65ae", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9239 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9240 | AARCH64_FEATURE_DOTPROD
9241 | AARCH64_FEATURE_SSBS),
9242 "Cortex-A65AE"},
77718e5b
PW
9243 {"cortex-a78", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9244 AARCH64_FEATURE_F16
9245 | AARCH64_FEATURE_RCPC
9246 | AARCH64_FEATURE_DOTPROD
9247 | AARCH64_FEATURE_SSBS
9248 | AARCH64_FEATURE_PROFILE),
9249 "Cortex-A78"},
9250 {"cortex-a78ae", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9251 AARCH64_FEATURE_F16
9252 | AARCH64_FEATURE_RCPC
9253 | AARCH64_FEATURE_DOTPROD
9254 | AARCH64_FEATURE_SSBS
9255 | AARCH64_FEATURE_PROFILE),
9256 "Cortex-A78AE"},
c8fcc360
KT
9257 {"ares", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9258 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16
9259 | AARCH64_FEATURE_DOTPROD
9260 | AARCH64_FEATURE_PROFILE),
9261 "Ares"},
2412d878
EM
9262 {"exynos-m1", AARCH64_FEATURE (AARCH64_ARCH_V8,
9263 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO),
9264 "Samsung Exynos M1"},
2fe9c2a0 9265 {"falkor", AARCH64_FEATURE (AARCH64_ARCH_V8,
e58ff055
JW
9266 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO
9267 | AARCH64_FEATURE_RDMA),
2fe9c2a0 9268 "Qualcomm Falkor"},
516dbc44
KT
9269 {"neoverse-e1", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9270 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16
9271 | AARCH64_FEATURE_DOTPROD
9272 | AARCH64_FEATURE_SSBS),
9273 "Neoverse E1"},
38e75bf2
KT
9274 {"neoverse-n1", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9275 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16
9276 | AARCH64_FEATURE_DOTPROD
9277 | AARCH64_FEATURE_PROFILE),
9278 "Neoverse N1"},
990e5268
AC
9279 {"neoverse-n2", AARCH64_FEATURE (AARCH64_ARCH_V8_5,
9280 AARCH64_FEATURE_BFLOAT16
9281 | AARCH64_FEATURE_I8MM
9282 | AARCH64_FEATURE_F16
9283 | AARCH64_FEATURE_SVE
9284 | AARCH64_FEATURE_SVE2
9285 | AARCH64_FEATURE_SVE2_BITPERM
9286 | AARCH64_FEATURE_MEMTAG
9287 | AARCH64_FEATURE_RNG),
9288 "Neoverse N2"},
c769fd6a
AC
9289 {"neoverse-v1", AARCH64_FEATURE (AARCH64_ARCH_V8_4,
9290 AARCH64_FEATURE_PROFILE
9291 | AARCH64_FEATURE_CVADP
9292 | AARCH64_FEATURE_SVE
9293 | AARCH64_FEATURE_SSBS
9294 | AARCH64_FEATURE_RNG
9295 | AARCH64_FEATURE_F16
9296 | AARCH64_FEATURE_BFLOAT16
9297 | AARCH64_FEATURE_I8MM), "Neoverse V1"},
6b21c2bf 9298 {"qdf24xx", AARCH64_FEATURE (AARCH64_ARCH_V8,
e58ff055
JW
9299 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO
9300 | AARCH64_FEATURE_RDMA),
6b21c2bf 9301 "Qualcomm QDF24XX"},
eb5c42e5 9302 {"saphira", AARCH64_FEATURE (AARCH64_ARCH_V8_4,
7605d944
SP
9303 AARCH64_FEATURE_CRYPTO | AARCH64_FEATURE_PROFILE),
9304 "Qualcomm Saphira"},
faade851
JW
9305 {"thunderx", AARCH64_FEATURE (AARCH64_ARCH_V8,
9306 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO),
9307 "Cavium ThunderX"},
9f99c22e
VP
9308 {"vulcan", AARCH64_FEATURE (AARCH64_ARCH_V8_1,
9309 AARCH64_FEATURE_CRYPTO),
0a8be2fe 9310 "Broadcom Vulcan"},
070cb956
PT
9311 /* The 'xgene-1' name is an older name for 'xgene1', which was used
9312 in earlier releases and is superseded by 'xgene1' in all
9313 tools. */
9877c63c 9314 {"xgene-1", AARCH64_ARCH_V8, "APM X-Gene 1"},
070cb956 9315 {"xgene1", AARCH64_ARCH_V8, "APM X-Gene 1"},
aa31c464
JW
9316 {"xgene2", AARCH64_FEATURE (AARCH64_ARCH_V8,
9317 AARCH64_FEATURE_CRC), "APM X-Gene 2"},
f1363b0f 9318 {"cortex-r82", AARCH64_ARCH_V8_R, "Cortex-R82"},
47e1f9de 9319 {"cortex-x1", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
f9b1d75e
PW
9320 AARCH64_FEATURE_F16
9321 | AARCH64_FEATURE_RCPC
9322 | AARCH64_FEATURE_DOTPROD
9323 | AARCH64_FEATURE_SSBS
9324 | AARCH64_FEATURE_PROFILE),
9325 "Cortex-X1"},
a06ea964
NC
9326 {"generic", AARCH64_ARCH_V8, NULL},
9327
a06ea964
NC
9328 {NULL, AARCH64_ARCH_NONE, NULL}
9329};
9330
9331struct aarch64_arch_option_table
9332{
e0471c16 9333 const char *name;
a06ea964
NC
9334 const aarch64_feature_set value;
9335};
9336
9337/* This list should, at a minimum, contain all the architecture names
9338 recognized by GCC. */
9339static const struct aarch64_arch_option_table aarch64_archs[] = {
9340 {"all", AARCH64_ANY},
5a1ad39d 9341 {"armv8-a", AARCH64_ARCH_V8},
88f0ea34 9342 {"armv8.1-a", AARCH64_ARCH_V8_1},
acb787b0 9343 {"armv8.2-a", AARCH64_ARCH_V8_2},
1924ff75 9344 {"armv8.3-a", AARCH64_ARCH_V8_3},
b6b9ca0c 9345 {"armv8.4-a", AARCH64_ARCH_V8_4},
70d56181 9346 {"armv8.5-a", AARCH64_ARCH_V8_5},
8ae2d3d9 9347 {"armv8.6-a", AARCH64_ARCH_V8_6},
95830c98 9348 {"armv8-r", AARCH64_ARCH_V8_R},
3493da5c 9349 {"morello", AARCH64_ARCH_MORELLO},
a06ea964
NC
9350 {NULL, AARCH64_ARCH_NONE}
9351};
9352
9353/* ISA extensions. */
9354struct aarch64_option_cpu_value_table
9355{
e0471c16 9356 const char *name;
a06ea964 9357 const aarch64_feature_set value;
93d8990c 9358 const aarch64_feature_set require; /* Feature dependencies. */
a06ea964
NC
9359};
9360
9361static const struct aarch64_option_cpu_value_table aarch64_features[] = {
93d8990c
SN
9362 {"crc", AARCH64_FEATURE (AARCH64_FEATURE_CRC, 0),
9363 AARCH64_ARCH_NONE},
2dc4b12f 9364 {"crypto", AARCH64_FEATURE (AARCH64_FEATURE_CRYPTO, 0),
fa09f4ea 9365 AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0)},
93d8990c
SN
9366 {"fp", AARCH64_FEATURE (AARCH64_FEATURE_FP, 0),
9367 AARCH64_ARCH_NONE},
9368 {"lse", AARCH64_FEATURE (AARCH64_FEATURE_LSE, 0),
9369 AARCH64_ARCH_NONE},
9370 {"simd", AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0),
fa09f4ea 9371 AARCH64_FEATURE (AARCH64_FEATURE_FP, 0)},
93d8990c
SN
9372 {"pan", AARCH64_FEATURE (AARCH64_FEATURE_PAN, 0),
9373 AARCH64_ARCH_NONE},
9374 {"lor", AARCH64_FEATURE (AARCH64_FEATURE_LOR, 0),
9375 AARCH64_ARCH_NONE},
9376 {"ras", AARCH64_FEATURE (AARCH64_FEATURE_RAS, 0),
9377 AARCH64_ARCH_NONE},
9378 {"rdma", AARCH64_FEATURE (AARCH64_FEATURE_RDMA, 0),
9379 AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0)},
9380 {"fp16", AARCH64_FEATURE (AARCH64_FEATURE_F16, 0),
9381 AARCH64_FEATURE (AARCH64_FEATURE_FP, 0)},
d0f7791c
TC
9382 {"fp16fml", AARCH64_FEATURE (AARCH64_FEATURE_F16_FML, 0),
9383 AARCH64_FEATURE (AARCH64_FEATURE_FP
9384 | AARCH64_FEATURE_F16, 0)},
93d8990c
SN
9385 {"profile", AARCH64_FEATURE (AARCH64_FEATURE_PROFILE, 0),
9386 AARCH64_ARCH_NONE},
c0890d26 9387 {"sve", AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0),
582e12bf
RS
9388 AARCH64_FEATURE (AARCH64_FEATURE_F16
9389 | AARCH64_FEATURE_SIMD
9390 | AARCH64_FEATURE_COMPNUM, 0)},
b83b4b13
SD
9391 {"tme", AARCH64_FEATURE (AARCH64_FEATURE_TME, 0),
9392 AARCH64_ARCH_NONE},
f482d304
RS
9393 {"compnum", AARCH64_FEATURE (AARCH64_FEATURE_COMPNUM, 0),
9394 AARCH64_FEATURE (AARCH64_FEATURE_F16
9395 | AARCH64_FEATURE_SIMD, 0)},
d74d4880
SN
9396 {"rcpc", AARCH64_FEATURE (AARCH64_FEATURE_RCPC, 0),
9397 AARCH64_ARCH_NONE},
65a55fbb
TC
9398 {"dotprod", AARCH64_FEATURE (AARCH64_FEATURE_DOTPROD, 0),
9399 AARCH64_ARCH_NONE},
c0e7cef7
NC
9400 {"sha2", AARCH64_FEATURE (AARCH64_FEATURE_SHA2, 0),
9401 AARCH64_ARCH_NONE},
68dfbb92
SD
9402 {"sb", AARCH64_FEATURE (AARCH64_FEATURE_SB, 0),
9403 AARCH64_ARCH_NONE},
2ac435d4
SD
9404 {"predres", AARCH64_FEATURE (AARCH64_FEATURE_PREDRES, 0),
9405 AARCH64_ARCH_NONE},
c0e7cef7
NC
9406 {"aes", AARCH64_FEATURE (AARCH64_FEATURE_AES, 0),
9407 AARCH64_ARCH_NONE},
b6b9ca0c
TC
9408 {"sm4", AARCH64_FEATURE (AARCH64_FEATURE_SM4, 0),
9409 AARCH64_ARCH_NONE},
d4340f89
JB
9410 {"sha3", AARCH64_FEATURE (AARCH64_FEATURE_SHA3, 0),
9411 AARCH64_FEATURE (AARCH64_FEATURE_SHA2, 0)},
af4bcb4c
SD
9412 {"rng", AARCH64_FEATURE (AARCH64_FEATURE_RNG, 0),
9413 AARCH64_ARCH_NONE},
104fefee
SD
9414 {"ssbs", AARCH64_FEATURE (AARCH64_FEATURE_SSBS, 0),
9415 AARCH64_ARCH_NONE},
73b605ec
SD
9416 {"memtag", AARCH64_FEATURE (AARCH64_FEATURE_MEMTAG, 0),
9417 AARCH64_ARCH_NONE},
7ce2460a
MM
9418 {"sve2", AARCH64_FEATURE (AARCH64_FEATURE_SVE2, 0),
9419 AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0)},
9420 {"sve2-sm4", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_SM4, 0),
9421 AARCH64_FEATURE (AARCH64_FEATURE_SVE2
9422 | AARCH64_FEATURE_SM4, 0)},
9423 {"sve2-aes", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_AES, 0),
9424 AARCH64_FEATURE (AARCH64_FEATURE_SVE2
9425 | AARCH64_FEATURE_AES, 0)},
9426 {"sve2-sha3", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_SHA3, 0),
9427 AARCH64_FEATURE (AARCH64_FEATURE_SVE2
9428 | AARCH64_FEATURE_SHA3, 0)},
ccbdd22f 9429 {"sve2-bitperm", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_BITPERM, 0),
7ce2460a 9430 AARCH64_FEATURE (AARCH64_FEATURE_SVE2, 0)},
df678013
MM
9431 {"bf16", AARCH64_FEATURE (AARCH64_FEATURE_BFLOAT16, 0),
9432 AARCH64_ARCH_NONE},
8382113f
MM
9433 {"i8mm", AARCH64_FEATURE (AARCH64_FEATURE_I8MM, 0),
9434 AARCH64_ARCH_NONE},
9435 {"f32mm", AARCH64_FEATURE (AARCH64_FEATURE_F32MM, 0),
82e9597c 9436 AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0)},
8382113f 9437 {"f64mm", AARCH64_FEATURE (AARCH64_FEATURE_F64MM, 0),
82e9597c 9438 AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0)},
3493da5c
SP
9439 {"a64c", AARCH64_FEATURE (AARCH64_FEATURE_A64C, 0),
9440 AARCH64_ARCH_NONE},
9441 {"c64", AARCH64_FEATURE (AARCH64_FEATURE_C64, 0),
9442 AARCH64_FEATURE (AARCH64_FEATURE_A64C, 0)},
93d8990c 9443 {NULL, AARCH64_ARCH_NONE, AARCH64_ARCH_NONE},
a06ea964
NC
9444};
9445
9446struct aarch64_long_option_table
9447{
e0471c16
TS
9448 const char *option; /* Substring to match. */
9449 const char *help; /* Help information. */
17b9d67d 9450 int (*func) (const char *subopt); /* Function to decode sub-option. */
a06ea964
NC
9451 char *deprecated; /* If non-null, print this message. */
9452};
9453
93d8990c
SN
9454/* Transitive closure of features depending on set. */
9455static aarch64_feature_set
9456aarch64_feature_disable_set (aarch64_feature_set set)
9457{
9458 const struct aarch64_option_cpu_value_table *opt;
9459 aarch64_feature_set prev = 0;
9460
9461 while (prev != set) {
9462 prev = set;
9463 for (opt = aarch64_features; opt->name != NULL; opt++)
9464 if (AARCH64_CPU_HAS_ANY_FEATURES (opt->require, set))
9465 AARCH64_MERGE_FEATURE_SETS (set, set, opt->value);
9466 }
9467 return set;
9468}
9469
9470/* Transitive closure of dependencies of set. */
9471static aarch64_feature_set
9472aarch64_feature_enable_set (aarch64_feature_set set)
9473{
9474 const struct aarch64_option_cpu_value_table *opt;
9475 aarch64_feature_set prev = 0;
9476
9477 while (prev != set) {
9478 prev = set;
9479 for (opt = aarch64_features; opt->name != NULL; opt++)
9480 if (AARCH64_CPU_HAS_FEATURE (set, opt->value))
9481 AARCH64_MERGE_FEATURE_SETS (set, set, opt->require);
9482 }
9483 return set;
9484}
9485
a06ea964 9486static int
82b8a785 9487aarch64_parse_features (const char *str, const aarch64_feature_set **opt_p,
ae527cd8 9488 bfd_boolean ext_only)
a06ea964
NC
9489{
9490 /* We insist on extensions being added before being removed. We achieve
9491 this by using the ADDING_VALUE variable to indicate whether we are
9492 adding an extension (1) or removing it (0) and only allowing it to
9493 change in the order -1 -> 1 -> 0. */
9494 int adding_value = -1;
325801bd 9495 aarch64_feature_set *ext_set = XNEW (aarch64_feature_set);
a06ea964
NC
9496
9497 /* Copy the feature set, so that we can modify it. */
9498 *ext_set = **opt_p;
9499 *opt_p = ext_set;
9500
9501 while (str != NULL && *str != 0)
9502 {
9503 const struct aarch64_option_cpu_value_table *opt;
82b8a785 9504 const char *ext = NULL;
a06ea964
NC
9505 int optlen;
9506
ae527cd8 9507 if (!ext_only)
a06ea964 9508 {
ae527cd8
JB
9509 if (*str != '+')
9510 {
9511 as_bad (_("invalid architectural extension"));
9512 return 0;
9513 }
a06ea964 9514
ae527cd8
JB
9515 ext = strchr (++str, '+');
9516 }
a06ea964
NC
9517
9518 if (ext != NULL)
9519 optlen = ext - str;
9520 else
9521 optlen = strlen (str);
9522
9523 if (optlen >= 2 && strncmp (str, "no", 2) == 0)
9524 {
9525 if (adding_value != 0)
9526 adding_value = 0;
9527 optlen -= 2;
9528 str += 2;
9529 }
9530 else if (optlen > 0)
9531 {
9532 if (adding_value == -1)
9533 adding_value = 1;
9534 else if (adding_value != 1)
9535 {
9536 as_bad (_("must specify extensions to add before specifying "
9537 "those to remove"));
9538 return FALSE;
9539 }
9540 }
9541
9542 if (optlen == 0)
9543 {
9544 as_bad (_("missing architectural extension"));
9545 return 0;
9546 }
9547
9548 gas_assert (adding_value != -1);
9549
9550 for (opt = aarch64_features; opt->name != NULL; opt++)
9551 if (strncmp (opt->name, str, optlen) == 0)
9552 {
93d8990c
SN
9553 aarch64_feature_set set;
9554
a06ea964
NC
9555 /* Add or remove the extension. */
9556 if (adding_value)
93d8990c
SN
9557 {
9558 set = aarch64_feature_enable_set (opt->value);
9559 AARCH64_MERGE_FEATURE_SETS (*ext_set, *ext_set, set);
9560 }
a06ea964 9561 else
93d8990c
SN
9562 {
9563 set = aarch64_feature_disable_set (opt->value);
9564 AARCH64_CLEAR_FEATURE (*ext_set, *ext_set, set);
9565 }
a06ea964
NC
9566 break;
9567 }
9568
9569 if (opt->name == NULL)
9570 {
9571 as_bad (_("unknown architectural extension `%s'"), str);
9572 return 0;
9573 }
9574
9575 str = ext;
9576 };
9577
9578 return 1;
9579}
9580
9581static int
17b9d67d 9582aarch64_parse_cpu (const char *str)
a06ea964
NC
9583{
9584 const struct aarch64_cpu_option_table *opt;
82b8a785 9585 const char *ext = strchr (str, '+');
a06ea964
NC
9586 size_t optlen;
9587
9588 if (ext != NULL)
9589 optlen = ext - str;
9590 else
9591 optlen = strlen (str);
9592
9593 if (optlen == 0)
9594 {
9595 as_bad (_("missing cpu name `%s'"), str);
9596 return 0;
9597 }
9598
9599 for (opt = aarch64_cpus; opt->name != NULL; opt++)
9600 if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
9601 {
9602 mcpu_cpu_opt = &opt->value;
9603 if (ext != NULL)
ae527cd8 9604 return aarch64_parse_features (ext, &mcpu_cpu_opt, FALSE);
a06ea964
NC
9605
9606 return 1;
9607 }
9608
9609 as_bad (_("unknown cpu `%s'"), str);
9610 return 0;
9611}
9612
9613static int
17b9d67d 9614aarch64_parse_arch (const char *str)
a06ea964
NC
9615{
9616 const struct aarch64_arch_option_table *opt;
82b8a785 9617 const char *ext = strchr (str, '+');
a06ea964
NC
9618 size_t optlen;
9619
9620 if (ext != NULL)
9621 optlen = ext - str;
9622 else
9623 optlen = strlen (str);
9624
9625 if (optlen == 0)
9626 {
9627 as_bad (_("missing architecture name `%s'"), str);
9628 return 0;
9629 }
9630
9631 for (opt = aarch64_archs; opt->name != NULL; opt++)
9632 if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
9633 {
9634 march_cpu_opt = &opt->value;
9635 if (ext != NULL)
ae527cd8 9636 return aarch64_parse_features (ext, &march_cpu_opt, FALSE);
a06ea964
NC
9637
9638 return 1;
9639 }
9640
9641 as_bad (_("unknown architecture `%s'\n"), str);
9642 return 0;
9643}
9644
69091a2c
YZ
9645/* ABIs. */
9646struct aarch64_option_abi_value_table
9647{
e0471c16 9648 const char *name;
69091a2c
YZ
9649 enum aarch64_abi_type value;
9650};
9651
9652static const struct aarch64_option_abi_value_table aarch64_abis[] = {
9653 {"ilp32", AARCH64_ABI_ILP32},
9654 {"lp64", AARCH64_ABI_LP64},
69091a2c
YZ
9655};
9656
9657static int
17b9d67d 9658aarch64_parse_abi (const char *str)
69091a2c 9659{
5703197e 9660 unsigned int i;
69091a2c 9661
5703197e 9662 if (str[0] == '\0')
69091a2c
YZ
9663 {
9664 as_bad (_("missing abi name `%s'"), str);
9665 return 0;
9666 }
9667
5703197e
TS
9668 for (i = 0; i < ARRAY_SIZE (aarch64_abis); i++)
9669 if (strcmp (str, aarch64_abis[i].name) == 0)
69091a2c 9670 {
5703197e 9671 aarch64_abi = aarch64_abis[i].value;
69091a2c
YZ
9672 return 1;
9673 }
9674
9675 as_bad (_("unknown abi `%s'\n"), str);
9676 return 0;
9677}
9678
a06ea964 9679static struct aarch64_long_option_table aarch64_long_opts[] = {
69091a2c
YZ
9680#ifdef OBJ_ELF
9681 {"mabi=", N_("<abi name>\t specify for ABI <abi name>"),
9682 aarch64_parse_abi, NULL},
9683#endif /* OBJ_ELF */
a06ea964
NC
9684 {"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"),
9685 aarch64_parse_cpu, NULL},
9686 {"march=", N_("<arch name>\t assemble for architecture <arch name>"),
9687 aarch64_parse_arch, NULL},
9688 {NULL, NULL, 0, NULL}
9689};
9690
9691int
17b9d67d 9692md_parse_option (int c, const char *arg)
a06ea964
NC
9693{
9694 struct aarch64_option_table *opt;
9695 struct aarch64_long_option_table *lopt;
9696
9697 switch (c)
9698 {
9699#ifdef OPTION_EB
9700 case OPTION_EB:
9701 target_big_endian = 1;
9702 break;
9703#endif
9704
9705#ifdef OPTION_EL
9706 case OPTION_EL:
9707 target_big_endian = 0;
9708 break;
9709#endif
9710
9711 case 'a':
9712 /* Listing option. Just ignore these, we don't support additional
9713 ones. */
9714 return 0;
9715
9716 default:
9717 for (opt = aarch64_opts; opt->option != NULL; opt++)
9718 {
9719 if (c == opt->option[0]
9720 && ((arg == NULL && opt->option[1] == 0)
9721 || streq (arg, opt->option + 1)))
9722 {
9723 /* If the option is deprecated, tell the user. */
9724 if (opt->deprecated != NULL)
9725 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
9726 arg ? arg : "", _(opt->deprecated));
9727
9728 if (opt->var != NULL)
9729 *opt->var = opt->value;
9730
9731 return 1;
9732 }
9733 }
9734
9735 for (lopt = aarch64_long_opts; lopt->option != NULL; lopt++)
9736 {
9737 /* These options are expected to have an argument. */
9738 if (c == lopt->option[0]
9739 && arg != NULL
9740 && strncmp (arg, lopt->option + 1,
9741 strlen (lopt->option + 1)) == 0)
9742 {
9743 /* If the option is deprecated, tell the user. */
9744 if (lopt->deprecated != NULL)
9745 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
9746 _(lopt->deprecated));
9747
9748 /* Call the sup-option parser. */
9749 return lopt->func (arg + strlen (lopt->option) - 1);
9750 }
9751 }
9752
9753 return 0;
9754 }
9755
9756 return 1;
9757}
9758
9759void
9760md_show_usage (FILE * fp)
9761{
9762 struct aarch64_option_table *opt;
9763 struct aarch64_long_option_table *lopt;
9764
9765 fprintf (fp, _(" AArch64-specific assembler options:\n"));
9766
9767 for (opt = aarch64_opts; opt->option != NULL; opt++)
9768 if (opt->help != NULL)
9769 fprintf (fp, " -%-23s%s\n", opt->option, _(opt->help));
9770
9771 for (lopt = aarch64_long_opts; lopt->option != NULL; lopt++)
9772 if (lopt->help != NULL)
9773 fprintf (fp, " -%s%s\n", lopt->option, _(lopt->help));
9774
9775#ifdef OPTION_EB
9776 fprintf (fp, _("\
9777 -EB assemble code for a big-endian cpu\n"));
9778#endif
9779
9780#ifdef OPTION_EL
9781 fprintf (fp, _("\
9782 -EL assemble code for a little-endian cpu\n"));
9783#endif
9784}
9785
9786/* Parse a .cpu directive. */
9787
9788static void
9789s_aarch64_cpu (int ignored ATTRIBUTE_UNUSED)
9790{
9791 const struct aarch64_cpu_option_table *opt;
9792 char saved_char;
9793 char *name;
9794 char *ext;
9795 size_t optlen;
9796
9797 name = input_line_pointer;
9798 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
9799 input_line_pointer++;
9800 saved_char = *input_line_pointer;
9801 *input_line_pointer = 0;
9802
9803 ext = strchr (name, '+');
9804
9805 if (ext != NULL)
9806 optlen = ext - name;
9807 else
9808 optlen = strlen (name);
9809
9810 /* Skip the first "all" entry. */
9811 for (opt = aarch64_cpus + 1; opt->name != NULL; opt++)
9812 if (strlen (opt->name) == optlen
9813 && strncmp (name, opt->name, optlen) == 0)
9814 {
9815 mcpu_cpu_opt = &opt->value;
9816 if (ext != NULL)
ae527cd8 9817 if (!aarch64_parse_features (ext, &mcpu_cpu_opt, FALSE))
a06ea964
NC
9818 return;
9819
9820 cpu_variant = *mcpu_cpu_opt;
9821
9822 *input_line_pointer = saved_char;
9823 demand_empty_rest_of_line ();
9824 return;
9825 }
9826 as_bad (_("unknown cpu `%s'"), name);
9827 *input_line_pointer = saved_char;
9828 ignore_rest_of_line ();
9829}
9830
9831
9832/* Parse a .arch directive. */
9833
9834static void
9835s_aarch64_arch (int ignored ATTRIBUTE_UNUSED)
9836{
9837 const struct aarch64_arch_option_table *opt;
9838 char saved_char;
9839 char *name;
9840 char *ext;
9841 size_t optlen;
9842
9843 name = input_line_pointer;
9844 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
9845 input_line_pointer++;
9846 saved_char = *input_line_pointer;
9847 *input_line_pointer = 0;
9848
9849 ext = strchr (name, '+');
9850
9851 if (ext != NULL)
9852 optlen = ext - name;
9853 else
9854 optlen = strlen (name);
9855
9856 /* Skip the first "all" entry. */
9857 for (opt = aarch64_archs + 1; opt->name != NULL; opt++)
9858 if (strlen (opt->name) == optlen
9859 && strncmp (name, opt->name, optlen) == 0)
9860 {
9861 mcpu_cpu_opt = &opt->value;
9862 if (ext != NULL)
ae527cd8 9863 if (!aarch64_parse_features (ext, &mcpu_cpu_opt, FALSE))
a06ea964
NC
9864 return;
9865
9866 cpu_variant = *mcpu_cpu_opt;
9867
9868 *input_line_pointer = saved_char;
9869 demand_empty_rest_of_line ();
9870 return;
9871 }
9872
9873 as_bad (_("unknown architecture `%s'\n"), name);
9874 *input_line_pointer = saved_char;
9875 ignore_rest_of_line ();
9876}
9877
ae527cd8
JB
9878/* Parse a .arch_extension directive. */
9879
9880static void
9881s_aarch64_arch_extension (int ignored ATTRIBUTE_UNUSED)
9882{
9883 char saved_char;
9884 char *ext = input_line_pointer;;
9885
9886 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
9887 input_line_pointer++;
9888 saved_char = *input_line_pointer;
9889 *input_line_pointer = 0;
9890
9891 if (!aarch64_parse_features (ext, &mcpu_cpu_opt, TRUE))
9892 return;
9893
9894 cpu_variant = *mcpu_cpu_opt;
9895
9896 *input_line_pointer = saved_char;
9897 demand_empty_rest_of_line ();
9898}
9899
a06ea964
NC
9900/* Copy symbol information. */
9901
9902void
9903aarch64_copy_symbol_attributes (symbolS * dest, symbolS * src)
9904{
9905 AARCH64_GET_FLAG (dest) = AARCH64_GET_FLAG (src);
9906}
0b4eac57
SN
9907
9908#ifdef OBJ_ELF
9909/* Same as elf_copy_symbol_attributes, but without copying st_other.
9910 This is needed so AArch64 specific st_other values can be independently
9911 specified for an IFUNC resolver (that is called by the dynamic linker)
9912 and the symbol it resolves (aliased to the resolver). In particular,
9913 if a function symbol has special st_other value set via directives,
9914 then attaching an IFUNC resolver to that symbol should not override
9915 the st_other setting. Requiring the directive on the IFUNC resolver
9916 symbol would be unexpected and problematic in C code, where the two
9917 symbols appear as two independent function declarations. */
9918
9919void
9920aarch64_elf_copy_symbol_attributes (symbolS *dest, symbolS *src)
9921{
9922 struct elf_obj_sy *srcelf = symbol_get_obj (src);
9923 struct elf_obj_sy *destelf = symbol_get_obj (dest);
9924 if (srcelf->size)
9925 {
9926 if (destelf->size == NULL)
9927 destelf->size = XNEW (expressionS);
9928 *destelf->size = *srcelf->size;
9929 }
9930 else
9931 {
9fbb53c7 9932 free (destelf->size);
0b4eac57
SN
9933 destelf->size = NULL;
9934 }
9935 S_SET_SIZE (dest, S_GET_SIZE (src));
9936}
9937#endif