]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-aarch64.c
[Morello] Add MOV and CPY instructions for capabilities
[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 {
5328 case AARCH64_OPND_Rd:
5329 case AARCH64_OPND_Rn:
5330 case AARCH64_OPND_Rm:
5331 case AARCH64_OPND_Rt:
5332 case AARCH64_OPND_Rt2:
bd7ceb8d 5333 case AARCH64_OPND_Rt_SP:
a06ea964
NC
5334 case AARCH64_OPND_Rs:
5335 case AARCH64_OPND_Ra:
5336 case AARCH64_OPND_Rt_SYS:
5337 case AARCH64_OPND_Rd_SP:
5338 case AARCH64_OPND_Rn_SP:
c84364ec 5339 case AARCH64_OPND_Rm_SP:
a06ea964
NC
5340 case AARCH64_OPND_Fd:
5341 case AARCH64_OPND_Fn:
5342 case AARCH64_OPND_Fm:
5343 case AARCH64_OPND_Fa:
5344 case AARCH64_OPND_Ft:
5345 case AARCH64_OPND_Ft2:
5346 case AARCH64_OPND_Sd:
5347 case AARCH64_OPND_Sn:
5348 case AARCH64_OPND_Sm:
f42f1a1d 5349 case AARCH64_OPND_Va:
a06ea964
NC
5350 case AARCH64_OPND_Vd:
5351 case AARCH64_OPND_Vn:
5352 case AARCH64_OPND_Vm:
5353 case AARCH64_OPND_VdD1:
5354 case AARCH64_OPND_VnD1:
5355 operand->reg.regno = default_value;
5356 break;
5357
5358 case AARCH64_OPND_Ed:
5359 case AARCH64_OPND_En:
5360 case AARCH64_OPND_Em:
369c9167 5361 case AARCH64_OPND_Em16:
f42f1a1d 5362 case AARCH64_OPND_SM3_IMM2:
a06ea964
NC
5363 operand->reglane.regno = default_value;
5364 break;
5365
5366 case AARCH64_OPND_IDX:
5367 case AARCH64_OPND_BIT_NUM:
5368 case AARCH64_OPND_IMMR:
5369 case AARCH64_OPND_IMMS:
5370 case AARCH64_OPND_SHLL_IMM:
5371 case AARCH64_OPND_IMM_VLSL:
5372 case AARCH64_OPND_IMM_VLSR:
5373 case AARCH64_OPND_CCMP_IMM:
5374 case AARCH64_OPND_FBITS:
5375 case AARCH64_OPND_UIMM4:
5376 case AARCH64_OPND_UIMM3_OP1:
5377 case AARCH64_OPND_UIMM3_OP2:
5378 case AARCH64_OPND_IMM:
f42f1a1d 5379 case AARCH64_OPND_IMM_2:
a06ea964
NC
5380 case AARCH64_OPND_WIDTH:
5381 case AARCH64_OPND_UIMM7:
5382 case AARCH64_OPND_NZCV:
245d2e3f
RS
5383 case AARCH64_OPND_SVE_PATTERN:
5384 case AARCH64_OPND_SVE_PRFOP:
a06ea964
NC
5385 operand->imm.value = default_value;
5386 break;
5387
2442d846
RS
5388 case AARCH64_OPND_SVE_PATTERN_SCALED:
5389 operand->imm.value = default_value;
5390 operand->shifter.kind = AARCH64_MOD_MUL;
5391 operand->shifter.amount = 1;
5392 break;
5393
a06ea964
NC
5394 case AARCH64_OPND_EXCEPTION:
5395 inst.reloc.type = BFD_RELOC_UNUSED;
5396 break;
5397
5398 case AARCH64_OPND_BARRIER_ISB:
5399 operand->barrier = aarch64_barrier_options + default_value;
ff605452
SD
5400 break;
5401
5402 case AARCH64_OPND_BTI_TARGET:
5403 operand->hint_option = aarch64_hint_options + default_value;
5404 break;
a06ea964
NC
5405
5406 default:
5407 break;
5408 }
5409}
5410
5411/* Process the relocation type for move wide instructions.
5412 Return TRUE on success; otherwise return FALSE. */
5413
5414static bfd_boolean
5415process_movw_reloc_info (void)
5416{
5417 int is32;
5418 unsigned shift;
5419
5420 is32 = inst.base.operands[0].qualifier == AARCH64_OPND_QLF_W ? 1 : 0;
5421
5422 if (inst.base.opcode->op == OP_MOVK)
5423 switch (inst.reloc.type)
5424 {
5425 case BFD_RELOC_AARCH64_MOVW_G0_S:
5426 case BFD_RELOC_AARCH64_MOVW_G1_S:
5427 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
5428 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
5429 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
5430 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
5431 case BFD_RELOC_AARCH64_MOVW_PREL_G3:
1aa66fb1 5432 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
a06ea964 5433 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
a06ea964 5434 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
a06ea964
NC
5435 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
5436 set_syntax_error
5437 (_("the specified relocation type is not allowed for MOVK"));
5438 return FALSE;
5439 default:
5440 break;
5441 }
5442
5443 switch (inst.reloc.type)
5444 {
5445 case BFD_RELOC_AARCH64_MOVW_G0:
a06ea964 5446 case BFD_RELOC_AARCH64_MOVW_G0_NC:
f09c556a 5447 case BFD_RELOC_AARCH64_MOVW_G0_S:
ca632371 5448 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
32247401
RL
5449 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
5450 case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
43a357f9 5451 case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
3e8286c0 5452 case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
3b957e5b 5453 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
49df5539
JW
5454 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
5455 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
a06ea964
NC
5456 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
5457 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
5458 shift = 0;
5459 break;
5460 case BFD_RELOC_AARCH64_MOVW_G1:
a06ea964 5461 case BFD_RELOC_AARCH64_MOVW_G1_NC:
f09c556a 5462 case BFD_RELOC_AARCH64_MOVW_G1_S:
654248e7 5463 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
32247401
RL
5464 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
5465 case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
43a357f9 5466 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
1aa66fb1 5467 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
3b957e5b 5468 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
49df5539
JW
5469 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
5470 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
a06ea964
NC
5471 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
5472 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
5473 shift = 16;
5474 break;
5475 case BFD_RELOC_AARCH64_MOVW_G2:
a06ea964 5476 case BFD_RELOC_AARCH64_MOVW_G2_NC:
f09c556a 5477 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
5478 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
5479 case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
49df5539 5480 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
a06ea964
NC
5481 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
5482 if (is32)
5483 {
5484 set_fatal_syntax_error
5485 (_("the specified relocation type is not allowed for 32-bit "
5486 "register"));
5487 return FALSE;
5488 }
5489 shift = 32;
5490 break;
5491 case BFD_RELOC_AARCH64_MOVW_G3:
32247401 5492 case BFD_RELOC_AARCH64_MOVW_PREL_G3:
a06ea964
NC
5493 if (is32)
5494 {
5495 set_fatal_syntax_error
5496 (_("the specified relocation type is not allowed for 32-bit "
5497 "register"));
5498 return FALSE;
5499 }
5500 shift = 48;
5501 break;
5502 default:
5503 /* More cases should be added when more MOVW-related relocation types
5504 are supported in GAS. */
5505 gas_assert (aarch64_gas_internal_fixup_p ());
5506 /* The shift amount should have already been set by the parser. */
5507 return TRUE;
5508 }
5509 inst.base.operands[1].shifter.amount = shift;
5510 return TRUE;
5511}
5512
33eaf5de 5513/* A primitive log calculator. */
a06ea964
NC
5514
5515static inline unsigned int
5516get_logsz (unsigned int size)
5517{
5518 const unsigned char ls[16] =
5519 {0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4};
5520 if (size > 16)
5521 {
5522 gas_assert (0);
5523 return -1;
5524 }
5525 gas_assert (ls[size - 1] != (unsigned char)-1);
5526 return ls[size - 1];
5527}
5528
5529/* Determine and return the real reloc type code for an instruction
5530 with the pseudo reloc type code BFD_RELOC_AARCH64_LDST_LO12. */
5531
5532static inline bfd_reloc_code_real_type
5533ldst_lo12_determine_real_reloc_type (void)
5534{
4c562523 5535 unsigned logsz;
a06ea964
NC
5536 enum aarch64_opnd_qualifier opd0_qlf = inst.base.operands[0].qualifier;
5537 enum aarch64_opnd_qualifier opd1_qlf = inst.base.operands[1].qualifier;
5538
84f1b9fb 5539 const bfd_reloc_code_real_type reloc_ldst_lo12[5][5] = {
4c562523
JW
5540 {
5541 BFD_RELOC_AARCH64_LDST8_LO12,
5542 BFD_RELOC_AARCH64_LDST16_LO12,
5543 BFD_RELOC_AARCH64_LDST32_LO12,
5544 BFD_RELOC_AARCH64_LDST64_LO12,
a06ea964 5545 BFD_RELOC_AARCH64_LDST128_LO12
4c562523
JW
5546 },
5547 {
5548 BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12,
5549 BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12,
5550 BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12,
5551 BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12,
5552 BFD_RELOC_AARCH64_NONE
5553 },
5554 {
5555 BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC,
5556 BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC,
5557 BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC,
5558 BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC,
5559 BFD_RELOC_AARCH64_NONE
84f1b9fb
RL
5560 },
5561 {
5562 BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12,
5563 BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12,
5564 BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12,
5565 BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12,
5566 BFD_RELOC_AARCH64_NONE
5567 },
5568 {
5569 BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC,
5570 BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,
5571 BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,
5572 BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,
5573 BFD_RELOC_AARCH64_NONE
4c562523 5574 }
a06ea964
NC
5575 };
5576
4c562523
JW
5577 gas_assert (inst.reloc.type == BFD_RELOC_AARCH64_LDST_LO12
5578 || inst.reloc.type == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12
5579 || (inst.reloc.type
84f1b9fb
RL
5580 == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC)
5581 || (inst.reloc.type
5582 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12)
5583 || (inst.reloc.type
5584 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12_NC));
a06ea964
NC
5585 gas_assert (inst.base.opcode->operands[1] == AARCH64_OPND_ADDR_UIMM12);
5586
5587 if (opd1_qlf == AARCH64_OPND_QLF_NIL)
5588 opd1_qlf =
5589 aarch64_get_expected_qualifier (inst.base.opcode->qualifiers_list,
5590 1, opd0_qlf, 0);
5591 gas_assert (opd1_qlf != AARCH64_OPND_QLF_NIL);
5592
5593 logsz = get_logsz (aarch64_get_qualifier_esize (opd1_qlf));
4c562523 5594 if (inst.reloc.type == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12
84f1b9fb
RL
5595 || inst.reloc.type == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC
5596 || inst.reloc.type == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12
5597 || inst.reloc.type == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12_NC)
4c562523
JW
5598 gas_assert (logsz <= 3);
5599 else
5600 gas_assert (logsz <= 4);
a06ea964 5601
4c562523 5602 /* In reloc.c, these pseudo relocation types should be defined in similar
33eaf5de 5603 order as above reloc_ldst_lo12 array. Because the array index calculation
4c562523
JW
5604 below relies on this. */
5605 return reloc_ldst_lo12[inst.reloc.type - BFD_RELOC_AARCH64_LDST_LO12][logsz];
a06ea964
NC
5606}
5607
5608/* Check whether a register list REGINFO is valid. The registers must be
5609 numbered in increasing order (modulo 32), in increments of one or two.
5610
5611 If ACCEPT_ALTERNATE is non-zero, the register numbers should be in
5612 increments of two.
5613
5614 Return FALSE if such a register list is invalid, otherwise return TRUE. */
5615
5616static bfd_boolean
5617reg_list_valid_p (uint32_t reginfo, int accept_alternate)
5618{
5619 uint32_t i, nb_regs, prev_regno, incr;
5620
5621 nb_regs = 1 + (reginfo & 0x3);
5622 reginfo >>= 2;
5623 prev_regno = reginfo & 0x1f;
5624 incr = accept_alternate ? 2 : 1;
5625
5626 for (i = 1; i < nb_regs; ++i)
5627 {
5628 uint32_t curr_regno;
5629 reginfo >>= 5;
5630 curr_regno = reginfo & 0x1f;
5631 if (curr_regno != ((prev_regno + incr) & 0x1f))
5632 return FALSE;
5633 prev_regno = curr_regno;
5634 }
5635
5636 return TRUE;
5637}
5638
5639/* Generic instruction operand parser. This does no encoding and no
5640 semantic validation; it merely squirrels values away in the inst
5641 structure. Returns TRUE or FALSE depending on whether the
5642 specified grammar matched. */
5643
5644static bfd_boolean
5645parse_operands (char *str, const aarch64_opcode *opcode)
5646{
5647 int i;
5648 char *backtrack_pos = 0;
5649 const enum aarch64_opnd *operands = opcode->operands;
1799c0d0 5650 aarch64_reg_type imm_reg_type;
a06ea964
NC
5651
5652 clear_error ();
5653 skip_whitespace (str);
5654
c0890d26 5655 if (AARCH64_CPU_HAS_FEATURE (AARCH64_FEATURE_SVE, *opcode->avariant))
5b2b928e 5656 imm_reg_type = REG_TYPE_R_Z_SP_BHSDQ_VZP;
c0890d26
RS
5657 else
5658 imm_reg_type = REG_TYPE_R_Z_BHSDQ_V;
1799c0d0 5659
a06ea964
NC
5660 for (i = 0; operands[i] != AARCH64_OPND_NIL; i++)
5661 {
5662 int64_t val;
e1b988bb 5663 const reg_entry *reg;
a06ea964
NC
5664 int comma_skipped_p = 0;
5665 aarch64_reg_type rtype;
8f9a77af 5666 struct vector_type_el vectype;
4df068de 5667 aarch64_opnd_qualifier_t qualifier, base_qualifier, offset_qualifier;
a06ea964 5668 aarch64_opnd_info *info = &inst.base.operands[i];
f11ad6bc 5669 aarch64_reg_type reg_type;
a06ea964
NC
5670
5671 DEBUG_TRACE ("parse operand %d", i);
5672
5673 /* Assign the operand code. */
5674 info->type = operands[i];
5675
5676 if (optional_operand_p (opcode, i))
5677 {
5678 /* Remember where we are in case we need to backtrack. */
5679 gas_assert (!backtrack_pos);
5680 backtrack_pos = str;
5681 }
5682
33eaf5de 5683 /* Expect comma between operands; the backtrack mechanism will take
a06ea964
NC
5684 care of cases of omitted optional operand. */
5685 if (i > 0 && ! skip_past_char (&str, ','))
5686 {
5687 set_syntax_error (_("comma expected between operands"));
5688 goto failure;
5689 }
5690 else
5691 comma_skipped_p = 1;
5692
5693 switch (operands[i])
5694 {
5695 case AARCH64_OPND_Rd:
5696 case AARCH64_OPND_Rn:
5697 case AARCH64_OPND_Rm:
5698 case AARCH64_OPND_Rt:
5699 case AARCH64_OPND_Rt2:
5700 case AARCH64_OPND_Rs:
5701 case AARCH64_OPND_Ra:
5702 case AARCH64_OPND_Rt_SYS:
ee804238 5703 case AARCH64_OPND_PAIRREG:
047cd301 5704 case AARCH64_OPND_SVE_Rm:
e1b988bb 5705 po_int_reg_or_fail (REG_TYPE_R_Z);
a06ea964
NC
5706 break;
5707
5708 case AARCH64_OPND_Rd_SP:
5709 case AARCH64_OPND_Rn_SP:
bd7ceb8d 5710 case AARCH64_OPND_Rt_SP:
047cd301 5711 case AARCH64_OPND_SVE_Rn_SP:
c84364ec 5712 case AARCH64_OPND_Rm_SP:
e1b988bb 5713 po_int_reg_or_fail (REG_TYPE_R_SP);
a06ea964
NC
5714 break;
5715
5716 case AARCH64_OPND_Rm_EXT:
5717 case AARCH64_OPND_Rm_SFT:
5718 po_misc_or_fail (parse_shifter_operand
5719 (&str, info, (operands[i] == AARCH64_OPND_Rm_EXT
5720 ? SHIFTED_ARITH_IMM
5721 : SHIFTED_LOGIC_IMM)));
5722 if (!info->shifter.operator_present)
5723 {
5724 /* Default to LSL if not present. Libopcodes prefers shifter
5725 kind to be explicit. */
5726 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
5727 info->shifter.kind = AARCH64_MOD_LSL;
5728 /* For Rm_EXT, libopcodes will carry out further check on whether
5729 or not stack pointer is used in the instruction (Recall that
5730 "the extend operator is not optional unless at least one of
5731 "Rd" or "Rn" is '11111' (i.e. WSP)"). */
5732 }
5733 break;
5734
5735 case AARCH64_OPND_Fd:
5736 case AARCH64_OPND_Fn:
5737 case AARCH64_OPND_Fm:
5738 case AARCH64_OPND_Fa:
5739 case AARCH64_OPND_Ft:
5740 case AARCH64_OPND_Ft2:
5741 case AARCH64_OPND_Sd:
5742 case AARCH64_OPND_Sn:
5743 case AARCH64_OPND_Sm:
047cd301
RS
5744 case AARCH64_OPND_SVE_VZn:
5745 case AARCH64_OPND_SVE_Vd:
5746 case AARCH64_OPND_SVE_Vm:
5747 case AARCH64_OPND_SVE_Vn:
a06ea964
NC
5748 val = aarch64_reg_parse (&str, REG_TYPE_BHSDQ, &rtype, NULL);
5749 if (val == PARSE_FAIL)
5750 {
5751 first_error (_(get_reg_expected_msg (REG_TYPE_BHSDQ)));
5752 goto failure;
5753 }
5754 gas_assert (rtype >= REG_TYPE_FP_B && rtype <= REG_TYPE_FP_Q);
5755
5756 info->reg.regno = val;
5757 info->qualifier = AARCH64_OPND_QLF_S_B + (rtype - REG_TYPE_FP_B);
5758 break;
5759
f11ad6bc
RS
5760 case AARCH64_OPND_SVE_Pd:
5761 case AARCH64_OPND_SVE_Pg3:
5762 case AARCH64_OPND_SVE_Pg4_5:
5763 case AARCH64_OPND_SVE_Pg4_10:
5764 case AARCH64_OPND_SVE_Pg4_16:
5765 case AARCH64_OPND_SVE_Pm:
5766 case AARCH64_OPND_SVE_Pn:
5767 case AARCH64_OPND_SVE_Pt:
5768 reg_type = REG_TYPE_PN;
5769 goto vector_reg;
5770
5771 case AARCH64_OPND_SVE_Za_5:
5772 case AARCH64_OPND_SVE_Za_16:
5773 case AARCH64_OPND_SVE_Zd:
5774 case AARCH64_OPND_SVE_Zm_5:
5775 case AARCH64_OPND_SVE_Zm_16:
5776 case AARCH64_OPND_SVE_Zn:
5777 case AARCH64_OPND_SVE_Zt:
5778 reg_type = REG_TYPE_ZN;
5779 goto vector_reg;
5780
f42f1a1d 5781 case AARCH64_OPND_Va:
a06ea964
NC
5782 case AARCH64_OPND_Vd:
5783 case AARCH64_OPND_Vn:
5784 case AARCH64_OPND_Vm:
f11ad6bc
RS
5785 reg_type = REG_TYPE_VN;
5786 vector_reg:
5787 val = aarch64_reg_parse (&str, reg_type, NULL, &vectype);
a06ea964
NC
5788 if (val == PARSE_FAIL)
5789 {
f11ad6bc 5790 first_error (_(get_reg_expected_msg (reg_type)));
a06ea964
NC
5791 goto failure;
5792 }
5793 if (vectype.defined & NTA_HASINDEX)
5794 goto failure;
5795
5796 info->reg.regno = val;
f11ad6bc
RS
5797 if ((reg_type == REG_TYPE_PN || reg_type == REG_TYPE_ZN)
5798 && vectype.type == NT_invtype)
5799 /* Unqualified Pn and Zn registers are allowed in certain
5800 contexts. Rely on F_STRICT qualifier checking to catch
5801 invalid uses. */
5802 info->qualifier = AARCH64_OPND_QLF_NIL;
5803 else
5804 {
5805 info->qualifier = vectype_to_qualifier (&vectype);
5806 if (info->qualifier == AARCH64_OPND_QLF_NIL)
5807 goto failure;
5808 }
a06ea964
NC
5809 break;
5810
5811 case AARCH64_OPND_VdD1:
5812 case AARCH64_OPND_VnD1:
5813 val = aarch64_reg_parse (&str, REG_TYPE_VN, NULL, &vectype);
5814 if (val == PARSE_FAIL)
5815 {
5816 set_first_syntax_error (_(get_reg_expected_msg (REG_TYPE_VN)));
5817 goto failure;
5818 }
5819 if (vectype.type != NT_d || vectype.index != 1)
5820 {
5821 set_fatal_syntax_error
5822 (_("the top half of a 128-bit FP/SIMD register is expected"));
5823 goto failure;
5824 }
5825 info->reg.regno = val;
5826 /* N.B: VdD1 and VnD1 are treated as an fp or advsimd scalar register
5827 here; it is correct for the purpose of encoding/decoding since
5828 only the register number is explicitly encoded in the related
5829 instructions, although this appears a bit hacky. */
5830 info->qualifier = AARCH64_OPND_QLF_S_D;
5831 break;
5832
582e12bf
RS
5833 case AARCH64_OPND_SVE_Zm3_INDEX:
5834 case AARCH64_OPND_SVE_Zm3_22_INDEX:
116adc27 5835 case AARCH64_OPND_SVE_Zm3_11_INDEX:
31e36ab3 5836 case AARCH64_OPND_SVE_Zm4_11_INDEX:
582e12bf 5837 case AARCH64_OPND_SVE_Zm4_INDEX:
f11ad6bc
RS
5838 case AARCH64_OPND_SVE_Zn_INDEX:
5839 reg_type = REG_TYPE_ZN;
5840 goto vector_reg_index;
5841
a06ea964
NC
5842 case AARCH64_OPND_Ed:
5843 case AARCH64_OPND_En:
5844 case AARCH64_OPND_Em:
369c9167 5845 case AARCH64_OPND_Em16:
f42f1a1d 5846 case AARCH64_OPND_SM3_IMM2:
f11ad6bc
RS
5847 reg_type = REG_TYPE_VN;
5848 vector_reg_index:
5849 val = aarch64_reg_parse (&str, reg_type, NULL, &vectype);
a06ea964
NC
5850 if (val == PARSE_FAIL)
5851 {
f11ad6bc 5852 first_error (_(get_reg_expected_msg (reg_type)));
a06ea964
NC
5853 goto failure;
5854 }
5855 if (vectype.type == NT_invtype || !(vectype.defined & NTA_HASINDEX))
5856 goto failure;
5857
5858 info->reglane.regno = val;
5859 info->reglane.index = vectype.index;
5860 info->qualifier = vectype_to_qualifier (&vectype);
5861 if (info->qualifier == AARCH64_OPND_QLF_NIL)
5862 goto failure;
5863 break;
5864
f11ad6bc
RS
5865 case AARCH64_OPND_SVE_ZnxN:
5866 case AARCH64_OPND_SVE_ZtxN:
5867 reg_type = REG_TYPE_ZN;
5868 goto vector_reg_list;
5869
a06ea964
NC
5870 case AARCH64_OPND_LVn:
5871 case AARCH64_OPND_LVt:
5872 case AARCH64_OPND_LVt_AL:
5873 case AARCH64_OPND_LEt:
f11ad6bc
RS
5874 reg_type = REG_TYPE_VN;
5875 vector_reg_list:
5876 if (reg_type == REG_TYPE_ZN
5877 && get_opcode_dependent_value (opcode) == 1
5878 && *str != '{')
a06ea964 5879 {
f11ad6bc
RS
5880 val = aarch64_reg_parse (&str, reg_type, NULL, &vectype);
5881 if (val == PARSE_FAIL)
5882 {
5883 first_error (_(get_reg_expected_msg (reg_type)));
5884 goto failure;
5885 }
5886 info->reglist.first_regno = val;
5887 info->reglist.num_regs = 1;
5888 }
5889 else
5890 {
5891 val = parse_vector_reg_list (&str, reg_type, &vectype);
5892 if (val == PARSE_FAIL)
5893 goto failure;
163b2c58 5894
f11ad6bc
RS
5895 if (! reg_list_valid_p (val, /* accept_alternate */ 0))
5896 {
5897 set_fatal_syntax_error (_("invalid register list"));
5898 goto failure;
5899 }
163b2c58
BW
5900
5901 if (vectype.width != 0 && *str != ',')
5902 {
5903 set_fatal_syntax_error
5904 (_("expected element type rather than vector type"));
5905 goto failure;
5906 }
5907
f11ad6bc
RS
5908 info->reglist.first_regno = (val >> 2) & 0x1f;
5909 info->reglist.num_regs = (val & 0x3) + 1;
a06ea964 5910 }
a06ea964
NC
5911 if (operands[i] == AARCH64_OPND_LEt)
5912 {
5913 if (!(vectype.defined & NTA_HASINDEX))
5914 goto failure;
5915 info->reglist.has_index = 1;
5916 info->reglist.index = vectype.index;
5917 }
f11ad6bc
RS
5918 else
5919 {
5920 if (vectype.defined & NTA_HASINDEX)
5921 goto failure;
5922 if (!(vectype.defined & NTA_HASTYPE))
5923 {
5924 if (reg_type == REG_TYPE_ZN)
5925 set_fatal_syntax_error (_("missing type suffix"));
5926 goto failure;
5927 }
5928 }
a06ea964
NC
5929 info->qualifier = vectype_to_qualifier (&vectype);
5930 if (info->qualifier == AARCH64_OPND_QLF_NIL)
5931 goto failure;
5932 break;
5933
ec145252
SP
5934 case AARCH64_OPND_Can:
5935 case AARCH64_OPND_Cam:
5936 case AARCH64_OPND_Cas:
5937 case AARCH64_OPND_Cad:
5938 case AARCH64_OPND_Cat:
5939 case AARCH64_OPND_Cat2:
5940 po_reg_or_fail (REG_TYPE_CA_N_Z);
5941 if (opcode->op == OP_MOV_C_ZR && operands[i] == AARCH64_OPND_Can
5942 && val != 31)
5943 {
5944 set_fatal_syntax_error (_(get_reg_expected_msg (REG_TYPE_CA_Z)));
5945 goto failure;
5946 }
5947 if (val > 31)
5948 {
5949 set_fatal_syntax_error (_(get_reg_expected_msg (REG_TYPE_CA_N)));
5950 goto failure;
5951 }
5952 info->reg.regno = val;
5953 info->qualifier = AARCH64_OPND_QLF_CA;
5954 break;
5955
5956 case AARCH64_OPND_Can_SP:
5957 case AARCH64_OPND_Cad_SP:
5958 po_reg_or_fail (REG_TYPE_CA_N_SP);
5959 info->reg.regno = val;
5960 info->qualifier = AARCH64_OPND_QLF_CA;
5961 break;
5962
a6a51754
RL
5963 case AARCH64_OPND_CRn:
5964 case AARCH64_OPND_CRm:
a06ea964 5965 {
a6a51754
RL
5966 char prefix = *(str++);
5967 if (prefix != 'c' && prefix != 'C')
5968 goto failure;
5969
5970 po_imm_nc_or_fail ();
5971 if (val > 15)
5972 {
5973 set_fatal_syntax_error (_(N_ ("C0 - C15 expected")));
5974 goto failure;
5975 }
5976 info->qualifier = AARCH64_OPND_QLF_CR;
5977 info->imm.value = val;
5978 break;
a06ea964 5979 }
a06ea964
NC
5980
5981 case AARCH64_OPND_SHLL_IMM:
5982 case AARCH64_OPND_IMM_VLSR:
5983 po_imm_or_fail (1, 64);
5984 info->imm.value = val;
5985 break;
5986
5987 case AARCH64_OPND_CCMP_IMM:
e950b345 5988 case AARCH64_OPND_SIMM5:
a06ea964 5989 case AARCH64_OPND_FBITS:
b83b4b13 5990 case AARCH64_OPND_TME_UIMM16:
a06ea964 5991 case AARCH64_OPND_UIMM4:
193614f2
SD
5992 case AARCH64_OPND_UIMM4_ADDG:
5993 case AARCH64_OPND_UIMM10:
a06ea964
NC
5994 case AARCH64_OPND_UIMM3_OP1:
5995 case AARCH64_OPND_UIMM3_OP2:
5996 case AARCH64_OPND_IMM_VLSL:
5997 case AARCH64_OPND_IMM:
f42f1a1d 5998 case AARCH64_OPND_IMM_2:
a06ea964 5999 case AARCH64_OPND_WIDTH:
e950b345
RS
6000 case AARCH64_OPND_SVE_INV_LIMM:
6001 case AARCH64_OPND_SVE_LIMM:
6002 case AARCH64_OPND_SVE_LIMM_MOV:
6003 case AARCH64_OPND_SVE_SHLIMM_PRED:
6004 case AARCH64_OPND_SVE_SHLIMM_UNPRED:
28ed815a 6005 case AARCH64_OPND_SVE_SHLIMM_UNPRED_22:
e950b345
RS
6006 case AARCH64_OPND_SVE_SHRIMM_PRED:
6007 case AARCH64_OPND_SVE_SHRIMM_UNPRED:
3c17238b 6008 case AARCH64_OPND_SVE_SHRIMM_UNPRED_22:
e950b345
RS
6009 case AARCH64_OPND_SVE_SIMM5:
6010 case AARCH64_OPND_SVE_SIMM5B:
6011 case AARCH64_OPND_SVE_SIMM6:
6012 case AARCH64_OPND_SVE_SIMM8:
6013 case AARCH64_OPND_SVE_UIMM3:
6014 case AARCH64_OPND_SVE_UIMM7:
6015 case AARCH64_OPND_SVE_UIMM8:
6016 case AARCH64_OPND_SVE_UIMM8_53:
c2c4ff8d
SN
6017 case AARCH64_OPND_IMM_ROT1:
6018 case AARCH64_OPND_IMM_ROT2:
6019 case AARCH64_OPND_IMM_ROT3:
582e12bf
RS
6020 case AARCH64_OPND_SVE_IMM_ROT1:
6021 case AARCH64_OPND_SVE_IMM_ROT2:
adccc507 6022 case AARCH64_OPND_SVE_IMM_ROT3:
a06ea964
NC
6023 po_imm_nc_or_fail ();
6024 info->imm.value = val;
6025 break;
6026
e950b345
RS
6027 case AARCH64_OPND_SVE_AIMM:
6028 case AARCH64_OPND_SVE_ASIMM:
6029 po_imm_nc_or_fail ();
6030 info->imm.value = val;
6031 skip_whitespace (str);
6032 if (skip_past_comma (&str))
6033 po_misc_or_fail (parse_shift (&str, info, SHIFTED_LSL));
6034 else
6035 inst.base.operands[i].shifter.kind = AARCH64_MOD_LSL;
6036 break;
6037
245d2e3f
RS
6038 case AARCH64_OPND_SVE_PATTERN:
6039 po_enum_or_fail (aarch64_sve_pattern_array);
6040 info->imm.value = val;
6041 break;
6042
2442d846
RS
6043 case AARCH64_OPND_SVE_PATTERN_SCALED:
6044 po_enum_or_fail (aarch64_sve_pattern_array);
6045 info->imm.value = val;
6046 if (skip_past_comma (&str)
6047 && !parse_shift (&str, info, SHIFTED_MUL))
6048 goto failure;
6049 if (!info->shifter.operator_present)
6050 {
6051 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
6052 info->shifter.kind = AARCH64_MOD_MUL;
6053 info->shifter.amount = 1;
6054 }
6055 break;
6056
245d2e3f
RS
6057 case AARCH64_OPND_SVE_PRFOP:
6058 po_enum_or_fail (aarch64_sve_prfop_array);
6059 info->imm.value = val;
6060 break;
6061
a06ea964
NC
6062 case AARCH64_OPND_UIMM7:
6063 po_imm_or_fail (0, 127);
6064 info->imm.value = val;
6065 break;
6066
6067 case AARCH64_OPND_IDX:
f42f1a1d 6068 case AARCH64_OPND_MASK:
a06ea964
NC
6069 case AARCH64_OPND_BIT_NUM:
6070 case AARCH64_OPND_IMMR:
6071 case AARCH64_OPND_IMMS:
6072 po_imm_or_fail (0, 63);
6073 info->imm.value = val;
6074 break;
6075
6076 case AARCH64_OPND_IMM0:
6077 po_imm_nc_or_fail ();
6078 if (val != 0)
6079 {
6080 set_fatal_syntax_error (_("immediate zero expected"));
6081 goto failure;
6082 }
6083 info->imm.value = 0;
6084 break;
6085
6086 case AARCH64_OPND_FPIMM0:
6087 {
6088 int qfloat;
6089 bfd_boolean res1 = FALSE, res2 = FALSE;
6090 /* N.B. -0.0 will be rejected; although -0.0 shouldn't be rejected,
6091 it is probably not worth the effort to support it. */
1799c0d0
RS
6092 if (!(res1 = parse_aarch64_imm_float (&str, &qfloat, FALSE,
6093 imm_reg_type))
6a9deabe
RS
6094 && (error_p ()
6095 || !(res2 = parse_constant_immediate (&str, &val,
6096 imm_reg_type))))
a06ea964
NC
6097 goto failure;
6098 if ((res1 && qfloat == 0) || (res2 && val == 0))
6099 {
6100 info->imm.value = 0;
6101 info->imm.is_fp = 1;
6102 break;
6103 }
6104 set_fatal_syntax_error (_("immediate zero expected"));
6105 goto failure;
6106 }
6107
6108 case AARCH64_OPND_IMM_MOV:
6109 {
6110 char *saved = str;
8db49cc2
WN
6111 if (reg_name_p (str, REG_TYPE_R_Z_SP) ||
6112 reg_name_p (str, REG_TYPE_VN))
a06ea964
NC
6113 goto failure;
6114 str = saved;
6115 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6116 GE_OPT_PREFIX, 1));
6117 /* The MOV immediate alias will be fixed up by fix_mov_imm_insn
6118 later. fix_mov_imm_insn will try to determine a machine
6119 instruction (MOVZ, MOVN or ORR) for it and will issue an error
6120 message if the immediate cannot be moved by a single
6121 instruction. */
6122 aarch64_set_gas_internal_fixup (&inst.reloc, info, 1);
6123 inst.base.operands[i].skip = 1;
6124 }
6125 break;
6126
6127 case AARCH64_OPND_SIMD_IMM:
6128 case AARCH64_OPND_SIMD_IMM_SFT:
1799c0d0 6129 if (! parse_big_immediate (&str, &val, imm_reg_type))
a06ea964
NC
6130 goto failure;
6131 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6132 /* addr_off_p */ 0,
6133 /* need_libopcodes_p */ 1,
6134 /* skip_p */ 1);
6135 /* Parse shift.
6136 N.B. although AARCH64_OPND_SIMD_IMM doesn't permit any
6137 shift, we don't check it here; we leave the checking to
6138 the libopcodes (operand_general_constraint_met_p). By
6139 doing this, we achieve better diagnostics. */
6140 if (skip_past_comma (&str)
6141 && ! parse_shift (&str, info, SHIFTED_LSL_MSL))
6142 goto failure;
6143 if (!info->shifter.operator_present
6144 && info->type == AARCH64_OPND_SIMD_IMM_SFT)
6145 {
6146 /* Default to LSL if not present. Libopcodes prefers shifter
6147 kind to be explicit. */
6148 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
6149 info->shifter.kind = AARCH64_MOD_LSL;
6150 }
6151 break;
6152
6153 case AARCH64_OPND_FPIMM:
6154 case AARCH64_OPND_SIMD_FPIMM:
165d4950 6155 case AARCH64_OPND_SVE_FPIMM8:
a06ea964
NC
6156 {
6157 int qfloat;
165d4950
RS
6158 bfd_boolean dp_p;
6159
6160 dp_p = double_precision_operand_p (&inst.base.operands[0]);
6a9deabe 6161 if (!parse_aarch64_imm_float (&str, &qfloat, dp_p, imm_reg_type)
874d7e6e 6162 || !aarch64_imm_float_p (qfloat))
a06ea964 6163 {
6a9deabe
RS
6164 if (!error_p ())
6165 set_fatal_syntax_error (_("invalid floating-point"
6166 " constant"));
a06ea964
NC
6167 goto failure;
6168 }
6169 inst.base.operands[i].imm.value = encode_imm_float_bits (qfloat);
6170 inst.base.operands[i].imm.is_fp = 1;
6171 }
6172 break;
6173
165d4950
RS
6174 case AARCH64_OPND_SVE_I1_HALF_ONE:
6175 case AARCH64_OPND_SVE_I1_HALF_TWO:
6176 case AARCH64_OPND_SVE_I1_ZERO_ONE:
6177 {
6178 int qfloat;
6179 bfd_boolean dp_p;
6180
6181 dp_p = double_precision_operand_p (&inst.base.operands[0]);
6182 if (!parse_aarch64_imm_float (&str, &qfloat, dp_p, imm_reg_type))
6183 {
6184 if (!error_p ())
6185 set_fatal_syntax_error (_("invalid floating-point"
6186 " constant"));
6187 goto failure;
6188 }
6189 inst.base.operands[i].imm.value = qfloat;
6190 inst.base.operands[i].imm.is_fp = 1;
6191 }
6192 break;
6193
a06ea964
NC
6194 case AARCH64_OPND_LIMM:
6195 po_misc_or_fail (parse_shifter_operand (&str, info,
6196 SHIFTED_LOGIC_IMM));
6197 if (info->shifter.operator_present)
6198 {
6199 set_fatal_syntax_error
6200 (_("shift not allowed for bitmask immediate"));
6201 goto failure;
6202 }
6203 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6204 /* addr_off_p */ 0,
6205 /* need_libopcodes_p */ 1,
6206 /* skip_p */ 1);
6207 break;
6208
6209 case AARCH64_OPND_AIMM:
6210 if (opcode->op == OP_ADD)
6211 /* ADD may have relocation types. */
6212 po_misc_or_fail (parse_shifter_operand_reloc (&str, info,
6213 SHIFTED_ARITH_IMM));
6214 else
6215 po_misc_or_fail (parse_shifter_operand (&str, info,
6216 SHIFTED_ARITH_IMM));
6217 switch (inst.reloc.type)
6218 {
6219 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
6220 info->shifter.amount = 12;
6221 break;
6222 case BFD_RELOC_UNUSED:
6223 aarch64_set_gas_internal_fixup (&inst.reloc, info, 0);
6224 if (info->shifter.kind != AARCH64_MOD_NONE)
6225 inst.reloc.flags = FIXUP_F_HAS_EXPLICIT_SHIFT;
6226 inst.reloc.pc_rel = 0;
6227 break;
6228 default:
6229 break;
6230 }
6231 info->imm.value = 0;
6232 if (!info->shifter.operator_present)
6233 {
6234 /* Default to LSL if not present. Libopcodes prefers shifter
6235 kind to be explicit. */
6236 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
6237 info->shifter.kind = AARCH64_MOD_LSL;
6238 }
6239 break;
6240
6241 case AARCH64_OPND_HALF:
6242 {
6243 /* #<imm16> or relocation. */
6244 int internal_fixup_p;
6245 po_misc_or_fail (parse_half (&str, &internal_fixup_p));
6246 if (internal_fixup_p)
6247 aarch64_set_gas_internal_fixup (&inst.reloc, info, 0);
6248 skip_whitespace (str);
6249 if (skip_past_comma (&str))
6250 {
6251 /* {, LSL #<shift>} */
6252 if (! aarch64_gas_internal_fixup_p ())
6253 {
6254 set_fatal_syntax_error (_("can't mix relocation modifier "
6255 "with explicit shift"));
6256 goto failure;
6257 }
6258 po_misc_or_fail (parse_shift (&str, info, SHIFTED_LSL));
6259 }
6260 else
6261 inst.base.operands[i].shifter.amount = 0;
6262 inst.base.operands[i].shifter.kind = AARCH64_MOD_LSL;
6263 inst.base.operands[i].imm.value = 0;
6264 if (! process_movw_reloc_info ())
6265 goto failure;
6266 }
6267 break;
6268
6269 case AARCH64_OPND_EXCEPTION:
09c1e68a 6270 case AARCH64_OPND_UNDEFINED:
1799c0d0
RS
6271 po_misc_or_fail (parse_immediate_expression (&str, &inst.reloc.exp,
6272 imm_reg_type));
a06ea964
NC
6273 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6274 /* addr_off_p */ 0,
6275 /* need_libopcodes_p */ 0,
6276 /* skip_p */ 1);
6277 break;
6278
6279 case AARCH64_OPND_NZCV:
6280 {
629310ab 6281 const asm_nzcv *nzcv = str_hash_find_n (aarch64_nzcv_hsh, str, 4);
a06ea964
NC
6282 if (nzcv != NULL)
6283 {
6284 str += 4;
6285 info->imm.value = nzcv->value;
6286 break;
6287 }
6288 po_imm_or_fail (0, 15);
6289 info->imm.value = val;
6290 }
6291 break;
6292
6293 case AARCH64_OPND_COND:
68a64283 6294 case AARCH64_OPND_COND1:
bb7eff52
RS
6295 {
6296 char *start = str;
6297 do
6298 str++;
6299 while (ISALPHA (*str));
629310ab 6300 info->cond = str_hash_find_n (aarch64_cond_hsh, start, str - start);
bb7eff52
RS
6301 if (info->cond == NULL)
6302 {
6303 set_syntax_error (_("invalid condition"));
6304 goto failure;
6305 }
6306 else if (operands[i] == AARCH64_OPND_COND1
6307 && (info->cond->value & 0xe) == 0xe)
6308 {
6309 /* Do not allow AL or NV. */
6310 set_default_error ();
6311 goto failure;
6312 }
6313 }
a06ea964
NC
6314 break;
6315
6316 case AARCH64_OPND_ADDR_ADRP:
6317 po_misc_or_fail (parse_adrp (&str));
6318 /* Clear the value as operand needs to be relocated. */
6319 info->imm.value = 0;
6320 break;
6321
6322 case AARCH64_OPND_ADDR_PCREL14:
6323 case AARCH64_OPND_ADDR_PCREL19:
6324 case AARCH64_OPND_ADDR_PCREL21:
6325 case AARCH64_OPND_ADDR_PCREL26:
73866052 6326 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6327 if (!info->addr.pcrel)
6328 {
6329 set_syntax_error (_("invalid pc-relative address"));
6330 goto failure;
6331 }
6332 if (inst.gen_lit_pool
6333 && (opcode->iclass != loadlit || opcode->op == OP_PRFM_LIT))
6334 {
6335 /* Only permit "=value" in the literal load instructions.
6336 The literal will be generated by programmer_friendly_fixup. */
6337 set_syntax_error (_("invalid use of \"=immediate\""));
6338 goto failure;
6339 }
6340 if (inst.reloc.exp.X_op == O_symbol && find_reloc_table_entry (&str))
6341 {
6342 set_syntax_error (_("unrecognized relocation suffix"));
6343 goto failure;
6344 }
6345 if (inst.reloc.exp.X_op == O_constant && !inst.gen_lit_pool)
6346 {
6347 info->imm.value = inst.reloc.exp.X_add_number;
6348 inst.reloc.type = BFD_RELOC_UNUSED;
6349 }
6350 else
6351 {
f0070c1e
SP
6352 bfd_boolean c64 = AARCH64_CPU_HAS_FEATURE (cpu_variant,
6353 AARCH64_FEATURE_C64);
6354
a06ea964 6355 info->imm.value = 0;
f41aef5f
RE
6356 if (inst.reloc.type == BFD_RELOC_UNUSED)
6357 switch (opcode->iclass)
6358 {
6359 case compbranch:
6360 case condbranch:
6361 /* e.g. CBZ or B.COND */
6362 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL19);
6363 inst.reloc.type = BFD_RELOC_AARCH64_BRANCH19;
6364 break;
6365 case testbranch:
6366 /* e.g. TBZ */
6367 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL14);
6368 inst.reloc.type = BFD_RELOC_AARCH64_TSTBR14;
6369 break;
6370 case branch_imm:
6371 /* e.g. B or BL */
6372 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL26);
6373 inst.reloc.type =
6374 (opcode->op == OP_BL) ? BFD_RELOC_AARCH64_CALL26
6375 : BFD_RELOC_AARCH64_JUMP26;
6376 break;
6377 case loadlit:
6378 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL19);
6379 inst.reloc.type = BFD_RELOC_AARCH64_LD_LO19_PCREL;
6380 break;
6381 case pcreladdr:
6382 gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL21);
6383 inst.reloc.type = BFD_RELOC_AARCH64_ADR_LO21_PCREL;
8b21361b
SP
6384 if (inst.reloc.exp.X_op == O_symbol
6385 && inst.reloc.exp.X_add_symbol != NULL)
6386 {
6387 symbolS *sym = inst.reloc.exp.X_add_symbol;
6388
6389 /* We set LSB for C64 local functions. We do not do
6390 this for local labels even in code section because
6391 it could be embedded data. */
6392 if (S_IS_DEFINED (sym) && AARCH64_IS_C64 (sym)
6393 && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION))
6394 {
6395 inst.reloc.exp.X_add_number += 1;
6396 }
6397 }
6398
f41aef5f
RE
6399 break;
6400 default:
6401 gas_assert (0);
6402 abort ();
6403 }
f0070c1e
SP
6404 if (c64)
6405 inst.reloc.flags = FIXUP_F_C64;
a06ea964
NC
6406 inst.reloc.pc_rel = 1;
6407 }
6408 break;
6409
6410 case AARCH64_OPND_ADDR_SIMPLE:
6411 case AARCH64_OPND_SIMD_ADDR_SIMPLE:
e1b988bb
RS
6412 {
6413 /* [<Xn|SP>{, #<simm>}] */
6414 char *start = str;
6415 /* First use the normal address-parsing routines, to get
6416 the usual syntax errors. */
73866052 6417 po_misc_or_fail (parse_address (&str, info));
e1b988bb
RS
6418 if (info->addr.pcrel || info->addr.offset.is_reg
6419 || !info->addr.preind || info->addr.postind
550fd7bf 6420 || info->addr.writeback)
e1b988bb
RS
6421 {
6422 set_syntax_error (_("invalid addressing mode"));
6423 goto failure;
6424 }
6425
6426 /* Then retry, matching the specific syntax of these addresses. */
6427 str = start;
6428 po_char_or_fail ('[');
3493da5c
SP
6429 po_reg_or_fail (AARCH64_CPU_HAS_FEATURE (cpu_variant,
6430 AARCH64_FEATURE_C64)
6431 ? REG_TYPE_CA_N_SP : REG_TYPE_R64_SP);
6432
e1b988bb
RS
6433 /* Accept optional ", #0". */
6434 if (operands[i] == AARCH64_OPND_ADDR_SIMPLE
6435 && skip_past_char (&str, ','))
6436 {
6437 skip_past_char (&str, '#');
6438 if (! skip_past_char (&str, '0'))
6439 {
6440 set_fatal_syntax_error
6441 (_("the optional immediate offset can only be 0"));
6442 goto failure;
6443 }
6444 }
6445 po_char_or_fail (']');
6446 break;
6447 }
a06ea964
NC
6448
6449 case AARCH64_OPND_ADDR_REGOFF:
6450 /* [<Xn|SP>, <R><m>{, <extend> {<amount>}}] */
73866052 6451 po_misc_or_fail (parse_address (&str, info));
4df068de 6452 regoff_addr:
a06ea964
NC
6453 if (info->addr.pcrel || !info->addr.offset.is_reg
6454 || !info->addr.preind || info->addr.postind
6455 || info->addr.writeback)
6456 {
6457 set_syntax_error (_("invalid addressing mode"));
6458 goto failure;
6459 }
6460 if (!info->shifter.operator_present)
6461 {
6462 /* Default to LSL if not present. Libopcodes prefers shifter
6463 kind to be explicit. */
6464 gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
6465 info->shifter.kind = AARCH64_MOD_LSL;
6466 }
6467 /* Qualifier to be deduced by libopcodes. */
6468 break;
6469
6470 case AARCH64_OPND_ADDR_SIMM7:
73866052 6471 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6472 if (info->addr.pcrel || info->addr.offset.is_reg
6473 || (!info->addr.preind && !info->addr.postind))
6474 {
6475 set_syntax_error (_("invalid addressing mode"));
6476 goto failure;
6477 }
73866052
RS
6478 if (inst.reloc.type != BFD_RELOC_UNUSED)
6479 {
6480 set_syntax_error (_("relocation not allowed"));
6481 goto failure;
6482 }
a06ea964
NC
6483 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6484 /* addr_off_p */ 1,
6485 /* need_libopcodes_p */ 1,
6486 /* skip_p */ 0);
6487 break;
6488
6489 case AARCH64_OPND_ADDR_SIMM9:
6490 case AARCH64_OPND_ADDR_SIMM9_2:
fb3265b3
SD
6491 case AARCH64_OPND_ADDR_SIMM11:
6492 case AARCH64_OPND_ADDR_SIMM13:
73866052 6493 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6494 if (info->addr.pcrel || info->addr.offset.is_reg
6495 || (!info->addr.preind && !info->addr.postind)
6496 || (operands[i] == AARCH64_OPND_ADDR_SIMM9_2
6497 && info->addr.writeback))
6498 {
6499 set_syntax_error (_("invalid addressing mode"));
6500 goto failure;
6501 }
6502 if (inst.reloc.type != BFD_RELOC_UNUSED)
6503 {
6504 set_syntax_error (_("relocation not allowed"));
6505 goto failure;
6506 }
6507 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6508 /* addr_off_p */ 1,
6509 /* need_libopcodes_p */ 1,
6510 /* skip_p */ 0);
6511 break;
6512
3f06e550 6513 case AARCH64_OPND_ADDR_SIMM10:
f42f1a1d 6514 case AARCH64_OPND_ADDR_OFFSET:
3f06e550
SN
6515 po_misc_or_fail (parse_address (&str, info));
6516 if (info->addr.pcrel || info->addr.offset.is_reg
6517 || !info->addr.preind || info->addr.postind)
6518 {
6519 set_syntax_error (_("invalid addressing mode"));
6520 goto failure;
6521 }
6522 if (inst.reloc.type != BFD_RELOC_UNUSED)
6523 {
6524 set_syntax_error (_("relocation not allowed"));
6525 goto failure;
6526 }
6527 assign_imm_if_const_or_fixup_later (&inst.reloc, info,
6528 /* addr_off_p */ 1,
6529 /* need_libopcodes_p */ 1,
6530 /* skip_p */ 0);
6531 break;
6532
a06ea964 6533 case AARCH64_OPND_ADDR_UIMM12:
73866052 6534 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6535 if (info->addr.pcrel || info->addr.offset.is_reg
6536 || !info->addr.preind || info->addr.writeback)
6537 {
6538 set_syntax_error (_("invalid addressing mode"));
6539 goto failure;
6540 }
6541 if (inst.reloc.type == BFD_RELOC_UNUSED)
6542 aarch64_set_gas_internal_fixup (&inst.reloc, info, 1);
4c562523
JW
6543 else if (inst.reloc.type == BFD_RELOC_AARCH64_LDST_LO12
6544 || (inst.reloc.type
6545 == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12)
6546 || (inst.reloc.type
84f1b9fb
RL
6547 == BFD_RELOC_AARCH64_TLSLD_LDST_DTPREL_LO12_NC)
6548 || (inst.reloc.type
6549 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12)
6550 || (inst.reloc.type
6551 == BFD_RELOC_AARCH64_TLSLE_LDST_TPREL_LO12_NC))
a06ea964
NC
6552 inst.reloc.type = ldst_lo12_determine_real_reloc_type ();
6553 /* Leave qualifier to be determined by libopcodes. */
6554 break;
6555
6556 case AARCH64_OPND_SIMD_ADDR_POST:
6557 /* [<Xn|SP>], <Xm|#<amount>> */
73866052 6558 po_misc_or_fail (parse_address (&str, info));
a06ea964
NC
6559 if (!info->addr.postind || !info->addr.writeback)
6560 {
6561 set_syntax_error (_("invalid addressing mode"));
6562 goto failure;
6563 }
6564 if (!info->addr.offset.is_reg)
6565 {
6566 if (inst.reloc.exp.X_op == O_constant)
6567 info->addr.offset.imm = inst.reloc.exp.X_add_number;
6568 else
6569 {
6570 set_fatal_syntax_error
ab3b8fcf 6571 (_("writeback value must be an immediate constant"));
a06ea964
NC
6572 goto failure;
6573 }
6574 }
6575 /* No qualifier. */
6576 break;
6577
582e12bf 6578 case AARCH64_OPND_SVE_ADDR_RI_S4x16:
8382113f 6579 case AARCH64_OPND_SVE_ADDR_RI_S4x32:
98907a70
RS
6580 case AARCH64_OPND_SVE_ADDR_RI_S4xVL:
6581 case AARCH64_OPND_SVE_ADDR_RI_S4x2xVL:
6582 case AARCH64_OPND_SVE_ADDR_RI_S4x3xVL:
6583 case AARCH64_OPND_SVE_ADDR_RI_S4x4xVL:
6584 case AARCH64_OPND_SVE_ADDR_RI_S6xVL:
6585 case AARCH64_OPND_SVE_ADDR_RI_S9xVL:
4df068de
RS
6586 case AARCH64_OPND_SVE_ADDR_RI_U6:
6587 case AARCH64_OPND_SVE_ADDR_RI_U6x2:
6588 case AARCH64_OPND_SVE_ADDR_RI_U6x4:
6589 case AARCH64_OPND_SVE_ADDR_RI_U6x8:
98907a70
RS
6590 /* [X<n>{, #imm, MUL VL}]
6591 [X<n>{, #imm}]
4df068de
RS
6592 but recognizing SVE registers. */
6593 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6594 &offset_qualifier));
6595 if (base_qualifier != AARCH64_OPND_QLF_X)
6596 {
6597 set_syntax_error (_("invalid addressing mode"));
6598 goto failure;
6599 }
6600 sve_regimm:
6601 if (info->addr.pcrel || info->addr.offset.is_reg
6602 || !info->addr.preind || info->addr.writeback)
6603 {
6604 set_syntax_error (_("invalid addressing mode"));
6605 goto failure;
6606 }
6607 if (inst.reloc.type != BFD_RELOC_UNUSED
6608 || inst.reloc.exp.X_op != O_constant)
6609 {
6610 /* Make sure this has priority over
6611 "invalid addressing mode". */
6612 set_fatal_syntax_error (_("constant offset required"));
6613 goto failure;
6614 }
6615 info->addr.offset.imm = inst.reloc.exp.X_add_number;
6616 break;
6617
c8d59609
NC
6618 case AARCH64_OPND_SVE_ADDR_R:
6619 /* [<Xn|SP>{, <R><m>}]
6620 but recognizing SVE registers. */
6621 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6622 &offset_qualifier));
6623 if (offset_qualifier == AARCH64_OPND_QLF_NIL)
6624 {
6625 offset_qualifier = AARCH64_OPND_QLF_X;
6626 info->addr.offset.is_reg = 1;
6627 info->addr.offset.regno = 31;
6628 }
6629 else if (base_qualifier != AARCH64_OPND_QLF_X
6630 || offset_qualifier != AARCH64_OPND_QLF_X)
6631 {
6632 set_syntax_error (_("invalid addressing mode"));
6633 goto failure;
6634 }
6635 goto regoff_addr;
6636
4df068de
RS
6637 case AARCH64_OPND_SVE_ADDR_RR:
6638 case AARCH64_OPND_SVE_ADDR_RR_LSL1:
6639 case AARCH64_OPND_SVE_ADDR_RR_LSL2:
6640 case AARCH64_OPND_SVE_ADDR_RR_LSL3:
6641 case AARCH64_OPND_SVE_ADDR_RX:
6642 case AARCH64_OPND_SVE_ADDR_RX_LSL1:
6643 case AARCH64_OPND_SVE_ADDR_RX_LSL2:
6644 case AARCH64_OPND_SVE_ADDR_RX_LSL3:
6645 /* [<Xn|SP>, <R><m>{, lsl #<amount>}]
6646 but recognizing SVE registers. */
6647 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6648 &offset_qualifier));
6649 if (base_qualifier != AARCH64_OPND_QLF_X
6650 || offset_qualifier != AARCH64_OPND_QLF_X)
6651 {
6652 set_syntax_error (_("invalid addressing mode"));
6653 goto failure;
6654 }
6655 goto regoff_addr;
6656
6657 case AARCH64_OPND_SVE_ADDR_RZ:
6658 case AARCH64_OPND_SVE_ADDR_RZ_LSL1:
6659 case AARCH64_OPND_SVE_ADDR_RZ_LSL2:
6660 case AARCH64_OPND_SVE_ADDR_RZ_LSL3:
6661 case AARCH64_OPND_SVE_ADDR_RZ_XTW_14:
6662 case AARCH64_OPND_SVE_ADDR_RZ_XTW_22:
6663 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_14:
6664 case AARCH64_OPND_SVE_ADDR_RZ_XTW1_22:
6665 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_14:
6666 case AARCH64_OPND_SVE_ADDR_RZ_XTW2_22:
6667 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_14:
6668 case AARCH64_OPND_SVE_ADDR_RZ_XTW3_22:
6669 /* [<Xn|SP>, Z<m>.D{, LSL #<amount>}]
6670 [<Xn|SP>, Z<m>.<T>, <extend> {#<amount>}] */
6671 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6672 &offset_qualifier));
6673 if (base_qualifier != AARCH64_OPND_QLF_X
6674 || (offset_qualifier != AARCH64_OPND_QLF_S_S
6675 && offset_qualifier != AARCH64_OPND_QLF_S_D))
6676 {
6677 set_syntax_error (_("invalid addressing mode"));
6678 goto failure;
6679 }
6680 info->qualifier = offset_qualifier;
6681 goto regoff_addr;
6682
c469c864
MM
6683 case AARCH64_OPND_SVE_ADDR_ZX:
6684 /* [Zn.<T>{, <Xm>}]. */
6685 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6686 &offset_qualifier));
6687 /* Things to check:
6688 base_qualifier either S_S or S_D
6689 offset_qualifier must be X
6690 */
6691 if ((base_qualifier != AARCH64_OPND_QLF_S_S
6692 && base_qualifier != AARCH64_OPND_QLF_S_D)
6693 || offset_qualifier != AARCH64_OPND_QLF_X)
6694 {
6695 set_syntax_error (_("invalid addressing mode"));
6696 goto failure;
6697 }
6698 info->qualifier = base_qualifier;
6699 if (!info->addr.offset.is_reg || info->addr.pcrel
6700 || !info->addr.preind || info->addr.writeback
6701 || info->shifter.operator_present != 0)
6702 {
6703 set_syntax_error (_("invalid addressing mode"));
6704 goto failure;
6705 }
6706 info->shifter.kind = AARCH64_MOD_LSL;
6707 break;
6708
6709
4df068de
RS
6710 case AARCH64_OPND_SVE_ADDR_ZI_U5:
6711 case AARCH64_OPND_SVE_ADDR_ZI_U5x2:
6712 case AARCH64_OPND_SVE_ADDR_ZI_U5x4:
6713 case AARCH64_OPND_SVE_ADDR_ZI_U5x8:
6714 /* [Z<n>.<T>{, #imm}] */
6715 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6716 &offset_qualifier));
6717 if (base_qualifier != AARCH64_OPND_QLF_S_S
6718 && base_qualifier != AARCH64_OPND_QLF_S_D)
6719 {
6720 set_syntax_error (_("invalid addressing mode"));
6721 goto failure;
6722 }
6723 info->qualifier = base_qualifier;
6724 goto sve_regimm;
6725
6726 case AARCH64_OPND_SVE_ADDR_ZZ_LSL:
6727 case AARCH64_OPND_SVE_ADDR_ZZ_SXTW:
6728 case AARCH64_OPND_SVE_ADDR_ZZ_UXTW:
6729 /* [Z<n>.<T>, Z<m>.<T>{, LSL #<amount>}]
6730 [Z<n>.D, Z<m>.D, <extend> {#<amount>}]
6731
6732 We don't reject:
6733
6734 [Z<n>.S, Z<m>.S, <extend> {#<amount>}]
6735
6736 here since we get better error messages by leaving it to
6737 the qualifier checking routines. */
6738 po_misc_or_fail (parse_sve_address (&str, info, &base_qualifier,
6739 &offset_qualifier));
6740 if ((base_qualifier != AARCH64_OPND_QLF_S_S
6741 && base_qualifier != AARCH64_OPND_QLF_S_D)
6742 || offset_qualifier != base_qualifier)
6743 {
6744 set_syntax_error (_("invalid addressing mode"));
6745 goto failure;
6746 }
6747 info->qualifier = base_qualifier;
6748 goto regoff_addr;
6749
a06ea964 6750 case AARCH64_OPND_SYSREG:
7d02540a
TC
6751 {
6752 uint32_t sysreg_flags;
6753 if ((val = parse_sys_reg (&str, aarch64_sys_regs_hsh, 1, 0,
6754 &sysreg_flags)) == PARSE_FAIL)
6755 {
6756 set_syntax_error (_("unknown or missing system register name"));
6757 goto failure;
6758 }
6759 inst.base.operands[i].sysreg.value = val;
6760 inst.base.operands[i].sysreg.flags = sysreg_flags;
6761 break;
6762 }
a06ea964
NC
6763
6764 case AARCH64_OPND_PSTATEFIELD:
561a72d4 6765 if ((val = parse_sys_reg (&str, aarch64_pstatefield_hsh, 0, 1, NULL))
a3251895 6766 == PARSE_FAIL)
a06ea964
NC
6767 {
6768 set_syntax_error (_("unknown or missing PSTATE field name"));
6769 goto failure;
6770 }
6771 inst.base.operands[i].pstatefield = val;
6772 break;
6773
6774 case AARCH64_OPND_SYSREG_IC:
6775 inst.base.operands[i].sysins_op =
6776 parse_sys_ins_reg (&str, aarch64_sys_regs_ic_hsh);
6777 goto sys_reg_ins;
2ac435d4 6778
a06ea964
NC
6779 case AARCH64_OPND_SYSREG_DC:
6780 inst.base.operands[i].sysins_op =
6781 parse_sys_ins_reg (&str, aarch64_sys_regs_dc_hsh);
6782 goto sys_reg_ins;
2ac435d4 6783
a06ea964
NC
6784 case AARCH64_OPND_SYSREG_AT:
6785 inst.base.operands[i].sysins_op =
6786 parse_sys_ins_reg (&str, aarch64_sys_regs_at_hsh);
6787 goto sys_reg_ins;
2ac435d4
SD
6788
6789 case AARCH64_OPND_SYSREG_SR:
6790 inst.base.operands[i].sysins_op =
6791 parse_sys_ins_reg (&str, aarch64_sys_regs_sr_hsh);
6792 goto sys_reg_ins;
6793
a06ea964
NC
6794 case AARCH64_OPND_SYSREG_TLBI:
6795 inst.base.operands[i].sysins_op =
6796 parse_sys_ins_reg (&str, aarch64_sys_regs_tlbi_hsh);
dc1e8a47 6797 sys_reg_ins:
a06ea964
NC
6798 if (inst.base.operands[i].sysins_op == NULL)
6799 {
6800 set_fatal_syntax_error ( _("unknown or missing operation name"));
6801 goto failure;
6802 }
6803 break;
6804
6805 case AARCH64_OPND_BARRIER:
6806 case AARCH64_OPND_BARRIER_ISB:
6807 val = parse_barrier (&str);
6808 if (val != PARSE_FAIL
6809 && operands[i] == AARCH64_OPND_BARRIER_ISB && val != 0xf)
6810 {
6811 /* ISB only accepts options name 'sy'. */
6812 set_syntax_error
6813 (_("the specified option is not accepted in ISB"));
6814 /* Turn off backtrack as this optional operand is present. */
6815 backtrack_pos = 0;
6816 goto failure;
6817 }
6818 /* This is an extension to accept a 0..15 immediate. */
6819 if (val == PARSE_FAIL)
6820 po_imm_or_fail (0, 15);
6821 info->barrier = aarch64_barrier_options + val;
6822 break;
6823
6824 case AARCH64_OPND_PRFOP:
6825 val = parse_pldop (&str);
6826 /* This is an extension to accept a 0..31 immediate. */
6827 if (val == PARSE_FAIL)
6828 po_imm_or_fail (0, 31);
6829 inst.base.operands[i].prfop = aarch64_prfops + val;
6830 break;
6831
1e6f4800
MW
6832 case AARCH64_OPND_BARRIER_PSB:
6833 val = parse_barrier_psb (&str, &(info->hint_option));
6834 if (val == PARSE_FAIL)
6835 goto failure;
6836 break;
6837
ff605452
SD
6838 case AARCH64_OPND_BTI_TARGET:
6839 val = parse_bti_operand (&str, &(info->hint_option));
6840 if (val == PARSE_FAIL)
6841 goto failure;
6842 break;
6843
a06ea964
NC
6844 default:
6845 as_fatal (_("unhandled operand code %d"), operands[i]);
6846 }
6847
6848 /* If we get here, this operand was successfully parsed. */
6849 inst.base.operands[i].present = 1;
6850 continue;
6851
dc1e8a47 6852 failure:
a06ea964
NC
6853 /* The parse routine should already have set the error, but in case
6854 not, set a default one here. */
6855 if (! error_p ())
6856 set_default_error ();
6857
6858 if (! backtrack_pos)
6859 goto parse_operands_return;
6860
f4c51f60
JW
6861 {
6862 /* We reach here because this operand is marked as optional, and
6863 either no operand was supplied or the operand was supplied but it
6864 was syntactically incorrect. In the latter case we report an
6865 error. In the former case we perform a few more checks before
6866 dropping through to the code to insert the default operand. */
6867
6868 char *tmp = backtrack_pos;
6869 char endchar = END_OF_INSN;
6870
6871 if (i != (aarch64_num_of_operands (opcode) - 1))
6872 endchar = ',';
6873 skip_past_char (&tmp, ',');
6874
6875 if (*tmp != endchar)
6876 /* The user has supplied an operand in the wrong format. */
6877 goto parse_operands_return;
6878
6879 /* Make sure there is not a comma before the optional operand.
6880 For example the fifth operand of 'sys' is optional:
6881
6882 sys #0,c0,c0,#0, <--- wrong
6883 sys #0,c0,c0,#0 <--- correct. */
6884 if (comma_skipped_p && i && endchar == END_OF_INSN)
6885 {
6886 set_fatal_syntax_error
6887 (_("unexpected comma before the omitted optional operand"));
6888 goto parse_operands_return;
6889 }
6890 }
6891
a06ea964
NC
6892 /* Reaching here means we are dealing with an optional operand that is
6893 omitted from the assembly line. */
6894 gas_assert (optional_operand_p (opcode, i));
6895 info->present = 0;
6896 process_omitted_operand (operands[i], opcode, i, info);
6897
6898 /* Try again, skipping the optional operand at backtrack_pos. */
6899 str = backtrack_pos;
6900 backtrack_pos = 0;
6901
a06ea964
NC
6902 /* Clear any error record after the omitted optional operand has been
6903 successfully handled. */
6904 clear_error ();
6905 }
6906
6907 /* Check if we have parsed all the operands. */
6908 if (*str != '\0' && ! error_p ())
6909 {
6910 /* Set I to the index of the last present operand; this is
6911 for the purpose of diagnostics. */
6912 for (i -= 1; i >= 0 && !inst.base.operands[i].present; --i)
6913 ;
6914 set_fatal_syntax_error
6915 (_("unexpected characters following instruction"));
6916 }
6917
dc1e8a47 6918 parse_operands_return:
a06ea964
NC
6919
6920 if (error_p ())
6921 {
6922 DEBUG_TRACE ("parsing FAIL: %s - %s",
6923 operand_mismatch_kind_names[get_error_kind ()],
6924 get_error_message ());
6925 /* Record the operand error properly; this is useful when there
6926 are multiple instruction templates for a mnemonic name, so that
6927 later on, we can select the error that most closely describes
6928 the problem. */
6929 record_operand_error (opcode, i, get_error_kind (),
6930 get_error_message ());
6931 return FALSE;
6932 }
6933 else
6934 {
6935 DEBUG_TRACE ("parsing SUCCESS");
6936 return TRUE;
6937 }
6938}
6939
6940/* It does some fix-up to provide some programmer friendly feature while
6941 keeping the libopcodes happy, i.e. libopcodes only accepts
6942 the preferred architectural syntax.
6943 Return FALSE if there is any failure; otherwise return TRUE. */
6944
6945static bfd_boolean
6946programmer_friendly_fixup (aarch64_instruction *instr)
6947{
6948 aarch64_inst *base = &instr->base;
6949 const aarch64_opcode *opcode = base->opcode;
6950 enum aarch64_op op = opcode->op;
6951 aarch64_opnd_info *operands = base->operands;
6952
6953 DEBUG_TRACE ("enter");
6954
6955 switch (opcode->iclass)
6956 {
6957 case testbranch:
6958 /* TBNZ Xn|Wn, #uimm6, label
6959 Test and Branch Not Zero: conditionally jumps to label if bit number
6960 uimm6 in register Xn is not zero. The bit number implies the width of
6961 the register, which may be written and should be disassembled as Wn if
6962 uimm is less than 32. */
6963 if (operands[0].qualifier == AARCH64_OPND_QLF_W)
6964 {
6965 if (operands[1].imm.value >= 32)
6966 {
6967 record_operand_out_of_range_error (opcode, 1, _("immediate value"),
6968 0, 31);
6969 return FALSE;
6970 }
6971 operands[0].qualifier = AARCH64_OPND_QLF_X;
6972 }
6973 break;
6974 case loadlit:
6975 /* LDR Wt, label | =value
6976 As a convenience assemblers will typically permit the notation
6977 "=value" in conjunction with the pc-relative literal load instructions
6978 to automatically place an immediate value or symbolic address in a
6979 nearby literal pool and generate a hidden label which references it.
6980 ISREG has been set to 0 in the case of =value. */
6981 if (instr->gen_lit_pool
6982 && (op == OP_LDR_LIT || op == OP_LDRV_LIT || op == OP_LDRSW_LIT))
6983 {
6984 int size = aarch64_get_qualifier_esize (operands[0].qualifier);
6985 if (op == OP_LDRSW_LIT)
6986 size = 4;
6987 if (instr->reloc.exp.X_op != O_constant
67a32447 6988 && instr->reloc.exp.X_op != O_big
a06ea964
NC
6989 && instr->reloc.exp.X_op != O_symbol)
6990 {
6991 record_operand_error (opcode, 1,
6992 AARCH64_OPDE_FATAL_SYNTAX_ERROR,
6993 _("constant expression expected"));
6994 return FALSE;
6995 }
6996 if (! add_to_lit_pool (&instr->reloc.exp, size))
6997 {
6998 record_operand_error (opcode, 1,
6999 AARCH64_OPDE_OTHER_ERROR,
7000 _("literal pool insertion failed"));
7001 return FALSE;
7002 }
7003 }
7004 break;
a06ea964
NC
7005 case log_shift:
7006 case bitfield:
7007 /* UXT[BHW] Wd, Wn
7008 Unsigned Extend Byte|Halfword|Word: UXT[BH] is architectural alias
7009 for UBFM Wd,Wn,#0,#7|15, while UXTW is pseudo instruction which is
7010 encoded using ORR Wd, WZR, Wn (MOV Wd,Wn).
7011 A programmer-friendly assembler should accept a destination Xd in
7012 place of Wd, however that is not the preferred form for disassembly.
7013 */
7014 if ((op == OP_UXTB || op == OP_UXTH || op == OP_UXTW)
7015 && operands[1].qualifier == AARCH64_OPND_QLF_W
7016 && operands[0].qualifier == AARCH64_OPND_QLF_X)
7017 operands[0].qualifier = AARCH64_OPND_QLF_W;
7018 break;
7019
7020 case addsub_ext:
7021 {
7022 /* In the 64-bit form, the final register operand is written as Wm
7023 for all but the (possibly omitted) UXTX/LSL and SXTX
7024 operators.
7025 As a programmer-friendly assembler, we accept e.g.
7026 ADDS <Xd>, <Xn|SP>, <Xm>{, UXTB {#<amount>}} and change it to
7027 ADDS <Xd>, <Xn|SP>, <Wm>{, UXTB {#<amount>}}. */
7028 int idx = aarch64_operand_index (opcode->operands,
7029 AARCH64_OPND_Rm_EXT);
7030 gas_assert (idx == 1 || idx == 2);
7031 if (operands[0].qualifier == AARCH64_OPND_QLF_X
7032 && operands[idx].qualifier == AARCH64_OPND_QLF_X
7033 && operands[idx].shifter.kind != AARCH64_MOD_LSL
7034 && operands[idx].shifter.kind != AARCH64_MOD_UXTX
7035 && operands[idx].shifter.kind != AARCH64_MOD_SXTX)
7036 operands[idx].qualifier = AARCH64_OPND_QLF_W;
7037 }
7038 break;
7039
7040 default:
7041 break;
7042 }
7043
7044 DEBUG_TRACE ("exit with SUCCESS");
7045 return TRUE;
7046}
7047
5c47e525 7048/* Check for loads and stores that will cause unpredictable behavior. */
54a28c4c
JW
7049
7050static void
7051warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
7052{
7053 aarch64_inst *base = &instr->base;
7054 const aarch64_opcode *opcode = base->opcode;
7055 const aarch64_opnd_info *opnds = base->operands;
7056 switch (opcode->iclass)
7057 {
7058 case ldst_pos:
7059 case ldst_imm9:
3f06e550 7060 case ldst_imm10:
54a28c4c
JW
7061 case ldst_unscaled:
7062 case ldst_unpriv:
5c47e525
RE
7063 /* Loading/storing the base register is unpredictable if writeback. */
7064 if ((aarch64_get_operand_class (opnds[0].type)
7065 == AARCH64_OPND_CLASS_INT_REG)
7066 && opnds[0].reg.regno == opnds[1].addr.base_regno
4bf8c6e8 7067 && opnds[1].addr.base_regno != REG_SP
69105ce4
SD
7068 /* Exempt STG/STZG/ST2G/STZ2G. */
7069 && !(opnds[1].type == AARCH64_OPND_ADDR_SIMM13)
54a28c4c 7070 && opnds[1].addr.writeback)
5c47e525 7071 as_warn (_("unpredictable transfer with writeback -- `%s'"), str);
54a28c4c 7072 break;
503ba600 7073
54a28c4c
JW
7074 case ldstpair_off:
7075 case ldstnapair_offs:
7076 case ldstpair_indexed:
5c47e525
RE
7077 /* Loading/storing the base register is unpredictable if writeback. */
7078 if ((aarch64_get_operand_class (opnds[0].type)
7079 == AARCH64_OPND_CLASS_INT_REG)
7080 && (opnds[0].reg.regno == opnds[2].addr.base_regno
7081 || opnds[1].reg.regno == opnds[2].addr.base_regno)
4bf8c6e8 7082 && opnds[2].addr.base_regno != REG_SP
fb3265b3
SD
7083 /* Exempt STGP. */
7084 && !(opnds[2].type == AARCH64_OPND_ADDR_SIMM11)
54a28c4c 7085 && opnds[2].addr.writeback)
5c47e525
RE
7086 as_warn (_("unpredictable transfer with writeback -- `%s'"), str);
7087 /* Load operations must load different registers. */
54a28c4c
JW
7088 if ((opcode->opcode & (1 << 22))
7089 && opnds[0].reg.regno == opnds[1].reg.regno)
7090 as_warn (_("unpredictable load of register pair -- `%s'"), str);
7091 break;
ee943970
RR
7092
7093 case ldstexcl:
7094 /* It is unpredictable if the destination and status registers are the
7095 same. */
7096 if ((aarch64_get_operand_class (opnds[0].type)
7097 == AARCH64_OPND_CLASS_INT_REG)
7098 && (aarch64_get_operand_class (opnds[1].type)
7099 == AARCH64_OPND_CLASS_INT_REG)
7100 && (opnds[0].reg.regno == opnds[1].reg.regno
7101 || opnds[0].reg.regno == opnds[2].reg.regno))
7102 as_warn (_("unpredictable: identical transfer and status registers"
7103 " --`%s'"),
7104 str);
7105
7106 break;
7107
54a28c4c
JW
7108 default:
7109 break;
7110 }
7111}
7112
4f5d2536
TC
7113static void
7114force_automatic_sequence_close (void)
7115{
7116 if (now_instr_sequence.instr)
7117 {
7118 as_warn (_("previous `%s' sequence has not been closed"),
7119 now_instr_sequence.instr->opcode->name);
7120 init_insn_sequence (NULL, &now_instr_sequence);
7121 }
7122}
7123
a06ea964
NC
7124/* A wrapper function to interface with libopcodes on encoding and
7125 record the error message if there is any.
7126
7127 Return TRUE on success; otherwise return FALSE. */
7128
7129static bfd_boolean
7130do_encode (const aarch64_opcode *opcode, aarch64_inst *instr,
7131 aarch64_insn *code)
7132{
7133 aarch64_operand_error error_info;
7d02540a 7134 memset (&error_info, '\0', sizeof (error_info));
a06ea964 7135 error_info.kind = AARCH64_OPDE_NIL;
3979cf50
SP
7136 if (aarch64_opcode_encode (cpu_variant, opcode, instr, code, NULL,
7137 &error_info, insn_sequence)
7d02540a 7138 && !error_info.non_fatal)
a06ea964 7139 return TRUE;
7d02540a
TC
7140
7141 gas_assert (error_info.kind != AARCH64_OPDE_NIL);
7142 record_operand_error_info (opcode, &error_info);
7143 return error_info.non_fatal;
a06ea964
NC
7144}
7145
7146#ifdef DEBUG_AARCH64
7147static inline void
7148dump_opcode_operands (const aarch64_opcode *opcode)
7149{
7150 int i = 0;
7151 while (opcode->operands[i] != AARCH64_OPND_NIL)
7152 {
7153 aarch64_verbose ("\t\t opnd%d: %s", i,
7154 aarch64_get_operand_name (opcode->operands[i])[0] != '\0'
7155 ? aarch64_get_operand_name (opcode->operands[i])
7156 : aarch64_get_operand_desc (opcode->operands[i]));
7157 ++i;
7158 }
7159}
7160#endif /* DEBUG_AARCH64 */
7161
7162/* This is the guts of the machine-dependent assembler. STR points to a
7163 machine dependent instruction. This function is supposed to emit
7164 the frags/bytes it assembles to. */
7165
7166void
7167md_assemble (char *str)
7168{
7169 char *p = str;
7170 templates *template;
7171 aarch64_opcode *opcode;
7172 aarch64_inst *inst_base;
7173 unsigned saved_cond;
7174
7175 /* Align the previous label if needed. */
7176 if (last_label_seen != NULL)
7177 {
7178 symbol_set_frag (last_label_seen, frag_now);
7179 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
7180 S_SET_SEGMENT (last_label_seen, now_seg);
7181 }
7182
7e84b55d
TC
7183 /* Update the current insn_sequence from the segment. */
7184 insn_sequence = &seg_info (now_seg)->tc_segment_info_data.insn_sequence;
7185
a06ea964
NC
7186 inst.reloc.type = BFD_RELOC_UNUSED;
7187
7188 DEBUG_TRACE ("\n\n");
7189 DEBUG_TRACE ("==============================");
7190 DEBUG_TRACE ("Enter md_assemble with %s", str);
7191
7192 template = opcode_lookup (&p);
7193 if (!template)
7194 {
7195 /* It wasn't an instruction, but it might be a register alias of
7196 the form alias .req reg directive. */
7197 if (!create_register_alias (str, p))
7198 as_bad (_("unknown mnemonic `%s' -- `%s'"), get_mnemonic_name (str),
7199 str);
7200 return;
7201 }
7202
7203 skip_whitespace (p);
7204 if (*p == ',')
7205 {
7206 as_bad (_("unexpected comma after the mnemonic name `%s' -- `%s'"),
7207 get_mnemonic_name (str), str);
7208 return;
7209 }
7210
7211 init_operand_error_report ();
7212
eb9d6cc9
RL
7213 /* Sections are assumed to start aligned. In executable section, there is no
7214 MAP_DATA symbol pending. So we only align the address during
3979cf50 7215 MAP_DATA --> MAP_CUR_INSN transition.
eb9d6cc9
RL
7216 For other sections, this is not guaranteed. */
7217 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
7218 if (!need_pass_2 && subseg_text_p (now_seg) && mapstate == MAP_DATA)
7219 frag_align_code (2, 0);
7220
a06ea964
NC
7221 saved_cond = inst.cond;
7222 reset_aarch64_instruction (&inst);
7223 inst.cond = saved_cond;
7224
7225 /* Iterate through all opcode entries with the same mnemonic name. */
7226 do
7227 {
7228 opcode = template->opcode;
7229
7230 DEBUG_TRACE ("opcode %s found", opcode->name);
7231#ifdef DEBUG_AARCH64
7232 if (debug_dump)
7233 dump_opcode_operands (opcode);
7234#endif /* DEBUG_AARCH64 */
7235
3979cf50 7236 mapping_state (MAP_CUR_INSN);
a06ea964
NC
7237
7238 inst_base = &inst.base;
7239 inst_base->opcode = opcode;
7240
7241 /* Truly conditionally executed instructions, e.g. b.cond. */
7242 if (opcode->flags & F_COND)
7243 {
7244 gas_assert (inst.cond != COND_ALWAYS);
7245 inst_base->cond = get_cond_from_value (inst.cond);
7246 DEBUG_TRACE ("condition found %s", inst_base->cond->names[0]);
7247 }
7248 else if (inst.cond != COND_ALWAYS)
7249 {
7250 /* It shouldn't arrive here, where the assembly looks like a
7251 conditional instruction but the found opcode is unconditional. */
7252 gas_assert (0);
7253 continue;
7254 }
7255
7256 if (parse_operands (p, opcode)
7257 && programmer_friendly_fixup (&inst)
7258 && do_encode (inst_base->opcode, &inst.base, &inst_base->value))
7259 {
3f06bfce
YZ
7260 /* Check that this instruction is supported for this CPU. */
7261 if (!opcode->avariant
93d8990c 7262 || !AARCH64_CPU_HAS_ALL_FEATURES (cpu_variant, *opcode->avariant))
3f06bfce
YZ
7263 {
7264 as_bad (_("selected processor does not support `%s'"), str);
7265 return;
7266 }
7267
54a28c4c
JW
7268 warn_unpredictable_ldst (&inst, str);
7269
a06ea964
NC
7270 if (inst.reloc.type == BFD_RELOC_UNUSED
7271 || !inst.reloc.need_libopcodes_p)
7272 output_inst (NULL);
7273 else
7274 {
7275 /* If there is relocation generated for the instruction,
7276 store the instruction information for the future fix-up. */
7277 struct aarch64_inst *copy;
7278 gas_assert (inst.reloc.type != BFD_RELOC_UNUSED);
325801bd 7279 copy = XNEW (struct aarch64_inst);
a06ea964
NC
7280 memcpy (copy, &inst.base, sizeof (struct aarch64_inst));
7281 output_inst (copy);
7282 }
7d02540a
TC
7283
7284 /* Issue non-fatal messages if any. */
7285 output_operand_error_report (str, TRUE);
a06ea964
NC
7286 return;
7287 }
7288
7289 template = template->next;
7290 if (template != NULL)
7291 {
7292 reset_aarch64_instruction (&inst);
7293 inst.cond = saved_cond;
7294 }
7295 }
7296 while (template != NULL);
7297
7298 /* Issue the error messages if any. */
7d02540a 7299 output_operand_error_report (str, FALSE);
a06ea964
NC
7300}
7301
7302/* Various frobbings of labels and their addresses. */
7303
7304void
7305aarch64_start_line_hook (void)
7306{
7307 last_label_seen = NULL;
7308}
7309
7310void
7311aarch64_frob_label (symbolS * sym)
7312{
7313 last_label_seen = sym;
7314
8b21361b
SP
7315 AARCH64_SET_C64 (sym, IS_C64);
7316
a06ea964
NC
7317 dwarf2_emit_label (sym);
7318}
7319
4f5d2536
TC
7320void
7321aarch64_frob_section (asection *sec ATTRIBUTE_UNUSED)
7322{
7323 /* Check to see if we have a block to close. */
7324 force_automatic_sequence_close ();
7325}
7326
a06ea964
NC
7327int
7328aarch64_data_in_code (void)
7329{
7330 if (!strncmp (input_line_pointer + 1, "data:", 5))
7331 {
7332 *input_line_pointer = '/';
7333 input_line_pointer += 5;
7334 *input_line_pointer = 0;
7335 return 1;
7336 }
7337
7338 return 0;
7339}
7340
7341char *
7342aarch64_canonicalize_symbol_name (char *name)
7343{
7344 int len;
7345
7346 if ((len = strlen (name)) > 5 && streq (name + len - 5, "/data"))
7347 *(name + len - 5) = 0;
7348
7349 return name;
7350}
7351\f
7352/* Table of all register names defined by default. The user can
7353 define additional names with .req. Note that all register names
7354 should appear in both upper and lowercase variants. Some registers
7355 also have mixed-case names. */
7356
7357#define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE }
8975f864 7358#define REGDEF_ALIAS(s, n, t) { #s, n, REG_TYPE_##t, FALSE}
a06ea964 7359#define REGNUM(p,n,t) REGDEF(p##n, n, t)
f11ad6bc 7360#define REGSET16(p,t) \
a06ea964
NC
7361 REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
7362 REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
7363 REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
f11ad6bc
RS
7364 REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
7365#define REGSET31(p,t) \
7366 REGSET16(p, t), \
a06ea964
NC
7367 REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
7368 REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
7369 REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
7370 REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t)
7371#define REGSET(p,t) \
7372 REGSET31(p,t), REGNUM(p,31,t)
7373
7374/* These go into aarch64_reg_hsh hash-table. */
7375static const reg_entry reg_names[] = {
7376 /* Integer registers. */
7377 REGSET31 (x, R_64), REGSET31 (X, R_64),
7378 REGSET31 (w, R_32), REGSET31 (W, R_32),
7379
8975f864 7380 REGDEF_ALIAS (ip0, 16, R_64), REGDEF_ALIAS (IP0, 16, R_64),
f10e937a 7381 REGDEF_ALIAS (ip1, 17, R_64), REGDEF_ALIAS (IP1, 17, R_64),
8975f864
RR
7382 REGDEF_ALIAS (fp, 29, R_64), REGDEF_ALIAS (FP, 29, R_64),
7383 REGDEF_ALIAS (lr, 30, R_64), REGDEF_ALIAS (LR, 30, R_64),
a06ea964
NC
7384 REGDEF (wsp, 31, SP_32), REGDEF (WSP, 31, SP_32),
7385 REGDEF (sp, 31, SP_64), REGDEF (SP, 31, SP_64),
7386
7387 REGDEF (wzr, 31, Z_32), REGDEF (WZR, 31, Z_32),
7388 REGDEF (xzr, 31, Z_64), REGDEF (XZR, 31, Z_64),
7389
3493da5c
SP
7390 /* Capability Registers. */
7391 REGSET31 (c, CA_N), REGSET31 (C, CA_N),
7392 REGDEF (csp, 31, CA_SP), REGDEF (CSP, 31, CA_SP),
7393 REGDEF (czr, 31, CA_Z), REGDEF (CZR, 31, CA_Z),
7394 REGDEF (ddc, 33, CA_D), REGDEF (DDC, 33, CA_D),
7395 REGDEF_ALIAS (clr, 30, CA_N), REGDEF_ALIAS (CLR, 30, CA_N),
7396
a06ea964
NC
7397 /* Floating-point single precision registers. */
7398 REGSET (s, FP_S), REGSET (S, FP_S),
7399
7400 /* Floating-point double precision registers. */
7401 REGSET (d, FP_D), REGSET (D, FP_D),
7402
7403 /* Floating-point half precision registers. */
7404 REGSET (h, FP_H), REGSET (H, FP_H),
7405
7406 /* Floating-point byte precision registers. */
7407 REGSET (b, FP_B), REGSET (B, FP_B),
7408
7409 /* Floating-point quad precision registers. */
7410 REGSET (q, FP_Q), REGSET (Q, FP_Q),
7411
7412 /* FP/SIMD registers. */
7413 REGSET (v, VN), REGSET (V, VN),
f11ad6bc
RS
7414
7415 /* SVE vector registers. */
7416 REGSET (z, ZN), REGSET (Z, ZN),
7417
7418 /* SVE predicate registers. */
7419 REGSET16 (p, PN), REGSET16 (P, PN)
a06ea964
NC
7420};
7421
7422#undef REGDEF
8975f864 7423#undef REGDEF_ALIAS
a06ea964 7424#undef REGNUM
f11ad6bc
RS
7425#undef REGSET16
7426#undef REGSET31
a06ea964
NC
7427#undef REGSET
7428
7429#define N 1
7430#define n 0
7431#define Z 1
7432#define z 0
7433#define C 1
7434#define c 0
7435#define V 1
7436#define v 0
7437#define B(a,b,c,d) (((a) << 3) | ((b) << 2) | ((c) << 1) | (d))
7438static const asm_nzcv nzcv_names[] = {
7439 {"nzcv", B (n, z, c, v)},
7440 {"nzcV", B (n, z, c, V)},
7441 {"nzCv", B (n, z, C, v)},
7442 {"nzCV", B (n, z, C, V)},
7443 {"nZcv", B (n, Z, c, v)},
7444 {"nZcV", B (n, Z, c, V)},
7445 {"nZCv", B (n, Z, C, v)},
7446 {"nZCV", B (n, Z, C, V)},
7447 {"Nzcv", B (N, z, c, v)},
7448 {"NzcV", B (N, z, c, V)},
7449 {"NzCv", B (N, z, C, v)},
7450 {"NzCV", B (N, z, C, V)},
7451 {"NZcv", B (N, Z, c, v)},
7452 {"NZcV", B (N, Z, c, V)},
7453 {"NZCv", B (N, Z, C, v)},
7454 {"NZCV", B (N, Z, C, V)}
7455};
7456
7457#undef N
7458#undef n
7459#undef Z
7460#undef z
7461#undef C
7462#undef c
7463#undef V
7464#undef v
7465#undef B
7466\f
7467/* MD interface: bits in the object file. */
7468
7469/* Turn an integer of n bytes (in val) into a stream of bytes appropriate
7470 for use in the a.out file, and stores them in the array pointed to by buf.
7471 This knows about the endian-ness of the target machine and does
7472 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
7473 2 (short) and 4 (long) Floating numbers are put out as a series of
7474 LITTLENUMS (shorts, here at least). */
7475
7476void
7477md_number_to_chars (char *buf, valueT val, int n)
7478{
7479 if (target_big_endian)
7480 number_to_chars_bigendian (buf, val, n);
7481 else
7482 number_to_chars_littleendian (buf, val, n);
7483}
7484
7485/* MD interface: Sections. */
7486
7487/* Estimate the size of a frag before relaxing. Assume everything fits in
7488 4 bytes. */
7489
7490int
7491md_estimate_size_before_relax (fragS * fragp, segT segtype ATTRIBUTE_UNUSED)
7492{
7493 fragp->fr_var = 4;
7494 return 4;
7495}
7496
7497/* Round up a section size to the appropriate boundary. */
7498
7499valueT
7500md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
7501{
7502 return size;
7503}
7504
7505/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
f803aa8e
DPT
7506 of an rs_align_code fragment.
7507
7508 Here we fill the frag with the appropriate info for padding the
7509 output stream. The resulting frag will consist of a fixed (fr_fix)
7510 and of a repeating (fr_var) part.
7511
7512 The fixed content is always emitted before the repeating content and
7513 these two parts are used as follows in constructing the output:
7514 - the fixed part will be used to align to a valid instruction word
7515 boundary, in case that we start at a misaligned address; as no
7516 executable instruction can live at the misaligned location, we
7517 simply fill with zeros;
7518 - the variable part will be used to cover the remaining padding and
7519 we fill using the AArch64 NOP instruction.
7520
7521 Note that the size of a RS_ALIGN_CODE fragment is always 7 to provide
7522 enough storage space for up to 3 bytes for padding the back to a valid
7523 instruction alignment and exactly 4 bytes to store the NOP pattern. */
a06ea964
NC
7524
7525void
7526aarch64_handle_align (fragS * fragP)
7527{
7528 /* NOP = d503201f */
7529 /* AArch64 instructions are always little-endian. */
d9235011 7530 static unsigned char const aarch64_noop[4] = { 0x1f, 0x20, 0x03, 0xd5 };
a06ea964
NC
7531
7532 int bytes, fix, noop_size;
7533 char *p;
a06ea964
NC
7534
7535 if (fragP->fr_type != rs_align_code)
7536 return;
7537
7538 bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
7539 p = fragP->fr_literal + fragP->fr_fix;
a06ea964
NC
7540
7541#ifdef OBJ_ELF
7542 gas_assert (fragP->tc_frag_data.recorded);
7543#endif
7544
a06ea964 7545 noop_size = sizeof (aarch64_noop);
a06ea964 7546
f803aa8e
DPT
7547 fix = bytes & (noop_size - 1);
7548 if (fix)
a06ea964 7549 {
a06ea964 7550#ifdef OBJ_ELF
3979cf50 7551 insert_data_mapping_symbol (MAP_CUR_INSN, fragP->fr_fix, fragP, fix);
a06ea964
NC
7552#endif
7553 memset (p, 0, fix);
7554 p += fix;
f803aa8e 7555 fragP->fr_fix += fix;
a06ea964
NC
7556 }
7557
f803aa8e
DPT
7558 if (noop_size)
7559 memcpy (p, aarch64_noop, noop_size);
7560 fragP->fr_var = noop_size;
a06ea964
NC
7561}
7562
7563/* Perform target specific initialisation of a frag.
7564 Note - despite the name this initialisation is not done when the frag
7565 is created, but only when its type is assigned. A frag can be created
7566 and used a long time before its type is set, so beware of assuming that
33eaf5de 7567 this initialisation is performed first. */
a06ea964
NC
7568
7569#ifndef OBJ_ELF
7570void
7571aarch64_init_frag (fragS * fragP ATTRIBUTE_UNUSED,
7572 int max_chars ATTRIBUTE_UNUSED)
7573{
7574}
7575
7576#else /* OBJ_ELF is defined. */
7577void
7578aarch64_init_frag (fragS * fragP, int max_chars)
7579{
7580 /* Record a mapping symbol for alignment frags. We will delete this
7581 later if the alignment ends up empty. */
7582 if (!fragP->tc_frag_data.recorded)
c7ad08e6
RL
7583 fragP->tc_frag_data.recorded = 1;
7584
e8d84ca1
NC
7585 /* PR 21809: Do not set a mapping state for debug sections
7586 - it just confuses other tools. */
fd361982 7587 if (bfd_section_flags (now_seg) & SEC_DEBUGGING)
e8d84ca1
NC
7588 return;
7589
c7ad08e6 7590 switch (fragP->fr_type)
a06ea964 7591 {
c7ad08e6
RL
7592 case rs_align_test:
7593 case rs_fill:
7594 mapping_state_2 (MAP_DATA, max_chars);
7595 break;
7ea12e5c
NC
7596 case rs_align:
7597 /* PR 20364: We can get alignment frags in code sections,
7598 so do not just assume that we should use the MAP_DATA state. */
3979cf50 7599 mapping_state_2 (subseg_text_p (now_seg) ? MAP_CUR_INSN : MAP_DATA, max_chars);
7ea12e5c 7600 break;
c7ad08e6 7601 case rs_align_code:
3979cf50 7602 mapping_state_2 (MAP_CUR_INSN, max_chars);
c7ad08e6
RL
7603 break;
7604 default:
7605 break;
a06ea964
NC
7606 }
7607}
7608\f
7609/* Initialize the DWARF-2 unwind information for this procedure. */
7610
7611void
7612tc_aarch64_frame_initial_instructions (void)
7613{
7614 cfi_add_CFA_def_cfa (REG_SP, 0);
7615}
7616#endif /* OBJ_ELF */
7617
7618/* Convert REGNAME to a DWARF-2 register number. */
7619
7620int
7621tc_aarch64_regname_to_dw2regnum (char *regname)
7622{
7623 const reg_entry *reg = parse_reg (&regname);
7624 if (reg == NULL)
7625 return -1;
7626
7627 switch (reg->type)
7628 {
7629 case REG_TYPE_SP_32:
7630 case REG_TYPE_SP_64:
7631 case REG_TYPE_R_32:
7632 case REG_TYPE_R_64:
a2cac51c
RH
7633 return reg->number;
7634
a06ea964
NC
7635 case REG_TYPE_FP_B:
7636 case REG_TYPE_FP_H:
7637 case REG_TYPE_FP_S:
7638 case REG_TYPE_FP_D:
7639 case REG_TYPE_FP_Q:
a2cac51c
RH
7640 return reg->number + 64;
7641
a06ea964
NC
7642 default:
7643 break;
7644 }
7645 return -1;
7646}
7647
cec5225b
YZ
7648/* Implement DWARF2_ADDR_SIZE. */
7649
7650int
7651aarch64_dwarf2_addr_size (void)
7652{
7653#if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
7654 if (ilp32_p)
7655 return 4;
7656#endif
7657 return bfd_arch_bits_per_address (stdoutput) / 8;
7658}
7659
a06ea964
NC
7660/* MD interface: Symbol and relocation handling. */
7661
7662/* Return the address within the segment that a PC-relative fixup is
7663 relative to. For AArch64 PC-relative fixups applied to instructions
7664 are generally relative to the location plus AARCH64_PCREL_OFFSET bytes. */
7665
7666long
7667md_pcrel_from_section (fixS * fixP, segT seg)
7668{
7669 offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
7670
7671 /* If this is pc-relative and we are going to emit a relocation
7672 then we just want to put out any pipeline compensation that the linker
7673 will need. Otherwise we want to use the calculated base. */
7674 if (fixP->fx_pcrel
7675 && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
7676 || aarch64_force_relocation (fixP)))
7677 base = 0;
7678
7679 /* AArch64 should be consistent for all pc-relative relocations. */
7680 return base + AARCH64_PCREL_OFFSET;
7681}
7682
7683/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
7684 Otherwise we have no need to default values of symbols. */
7685
7686symbolS *
7687md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
7688{
7689#ifdef OBJ_ELF
7690 if (name[0] == '_' && name[1] == 'G'
7691 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
7692 {
7693 if (!GOT_symbol)
7694 {
7695 if (symbol_find (name))
7696 as_bad (_("GOT already in the symbol table"));
7697
7698 GOT_symbol = symbol_new (name, undefined_section,
e01e1cee 7699 &zero_address_frag, 0);
a06ea964
NC
7700 }
7701
7702 return GOT_symbol;
7703 }
7704#endif
7705
7706 return 0;
7707}
7708
7709/* Return non-zero if the indicated VALUE has overflowed the maximum
7710 range expressible by a unsigned number with the indicated number of
7711 BITS. */
7712
7713static bfd_boolean
7714unsigned_overflow (valueT value, unsigned bits)
7715{
7716 valueT lim;
7717 if (bits >= sizeof (valueT) * 8)
7718 return FALSE;
7719 lim = (valueT) 1 << bits;
7720 return (value >= lim);
7721}
7722
7723
7724/* Return non-zero if the indicated VALUE has overflowed the maximum
7725 range expressible by an signed number with the indicated number of
7726 BITS. */
7727
7728static bfd_boolean
7729signed_overflow (offsetT value, unsigned bits)
7730{
7731 offsetT lim;
7732 if (bits >= sizeof (offsetT) * 8)
7733 return FALSE;
7734 lim = (offsetT) 1 << (bits - 1);
7735 return (value < -lim || value >= lim);
7736}
7737
7738/* Given an instruction in *INST, which is expected to be a scaled, 12-bit,
7739 unsigned immediate offset load/store instruction, try to encode it as
7740 an unscaled, 9-bit, signed immediate offset load/store instruction.
7741 Return TRUE if it is successful; otherwise return FALSE.
7742
7743 As a programmer-friendly assembler, LDUR/STUR instructions can be generated
7744 in response to the standard LDR/STR mnemonics when the immediate offset is
7745 unambiguous, i.e. when it is negative or unaligned. */
7746
7747static bfd_boolean
7748try_to_encode_as_unscaled_ldst (aarch64_inst *instr)
7749{
7750 int idx;
7751 enum aarch64_op new_op;
7752 const aarch64_opcode *new_opcode;
7753
7754 gas_assert (instr->opcode->iclass == ldst_pos);
7755
7756 switch (instr->opcode->op)
7757 {
7758 case OP_LDRB_POS:new_op = OP_LDURB; break;
7759 case OP_STRB_POS: new_op = OP_STURB; break;
7760 case OP_LDRSB_POS: new_op = OP_LDURSB; break;
7761 case OP_LDRH_POS: new_op = OP_LDURH; break;
7762 case OP_STRH_POS: new_op = OP_STURH; break;
7763 case OP_LDRSH_POS: new_op = OP_LDURSH; break;
7764 case OP_LDR_POS: new_op = OP_LDUR; break;
7765 case OP_STR_POS: new_op = OP_STUR; break;
7766 case OP_LDRF_POS: new_op = OP_LDURV; break;
7767 case OP_STRF_POS: new_op = OP_STURV; break;
7768 case OP_LDRSW_POS: new_op = OP_LDURSW; break;
7769 case OP_PRFM_POS: new_op = OP_PRFUM; break;
7770 default: new_op = OP_NIL; break;
7771 }
7772
7773 if (new_op == OP_NIL)
7774 return FALSE;
7775
7776 new_opcode = aarch64_get_opcode (new_op);
7777 gas_assert (new_opcode != NULL);
7778
7779 DEBUG_TRACE ("Check programmer-friendly STURB/LDURB -> STRB/LDRB: %d == %d",
7780 instr->opcode->op, new_opcode->op);
7781
7782 aarch64_replace_opcode (instr, new_opcode);
7783
7784 /* Clear up the ADDR_SIMM9's qualifier; otherwise the
7785 qualifier matching may fail because the out-of-date qualifier will
7786 prevent the operand being updated with a new and correct qualifier. */
7787 idx = aarch64_operand_index (instr->opcode->operands,
7788 AARCH64_OPND_ADDR_SIMM9);
7789 gas_assert (idx == 1);
7790 instr->operands[idx].qualifier = AARCH64_OPND_QLF_NIL;
7791
7792 DEBUG_TRACE ("Found LDURB entry to encode programmer-friendly LDRB");
7793
3979cf50
SP
7794 if (!aarch64_opcode_encode (cpu_variant, instr->opcode, instr, &instr->value,
7795 NULL, NULL, insn_sequence))
a06ea964
NC
7796 return FALSE;
7797
7798 return TRUE;
7799}
7800
7801/* Called by fix_insn to fix a MOV immediate alias instruction.
7802
7803 Operand for a generic move immediate instruction, which is an alias
7804 instruction that generates a single MOVZ, MOVN or ORR instruction to loads
7805 a 32-bit/64-bit immediate value into general register. An assembler error
7806 shall result if the immediate cannot be created by a single one of these
7807 instructions. If there is a choice, then to ensure reversability an
7808 assembler must prefer a MOVZ to MOVN, and MOVZ or MOVN to ORR. */
7809
7810static void
7811fix_mov_imm_insn (fixS *fixP, char *buf, aarch64_inst *instr, offsetT value)
7812{
7813 const aarch64_opcode *opcode;
7814
7815 /* Need to check if the destination is SP/ZR. The check has to be done
7816 before any aarch64_replace_opcode. */
7817 int try_mov_wide_p = !aarch64_stack_pointer_p (&instr->operands[0]);
7818 int try_mov_bitmask_p = !aarch64_zero_register_p (&instr->operands[0]);
7819
7820 instr->operands[1].imm.value = value;
7821 instr->operands[1].skip = 0;
7822
7823 if (try_mov_wide_p)
7824 {
7825 /* Try the MOVZ alias. */
7826 opcode = aarch64_get_opcode (OP_MOV_IMM_WIDE);
7827 aarch64_replace_opcode (instr, opcode);
3979cf50 7828 if (aarch64_opcode_encode (cpu_variant, instr->opcode, instr,
7e84b55d 7829 &instr->value, NULL, NULL, insn_sequence))
a06ea964
NC
7830 {
7831 put_aarch64_insn (buf, instr->value);
7832 return;
7833 }
7834 /* Try the MOVK alias. */
7835 opcode = aarch64_get_opcode (OP_MOV_IMM_WIDEN);
7836 aarch64_replace_opcode (instr, opcode);
3979cf50 7837 if (aarch64_opcode_encode (cpu_variant, instr->opcode, instr,
7e84b55d 7838 &instr->value, NULL, NULL, insn_sequence))
a06ea964
NC
7839 {
7840 put_aarch64_insn (buf, instr->value);
7841 return;
7842 }
7843 }
7844
7845 if (try_mov_bitmask_p)
7846 {
7847 /* Try the ORR alias. */
7848 opcode = aarch64_get_opcode (OP_MOV_IMM_LOG);
7849 aarch64_replace_opcode (instr, opcode);
3979cf50 7850 if (aarch64_opcode_encode (cpu_variant, instr->opcode, instr,
7e84b55d 7851 &instr->value, NULL, NULL, insn_sequence))
a06ea964
NC
7852 {
7853 put_aarch64_insn (buf, instr->value);
7854 return;
7855 }
7856 }
7857
7858 as_bad_where (fixP->fx_file, fixP->fx_line,
7859 _("immediate cannot be moved by a single instruction"));
7860}
7861
7862/* An instruction operand which is immediate related may have symbol used
7863 in the assembly, e.g.
7864
7865 mov w0, u32
7866 .set u32, 0x00ffff00
7867
7868 At the time when the assembly instruction is parsed, a referenced symbol,
7869 like 'u32' in the above example may not have been seen; a fixS is created
7870 in such a case and is handled here after symbols have been resolved.
7871 Instruction is fixed up with VALUE using the information in *FIXP plus
7872 extra information in FLAGS.
7873
7874 This function is called by md_apply_fix to fix up instructions that need
7875 a fix-up described above but does not involve any linker-time relocation. */
7876
7877static void
7878fix_insn (fixS *fixP, uint32_t flags, offsetT value)
7879{
7880 int idx;
7881 uint32_t insn;
7882 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
7883 enum aarch64_opnd opnd = fixP->tc_fix_data.opnd;
7884 aarch64_inst *new_inst = fixP->tc_fix_data.inst;
7885
7886 if (new_inst)
7887 {
7888 /* Now the instruction is about to be fixed-up, so the operand that
7889 was previously marked as 'ignored' needs to be unmarked in order
7890 to get the encoding done properly. */
7891 idx = aarch64_operand_index (new_inst->opcode->operands, opnd);
7892 new_inst->operands[idx].skip = 0;
7893 }
7894
7895 gas_assert (opnd != AARCH64_OPND_NIL);
7896
7897 switch (opnd)
7898 {
7899 case AARCH64_OPND_EXCEPTION:
09c1e68a 7900 case AARCH64_OPND_UNDEFINED:
a06ea964
NC
7901 if (unsigned_overflow (value, 16))
7902 as_bad_where (fixP->fx_file, fixP->fx_line,
7903 _("immediate out of range"));
7904 insn = get_aarch64_insn (buf);
09c1e68a 7905 insn |= (opnd == AARCH64_OPND_EXCEPTION) ? encode_svc_imm (value) : value;
a06ea964
NC
7906 put_aarch64_insn (buf, insn);
7907 break;
7908
7909 case AARCH64_OPND_AIMM:
7910 /* ADD or SUB with immediate.
7911 NOTE this assumes we come here with a add/sub shifted reg encoding
7912 3 322|2222|2 2 2 21111 111111
7913 1 098|7654|3 2 1 09876 543210 98765 43210
7914 0b000000 sf 000|1011|shift 0 Rm imm6 Rn Rd ADD
7915 2b000000 sf 010|1011|shift 0 Rm imm6 Rn Rd ADDS
7916 4b000000 sf 100|1011|shift 0 Rm imm6 Rn Rd SUB
7917 6b000000 sf 110|1011|shift 0 Rm imm6 Rn Rd SUBS
7918 ->
7919 3 322|2222|2 2 221111111111
7920 1 098|7654|3 2 109876543210 98765 43210
7921 11000000 sf 001|0001|shift imm12 Rn Rd ADD
7922 31000000 sf 011|0001|shift imm12 Rn Rd ADDS
7923 51000000 sf 101|0001|shift imm12 Rn Rd SUB
7924 71000000 sf 111|0001|shift imm12 Rn Rd SUBS
7925 Fields sf Rn Rd are already set. */
7926 insn = get_aarch64_insn (buf);
7927 if (value < 0)
7928 {
7929 /* Add <-> sub. */
7930 insn = reencode_addsub_switch_add_sub (insn);
7931 value = -value;
7932 }
7933
7934 if ((flags & FIXUP_F_HAS_EXPLICIT_SHIFT) == 0
7935 && unsigned_overflow (value, 12))
7936 {
7937 /* Try to shift the value by 12 to make it fit. */
7938 if (((value >> 12) << 12) == value
7939 && ! unsigned_overflow (value, 12 + 12))
7940 {
7941 value >>= 12;
7942 insn |= encode_addsub_imm_shift_amount (1);
7943 }
7944 }
7945
7946 if (unsigned_overflow (value, 12))
7947 as_bad_where (fixP->fx_file, fixP->fx_line,
7948 _("immediate out of range"));
7949
7950 insn |= encode_addsub_imm (value);
7951
7952 put_aarch64_insn (buf, insn);
7953 break;
7954
7955 case AARCH64_OPND_SIMD_IMM:
7956 case AARCH64_OPND_SIMD_IMM_SFT:
7957 case AARCH64_OPND_LIMM:
7958 /* Bit mask immediate. */
7959 gas_assert (new_inst != NULL);
7960 idx = aarch64_operand_index (new_inst->opcode->operands, opnd);
7961 new_inst->operands[idx].imm.value = value;
3979cf50 7962 if (aarch64_opcode_encode (cpu_variant, new_inst->opcode, new_inst,
7e84b55d 7963 &new_inst->value, NULL, NULL, insn_sequence))
a06ea964
NC
7964 put_aarch64_insn (buf, new_inst->value);
7965 else
7966 as_bad_where (fixP->fx_file, fixP->fx_line,
7967 _("invalid immediate"));
7968 break;
7969
7970 case AARCH64_OPND_HALF:
7971 /* 16-bit unsigned immediate. */
7972 if (unsigned_overflow (value, 16))
7973 as_bad_where (fixP->fx_file, fixP->fx_line,
7974 _("immediate out of range"));
7975 insn = get_aarch64_insn (buf);
7976 insn |= encode_movw_imm (value & 0xffff);
7977 put_aarch64_insn (buf, insn);
7978 break;
7979
7980 case AARCH64_OPND_IMM_MOV:
7981 /* Operand for a generic move immediate instruction, which is
7982 an alias instruction that generates a single MOVZ, MOVN or ORR
7983 instruction to loads a 32-bit/64-bit immediate value into general
7984 register. An assembler error shall result if the immediate cannot be
7985 created by a single one of these instructions. If there is a choice,
7986 then to ensure reversability an assembler must prefer a MOVZ to MOVN,
7987 and MOVZ or MOVN to ORR. */
7988 gas_assert (new_inst != NULL);
7989 fix_mov_imm_insn (fixP, buf, new_inst, value);
7990 break;
7991
7992 case AARCH64_OPND_ADDR_SIMM7:
7993 case AARCH64_OPND_ADDR_SIMM9:
7994 case AARCH64_OPND_ADDR_SIMM9_2:
3f06e550 7995 case AARCH64_OPND_ADDR_SIMM10:
a06ea964 7996 case AARCH64_OPND_ADDR_UIMM12:
fb3265b3
SD
7997 case AARCH64_OPND_ADDR_SIMM11:
7998 case AARCH64_OPND_ADDR_SIMM13:
a06ea964
NC
7999 /* Immediate offset in an address. */
8000 insn = get_aarch64_insn (buf);
8001
8002 gas_assert (new_inst != NULL && new_inst->value == insn);
8003 gas_assert (new_inst->opcode->operands[1] == opnd
8004 || new_inst->opcode->operands[2] == opnd);
8005
8006 /* Get the index of the address operand. */
8007 if (new_inst->opcode->operands[1] == opnd)
8008 /* e.g. STR <Xt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}]. */
8009 idx = 1;
8010 else
8011 /* e.g. LDP <Qt1>, <Qt2>, [<Xn|SP>{, #<imm>}]. */
8012 idx = 2;
8013
8014 /* Update the resolved offset value. */
8015 new_inst->operands[idx].addr.offset.imm = value;
8016
8017 /* Encode/fix-up. */
3979cf50 8018 if (aarch64_opcode_encode (cpu_variant, new_inst->opcode, new_inst,
7e84b55d 8019 &new_inst->value, NULL, NULL, insn_sequence))
a06ea964
NC
8020 {
8021 put_aarch64_insn (buf, new_inst->value);
8022 break;
8023 }
8024 else if (new_inst->opcode->iclass == ldst_pos
8025 && try_to_encode_as_unscaled_ldst (new_inst))
8026 {
8027 put_aarch64_insn (buf, new_inst->value);
8028 break;
8029 }
8030
8031 as_bad_where (fixP->fx_file, fixP->fx_line,
8032 _("immediate offset out of range"));
8033 break;
8034
8035 default:
8036 gas_assert (0);
8037 as_fatal (_("unhandled operand code %d"), opnd);
8038 }
8039}
8040
8041/* Apply a fixup (fixP) to segment data, once it has been determined
8042 by our caller that we have all the info we need to fix it up.
8043
8044 Parameter valP is the pointer to the value of the bits. */
8045
8046void
8047md_apply_fix (fixS * fixP, valueT * valP, segT seg)
8048{
8049 offsetT value = *valP;
8050 uint32_t insn;
8051 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
8052 int scale;
8053 unsigned flags = fixP->fx_addnumber;
8054
8055 DEBUG_TRACE ("\n\n");
8056 DEBUG_TRACE ("~~~~~~~~~~~~~~~~~~~~~~~~~");
8057 DEBUG_TRACE ("Enter md_apply_fix");
8058
8059 gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
8060
8061 /* Note whether this will delete the relocation. */
8062
8063 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
8064 fixP->fx_done = 1;
8065
8066 /* Process the relocations. */
8067 switch (fixP->fx_r_type)
8068 {
8069 case BFD_RELOC_NONE:
8070 /* This will need to go in the object file. */
8071 fixP->fx_done = 0;
8072 break;
8073
8074 case BFD_RELOC_8:
8075 case BFD_RELOC_8_PCREL:
8076 if (fixP->fx_done || !seg->use_rela_p)
8077 md_number_to_chars (buf, value, 1);
8078 break;
8079
8080 case BFD_RELOC_16:
8081 case BFD_RELOC_16_PCREL:
8082 if (fixP->fx_done || !seg->use_rela_p)
8083 md_number_to_chars (buf, value, 2);
8084 break;
8085
8086 case BFD_RELOC_32:
8087 case BFD_RELOC_32_PCREL:
8088 if (fixP->fx_done || !seg->use_rela_p)
8089 md_number_to_chars (buf, value, 4);
8090 break;
8091
8092 case BFD_RELOC_64:
8093 case BFD_RELOC_64_PCREL:
8094 if (fixP->fx_done || !seg->use_rela_p)
8095 md_number_to_chars (buf, value, 8);
8096 break;
8097
8098 case BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP:
8099 /* We claim that these fixups have been processed here, even if
8100 in fact we generate an error because we do not have a reloc
8101 for them, so tc_gen_reloc() will reject them. */
8102 fixP->fx_done = 1;
8103 if (fixP->fx_addsy && !S_IS_DEFINED (fixP->fx_addsy))
8104 {
8105 as_bad_where (fixP->fx_file, fixP->fx_line,
8106 _("undefined symbol %s used as an immediate value"),
8107 S_GET_NAME (fixP->fx_addsy));
8108 goto apply_fix_return;
8109 }
8110 fix_insn (fixP, flags, value);
8111 break;
8112
8113 case BFD_RELOC_AARCH64_LD_LO19_PCREL:
a06ea964
NC
8114 if (fixP->fx_done || !seg->use_rela_p)
8115 {
89d2a2a3
MS
8116 if (value & 3)
8117 as_bad_where (fixP->fx_file, fixP->fx_line,
8118 _("pc-relative load offset not word aligned"));
8119 if (signed_overflow (value, 21))
8120 as_bad_where (fixP->fx_file, fixP->fx_line,
8121 _("pc-relative load offset out of range"));
a06ea964
NC
8122 insn = get_aarch64_insn (buf);
8123 insn |= encode_ld_lit_ofs_19 (value >> 2);
8124 put_aarch64_insn (buf, insn);
8125 }
8126 break;
8127
8128 case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
a06ea964
NC
8129 if (fixP->fx_done || !seg->use_rela_p)
8130 {
89d2a2a3
MS
8131 if (signed_overflow (value, 21))
8132 as_bad_where (fixP->fx_file, fixP->fx_line,
8133 _("pc-relative address offset out of range"));
a06ea964
NC
8134 insn = get_aarch64_insn (buf);
8135 insn |= encode_adr_imm (value);
8136 put_aarch64_insn (buf, insn);
8137 }
8138 break;
8139
8140 case BFD_RELOC_AARCH64_BRANCH19:
a06ea964
NC
8141 if (fixP->fx_done || !seg->use_rela_p)
8142 {
89d2a2a3
MS
8143 if (value & 3)
8144 as_bad_where (fixP->fx_file, fixP->fx_line,
8145 _("conditional branch target not word aligned"));
8146 if (signed_overflow (value, 21))
8147 as_bad_where (fixP->fx_file, fixP->fx_line,
8148 _("conditional branch out of range"));
a06ea964
NC
8149 insn = get_aarch64_insn (buf);
8150 insn |= encode_cond_branch_ofs_19 (value >> 2);
8151 put_aarch64_insn (buf, insn);
8152 }
8153 break;
8154
8155 case BFD_RELOC_AARCH64_TSTBR14:
a06ea964
NC
8156 if (fixP->fx_done || !seg->use_rela_p)
8157 {
89d2a2a3
MS
8158 if (value & 3)
8159 as_bad_where (fixP->fx_file, fixP->fx_line,
8160 _("conditional branch target not word aligned"));
8161 if (signed_overflow (value, 16))
8162 as_bad_where (fixP->fx_file, fixP->fx_line,
8163 _("conditional branch out of range"));
a06ea964
NC
8164 insn = get_aarch64_insn (buf);
8165 insn |= encode_tst_branch_ofs_14 (value >> 2);
8166 put_aarch64_insn (buf, insn);
8167 }
8168 break;
8169
a06ea964 8170 case BFD_RELOC_AARCH64_CALL26:
f09c556a 8171 case BFD_RELOC_AARCH64_JUMP26:
a06ea964
NC
8172 if (fixP->fx_done || !seg->use_rela_p)
8173 {
89d2a2a3
MS
8174 if (value & 3)
8175 as_bad_where (fixP->fx_file, fixP->fx_line,
8176 _("branch target not word aligned"));
8177 if (signed_overflow (value, 28))
8178 as_bad_where (fixP->fx_file, fixP->fx_line,
8179 _("branch out of range"));
a06ea964
NC
8180 insn = get_aarch64_insn (buf);
8181 insn |= encode_branch_ofs_26 (value >> 2);
8182 put_aarch64_insn (buf, insn);
8183 }
8184 break;
8185
8186 case BFD_RELOC_AARCH64_MOVW_G0:
a06ea964 8187 case BFD_RELOC_AARCH64_MOVW_G0_NC:
f09c556a 8188 case BFD_RELOC_AARCH64_MOVW_G0_S:
ca632371 8189 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G0_NC:
32247401
RL
8190 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
8191 case BFD_RELOC_AARCH64_MOVW_PREL_G0_NC:
a06ea964
NC
8192 scale = 0;
8193 goto movw_common;
8194 case BFD_RELOC_AARCH64_MOVW_G1:
a06ea964 8195 case BFD_RELOC_AARCH64_MOVW_G1_NC:
f09c556a 8196 case BFD_RELOC_AARCH64_MOVW_G1_S:
654248e7 8197 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
32247401
RL
8198 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
8199 case BFD_RELOC_AARCH64_MOVW_PREL_G1_NC:
a06ea964
NC
8200 scale = 16;
8201 goto movw_common;
43a357f9
RL
8202 case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
8203 scale = 0;
8204 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8205 /* Should always be exported to object file, see
8206 aarch64_force_relocation(). */
8207 gas_assert (!fixP->fx_done);
8208 gas_assert (seg->use_rela_p);
8209 goto movw_common;
8210 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
8211 scale = 16;
8212 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8213 /* Should always be exported to object file, see
8214 aarch64_force_relocation(). */
8215 gas_assert (!fixP->fx_done);
8216 gas_assert (seg->use_rela_p);
8217 goto movw_common;
a06ea964 8218 case BFD_RELOC_AARCH64_MOVW_G2:
a06ea964 8219 case BFD_RELOC_AARCH64_MOVW_G2_NC:
f09c556a 8220 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
8221 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
8222 case BFD_RELOC_AARCH64_MOVW_PREL_G2_NC:
a06ea964
NC
8223 scale = 32;
8224 goto movw_common;
8225 case BFD_RELOC_AARCH64_MOVW_G3:
32247401 8226 case BFD_RELOC_AARCH64_MOVW_PREL_G3:
a06ea964
NC
8227 scale = 48;
8228 movw_common:
8229 if (fixP->fx_done || !seg->use_rela_p)
8230 {
8231 insn = get_aarch64_insn (buf);
8232
8233 if (!fixP->fx_done)
8234 {
8235 /* REL signed addend must fit in 16 bits */
8236 if (signed_overflow (value, 16))
8237 as_bad_where (fixP->fx_file, fixP->fx_line,
8238 _("offset out of range"));
8239 }
8240 else
8241 {
8242 /* Check for overflow and scale. */
8243 switch (fixP->fx_r_type)
8244 {
8245 case BFD_RELOC_AARCH64_MOVW_G0:
8246 case BFD_RELOC_AARCH64_MOVW_G1:
8247 case BFD_RELOC_AARCH64_MOVW_G2:
8248 case BFD_RELOC_AARCH64_MOVW_G3:
654248e7 8249 case BFD_RELOC_AARCH64_MOVW_GOTOFF_G1:
43a357f9 8250 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
a06ea964
NC
8251 if (unsigned_overflow (value, scale + 16))
8252 as_bad_where (fixP->fx_file, fixP->fx_line,
8253 _("unsigned value out of range"));
8254 break;
8255 case BFD_RELOC_AARCH64_MOVW_G0_S:
8256 case BFD_RELOC_AARCH64_MOVW_G1_S:
8257 case BFD_RELOC_AARCH64_MOVW_G2_S:
32247401
RL
8258 case BFD_RELOC_AARCH64_MOVW_PREL_G0:
8259 case BFD_RELOC_AARCH64_MOVW_PREL_G1:
8260 case BFD_RELOC_AARCH64_MOVW_PREL_G2:
a06ea964
NC
8261 /* NOTE: We can only come here with movz or movn. */
8262 if (signed_overflow (value, scale + 16))
8263 as_bad_where (fixP->fx_file, fixP->fx_line,
8264 _("signed value out of range"));
8265 if (value < 0)
8266 {
8267 /* Force use of MOVN. */
8268 value = ~value;
8269 insn = reencode_movzn_to_movn (insn);
8270 }
8271 else
8272 {
8273 /* Force use of MOVZ. */
8274 insn = reencode_movzn_to_movz (insn);
8275 }
8276 break;
8277 default:
8278 /* Unchecked relocations. */
8279 break;
8280 }
8281 value >>= scale;
8282 }
8283
8284 /* Insert value into MOVN/MOVZ/MOVK instruction. */
8285 insn |= encode_movw_imm (value & 0xffff);
8286
8287 put_aarch64_insn (buf, insn);
8288 }
8289 break;
8290
a6bb11b2
YZ
8291 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC:
8292 fixP->fx_r_type = (ilp32_p
8293 ? BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC
8294 : BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC);
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 break;
8301
8302 case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC:
8303 fixP->fx_r_type = (ilp32_p
8304 ? BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC
f955cccf 8305 : BFD_RELOC_AARCH64_TLSDESC_LD64_LO12);
a6bb11b2
YZ
8306 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8307 /* Should always be exported to object file, see
8308 aarch64_force_relocation(). */
8309 gas_assert (!fixP->fx_done);
8310 gas_assert (seg->use_rela_p);
8311 break;
8312
f955cccf 8313 case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
2c0a3565 8314 case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
389b8029 8315 case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
2c0a3565 8316 case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
f955cccf 8317 case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
1ada945d 8318 case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
a06ea964 8319 case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
2c0a3565 8320 case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
3c12b054 8321 case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
3e8286c0 8322 case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
1aa66fb1 8323 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
a06ea964 8324 case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
a6bb11b2 8325 case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
2c0a3565 8326 case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
043bf05a 8327 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
3b957e5b
RL
8328 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
8329 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
49df5539 8330 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12:
70151fb5 8331 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12:
13289c10 8332 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC:
a12fad50 8333 case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
1107e076 8334 case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6c37fedc 8335 case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
4c562523
JW
8336 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12:
8337 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
8338 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12:
8339 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
8340 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12:
8341 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
8342 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
8343 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
49df5539
JW
8344 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
8345 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
8346 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
8347 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
8348 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
84f1b9fb
RL
8349 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
8350 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
8351 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
8352 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
8353 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
8354 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
8355 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
8356 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
a06ea964 8357 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
2c0a3565 8358 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
a06ea964 8359 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
a06ea964
NC
8360 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
8361 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
2c0a3565
MS
8362 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
8363 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
8364 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
a06ea964
NC
8365 S_SET_THREAD_LOCAL (fixP->fx_addsy);
8366 /* Should always be exported to object file, see
8367 aarch64_force_relocation(). */
8368 gas_assert (!fixP->fx_done);
8369 gas_assert (seg->use_rela_p);
8370 break;
8371
a6bb11b2
YZ
8372 case BFD_RELOC_AARCH64_LD_GOT_LO12_NC:
8373 /* Should always be exported to object file, see
8374 aarch64_force_relocation(). */
8375 fixP->fx_r_type = (ilp32_p
8376 ? BFD_RELOC_AARCH64_LD32_GOT_LO12_NC
8377 : BFD_RELOC_AARCH64_LD64_GOT_LO12_NC);
8378 gas_assert (!fixP->fx_done);
8379 gas_assert (seg->use_rela_p);
8380 break;
8381
a06ea964 8382 case BFD_RELOC_AARCH64_ADD_LO12:
f09c556a
JW
8383 case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
8384 case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
8385 case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
8386 case BFD_RELOC_AARCH64_GOT_LD_PREL19:
8387 case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
3d715ce4 8388 case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
87f5fbcc 8389 case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
a921b5bd 8390 case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
f09c556a
JW
8391 case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
8392 case BFD_RELOC_AARCH64_LDST128_LO12:
a06ea964
NC
8393 case BFD_RELOC_AARCH64_LDST16_LO12:
8394 case BFD_RELOC_AARCH64_LDST32_LO12:
8395 case BFD_RELOC_AARCH64_LDST64_LO12:
f09c556a 8396 case BFD_RELOC_AARCH64_LDST8_LO12:
a06ea964
NC
8397 /* Should always be exported to object file, see
8398 aarch64_force_relocation(). */
8399 gas_assert (!fixP->fx_done);
8400 gas_assert (seg->use_rela_p);
8401 break;
8402
8403 case BFD_RELOC_AARCH64_TLSDESC_ADD:
a06ea964 8404 case BFD_RELOC_AARCH64_TLSDESC_CALL:
f09c556a 8405 case BFD_RELOC_AARCH64_TLSDESC_LDR:
a06ea964
NC
8406 break;
8407
b97e87cc
NC
8408 case BFD_RELOC_UNUSED:
8409 /* An error will already have been reported. */
8410 break;
8411
a06ea964
NC
8412 default:
8413 as_bad_where (fixP->fx_file, fixP->fx_line,
8414 _("unexpected %s fixup"),
8415 bfd_get_reloc_code_name (fixP->fx_r_type));
8416 break;
8417 }
8418
dc1e8a47 8419 apply_fix_return:
a06ea964
NC
8420 /* Free the allocated the struct aarch64_inst.
8421 N.B. currently there are very limited number of fix-up types actually use
8422 this field, so the impact on the performance should be minimal . */
9fbb53c7 8423 free (fixP->tc_fix_data.inst);
a06ea964
NC
8424
8425 return;
8426}
8427
8428/* Translate internal representation of relocation info to BFD target
8429 format. */
8430
8431arelent *
8432tc_gen_reloc (asection * section, fixS * fixp)
8433{
8434 arelent *reloc;
8435 bfd_reloc_code_real_type code;
8436
325801bd 8437 reloc = XNEW (arelent);
a06ea964 8438
325801bd 8439 reloc->sym_ptr_ptr = XNEW (asymbol *);
a06ea964
NC
8440 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
8441 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
8442
8443 if (fixp->fx_pcrel)
8444 {
8445 if (section->use_rela_p)
8446 fixp->fx_offset -= md_pcrel_from_section (fixp, section);
8447 else
8448 fixp->fx_offset = reloc->address;
8449 }
8450 reloc->addend = fixp->fx_offset;
8451
8452 code = fixp->fx_r_type;
8453 switch (code)
8454 {
8455 case BFD_RELOC_16:
8456 if (fixp->fx_pcrel)
8457 code = BFD_RELOC_16_PCREL;
8458 break;
8459
8460 case BFD_RELOC_32:
8461 if (fixp->fx_pcrel)
8462 code = BFD_RELOC_32_PCREL;
8463 break;
8464
8465 case BFD_RELOC_64:
8466 if (fixp->fx_pcrel)
8467 code = BFD_RELOC_64_PCREL;
8468 break;
8469
8470 default:
8471 break;
8472 }
8473
8474 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
8475 if (reloc->howto == NULL)
8476 {
8477 as_bad_where (fixp->fx_file, fixp->fx_line,
8478 _
8479 ("cannot represent %s relocation in this object file format"),
8480 bfd_get_reloc_code_name (code));
8481 return NULL;
8482 }
8483
8484 return reloc;
8485}
8486
8487/* This fix_new is called by cons via TC_CONS_FIX_NEW. */
8488
8489void
8490cons_fix_new_aarch64 (fragS * frag, int where, int size, expressionS * exp)
8491{
8492 bfd_reloc_code_real_type type;
8493 int pcrel = 0;
8494
8495 /* Pick a reloc.
8496 FIXME: @@ Should look at CPU word size. */
8497 switch (size)
8498 {
8499 case 1:
8500 type = BFD_RELOC_8;
8501 break;
8502 case 2:
8503 type = BFD_RELOC_16;
8504 break;
8505 case 4:
8506 type = BFD_RELOC_32;
8507 break;
8508 case 8:
8509 type = BFD_RELOC_64;
8510 break;
8511 default:
8512 as_bad (_("cannot do %u-byte relocation"), size);
8513 type = BFD_RELOC_UNUSED;
8514 break;
8515 }
8516
8517 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
8518}
8519
8520int
8521aarch64_force_relocation (struct fix *fixp)
8522{
8523 switch (fixp->fx_r_type)
8524 {
8525 case BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP:
8526 /* Perform these "immediate" internal relocations
8527 even if the symbol is extern or weak. */
8528 return 0;
8529
a6bb11b2 8530 case BFD_RELOC_AARCH64_LD_GOT_LO12_NC:
f09c556a
JW
8531 case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC:
8532 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC:
a6bb11b2
YZ
8533 /* Pseudo relocs that need to be fixed up according to
8534 ilp32_p. */
8535 return 0;
8536
2c0a3565
MS
8537 case BFD_RELOC_AARCH64_ADD_LO12:
8538 case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
8539 case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
8540 case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
8541 case BFD_RELOC_AARCH64_GOT_LD_PREL19:
8542 case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
3d715ce4 8543 case BFD_RELOC_AARCH64_LD32_GOTPAGE_LO14:
87f5fbcc 8544 case BFD_RELOC_AARCH64_LD64_GOTOFF_LO15:
a921b5bd 8545 case BFD_RELOC_AARCH64_LD64_GOTPAGE_LO15:
2c0a3565
MS
8546 case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
8547 case BFD_RELOC_AARCH64_LDST128_LO12:
8548 case BFD_RELOC_AARCH64_LDST16_LO12:
8549 case BFD_RELOC_AARCH64_LDST32_LO12:
8550 case BFD_RELOC_AARCH64_LDST64_LO12:
8551 case BFD_RELOC_AARCH64_LDST8_LO12:
f955cccf 8552 case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12:
2c0a3565 8553 case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
389b8029 8554 case BFD_RELOC_AARCH64_TLSDESC_ADR_PREL21:
2c0a3565 8555 case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
f955cccf 8556 case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12:
1ada945d 8557 case BFD_RELOC_AARCH64_TLSDESC_LD_PREL19:
43a357f9
RL
8558 case BFD_RELOC_AARCH64_TLSDESC_OFF_G0_NC:
8559 case BFD_RELOC_AARCH64_TLSDESC_OFF_G1:
a06ea964 8560 case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
2c0a3565 8561 case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
3c12b054 8562 case BFD_RELOC_AARCH64_TLSGD_ADR_PREL21:
3e8286c0 8563 case BFD_RELOC_AARCH64_TLSGD_MOVW_G0_NC:
1aa66fb1 8564 case BFD_RELOC_AARCH64_TLSGD_MOVW_G1:
a06ea964 8565 case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
a6bb11b2 8566 case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
2c0a3565 8567 case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
043bf05a 8568 case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_PREL19:
3b957e5b
RL
8569 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC:
8570 case BFD_RELOC_AARCH64_TLSIE_MOVW_GOTTPREL_G1:
8571 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_HI12:
70151fb5 8572 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12:
13289c10 8573 case BFD_RELOC_AARCH64_TLSLD_ADD_DTPREL_LO12_NC:
a12fad50 8574 case BFD_RELOC_AARCH64_TLSLD_ADD_LO12_NC:
1107e076 8575 case BFD_RELOC_AARCH64_TLSLD_ADR_PAGE21:
6c37fedc 8576 case BFD_RELOC_AARCH64_TLSLD_ADR_PREL21:
4c562523
JW
8577 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12:
8578 case BFD_RELOC_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC:
8579 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12:
8580 case BFD_RELOC_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC:
8581 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12:
8582 case BFD_RELOC_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC:
8583 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12:
8584 case BFD_RELOC_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC:
49df5539
JW
8585 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0:
8586 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G0_NC:
8587 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1:
8588 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G1_NC:
8589 case BFD_RELOC_AARCH64_TLSLD_MOVW_DTPREL_G2:
84f1b9fb
RL
8590 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12:
8591 case BFD_RELOC_AARCH64_TLSLE_LDST16_TPREL_LO12_NC:
8592 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12:
8593 case BFD_RELOC_AARCH64_TLSLE_LDST32_TPREL_LO12_NC:
8594 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12:
8595 case BFD_RELOC_AARCH64_TLSLE_LDST64_TPREL_LO12_NC:
8596 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12:
8597 case BFD_RELOC_AARCH64_TLSLE_LDST8_TPREL_LO12_NC:
a06ea964 8598 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
2c0a3565 8599 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
a06ea964 8600 case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
a06ea964
NC
8601 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
8602 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
2c0a3565
MS
8603 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
8604 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
8605 case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
a06ea964
NC
8606 /* Always leave these relocations for the linker. */
8607 return 1;
8608
f0070c1e
SP
8609 case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
8610 case BFD_RELOC_AARCH64_BRANCH19:
8611 case BFD_RELOC_AARCH64_TSTBR14:
8612 case BFD_RELOC_AARCH64_CALL26:
8613 case BFD_RELOC_AARCH64_JUMP26:
8614 gas_assert (fixp->fx_addsy != NULL);
8615
8616 /* A jump/call destination will get adjusted to section+offset only
8617 if both caller and callee are of the same type. */
8618 if (symbol_section_p (fixp->fx_addsy))
8619 break;
8620
8621 if ((fixp->tc_fix_data.c64
8622 && !AARCH64_IS_C64 (fixp->fx_addsy))
8623 || (!fixp->tc_fix_data.c64
8624 && AARCH64_IS_C64 (fixp->fx_addsy)))
8625 return 1;
8626
8627 break;
8628
a06ea964
NC
8629 default:
8630 break;
8631 }
8632
8633 return generic_force_reloc (fixp);
8634}
8635
8636#ifdef OBJ_ELF
8637
3c0367d0
JW
8638/* Implement md_after_parse_args. This is the earliest time we need to decide
8639 ABI. If no -mabi specified, the ABI will be decided by target triplet. */
8640
8641void
8642aarch64_after_parse_args (void)
8643{
8644 if (aarch64_abi != AARCH64_ABI_NONE)
8645 return;
8646
8647 /* DEFAULT_ARCH will have ":32" extension if it's configured for ILP32. */
8648 if (strlen (default_arch) > 7 && strcmp (default_arch + 7, ":32") == 0)
8649 aarch64_abi = AARCH64_ABI_ILP32;
8650 else
8651 aarch64_abi = AARCH64_ABI_LP64;
8652}
8653
a06ea964
NC
8654const char *
8655elf64_aarch64_target_format (void)
8656{
12400dcc
AM
8657#ifdef TE_CLOUDABI
8658 /* FIXME: What to do for ilp32_p ? */
8659 if (target_big_endian)
8660 return "elf64-bigaarch64-cloudabi";
8661 else
8662 return "elf64-littleaarch64-cloudabi";
8663#else
a06ea964 8664 if (target_big_endian)
cec5225b 8665 return ilp32_p ? "elf32-bigaarch64" : "elf64-bigaarch64";
a06ea964 8666 else
cec5225b 8667 return ilp32_p ? "elf32-littleaarch64" : "elf64-littleaarch64";
12400dcc 8668#endif
a06ea964
NC
8669}
8670
8671void
8672aarch64elf_frob_symbol (symbolS * symp, int *puntp)
8673{
8674 elf_frob_symbol (symp, puntp);
8675}
8676#endif
8677
8678/* MD interface: Finalization. */
8679
8680/* A good place to do this, although this was probably not intended
8681 for this kind of use. We need to dump the literal pool before
8682 references are made to a null symbol pointer. */
8683
8684void
8685aarch64_cleanup (void)
8686{
8687 literal_pool *pool;
8688
8689 for (pool = list_of_pools; pool; pool = pool->next)
8690 {
8691 /* Put it at the end of the relevant section. */
8692 subseg_set (pool->section, pool->sub_section);
8693 s_ltorg (0);
8694 }
8695}
8696
8697#ifdef OBJ_ELF
8698/* Remove any excess mapping symbols generated for alignment frags in
8699 SEC. We may have created a mapping symbol before a zero byte
8700 alignment; remove it if there's a mapping symbol after the
8701 alignment. */
8702static void
8703check_mapping_symbols (bfd * abfd ATTRIBUTE_UNUSED, asection * sec,
8704 void *dummy ATTRIBUTE_UNUSED)
8705{
8706 segment_info_type *seginfo = seg_info (sec);
8707 fragS *fragp;
8708
8709 if (seginfo == NULL || seginfo->frchainP == NULL)
8710 return;
8711
8712 for (fragp = seginfo->frchainP->frch_root;
8713 fragp != NULL; fragp = fragp->fr_next)
8714 {
8715 symbolS *sym = fragp->tc_frag_data.last_map;
8716 fragS *next = fragp->fr_next;
8717
8718 /* Variable-sized frags have been converted to fixed size by
8719 this point. But if this was variable-sized to start with,
8720 there will be a fixed-size frag after it. So don't handle
8721 next == NULL. */
8722 if (sym == NULL || next == NULL)
8723 continue;
8724
8725 if (S_GET_VALUE (sym) < next->fr_address)
8726 /* Not at the end of this frag. */
8727 continue;
8728 know (S_GET_VALUE (sym) == next->fr_address);
8729
8730 do
8731 {
8732 if (next->tc_frag_data.first_map != NULL)
8733 {
8734 /* Next frag starts with a mapping symbol. Discard this
8735 one. */
8736 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
8737 break;
8738 }
8739
8740 if (next->fr_next == NULL)
8741 {
8742 /* This mapping symbol is at the end of the section. Discard
8743 it. */
8744 know (next->fr_fix == 0 && next->fr_var == 0);
8745 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
8746 break;
8747 }
8748
8749 /* As long as we have empty frags without any mapping symbols,
8750 keep looking. */
8751 /* If the next frag is non-empty and does not start with a
8752 mapping symbol, then this mapping symbol is required. */
8753 if (next->fr_address != next->fr_next->fr_address)
8754 break;
8755
8756 next = next->fr_next;
8757 }
8758 while (next != NULL);
8759 }
8760}
8761#endif
8762
8b21361b
SP
8763/* Avoid relocations from using section symbols in some cases. */
8764bfd_boolean
8765aarch64_fix_adjustable (struct fix *fixP)
8766{
8767 switch (fixP->fx_r_type)
8768 {
f0070c1e
SP
8769 /* We need to retain symbol information when jumping between A64 and C64
8770 states or between two C64 functions. In the C64 -> C64 situation it's
8771 really only a corner case that breaks when symbols get replaced with
8772 section symbols; this is when the jump distance is longer than what a
8773 branch instruction can handle and we want to branch through a stub.
8774 In such a case, the linker needs to know the symbol types of the
8775 source and the destination and section symbols are an unreliable
8776 source of this information. */
8b21361b
SP
8777 case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
8778 case BFD_RELOC_AARCH64_ADD_LO12:
8779 case BFD_RELOC_AARCH64_BRANCH19:
8780 case BFD_RELOC_AARCH64_TSTBR14:
8781 case BFD_RELOC_AARCH64_JUMP26:
8782 case BFD_RELOC_AARCH64_CALL26:
f0070c1e 8783 if (fixP->tc_fix_data.c64 || AARCH64_IS_C64 (fixP->fx_addsy))
8b21361b
SP
8784 return FALSE;
8785 break;
8786 default:
8787 break;
8788 }
8789
8790 return TRUE;
8791}
8792
a06ea964
NC
8793/* Adjust the symbol table. */
8794
8795void
8796aarch64_adjust_symtab (void)
8797{
8798#ifdef OBJ_ELF
8b21361b
SP
8799 symbolS * sym;
8800
8801 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
8802 {
8803 if (AARCH64_IS_C64 (sym)
8804 && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION))
8805 {
8806 elf_symbol_type * elf_sym;
8807
8808 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
8809
8810 if (!bfd_is_aarch64_special_symbol_name
8811 (elf_sym->symbol.name, BFD_AARCH64_SPECIAL_SYM_TYPE_ANY))
8812 elf_sym->internal_elf_sym.st_target_internal = ST_BRANCH_TO_C64;
8813 }
8814 }
8815
a06ea964
NC
8816 /* Remove any overlapping mapping symbols generated by alignment frags. */
8817 bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
8818 /* Now do generic ELF adjustments. */
8819 elf_adjust_symtab ();
8820#endif
8821}
8822
8823static void
629310ab 8824checked_hash_insert (htab_t table, const char *key, void *value)
a06ea964 8825{
fe0e921f 8826 str_hash_insert (table, key, value, 0);
a06ea964
NC
8827}
8828
fa63795f 8829static void
629310ab 8830sysreg_hash_insert (htab_t table, const char *key, void *value)
fa63795f
AC
8831{
8832 gas_assert (strlen (key) < AARCH64_MAX_SYSREG_NAME_LEN);
8833 checked_hash_insert (table, key, value);
8834}
8835
a06ea964
NC
8836static void
8837fill_instruction_hash_table (void)
8838{
8839 aarch64_opcode *opcode = aarch64_opcode_table;
8840
8841 while (opcode->name != NULL)
8842 {
8843 templates *templ, *new_templ;
629310ab 8844 templ = str_hash_find (aarch64_ops_hsh, opcode->name);
a06ea964 8845
add39d23 8846 new_templ = XNEW (templates);
a06ea964
NC
8847 new_templ->opcode = opcode;
8848 new_templ->next = NULL;
8849
8850 if (!templ)
8851 checked_hash_insert (aarch64_ops_hsh, opcode->name, (void *) new_templ);
8852 else
8853 {
8854 new_templ->next = templ->next;
8855 templ->next = new_templ;
8856 }
8857 ++opcode;
8858 }
8859}
8860
8861static inline void
8862convert_to_upper (char *dst, const char *src, size_t num)
8863{
8864 unsigned int i;
8865 for (i = 0; i < num && *src != '\0'; ++i, ++dst, ++src)
8866 *dst = TOUPPER (*src);
8867 *dst = '\0';
8868}
8869
8870/* Assume STR point to a lower-case string, allocate, convert and return
8871 the corresponding upper-case string. */
8872static inline const char*
8873get_upper_str (const char *str)
8874{
8875 char *ret;
8876 size_t len = strlen (str);
325801bd 8877 ret = XNEWVEC (char, len + 1);
a06ea964
NC
8878 convert_to_upper (ret, str, len);
8879 return ret;
8880}
8881
8882/* MD interface: Initialization. */
8883
8884void
8885md_begin (void)
8886{
8887 unsigned mach;
8888 unsigned int i;
8889
f16c3d4f
AM
8890 aarch64_ops_hsh = str_htab_create ();
8891 aarch64_cond_hsh = str_htab_create ();
8892 aarch64_shift_hsh = str_htab_create ();
8893 aarch64_sys_regs_hsh = str_htab_create ();
8894 aarch64_pstatefield_hsh = str_htab_create ();
8895 aarch64_sys_regs_ic_hsh = str_htab_create ();
8896 aarch64_sys_regs_dc_hsh = str_htab_create ();
8897 aarch64_sys_regs_at_hsh = str_htab_create ();
8898 aarch64_sys_regs_tlbi_hsh = str_htab_create ();
8899 aarch64_sys_regs_sr_hsh = str_htab_create ();
8900 aarch64_reg_hsh = str_htab_create ();
8901 aarch64_barrier_opt_hsh = str_htab_create ();
8902 aarch64_nzcv_hsh = str_htab_create ();
8903 aarch64_pldop_hsh = str_htab_create ();
8904 aarch64_hint_opt_hsh = str_htab_create ();
a06ea964
NC
8905
8906 fill_instruction_hash_table ();
8907
8908 for (i = 0; aarch64_sys_regs[i].name != NULL; ++i)
fa63795f 8909 sysreg_hash_insert (aarch64_sys_regs_hsh, aarch64_sys_regs[i].name,
a06ea964
NC
8910 (void *) (aarch64_sys_regs + i));
8911
8912 for (i = 0; aarch64_pstatefields[i].name != NULL; ++i)
fa63795f 8913 sysreg_hash_insert (aarch64_pstatefield_hsh,
a06ea964
NC
8914 aarch64_pstatefields[i].name,
8915 (void *) (aarch64_pstatefields + i));
8916
875880c6 8917 for (i = 0; aarch64_sys_regs_ic[i].name != NULL; i++)
fa63795f 8918 sysreg_hash_insert (aarch64_sys_regs_ic_hsh,
875880c6 8919 aarch64_sys_regs_ic[i].name,
a06ea964
NC
8920 (void *) (aarch64_sys_regs_ic + i));
8921
875880c6 8922 for (i = 0; aarch64_sys_regs_dc[i].name != NULL; i++)
fa63795f 8923 sysreg_hash_insert (aarch64_sys_regs_dc_hsh,
875880c6 8924 aarch64_sys_regs_dc[i].name,
a06ea964
NC
8925 (void *) (aarch64_sys_regs_dc + i));
8926
875880c6 8927 for (i = 0; aarch64_sys_regs_at[i].name != NULL; i++)
fa63795f 8928 sysreg_hash_insert (aarch64_sys_regs_at_hsh,
875880c6 8929 aarch64_sys_regs_at[i].name,
a06ea964
NC
8930 (void *) (aarch64_sys_regs_at + i));
8931
875880c6 8932 for (i = 0; aarch64_sys_regs_tlbi[i].name != NULL; i++)
fa63795f 8933 sysreg_hash_insert (aarch64_sys_regs_tlbi_hsh,
875880c6 8934 aarch64_sys_regs_tlbi[i].name,
a06ea964
NC
8935 (void *) (aarch64_sys_regs_tlbi + i));
8936
2ac435d4 8937 for (i = 0; aarch64_sys_regs_sr[i].name != NULL; i++)
fa63795f 8938 sysreg_hash_insert (aarch64_sys_regs_sr_hsh,
2ac435d4
SD
8939 aarch64_sys_regs_sr[i].name,
8940 (void *) (aarch64_sys_regs_sr + i));
8941
a06ea964
NC
8942 for (i = 0; i < ARRAY_SIZE (reg_names); i++)
8943 checked_hash_insert (aarch64_reg_hsh, reg_names[i].name,
8944 (void *) (reg_names + i));
8945
8946 for (i = 0; i < ARRAY_SIZE (nzcv_names); i++)
8947 checked_hash_insert (aarch64_nzcv_hsh, nzcv_names[i].template,
8948 (void *) (nzcv_names + i));
8949
8950 for (i = 0; aarch64_operand_modifiers[i].name != NULL; i++)
8951 {
8952 const char *name = aarch64_operand_modifiers[i].name;
8953 checked_hash_insert (aarch64_shift_hsh, name,
8954 (void *) (aarch64_operand_modifiers + i));
8955 /* Also hash the name in the upper case. */
8956 checked_hash_insert (aarch64_shift_hsh, get_upper_str (name),
8957 (void *) (aarch64_operand_modifiers + i));
8958 }
8959
8960 for (i = 0; i < ARRAY_SIZE (aarch64_conds); i++)
8961 {
8962 unsigned int j;
8963 /* A condition code may have alias(es), e.g. "cc", "lo" and "ul" are
8964 the same condition code. */
8965 for (j = 0; j < ARRAY_SIZE (aarch64_conds[i].names); ++j)
8966 {
8967 const char *name = aarch64_conds[i].names[j];
8968 if (name == NULL)
8969 break;
8970 checked_hash_insert (aarch64_cond_hsh, name,
8971 (void *) (aarch64_conds + i));
8972 /* Also hash the name in the upper case. */
8973 checked_hash_insert (aarch64_cond_hsh, get_upper_str (name),
8974 (void *) (aarch64_conds + i));
8975 }
8976 }
8977
8978 for (i = 0; i < ARRAY_SIZE (aarch64_barrier_options); i++)
8979 {
8980 const char *name = aarch64_barrier_options[i].name;
8981 /* Skip xx00 - the unallocated values of option. */
8982 if ((i & 0x3) == 0)
8983 continue;
8984 checked_hash_insert (aarch64_barrier_opt_hsh, name,
8985 (void *) (aarch64_barrier_options + i));
8986 /* Also hash the name in the upper case. */
8987 checked_hash_insert (aarch64_barrier_opt_hsh, get_upper_str (name),
8988 (void *) (aarch64_barrier_options + i));
8989 }
8990
8991 for (i = 0; i < ARRAY_SIZE (aarch64_prfops); i++)
8992 {
8993 const char* name = aarch64_prfops[i].name;
a1ccaec9
YZ
8994 /* Skip the unallocated hint encodings. */
8995 if (name == NULL)
a06ea964
NC
8996 continue;
8997 checked_hash_insert (aarch64_pldop_hsh, name,
8998 (void *) (aarch64_prfops + i));
8999 /* Also hash the name in the upper case. */
9000 checked_hash_insert (aarch64_pldop_hsh, get_upper_str (name),
9001 (void *) (aarch64_prfops + i));
9002 }
9003
1e6f4800
MW
9004 for (i = 0; aarch64_hint_options[i].name != NULL; i++)
9005 {
9006 const char* name = aarch64_hint_options[i].name;
0a821c4f 9007 const char* upper_name = get_upper_str(name);
1e6f4800
MW
9008
9009 checked_hash_insert (aarch64_hint_opt_hsh, name,
9010 (void *) (aarch64_hint_options + i));
0a821c4f
AP
9011
9012 /* Also hash the name in the upper case if not the same. */
9013 if (strcmp (name, upper_name) != 0)
9014 checked_hash_insert (aarch64_hint_opt_hsh, upper_name,
9015 (void *) (aarch64_hint_options + i));
1e6f4800
MW
9016 }
9017
a06ea964
NC
9018 /* Set the cpu variant based on the command-line options. */
9019 if (!mcpu_cpu_opt)
9020 mcpu_cpu_opt = march_cpu_opt;
9021
9022 if (!mcpu_cpu_opt)
9023 mcpu_cpu_opt = &cpu_default;
9024
9025 cpu_variant = *mcpu_cpu_opt;
9026
9027 /* Record the CPU type. */
cec5225b 9028 mach = ilp32_p ? bfd_mach_aarch64_ilp32 : bfd_mach_aarch64;
a06ea964
NC
9029
9030 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
9031}
9032
9033/* Command line processing. */
9034
9035const char *md_shortopts = "m:";
9036
9037#ifdef AARCH64_BI_ENDIAN
9038#define OPTION_EB (OPTION_MD_BASE + 0)
9039#define OPTION_EL (OPTION_MD_BASE + 1)
9040#else
9041#if TARGET_BYTES_BIG_ENDIAN
9042#define OPTION_EB (OPTION_MD_BASE + 0)
9043#else
9044#define OPTION_EL (OPTION_MD_BASE + 1)
9045#endif
9046#endif
9047
9048struct option md_longopts[] = {
9049#ifdef OPTION_EB
9050 {"EB", no_argument, NULL, OPTION_EB},
9051#endif
9052#ifdef OPTION_EL
9053 {"EL", no_argument, NULL, OPTION_EL},
9054#endif
9055 {NULL, no_argument, NULL, 0}
9056};
9057
9058size_t md_longopts_size = sizeof (md_longopts);
9059
9060struct aarch64_option_table
9061{
e0471c16
TS
9062 const char *option; /* Option name to match. */
9063 const char *help; /* Help information. */
a06ea964
NC
9064 int *var; /* Variable to change. */
9065 int value; /* What to change it to. */
9066 char *deprecated; /* If non-null, print this message. */
9067};
9068
9069static struct aarch64_option_table aarch64_opts[] = {
9070 {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
9071 {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
9072 NULL},
9073#ifdef DEBUG_AARCH64
9074 {"mdebug-dump", N_("temporary switch for dumping"), &debug_dump, 1, NULL},
9075#endif /* DEBUG_AARCH64 */
9076 {"mverbose-error", N_("output verbose error messages"), &verbose_error_p, 1,
9077 NULL},
a52e6fd3
YZ
9078 {"mno-verbose-error", N_("do not output verbose error messages"),
9079 &verbose_error_p, 0, NULL},
a06ea964
NC
9080 {NULL, NULL, NULL, 0, NULL}
9081};
9082
9083struct aarch64_cpu_option_table
9084{
e0471c16 9085 const char *name;
a06ea964
NC
9086 const aarch64_feature_set value;
9087 /* The canonical name of the CPU, or NULL to use NAME converted to upper
9088 case. */
9089 const char *canonical_name;
9090};
9091
9092/* This list should, at a minimum, contain all the cpu names
9093 recognized by GCC. */
9094static const struct aarch64_cpu_option_table aarch64_cpus[] = {
9095 {"all", AARCH64_ANY, NULL},
546053ac
DZ
9096 {"cortex-a34", AARCH64_FEATURE (AARCH64_ARCH_V8,
9097 AARCH64_FEATURE_CRC), "Cortex-A34"},
9c352f1c
JG
9098 {"cortex-a35", AARCH64_FEATURE (AARCH64_ARCH_V8,
9099 AARCH64_FEATURE_CRC), "Cortex-A35"},
aa31c464
JW
9100 {"cortex-a53", AARCH64_FEATURE (AARCH64_ARCH_V8,
9101 AARCH64_FEATURE_CRC), "Cortex-A53"},
9102 {"cortex-a57", AARCH64_FEATURE (AARCH64_ARCH_V8,
9103 AARCH64_FEATURE_CRC), "Cortex-A57"},
2abdd192
JW
9104 {"cortex-a72", AARCH64_FEATURE (AARCH64_ARCH_V8,
9105 AARCH64_FEATURE_CRC), "Cortex-A72"},
1aa70332
KT
9106 {"cortex-a73", AARCH64_FEATURE (AARCH64_ARCH_V8,
9107 AARCH64_FEATURE_CRC), "Cortex-A73"},
1e292627 9108 {"cortex-a55", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
1c5c938a 9109 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16 | AARCH64_FEATURE_DOTPROD),
1e292627
JG
9110 "Cortex-A55"},
9111 {"cortex-a75", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
1c5c938a 9112 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16 | AARCH64_FEATURE_DOTPROD),
1e292627 9113 "Cortex-A75"},
c2a0f929 9114 {"cortex-a76", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9115 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16 | AARCH64_FEATURE_DOTPROD),
9116 "Cortex-A76"},
546053ac
DZ
9117 {"cortex-a76ae", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9118 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9119 | AARCH64_FEATURE_DOTPROD
9120 | AARCH64_FEATURE_SSBS),
9121 "Cortex-A76AE"},
9122 {"cortex-a77", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9123 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9124 | AARCH64_FEATURE_DOTPROD
9125 | AARCH64_FEATURE_SSBS),
9126 "Cortex-A77"},
9127 {"cortex-a65", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9128 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9129 | AARCH64_FEATURE_DOTPROD
9130 | AARCH64_FEATURE_SSBS),
9131 "Cortex-A65"},
9132 {"cortex-a65ae", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9133 AARCH64_FEATURE_F16 | AARCH64_FEATURE_RCPC
9134 | AARCH64_FEATURE_DOTPROD
9135 | AARCH64_FEATURE_SSBS),
9136 "Cortex-A65AE"},
77718e5b
PW
9137 {"cortex-a78", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9138 AARCH64_FEATURE_F16
9139 | AARCH64_FEATURE_RCPC
9140 | AARCH64_FEATURE_DOTPROD
9141 | AARCH64_FEATURE_SSBS
9142 | AARCH64_FEATURE_PROFILE),
9143 "Cortex-A78"},
9144 {"cortex-a78ae", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9145 AARCH64_FEATURE_F16
9146 | AARCH64_FEATURE_RCPC
9147 | AARCH64_FEATURE_DOTPROD
9148 | AARCH64_FEATURE_SSBS
9149 | AARCH64_FEATURE_PROFILE),
9150 "Cortex-A78AE"},
c8fcc360
KT
9151 {"ares", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9152 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16
9153 | AARCH64_FEATURE_DOTPROD
9154 | AARCH64_FEATURE_PROFILE),
9155 "Ares"},
2412d878
EM
9156 {"exynos-m1", AARCH64_FEATURE (AARCH64_ARCH_V8,
9157 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO),
9158 "Samsung Exynos M1"},
2fe9c2a0 9159 {"falkor", AARCH64_FEATURE (AARCH64_ARCH_V8,
e58ff055
JW
9160 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO
9161 | AARCH64_FEATURE_RDMA),
2fe9c2a0 9162 "Qualcomm Falkor"},
516dbc44
KT
9163 {"neoverse-e1", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9164 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16
9165 | AARCH64_FEATURE_DOTPROD
9166 | AARCH64_FEATURE_SSBS),
9167 "Neoverse E1"},
38e75bf2
KT
9168 {"neoverse-n1", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
9169 AARCH64_FEATURE_RCPC | AARCH64_FEATURE_F16
9170 | AARCH64_FEATURE_DOTPROD
9171 | AARCH64_FEATURE_PROFILE),
9172 "Neoverse N1"},
990e5268
AC
9173 {"neoverse-n2", AARCH64_FEATURE (AARCH64_ARCH_V8_5,
9174 AARCH64_FEATURE_BFLOAT16
9175 | AARCH64_FEATURE_I8MM
9176 | AARCH64_FEATURE_F16
9177 | AARCH64_FEATURE_SVE
9178 | AARCH64_FEATURE_SVE2
9179 | AARCH64_FEATURE_SVE2_BITPERM
9180 | AARCH64_FEATURE_MEMTAG
9181 | AARCH64_FEATURE_RNG),
9182 "Neoverse N2"},
c769fd6a
AC
9183 {"neoverse-v1", AARCH64_FEATURE (AARCH64_ARCH_V8_4,
9184 AARCH64_FEATURE_PROFILE
9185 | AARCH64_FEATURE_CVADP
9186 | AARCH64_FEATURE_SVE
9187 | AARCH64_FEATURE_SSBS
9188 | AARCH64_FEATURE_RNG
9189 | AARCH64_FEATURE_F16
9190 | AARCH64_FEATURE_BFLOAT16
9191 | AARCH64_FEATURE_I8MM), "Neoverse V1"},
6b21c2bf 9192 {"qdf24xx", AARCH64_FEATURE (AARCH64_ARCH_V8,
e58ff055
JW
9193 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO
9194 | AARCH64_FEATURE_RDMA),
6b21c2bf 9195 "Qualcomm QDF24XX"},
eb5c42e5 9196 {"saphira", AARCH64_FEATURE (AARCH64_ARCH_V8_4,
7605d944
SP
9197 AARCH64_FEATURE_CRYPTO | AARCH64_FEATURE_PROFILE),
9198 "Qualcomm Saphira"},
faade851
JW
9199 {"thunderx", AARCH64_FEATURE (AARCH64_ARCH_V8,
9200 AARCH64_FEATURE_CRC | AARCH64_FEATURE_CRYPTO),
9201 "Cavium ThunderX"},
9f99c22e
VP
9202 {"vulcan", AARCH64_FEATURE (AARCH64_ARCH_V8_1,
9203 AARCH64_FEATURE_CRYPTO),
0a8be2fe 9204 "Broadcom Vulcan"},
070cb956
PT
9205 /* The 'xgene-1' name is an older name for 'xgene1', which was used
9206 in earlier releases and is superseded by 'xgene1' in all
9207 tools. */
9877c63c 9208 {"xgene-1", AARCH64_ARCH_V8, "APM X-Gene 1"},
070cb956 9209 {"xgene1", AARCH64_ARCH_V8, "APM X-Gene 1"},
aa31c464
JW
9210 {"xgene2", AARCH64_FEATURE (AARCH64_ARCH_V8,
9211 AARCH64_FEATURE_CRC), "APM X-Gene 2"},
f1363b0f 9212 {"cortex-r82", AARCH64_ARCH_V8_R, "Cortex-R82"},
47e1f9de 9213 {"cortex-x1", AARCH64_FEATURE (AARCH64_ARCH_V8_2,
f9b1d75e
PW
9214 AARCH64_FEATURE_F16
9215 | AARCH64_FEATURE_RCPC
9216 | AARCH64_FEATURE_DOTPROD
9217 | AARCH64_FEATURE_SSBS
9218 | AARCH64_FEATURE_PROFILE),
9219 "Cortex-X1"},
a06ea964
NC
9220 {"generic", AARCH64_ARCH_V8, NULL},
9221
a06ea964
NC
9222 {NULL, AARCH64_ARCH_NONE, NULL}
9223};
9224
9225struct aarch64_arch_option_table
9226{
e0471c16 9227 const char *name;
a06ea964
NC
9228 const aarch64_feature_set value;
9229};
9230
9231/* This list should, at a minimum, contain all the architecture names
9232 recognized by GCC. */
9233static const struct aarch64_arch_option_table aarch64_archs[] = {
9234 {"all", AARCH64_ANY},
5a1ad39d 9235 {"armv8-a", AARCH64_ARCH_V8},
88f0ea34 9236 {"armv8.1-a", AARCH64_ARCH_V8_1},
acb787b0 9237 {"armv8.2-a", AARCH64_ARCH_V8_2},
1924ff75 9238 {"armv8.3-a", AARCH64_ARCH_V8_3},
b6b9ca0c 9239 {"armv8.4-a", AARCH64_ARCH_V8_4},
70d56181 9240 {"armv8.5-a", AARCH64_ARCH_V8_5},
8ae2d3d9 9241 {"armv8.6-a", AARCH64_ARCH_V8_6},
95830c98 9242 {"armv8-r", AARCH64_ARCH_V8_R},
3493da5c 9243 {"morello", AARCH64_ARCH_MORELLO},
a06ea964
NC
9244 {NULL, AARCH64_ARCH_NONE}
9245};
9246
9247/* ISA extensions. */
9248struct aarch64_option_cpu_value_table
9249{
e0471c16 9250 const char *name;
a06ea964 9251 const aarch64_feature_set value;
93d8990c 9252 const aarch64_feature_set require; /* Feature dependencies. */
a06ea964
NC
9253};
9254
9255static const struct aarch64_option_cpu_value_table aarch64_features[] = {
93d8990c
SN
9256 {"crc", AARCH64_FEATURE (AARCH64_FEATURE_CRC, 0),
9257 AARCH64_ARCH_NONE},
2dc4b12f 9258 {"crypto", AARCH64_FEATURE (AARCH64_FEATURE_CRYPTO, 0),
fa09f4ea 9259 AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0)},
93d8990c
SN
9260 {"fp", AARCH64_FEATURE (AARCH64_FEATURE_FP, 0),
9261 AARCH64_ARCH_NONE},
9262 {"lse", AARCH64_FEATURE (AARCH64_FEATURE_LSE, 0),
9263 AARCH64_ARCH_NONE},
9264 {"simd", AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0),
fa09f4ea 9265 AARCH64_FEATURE (AARCH64_FEATURE_FP, 0)},
93d8990c
SN
9266 {"pan", AARCH64_FEATURE (AARCH64_FEATURE_PAN, 0),
9267 AARCH64_ARCH_NONE},
9268 {"lor", AARCH64_FEATURE (AARCH64_FEATURE_LOR, 0),
9269 AARCH64_ARCH_NONE},
9270 {"ras", AARCH64_FEATURE (AARCH64_FEATURE_RAS, 0),
9271 AARCH64_ARCH_NONE},
9272 {"rdma", AARCH64_FEATURE (AARCH64_FEATURE_RDMA, 0),
9273 AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0)},
9274 {"fp16", AARCH64_FEATURE (AARCH64_FEATURE_F16, 0),
9275 AARCH64_FEATURE (AARCH64_FEATURE_FP, 0)},
d0f7791c
TC
9276 {"fp16fml", AARCH64_FEATURE (AARCH64_FEATURE_F16_FML, 0),
9277 AARCH64_FEATURE (AARCH64_FEATURE_FP
9278 | AARCH64_FEATURE_F16, 0)},
93d8990c
SN
9279 {"profile", AARCH64_FEATURE (AARCH64_FEATURE_PROFILE, 0),
9280 AARCH64_ARCH_NONE},
c0890d26 9281 {"sve", AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0),
582e12bf
RS
9282 AARCH64_FEATURE (AARCH64_FEATURE_F16
9283 | AARCH64_FEATURE_SIMD
9284 | AARCH64_FEATURE_COMPNUM, 0)},
b83b4b13
SD
9285 {"tme", AARCH64_FEATURE (AARCH64_FEATURE_TME, 0),
9286 AARCH64_ARCH_NONE},
f482d304
RS
9287 {"compnum", AARCH64_FEATURE (AARCH64_FEATURE_COMPNUM, 0),
9288 AARCH64_FEATURE (AARCH64_FEATURE_F16
9289 | AARCH64_FEATURE_SIMD, 0)},
d74d4880
SN
9290 {"rcpc", AARCH64_FEATURE (AARCH64_FEATURE_RCPC, 0),
9291 AARCH64_ARCH_NONE},
65a55fbb
TC
9292 {"dotprod", AARCH64_FEATURE (AARCH64_FEATURE_DOTPROD, 0),
9293 AARCH64_ARCH_NONE},
c0e7cef7
NC
9294 {"sha2", AARCH64_FEATURE (AARCH64_FEATURE_SHA2, 0),
9295 AARCH64_ARCH_NONE},
68dfbb92
SD
9296 {"sb", AARCH64_FEATURE (AARCH64_FEATURE_SB, 0),
9297 AARCH64_ARCH_NONE},
2ac435d4
SD
9298 {"predres", AARCH64_FEATURE (AARCH64_FEATURE_PREDRES, 0),
9299 AARCH64_ARCH_NONE},
c0e7cef7
NC
9300 {"aes", AARCH64_FEATURE (AARCH64_FEATURE_AES, 0),
9301 AARCH64_ARCH_NONE},
b6b9ca0c
TC
9302 {"sm4", AARCH64_FEATURE (AARCH64_FEATURE_SM4, 0),
9303 AARCH64_ARCH_NONE},
d4340f89
JB
9304 {"sha3", AARCH64_FEATURE (AARCH64_FEATURE_SHA3, 0),
9305 AARCH64_FEATURE (AARCH64_FEATURE_SHA2, 0)},
af4bcb4c
SD
9306 {"rng", AARCH64_FEATURE (AARCH64_FEATURE_RNG, 0),
9307 AARCH64_ARCH_NONE},
104fefee
SD
9308 {"ssbs", AARCH64_FEATURE (AARCH64_FEATURE_SSBS, 0),
9309 AARCH64_ARCH_NONE},
73b605ec
SD
9310 {"memtag", AARCH64_FEATURE (AARCH64_FEATURE_MEMTAG, 0),
9311 AARCH64_ARCH_NONE},
7ce2460a
MM
9312 {"sve2", AARCH64_FEATURE (AARCH64_FEATURE_SVE2, 0),
9313 AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0)},
9314 {"sve2-sm4", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_SM4, 0),
9315 AARCH64_FEATURE (AARCH64_FEATURE_SVE2
9316 | AARCH64_FEATURE_SM4, 0)},
9317 {"sve2-aes", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_AES, 0),
9318 AARCH64_FEATURE (AARCH64_FEATURE_SVE2
9319 | AARCH64_FEATURE_AES, 0)},
9320 {"sve2-sha3", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_SHA3, 0),
9321 AARCH64_FEATURE (AARCH64_FEATURE_SVE2
9322 | AARCH64_FEATURE_SHA3, 0)},
ccbdd22f 9323 {"sve2-bitperm", AARCH64_FEATURE (AARCH64_FEATURE_SVE2_BITPERM, 0),
7ce2460a 9324 AARCH64_FEATURE (AARCH64_FEATURE_SVE2, 0)},
df678013
MM
9325 {"bf16", AARCH64_FEATURE (AARCH64_FEATURE_BFLOAT16, 0),
9326 AARCH64_ARCH_NONE},
8382113f
MM
9327 {"i8mm", AARCH64_FEATURE (AARCH64_FEATURE_I8MM, 0),
9328 AARCH64_ARCH_NONE},
9329 {"f32mm", AARCH64_FEATURE (AARCH64_FEATURE_F32MM, 0),
82e9597c 9330 AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0)},
8382113f 9331 {"f64mm", AARCH64_FEATURE (AARCH64_FEATURE_F64MM, 0),
82e9597c 9332 AARCH64_FEATURE (AARCH64_FEATURE_SVE, 0)},
3493da5c
SP
9333 {"a64c", AARCH64_FEATURE (AARCH64_FEATURE_A64C, 0),
9334 AARCH64_ARCH_NONE},
9335 {"c64", AARCH64_FEATURE (AARCH64_FEATURE_C64, 0),
9336 AARCH64_FEATURE (AARCH64_FEATURE_A64C, 0)},
93d8990c 9337 {NULL, AARCH64_ARCH_NONE, AARCH64_ARCH_NONE},
a06ea964
NC
9338};
9339
9340struct aarch64_long_option_table
9341{
e0471c16
TS
9342 const char *option; /* Substring to match. */
9343 const char *help; /* Help information. */
17b9d67d 9344 int (*func) (const char *subopt); /* Function to decode sub-option. */
a06ea964
NC
9345 char *deprecated; /* If non-null, print this message. */
9346};
9347
93d8990c
SN
9348/* Transitive closure of features depending on set. */
9349static aarch64_feature_set
9350aarch64_feature_disable_set (aarch64_feature_set set)
9351{
9352 const struct aarch64_option_cpu_value_table *opt;
9353 aarch64_feature_set prev = 0;
9354
9355 while (prev != set) {
9356 prev = set;
9357 for (opt = aarch64_features; opt->name != NULL; opt++)
9358 if (AARCH64_CPU_HAS_ANY_FEATURES (opt->require, set))
9359 AARCH64_MERGE_FEATURE_SETS (set, set, opt->value);
9360 }
9361 return set;
9362}
9363
9364/* Transitive closure of dependencies of set. */
9365static aarch64_feature_set
9366aarch64_feature_enable_set (aarch64_feature_set set)
9367{
9368 const struct aarch64_option_cpu_value_table *opt;
9369 aarch64_feature_set prev = 0;
9370
9371 while (prev != set) {
9372 prev = set;
9373 for (opt = aarch64_features; opt->name != NULL; opt++)
9374 if (AARCH64_CPU_HAS_FEATURE (set, opt->value))
9375 AARCH64_MERGE_FEATURE_SETS (set, set, opt->require);
9376 }
9377 return set;
9378}
9379
a06ea964 9380static int
82b8a785 9381aarch64_parse_features (const char *str, const aarch64_feature_set **opt_p,
ae527cd8 9382 bfd_boolean ext_only)
a06ea964
NC
9383{
9384 /* We insist on extensions being added before being removed. We achieve
9385 this by using the ADDING_VALUE variable to indicate whether we are
9386 adding an extension (1) or removing it (0) and only allowing it to
9387 change in the order -1 -> 1 -> 0. */
9388 int adding_value = -1;
325801bd 9389 aarch64_feature_set *ext_set = XNEW (aarch64_feature_set);
a06ea964
NC
9390
9391 /* Copy the feature set, so that we can modify it. */
9392 *ext_set = **opt_p;
9393 *opt_p = ext_set;
9394
9395 while (str != NULL && *str != 0)
9396 {
9397 const struct aarch64_option_cpu_value_table *opt;
82b8a785 9398 const char *ext = NULL;
a06ea964
NC
9399 int optlen;
9400
ae527cd8 9401 if (!ext_only)
a06ea964 9402 {
ae527cd8
JB
9403 if (*str != '+')
9404 {
9405 as_bad (_("invalid architectural extension"));
9406 return 0;
9407 }
a06ea964 9408
ae527cd8
JB
9409 ext = strchr (++str, '+');
9410 }
a06ea964
NC
9411
9412 if (ext != NULL)
9413 optlen = ext - str;
9414 else
9415 optlen = strlen (str);
9416
9417 if (optlen >= 2 && strncmp (str, "no", 2) == 0)
9418 {
9419 if (adding_value != 0)
9420 adding_value = 0;
9421 optlen -= 2;
9422 str += 2;
9423 }
9424 else if (optlen > 0)
9425 {
9426 if (adding_value == -1)
9427 adding_value = 1;
9428 else if (adding_value != 1)
9429 {
9430 as_bad (_("must specify extensions to add before specifying "
9431 "those to remove"));
9432 return FALSE;
9433 }
9434 }
9435
9436 if (optlen == 0)
9437 {
9438 as_bad (_("missing architectural extension"));
9439 return 0;
9440 }
9441
9442 gas_assert (adding_value != -1);
9443
9444 for (opt = aarch64_features; opt->name != NULL; opt++)
9445 if (strncmp (opt->name, str, optlen) == 0)
9446 {
93d8990c
SN
9447 aarch64_feature_set set;
9448
a06ea964
NC
9449 /* Add or remove the extension. */
9450 if (adding_value)
93d8990c
SN
9451 {
9452 set = aarch64_feature_enable_set (opt->value);
9453 AARCH64_MERGE_FEATURE_SETS (*ext_set, *ext_set, set);
9454 }
a06ea964 9455 else
93d8990c
SN
9456 {
9457 set = aarch64_feature_disable_set (opt->value);
9458 AARCH64_CLEAR_FEATURE (*ext_set, *ext_set, set);
9459 }
a06ea964
NC
9460 break;
9461 }
9462
9463 if (opt->name == NULL)
9464 {
9465 as_bad (_("unknown architectural extension `%s'"), str);
9466 return 0;
9467 }
9468
9469 str = ext;
9470 };
9471
9472 return 1;
9473}
9474
9475static int
17b9d67d 9476aarch64_parse_cpu (const char *str)
a06ea964
NC
9477{
9478 const struct aarch64_cpu_option_table *opt;
82b8a785 9479 const char *ext = strchr (str, '+');
a06ea964
NC
9480 size_t optlen;
9481
9482 if (ext != NULL)
9483 optlen = ext - str;
9484 else
9485 optlen = strlen (str);
9486
9487 if (optlen == 0)
9488 {
9489 as_bad (_("missing cpu name `%s'"), str);
9490 return 0;
9491 }
9492
9493 for (opt = aarch64_cpus; opt->name != NULL; opt++)
9494 if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
9495 {
9496 mcpu_cpu_opt = &opt->value;
9497 if (ext != NULL)
ae527cd8 9498 return aarch64_parse_features (ext, &mcpu_cpu_opt, FALSE);
a06ea964
NC
9499
9500 return 1;
9501 }
9502
9503 as_bad (_("unknown cpu `%s'"), str);
9504 return 0;
9505}
9506
9507static int
17b9d67d 9508aarch64_parse_arch (const char *str)
a06ea964
NC
9509{
9510 const struct aarch64_arch_option_table *opt;
82b8a785 9511 const char *ext = strchr (str, '+');
a06ea964
NC
9512 size_t optlen;
9513
9514 if (ext != NULL)
9515 optlen = ext - str;
9516 else
9517 optlen = strlen (str);
9518
9519 if (optlen == 0)
9520 {
9521 as_bad (_("missing architecture name `%s'"), str);
9522 return 0;
9523 }
9524
9525 for (opt = aarch64_archs; opt->name != NULL; opt++)
9526 if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
9527 {
9528 march_cpu_opt = &opt->value;
9529 if (ext != NULL)
ae527cd8 9530 return aarch64_parse_features (ext, &march_cpu_opt, FALSE);
a06ea964
NC
9531
9532 return 1;
9533 }
9534
9535 as_bad (_("unknown architecture `%s'\n"), str);
9536 return 0;
9537}
9538
69091a2c
YZ
9539/* ABIs. */
9540struct aarch64_option_abi_value_table
9541{
e0471c16 9542 const char *name;
69091a2c
YZ
9543 enum aarch64_abi_type value;
9544};
9545
9546static const struct aarch64_option_abi_value_table aarch64_abis[] = {
9547 {"ilp32", AARCH64_ABI_ILP32},
9548 {"lp64", AARCH64_ABI_LP64},
69091a2c
YZ
9549};
9550
9551static int
17b9d67d 9552aarch64_parse_abi (const char *str)
69091a2c 9553{
5703197e 9554 unsigned int i;
69091a2c 9555
5703197e 9556 if (str[0] == '\0')
69091a2c
YZ
9557 {
9558 as_bad (_("missing abi name `%s'"), str);
9559 return 0;
9560 }
9561
5703197e
TS
9562 for (i = 0; i < ARRAY_SIZE (aarch64_abis); i++)
9563 if (strcmp (str, aarch64_abis[i].name) == 0)
69091a2c 9564 {
5703197e 9565 aarch64_abi = aarch64_abis[i].value;
69091a2c
YZ
9566 return 1;
9567 }
9568
9569 as_bad (_("unknown abi `%s'\n"), str);
9570 return 0;
9571}
9572
a06ea964 9573static struct aarch64_long_option_table aarch64_long_opts[] = {
69091a2c
YZ
9574#ifdef OBJ_ELF
9575 {"mabi=", N_("<abi name>\t specify for ABI <abi name>"),
9576 aarch64_parse_abi, NULL},
9577#endif /* OBJ_ELF */
a06ea964
NC
9578 {"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"),
9579 aarch64_parse_cpu, NULL},
9580 {"march=", N_("<arch name>\t assemble for architecture <arch name>"),
9581 aarch64_parse_arch, NULL},
9582 {NULL, NULL, 0, NULL}
9583};
9584
9585int
17b9d67d 9586md_parse_option (int c, const char *arg)
a06ea964
NC
9587{
9588 struct aarch64_option_table *opt;
9589 struct aarch64_long_option_table *lopt;
9590
9591 switch (c)
9592 {
9593#ifdef OPTION_EB
9594 case OPTION_EB:
9595 target_big_endian = 1;
9596 break;
9597#endif
9598
9599#ifdef OPTION_EL
9600 case OPTION_EL:
9601 target_big_endian = 0;
9602 break;
9603#endif
9604
9605 case 'a':
9606 /* Listing option. Just ignore these, we don't support additional
9607 ones. */
9608 return 0;
9609
9610 default:
9611 for (opt = aarch64_opts; opt->option != NULL; opt++)
9612 {
9613 if (c == opt->option[0]
9614 && ((arg == NULL && opt->option[1] == 0)
9615 || streq (arg, opt->option + 1)))
9616 {
9617 /* If the option is deprecated, tell the user. */
9618 if (opt->deprecated != NULL)
9619 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
9620 arg ? arg : "", _(opt->deprecated));
9621
9622 if (opt->var != NULL)
9623 *opt->var = opt->value;
9624
9625 return 1;
9626 }
9627 }
9628
9629 for (lopt = aarch64_long_opts; lopt->option != NULL; lopt++)
9630 {
9631 /* These options are expected to have an argument. */
9632 if (c == lopt->option[0]
9633 && arg != NULL
9634 && strncmp (arg, lopt->option + 1,
9635 strlen (lopt->option + 1)) == 0)
9636 {
9637 /* If the option is deprecated, tell the user. */
9638 if (lopt->deprecated != NULL)
9639 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
9640 _(lopt->deprecated));
9641
9642 /* Call the sup-option parser. */
9643 return lopt->func (arg + strlen (lopt->option) - 1);
9644 }
9645 }
9646
9647 return 0;
9648 }
9649
9650 return 1;
9651}
9652
9653void
9654md_show_usage (FILE * fp)
9655{
9656 struct aarch64_option_table *opt;
9657 struct aarch64_long_option_table *lopt;
9658
9659 fprintf (fp, _(" AArch64-specific assembler options:\n"));
9660
9661 for (opt = aarch64_opts; opt->option != NULL; opt++)
9662 if (opt->help != NULL)
9663 fprintf (fp, " -%-23s%s\n", opt->option, _(opt->help));
9664
9665 for (lopt = aarch64_long_opts; lopt->option != NULL; lopt++)
9666 if (lopt->help != NULL)
9667 fprintf (fp, " -%s%s\n", lopt->option, _(lopt->help));
9668
9669#ifdef OPTION_EB
9670 fprintf (fp, _("\
9671 -EB assemble code for a big-endian cpu\n"));
9672#endif
9673
9674#ifdef OPTION_EL
9675 fprintf (fp, _("\
9676 -EL assemble code for a little-endian cpu\n"));
9677#endif
9678}
9679
9680/* Parse a .cpu directive. */
9681
9682static void
9683s_aarch64_cpu (int ignored ATTRIBUTE_UNUSED)
9684{
9685 const struct aarch64_cpu_option_table *opt;
9686 char saved_char;
9687 char *name;
9688 char *ext;
9689 size_t optlen;
9690
9691 name = input_line_pointer;
9692 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
9693 input_line_pointer++;
9694 saved_char = *input_line_pointer;
9695 *input_line_pointer = 0;
9696
9697 ext = strchr (name, '+');
9698
9699 if (ext != NULL)
9700 optlen = ext - name;
9701 else
9702 optlen = strlen (name);
9703
9704 /* Skip the first "all" entry. */
9705 for (opt = aarch64_cpus + 1; opt->name != NULL; opt++)
9706 if (strlen (opt->name) == optlen
9707 && strncmp (name, opt->name, optlen) == 0)
9708 {
9709 mcpu_cpu_opt = &opt->value;
9710 if (ext != NULL)
ae527cd8 9711 if (!aarch64_parse_features (ext, &mcpu_cpu_opt, FALSE))
a06ea964
NC
9712 return;
9713
9714 cpu_variant = *mcpu_cpu_opt;
9715
9716 *input_line_pointer = saved_char;
9717 demand_empty_rest_of_line ();
9718 return;
9719 }
9720 as_bad (_("unknown cpu `%s'"), name);
9721 *input_line_pointer = saved_char;
9722 ignore_rest_of_line ();
9723}
9724
9725
9726/* Parse a .arch directive. */
9727
9728static void
9729s_aarch64_arch (int ignored ATTRIBUTE_UNUSED)
9730{
9731 const struct aarch64_arch_option_table *opt;
9732 char saved_char;
9733 char *name;
9734 char *ext;
9735 size_t optlen;
9736
9737 name = input_line_pointer;
9738 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
9739 input_line_pointer++;
9740 saved_char = *input_line_pointer;
9741 *input_line_pointer = 0;
9742
9743 ext = strchr (name, '+');
9744
9745 if (ext != NULL)
9746 optlen = ext - name;
9747 else
9748 optlen = strlen (name);
9749
9750 /* Skip the first "all" entry. */
9751 for (opt = aarch64_archs + 1; opt->name != NULL; opt++)
9752 if (strlen (opt->name) == optlen
9753 && strncmp (name, opt->name, optlen) == 0)
9754 {
9755 mcpu_cpu_opt = &opt->value;
9756 if (ext != NULL)
ae527cd8 9757 if (!aarch64_parse_features (ext, &mcpu_cpu_opt, FALSE))
a06ea964
NC
9758 return;
9759
9760 cpu_variant = *mcpu_cpu_opt;
9761
9762 *input_line_pointer = saved_char;
9763 demand_empty_rest_of_line ();
9764 return;
9765 }
9766
9767 as_bad (_("unknown architecture `%s'\n"), name);
9768 *input_line_pointer = saved_char;
9769 ignore_rest_of_line ();
9770}
9771
ae527cd8
JB
9772/* Parse a .arch_extension directive. */
9773
9774static void
9775s_aarch64_arch_extension (int ignored ATTRIBUTE_UNUSED)
9776{
9777 char saved_char;
9778 char *ext = input_line_pointer;;
9779
9780 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
9781 input_line_pointer++;
9782 saved_char = *input_line_pointer;
9783 *input_line_pointer = 0;
9784
9785 if (!aarch64_parse_features (ext, &mcpu_cpu_opt, TRUE))
9786 return;
9787
9788 cpu_variant = *mcpu_cpu_opt;
9789
9790 *input_line_pointer = saved_char;
9791 demand_empty_rest_of_line ();
9792}
9793
a06ea964
NC
9794/* Copy symbol information. */
9795
9796void
9797aarch64_copy_symbol_attributes (symbolS * dest, symbolS * src)
9798{
9799 AARCH64_GET_FLAG (dest) = AARCH64_GET_FLAG (src);
9800}
0b4eac57
SN
9801
9802#ifdef OBJ_ELF
9803/* Same as elf_copy_symbol_attributes, but without copying st_other.
9804 This is needed so AArch64 specific st_other values can be independently
9805 specified for an IFUNC resolver (that is called by the dynamic linker)
9806 and the symbol it resolves (aliased to the resolver). In particular,
9807 if a function symbol has special st_other value set via directives,
9808 then attaching an IFUNC resolver to that symbol should not override
9809 the st_other setting. Requiring the directive on the IFUNC resolver
9810 symbol would be unexpected and problematic in C code, where the two
9811 symbols appear as two independent function declarations. */
9812
9813void
9814aarch64_elf_copy_symbol_attributes (symbolS *dest, symbolS *src)
9815{
9816 struct elf_obj_sy *srcelf = symbol_get_obj (src);
9817 struct elf_obj_sy *destelf = symbol_get_obj (dest);
9818 if (srcelf->size)
9819 {
9820 if (destelf->size == NULL)
9821 destelf->size = XNEW (expressionS);
9822 *destelf->size = *srcelf->size;
9823 }
9824 else
9825 {
9fbb53c7 9826 free (destelf->size);
0b4eac57
SN
9827 destelf->size = NULL;
9828 }
9829 S_SET_SIZE (dest, S_GET_SIZE (src));
9830}
9831#endif