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