]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-aarch64.c
[Morello] Capability construction and modification 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
a06ea964 6383 case AARCH64_OPND_COND:
68a64283 6384 case AARCH64_OPND_COND1:
bb7eff52
RS
6385 {
6386 char *start = str;
6387 do
6388 str++;
6389 while (ISALPHA (*str));
629310ab 6390 info->cond = str_hash_find_n (aarch64_cond_hsh, start, str - start);
bb7eff52
RS
6391 if (info->cond == NULL)
6392 {
6393 set_syntax_error (_("invalid condition"));
6394 goto failure;
6395 }
6396 else if (operands[i] == AARCH64_OPND_COND1
6397 && (info->cond->value & 0xe) == 0xe)
6398 {
6399 /* Do not allow AL or NV. */
6400 set_default_error ();
6401 goto failure;
6402 }
6403 }
a06ea964
NC
6404 break;
6405
6406 case AARCH64_OPND_ADDR_ADRP:
6407 po_misc_or_fail (parse_adrp (&str));
6408 /* Clear the value as operand needs to be relocated. */
6409 info->imm.value = 0;
6410 break;
6411
6412 case AARCH64_OPND_ADDR_PCREL14:
6413 case AARCH64_OPND_ADDR_PCREL19:
6414 case AARCH64_OPND_ADDR_PCREL21:
6415 case AARCH64_OPND_ADDR_PCREL26:
73866052 6416 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6417 if (!info->addr.pcrel)
6418 {
6419 set_syntax_error (_("invalid pc-relative address"));
6420 goto failure;
6421 }
6422 if (inst.gen_lit_pool
6423 && (opcode->iclass != loadlit || opcode->op == OP_PRFM_LIT))
6424 {
6425 /* Only permit "=value" in the literal load instructions.
6426 The literal will be generated by programmer_friendly_fixup. */
6427 set_syntax_error (_("invalid use of \"=immediate\""));
6428 goto failure;
6429 }
6430 if (inst.reloc.exp.X_op == O_symbol && find_reloc_table_entry (&str))
6431 {
6432 set_syntax_error (_("unrecognized relocation suffix"));
6433 goto failure;
6434 }
6435 if (inst.reloc.exp.X_op == O_constant && !inst.gen_lit_pool)
6436 {
6437 info->imm.value = inst.reloc.exp.X_add_number;
6438 inst.reloc.type = BFD_RELOC_UNUSED;
6439 }
6440 else
6441 {
f0070c1e
SP
6442 bfd_boolean c64 = AARCH64_CPU_HAS_FEATURE (cpu_variant,
6443 AARCH64_FEATURE_C64);
6444
a06ea964 6445 info->imm.value = 0;
f41aef5f
RE
6446 if (inst.reloc.type == BFD_RELOC_UNUSED)
6447 switch (opcode->iclass)
6448 {
6449 case compbranch:
6450 case condbranch:
6451 /* e.g. CBZ or B.COND */
6452 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL19);
6453 inst.reloc.type = BFD_RELOC_AARCH64_BRANCH19;
6454 break;
6455 case testbranch:
6456 /* e.g. TBZ */
6457 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL14);
6458 inst.reloc.type = BFD_RELOC_AARCH64_TSTBR14;
6459 break;
6460 case branch_imm:
6461 /* e.g. B or BL */
6462 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL26);
6463 inst.reloc.type =
6464 (opcode->op == OP_BL) ? BFD_RELOC_AARCH64_CALL26
6465 : BFD_RELOC_AARCH64_JUMP26;
6466 break;
6467 case loadlit:
6468 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL19);
6469 inst.reloc.type = BFD_RELOC_AARCH64_LD_LO19_PCREL;
6470 break;
6471 case pcreladdr:
6472 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL21);
6473 inst.reloc.type = BFD_RELOC_AARCH64_ADR_LO21_PCREL;
8b21361b
SP
6474 if (inst.reloc.exp.X_op == O_symbol
6475 && inst.reloc.exp.X_add_symbol != NULL)
6476 {
6477 symbolS *sym = inst.reloc.exp.X_add_symbol;
6478
6479 /* We set LSB for C64 local functions. We do not do
6480 this for local labels even in code section because
6481 it could be embedded data. */
6482 if (S_IS_DEFINED (sym) && AARCH64_IS_C64 (sym)
6483 && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION))
6484 {
6485 inst.reloc.exp.X_add_number += 1;
6486 }
6487 }
6488
f41aef5f
RE
6489 break;
6490 default:
6491 gas_assert (0);
6492 abort ();
6493 }
f0070c1e
SP
6494 if (c64)
6495 inst.reloc.flags = FIXUP_F_C64;
a06ea964
NC
6496 inst.reloc.pc_rel = 1;
6497 }
6498 break;
6499
6500 case AARCH64_OPND_ADDR_SIMPLE:
6501 case AARCH64_OPND_SIMD_ADDR_SIMPLE:
e1b988bb
RS
6502 {
6503 /* [<Xn|SP>{, #<simm>}] */
6504 char *start = str;
6505 /* First use the normal address-parsing routines, to get
6506 the usual syntax errors. */
73866052 6507 po_misc_or_fail (parse_address (&str, info));
e1b988bb
RS
6508 if (info->addr.pcrel || info->addr.offset.is_reg
6509 || !info->addr.preind || info->addr.postind
550fd7bf 6510 || info->addr.writeback)
e1b988bb
RS
6511 {
6512 set_syntax_error (_("invalid addressing mode"));
6513 goto failure;
6514 }
6515
6516 /* Then retry, matching the specific syntax of these addresses. */
6517 str = start;
6518 po_char_or_fail ('[');
3493da5c
SP
6519 po_reg_or_fail (AARCH64_CPU_HAS_FEATURE (cpu_variant,
6520 AARCH64_FEATURE_C64)
6521 ? REG_TYPE_CA_N_SP : REG_TYPE_R64_SP);
6522
e1b988bb
RS
6523 /* Accept optional ", #0". */
6524 if (operands[i] == AARCH64_OPND_ADDR_SIMPLE
6525 && skip_past_char (&str, ','))
6526 {
6527 skip_past_char (&str, '#');
6528 if (! skip_past_char (&str, '0'))
6529 {
6530 set_fatal_syntax_error
6531 (_("the optional immediate offset can only be 0"));
6532 goto failure;
6533 }
6534 }
6535 po_char_or_fail (']');
6536 break;
6537 }
a06ea964
NC
6538
6539 case AARCH64_OPND_ADDR_REGOFF:
6540 /* [<Xn|SP>, <R><m>{, <extend> {<amount>}}] */
73866052 6541 po_misc_or_fail (parse_address (&str, info));
4df068de 6542 regoff_addr:
a06ea964
NC
6543 if (info->addr.pcrel || !info->addr.offset.is_reg
6544 || !info->addr.preind || info->addr.postind
6545 || info->addr.writeback)
6546 {
6547 set_syntax_error (_("invalid addressing mode"));
6548 goto failure;
6549 }
6550 if (!info->shifter.operator_present)
6551 {
6552 /* Default to LSL if not present. Libopcodes prefers shifter
6553 kind to be explicit. */
6554 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
6555 info->shifter.kind = AARCH64_MOD_LSL;
6556 }
6557 /* Qualifier to be deduced by libopcodes. */
6558 break;
6559
6560 case AARCH64_OPND_ADDR_SIMM7:
73866052 6561 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6562 if (info->addr.pcrel || info->addr.offset.is_reg
6563 || (!info->addr.preind && !info->addr.postind))
6564 {
6565 set_syntax_error (_("invalid addressing mode"));
6566 goto failure;
6567 }
73866052
RS
6568 if (inst.reloc.type != BFD_RELOC_UNUSED)
6569 {
6570 set_syntax_error (_("relocation not allowed"));
6571 goto failure;
6572 }
a06ea964
NC
6573 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6574 /* addr_off_p */ 1,
6575 /* need_libopcodes_p */ 1,
6576 /* skip_p */ 0);
6577 break;
6578
6579 case AARCH64_OPND_ADDR_SIMM9:
6580 case AARCH64_OPND_ADDR_SIMM9_2:
fb3265b3
SD
6581 case AARCH64_OPND_ADDR_SIMM11:
6582 case AARCH64_OPND_ADDR_SIMM13:
73866052 6583 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6584 if (info->addr.pcrel || info->addr.offset.is_reg
6585 || (!info->addr.preind && !info->addr.postind)
6586 || (operands[i] == AARCH64_OPND_ADDR_SIMM9_2
6587 && info->addr.writeback))
6588 {
6589 set_syntax_error (_("invalid addressing mode"));
6590 goto failure;
6591 }
6592 if (inst.reloc.type != BFD_RELOC_UNUSED)
6593 {
6594 set_syntax_error (_("relocation not allowed"));
6595 goto failure;
6596 }
6597 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6598 /* addr_off_p */ 1,
6599 /* need_libopcodes_p */ 1,
6600 /* skip_p */ 0);
6601 break;
6602
3f06e550 6603 case AARCH64_OPND_ADDR_SIMM10:
f42f1a1d 6604 case AARCH64_OPND_ADDR_OFFSET:
3f06e550
SN
6605 po_misc_or_fail (parse_address (&str, info));
6606 if (info->addr.pcrel || info->addr.offset.is_reg
6607 || !info->addr.preind || info->addr.postind)
6608 {
6609 set_syntax_error (_("invalid addressing mode"));
6610 goto failure;
6611 }
6612 if (inst.reloc.type != BFD_RELOC_UNUSED)
6613 {
6614 set_syntax_error (_("relocation not allowed"));
6615 goto failure;
6616 }
6617 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6618 /* addr_off_p */ 1,
6619 /* need_libopcodes_p */ 1,
6620 /* skip_p */ 0);
6621 break;
6622
a06ea964 6623 case AARCH64_OPND_ADDR_UIMM12:
73866052 6624 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6625 if (info->addr.pcrel || info->addr.offset.is_reg
6626 || !info->addr.preind || info->addr.writeback)
6627 {
6628 set_syntax_error (_("invalid addressing mode"));
6629 goto failure;
6630 }
6631 if (inst.reloc.type == BFD_RELOC_UNUSED)
6632 aarch64_set_gas_internal_fixup (&inst.reloc, info, 1);
4c562523
JW
6633 else if (inst.reloc.type == BFD_RELOC_AARCH64_LDST_LO12
6634 || (inst.reloc.type
6635 == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12)
6636 || (inst.reloc.type
84f1b9fb
RL
6637 == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC)
6638 || (inst.reloc.type
6639 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12)
6640 || (inst.reloc.type
6641 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12_NC))
a06ea964
NC
6642 inst.reloc.type = ldst_lo12_determine_real_reloc_type ();
6643 /* Leave qualifier to be determined by libopcodes. */
6644 break;
6645
6646 case AARCH64_OPND_SIMD_ADDR_POST:
6647 /* [<Xn|SP>], <Xm|#<amount>> */
73866052 6648 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6649 if (!info->addr.postind || !info->addr.writeback)
6650 {
6651 set_syntax_error (_("invalid addressing mode"));
6652 goto failure;
6653 }
6654 if (!info->addr.offset.is_reg)
6655 {
6656 if (inst.reloc.exp.X_op == O_constant)
6657 info->addr.offset.imm = inst.reloc.exp.X_add_number;
6658 else
6659 {
6660 set_fatal_syntax_error
ab3b8fcf 6661 (_("writeback value must be an immediate constant"));
a06ea964
NC
6662 goto failure;
6663 }
6664 }
6665 /* No qualifier. */
6666 break;
6667
582e12bf 6668 case AARCH64_OPND_SVE_ADDR_RI_S4x16:
8382113f 6669 case AARCH64_OPND_SVE_ADDR_RI_S4x32:
98907a70
RS
6670 case AARCH64_OPND_SVE_ADDR_RI_S4xVL:
6671 case AARCH64_OPND_SVE_ADDR_RI_S4x2xVL:
6672 case AARCH64_OPND_SVE_ADDR_RI_S4x3xVL:
6673 case AARCH64_OPND_SVE_ADDR_RI_S4x4xVL:
6674 case AARCH64_OPND_SVE_ADDR_RI_S6xVL:
6675 case AARCH64_OPND_SVE_ADDR_RI_S9xVL:
4df068de
RS
6676 case AARCH64_OPND_SVE_ADDR_RI_U6:
6677 case AARCH64_OPND_SVE_ADDR_RI_U6x2:
6678 case AARCH64_OPND_SVE_ADDR_RI_U6x4:
6679 case AARCH64_OPND_SVE_ADDR_RI_U6x8:
98907a70
RS
6680 /* [X<n>{, #imm, MUL VL}]
6681 [X<n>{, #imm}]
4df068de
RS
6682 but recognizing SVE registers. */
6683 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6684 &offset_qualifier));
6685 if (base_qualifier != AARCH64_OPND_QLF_X)
6686 {
6687 set_syntax_error (_("invalid addressing mode"));
6688 goto failure;
6689 }
6690 sve_regimm:
6691 if (info->addr.pcrel || info->addr.offset.is_reg
6692 || !info->addr.preind || info->addr.writeback)
6693 {
6694 set_syntax_error (_("invalid addressing mode"));
6695 goto failure;
6696 }
6697 if (inst.reloc.type != BFD_RELOC_UNUSED
6698 || inst.reloc.exp.X_op != O_constant)
6699 {
6700 /* Make sure this has priority over
6701 "invalid addressing mode". */
6702 set_fatal_syntax_error (_("constant offset required"));
6703 goto failure;
6704 }
6705 info->addr.offset.imm = inst.reloc.exp.X_add_number;
6706 break;
6707
c8d59609
NC
6708 case AARCH64_OPND_SVE_ADDR_R:
6709 /* [<Xn|SP>{, <R><m>}]
6710 but recognizing SVE registers. */
6711 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6712 &offset_qualifier));
6713 if (offset_qualifier == AARCH64_OPND_QLF_NIL)
6714 {
6715 offset_qualifier = AARCH64_OPND_QLF_X;
6716 info->addr.offset.is_reg = 1;
6717 info->addr.offset.regno = 31;
6718 }
6719 else if (base_qualifier != AARCH64_OPND_QLF_X
6720 || offset_qualifier != AARCH64_OPND_QLF_X)
6721 {
6722 set_syntax_error (_("invalid addressing mode"));
6723 goto failure;
6724 }
6725 goto regoff_addr;
6726
4df068de
RS
6727 case AARCH64_OPND_SVE_ADDR_RR:
6728 case AARCH64_OPND_SVE_ADDR_RR_LSL1:
6729 case AARCH64_OPND_SVE_ADDR_RR_LSL2:
6730 case AARCH64_OPND_SVE_ADDR_RR_LSL3:
6731 case AARCH64_OPND_SVE_ADDR_RX:
6732 case AARCH64_OPND_SVE_ADDR_RX_LSL1:
6733 case AARCH64_OPND_SVE_ADDR_RX_LSL2:
6734 case AARCH64_OPND_SVE_ADDR_RX_LSL3:
6735 /* [<Xn|SP>, <R><m>{, lsl #<amount>}]
6736 but recognizing SVE registers. */
6737 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6738 &offset_qualifier));
6739 if (base_qualifier != AARCH64_OPND_QLF_X
6740 || offset_qualifier != AARCH64_OPND_QLF_X)
6741 {
6742 set_syntax_error (_("invalid addressing mode"));
6743 goto failure;
6744 }
6745 goto regoff_addr;
6746
6747 case AARCH64_OPND_SVE_ADDR_RZ:
6748 case AARCH64_OPND_SVE_ADDR_RZ_LSL1:
6749 case AARCH64_OPND_SVE_ADDR_RZ_LSL2:
6750 case AARCH64_OPND_SVE_ADDR_RZ_LSL3:
6751 case AARCH64_OPND_SVE_ADDR_RZ_XTW_14:
6752 case AARCH64_OPND_SVE_ADDR_RZ_XTW_22:
6753 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_14:
6754 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_22:
6755 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_14:
6756 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_22:
6757 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_14:
6758 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_22:
6759 /* [<Xn|SP>, Z<m>.D{, LSL #<amount>}]
6760 [<Xn|SP>, Z<m>.<T>, <extend> {#<amount>}] */
6761 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6762 &offset_qualifier));
6763 if (base_qualifier != AARCH64_OPND_QLF_X
6764 || (offset_qualifier != AARCH64_OPND_QLF_S_S
6765 && offset_qualifier != AARCH64_OPND_QLF_S_D))
6766 {
6767 set_syntax_error (_("invalid addressing mode"));
6768 goto failure;
6769 }
6770 info->qualifier = offset_qualifier;
6771 goto regoff_addr;
6772
c469c864
MM
6773 case AARCH64_OPND_SVE_ADDR_ZX:
6774 /* [Zn.<T>{, <Xm>}]. */
6775 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6776 &offset_qualifier));
6777 /* Things to check:
6778 base_qualifier either S_S or S_D
6779 offset_qualifier must be X
6780 */
6781 if ((base_qualifier != AARCH64_OPND_QLF_S_S
6782 && base_qualifier != AARCH64_OPND_QLF_S_D)
6783 || offset_qualifier != AARCH64_OPND_QLF_X)
6784 {
6785 set_syntax_error (_("invalid addressing mode"));
6786 goto failure;
6787 }
6788 info->qualifier = base_qualifier;
6789 if (!info->addr.offset.is_reg || info->addr.pcrel
6790 || !info->addr.preind || info->addr.writeback
6791 || info->shifter.operator_present != 0)
6792 {
6793 set_syntax_error (_("invalid addressing mode"));
6794 goto failure;
6795 }
6796 info->shifter.kind = AARCH64_MOD_LSL;
6797 break;
6798
6799
4df068de
RS
6800 case AARCH64_OPND_SVE_ADDR_ZI_U5:
6801 case AARCH64_OPND_SVE_ADDR_ZI_U5x2:
6802 case AARCH64_OPND_SVE_ADDR_ZI_U5x4:
6803 case AARCH64_OPND_SVE_ADDR_ZI_U5x8:
6804 /* [Z<n>.<T>{, #imm}] */
6805 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6806 &offset_qualifier));
6807 if (base_qualifier != AARCH64_OPND_QLF_S_S
6808 && base_qualifier != AARCH64_OPND_QLF_S_D)
6809 {
6810 set_syntax_error (_("invalid addressing mode"));
6811 goto failure;
6812 }
6813 info->qualifier = base_qualifier;
6814 goto sve_regimm;
6815
6816 case AARCH64_OPND_SVE_ADDR_ZZ_LSL:
6817 case AARCH64_OPND_SVE_ADDR_ZZ_SXTW:
6818 case AARCH64_OPND_SVE_ADDR_ZZ_UXTW:
6819 /* [Z<n>.<T>, Z<m>.<T>{, LSL #<amount>}]
6820 [Z<n>.D, Z<m>.D, <extend> {#<amount>}]
6821
6822 We don't reject:
6823
6824 [Z<n>.S, Z<m>.S, <extend> {#<amount>}]
6825
6826 here since we get better error messages by leaving it to
6827 the qualifier checking routines. */
6828 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6829 &offset_qualifier));
6830 if ((base_qualifier != AARCH64_OPND_QLF_S_S
6831 && base_qualifier != AARCH64_OPND_QLF_S_D)
6832 || offset_qualifier != base_qualifier)
6833 {
6834 set_syntax_error (_("invalid addressing mode"));
6835 goto failure;
6836 }
6837 info->qualifier = base_qualifier;
6838 goto regoff_addr;
6839
a06ea964 6840 case AARCH64_OPND_SYSREG:
7d02540a
TC
6841 {
6842 uint32_t sysreg_flags;
6843 if ((val = parse_sys_reg (&str, aarch64_sys_regs_hsh, 1, 0,
6844 &sysreg_flags)) == PARSE_FAIL)
6845 {
6846 set_syntax_error (_("unknown or missing system register name"));
6847 goto failure;
6848 }
6849 inst.base.operands[i].sysreg.value = val;
6850 inst.base.operands[i].sysreg.flags = sysreg_flags;
6851 break;
6852 }
a06ea964
NC
6853
6854 case AARCH64_OPND_PSTATEFIELD:
561a72d4 6855 if ((val = parse_sys_reg (&str, aarch64_pstatefield_hsh, 0, 1, NULL))
a3251895 6856 == PARSE_FAIL)
a06ea964
NC
6857 {
6858 set_syntax_error (_("unknown or missing PSTATE field name"));
6859 goto failure;
6860 }
6861 inst.base.operands[i].pstatefield = val;
6862 break;
6863
6864 case AARCH64_OPND_SYSREG_IC:
6865 inst.base.operands[i].sysins_op =
6866 parse_sys_ins_reg (&str, aarch64_sys_regs_ic_hsh);
6867 goto sys_reg_ins;
2ac435d4 6868
a06ea964
NC
6869 case AARCH64_OPND_SYSREG_DC:
6870 inst.base.operands[i].sysins_op =
6871 parse_sys_ins_reg (&str, aarch64_sys_regs_dc_hsh);
6872 goto sys_reg_ins;
2ac435d4 6873
a06ea964
NC
6874 case AARCH64_OPND_SYSREG_AT:
6875 inst.base.operands[i].sysins_op =
6876 parse_sys_ins_reg (&str, aarch64_sys_regs_at_hsh);
6877 goto sys_reg_ins;
2ac435d4
SD
6878
6879 case AARCH64_OPND_SYSREG_SR:
6880 inst.base.operands[i].sysins_op =
6881 parse_sys_ins_reg (&str, aarch64_sys_regs_sr_hsh);
6882 goto sys_reg_ins;
6883
a06ea964
NC
6884 case AARCH64_OPND_SYSREG_TLBI:
6885 inst.base.operands[i].sysins_op =
6886 parse_sys_ins_reg (&str, aarch64_sys_regs_tlbi_hsh);
dc1e8a47 6887 sys_reg_ins:
a06ea964
NC
6888 if (inst.base.operands[i].sysins_op == NULL)
6889 {
6890 set_fatal_syntax_error ( _("unknown or missing operation name"));
6891 goto failure;
6892 }
6893 break;
6894
6895 case AARCH64_OPND_BARRIER:
6896 case AARCH64_OPND_BARRIER_ISB:
6897 val = parse_barrier (&str);
6898 if (val != PARSE_FAIL
6899 && operands[i] == AARCH64_OPND_BARRIER_ISB && val != 0xf)
6900 {
6901 /* ISB only accepts options name 'sy'. */
6902 set_syntax_error
6903 (_("the specified option is not accepted in ISB"));
6904 /* Turn off backtrack as this optional operand is present. */
6905 backtrack_pos = 0;
6906 goto failure;
6907 }
6908 /* This is an extension to accept a 0..15 immediate. */
6909 if (val == PARSE_FAIL)
6910 po_imm_or_fail (0, 15);
6911 info->barrier = aarch64_barrier_options + val;
6912 break;
6913
6914 case AARCH64_OPND_PRFOP:
6915 val = parse_pldop (&str);
6916 /* This is an extension to accept a 0..31 immediate. */
6917 if (val == PARSE_FAIL)
6918 po_imm_or_fail (0, 31);
6919 inst.base.operands[i].prfop = aarch64_prfops + val;
6920 break;
6921
1e6f4800
MW
6922 case AARCH64_OPND_BARRIER_PSB:
6923 val = parse_barrier_psb (&str, &(info->hint_option));
6924 if (val == PARSE_FAIL)
6925 goto failure;
6926 break;
6927
ff605452
SD
6928 case AARCH64_OPND_BTI_TARGET:
6929 val = parse_bti_operand (&str, &(info->hint_option));
6930 if (val == PARSE_FAIL)
6931 goto failure;
6932 break;
6933
a06ea964
NC
6934 default:
6935 as_fatal (_("unhandled operand code %d"), operands[i]);
6936 }
6937
6938 /* If we get here, this operand was successfully parsed. */
6939 inst.base.operands[i].present = 1;
6940 continue;
6941
dc1e8a47 6942 failure:
a06ea964
NC
6943 /* The parse routine should already have set the error, but in case
6944 not, set a default one here. */
6945 if (! error_p ())
6946 set_default_error ();
6947
6948 if (! backtrack_pos)
6949 goto parse_operands_return;
6950
f4c51f60
JW
6951 {
6952 /* We reach here because this operand is marked as optional, and
6953 either no operand was supplied or the operand was supplied but it
6954 was syntactically incorrect. In the latter case we report an
6955 error. In the former case we perform a few more checks before
6956 dropping through to the code to insert the default operand. */
6957
6958 char *tmp = backtrack_pos;
6959 char endchar = END_OF_INSN;
6960
6961 if (i != (aarch64_num_of_operands (opcode) - 1))
6962 endchar = ',';
6963 skip_past_char (&tmp, ',');
6964
6965 if (*tmp != endchar)
6966 /* The user has supplied an operand in the wrong format. */
6967 goto parse_operands_return;
6968
6969 /* Make sure there is not a comma before the optional operand.
6970 For example the fifth operand of 'sys' is optional:
6971
6972 sys #0,c0,c0,#0, <--- wrong
6973 sys #0,c0,c0,#0 <--- correct. */
6974 if (comma_skipped_p && i && endchar == END_OF_INSN)
6975 {
6976 set_fatal_syntax_error
6977 (_("unexpected comma before the omitted optional operand"));
6978 goto parse_operands_return;
6979 }
6980 }
6981
a06ea964
NC
6982 /* Reaching here means we are dealing with an optional operand that is
6983 omitted from the assembly line. */
6984 gas_assert (optional_operand_p (opcode, i));
6985 info->present = 0;
6986 process_omitted_operand (operands[i], opcode, i, info);
6987
6988 /* Try again, skipping the optional operand at backtrack_pos. */
6989 str = backtrack_pos;
6990 backtrack_pos = 0;
6991
a06ea964
NC
6992 /* Clear any error record after the omitted optional operand has been
6993 successfully handled. */
6994 clear_error ();
6995 }
6996
6997 /* Check if we have parsed all the operands. */
6998 if (*str != '\0' && ! error_p ())
6999 {
7000 /* Set I to the index of the last present operand; this is
7001 for the purpose of diagnostics. */
7002 for (i -= 1; i >= 0 && !inst.base.operands[i].present; --i)
7003 ;
7004 set_fatal_syntax_error
7005 (_("unexpected characters following instruction"));
7006 }
7007
dc1e8a47 7008 parse_operands_return:
a06ea964
NC
7009
7010 if (error_p ())
7011 {
7012 DEBUG_TRACE ("parsing FAIL: %s - %s",
7013 operand_mismatch_kind_names[get_error_kind ()],
7014 get_error_message ());
7015 /* Record the operand error properly; this is useful when there
7016 are multiple instruction templates for a mnemonic name, so that
7017 later on, we can select the error that most closely describes
7018 the problem. */
7019 record_operand_error (opcode, i, get_error_kind (),
7020 get_error_message ());
7021 return FALSE;
7022 }
7023 else
7024 {
7025 DEBUG_TRACE ("parsing SUCCESS");
7026 return TRUE;
7027 }
7028}
7029
7030/* It does some fix-up to provide some programmer friendly feature while
7031 keeping the libopcodes happy, i.e. libopcodes only accepts
7032 the preferred architectural syntax.
7033 Return FALSE if there is any failure; otherwise return TRUE. */
7034
7035static bfd_boolean
7036programmer_friendly_fixup (aarch64_instruction *instr)
7037{
7038 aarch64_inst *base = &instr->base;
7039 const aarch64_opcode *opcode = base->opcode;
7040 enum aarch64_op op = opcode->op;
7041 aarch64_opnd_info *operands = base->operands;
7042
7043 DEBUG_TRACE ("enter");
7044
7045 switch (opcode->iclass)
7046 {
7047 case testbranch:
7048 /* TBNZ Xn|Wn, #uimm6, label
7049 Test and Branch Not Zero: conditionally jumps to label if bit number
7050 uimm6 in register Xn is not zero. The bit number implies the width of
7051 the register, which may be written and should be disassembled as Wn if
7052 uimm is less than 32. */
7053 if (operands[0].qualifier == AARCH64_OPND_QLF_W)
7054 {
7055 if (operands[1].imm.value >= 32)
7056 {
7057 record_operand_out_of_range_error (opcode, 1, _("immediate value"),
7058 0, 31);
7059 return FALSE;
7060 }
7061 operands[0].qualifier = AARCH64_OPND_QLF_X;
7062 }
7063 break;
7064 case loadlit:
7065 /* LDR Wt, label | =value
7066 As a convenience assemblers will typically permit the notation
7067 "=value" in conjunction with the pc-relative literal load instructions
7068 to automatically place an immediate value or symbolic address in a
7069 nearby literal pool and generate a hidden label which references it.
7070 ISREG has been set to 0 in the case of =value. */
7071 if (instr->gen_lit_pool
7072 && (op == OP_LDR_LIT || op == OP_LDRV_LIT || op == OP_LDRSW_LIT))
7073 {
7074 int size = aarch64_get_qualifier_esize (operands[0].qualifier);
7075 if (op == OP_LDRSW_LIT)
7076 size = 4;
7077 if (instr->reloc.exp.X_op != O_constant
67a32447 7078 && instr->reloc.exp.X_op != O_big
a06ea964
NC
7079 && instr->reloc.exp.X_op != O_symbol)
7080 {
7081 record_operand_error (opcode, 1,
7082 AARCH64_OPDE_FATAL_SYNTAX_ERROR,
7083 _("constant expression expected"));
7084 return FALSE;
7085 }
7086 if (! add_to_lit_pool (&instr->reloc.exp, size))
7087 {
7088 record_operand_error (opcode, 1,
7089 AARCH64_OPDE_OTHER_ERROR,
7090 _("literal pool insertion failed"));
7091 return FALSE;
7092 }
7093 }
7094 break;
a06ea964
NC
7095 case log_shift:
7096 case bitfield:
7097 /* UXT[BHW] Wd, Wn
7098 Unsigned Extend Byte|Halfword|Word: UXT[BH] is architectural alias
7099 for UBFM Wd,Wn,#0,#7|15, while UXTW is pseudo instruction which is
7100 encoded using ORR Wd, WZR, Wn (MOV Wd,Wn).
7101 A programmer-friendly assembler should accept a destination Xd in
7102 place of Wd, however that is not the preferred form for disassembly.
7103 */
7104 if ((op == OP_UXTB || op == OP_UXTH || op == OP_UXTW)
7105 && operands[1].qualifier == AARCH64_OPND_QLF_W
7106 && operands[0].qualifier == AARCH64_OPND_QLF_X)
7107 operands[0].qualifier = AARCH64_OPND_QLF_W;
7108 break;
7109
7110 case addsub_ext:
7111 {
7112 /* In the 64-bit form, the final register operand is written as Wm
7113 for all but the (possibly omitted) UXTX/LSL and SXTX
7114 operators.
7115 As a programmer-friendly assembler, we accept e.g.
7116 ADDS <Xd>, <Xn|SP>, <Xm>{, UXTB {#<amount>}} and change it to
7117 ADDS <Xd>, <Xn|SP>, <Wm>{, UXTB {#<amount>}}. */
7118 int idx = aarch64_operand_index (opcode->operands,
7119 AARCH64_OPND_Rm_EXT);
7120 gas_assert (idx == 1 || idx == 2);
7121 if (operands[0].qualifier == AARCH64_OPND_QLF_X
7122 && operands[idx].qualifier == AARCH64_OPND_QLF_X
7123 && operands[idx].shifter.kind != AARCH64_MOD_LSL
7124 && operands[idx].shifter.kind != AARCH64_MOD_UXTX
7125 && operands[idx].shifter.kind != AARCH64_MOD_SXTX)
7126 operands[idx].qualifier = AARCH64_OPND_QLF_W;
7127 }
7128 break;
7129
7130 default:
7131 break;
7132 }
7133
7134 DEBUG_TRACE ("exit with SUCCESS");
7135 return TRUE;
7136}
7137
5c47e525 7138/* Check for loads and stores that will cause unpredictable behavior. */
54a28c4c
JW
7139
7140static void
7141warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
7142{
7143 aarch64_inst *base = &instr->base;
7144 const aarch64_opcode *opcode = base->opcode;
7145 const aarch64_opnd_info *opnds = base->operands;
7146 switch (opcode->iclass)
7147 {
7148 case ldst_pos:
7149 case ldst_imm9:
3f06e550 7150 case ldst_imm10:
54a28c4c
JW
7151 case ldst_unscaled:
7152 case ldst_unpriv:
5c47e525
RE
7153 /* Loading/storing the base register is unpredictable if writeback. */
7154 if ((aarch64_get_operand_class (opnds[0].type)
7155 == AARCH64_OPND_CLASS_INT_REG)
7156 && opnds[0].reg.regno == opnds[1].addr.base_regno
4bf8c6e8 7157 && opnds[1].addr.base_regno != REG_SP
69105ce4
SD
7158 /* Exempt STG/STZG/ST2G/STZ2G. */
7159 && !(opnds[1].type == AARCH64_OPND_ADDR_SIMM13)
54a28c4c 7160 && opnds[1].addr.writeback)
5c47e525 7161 as_warn (_("unpredictable transfer with writeback -- `%s'"), str);
54a28c4c 7162 break;
503ba600 7163
54a28c4c
JW
7164 case ldstpair_off:
7165 case ldstnapair_offs:
7166 case ldstpair_indexed:
5c47e525
RE
7167 /* Loading/storing the base register is unpredictable if writeback. */
7168 if ((aarch64_get_operand_class (opnds[0].type)
7169 == AARCH64_OPND_CLASS_INT_REG)
7170 && (opnds[0].reg.regno == opnds[2].addr.base_regno
7171 || opnds[1].reg.regno == opnds[2].addr.base_regno)
4bf8c6e8 7172 && opnds[2].addr.base_regno != REG_SP
fb3265b3
SD
7173 /* Exempt STGP. */
7174 && !(opnds[2].type == AARCH64_OPND_ADDR_SIMM11)
54a28c4c 7175 && opnds[2].addr.writeback)
5c47e525
RE
7176 as_warn (_("unpredictable transfer with writeback -- `%s'"), str);
7177 /* Load operations must load different registers. */
54a28c4c
JW
7178 if ((opcode->opcode & (1 << 22))
7179 && opnds[0].reg.regno == opnds[1].reg.regno)
7180 as_warn (_("unpredictable load of register pair -- `%s'"), str);
7181 break;
ee943970
RR
7182
7183 case ldstexcl:
7184 /* It is unpredictable if the destination and status registers are the
7185 same. */
7186 if ((aarch64_get_operand_class (opnds[0].type)
7187 == AARCH64_OPND_CLASS_INT_REG)
7188 && (aarch64_get_operand_class (opnds[1].type)
7189 == AARCH64_OPND_CLASS_INT_REG)
7190 && (opnds[0].reg.regno == opnds[1].reg.regno
7191 || opnds[0].reg.regno == opnds[2].reg.regno))
7192 as_warn (_("unpredictable: identical transfer and status registers"
7193 " --`%s'"),
7194 str);
7195
7196 break;
7197
54a28c4c
JW
7198 default:
7199 break;
7200 }
7201}
7202
4f5d2536
TC
7203static void
7204force_automatic_sequence_close (void)
7205{
7206 if (now_instr_sequence.instr)
7207 {
7208 as_warn (_("previous `%s' sequence has not been closed"),
7209 now_instr_sequence.instr->opcode->name);
7210 init_insn_sequence (NULL, &now_instr_sequence);
7211 }
7212}
7213
a06ea964
NC
7214/* A wrapper function to interface with libopcodes on encoding and
7215 record the error message if there is any.
7216
7217 Return TRUE on success; otherwise return FALSE. */
7218
7219static bfd_boolean
7220do_encode (const aarch64_opcode *opcode, aarch64_inst *instr,
7221 aarch64_insn *code)
7222{
7223 aarch64_operand_error error_info;
7d02540a 7224 memset (&error_info, '\0', sizeof (error_info));
a06ea964 7225 error_info.kind = AARCH64_OPDE_NIL;
3979cf50
SP
7226 if (aarch64_opcode_encode (cpu_variant, opcode, instr, code, NULL,
7227 &error_info, insn_sequence)
7d02540a 7228 && !error_info.non_fatal)
a06ea964 7229 return TRUE;
7d02540a
TC
7230
7231 gas_assert (error_info.kind != AARCH64_OPDE_NIL);
7232 record_operand_error_info (opcode, &error_info);
7233 return error_info.non_fatal;
a06ea964
NC
7234}
7235
7236#ifdef DEBUG_AARCH64
7237static inline void
7238dump_opcode_operands (const aarch64_opcode *opcode)
7239{
7240 int i = 0;
7241 while (opcode->operands[i] != AARCH64_OPND_NIL)
7242 {
7243 aarch64_verbose ("\t\t opnd%d: %s", i,
7244 aarch64_get_operand_name (opcode->operands[i])[0] != '\0'
7245 ? aarch64_get_operand_name (opcode->operands[i])
7246 : aarch64_get_operand_desc (opcode->operands[i]));
7247 ++i;
7248 }
7249}
7250#endif /* DEBUG_AARCH64 */
7251
7252/* This is the guts of the machine-dependent assembler. STR points to a
7253 machine dependent instruction. This function is supposed to emit
7254 the frags/bytes it assembles to. */
7255
7256void
7257md_assemble (char *str)
7258{
7259 char *p = str;
7260 templates *template;
7261 aarch64_opcode *opcode;
7262 aarch64_inst *inst_base;
7263 unsigned saved_cond;
7264
7265 /* Align the previous label if needed. */
7266 if (last_label_seen != NULL)
7267 {
7268 symbol_set_frag (last_label_seen, frag_now);
7269 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
7270 S_SET_SEGMENT (last_label_seen, now_seg);
7271 }
7272
7e84b55d
TC
7273 /* Update the current insn_sequence from the segment. */
7274 insn_sequence = &seg_info (now_seg)->tc_segment_info_data.insn_sequence;
7275
a06ea964
NC
7276 inst.reloc.type = BFD_RELOC_UNUSED;
7277
7278 DEBUG_TRACE ("\n\n");
7279 DEBUG_TRACE ("==============================");
7280 DEBUG_TRACE ("Enter md_assemble with %s", str);
7281
7282 template = opcode_lookup (&p);
7283 if (!template)
7284 {
7285 /* It wasn't an instruction, but it might be a register alias of
7286 the form alias .req reg directive. */
7287 if (!create_register_alias (str, p))
7288 as_bad (_("unknown mnemonic `%s' -- `%s'"), get_mnemonic_name (str),
7289 str);
7290 return;
7291 }
7292
7293 skip_whitespace (p);
7294 if (*p == ',')
7295 {
7296 as_bad (_("unexpected comma after the mnemonic name `%s' -- `%s'"),
7297 get_mnemonic_name (str), str);
7298 return;
7299 }
7300
7301 init_operand_error_report ();
7302
eb9d6cc9
RL
7303 /* Sections are assumed to start aligned. In executable section, there is no
7304 MAP_DATA symbol pending. So we only align the address during
3979cf50 7305 MAP_DATA --> MAP_CUR_INSN transition.
eb9d6cc9
RL
7306 For other sections, this is not guaranteed. */
7307 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
7308 if (!need_pass_2 && subseg_text_p (now_seg) && mapstate == MAP_DATA)
7309 frag_align_code (2, 0);
7310
a06ea964
NC
7311 saved_cond = inst.cond;
7312 reset_aarch64_instruction (&inst);
7313 inst.cond = saved_cond;
7314
7315 /* Iterate through all opcode entries with the same mnemonic name. */
7316 do
7317 {
7318 opcode = template->opcode;
7319
7320 DEBUG_TRACE ("opcode %s found", opcode->name);
7321#ifdef DEBUG_AARCH64
7322 if (debug_dump)
7323 dump_opcode_operands (opcode);
7324#endif /* DEBUG_AARCH64 */
7325
3979cf50 7326 mapping_state (MAP_CUR_INSN);
a06ea964
NC
7327
7328 inst_base = &inst.base;
7329 inst_base->opcode = opcode;
7330
7331 /* Truly conditionally executed instructions, e.g. b.cond. */
7332 if (opcode->flags & F_COND)
7333 {
7334 gas_assert (inst.cond != COND_ALWAYS);
7335 inst_base->cond = get_cond_from_value (inst.cond);
7336 DEBUG_TRACE ("condition found %s", inst_base->cond->names[0]);
7337 }
7338 else if (inst.cond != COND_ALWAYS)
7339 {
7340 /* It shouldn't arrive here, where the assembly looks like a
7341 conditional instruction but the found opcode is unconditional. */
7342 gas_assert (0);
7343 continue;
7344 }
7345
7346 if (parse_operands (p, opcode)
7347 && programmer_friendly_fixup (&inst)
7348 && do_encode (inst_base->opcode, &inst.base, &inst_base->value))
7349 {
3f06bfce
YZ
7350 /* Check that this instruction is supported for this CPU. */
7351 if (!opcode->avariant
93d8990c 7352 || !AARCH64_CPU_HAS_ALL_FEATURES (cpu_variant, *opcode->avariant))
3f06bfce
YZ
7353 {
7354 as_bad (_("selected processor does not support `%s'"), str);
7355 return;
7356 }
7357
54a28c4c
JW
7358 warn_unpredictable_ldst (&inst, str);
7359
a06ea964
NC
7360 if (inst.reloc.type == BFD_RELOC_UNUSED
7361 || !inst.reloc.need_libopcodes_p)
7362 output_inst (NULL);
7363 else
7364 {
7365 /* If there is relocation generated for the instruction,
7366 store the instruction information for the future fix-up. */
7367 struct aarch64_inst *copy;
7368 gas_assert (inst.reloc.type != BFD_RELOC_UNUSED);
325801bd 7369 copy = XNEW (struct aarch64_inst);
a06ea964
NC
7370 memcpy (copy, &inst.base, sizeof (struct aarch64_inst));
7371 output_inst (copy);
7372 }
7d02540a
TC
7373
7374 /* Issue non-fatal messages if any. */
7375 output_operand_error_report (str, TRUE);
a06ea964
NC
7376 return;
7377 }
7378
7379 template = template->next;
7380 if (template != NULL)
7381 {
7382 reset_aarch64_instruction (&inst);
7383 inst.cond = saved_cond;
7384 }
7385 }
7386 while (template != NULL);
7387
7388 /* Issue the error messages if any. */
7d02540a 7389 output_operand_error_report (str, FALSE);
a06ea964
NC
7390}
7391
7392/* Various frobbings of labels and their addresses. */
7393
7394void
7395aarch64_start_line_hook (void)
7396{
7397 last_label_seen = NULL;
7398}
7399
7400void
7401aarch64_frob_label (symbolS * sym)
7402{
7403 last_label_seen = sym;
7404
8b21361b
SP
7405 AARCH64_SET_C64 (sym, IS_C64);
7406
a06ea964
NC
7407 dwarf2_emit_label (sym);
7408}
7409
4f5d2536
TC
7410void
7411aarch64_frob_section (asection *sec ATTRIBUTE_UNUSED)
7412{
7413 /* Check to see if we have a block to close. */
7414 force_automatic_sequence_close ();
7415}
7416
a06ea964
NC
7417int
7418aarch64_data_in_code (void)
7419{
7420 if (!strncmp (input_line_pointer + 1, "data:", 5))
7421 {
7422 *input_line_pointer = '/';
7423 input_line_pointer += 5;
7424 *input_line_pointer = 0;
7425 return 1;
7426 }
7427
7428 return 0;
7429}
7430
7431char *
7432aarch64_canonicalize_symbol_name (char *name)
7433{
7434 int len;
7435
7436 if ((len = strlen (name)) > 5 && streq (name + len - 5, "/data"))
7437 *(name + len - 5) = 0;
7438
7439 return name;
7440}
7441\f
7442/* Table of all register names defined by default. The user can
7443 define additional names with .req. Note that all register names
7444 should appear in both upper and lowercase variants. Some registers
7445 also have mixed-case names. */
7446
7447#define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE }
8975f864 7448#define REGDEF_ALIAS(s, n, t) { #s, n, REG_TYPE_##t, FALSE}
a06ea964 7449#define REGNUM(p,n,t) REGDEF(p##n, n, t)
f11ad6bc 7450#define REGSET16(p,t) \
a06ea964
NC
7451 REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
7452 REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
7453 REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
f11ad6bc
RS
7454 REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
7455#define REGSET31(p,t) \
7456 REGSET16(p, t), \
a06ea964
NC
7457 REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
7458 REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
7459 REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
7460 REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t)
7461#define REGSET(p,t) \
7462 REGSET31(p,t), REGNUM(p,31,t)
7463
7464/* These go into aarch64_reg_hsh hash-table. */
7465static const reg_entry reg_names[] = {
7466 /* Integer registers. */
7467 REGSET31 (x, R_64), REGSET31 (X, R_64),
7468 REGSET31 (w, R_32), REGSET31 (W, R_32),
7469
8975f864 7470 REGDEF_ALIAS (ip0, 16, R_64), REGDEF_ALIAS (IP0, 16, R_64),
f10e937a 7471 REGDEF_ALIAS (ip1, 17, R_64), REGDEF_ALIAS (IP1, 17, R_64),
8975f864
RR
7472 REGDEF_ALIAS (fp, 29, R_64), REGDEF_ALIAS (FP, 29, R_64),
7473 REGDEF_ALIAS (lr, 30, R_64), REGDEF_ALIAS (LR, 30, R_64),
a06ea964
NC
7474 REGDEF (wsp, 31, SP_32), REGDEF (WSP, 31, SP_32),
7475 REGDEF (sp, 31, SP_64), REGDEF (SP, 31, SP_64),
7476
7477 REGDEF (wzr, 31, Z_32), REGDEF (WZR, 31, Z_32),
7478 REGDEF (xzr, 31, Z_64), REGDEF (XZR, 31, Z_64),
7479
3493da5c
SP
7480 /* Capability Registers. */
7481 REGSET31 (c, CA_N), REGSET31 (C, CA_N),
7482 REGDEF (csp, 31, CA_SP), REGDEF (CSP, 31, CA_SP),
7483 REGDEF (czr, 31, CA_Z), REGDEF (CZR, 31, CA_Z),
7484 REGDEF (ddc, 33, CA_D), REGDEF (DDC, 33, CA_D),
7485 REGDEF_ALIAS (clr, 30, CA_N), REGDEF_ALIAS (CLR, 30, CA_N),
7486
a06ea964
NC
7487 /* Floating-point single precision registers. */
7488 REGSET (s, FP_S), REGSET (S, FP_S),
7489
7490 /* Floating-point double precision registers. */
7491 REGSET (d, FP_D), REGSET (D, FP_D),
7492
7493 /* Floating-point half precision registers. */
7494 REGSET (h, FP_H), REGSET (H, FP_H),
7495
7496 /* Floating-point byte precision registers. */
7497 REGSET (b, FP_B), REGSET (B, FP_B),
7498
7499 /* Floating-point quad precision registers. */
7500 REGSET (q, FP_Q), REGSET (Q, FP_Q),
7501
7502 /* FP/SIMD registers. */
7503 REGSET (v, VN), REGSET (V, VN),
f11ad6bc
RS
7504
7505 /* SVE vector registers. */
7506 REGSET (z, ZN), REGSET (Z, ZN),
7507
7508 /* SVE predicate registers. */
7509 REGSET16 (p, PN), REGSET16 (P, PN)
a06ea964
NC
7510};
7511
7512#undef REGDEF
8975f864 7513#undef REGDEF_ALIAS
a06ea964 7514#undef REGNUM
f11ad6bc
RS
7515#undef REGSET16
7516#undef REGSET31
a06ea964
NC
7517#undef REGSET
7518
7519#define N 1
7520#define n 0
7521#define Z 1
7522#define z 0
7523#define C 1
7524#define c 0
7525#define V 1
7526#define v 0
7527#define B(a,b,c,d) (((a) << 3) | ((b) << 2) | ((c) << 1) | (d))
7528static const asm_nzcv nzcv_names[] = {
7529 {"nzcv", B (n, z, c, v)},
7530 {"nzcV", B (n, z, c, V)},
7531 {"nzCv", B (n, z, C, v)},
7532 {"nzCV", B (n, z, C, V)},
7533 {"nZcv", B (n, Z, c, v)},
7534 {"nZcV", B (n, Z, c, V)},
7535 {"nZCv", B (n, Z, C, v)},
7536 {"nZCV", B (n, Z, C, V)},
7537 {"Nzcv", B (N, z, c, v)},
7538 {"NzcV", B (N, z, c, V)},
7539 {"NzCv", B (N, z, C, v)},
7540 {"NzCV", B (N, z, C, V)},
7541 {"NZcv", B (N, Z, c, v)},
7542 {"NZcV", B (N, Z, c, V)},
7543 {"NZCv", B (N, Z, C, v)},
7544 {"NZCV", B (N, Z, C, V)}
7545};
7546
7547#undef N
7548#undef n
7549#undef Z
7550#undef z
7551#undef C
7552#undef c
7553#undef V
7554#undef v
7555#undef B
7556\f
7557/* MD interface: bits in the object file. */
7558
7559/* Turn an integer of n bytes (in val) into a stream of bytes appropriate
7560 for use in the a.out file, and stores them in the array pointed to by buf.
7561 This knows about the endian-ness of the target machine and does
7562 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
7563 2 (short) and 4 (long) Floating numbers are put out as a series of
7564 LITTLENUMS (shorts, here at least). */
7565
7566void
7567md_number_to_chars (char *buf, valueT val, int n)
7568{
7569 if (target_big_endian)
7570 number_to_chars_bigendian (buf, val, n);
7571 else
7572 number_to_chars_littleendian (buf, val, n);
7573}
7574
7575/* MD interface: Sections. */
7576
7577/* Estimate the size of a frag before relaxing. Assume everything fits in
7578 4 bytes. */
7579
7580int
7581md_estimate_size_before_relax (fragS * fragp, segT segtype ATTRIBUTE_UNUSED)
7582{
7583 fragp->fr_var = 4;
7584 return 4;
7585}
7586
7587/* Round up a section size to the appropriate boundary. */
7588
7589valueT
7590md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
7591{
7592 return size;
7593}
7594
7595/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
f803aa8e
DPT
7596 of an rs_align_code fragment.
7597
7598 Here we fill the frag with the appropriate info for padding the
7599 output stream. The resulting frag will consist of a fixed (fr_fix)
7600 and of a repeating (fr_var) part.
7601
7602 The fixed content is always emitted before the repeating content and
7603 these two parts are used as follows in constructing the output:
7604 - the fixed part will be used to align to a valid instruction word
7605 boundary, in case that we start at a misaligned address; as no
7606 executable instruction can live at the misaligned location, we
7607 simply fill with zeros;
7608 - the variable part will be used to cover the remaining padding and
7609 we fill using the AArch64 NOP instruction.
7610
7611 Note that the size of a RS_ALIGN_CODE fragment is always 7 to provide
7612 enough storage space for up to 3 bytes for padding the back to a valid
7613 instruction alignment and exactly 4 bytes to store the NOP pattern. */
a06ea964
NC
7614
7615void
7616aarch64_handle_align (fragS * fragP)
7617{
7618 /* NOP = d503201f */
7619 /* AArch64 instructions are always little-endian. */
d9235011 7620 static unsigned char const aarch64_noop[4] = { 0x1f, 0x20, 0x03, 0xd5 };
a06ea964
NC
7621
7622 int bytes, fix, noop_size;
7623 char *p;
a06ea964
NC
7624
7625 if (fragP->fr_type != rs_align_code)
7626 return;
7627
7628 bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
7629 p = fragP->fr_literal + fragP->fr_fix;
a06ea964
NC
7630
7631#ifdef OBJ_ELF
7632 gas_assert (fragP->tc_frag_data.recorded);
7633#endif
7634
a06ea964 7635 noop_size = sizeof (aarch64_noop);
a06ea964 7636
f803aa8e
DPT
7637 fix = bytes & (noop_size - 1);
7638 if (fix)
a06ea964 7639 {
a06ea964 7640#ifdef OBJ_ELF
3979cf50 7641 insert_data_mapping_symbol (MAP_CUR_INSN, fragP->fr_fix, fragP, fix);
a06ea964
NC
7642#endif
7643 memset (p, 0, fix);
7644 p += fix;
f803aa8e 7645 fragP->fr_fix += fix;
a06ea964
NC
7646 }
7647
f803aa8e
DPT
7648 if (noop_size)
7649 memcpy (p, aarch64_noop, noop_size);
7650 fragP->fr_var = noop_size;
a06ea964
NC
7651}
7652
7653/* Perform target specific initialisation of a frag.
7654 Note - despite the name this initialisation is not done when the frag
7655 is created, but only when its type is assigned. A frag can be created
7656 and used a long time before its type is set, so beware of assuming that
33eaf5de 7657 this initialisation is performed first. */
a06ea964
NC
7658
7659#ifndef OBJ_ELF
7660void
7661aarch64_init_frag (fragS * fragP ATTRIBUTE_UNUSED,
7662 int max_chars ATTRIBUTE_UNUSED)
7663{
7664}
7665
7666#else /* OBJ_ELF is defined. */
7667void
7668aarch64_init_frag (fragS * fragP, int max_chars)
7669{
7670 /* Record a mapping symbol for alignment frags. We will delete this
7671 later if the alignment ends up empty. */
7672 if (!fragP->tc_frag_data.recorded)
c7ad08e6
RL
7673 fragP->tc_frag_data.recorded = 1;
7674
e8d84ca1
NC
7675 /* PR 21809: Do not set a mapping state for debug sections
7676 - it just confuses other tools. */
fd361982 7677 if (bfd_section_flags (now_seg) & SEC_DEBUGGING)
e8d84ca1
NC
7678 return;
7679
c7ad08e6 7680 switch (fragP->fr_type)
a06ea964 7681 {
c7ad08e6
RL
7682 case rs_align_test:
7683 case rs_fill:
7684 mapping_state_2 (MAP_DATA, max_chars);
7685 break;
7ea12e5c
NC
7686 case rs_align:
7687 /* PR 20364: We can get alignment frags in code sections,
7688 so do not just assume that we should use the MAP_DATA state. */
3979cf50 7689 mapping_state_2 (subseg_text_p (now_seg) ? MAP_CUR_INSN : MAP_DATA, max_chars);
7ea12e5c 7690 break;
c7ad08e6 7691 case rs_align_code:
3979cf50 7692 mapping_state_2 (MAP_CUR_INSN, max_chars);
c7ad08e6
RL
7693 break;
7694 default:
7695 break;
a06ea964
NC
7696 }
7697}
7698\f
7699/* Initialize the DWARF-2 unwind information for this procedure. */
7700
7701void
7702tc_aarch64_frame_initial_instructions (void)
7703{
7704 cfi_add_CFA_def_cfa (REG_SP, 0);
7705}
7706#endif /* OBJ_ELF */
7707
7708/* Convert REGNAME to a DWARF-2 register number. */
7709
7710int
7711tc_aarch64_regname_to_dw2regnum (char *regname)
7712{
7713 const reg_entry *reg = parse_reg (&regname);
7714 if (reg == NULL)
7715 return -1;
7716
7717 switch (reg->type)
7718 {
7719 case REG_TYPE_SP_32:
7720 case REG_TYPE_SP_64:
7721 case REG_TYPE_R_32:
7722 case REG_TYPE_R_64:
a2cac51c
RH
7723 return reg->number;
7724
a06ea964
NC
7725 case REG_TYPE_FP_B:
7726 case REG_TYPE_FP_H:
7727 case REG_TYPE_FP_S:
7728 case REG_TYPE_FP_D:
7729 case REG_TYPE_FP_Q:
a2cac51c
RH
7730 return reg->number + 64;
7731
a06ea964
NC
7732 default:
7733 break;
7734 }
7735 return -1;
7736}
7737
cec5225b
YZ
7738/* Implement DWARF2_ADDR_SIZE. */
7739
7740int
7741aarch64_dwarf2_addr_size (void)
7742{
7743#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7744 if (ilp32_p)
7745 return 4;
7746#endif
7747 return bfd_arch_bits_per_address (stdoutput) / 8;
7748}
7749
a06ea964
NC
7750/* MD interface: Symbol and relocation handling. */
7751
7752/* Return the address within the segment that a PC-relative fixup is
7753 relative to. For AArch64 PC-relative fixups applied to instructions
7754 are generally relative to the location plus AARCH64_PCREL_OFFSET bytes. */
7755
7756long
7757md_pcrel_from_section (fixS * fixP, segT seg)
7758{
7759 offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
7760
7761 /* If this is pc-relative and we are going to emit a relocation
7762 then we just want to put out any pipeline compensation that the linker
7763 will need. Otherwise we want to use the calculated base. */
7764 if (fixP->fx_pcrel
7765 && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
7766 || aarch64_force_relocation (fixP)))
7767 base = 0;
7768
7769 /* AArch64 should be consistent for all pc-relative relocations. */
7770 return base + AARCH64_PCREL_OFFSET;
7771}
7772
7773/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
7774 Otherwise we have no need to default values of symbols. */
7775
7776symbolS *
7777md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
7778{
7779#ifdef OBJ_ELF
7780 if (name[0] == '_' && name[1] == 'G'
7781 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
7782 {
7783 if (!GOT_symbol)
7784 {
7785 if (symbol_find (name))
7786 as_bad (_("GOT already in the symbol table"));
7787
7788 GOT_symbol = symbol_new (name, undefined_section,
e01e1cee 7789 &zero_address_frag, 0);
a06ea964
NC
7790 }
7791
7792 return GOT_symbol;
7793 }
7794#endif
7795
7796 return 0;
7797}
7798
7799/* Return non-zero if the indicated VALUE has overflowed the maximum
7800 range expressible by a unsigned number with the indicated number of
7801 BITS. */
7802
7803static bfd_boolean
7804unsigned_overflow (valueT value, unsigned bits)
7805{
7806 valueT lim;
7807 if (bits >= sizeof (valueT) * 8)
7808 return FALSE;
7809 lim = (valueT) 1 << bits;
7810 return (value >= lim);
7811}
7812
7813
7814/* Return non-zero if the indicated VALUE has overflowed the maximum
7815 range expressible by an signed number with the indicated number of
7816 BITS. */
7817
7818static bfd_boolean
7819signed_overflow (offsetT value, unsigned bits)
7820{
7821 offsetT lim;
7822 if (bits >= sizeof (offsetT) * 8)
7823 return FALSE;
7824 lim = (offsetT) 1 << (bits - 1);
7825 return (value < -lim || value >= lim);
7826}
7827
7828/* Given an instruction in *INST, which is expected to be a scaled, 12-bit,
7829 unsigned immediate offset load/store instruction, try to encode it as
7830 an unscaled, 9-bit, signed immediate offset load/store instruction.
7831 Return TRUE if it is successful; otherwise return FALSE.
7832
7833 As a programmer-friendly assembler, LDUR/STUR instructions can be generated
7834 in response to the standard LDR/STR mnemonics when the immediate offset is
7835 unambiguous, i.e. when it is negative or unaligned. */
7836
7837static bfd_boolean
7838try_to_encode_as_unscaled_ldst (aarch64_inst *instr)
7839{
7840 int idx;
7841 enum aarch64_op new_op;
7842 const aarch64_opcode *new_opcode;
7843
7844 gas_assert (instr->opcode->iclass == ldst_pos);
7845
7846 switch (instr->opcode->op)
7847 {
7848 case OP_LDRB_POS:new_op = OP_LDURB; break;
7849 case OP_STRB_POS: new_op = OP_STURB; break;
7850 case OP_LDRSB_POS: new_op = OP_LDURSB; break;
7851 case OP_LDRH_POS: new_op = OP_LDURH; break;
7852 case OP_STRH_POS: new_op = OP_STURH; break;
7853 case OP_LDRSH_POS: new_op = OP_LDURSH; break;
7854 case OP_LDR_POS: new_op = OP_LDUR; break;
7855 case OP_STR_POS: new_op = OP_STUR; break;
7856 case OP_LDRF_POS: new_op = OP_LDURV; break;
7857 case OP_STRF_POS: new_op = OP_STURV; break;
7858 case OP_LDRSW_POS: new_op = OP_LDURSW; break;
7859 case OP_PRFM_POS: new_op = OP_PRFUM; break;
7860 default: new_op = OP_NIL; break;
7861 }
7862
7863 if (new_op == OP_NIL)
7864 return FALSE;
7865
7866 new_opcode = aarch64_get_opcode (new_op);
7867 gas_assert (new_opcode != NULL);
7868
7869 DEBUG_TRACE ("Check programmer-friendly STURB/LDURB -> STRB/LDRB: %d == %d",
7870 instr->opcode->op, new_opcode->op);
7871
7872 aarch64_replace_opcode (instr, new_opcode);
7873
7874 /* Clear up the ADDR_SIMM9's qualifier; otherwise the
7875 qualifier matching may fail because the out-of-date qualifier will
7876 prevent the operand being updated with a new and correct qualifier. */
7877 idx = aarch64_operand_index (instr->opcode->operands,
7878 AARCH64_OPND_ADDR_SIMM9);
7879 gas_assert (idx == 1);
7880 instr->operands[idx].qualifier = AARCH64_OPND_QLF_NIL;
7881
7882 DEBUG_TRACE ("Found LDURB entry to encode programmer-friendly LDRB");
7883
3979cf50
SP
7884 if (!aarch64_opcode_encode (cpu_variant, instr->opcode, instr, &instr->value,
7885 NULL, NULL, insn_sequence))
a06ea964
NC
7886 return FALSE;
7887
7888 return TRUE;
7889}
7890
7891/* Called by fix_insn to fix a MOV immediate alias instruction.
7892
7893 Operand for a generic move immediate instruction, which is an alias
7894 instruction that generates a single MOVZ, MOVN or ORR instruction to loads
7895 a 32-bit/64-bit immediate value into general register. An assembler error
7896 shall result if the immediate cannot be created by a single one of these
7897 instructions. If there is a choice, then to ensure reversability an
7898 assembler must prefer a MOVZ to MOVN, and MOVZ or MOVN to ORR. */
7899
7900static void
7901fix_mov_imm_insn (fixS *fixP, char *buf, aarch64_inst *instr, offsetT value)
7902{
7903 const aarch64_opcode *opcode;
7904
7905 /* Need to check if the destination is SP/ZR. The check has to be done
7906 before any aarch64_replace_opcode. */
7907 int try_mov_wide_p = !aarch64_stack_pointer_p (&instr->operands[0]);
7908 int try_mov_bitmask_p = !aarch64_zero_register_p (&instr->operands[0]);
7909
7910 instr->operands[1].imm.value = value;
7911 instr->operands[1].skip = 0;
7912
7913 if (try_mov_wide_p)
7914 {
7915 /* Try the MOVZ alias. */
7916 opcode = aarch64_get_opcode (OP_MOV_IMM_WIDE);
7917 aarch64_replace_opcode (instr, opcode);
3979cf50 7918 if (aarch64_opcode_encode (cpu_variant, instr->opcode, instr,
7e84b55d 7919 &instr->value, NULL, NULL, insn_sequence))
a06ea964
NC
7920 {
7921 put_aarch64_insn (buf, instr->value);
7922 return;
7923 }
7924 /* Try the MOVK alias. */
7925 opcode = aarch64_get_opcode (OP_MOV_IMM_WIDEN);
7926 aarch64_replace_opcode (instr, opcode);
3979cf50 7927 if (aarch64_opcode_encode (cpu_variant, instr->opcode, instr,
7e84b55d 7928 &instr->value, NULL, NULL, insn_sequence))
a06ea964
NC
7929 {
7930 put_aarch64_insn (buf, instr->value);
7931 return;
7932 }
7933 }
7934
7935 if (try_mov_bitmask_p)
7936 {
7937 /* Try the ORR alias. */
7938 opcode = aarch64_get_opcode (OP_MOV_IMM_LOG);
7939 aarch64_replace_opcode (instr, opcode);
3979cf50 7940 if (aarch64_opcode_encode (cpu_variant, instr->opcode, instr,
7e84b55d 7941 &instr->value, NULL, NULL, insn_sequence))
a06ea964
NC
7942 {
7943 put_aarch64_insn (buf, instr->value);
7944 return;
7945 }
7946 }
7947
7948 as_bad_where (fixP->fx_file, fixP->fx_line,
7949 _("immediate cannot be moved by a single instruction"));
7950}
7951
7952/* An instruction operand which is immediate related may have symbol used
7953 in the assembly, e.g.
7954
7955 mov w0, u32
7956 .set u32, 0x00ffff00
7957
7958 At the time when the assembly instruction is parsed, a referenced symbol,
7959 like 'u32' in the above example may not have been seen; a fixS is created
7960 in such a case and is handled here after symbols have been resolved.
7961 Instruction is fixed up with VALUE using the information in *FIXP plus
7962 extra information in FLAGS.
7963
7964 This function is called by md_apply_fix to fix up instructions that need
7965 a fix-up described above but does not involve any linker-time relocation. */
7966
7967static void
7968fix_insn (fixS *fixP, uint32_t flags, offsetT value)
7969{
7970 int idx;
7971 uint32_t insn;
7972 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
7973 enum aarch64_opnd opnd = fixP->tc_fix_data.opnd;
7974 aarch64_inst *new_inst = fixP->tc_fix_data.inst;
7975
7976 if (new_inst)
7977 {
7978 /* Now the instruction is about to be fixed-up, so the operand that
7979 was previously marked as 'ignored' needs to be unmarked in order
7980 to get the encoding done properly. */
7981 idx = aarch64_operand_index (new_inst->opcode->operands, opnd);
7982 new_inst->operands[idx].skip = 0;
7983 }
7984
7985 gas_assert (opnd != AARCH64_OPND_NIL);
7986
7987 switch (opnd)
7988 {
7989 case AARCH64_OPND_EXCEPTION:
09c1e68a 7990 case AARCH64_OPND_UNDEFINED:
a06ea964
NC
7991 if (unsigned_overflow (value, 16))
7992 as_bad_where (fixP->fx_file, fixP->fx_line,
7993 _("immediate out of range"));
7994 insn = get_aarch64_insn (buf);
09c1e68a 7995 insn |= (opnd == AARCH64_OPND_EXCEPTION) ? encode_svc_imm (value) : value;
a06ea964
NC
7996 put_aarch64_insn (buf, insn);
7997 break;
7998
7999 case AARCH64_OPND_AIMM:
dc64c2ba 8000 case AARCH64_OPND_A64C_AIMM:
a06ea964
NC
8001 /* ADD or SUB with immediate.
8002 NOTE this assumes we come here with a add/sub shifted reg encoding
8003 3 322|2222|2 2 2 21111 111111
8004 1 098|7654|3 2 1 09876 543210 98765 43210
8005 0b000000 sf 000|1011|shift 0 Rm imm6 Rn Rd ADD
8006 2b000000 sf 010|1011|shift 0 Rm imm6 Rn Rd ADDS
8007 4b000000 sf 100|1011|shift 0 Rm imm6 Rn Rd SUB
8008 6b000000 sf 110|1011|shift 0 Rm imm6 Rn Rd SUBS
8009 ->
8010 3 322|2222|2 2 221111111111
8011 1 098|7654|3 2 109876543210 98765 43210
8012 11000000 sf 001|0001|shift imm12 Rn Rd ADD
8013 31000000 sf 011|0001|shift imm12 Rn Rd ADDS
8014 51000000 sf 101|0001|shift imm12 Rn Rd SUB
8015 71000000 sf 111|0001|shift imm12 Rn Rd SUBS
8016 Fields sf Rn Rd are already set. */
8017 insn = get_aarch64_insn (buf);
8018 if (value < 0)
8019 {
8020 /* Add <-> sub. */
8021 insn = reencode_addsub_switch_add_sub (insn);
8022 value = -value;
8023 }
8024
8025 if ((flags & FIXUP_F_HAS_EXPLICIT_SHIFT) == 0
8026 && unsigned_overflow (value, 12))
8027 {
8028 /* Try to shift the value by 12 to make it fit. */
8029 if (((value >> 12) << 12) == value
8030 && ! unsigned_overflow (value, 12 + 12))
8031 {
8032 value >>= 12;
8033 insn |= encode_addsub_imm_shift_amount (1);
8034 }
8035 }
8036
8037 if (unsigned_overflow (value, 12))
8038 as_bad_where (fixP->fx_file, fixP->fx_line,
8039 _("immediate out of range"));
8040
8041 insn |= encode_addsub_imm (value);
8042
8043 put_aarch64_insn (buf, insn);
8044 break;
8045
8046 case AARCH64_OPND_SIMD_IMM:
8047 case AARCH64_OPND_SIMD_IMM_SFT:
8048 case AARCH64_OPND_LIMM:
8049 /* Bit mask immediate. */
8050 gas_assert (new_inst != NULL);
8051 idx = aarch64_operand_index (new_inst->opcode->operands, opnd);
8052 new_inst->operands[idx].imm.value = value;
3979cf50 8053 if (aarch64_opcode_encode (cpu_variant, new_inst->opcode, new_inst,
7e84b55d 8054 &new_inst->value, NULL, NULL, insn_sequence))
a06ea964
NC
8055 put_aarch64_insn (buf, new_inst->value);
8056 else
8057 as_bad_where (fixP->fx_file, fixP->fx_line,
8058 _("invalid immediate"));
8059 break;
8060
8061 case AARCH64_OPND_HALF:
8062 /* 16-bit unsigned immediate. */
8063 if (unsigned_overflow (value, 16))
8064 as_bad_where (fixP->fx_file, fixP->fx_line,
8065 _("immediate out of range"));
8066 insn = get_aarch64_insn (buf);
8067 insn |= encode_movw_imm (value & 0xffff);
8068 put_aarch64_insn (buf, insn);
8069 break;
8070
8071 case AARCH64_OPND_IMM_MOV:
8072 /* Operand for a generic move immediate instruction, which is
8073 an alias instruction that generates a single MOVZ, MOVN or ORR
8074 instruction to loads a 32-bit/64-bit immediate value into general
8075 register. An assembler error shall result if the immediate cannot be
8076 created by a single one of these instructions. If there is a choice,
8077 then to ensure reversability an assembler must prefer a MOVZ to MOVN,
8078 and MOVZ or MOVN to ORR. */
8079 gas_assert (new_inst != NULL);
8080 fix_mov_imm_insn (fixP, buf, new_inst, value);
8081 break;
8082
8083 case AARCH64_OPND_ADDR_SIMM7:
8084 case AARCH64_OPND_ADDR_SIMM9:
8085 case AARCH64_OPND_ADDR_SIMM9_2:
3f06e550 8086 case AARCH64_OPND_ADDR_SIMM10:
a06ea964 8087 case AARCH64_OPND_ADDR_UIMM12:
fb3265b3
SD
8088 case AARCH64_OPND_ADDR_SIMM11:
8089 case AARCH64_OPND_ADDR_SIMM13:
a06ea964
NC
8090 /* Immediate offset in an address. */
8091 insn = get_aarch64_insn (buf);
8092
8093 gas_assert (new_inst != NULL && new_inst->value == insn);
8094 gas_assert (new_inst->opcode->operands[1] == opnd
8095 || new_inst->opcode->operands[2] == opnd);
8096
8097 /* Get the index of the address operand. */
8098 if (new_inst->opcode->operands[1] == opnd)
8099 /* e.g. STR <Xt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}]. */
8100 idx = 1;
8101 else
8102 /* e.g. LDP <Qt1>, <Qt2>, [<Xn|SP>{, #<imm>}]. */
8103 idx = 2;
8104
8105 /* Update the resolved offset value. */
8106 new_inst->operands[idx].addr.offset.imm = value;
8107
8108 /* Encode/fix-up. */
3979cf50 8109 if (aarch64_opcode_encode (cpu_variant, new_inst->opcode, new_inst,
7e84b55d 8110 &new_inst->value, NULL, NULL, insn_sequence))
a06ea964
NC
8111 {
8112 put_aarch64_insn (buf, new_inst->value);
8113 break;
8114 }
8115 else if (new_inst->opcode->iclass == ldst_pos
8116 && try_to_encode_as_unscaled_ldst (new_inst))
8117 {
8118 put_aarch64_insn (buf, new_inst->value);
8119 break;
8120 }
8121
8122 as_bad_where (fixP->fx_file, fixP->fx_line,
8123 _("immediate offset out of range"));
8124 break;
8125
8126 default:
8127 gas_assert (0);
8128 as_fatal (_("unhandled operand code %d"), opnd);
8129 }
8130}
8131
8132/* Apply a fixup (fixP) to segment data, once it has been determined
8133 by our caller that we have all the info we need to fix it up.
8134
8135 Parameter valP is the pointer to the value of the bits. */
8136
8137void
8138md_apply_fix (fixS * fixP, valueT * valP, segT seg)
8139{
8140 offsetT value = *valP;
8141 uint32_t insn;
8142 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
8143 int scale;
8144 unsigned flags = fixP->fx_addnumber;
8145
8146 DEBUG_TRACE ("\n\n");
8147 DEBUG_TRACE ("~~~~~~~~~~~~~~~~~~~~~~~~~");
8148 DEBUG_TRACE ("Enter md_apply_fix");
8149
8150 gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
8151
8152 /* Note whether this will delete the relocation. */
8153
8154 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
8155 fixP->fx_done = 1;
8156
8157 /* Process the relocations. */
8158 switch (fixP->fx_r_type)
8159 {
8160 case BFD_RELOC_NONE:
8161 /* This will need to go in the object file. */
8162 fixP->fx_done = 0;
8163 break;
8164
8165 case BFD_RELOC_8:
8166 case BFD_RELOC_8_PCREL:
8167 if (fixP->fx_done || !seg->use_rela_p)
8168 md_number_to_chars (buf, value, 1);
8169 break;
8170
8171 case BFD_RELOC_16:
8172 case BFD_RELOC_16_PCREL:
8173 if (fixP->fx_done || !seg->use_rela_p)
8174 md_number_to_chars (buf, value, 2);
8175 break;
8176
8177 case BFD_RELOC_32:
8178 case BFD_RELOC_32_PCREL:
8179 if (fixP->fx_done || !seg->use_rela_p)
8180 md_number_to_chars (buf, value, 4);
8181 break;
8182
8183 case BFD_RELOC_64:
8184 case BFD_RELOC_64_PCREL:
8185 if (fixP->fx_done || !seg->use_rela_p)
8186 md_number_to_chars (buf, value, 8);
8187 break;
8188
8189 case BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP:
8190 /* We claim that these fixups have been processed here, even if
8191 in fact we generate an error because we do not have a reloc
8192 for them, so tc_gen_reloc() will reject them. */
8193 fixP->fx_done = 1;
8194 if (fixP->fx_addsy && !S_IS_DEFINED (fixP->fx_addsy))
8195 {
8196 as_bad_where (fixP->fx_file, fixP->fx_line,
8197 _("undefined symbol %s used as an immediate value"),
8198 S_GET_NAME (fixP->fx_addsy));
8199 goto apply_fix_return;
8200 }
8201 fix_insn (fixP, flags, value);
8202 break;
8203
8204 case BFD_RELOC_AARCH64_LD_LO19_PCREL:
a06ea964
NC
8205 if (fixP->fx_done || !seg->use_rela_p)
8206 {
89d2a2a3
MS
8207 if (value & 3)
8208 as_bad_where (fixP->fx_file, fixP->fx_line,
8209 _("pc-relative load offset not word aligned"));
8210 if (signed_overflow (value, 21))
8211 as_bad_where (fixP->fx_file, fixP->fx_line,
8212 _("pc-relative load offset out of range"));
a06ea964
NC
8213 insn = get_aarch64_insn (buf);
8214 insn |= encode_ld_lit_ofs_19 (value >> 2);
8215 put_aarch64_insn (buf, insn);
8216 }
8217 break;
8218
8219 case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
a06ea964
NC
8220 if (fixP->fx_done || !seg->use_rela_p)
8221 {
89d2a2a3
MS
8222 if (signed_overflow (value, 21))
8223 as_bad_where (fixP->fx_file, fixP->fx_line,
8224 _("pc-relative address offset out of range"));
a06ea964
NC
8225 insn = get_aarch64_insn (buf);
8226 insn |= encode_adr_imm (value);
8227 put_aarch64_insn (buf, insn);
8228 }
8229 break;
8230
8231 case BFD_RELOC_AARCH64_BRANCH19:
a06ea964
NC
8232 if (fixP->fx_done || !seg->use_rela_p)
8233 {
89d2a2a3
MS
8234 if (value & 3)
8235 as_bad_where (fixP->fx_file, fixP->fx_line,
8236 _("conditional branch target not word aligned"));
8237 if (signed_overflow (value, 21))
8238 as_bad_where (fixP->fx_file, fixP->fx_line,
8239 _("conditional branch out of range"));
a06ea964
NC
8240 insn = get_aarch64_insn (buf);
8241 insn |= encode_cond_branch_ofs_19 (value >> 2);
8242 put_aarch64_insn (buf, insn);
8243 }
8244 break;
8245
8246 case BFD_RELOC_AARCH64_TSTBR14:
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, 16))
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_tst_branch_ofs_14 (value >> 2);
8257 put_aarch64_insn (buf, insn);
8258 }
8259 break;
8260
a06ea964 8261 case BFD_RELOC_AARCH64_CALL26:
f09c556a 8262 case BFD_RELOC_AARCH64_JUMP26:
a06ea964
NC
8263 if (fixP->fx_done || !seg->use_rela_p)
8264 {
89d2a2a3
MS
8265 if (value & 3)
8266 as_bad_where (fixP->fx_file, fixP->fx_line,
8267 _("branch target not word aligned"));
8268 if (signed_overflow (value, 28))
8269 as_bad_where (fixP->fx_file, fixP->fx_line,
8270 _("branch out of range"));
a06ea964
NC
8271 insn = get_aarch64_insn (buf);
8272 insn |= encode_branch_ofs_26 (value >> 2);
8273 put_aarch64_insn (buf, insn);
8274 }
8275 break;
8276
8277 case BFD_RELOC_AARCH64_MOVW_G0:
a06ea964 8278 case BFD_RELOC_AARCH64_MOVW_G0_NC:
f09c556a 8279 case BFD_RELOC_AARCH64_MOVW_G0_S:
ca632371 8280 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
32247401
RL
8281 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
8282 case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
a06ea964
NC
8283 scale = 0;
8284 goto movw_common;
8285 case BFD_RELOC_AARCH64_MOVW_G1:
a06ea964 8286 case BFD_RELOC_AARCH64_MOVW_G1_NC:
f09c556a 8287 case BFD_RELOC_AARCH64_MOVW_G1_S:
654248e7 8288 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
32247401
RL
8289 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
8290 case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
a06ea964
NC
8291 scale = 16;
8292 goto movw_common;
43a357f9
RL
8293 case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
8294 scale = 0;
8295 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8296 /* Should always be exported to object file, see
8297 aarch64_force_relocation(). */
8298 gas_assert (!fixP->fx_done);
8299 gas_assert (seg->use_rela_p);
8300 goto movw_common;
8301 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
8302 scale = 16;
8303 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8304 /* Should always be exported to object file, see
8305 aarch64_force_relocation(). */
8306 gas_assert (!fixP->fx_done);
8307 gas_assert (seg->use_rela_p);
8308 goto movw_common;
a06ea964 8309 case BFD_RELOC_AARCH64_MOVW_G2:
a06ea964 8310 case BFD_RELOC_AARCH64_MOVW_G2_NC:
f09c556a 8311 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
8312 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
8313 case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
a06ea964
NC
8314 scale = 32;
8315 goto movw_common;
8316 case BFD_RELOC_AARCH64_MOVW_G3:
32247401 8317 case BFD_RELOC_AARCH64_MOVW_PREL_G3:
a06ea964
NC
8318 scale = 48;
8319 movw_common:
8320 if (fixP->fx_done || !seg->use_rela_p)
8321 {
8322 insn = get_aarch64_insn (buf);
8323
8324 if (!fixP->fx_done)
8325 {
8326 /* REL signed addend must fit in 16 bits */
8327 if (signed_overflow (value, 16))
8328 as_bad_where (fixP->fx_file, fixP->fx_line,
8329 _("offset out of range"));
8330 }
8331 else
8332 {
8333 /* Check for overflow and scale. */
8334 switch (fixP->fx_r_type)
8335 {
8336 case BFD_RELOC_AARCH64_MOVW_G0:
8337 case BFD_RELOC_AARCH64_MOVW_G1:
8338 case BFD_RELOC_AARCH64_MOVW_G2:
8339 case BFD_RELOC_AARCH64_MOVW_G3:
654248e7 8340 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
43a357f9 8341 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
a06ea964
NC
8342 if (unsigned_overflow (value, scale + 16))
8343 as_bad_where (fixP->fx_file, fixP->fx_line,
8344 _("unsigned value out of range"));
8345 break;
8346 case BFD_RELOC_AARCH64_MOVW_G0_S:
8347 case BFD_RELOC_AARCH64_MOVW_G1_S:
8348 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
8349 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
8350 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
8351 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
a06ea964
NC
8352 /* NOTE: We can only come here with movz or movn. */
8353 if (signed_overflow (value, scale + 16))
8354 as_bad_where (fixP->fx_file, fixP->fx_line,
8355 _("signed value out of range"));
8356 if (value < 0)
8357 {
8358 /* Force use of MOVN. */
8359 value = ~value;
8360 insn = reencode_movzn_to_movn (insn);
8361 }
8362 else
8363 {
8364 /* Force use of MOVZ. */
8365 insn = reencode_movzn_to_movz (insn);
8366 }
8367 break;
8368 default:
8369 /* Unchecked relocations. */
8370 break;
8371 }
8372 value >>= scale;
8373 }
8374
8375 /* Insert value into MOVN/MOVZ/MOVK instruction. */
8376 insn |= encode_movw_imm (value & 0xffff);
8377
8378 put_aarch64_insn (buf, insn);
8379 }
8380 break;
8381
a6bb11b2
YZ
8382 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC:
8383 fixP->fx_r_type = (ilp32_p
8384 ? BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC
8385 : BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC);
8386 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8387 /* Should always be exported to object file, see
8388 aarch64_force_relocation(). */
8389 gas_assert (!fixP->fx_done);
8390 gas_assert (seg->use_rela_p);
8391 break;
8392
8393 case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC:
8394 fixP->fx_r_type = (ilp32_p
8395 ? BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC
f955cccf 8396 : BFD_RELOC_AARCH64_TLSDESC_LD64_LO12);
a6bb11b2
YZ
8397 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8398 /* Should always be exported to object file, see
8399 aarch64_force_relocation(). */
8400 gas_assert (!fixP->fx_done);
8401 gas_assert (seg->use_rela_p);
8402 break;
8403
f955cccf 8404 case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
2c0a3565 8405 case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
389b8029 8406 case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
2c0a3565 8407 case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
f955cccf 8408 case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
1ada945d 8409 case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
a06ea964 8410 case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
2c0a3565 8411 case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
3c12b054 8412 case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
3e8286c0 8413 case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
1aa66fb1 8414 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
a06ea964 8415 case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
a6bb11b2 8416 case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
2c0a3565 8417 case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
043bf05a 8418 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
3b957e5b
RL
8419 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
8420 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
49df5539 8421 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12:
70151fb5 8422 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12:
13289c10 8423 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC:
a12fad50 8424 case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
1107e076 8425 case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6c37fedc 8426 case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
4c562523
JW
8427 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12:
8428 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
8429 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12:
8430 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
8431 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12:
8432 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
8433 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
8434 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
49df5539
JW
8435 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
8436 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
8437 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
8438 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
8439 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
84f1b9fb
RL
8440 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
8441 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
8442 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
8443 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
8444 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
8445 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
8446 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
8447 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
a06ea964 8448 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
2c0a3565 8449 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
a06ea964 8450 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
a06ea964
NC
8451 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
8452 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
2c0a3565
MS
8453 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
8454 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
8455 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
a06ea964
NC
8456 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8457 /* Should always be exported to object file, see
8458 aarch64_force_relocation(). */
8459 gas_assert (!fixP->fx_done);
8460 gas_assert (seg->use_rela_p);
8461 break;
8462
a6bb11b2
YZ
8463 case BFD_RELOC_AARCH64_LD_GOT_LO12_NC:
8464 /* Should always be exported to object file, see
8465 aarch64_force_relocation(). */
8466 fixP->fx_r_type = (ilp32_p
8467 ? BFD_RELOC_AARCH64_LD32_GOT_LO12_NC
8468 : BFD_RELOC_AARCH64_LD64_GOT_LO12_NC);
8469 gas_assert (!fixP->fx_done);
8470 gas_assert (seg->use_rela_p);
8471 break;
8472
a06ea964 8473 case BFD_RELOC_AARCH64_ADD_LO12:
f09c556a
JW
8474 case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
8475 case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
8476 case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
8477 case BFD_RELOC_AARCH64_GOT_LD_PREL19:
8478 case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
3d715ce4 8479 case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
87f5fbcc 8480 case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
a921b5bd 8481 case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
f09c556a
JW
8482 case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
8483 case BFD_RELOC_AARCH64_LDST128_LO12:
a06ea964
NC
8484 case BFD_RELOC_AARCH64_LDST16_LO12:
8485 case BFD_RELOC_AARCH64_LDST32_LO12:
8486 case BFD_RELOC_AARCH64_LDST64_LO12:
f09c556a 8487 case BFD_RELOC_AARCH64_LDST8_LO12:
a06ea964
NC
8488 /* Should always be exported to object file, see
8489 aarch64_force_relocation(). */
8490 gas_assert (!fixP->fx_done);
8491 gas_assert (seg->use_rela_p);
8492 break;
8493
8494 case BFD_RELOC_AARCH64_TLSDESC_ADD:
a06ea964 8495 case BFD_RELOC_AARCH64_TLSDESC_CALL:
f09c556a 8496 case BFD_RELOC_AARCH64_TLSDESC_LDR:
a06ea964
NC
8497 break;
8498
b97e87cc
NC
8499 case BFD_RELOC_UNUSED:
8500 /* An error will already have been reported. */
8501 break;
8502
a06ea964
NC
8503 default:
8504 as_bad_where (fixP->fx_file, fixP->fx_line,
8505 _("unexpected %s fixup"),
8506 bfd_get_reloc_code_name (fixP->fx_r_type));
8507 break;
8508 }
8509
dc1e8a47 8510 apply_fix_return:
a06ea964
NC
8511 /* Free the allocated the struct aarch64_inst.
8512 N.B. currently there are very limited number of fix-up types actually use
8513 this field, so the impact on the performance should be minimal . */
9fbb53c7 8514 free (fixP->tc_fix_data.inst);
a06ea964
NC
8515
8516 return;
8517}
8518
8519/* Translate internal representation of relocation info to BFD target
8520 format. */
8521
8522arelent *
8523tc_gen_reloc (asection * section, fixS * fixp)
8524{
8525 arelent *reloc;
8526 bfd_reloc_code_real_type code;
8527
325801bd 8528 reloc = XNEW (arelent);
a06ea964 8529
325801bd 8530 reloc->sym_ptr_ptr = XNEW (asymbol *);
a06ea964
NC
8531 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
8532 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
8533
8534 if (fixp->fx_pcrel)
8535 {
8536 if (section->use_rela_p)
8537 fixp->fx_offset -= md_pcrel_from_section (fixp, section);
8538 else
8539 fixp->fx_offset = reloc->address;
8540 }
8541 reloc->addend = fixp->fx_offset;
8542
8543 code = fixp->fx_r_type;
8544 switch (code)
8545 {
8546 case BFD_RELOC_16:
8547 if (fixp->fx_pcrel)
8548 code = BFD_RELOC_16_PCREL;
8549 break;
8550
8551 case BFD_RELOC_32:
8552 if (fixp->fx_pcrel)
8553 code = BFD_RELOC_32_PCREL;
8554 break;
8555
8556 case BFD_RELOC_64:
8557 if (fixp->fx_pcrel)
8558 code = BFD_RELOC_64_PCREL;
8559 break;
8560
8561 default:
8562 break;
8563 }
8564
8565 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
8566 if (reloc->howto == NULL)
8567 {
8568 as_bad_where (fixp->fx_file, fixp->fx_line,
8569 _
8570 ("cannot represent %s relocation in this object file format"),
8571 bfd_get_reloc_code_name (code));
8572 return NULL;
8573 }
8574
8575 return reloc;
8576}
8577
8578/* This fix_new is called by cons via TC_CONS_FIX_NEW. */
8579
8580void
8581cons_fix_new_aarch64 (fragS * frag, int where, int size, expressionS * exp)
8582{
8583 bfd_reloc_code_real_type type;
8584 int pcrel = 0;
8585
8586 /* Pick a reloc.
8587 FIXME: @@ Should look at CPU word size. */
8588 switch (size)
8589 {
8590 case 1:
8591 type = BFD_RELOC_8;
8592 break;
8593 case 2:
8594 type = BFD_RELOC_16;
8595 break;
8596 case 4:
8597 type = BFD_RELOC_32;
8598 break;
8599 case 8:
8600 type = BFD_RELOC_64;
8601 break;
8602 default:
8603 as_bad (_("cannot do %u-byte relocation"), size);
8604 type = BFD_RELOC_UNUSED;
8605 break;
8606 }
8607
8608 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
8609}
8610
8611int
8612aarch64_force_relocation (struct fix *fixp)
8613{
8614 switch (fixp->fx_r_type)
8615 {
8616 case BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP:
8617 /* Perform these "immediate" internal relocations
8618 even if the symbol is extern or weak. */
8619 return 0;
8620
a6bb11b2 8621 case BFD_RELOC_AARCH64_LD_GOT_LO12_NC:
f09c556a
JW
8622 case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC:
8623 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC:
a6bb11b2
YZ
8624 /* Pseudo relocs that need to be fixed up according to
8625 ilp32_p. */
8626 return 0;
8627
2c0a3565
MS
8628 case BFD_RELOC_AARCH64_ADD_LO12:
8629 case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
8630 case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
8631 case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
8632 case BFD_RELOC_AARCH64_GOT_LD_PREL19:
8633 case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
3d715ce4 8634 case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
87f5fbcc 8635 case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
a921b5bd 8636 case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
2c0a3565
MS
8637 case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
8638 case BFD_RELOC_AARCH64_LDST128_LO12:
8639 case BFD_RELOC_AARCH64_LDST16_LO12:
8640 case BFD_RELOC_AARCH64_LDST32_LO12:
8641 case BFD_RELOC_AARCH64_LDST64_LO12:
8642 case BFD_RELOC_AARCH64_LDST8_LO12:
f955cccf 8643 case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
2c0a3565 8644 case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
389b8029 8645 case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
2c0a3565 8646 case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
f955cccf 8647 case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
1ada945d 8648 case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
43a357f9
RL
8649 case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
8650 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
a06ea964 8651 case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
2c0a3565 8652 case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
3c12b054 8653 case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
3e8286c0 8654 case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
1aa66fb1 8655 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
a06ea964 8656 case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
a6bb11b2 8657 case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
2c0a3565 8658 case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
043bf05a 8659 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
3b957e5b
RL
8660 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
8661 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
8662 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12:
70151fb5 8663 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12:
13289c10 8664 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC:
a12fad50 8665 case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
1107e076 8666 case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6c37fedc 8667 case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
4c562523
JW
8668 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12:
8669 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
8670 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12:
8671 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
8672 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12:
8673 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
8674 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
8675 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
49df5539
JW
8676 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
8677 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
8678 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
8679 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
8680 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
84f1b9fb
RL
8681 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
8682 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
8683 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
8684 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
8685 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
8686 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
8687 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
8688 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
a06ea964 8689 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
2c0a3565 8690 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
a06ea964 8691 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
a06ea964
NC
8692 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
8693 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
2c0a3565
MS
8694 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
8695 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
8696 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
a06ea964
NC
8697 /* Always leave these relocations for the linker. */
8698 return 1;
8699
f0070c1e
SP
8700 case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
8701 case BFD_RELOC_AARCH64_BRANCH19:
8702 case BFD_RELOC_AARCH64_TSTBR14:
8703 case BFD_RELOC_AARCH64_CALL26:
8704 case BFD_RELOC_AARCH64_JUMP26:
8705 gas_assert (fixp->fx_addsy != NULL);
8706
8707 /* A jump/call destination will get adjusted to section+offset only
8708 if both caller and callee are of the same type. */
8709 if (symbol_section_p (fixp->fx_addsy))
8710 break;
8711
8712 if ((fixp->tc_fix_data.c64
8713 && !AARCH64_IS_C64 (fixp->fx_addsy))
8714 || (!fixp->tc_fix_data.c64
8715 && AARCH64_IS_C64 (fixp->fx_addsy)))
8716 return 1;
8717
8718 break;
8719
a06ea964
NC
8720 default:
8721 break;
8722 }
8723
8724 return generic_force_reloc (fixp);
8725}
8726
8727#ifdef OBJ_ELF
8728
3c0367d0
JW
8729/* Implement md_after_parse_args. This is the earliest time we need to decide
8730 ABI. If no -mabi specified, the ABI will be decided by target triplet. */
8731
8732void
8733aarch64_after_parse_args (void)
8734{
8735 if (aarch64_abi != AARCH64_ABI_NONE)
8736 return;
8737
8738 /* DEFAULT_ARCH will have ":32" extension if it's configured for ILP32. */
8739 if (strlen (default_arch) > 7 && strcmp (default_arch + 7, ":32") == 0)
8740 aarch64_abi = AARCH64_ABI_ILP32;
8741 else
8742 aarch64_abi = AARCH64_ABI_LP64;
8743}
8744
a06ea964
NC
8745const char *
8746elf64_aarch64_target_format (void)
8747{
12400dcc
AM
8748#ifdef TE_CLOUDABI
8749 /* FIXME: What to do for ilp32_p ? */
8750 if (target_big_endian)
8751 return "elf64-bigaarch64-cloudabi";
8752 else
8753 return "elf64-littleaarch64-cloudabi";
8754#else
a06ea964 8755 if (target_big_endian)
cec5225b 8756 return ilp32_p ? "elf32-bigaarch64" : "elf64-bigaarch64";
a06ea964 8757 else
cec5225b 8758 return ilp32_p ? "elf32-littleaarch64" : "elf64-littleaarch64";
12400dcc 8759#endif
a06ea964
NC
8760}
8761
8762void
8763aarch64elf_frob_symbol (symbolS * symp, int *puntp)
8764{
8765 elf_frob_symbol (symp, puntp);
8766}
8767#endif
8768
8769/* MD interface: Finalization. */
8770
8771/* A good place to do this, although this was probably not intended
8772 for this kind of use. We need to dump the literal pool before
8773 references are made to a null symbol pointer. */
8774
8775void
8776aarch64_cleanup (void)
8777{
8778 literal_pool *pool;
8779
8780 for (pool = list_of_pools; pool; pool = pool->next)
8781 {
8782 /* Put it at the end of the relevant section. */
8783 subseg_set (pool->section, pool->sub_section);
8784 s_ltorg (0);
8785 }
8786}
8787
8788#ifdef OBJ_ELF
8789/* Remove any excess mapping symbols generated for alignment frags in
8790 SEC. We may have created a mapping symbol before a zero byte
8791 alignment; remove it if there's a mapping symbol after the
8792 alignment. */
8793static void
8794check_mapping_symbols (bfd * abfd ATTRIBUTE_UNUSED, asection * sec,
8795 void *dummy ATTRIBUTE_UNUSED)
8796{
8797 segment_info_type *seginfo = seg_info (sec);
8798 fragS *fragp;
8799
8800 if (seginfo == NULL || seginfo->frchainP == NULL)
8801 return;
8802
8803 for (fragp = seginfo->frchainP->frch_root;
8804 fragp != NULL; fragp = fragp->fr_next)
8805 {
8806 symbolS *sym = fragp->tc_frag_data.last_map;
8807 fragS *next = fragp->fr_next;
8808
8809 /* Variable-sized frags have been converted to fixed size by
8810 this point. But if this was variable-sized to start with,
8811 there will be a fixed-size frag after it. So don't handle
8812 next == NULL. */
8813 if (sym == NULL || next == NULL)
8814 continue;
8815
8816 if (S_GET_VALUE (sym) < next->fr_address)
8817 /* Not at the end of this frag. */
8818 continue;
8819 know (S_GET_VALUE (sym) == next->fr_address);
8820
8821 do
8822 {
8823 if (next->tc_frag_data.first_map != NULL)
8824 {
8825 /* Next frag starts with a mapping symbol. Discard this
8826 one. */
8827 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
8828 break;
8829 }
8830
8831 if (next->fr_next == NULL)
8832 {
8833 /* This mapping symbol is at the end of the section. Discard
8834 it. */
8835 know (next->fr_fix == 0 && next->fr_var == 0);
8836 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
8837 break;
8838 }
8839
8840 /* As long as we have empty frags without any mapping symbols,
8841 keep looking. */
8842 /* If the next frag is non-empty and does not start with a
8843 mapping symbol, then this mapping symbol is required. */
8844 if (next->fr_address != next->fr_next->fr_address)
8845 break;
8846
8847 next = next->fr_next;
8848 }
8849 while (next != NULL);
8850 }
8851}
8852#endif
8853
8b21361b
SP
8854/* Avoid relocations from using section symbols in some cases. */
8855bfd_boolean
8856aarch64_fix_adjustable (struct fix *fixP)
8857{
8858 switch (fixP->fx_r_type)
8859 {
f0070c1e
SP
8860 /* We need to retain symbol information when jumping between A64 and C64
8861 states or between two C64 functions. In the C64 -> C64 situation it's
8862 really only a corner case that breaks when symbols get replaced with
8863 section symbols; this is when the jump distance is longer than what a
8864 branch instruction can handle and we want to branch through a stub.
8865 In such a case, the linker needs to know the symbol types of the
8866 source and the destination and section symbols are an unreliable
8867 source of this information. */
8b21361b
SP
8868 case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
8869 case BFD_RELOC_AARCH64_ADD_LO12:
8870 case BFD_RELOC_AARCH64_BRANCH19:
8871 case BFD_RELOC_AARCH64_TSTBR14:
8872 case BFD_RELOC_AARCH64_JUMP26:
8873 case BFD_RELOC_AARCH64_CALL26:
f0070c1e 8874 if (fixP->tc_fix_data.c64 || AARCH64_IS_C64 (fixP->fx_addsy))
8b21361b
SP
8875 return FALSE;
8876 break;
8877 default:
8878 break;
8879 }
8880
8881 return TRUE;
8882}
8883
a06ea964
NC
8884/* Adjust the symbol table. */
8885
8886void
8887aarch64_adjust_symtab (void)
8888{
8889#ifdef OBJ_ELF
8b21361b
SP
8890 symbolS * sym;
8891
8892 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
8893 {
8894 if (AARCH64_IS_C64 (sym)
8895 && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION))
8896 {
8897 elf_symbol_type * elf_sym;
8898
8899 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
8900
8901 if (!bfd_is_aarch64_special_symbol_name
8902 (elf_sym->symbol.name, BFD_AARCH64_SPECIAL_SYM_TYPE_ANY))
8903 elf_sym->internal_elf_sym.st_target_internal = ST_BRANCH_TO_C64;
8904 }
8905 }
8906
a06ea964
NC
8907 /* Remove any overlapping mapping symbols generated by alignment frags. */
8908 bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
8909 /* Now do generic ELF adjustments. */
8910 elf_adjust_symtab ();
8911#endif
8912}
8913
8914static void
629310ab 8915checked_hash_insert (htab_t table, const char *key, void *value)
a06ea964 8916{
fe0e921f 8917 str_hash_insert (table, key, value, 0);
a06ea964
NC
8918}
8919
fa63795f 8920static void
629310ab 8921sysreg_hash_insert (htab_t table, const char *key, void *value)
fa63795f
AC
8922{
8923 gas_assert (strlen (key) < AARCH64_MAX_SYSREG_NAME_LEN);
8924 checked_hash_insert (table, key, value);
8925}
8926
a06ea964
NC
8927static void
8928fill_instruction_hash_table (void)
8929{
8930 aarch64_opcode *opcode = aarch64_opcode_table;
8931
8932 while (opcode->name != NULL)
8933 {
8934 templates *templ, *new_templ;
629310ab 8935 templ = str_hash_find (aarch64_ops_hsh, opcode->name);
a06ea964 8936
add39d23 8937 new_templ = XNEW (templates);
a06ea964
NC
8938 new_templ->opcode = opcode;
8939 new_templ->next = NULL;
8940
8941 if (!templ)
8942 checked_hash_insert (aarch64_ops_hsh, opcode->name, (void *) new_templ);
8943 else
8944 {
8945 new_templ->next = templ->next;
8946 templ->next = new_templ;
8947 }
8948 ++opcode;
8949 }
8950}
8951
8952static inline void
8953convert_to_upper (char *dst, const char *src, size_t num)
8954{
8955 unsigned int i;
8956 for (i = 0; i < num && *src != '\0'; ++i, ++dst, ++src)
8957 *dst = TOUPPER (*src);
8958 *dst = '\0';
8959}
8960
8961/* Assume STR point to a lower-case string, allocate, convert and return
8962 the corresponding upper-case string. */
8963static inline const char*
8964get_upper_str (const char *str)
8965{
8966 char *ret;
8967 size_t len = strlen (str);
325801bd 8968 ret = XNEWVEC (char, len + 1);
a06ea964
NC
8969 convert_to_upper (ret, str, len);
8970 return ret;
8971}
8972
8973/* MD interface: Initialization. */
8974
8975void
8976md_begin (void)
8977{
8978 unsigned mach;
8979 unsigned int i;
8980
f16c3d4f
AM
8981 aarch64_ops_hsh = str_htab_create ();
8982 aarch64_cond_hsh = str_htab_create ();
8983 aarch64_shift_hsh = str_htab_create ();
8984 aarch64_sys_regs_hsh = str_htab_create ();
8985 aarch64_pstatefield_hsh = str_htab_create ();
8986 aarch64_sys_regs_ic_hsh = str_htab_create ();
8987 aarch64_sys_regs_dc_hsh = str_htab_create ();
8988 aarch64_sys_regs_at_hsh = str_htab_create ();
8989 aarch64_sys_regs_tlbi_hsh = str_htab_create ();
8990 aarch64_sys_regs_sr_hsh = str_htab_create ();
8991 aarch64_reg_hsh = str_htab_create ();
8992 aarch64_barrier_opt_hsh = str_htab_create ();
8993 aarch64_nzcv_hsh = str_htab_create ();
8994 aarch64_pldop_hsh = str_htab_create ();
8995 aarch64_hint_opt_hsh = str_htab_create ();
a06ea964
NC
8996
8997 fill_instruction_hash_table ();
8998
8999 for (i = 0; aarch64_sys_regs[i].name != NULL; ++i)
fa63795f 9000 sysreg_hash_insert (aarch64_sys_regs_hsh, aarch64_sys_regs[i].name,
a06ea964
NC
9001 (void *) (aarch64_sys_regs + i));
9002
9003 for (i = 0; aarch64_pstatefields[i].name != NULL; ++i)
fa63795f 9004 sysreg_hash_insert (aarch64_pstatefield_hsh,
a06ea964
NC
9005 aarch64_pstatefields[i].name,
9006 (void *) (aarch64_pstatefields + i));
9007
875880c6 9008 for (i = 0; aarch64_sys_regs_ic[i].name != NULL; i++)
fa63795f 9009 sysreg_hash_insert (aarch64_sys_regs_ic_hsh,
875880c6 9010 aarch64_sys_regs_ic[i].name,
a06ea964
NC
9011 (void *) (aarch64_sys_regs_ic + i));
9012
875880c6 9013 for (i = 0; aarch64_sys_regs_dc[i].name != NULL; i++)
fa63795f 9014 sysreg_hash_insert (aarch64_sys_regs_dc_hsh,
875880c6 9015 aarch64_sys_regs_dc[i].name,
a06ea964
NC
9016 (void *) (aarch64_sys_regs_dc + i));
9017
875880c6 9018 for (i = 0; aarch64_sys_regs_at[i].name != NULL; i++)
fa63795f 9019 sysreg_hash_insert (aarch64_sys_regs_at_hsh,
875880c6 9020 aarch64_sys_regs_at[i].name,
a06ea964
NC
9021 (void *) (aarch64_sys_regs_at + i));
9022
875880c6 9023 for (i = 0; aarch64_sys_regs_tlbi[i].name != NULL; i++)
fa63795f 9024 sysreg_hash_insert (aarch64_sys_regs_tlbi_hsh,
875880c6 9025 aarch64_sys_regs_tlbi[i].name,
a06ea964
NC
9026 (void *) (aarch64_sys_regs_tlbi + i));
9027
2ac435d4 9028 for (i = 0; aarch64_sys_regs_sr[i].name != NULL; i++)
fa63795f 9029 sysreg_hash_insert (aarch64_sys_regs_sr_hsh,
2ac435d4
SD
9030 aarch64_sys_regs_sr[i].name,
9031 (void *) (aarch64_sys_regs_sr + i));
9032
a06ea964
NC
9033 for (i = 0; i < ARRAY_SIZE (reg_names); i++)
9034 checked_hash_insert (aarch64_reg_hsh, reg_names[i].name,
9035 (void *) (reg_names + i));
9036
9037 for (i = 0; i < ARRAY_SIZE (nzcv_names); i++)
9038 checked_hash_insert (aarch64_nzcv_hsh, nzcv_names[i].template,
9039 (void *) (nzcv_names + i));
9040
9041 for (i = 0; aarch64_operand_modifiers[i].name != NULL; i++)
9042 {
9043 const char *name = aarch64_operand_modifiers[i].name;
9044 checked_hash_insert (aarch64_shift_hsh, name,
9045 (void *) (aarch64_operand_modifiers + i));
9046 /* Also hash the name in the upper case. */
9047 checked_hash_insert (aarch64_shift_hsh, get_upper_str (name),
9048 (void *) (aarch64_operand_modifiers + i));
9049 }
9050
9051 for (i = 0; i < ARRAY_SIZE (aarch64_conds); i++)
9052 {
9053 unsigned int j;
9054 /* A condition code may have alias(es), e.g. "cc", "lo" and "ul" are
9055 the same condition code. */
9056 for (j = 0; j < ARRAY_SIZE (aarch64_conds[i].names); ++j)
9057 {
9058 const char *name = aarch64_conds[i].names[j];
9059 if (name == NULL)
9060 break;
9061 checked_hash_insert (aarch64_cond_hsh, name,
9062 (void *) (aarch64_conds + i));
9063 /* Also hash the name in the upper case. */
9064 checked_hash_insert (aarch64_cond_hsh, get_upper_str (name),
9065 (void *) (aarch64_conds + i));
9066 }
9067 }
9068
9069 for (i = 0; i < ARRAY_SIZE (aarch64_barrier_options); i++)
9070 {
9071 const char *name = aarch64_barrier_options[i].name;
9072 /* Skip xx00 - the unallocated values of option. */
9073 if ((i & 0x3) == 0)
9074 continue;
9075 checked_hash_insert (aarch64_barrier_opt_hsh, name,
9076 (void *) (aarch64_barrier_options + i));
9077 /* Also hash the name in the upper case. */
9078 checked_hash_insert (aarch64_barrier_opt_hsh, get_upper_str (name),
9079 (void *) (aarch64_barrier_options + i));
9080 }
9081
9082 for (i = 0; i < ARRAY_SIZE (aarch64_prfops); i++)
9083 {
9084 const char* name = aarch64_prfops[i].name;
a1ccaec9
YZ
9085 /* Skip the unallocated hint encodings. */
9086 if (name == NULL)
a06ea964
NC
9087 continue;
9088 checked_hash_insert (aarch64_pldop_hsh, name,
9089 (void *) (aarch64_prfops + i));
9090 /* Also hash the name in the upper case. */
9091 checked_hash_insert (aarch64_pldop_hsh, get_upper_str (name),
9092 (void *) (aarch64_prfops + i));
9093 }
9094
1e6f4800
MW
9095 for (i = 0; aarch64_hint_options[i].name != NULL; i++)
9096 {
9097 const char* name = aarch64_hint_options[i].name;
0a821c4f 9098 const char* upper_name = get_upper_str(name);
1e6f4800
MW
9099
9100 checked_hash_insert (aarch64_hint_opt_hsh, name,
9101 (void *) (aarch64_hint_options + i));
0a821c4f
AP
9102
9103 /* Also hash the name in the upper case if not the same. */
9104 if (strcmp (name, upper_name) != 0)
9105 checked_hash_insert (aarch64_hint_opt_hsh, upper_name,
9106 (void *) (aarch64_hint_options + i));
1e6f4800
MW
9107 }
9108
a06ea964
NC
9109 /* Set the cpu variant based on the command-line options. */
9110 if (!mcpu_cpu_opt)
9111 mcpu_cpu_opt = march_cpu_opt;
9112
9113 if (!mcpu_cpu_opt)
9114 mcpu_cpu_opt = &cpu_default;
9115
9116 cpu_variant = *mcpu_cpu_opt;
9117
9118 /* Record the CPU type. */
cec5225b 9119 mach = ilp32_p ? bfd_mach_aarch64_ilp32 : bfd_mach_aarch64;
a06ea964
NC
9120
9121 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
9122}
9123
9124/* Command line processing. */
9125
9126const char *md_shortopts = "m:";
9127
9128#ifdef AARCH64_BI_ENDIAN
9129#define OPTION_EB (OPTION_MD_BASE + 0)
9130#define OPTION_EL (OPTION_MD_BASE + 1)
9131#else
9132#if TARGET_BYTES_BIG_ENDIAN
9133#define OPTION_EB (OPTION_MD_BASE + 0)
9134#else
9135#define OPTION_EL (OPTION_MD_BASE + 1)
9136#endif
9137#endif
9138
9139struct option md_longopts[] = {
9140#ifdef OPTION_EB
9141 {"EB", no_argument, NULL, OPTION_EB},
9142#endif
9143#ifdef OPTION_EL
9144 {"EL", no_argument, NULL, OPTION_EL},
9145#endif
9146 {NULL, no_argument, NULL, 0}
9147};
9148
9149size_t md_longopts_size = sizeof (md_longopts);
9150
9151struct aarch64_option_table
9152{
e0471c16
TS
9153 const char *option; /* Option name to match. */
9154 const char *help; /* Help information. */
a06ea964
NC
9155 int *var; /* Variable to change. */
9156 int value; /* What to change it to. */
9157 char *deprecated; /* If non-null, print this message. */
9158};
9159
9160static struct aarch64_option_table aarch64_opts[] = {
9161 {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
9162 {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
9163 NULL},
9164#ifdef DEBUG_AARCH64
9165 {"mdebug-dump", N_("temporary switch for dumping"), &debug_dump, 1, NULL},
9166#endif /* DEBUG_AARCH64 */
9167 {"mverbose-error", N_("output verbose error messages"), &verbose_error_p, 1,
9168 NULL},
a52e6fd3
YZ
9169 {"mno-verbose-error", N_("do not output verbose error messages"),
9170 &verbose_error_p, 0, NULL},
a06ea964
NC
9171 {NULL, NULL, NULL, 0, NULL}
9172};
9173
9174struct aarch64_cpu_option_table
9175{
e0471c16 9176 const char *name;
a06ea964
NC
9177 const aarch64_feature_set value;
9178 /* The canonical name of the CPU, or NULL to use NAME converted to upper
9179 case. */
9180 const char *canonical_name;
9181};
9182
9183/* This list should, at a minimum, contain all the cpu names
9184 recognized by GCC. */
9185static const struct aarch64_cpu_option_table aarch64_cpus[] = {
9186 {"all", AARCH64_ANY, NULL},
546053ac
DZ
9187 {"cortex-a34", AARCH64_FEATURE (AARCH64_ARCH_V8,
9188 AARCH64_FEATURE_CRC), "Cortex-A34"},
9c352f1c
JG
9189 {"cortex-a35", AARCH64_FEATURE (AARCH64_ARCH_V8,
9190 AARCH64_FEATURE_CRC), "Cortex-A35"},
aa31c464
JW
9191 {"cortex-a53", AARCH64_FEATURE (AARCH64_ARCH_V8,
9192 AARCH64_FEATURE_CRC), "Cortex-A53"},
9193 {"cortex-a57", AARCH64_FEATURE (AARCH64_ARCH_V8,
9194 AARCH64_FEATURE_CRC), "Cortex-A57"},
2abdd192
JW
9195 {"cortex-a72", AARCH64_FEATURE (AARCH64_ARCH_V8,
9196 AARCH64_FEATURE_CRC), "Cortex-A72"},
1aa70332
KT
9197 {"cortex-a73", AARCH64_FEATURE (AARCH64_ARCH_V8,
9198 AARCH64_FEATURE_CRC), "Cortex-A73"},
1e292627 9199 {"cortex-a55", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
1c5c938a 9200 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16 | AARCH64_FEATURE_DOTPROD),
1e292627
JG
9201 "Cortex-A55"},
9202 {"cortex-a75", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
1c5c938a 9203 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16 | AARCH64_FEATURE_DOTPROD),
1e292627 9204 "Cortex-A75"},
c2a0f929 9205 {"cortex-a76", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9206 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16 | AARCH64_FEATURE_DOTPROD),
9207 "Cortex-A76"},
546053ac
DZ
9208 {"cortex-a76ae", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9209 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9210 | AARCH64_FEATURE_DOTPROD
9211 | AARCH64_FEATURE_SSBS),
9212 "Cortex-A76AE"},
9213 {"cortex-a77", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9214 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9215 | AARCH64_FEATURE_DOTPROD
9216 | AARCH64_FEATURE_SSBS),
9217 "Cortex-A77"},
9218 {"cortex-a65", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9219 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9220 | AARCH64_FEATURE_DOTPROD
9221 | AARCH64_FEATURE_SSBS),
9222 "Cortex-A65"},
9223 {"cortex-a65ae", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9224 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9225 | AARCH64_FEATURE_DOTPROD
9226 | AARCH64_FEATURE_SSBS),
9227 "Cortex-A65AE"},
77718e5b
PW
9228 {"cortex-a78", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9229 AARCH64_FEATURE_F16
9230 | AARCH64_FEATURE_RCPC
9231 | AARCH64_FEATURE_DOTPROD
9232 | AARCH64_FEATURE_SSBS
9233 | AARCH64_FEATURE_PROFILE),
9234 "Cortex-A78"},
9235 {"cortex-a78ae", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9236 AARCH64_FEATURE_F16
9237 | AARCH64_FEATURE_RCPC
9238 | AARCH64_FEATURE_DOTPROD
9239 | AARCH64_FEATURE_SSBS
9240 | AARCH64_FEATURE_PROFILE),
9241 "Cortex-A78AE"},
c8fcc360
KT
9242 {"ares", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9243 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16
9244 | AARCH64_FEATURE_DOTPROD
9245 | AARCH64_FEATURE_PROFILE),
9246 "Ares"},
2412d878
EM
9247 {"exynos-m1", AARCH64_FEATURE (AARCH64_ARCH_V8,
9248 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO),
9249 "Samsung Exynos M1"},
2fe9c2a0 9250 {"falkor", AARCH64_FEATURE (AARCH64_ARCH_V8,
e58ff055
JW
9251 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO
9252 | AARCH64_FEATURE_RDMA),
2fe9c2a0 9253 "Qualcomm Falkor"},
516dbc44
KT
9254 {"neoverse-e1", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9255 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16
9256 | AARCH64_FEATURE_DOTPROD
9257 | AARCH64_FEATURE_SSBS),
9258 "Neoverse E1"},
38e75bf2
KT
9259 {"neoverse-n1", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9260 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16
9261 | AARCH64_FEATURE_DOTPROD
9262 | AARCH64_FEATURE_PROFILE),
9263 "Neoverse N1"},
990e5268
AC
9264 {"neoverse-n2", AARCH64_FEATURE (AARCH64_ARCH_V8_5,
9265 AARCH64_FEATURE_BFLOAT16
9266 | AARCH64_FEATURE_I8MM
9267 | AARCH64_FEATURE_F16
9268 | AARCH64_FEATURE_SVE
9269 | AARCH64_FEATURE_SVE2
9270 | AARCH64_FEATURE_SVE2_BITPERM
9271 | AARCH64_FEATURE_MEMTAG
9272 | AARCH64_FEATURE_RNG),
9273 "Neoverse N2"},
c769fd6a
AC
9274 {"neoverse-v1", AARCH64_FEATURE (AARCH64_ARCH_V8_4,
9275 AARCH64_FEATURE_PROFILE
9276 | AARCH64_FEATURE_CVADP
9277 | AARCH64_FEATURE_SVE
9278 | AARCH64_FEATURE_SSBS
9279 | AARCH64_FEATURE_RNG
9280 | AARCH64_FEATURE_F16
9281 | AARCH64_FEATURE_BFLOAT16
9282 | AARCH64_FEATURE_I8MM), "Neoverse V1"},
6b21c2bf 9283 {"qdf24xx", AARCH64_FEATURE (AARCH64_ARCH_V8,
e58ff055
JW
9284 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO
9285 | AARCH64_FEATURE_RDMA),
6b21c2bf 9286 "Qualcomm QDF24XX"},
eb5c42e5 9287 {"saphira", AARCH64_FEATURE (AARCH64_ARCH_V8_4,
7605d944
SP
9288 AARCH64_FEATURE_CRYPTO | AARCH64_FEATURE_PROFILE),
9289 "Qualcomm Saphira"},
faade851
JW
9290 {"thunderx", AARCH64_FEATURE (AARCH64_ARCH_V8,
9291 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO),
9292 "Cavium ThunderX"},
9f99c22e
VP
9293 {"vulcan", AARCH64_FEATURE (AARCH64_ARCH_V8_1,
9294 AARCH64_FEATURE_CRYPTO),
0a8be2fe 9295 "Broadcom Vulcan"},
070cb956
PT
9296 /* The 'xgene-1' name is an older name for 'xgene1', which was used
9297 in earlier releases and is superseded by 'xgene1' in all
9298 tools. */
9877c63c 9299 {"xgene-1", AARCH64_ARCH_V8, "APM X-Gene 1"},
070cb956 9300 {"xgene1", AARCH64_ARCH_V8, "APM X-Gene 1"},
aa31c464
JW
9301 {"xgene2", AARCH64_FEATURE (AARCH64_ARCH_V8,
9302 AARCH64_FEATURE_CRC), "APM X-Gene 2"},
f1363b0f 9303 {"cortex-r82", AARCH64_ARCH_V8_R, "Cortex-R82"},
47e1f9de 9304 {"cortex-x1", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
f9b1d75e
PW
9305 AARCH64_FEATURE_F16
9306 | AARCH64_FEATURE_RCPC
9307 | AARCH64_FEATURE_DOTPROD
9308 | AARCH64_FEATURE_SSBS
9309 | AARCH64_FEATURE_PROFILE),
9310 "Cortex-X1"},
a06ea964
NC
9311 {"generic", AARCH64_ARCH_V8, NULL},
9312
a06ea964
NC
9313 {NULL, AARCH64_ARCH_NONE, NULL}
9314};
9315
9316struct aarch64_arch_option_table
9317{
e0471c16 9318 const char *name;
a06ea964
NC
9319 const aarch64_feature_set value;
9320};
9321
9322/* This list should, at a minimum, contain all the architecture names
9323 recognized by GCC. */
9324static const struct aarch64_arch_option_table aarch64_archs[] = {
9325 {"all", AARCH64_ANY},
5a1ad39d 9326 {"armv8-a", AARCH64_ARCH_V8},
88f0ea34 9327 {"armv8.1-a", AARCH64_ARCH_V8_1},
acb787b0 9328 {"armv8.2-a", AARCH64_ARCH_V8_2},
1924ff75 9329 {"armv8.3-a", AARCH64_ARCH_V8_3},
b6b9ca0c 9330 {"armv8.4-a", AARCH64_ARCH_V8_4},
70d56181 9331 {"armv8.5-a", AARCH64_ARCH_V8_5},
8ae2d3d9 9332 {"armv8.6-a", AARCH64_ARCH_V8_6},
95830c98 9333 {"armv8-r", AARCH64_ARCH_V8_R},
3493da5c 9334 {"morello", AARCH64_ARCH_MORELLO},
a06ea964
NC
9335 {NULL, AARCH64_ARCH_NONE}
9336};
9337
9338/* ISA extensions. */
9339struct aarch64_option_cpu_value_table
9340{
e0471c16 9341 const char *name;
a06ea964 9342 const aarch64_feature_set value;
93d8990c 9343 const aarch64_feature_set require; /* Feature dependencies. */
a06ea964
NC
9344};
9345
9346static const struct aarch64_option_cpu_value_table aarch64_features[] = {
93d8990c
SN
9347 {"crc", AARCH64_FEATURE (AARCH64_FEATURE_CRC, 0),
9348 AARCH64_ARCH_NONE},
2dc4b12f 9349 {"crypto", AARCH64_FEATURE (AARCH64_FEATURE_CRYPTO, 0),
fa09f4ea 9350 AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0)},
93d8990c
SN
9351 {"fp", AARCH64_FEATURE (AARCH64_FEATURE_FP, 0),
9352 AARCH64_ARCH_NONE},
9353 {"lse", AARCH64_FEATURE (AARCH64_FEATURE_LSE, 0),
9354 AARCH64_ARCH_NONE},
9355 {"simd", AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0),
fa09f4ea 9356 AARCH64_FEATURE (AARCH64_FEATURE_FP, 0)},
93d8990c
SN
9357 {"pan", AARCH64_FEATURE (AARCH64_FEATURE_PAN, 0),
9358 AARCH64_ARCH_NONE},
9359 {"lor", AARCH64_FEATURE (AARCH64_FEATURE_LOR, 0),
9360 AARCH64_ARCH_NONE},
9361 {"ras", AARCH64_FEATURE (AARCH64_FEATURE_RAS, 0),
9362 AARCH64_ARCH_NONE},
9363 {"rdma", AARCH64_FEATURE (AARCH64_FEATURE_RDMA, 0),
9364 AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0)},
9365 {"fp16", AARCH64_FEATURE (AARCH64_FEATURE_F16, 0),
9366 AARCH64_FEATURE (AARCH64_FEATURE_FP, 0)},
d0f7791c
TC
9367 {"fp16fml", AARCH64_FEATURE (AARCH64_FEATURE_F16_FML, 0),
9368 AARCH64_FEATURE (AARCH64_FEATURE_FP
9369 | AARCH64_FEATURE_F16, 0)},
93d8990c
SN
9370 {"profile", AARCH64_FEATURE (AARCH64_FEATURE_PROFILE, 0),
9371 AARCH64_ARCH_NONE},
c0890d26 9372 {"sve", AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0),
582e12bf
RS
9373 AARCH64_FEATURE (AARCH64_FEATURE_F16
9374 | AARCH64_FEATURE_SIMD
9375 | AARCH64_FEATURE_COMPNUM, 0)},
b83b4b13
SD
9376 {"tme", AARCH64_FEATURE (AARCH64_FEATURE_TME, 0),
9377 AARCH64_ARCH_NONE},
f482d304
RS
9378 {"compnum", AARCH64_FEATURE (AARCH64_FEATURE_COMPNUM, 0),
9379 AARCH64_FEATURE (AARCH64_FEATURE_F16
9380 | AARCH64_FEATURE_SIMD, 0)},
d74d4880
SN
9381 {"rcpc", AARCH64_FEATURE (AARCH64_FEATURE_RCPC, 0),
9382 AARCH64_ARCH_NONE},
65a55fbb
TC
9383 {"dotprod", AARCH64_FEATURE (AARCH64_FEATURE_DOTPROD, 0),
9384 AARCH64_ARCH_NONE},
c0e7cef7
NC
9385 {"sha2", AARCH64_FEATURE (AARCH64_FEATURE_SHA2, 0),
9386 AARCH64_ARCH_NONE},
68dfbb92
SD
9387 {"sb", AARCH64_FEATURE (AARCH64_FEATURE_SB, 0),
9388 AARCH64_ARCH_NONE},
2ac435d4
SD
9389 {"predres", AARCH64_FEATURE (AARCH64_FEATURE_PREDRES, 0),
9390 AARCH64_ARCH_NONE},
c0e7cef7
NC
9391 {"aes", AARCH64_FEATURE (AARCH64_FEATURE_AES, 0),
9392 AARCH64_ARCH_NONE},
b6b9ca0c
TC
9393 {"sm4", AARCH64_FEATURE (AARCH64_FEATURE_SM4, 0),
9394 AARCH64_ARCH_NONE},
d4340f89
JB
9395 {"sha3", AARCH64_FEATURE (AARCH64_FEATURE_SHA3, 0),
9396 AARCH64_FEATURE (AARCH64_FEATURE_SHA2, 0)},
af4bcb4c
SD
9397 {"rng", AARCH64_FEATURE (AARCH64_FEATURE_RNG, 0),
9398 AARCH64_ARCH_NONE},
104fefee
SD
9399 {"ssbs", AARCH64_FEATURE (AARCH64_FEATURE_SSBS, 0),
9400 AARCH64_ARCH_NONE},
73b605ec
SD
9401 {"memtag", AARCH64_FEATURE (AARCH64_FEATURE_MEMTAG, 0),
9402 AARCH64_ARCH_NONE},
7ce2460a
MM
9403 {"sve2", AARCH64_FEATURE (AARCH64_FEATURE_SVE2, 0),
9404 AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0)},
9405 {"sve2-sm4", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_SM4, 0),
9406 AARCH64_FEATURE (AARCH64_FEATURE_SVE2
9407 | AARCH64_FEATURE_SM4, 0)},
9408 {"sve2-aes", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_AES, 0),
9409 AARCH64_FEATURE (AARCH64_FEATURE_SVE2
9410 | AARCH64_FEATURE_AES, 0)},
9411 {"sve2-sha3", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_SHA3, 0),
9412 AARCH64_FEATURE (AARCH64_FEATURE_SVE2
9413 | AARCH64_FEATURE_SHA3, 0)},
ccbdd22f 9414 {"sve2-bitperm", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_BITPERM, 0),
7ce2460a 9415 AARCH64_FEATURE (AARCH64_FEATURE_SVE2, 0)},
df678013
MM
9416 {"bf16", AARCH64_FEATURE (AARCH64_FEATURE_BFLOAT16, 0),
9417 AARCH64_ARCH_NONE},
8382113f
MM
9418 {"i8mm", AARCH64_FEATURE (AARCH64_FEATURE_I8MM, 0),
9419 AARCH64_ARCH_NONE},
9420 {"f32mm", AARCH64_FEATURE (AARCH64_FEATURE_F32MM, 0),
82e9597c 9421 AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0)},
8382113f 9422 {"f64mm", AARCH64_FEATURE (AARCH64_FEATURE_F64MM, 0),
82e9597c 9423 AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0)},
3493da5c
SP
9424 {"a64c", AARCH64_FEATURE (AARCH64_FEATURE_A64C, 0),
9425 AARCH64_ARCH_NONE},
9426 {"c64", AARCH64_FEATURE (AARCH64_FEATURE_C64, 0),
9427 AARCH64_FEATURE (AARCH64_FEATURE_A64C, 0)},
93d8990c 9428 {NULL, AARCH64_ARCH_NONE, AARCH64_ARCH_NONE},
a06ea964
NC
9429};
9430
9431struct aarch64_long_option_table
9432{
e0471c16
TS
9433 const char *option; /* Substring to match. */
9434 const char *help; /* Help information. */
17b9d67d 9435 int (*func) (const char *subopt); /* Function to decode sub-option. */
a06ea964
NC
9436 char *deprecated; /* If non-null, print this message. */
9437};
9438
93d8990c
SN
9439/* Transitive closure of features depending on set. */
9440static aarch64_feature_set
9441aarch64_feature_disable_set (aarch64_feature_set set)
9442{
9443 const struct aarch64_option_cpu_value_table *opt;
9444 aarch64_feature_set prev = 0;
9445
9446 while (prev != set) {
9447 prev = set;
9448 for (opt = aarch64_features; opt->name != NULL; opt++)
9449 if (AARCH64_CPU_HAS_ANY_FEATURES (opt->require, set))
9450 AARCH64_MERGE_FEATURE_SETS (set, set, opt->value);
9451 }
9452 return set;
9453}
9454
9455/* Transitive closure of dependencies of set. */
9456static aarch64_feature_set
9457aarch64_feature_enable_set (aarch64_feature_set set)
9458{
9459 const struct aarch64_option_cpu_value_table *opt;
9460 aarch64_feature_set prev = 0;
9461
9462 while (prev != set) {
9463 prev = set;
9464 for (opt = aarch64_features; opt->name != NULL; opt++)
9465 if (AARCH64_CPU_HAS_FEATURE (set, opt->value))
9466 AARCH64_MERGE_FEATURE_SETS (set, set, opt->require);
9467 }
9468 return set;
9469}
9470
a06ea964 9471static int
82b8a785 9472aarch64_parse_features (const char *str, const aarch64_feature_set **opt_p,
ae527cd8 9473 bfd_boolean ext_only)
a06ea964
NC
9474{
9475 /* We insist on extensions being added before being removed. We achieve
9476 this by using the ADDING_VALUE variable to indicate whether we are
9477 adding an extension (1) or removing it (0) and only allowing it to
9478 change in the order -1 -> 1 -> 0. */
9479 int adding_value = -1;
325801bd 9480 aarch64_feature_set *ext_set = XNEW (aarch64_feature_set);
a06ea964
NC
9481
9482 /* Copy the feature set, so that we can modify it. */
9483 *ext_set = **opt_p;
9484 *opt_p = ext_set;
9485
9486 while (str != NULL && *str != 0)
9487 {
9488 const struct aarch64_option_cpu_value_table *opt;
82b8a785 9489 const char *ext = NULL;
a06ea964
NC
9490 int optlen;
9491
ae527cd8 9492 if (!ext_only)
a06ea964 9493 {
ae527cd8
JB
9494 if (*str != '+')
9495 {
9496 as_bad (_("invalid architectural extension"));
9497 return 0;
9498 }
a06ea964 9499
ae527cd8
JB
9500 ext = strchr (++str, '+');
9501 }
a06ea964
NC
9502
9503 if (ext != NULL)
9504 optlen = ext - str;
9505 else
9506 optlen = strlen (str);
9507
9508 if (optlen >= 2 && strncmp (str, "no", 2) == 0)
9509 {
9510 if (adding_value != 0)
9511 adding_value = 0;
9512 optlen -= 2;
9513 str += 2;
9514 }
9515 else if (optlen > 0)
9516 {
9517 if (adding_value == -1)
9518 adding_value = 1;
9519 else if (adding_value != 1)
9520 {
9521 as_bad (_("must specify extensions to add before specifying "
9522 "those to remove"));
9523 return FALSE;
9524 }
9525 }
9526
9527 if (optlen == 0)
9528 {
9529 as_bad (_("missing architectural extension"));
9530 return 0;
9531 }
9532
9533 gas_assert (adding_value != -1);
9534
9535 for (opt = aarch64_features; opt->name != NULL; opt++)
9536 if (strncmp (opt->name, str, optlen) == 0)
9537 {
93d8990c
SN
9538 aarch64_feature_set set;
9539
a06ea964
NC
9540 /* Add or remove the extension. */
9541 if (adding_value)
93d8990c
SN
9542 {
9543 set = aarch64_feature_enable_set (opt->value);
9544 AARCH64_MERGE_FEATURE_SETS (*ext_set, *ext_set, set);
9545 }
a06ea964 9546 else
93d8990c
SN
9547 {
9548 set = aarch64_feature_disable_set (opt->value);
9549 AARCH64_CLEAR_FEATURE (*ext_set, *ext_set, set);
9550 }
a06ea964
NC
9551 break;
9552 }
9553
9554 if (opt->name == NULL)
9555 {
9556 as_bad (_("unknown architectural extension `%s'"), str);
9557 return 0;
9558 }
9559
9560 str = ext;
9561 };
9562
9563 return 1;
9564}
9565
9566static int
17b9d67d 9567aarch64_parse_cpu (const char *str)
a06ea964
NC
9568{
9569 const struct aarch64_cpu_option_table *opt;
82b8a785 9570 const char *ext = strchr (str, '+');
a06ea964
NC
9571 size_t optlen;
9572
9573 if (ext != NULL)
9574 optlen = ext - str;
9575 else
9576 optlen = strlen (str);
9577
9578 if (optlen == 0)
9579 {
9580 as_bad (_("missing cpu name `%s'"), str);
9581 return 0;
9582 }
9583
9584 for (opt = aarch64_cpus; opt->name != NULL; opt++)
9585 if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
9586 {
9587 mcpu_cpu_opt = &opt->value;
9588 if (ext != NULL)
ae527cd8 9589 return aarch64_parse_features (ext, &mcpu_cpu_opt, FALSE);
a06ea964
NC
9590
9591 return 1;
9592 }
9593
9594 as_bad (_("unknown cpu `%s'"), str);
9595 return 0;
9596}
9597
9598static int
17b9d67d 9599aarch64_parse_arch (const char *str)
a06ea964
NC
9600{
9601 const struct aarch64_arch_option_table *opt;
82b8a785 9602 const char *ext = strchr (str, '+');
a06ea964
NC
9603 size_t optlen;
9604
9605 if (ext != NULL)
9606 optlen = ext - str;
9607 else
9608 optlen = strlen (str);
9609
9610 if (optlen == 0)
9611 {
9612 as_bad (_("missing architecture name `%s'"), str);
9613 return 0;
9614 }
9615
9616 for (opt = aarch64_archs; opt->name != NULL; opt++)
9617 if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
9618 {
9619 march_cpu_opt = &opt->value;
9620 if (ext != NULL)
ae527cd8 9621 return aarch64_parse_features (ext, &march_cpu_opt, FALSE);
a06ea964
NC
9622
9623 return 1;
9624 }
9625
9626 as_bad (_("unknown architecture `%s'\n"), str);
9627 return 0;
9628}
9629
69091a2c
YZ
9630/* ABIs. */
9631struct aarch64_option_abi_value_table
9632{
e0471c16 9633 const char *name;
69091a2c
YZ
9634 enum aarch64_abi_type value;
9635};
9636
9637static const struct aarch64_option_abi_value_table aarch64_abis[] = {
9638 {"ilp32", AARCH64_ABI_ILP32},
9639 {"lp64", AARCH64_ABI_LP64},
69091a2c
YZ
9640};
9641
9642static int
17b9d67d 9643aarch64_parse_abi (const char *str)
69091a2c 9644{
5703197e 9645 unsigned int i;
69091a2c 9646
5703197e 9647 if (str[0] == '\0')
69091a2c
YZ
9648 {
9649 as_bad (_("missing abi name `%s'"), str);
9650 return 0;
9651 }
9652
5703197e
TS
9653 for (i = 0; i < ARRAY_SIZE (aarch64_abis); i++)
9654 if (strcmp (str, aarch64_abis[i].name) == 0)
69091a2c 9655 {
5703197e 9656 aarch64_abi = aarch64_abis[i].value;
69091a2c
YZ
9657 return 1;
9658 }
9659
9660 as_bad (_("unknown abi `%s'\n"), str);
9661 return 0;
9662}
9663
a06ea964 9664static struct aarch64_long_option_table aarch64_long_opts[] = {
69091a2c
YZ
9665#ifdef OBJ_ELF
9666 {"mabi=", N_("<abi name>\t specify for ABI <abi name>"),
9667 aarch64_parse_abi, NULL},
9668#endif /* OBJ_ELF */
a06ea964
NC
9669 {"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"),
9670 aarch64_parse_cpu, NULL},
9671 {"march=", N_("<arch name>\t assemble for architecture <arch name>"),
9672 aarch64_parse_arch, NULL},
9673 {NULL, NULL, 0, NULL}
9674};
9675
9676int
17b9d67d 9677md_parse_option (int c, const char *arg)
a06ea964
NC
9678{
9679 struct aarch64_option_table *opt;
9680 struct aarch64_long_option_table *lopt;
9681
9682 switch (c)
9683 {
9684#ifdef OPTION_EB
9685 case OPTION_EB:
9686 target_big_endian = 1;
9687 break;
9688#endif
9689
9690#ifdef OPTION_EL
9691 case OPTION_EL:
9692 target_big_endian = 0;
9693 break;
9694#endif
9695
9696 case 'a':
9697 /* Listing option. Just ignore these, we don't support additional
9698 ones. */
9699 return 0;
9700
9701 default:
9702 for (opt = aarch64_opts; opt->option != NULL; opt++)
9703 {
9704 if (c == opt->option[0]
9705 && ((arg == NULL && opt->option[1] == 0)
9706 || streq (arg, opt->option + 1)))
9707 {
9708 /* If the option is deprecated, tell the user. */
9709 if (opt->deprecated != NULL)
9710 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
9711 arg ? arg : "", _(opt->deprecated));
9712
9713 if (opt->var != NULL)
9714 *opt->var = opt->value;
9715
9716 return 1;
9717 }
9718 }
9719
9720 for (lopt = aarch64_long_opts; lopt->option != NULL; lopt++)
9721 {
9722 /* These options are expected to have an argument. */
9723 if (c == lopt->option[0]
9724 && arg != NULL
9725 && strncmp (arg, lopt->option + 1,
9726 strlen (lopt->option + 1)) == 0)
9727 {
9728 /* If the option is deprecated, tell the user. */
9729 if (lopt->deprecated != NULL)
9730 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
9731 _(lopt->deprecated));
9732
9733 /* Call the sup-option parser. */
9734 return lopt->func (arg + strlen (lopt->option) - 1);
9735 }
9736 }
9737
9738 return 0;
9739 }
9740
9741 return 1;
9742}
9743
9744void
9745md_show_usage (FILE * fp)
9746{
9747 struct aarch64_option_table *opt;
9748 struct aarch64_long_option_table *lopt;
9749
9750 fprintf (fp, _(" AArch64-specific assembler options:\n"));
9751
9752 for (opt = aarch64_opts; opt->option != NULL; opt++)
9753 if (opt->help != NULL)
9754 fprintf (fp, " -%-23s%s\n", opt->option, _(opt->help));
9755
9756 for (lopt = aarch64_long_opts; lopt->option != NULL; lopt++)
9757 if (lopt->help != NULL)
9758 fprintf (fp, " -%s%s\n", lopt->option, _(lopt->help));
9759
9760#ifdef OPTION_EB
9761 fprintf (fp, _("\
9762 -EB assemble code for a big-endian cpu\n"));
9763#endif
9764
9765#ifdef OPTION_EL
9766 fprintf (fp, _("\
9767 -EL assemble code for a little-endian cpu\n"));
9768#endif
9769}
9770
9771/* Parse a .cpu directive. */
9772
9773static void
9774s_aarch64_cpu (int ignored ATTRIBUTE_UNUSED)
9775{
9776 const struct aarch64_cpu_option_table *opt;
9777 char saved_char;
9778 char *name;
9779 char *ext;
9780 size_t optlen;
9781
9782 name = input_line_pointer;
9783 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
9784 input_line_pointer++;
9785 saved_char = *input_line_pointer;
9786 *input_line_pointer = 0;
9787
9788 ext = strchr (name, '+');
9789
9790 if (ext != NULL)
9791 optlen = ext - name;
9792 else
9793 optlen = strlen (name);
9794
9795 /* Skip the first "all" entry. */
9796 for (opt = aarch64_cpus + 1; opt->name != NULL; opt++)
9797 if (strlen (opt->name) == optlen
9798 && strncmp (name, opt->name, optlen) == 0)
9799 {
9800 mcpu_cpu_opt = &opt->value;
9801 if (ext != NULL)
ae527cd8 9802 if (!aarch64_parse_features (ext, &mcpu_cpu_opt, FALSE))
a06ea964
NC
9803 return;
9804
9805 cpu_variant = *mcpu_cpu_opt;
9806
9807 *input_line_pointer = saved_char;
9808 demand_empty_rest_of_line ();
9809 return;
9810 }
9811 as_bad (_("unknown cpu `%s'"), name);
9812 *input_line_pointer = saved_char;
9813 ignore_rest_of_line ();
9814}
9815
9816
9817/* Parse a .arch directive. */
9818
9819static void
9820s_aarch64_arch (int ignored ATTRIBUTE_UNUSED)
9821{
9822 const struct aarch64_arch_option_table *opt;
9823 char saved_char;
9824 char *name;
9825 char *ext;
9826 size_t optlen;
9827
9828 name = input_line_pointer;
9829 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
9830 input_line_pointer++;
9831 saved_char = *input_line_pointer;
9832 *input_line_pointer = 0;
9833
9834 ext = strchr (name, '+');
9835
9836 if (ext != NULL)
9837 optlen = ext - name;
9838 else
9839 optlen = strlen (name);
9840
9841 /* Skip the first "all" entry. */
9842 for (opt = aarch64_archs + 1; opt->name != NULL; opt++)
9843 if (strlen (opt->name) == optlen
9844 && strncmp (name, opt->name, optlen) == 0)
9845 {
9846 mcpu_cpu_opt = &opt->value;
9847 if (ext != NULL)
ae527cd8 9848 if (!aarch64_parse_features (ext, &mcpu_cpu_opt, FALSE))
a06ea964
NC
9849 return;
9850
9851 cpu_variant = *mcpu_cpu_opt;
9852
9853 *input_line_pointer = saved_char;
9854 demand_empty_rest_of_line ();
9855 return;
9856 }
9857
9858 as_bad (_("unknown architecture `%s'\n"), name);
9859 *input_line_pointer = saved_char;
9860 ignore_rest_of_line ();
9861}
9862
ae527cd8
JB
9863/* Parse a .arch_extension directive. */
9864
9865static void
9866s_aarch64_arch_extension (int ignored ATTRIBUTE_UNUSED)
9867{
9868 char saved_char;
9869 char *ext = input_line_pointer;;
9870
9871 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
9872 input_line_pointer++;
9873 saved_char = *input_line_pointer;
9874 *input_line_pointer = 0;
9875
9876 if (!aarch64_parse_features (ext, &mcpu_cpu_opt, TRUE))
9877 return;
9878
9879 cpu_variant = *mcpu_cpu_opt;
9880
9881 *input_line_pointer = saved_char;
9882 demand_empty_rest_of_line ();
9883}
9884
a06ea964
NC
9885/* Copy symbol information. */
9886
9887void
9888aarch64_copy_symbol_attributes (symbolS * dest, symbolS * src)
9889{
9890 AARCH64_GET_FLAG (dest) = AARCH64_GET_FLAG (src);
9891}
0b4eac57
SN
9892
9893#ifdef OBJ_ELF
9894/* Same as elf_copy_symbol_attributes, but without copying st_other.
9895 This is needed so AArch64 specific st_other values can be independently
9896 specified for an IFUNC resolver (that is called by the dynamic linker)
9897 and the symbol it resolves (aliased to the resolver). In particular,
9898 if a function symbol has special st_other value set via directives,
9899 then attaching an IFUNC resolver to that symbol should not override
9900 the st_other setting. Requiring the directive on the IFUNC resolver
9901 symbol would be unexpected and problematic in C code, where the two
9902 symbols appear as two independent function declarations. */
9903
9904void
9905aarch64_elf_copy_symbol_attributes (symbolS *dest, symbolS *src)
9906{
9907 struct elf_obj_sy *srcelf = symbol_get_obj (src);
9908 struct elf_obj_sy *destelf = symbol_get_obj (dest);
9909 if (srcelf->size)
9910 {
9911 if (destelf->size == NULL)
9912 destelf->size = XNEW (expressionS);
9913 *destelf->size = *srcelf->size;
9914 }
9915 else
9916 {
9fbb53c7 9917 free (destelf->size);
0b4eac57
SN
9918 destelf->size = NULL;
9919 }
9920 S_SET_SIZE (dest, S_GET_SIZE (src));
9921}
9922#endif