03fddd1ede27f053c94320030447ab5df41ae0cb
[external/binutils.git] / gas / config / tc-aarch64.c
1 /* tc-aarch64.c -- Assemble for the AArch64 ISA
2
3    Copyright (C) 2009-2014 Free Software Foundation, Inc.
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"
30
31 #ifdef OBJ_ELF
32 #include "elf/aarch64.h"
33 #include "dw2gencfi.h"
34 #endif
35
36 #include "dwarf2dbg.h"
37
38 /* Types of processor to assemble for.  */
39 #ifndef CPU_DEFAULT
40 #define CPU_DEFAULT AARCH64_ARCH_V8
41 #endif
42
43 #define streq(a, b)           (strcmp (a, b) == 0)
44
45 #define END_OF_INSN '\0'
46
47 static aarch64_feature_set cpu_variant;
48
49 /* Variables that we set while parsing command-line options.  Once all
50    options have been read we re-process these values to set the real
51    assembly flags.  */
52 static const aarch64_feature_set *mcpu_cpu_opt = NULL;
53 static const aarch64_feature_set *march_cpu_opt = NULL;
54
55 /* Constants for known architecture features.  */
56 static const aarch64_feature_set cpu_default = CPU_DEFAULT;
57
58 static const aarch64_feature_set aarch64_arch_any = AARCH64_ANY;
59 static const aarch64_feature_set aarch64_arch_none = AARCH64_ARCH_NONE;
60
61 #ifdef OBJ_ELF
62 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
63 static symbolS *GOT_symbol;
64
65 /* Which ABI to use.  */
66 enum aarch64_abi_type
67 {
68   AARCH64_ABI_LP64 = 0,
69   AARCH64_ABI_ILP32 = 1
70 };
71
72 /* AArch64 ABI for the output file.  */
73 static enum aarch64_abi_type aarch64_abi = AARCH64_ABI_LP64;
74
75 /* When non-zero, program to a 32-bit model, in which the C data types
76    int, long and all pointer types are 32-bit objects (ILP32); or to a
77    64-bit model, in which the C int type is 32-bits but the C long type
78    and all pointer types are 64-bit objects (LP64).  */
79 #define ilp32_p         (aarch64_abi == AARCH64_ABI_ILP32)
80 #endif
81
82 enum neon_el_type
83 {
84   NT_invtype = -1,
85   NT_b,
86   NT_h,
87   NT_s,
88   NT_d,
89   NT_q
90 };
91
92 /* Bits for DEFINED field in neon_type_el.  */
93 #define NTA_HASTYPE  1
94 #define NTA_HASINDEX 2
95
96 struct neon_type_el
97 {
98   enum neon_el_type type;
99   unsigned char defined;
100   unsigned width;
101   int64_t index;
102 };
103
104 #define FIXUP_F_HAS_EXPLICIT_SHIFT      0x00000001
105
106 struct reloc
107 {
108   bfd_reloc_code_real_type type;
109   expressionS exp;
110   int pc_rel;
111   enum aarch64_opnd opnd;
112   uint32_t flags;
113   unsigned need_libopcodes_p : 1;
114 };
115
116 struct aarch64_instruction
117 {
118   /* libopcodes structure for instruction intermediate representation.  */
119   aarch64_inst base;
120   /* Record assembly errors found during the parsing.  */
121   struct
122     {
123       enum aarch64_operand_error_kind kind;
124       const char *error;
125     } parsing_error;
126   /* The condition that appears in the assembly line.  */
127   int cond;
128   /* Relocation information (including the GAS internal fixup).  */
129   struct reloc reloc;
130   /* Need to generate an immediate in the literal pool.  */
131   unsigned gen_lit_pool : 1;
132 };
133
134 typedef struct aarch64_instruction aarch64_instruction;
135
136 static aarch64_instruction inst;
137
138 static bfd_boolean parse_operands (char *, const aarch64_opcode *);
139 static bfd_boolean programmer_friendly_fixup (aarch64_instruction *);
140
141 /* Diagnostics inline function utilites.
142
143    These are lightweight utlities which should only be called by parse_operands
144    and other parsers.  GAS processes each assembly line by parsing it against
145    instruction template(s), in the case of multiple templates (for the same
146    mnemonic name), those templates are tried one by one until one succeeds or
147    all fail.  An assembly line may fail a few templates before being
148    successfully parsed; an error saved here in most cases is not a user error
149    but an error indicating the current template is not the right template.
150    Therefore it is very important that errors can be saved at a low cost during
151    the parsing; we don't want to slow down the whole parsing by recording
152    non-user errors in detail.
153
154    Remember that the objective is to help GAS pick up the most approapriate
155    error message in the case of multiple templates, e.g. FMOV which has 8
156    templates.  */
157
158 static inline void
159 clear_error (void)
160 {
161   inst.parsing_error.kind = AARCH64_OPDE_NIL;
162   inst.parsing_error.error = NULL;
163 }
164
165 static inline bfd_boolean
166 error_p (void)
167 {
168   return inst.parsing_error.kind != AARCH64_OPDE_NIL;
169 }
170
171 static inline const char *
172 get_error_message (void)
173 {
174   return inst.parsing_error.error;
175 }
176
177 static inline void
178 set_error_message (const char *error)
179 {
180   inst.parsing_error.error = error;
181 }
182
183 static inline enum aarch64_operand_error_kind
184 get_error_kind (void)
185 {
186   return inst.parsing_error.kind;
187 }
188
189 static inline void
190 set_error_kind (enum aarch64_operand_error_kind kind)
191 {
192   inst.parsing_error.kind = kind;
193 }
194
195 static inline void
196 set_error (enum aarch64_operand_error_kind kind, const char *error)
197 {
198   inst.parsing_error.kind = kind;
199   inst.parsing_error.error = error;
200 }
201
202 static inline void
203 set_recoverable_error (const char *error)
204 {
205   set_error (AARCH64_OPDE_RECOVERABLE, error);
206 }
207
208 /* Use the DESC field of the corresponding aarch64_operand entry to compose
209    the error message.  */
210 static inline void
211 set_default_error (void)
212 {
213   set_error (AARCH64_OPDE_SYNTAX_ERROR, NULL);
214 }
215
216 static inline void
217 set_syntax_error (const char *error)
218 {
219   set_error (AARCH64_OPDE_SYNTAX_ERROR, error);
220 }
221
222 static inline void
223 set_first_syntax_error (const char *error)
224 {
225   if (! error_p ())
226     set_error (AARCH64_OPDE_SYNTAX_ERROR, error);
227 }
228
229 static inline void
230 set_fatal_syntax_error (const char *error)
231 {
232   set_error (AARCH64_OPDE_FATAL_SYNTAX_ERROR, error);
233 }
234 \f
235 /* Number of littlenums required to hold an extended precision number.  */
236 #define MAX_LITTLENUMS 6
237
238 /* Return value for certain parsers when the parsing fails; those parsers
239    return the information of the parsed result, e.g. register number, on
240    success.  */
241 #define PARSE_FAIL -1
242
243 /* This is an invalid condition code that means no conditional field is
244    present. */
245 #define COND_ALWAYS 0x10
246
247 typedef struct
248 {
249   const char *template;
250   unsigned long value;
251 } asm_barrier_opt;
252
253 typedef struct
254 {
255   const char *template;
256   uint32_t value;
257 } asm_nzcv;
258
259 struct reloc_entry
260 {
261   char *name;
262   bfd_reloc_code_real_type reloc;
263 };
264
265 /* Structure for a hash table entry for a register.  */
266 typedef struct
267 {
268   const char *name;
269   unsigned char number;
270   unsigned char type;
271   unsigned char builtin;
272 } reg_entry;
273
274 /* Macros to define the register types and masks for the purpose
275    of parsing.  */
276
277 #undef AARCH64_REG_TYPES
278 #define AARCH64_REG_TYPES       \
279   BASIC_REG_TYPE(R_32)  /* w[0-30] */   \
280   BASIC_REG_TYPE(R_64)  /* x[0-30] */   \
281   BASIC_REG_TYPE(SP_32) /* wsp     */   \
282   BASIC_REG_TYPE(SP_64) /* sp      */   \
283   BASIC_REG_TYPE(Z_32)  /* wzr     */   \
284   BASIC_REG_TYPE(Z_64)  /* xzr     */   \
285   BASIC_REG_TYPE(FP_B)  /* b[0-31] *//* NOTE: keep FP_[BHSDQ] consecutive! */\
286   BASIC_REG_TYPE(FP_H)  /* h[0-31] */   \
287   BASIC_REG_TYPE(FP_S)  /* s[0-31] */   \
288   BASIC_REG_TYPE(FP_D)  /* d[0-31] */   \
289   BASIC_REG_TYPE(FP_Q)  /* q[0-31] */   \
290   BASIC_REG_TYPE(CN)    /* c[0-7]  */   \
291   BASIC_REG_TYPE(VN)    /* v[0-31] */   \
292   /* Typecheck: any 64-bit int reg         (inc SP exc XZR) */          \
293   MULTI_REG_TYPE(R64_SP, REG_TYPE(R_64) | REG_TYPE(SP_64))              \
294   /* Typecheck: any int                    (inc {W}SP inc [WX]ZR) */    \
295   MULTI_REG_TYPE(R_Z_SP, REG_TYPE(R_32) | REG_TYPE(R_64)                \
296                  | REG_TYPE(SP_32) | REG_TYPE(SP_64)                    \
297                  | REG_TYPE(Z_32) | REG_TYPE(Z_64))                     \
298   /* Typecheck: any [BHSDQ]P FP.  */                                    \
299   MULTI_REG_TYPE(BHSDQ, REG_TYPE(FP_B) | REG_TYPE(FP_H)                 \
300                  | REG_TYPE(FP_S) | REG_TYPE(FP_D) | REG_TYPE(FP_Q))    \
301   /* Typecheck: any int or [BHSDQ]P FP or V reg (exc SP inc [WX]ZR)  */ \
302   MULTI_REG_TYPE(R_Z_BHSDQ_V, REG_TYPE(R_32) | REG_TYPE(R_64)           \
303                  | REG_TYPE(Z_32) | REG_TYPE(Z_64) | REG_TYPE(VN)       \
304                  | REG_TYPE(FP_B) | REG_TYPE(FP_H)                      \
305                  | REG_TYPE(FP_S) | REG_TYPE(FP_D) | REG_TYPE(FP_Q))    \
306   /* Any integer register; used for error messages only.  */            \
307   MULTI_REG_TYPE(R_N, REG_TYPE(R_32) | REG_TYPE(R_64)                   \
308                  | REG_TYPE(SP_32) | REG_TYPE(SP_64)                    \
309                  | REG_TYPE(Z_32) | REG_TYPE(Z_64))                     \
310   /* Pseudo type to mark the end of the enumerator sequence.  */        \
311   BASIC_REG_TYPE(MAX)
312
313 #undef BASIC_REG_TYPE
314 #define BASIC_REG_TYPE(T)       REG_TYPE_##T,
315 #undef MULTI_REG_TYPE
316 #define MULTI_REG_TYPE(T,V)     BASIC_REG_TYPE(T)
317
318 /* Register type enumerators.  */
319 typedef enum
320 {
321   /* A list of REG_TYPE_*.  */
322   AARCH64_REG_TYPES
323 } aarch64_reg_type;
324
325 #undef BASIC_REG_TYPE
326 #define BASIC_REG_TYPE(T)       1 << REG_TYPE_##T,
327 #undef REG_TYPE
328 #define REG_TYPE(T)             (1 << REG_TYPE_##T)
329 #undef MULTI_REG_TYPE
330 #define MULTI_REG_TYPE(T,V)     V,
331
332 /* Values indexed by aarch64_reg_type to assist the type checking.  */
333 static const unsigned reg_type_masks[] =
334 {
335   AARCH64_REG_TYPES
336 };
337
338 #undef BASIC_REG_TYPE
339 #undef REG_TYPE
340 #undef MULTI_REG_TYPE
341 #undef AARCH64_REG_TYPES
342
343 /* Diagnostics used when we don't get a register of the expected type.
344    Note:  this has to synchronized with aarch64_reg_type definitions
345    above.  */
346 static const char *
347 get_reg_expected_msg (aarch64_reg_type reg_type)
348 {
349   const char *msg;
350
351   switch (reg_type)
352     {
353     case REG_TYPE_R_32:
354       msg = N_("integer 32-bit register expected");
355       break;
356     case REG_TYPE_R_64:
357       msg = N_("integer 64-bit register expected");
358       break;
359     case REG_TYPE_R_N:
360       msg = N_("integer register expected");
361       break;
362     case REG_TYPE_R_Z_SP:
363       msg = N_("integer, zero or SP register expected");
364       break;
365     case REG_TYPE_FP_B:
366       msg = N_("8-bit SIMD scalar register expected");
367       break;
368     case REG_TYPE_FP_H:
369       msg = N_("16-bit SIMD scalar or floating-point half precision "
370                "register expected");
371       break;
372     case REG_TYPE_FP_S:
373       msg = N_("32-bit SIMD scalar or floating-point single precision "
374                "register expected");
375       break;
376     case REG_TYPE_FP_D:
377       msg = N_("64-bit SIMD scalar or floating-point double precision "
378                "register expected");
379       break;
380     case REG_TYPE_FP_Q:
381       msg = N_("128-bit SIMD scalar or floating-point quad precision "
382                "register expected");
383       break;
384     case REG_TYPE_CN:
385       msg = N_("C0 - C15 expected");
386       break;
387     case REG_TYPE_R_Z_BHSDQ_V:
388       msg = N_("register expected");
389       break;
390     case REG_TYPE_BHSDQ:        /* any [BHSDQ]P FP  */
391       msg = N_("SIMD scalar or floating-point register expected");
392       break;
393     case REG_TYPE_VN:           /* any V reg  */
394       msg = N_("vector register expected");
395       break;
396     default:
397       as_fatal (_("invalid register type %d"), reg_type);
398     }
399   return msg;
400 }
401
402 /* Some well known registers that we refer to directly elsewhere.  */
403 #define REG_SP  31
404
405 /* Instructions take 4 bytes in the object file.  */
406 #define INSN_SIZE       4
407
408 /* Define some common error messages.  */
409 #define BAD_SP          _("SP not allowed here")
410
411 static struct hash_control *aarch64_ops_hsh;
412 static struct hash_control *aarch64_cond_hsh;
413 static struct hash_control *aarch64_shift_hsh;
414 static struct hash_control *aarch64_sys_regs_hsh;
415 static struct hash_control *aarch64_pstatefield_hsh;
416 static struct hash_control *aarch64_sys_regs_ic_hsh;
417 static struct hash_control *aarch64_sys_regs_dc_hsh;
418 static struct hash_control *aarch64_sys_regs_at_hsh;
419 static struct hash_control *aarch64_sys_regs_tlbi_hsh;
420 static struct hash_control *aarch64_reg_hsh;
421 static struct hash_control *aarch64_barrier_opt_hsh;
422 static struct hash_control *aarch64_nzcv_hsh;
423 static struct hash_control *aarch64_pldop_hsh;
424
425 /* Stuff needed to resolve the label ambiguity
426    As:
427      ...
428      label:   <insn>
429    may differ from:
430      ...
431      label:
432               <insn>  */
433
434 static symbolS *last_label_seen;
435
436 /* Literal pool structure.  Held on a per-section
437    and per-sub-section basis.  */
438
439 #define MAX_LITERAL_POOL_SIZE 1024
440 typedef struct literal_expression
441 {
442   expressionS exp;
443   /* If exp.op == O_big then this bignum holds a copy of the global bignum value.  */
444   LITTLENUM_TYPE * bignum;
445 } literal_expression;
446
447 typedef struct literal_pool
448 {
449   literal_expression literals[MAX_LITERAL_POOL_SIZE];
450   unsigned int next_free_entry;
451   unsigned int id;
452   symbolS *symbol;
453   segT section;
454   subsegT sub_section;
455   int size;
456   struct literal_pool *next;
457 } literal_pool;
458
459 /* Pointer to a linked list of literal pools.  */
460 static literal_pool *list_of_pools = NULL;
461 \f
462 /* Pure syntax.  */
463
464 /* This array holds the chars that always start a comment.  If the
465    pre-processor is disabled, these aren't very useful.  */
466 const char comment_chars[] = "";
467
468 /* This array holds the chars that only start a comment at the beginning of
469    a line.  If the line seems to have the form '# 123 filename'
470    .line and .file directives will appear in the pre-processed output.  */
471 /* Note that input_file.c hand checks for '#' at the beginning of the
472    first line of the input file.  This is because the compiler outputs
473    #NO_APP at the beginning of its output.  */
474 /* Also note that comments like this one will always work.  */
475 const char line_comment_chars[] = "#";
476
477 const char line_separator_chars[] = ";";
478
479 /* Chars that can be used to separate mant
480    from exp in floating point numbers.  */
481 const char EXP_CHARS[] = "eE";
482
483 /* Chars that mean this number is a floating point constant.  */
484 /* As in 0f12.456  */
485 /* or    0d1.2345e12  */
486
487 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
488
489 /* Prefix character that indicates the start of an immediate value.  */
490 #define is_immediate_prefix(C) ((C) == '#')
491
492 /* Separator character handling.  */
493
494 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
495
496 static inline bfd_boolean
497 skip_past_char (char **str, char c)
498 {
499   if (**str == c)
500     {
501       (*str)++;
502       return TRUE;
503     }
504   else
505     return FALSE;
506 }
507
508 #define skip_past_comma(str) skip_past_char (str, ',')
509
510 /* Arithmetic expressions (possibly involving symbols).  */
511
512 static bfd_boolean in_my_get_expression_p = FALSE;
513
514 /* Third argument to my_get_expression.  */
515 #define GE_NO_PREFIX 0
516 #define GE_OPT_PREFIX 1
517
518 /* Return TRUE if the string pointed by *STR is successfully parsed
519    as an valid expression; *EP will be filled with the information of
520    such an expression.  Otherwise return FALSE.  */
521
522 static bfd_boolean
523 my_get_expression (expressionS * ep, char **str, int prefix_mode,
524                    int reject_absent)
525 {
526   char *save_in;
527   segT seg;
528   int prefix_present_p = 0;
529
530   switch (prefix_mode)
531     {
532     case GE_NO_PREFIX:
533       break;
534     case GE_OPT_PREFIX:
535       if (is_immediate_prefix (**str))
536         {
537           (*str)++;
538           prefix_present_p = 1;
539         }
540       break;
541     default:
542       abort ();
543     }
544
545   memset (ep, 0, sizeof (expressionS));
546
547   save_in = input_line_pointer;
548   input_line_pointer = *str;
549   in_my_get_expression_p = TRUE;
550   seg = expression (ep);
551   in_my_get_expression_p = FALSE;
552
553   if (ep->X_op == O_illegal || (reject_absent && ep->X_op == O_absent))
554     {
555       /* We found a bad expression in md_operand().  */
556       *str = input_line_pointer;
557       input_line_pointer = save_in;
558       if (prefix_present_p && ! error_p ())
559         set_fatal_syntax_error (_("bad expression"));
560       else
561         set_first_syntax_error (_("bad expression"));
562       return FALSE;
563     }
564
565 #ifdef OBJ_AOUT
566   if (seg != absolute_section
567       && seg != text_section
568       && seg != data_section
569       && seg != bss_section && seg != undefined_section)
570     {
571       set_syntax_error (_("bad segment"));
572       *str = input_line_pointer;
573       input_line_pointer = save_in;
574       return FALSE;
575     }
576 #else
577   (void) seg;
578 #endif
579
580   *str = input_line_pointer;
581   input_line_pointer = save_in;
582   return TRUE;
583 }
584
585 /* Turn a string in input_line_pointer into a floating point constant
586    of type TYPE, and store the appropriate bytes in *LITP.  The number
587    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
588    returned, or NULL on OK.  */
589
590 char *
591 md_atof (int type, char *litP, int *sizeP)
592 {
593   return ieee_md_atof (type, litP, sizeP, target_big_endian);
594 }
595
596 /* We handle all bad expressions here, so that we can report the faulty
597    instruction in the error message.  */
598 void
599 md_operand (expressionS * exp)
600 {
601   if (in_my_get_expression_p)
602     exp->X_op = O_illegal;
603 }
604
605 /* Immediate values.  */
606
607 /* Errors may be set multiple times during parsing or bit encoding
608    (particularly in the Neon bits), but usually the earliest error which is set
609    will be the most meaningful. Avoid overwriting it with later (cascading)
610    errors by calling this function.  */
611
612 static void
613 first_error (const char *error)
614 {
615   if (! error_p ())
616     set_syntax_error (error);
617 }
618
619 /* Similiar to first_error, but this function accepts formatted error
620    message.  */
621 static void
622 first_error_fmt (const char *format, ...)
623 {
624   va_list args;
625   enum
626   { size = 100 };
627   /* N.B. this single buffer will not cause error messages for different
628      instructions to pollute each other; this is because at the end of
629      processing of each assembly line, error message if any will be
630      collected by as_bad.  */
631   static char buffer[size];
632
633   if (! error_p ())
634     {
635       int ret ATTRIBUTE_UNUSED;
636       va_start (args, format);
637       ret = vsnprintf (buffer, size, format, args);
638       know (ret <= size - 1 && ret >= 0);
639       va_end (args);
640       set_syntax_error (buffer);
641     }
642 }
643
644 /* Register parsing.  */
645
646 /* Generic register parser which is called by other specialized
647    register parsers.
648    CCP points to what should be the beginning of a register name.
649    If it is indeed a valid register name, advance CCP over it and
650    return the reg_entry structure; otherwise return NULL.
651    It does not issue diagnostics.  */
652
653 static reg_entry *
654 parse_reg (char **ccp)
655 {
656   char *start = *ccp;
657   char *p;
658   reg_entry *reg;
659
660 #ifdef REGISTER_PREFIX
661   if (*start != REGISTER_PREFIX)
662     return NULL;
663   start++;
664 #endif
665
666   p = start;
667   if (!ISALPHA (*p) || !is_name_beginner (*p))
668     return NULL;
669
670   do
671     p++;
672   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
673
674   reg = (reg_entry *) hash_find_n (aarch64_reg_hsh, start, p - start);
675
676   if (!reg)
677     return NULL;
678
679   *ccp = p;
680   return reg;
681 }
682
683 /* Return TRUE if REG->TYPE is a valid type of TYPE; otherwise
684    return FALSE.  */
685 static bfd_boolean
686 aarch64_check_reg_type (const reg_entry *reg, aarch64_reg_type type)
687 {
688   if (reg->type == type)
689     return TRUE;
690
691   switch (type)
692     {
693     case REG_TYPE_R64_SP:       /* 64-bit integer reg (inc SP exc XZR).  */
694     case REG_TYPE_R_Z_SP:       /* Integer reg (inc {X}SP inc [WX]ZR).  */
695     case REG_TYPE_R_Z_BHSDQ_V:  /* Any register apart from Cn.  */
696     case REG_TYPE_BHSDQ:        /* Any [BHSDQ]P FP or SIMD scalar register.  */
697     case REG_TYPE_VN:           /* Vector register.  */
698       gas_assert (reg->type < REG_TYPE_MAX && type < REG_TYPE_MAX);
699       return ((reg_type_masks[reg->type] & reg_type_masks[type])
700               == reg_type_masks[reg->type]);
701     default:
702       as_fatal ("unhandled type %d", type);
703       abort ();
704     }
705 }
706
707 /* Parse a register and return PARSE_FAIL if the register is not of type R_Z_SP.
708    Return the register number otherwise.  *ISREG32 is set to one if the
709    register is 32-bit wide; *ISREGZERO is set to one if the register is
710    of type Z_32 or Z_64.
711    Note that this function does not issue any diagnostics.  */
712
713 static int
714 aarch64_reg_parse_32_64 (char **ccp, int reject_sp, int reject_rz,
715                          int *isreg32, int *isregzero)
716 {
717   char *str = *ccp;
718   const reg_entry *reg = parse_reg (&str);
719
720   if (reg == NULL)
721     return PARSE_FAIL;
722
723   if (! aarch64_check_reg_type (reg, REG_TYPE_R_Z_SP))
724     return PARSE_FAIL;
725
726   switch (reg->type)
727     {
728     case REG_TYPE_SP_32:
729     case REG_TYPE_SP_64:
730       if (reject_sp)
731         return PARSE_FAIL;
732       *isreg32 = reg->type == REG_TYPE_SP_32;
733       *isregzero = 0;
734       break;
735     case REG_TYPE_R_32:
736     case REG_TYPE_R_64:
737       *isreg32 = reg->type == REG_TYPE_R_32;
738       *isregzero = 0;
739       break;
740     case REG_TYPE_Z_32:
741     case REG_TYPE_Z_64:
742       if (reject_rz)
743         return PARSE_FAIL;
744       *isreg32 = reg->type == REG_TYPE_Z_32;
745       *isregzero = 1;
746       break;
747     default:
748       return PARSE_FAIL;
749     }
750
751   *ccp = str;
752
753   return reg->number;
754 }
755
756 /* Parse the qualifier of a SIMD vector register or a SIMD vector element.
757    Fill in *PARSED_TYPE and return TRUE if the parsing succeeds;
758    otherwise return FALSE.
759
760    Accept only one occurrence of:
761    8b 16b 4h 8h 2s 4s 1d 2d
762    b h s d q  */
763 static bfd_boolean
764 parse_neon_type_for_operand (struct neon_type_el *parsed_type, char **str)
765 {
766   char *ptr = *str;
767   unsigned width;
768   unsigned element_size;
769   enum neon_el_type type;
770
771   /* skip '.' */
772   ptr++;
773
774   if (!ISDIGIT (*ptr))
775     {
776       width = 0;
777       goto elt_size;
778     }
779   width = strtoul (ptr, &ptr, 10);
780   if (width != 1 && width != 2 && width != 4 && width != 8 && width != 16)
781     {
782       first_error_fmt (_("bad size %d in vector width specifier"), width);
783       return FALSE;
784     }
785
786 elt_size:
787   switch (TOLOWER (*ptr))
788     {
789     case 'b':
790       type = NT_b;
791       element_size = 8;
792       break;
793     case 'h':
794       type = NT_h;
795       element_size = 16;
796       break;
797     case 's':
798       type = NT_s;
799       element_size = 32;
800       break;
801     case 'd':
802       type = NT_d;
803       element_size = 64;
804       break;
805     case 'q':
806       if (width == 1)
807         {
808           type = NT_q;
809           element_size = 128;
810           break;
811         }
812       /* fall through.  */
813     default:
814       if (*ptr != '\0')
815         first_error_fmt (_("unexpected character `%c' in element size"), *ptr);
816       else
817         first_error (_("missing element size"));
818       return FALSE;
819     }
820   if (width != 0 && width * element_size != 64 && width * element_size != 128)
821     {
822       first_error_fmt (_
823                        ("invalid element size %d and vector size combination %c"),
824                        width, *ptr);
825       return FALSE;
826     }
827   ptr++;
828
829   parsed_type->type = type;
830   parsed_type->width = width;
831
832   *str = ptr;
833
834   return TRUE;
835 }
836
837 /* Parse a single type, e.g. ".8b", leading period included.
838    Only applicable to Vn registers.
839
840    Return TRUE on success; otherwise return FALSE.  */
841 static bfd_boolean
842 parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
843 {
844   char *str = *ccp;
845
846   if (*str == '.')
847     {
848       if (! parse_neon_type_for_operand (vectype, &str))
849         {
850           first_error (_("vector type expected"));
851           return FALSE;
852         }
853     }
854   else
855     return FALSE;
856
857   *ccp = str;
858
859   return TRUE;
860 }
861
862 /* Parse a register of the type TYPE.
863
864    Return PARSE_FAIL if the string pointed by *CCP is not a valid register
865    name or the parsed register is not of TYPE.
866
867    Otherwise return the register number, and optionally fill in the actual
868    type of the register in *RTYPE when multiple alternatives were given, and
869    return the register shape and element index information in *TYPEINFO.
870
871    IN_REG_LIST should be set with TRUE if the caller is parsing a register
872    list.  */
873
874 static int
875 parse_typed_reg (char **ccp, aarch64_reg_type type, aarch64_reg_type *rtype,
876                  struct neon_type_el *typeinfo, bfd_boolean in_reg_list)
877 {
878   char *str = *ccp;
879   const reg_entry *reg = parse_reg (&str);
880   struct neon_type_el atype;
881   struct neon_type_el parsetype;
882   bfd_boolean is_typed_vecreg = FALSE;
883
884   atype.defined = 0;
885   atype.type = NT_invtype;
886   atype.width = -1;
887   atype.index = 0;
888
889   if (reg == NULL)
890     {
891       if (typeinfo)
892         *typeinfo = atype;
893       set_default_error ();
894       return PARSE_FAIL;
895     }
896
897   if (! aarch64_check_reg_type (reg, type))
898     {
899       DEBUG_TRACE ("reg type check failed");
900       set_default_error ();
901       return PARSE_FAIL;
902     }
903   type = reg->type;
904
905   if (type == REG_TYPE_VN
906       && parse_neon_operand_type (&parsetype, &str))
907     {
908       /* Register if of the form Vn.[bhsdq].  */
909       is_typed_vecreg = TRUE;
910
911       if (parsetype.width == 0)
912         /* Expect index. In the new scheme we cannot have
913            Vn.[bhsdq] represent a scalar. Therefore any
914            Vn.[bhsdq] should have an index following it.
915            Except in reglists ofcourse.  */
916         atype.defined |= NTA_HASINDEX;
917       else
918         atype.defined |= NTA_HASTYPE;
919
920       atype.type = parsetype.type;
921       atype.width = parsetype.width;
922     }
923
924   if (skip_past_char (&str, '['))
925     {
926       expressionS exp;
927
928       /* Reject Sn[index] syntax.  */
929       if (!is_typed_vecreg)
930         {
931           first_error (_("this type of register can't be indexed"));
932           return PARSE_FAIL;
933         }
934
935       if (in_reg_list == TRUE)
936         {
937           first_error (_("index not allowed inside register list"));
938           return PARSE_FAIL;
939         }
940
941       atype.defined |= NTA_HASINDEX;
942
943       my_get_expression (&exp, &str, GE_NO_PREFIX, 1);
944
945       if (exp.X_op != O_constant)
946         {
947           first_error (_("constant expression required"));
948           return PARSE_FAIL;
949         }
950
951       if (! skip_past_char (&str, ']'))
952         return PARSE_FAIL;
953
954       atype.index = exp.X_add_number;
955     }
956   else if (!in_reg_list && (atype.defined & NTA_HASINDEX) != 0)
957     {
958       /* Indexed vector register expected.  */
959       first_error (_("indexed vector register expected"));
960       return PARSE_FAIL;
961     }
962
963   /* A vector reg Vn should be typed or indexed.  */
964   if (type == REG_TYPE_VN && atype.defined == 0)
965     {
966       first_error (_("invalid use of vector register"));
967     }
968
969   if (typeinfo)
970     *typeinfo = atype;
971
972   if (rtype)
973     *rtype = type;
974
975   *ccp = str;
976
977   return reg->number;
978 }
979
980 /* Parse register.
981
982    Return the register number on success; return PARSE_FAIL otherwise.
983
984    If RTYPE is not NULL, return in *RTYPE the (possibly restricted) type of
985    the register (e.g. NEON double or quad reg when either has been requested).
986
987    If this is a NEON vector register with additional type information, fill
988    in the struct pointed to by VECTYPE (if non-NULL).
989
990    This parser does not handle register list.  */
991
992 static int
993 aarch64_reg_parse (char **ccp, aarch64_reg_type type,
994                    aarch64_reg_type *rtype, struct neon_type_el *vectype)
995 {
996   struct neon_type_el atype;
997   char *str = *ccp;
998   int reg = parse_typed_reg (&str, type, rtype, &atype,
999                              /*in_reg_list= */ FALSE);
1000
1001   if (reg == PARSE_FAIL)
1002     return PARSE_FAIL;
1003
1004   if (vectype)
1005     *vectype = atype;
1006
1007   *ccp = str;
1008
1009   return reg;
1010 }
1011
1012 static inline bfd_boolean
1013 eq_neon_type_el (struct neon_type_el e1, struct neon_type_el e2)
1014 {
1015   return
1016     e1.type == e2.type
1017     && e1.defined == e2.defined
1018     && e1.width == e2.width && e1.index == e2.index;
1019 }
1020
1021 /* This function parses the NEON register list.  On success, it returns
1022    the parsed register list information in the following encoded format:
1023
1024    bit   18-22   |   13-17   |   7-11    |    2-6    |   0-1
1025        4th regno | 3rd regno | 2nd regno | 1st regno | num_of_reg
1026
1027    The information of the register shape and/or index is returned in
1028    *VECTYPE.
1029
1030    It returns PARSE_FAIL if the register list is invalid.
1031
1032    The list contains one to four registers.
1033    Each register can be one of:
1034    <Vt>.<T>[<index>]
1035    <Vt>.<T>
1036    All <T> should be identical.
1037    All <index> should be identical.
1038    There are restrictions on <Vt> numbers which are checked later
1039    (by reg_list_valid_p).  */
1040
1041 static int
1042 parse_neon_reg_list (char **ccp, struct neon_type_el *vectype)
1043 {
1044   char *str = *ccp;
1045   int nb_regs;
1046   struct neon_type_el typeinfo, typeinfo_first;
1047   int val, val_range;
1048   int in_range;
1049   int ret_val;
1050   int i;
1051   bfd_boolean error = FALSE;
1052   bfd_boolean expect_index = FALSE;
1053
1054   if (*str != '{')
1055     {
1056       set_syntax_error (_("expecting {"));
1057       return PARSE_FAIL;
1058     }
1059   str++;
1060
1061   nb_regs = 0;
1062   typeinfo_first.defined = 0;
1063   typeinfo_first.type = NT_invtype;
1064   typeinfo_first.width = -1;
1065   typeinfo_first.index = 0;
1066   ret_val = 0;
1067   val = -1;
1068   val_range = -1;
1069   in_range = 0;
1070   do
1071     {
1072       if (in_range)
1073         {
1074           str++;                /* skip over '-' */
1075           val_range = val;
1076         }
1077       val = parse_typed_reg (&str, REG_TYPE_VN, NULL, &typeinfo,
1078                              /*in_reg_list= */ TRUE);
1079       if (val == PARSE_FAIL)
1080         {
1081           set_first_syntax_error (_("invalid vector register in list"));
1082           error = TRUE;
1083           continue;
1084         }
1085       /* reject [bhsd]n */
1086       if (typeinfo.defined == 0)
1087         {
1088           set_first_syntax_error (_("invalid scalar register in list"));
1089           error = TRUE;
1090           continue;
1091         }
1092
1093       if (typeinfo.defined & NTA_HASINDEX)
1094         expect_index = TRUE;
1095
1096       if (in_range)
1097         {
1098           if (val < val_range)
1099             {
1100               set_first_syntax_error
1101                 (_("invalid range in vector register list"));
1102               error = TRUE;
1103             }
1104           val_range++;
1105         }
1106       else
1107         {
1108           val_range = val;
1109           if (nb_regs == 0)
1110             typeinfo_first = typeinfo;
1111           else if (! eq_neon_type_el (typeinfo_first, typeinfo))
1112             {
1113               set_first_syntax_error
1114                 (_("type mismatch in vector register list"));
1115               error = TRUE;
1116             }
1117         }
1118       if (! error)
1119         for (i = val_range; i <= val; i++)
1120           {
1121             ret_val |= i << (5 * nb_regs);
1122             nb_regs++;
1123           }
1124       in_range = 0;
1125     }
1126   while (skip_past_comma (&str) || (in_range = 1, *str == '-'));
1127
1128   skip_whitespace (str);
1129   if (*str != '}')
1130     {
1131       set_first_syntax_error (_("end of vector register list not found"));
1132       error = TRUE;
1133     }
1134   str++;
1135
1136   skip_whitespace (str);
1137
1138   if (expect_index)
1139     {
1140       if (skip_past_char (&str, '['))
1141         {
1142           expressionS exp;
1143
1144           my_get_expression (&exp, &str, GE_NO_PREFIX, 1);
1145           if (exp.X_op != O_constant)
1146             {
1147               set_first_syntax_error (_("constant expression required."));
1148               error = TRUE;
1149             }
1150           if (! skip_past_char (&str, ']'))
1151             error = TRUE;
1152           else
1153             typeinfo_first.index = exp.X_add_number;
1154         }
1155       else
1156         {
1157           set_first_syntax_error (_("expected index"));
1158           error = TRUE;
1159         }
1160     }
1161
1162   if (nb_regs > 4)
1163     {
1164       set_first_syntax_error (_("too many registers in vector register list"));
1165       error = TRUE;
1166     }
1167   else if (nb_regs == 0)
1168     {
1169       set_first_syntax_error (_("empty vector register list"));
1170       error = TRUE;
1171     }
1172
1173   *ccp = str;
1174   if (! error)
1175     *vectype = typeinfo_first;
1176
1177   return error ? PARSE_FAIL : (ret_val << 2) | (nb_regs - 1);
1178 }
1179
1180 /* Directives: register aliases.  */
1181
1182 static reg_entry *
1183 insert_reg_alias (char *str, int number, aarch64_reg_type type)
1184 {
1185   reg_entry *new;
1186   const char *name;
1187
1188   if ((new = hash_find (aarch64_reg_hsh, str)) != 0)
1189     {
1190       if (new->builtin)
1191         as_warn (_("ignoring attempt to redefine built-in register '%s'"),
1192                  str);
1193
1194       /* Only warn about a redefinition if it's not defined as the
1195          same register.  */
1196       else if (new->number != number || new->type != type)
1197         as_warn (_("ignoring redefinition of register alias '%s'"), str);
1198
1199       return NULL;
1200     }
1201
1202   name = xstrdup (str);
1203   new = xmalloc (sizeof (reg_entry));
1204
1205   new->name = name;
1206   new->number = number;
1207   new->type = type;
1208   new->builtin = FALSE;
1209
1210   if (hash_insert (aarch64_reg_hsh, name, (void *) new))
1211     abort ();
1212
1213   return new;
1214 }
1215
1216 /* Look for the .req directive.  This is of the form:
1217
1218         new_register_name .req existing_register_name
1219
1220    If we find one, or if it looks sufficiently like one that we want to
1221    handle any error here, return TRUE.  Otherwise return FALSE.  */
1222
1223 static bfd_boolean
1224 create_register_alias (char *newname, char *p)
1225 {
1226   const reg_entry *old;
1227   char *oldname, *nbuf;
1228   size_t nlen;
1229
1230   /* The input scrubber ensures that whitespace after the mnemonic is
1231      collapsed to single spaces.  */
1232   oldname = p;
1233   if (strncmp (oldname, " .req ", 6) != 0)
1234     return FALSE;
1235
1236   oldname += 6;
1237   if (*oldname == '\0')
1238     return FALSE;
1239
1240   old = hash_find (aarch64_reg_hsh, oldname);
1241   if (!old)
1242     {
1243       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
1244       return TRUE;
1245     }
1246
1247   /* If TC_CASE_SENSITIVE is defined, then newname already points to
1248      the desired alias name, and p points to its end.  If not, then
1249      the desired alias name is in the global original_case_string.  */
1250 #ifdef TC_CASE_SENSITIVE
1251   nlen = p - newname;
1252 #else
1253   newname = original_case_string;
1254   nlen = strlen (newname);
1255 #endif
1256
1257   nbuf = alloca (nlen + 1);
1258   memcpy (nbuf, newname, nlen);
1259   nbuf[nlen] = '\0';
1260
1261   /* Create aliases under the new name as stated; an all-lowercase
1262      version of the new name; and an all-uppercase version of the new
1263      name.  */
1264   if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
1265     {
1266       for (p = nbuf; *p; p++)
1267         *p = TOUPPER (*p);
1268
1269       if (strncmp (nbuf, newname, nlen))
1270         {
1271           /* If this attempt to create an additional alias fails, do not bother
1272              trying to create the all-lower case alias.  We will fail and issue
1273              a second, duplicate error message.  This situation arises when the
1274              programmer does something like:
1275              foo .req r0
1276              Foo .req r1
1277              The second .req creates the "Foo" alias but then fails to create
1278              the artificial FOO alias because it has already been created by the
1279              first .req.  */
1280           if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
1281             return TRUE;
1282         }
1283
1284       for (p = nbuf; *p; p++)
1285         *p = TOLOWER (*p);
1286
1287       if (strncmp (nbuf, newname, nlen))
1288         insert_reg_alias (nbuf, old->number, old->type);
1289     }
1290
1291   return TRUE;
1292 }
1293
1294 /* Should never be called, as .req goes between the alias and the
1295    register name, not at the beginning of the line.  */
1296 static void
1297 s_req (int a ATTRIBUTE_UNUSED)
1298 {
1299   as_bad (_("invalid syntax for .req directive"));
1300 }
1301
1302 /* The .unreq directive deletes an alias which was previously defined
1303    by .req.  For example:
1304
1305        my_alias .req r11
1306        .unreq my_alias    */
1307
1308 static void
1309 s_unreq (int a ATTRIBUTE_UNUSED)
1310 {
1311   char *name;
1312   char saved_char;
1313
1314   name = input_line_pointer;
1315
1316   while (*input_line_pointer != 0
1317          && *input_line_pointer != ' ' && *input_line_pointer != '\n')
1318     ++input_line_pointer;
1319
1320   saved_char = *input_line_pointer;
1321   *input_line_pointer = 0;
1322
1323   if (!*name)
1324     as_bad (_("invalid syntax for .unreq directive"));
1325   else
1326     {
1327       reg_entry *reg = hash_find (aarch64_reg_hsh, name);
1328
1329       if (!reg)
1330         as_bad (_("unknown register alias '%s'"), name);
1331       else if (reg->builtin)
1332         as_warn (_("ignoring attempt to undefine built-in register '%s'"),
1333                  name);
1334       else
1335         {
1336           char *p;
1337           char *nbuf;
1338
1339           hash_delete (aarch64_reg_hsh, name, FALSE);
1340           free ((char *) reg->name);
1341           free (reg);
1342
1343           /* Also locate the all upper case and all lower case versions.
1344              Do not complain if we cannot find one or the other as it
1345              was probably deleted above.  */
1346
1347           nbuf = strdup (name);
1348           for (p = nbuf; *p; p++)
1349             *p = TOUPPER (*p);
1350           reg = hash_find (aarch64_reg_hsh, nbuf);
1351           if (reg)
1352             {
1353               hash_delete (aarch64_reg_hsh, nbuf, FALSE);
1354               free ((char *) reg->name);
1355               free (reg);
1356             }
1357
1358           for (p = nbuf; *p; p++)
1359             *p = TOLOWER (*p);
1360           reg = hash_find (aarch64_reg_hsh, nbuf);
1361           if (reg)
1362             {
1363               hash_delete (aarch64_reg_hsh, nbuf, FALSE);
1364               free ((char *) reg->name);
1365               free (reg);
1366             }
1367
1368           free (nbuf);
1369         }
1370     }
1371
1372   *input_line_pointer = saved_char;
1373   demand_empty_rest_of_line ();
1374 }
1375
1376 /* Directives: Instruction set selection.  */
1377
1378 #ifdef OBJ_ELF
1379 /* This code is to handle mapping symbols as defined in the ARM AArch64 ELF
1380    spec.  (See "Mapping symbols", section 4.5.4, ARM AAELF64 version 0.05).
1381    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
1382    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
1383
1384 /* Create a new mapping symbol for the transition to STATE.  */
1385
1386 static void
1387 make_mapping_symbol (enum mstate state, valueT value, fragS * frag)
1388 {
1389   symbolS *symbolP;
1390   const char *symname;
1391   int type;
1392
1393   switch (state)
1394     {
1395     case MAP_DATA:
1396       symname = "$d";
1397       type = BSF_NO_FLAGS;
1398       break;
1399     case MAP_INSN:
1400       symname = "$x";
1401       type = BSF_NO_FLAGS;
1402       break;
1403     default:
1404       abort ();
1405     }
1406
1407   symbolP = symbol_new (symname, now_seg, value, frag);
1408   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
1409
1410   /* Save the mapping symbols for future reference.  Also check that
1411      we do not place two mapping symbols at the same offset within a
1412      frag.  We'll handle overlap between frags in
1413      check_mapping_symbols.
1414
1415      If .fill or other data filling directive generates zero sized data,
1416      the mapping symbol for the following code will have the same value
1417      as the one generated for the data filling directive.  In this case,
1418      we replace the old symbol with the new one at the same address.  */
1419   if (value == 0)
1420     {
1421       if (frag->tc_frag_data.first_map != NULL)
1422         {
1423           know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
1424           symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP,
1425                          &symbol_lastP);
1426         }
1427       frag->tc_frag_data.first_map = symbolP;
1428     }
1429   if (frag->tc_frag_data.last_map != NULL)
1430     {
1431       know (S_GET_VALUE (frag->tc_frag_data.last_map) <=
1432             S_GET_VALUE (symbolP));
1433       if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
1434         symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP,
1435                        &symbol_lastP);
1436     }
1437   frag->tc_frag_data.last_map = symbolP;
1438 }
1439
1440 /* We must sometimes convert a region marked as code to data during
1441    code alignment, if an odd number of bytes have to be padded.  The
1442    code mapping symbol is pushed to an aligned address.  */
1443
1444 static void
1445 insert_data_mapping_symbol (enum mstate state,
1446                             valueT value, fragS * frag, offsetT bytes)
1447 {
1448   /* If there was already a mapping symbol, remove it.  */
1449   if (frag->tc_frag_data.last_map != NULL
1450       && S_GET_VALUE (frag->tc_frag_data.last_map) ==
1451       frag->fr_address + value)
1452     {
1453       symbolS *symp = frag->tc_frag_data.last_map;
1454
1455       if (value == 0)
1456         {
1457           know (frag->tc_frag_data.first_map == symp);
1458           frag->tc_frag_data.first_map = NULL;
1459         }
1460       frag->tc_frag_data.last_map = NULL;
1461       symbol_remove (symp, &symbol_rootP, &symbol_lastP);
1462     }
1463
1464   make_mapping_symbol (MAP_DATA, value, frag);
1465   make_mapping_symbol (state, value + bytes, frag);
1466 }
1467
1468 static void mapping_state_2 (enum mstate state, int max_chars);
1469
1470 /* Set the mapping state to STATE.  Only call this when about to
1471    emit some STATE bytes to the file.  */
1472
1473 void
1474 mapping_state (enum mstate state)
1475 {
1476   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
1477
1478 #define TRANSITION(from, to) (mapstate == (from) && state == (to))
1479
1480   if (mapstate == state)
1481     /* The mapping symbol has already been emitted.
1482        There is nothing else to do.  */
1483     return;
1484   else if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
1485     /* This case will be evaluated later in the next else.  */
1486     return;
1487   else if (TRANSITION (MAP_UNDEFINED, MAP_INSN))
1488     {
1489       /* Only add the symbol if the offset is > 0:
1490          if we're at the first frag, check it's size > 0;
1491          if we're not at the first frag, then for sure
1492          the offset is > 0.  */
1493       struct frag *const frag_first = seg_info (now_seg)->frchainP->frch_root;
1494       const int add_symbol = (frag_now != frag_first)
1495         || (frag_now_fix () > 0);
1496
1497       if (add_symbol)
1498         make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
1499     }
1500
1501   mapping_state_2 (state, 0);
1502 #undef TRANSITION
1503 }
1504
1505 /* Same as mapping_state, but MAX_CHARS bytes have already been
1506    allocated.  Put the mapping symbol that far back.  */
1507
1508 static void
1509 mapping_state_2 (enum mstate state, int max_chars)
1510 {
1511   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
1512
1513   if (!SEG_NORMAL (now_seg))
1514     return;
1515
1516   if (mapstate == state)
1517     /* The mapping symbol has already been emitted.
1518        There is nothing else to do.  */
1519     return;
1520
1521   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
1522   make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
1523 }
1524 #else
1525 #define mapping_state(x)        /* nothing */
1526 #define mapping_state_2(x, y)   /* nothing */
1527 #endif
1528
1529 /* Directives: sectioning and alignment.  */
1530
1531 static void
1532 s_bss (int ignore ATTRIBUTE_UNUSED)
1533 {
1534   /* We don't support putting frags in the BSS segment, we fake it by
1535      marking in_bss, then looking at s_skip for clues.  */
1536   subseg_set (bss_section, 0);
1537   demand_empty_rest_of_line ();
1538   mapping_state (MAP_DATA);
1539 }
1540
1541 static void
1542 s_even (int ignore ATTRIBUTE_UNUSED)
1543 {
1544   /* Never make frag if expect extra pass.  */
1545   if (!need_pass_2)
1546     frag_align (1, 0, 0);
1547
1548   record_alignment (now_seg, 1);
1549
1550   demand_empty_rest_of_line ();
1551 }
1552
1553 /* Directives: Literal pools.  */
1554
1555 static literal_pool *
1556 find_literal_pool (int size)
1557 {
1558   literal_pool *pool;
1559
1560   for (pool = list_of_pools; pool != NULL; pool = pool->next)
1561     {
1562       if (pool->section == now_seg
1563           && pool->sub_section == now_subseg && pool->size == size)
1564         break;
1565     }
1566
1567   return pool;
1568 }
1569
1570 static literal_pool *
1571 find_or_make_literal_pool (int size)
1572 {
1573   /* Next literal pool ID number.  */
1574   static unsigned int latest_pool_num = 1;
1575   literal_pool *pool;
1576
1577   pool = find_literal_pool (size);
1578
1579   if (pool == NULL)
1580     {
1581       /* Create a new pool.  */
1582       pool = xmalloc (sizeof (*pool));
1583       if (!pool)
1584         return NULL;
1585
1586       /* Currently we always put the literal pool in the current text
1587          section.  If we were generating "small" model code where we
1588          knew that all code and initialised data was within 1MB then
1589          we could output literals to mergeable, read-only data
1590          sections. */
1591
1592       pool->next_free_entry = 0;
1593       pool->section = now_seg;
1594       pool->sub_section = now_subseg;
1595       pool->size = size;
1596       pool->next = list_of_pools;
1597       pool->symbol = NULL;
1598
1599       /* Add it to the list.  */
1600       list_of_pools = pool;
1601     }
1602
1603   /* New pools, and emptied pools, will have a NULL symbol.  */
1604   if (pool->symbol == NULL)
1605     {
1606       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
1607                                     (valueT) 0, &zero_address_frag);
1608       pool->id = latest_pool_num++;
1609     }
1610
1611   /* Done.  */
1612   return pool;
1613 }
1614
1615 /* Add the literal of size SIZE in *EXP to the relevant literal pool.
1616    Return TRUE on success, otherwise return FALSE.  */
1617 static bfd_boolean
1618 add_to_lit_pool (expressionS *exp, int size)
1619 {
1620   literal_pool *pool;
1621   unsigned int entry;
1622
1623   pool = find_or_make_literal_pool (size);
1624
1625   /* Check if this literal value is already in the pool.  */
1626   for (entry = 0; entry < pool->next_free_entry; entry++)
1627     {
1628       expressionS * litexp = & pool->literals[entry].exp;
1629
1630       if ((litexp->X_op == exp->X_op)
1631           && (exp->X_op == O_constant)
1632           && (litexp->X_add_number == exp->X_add_number)
1633           && (litexp->X_unsigned == exp->X_unsigned))
1634         break;
1635
1636       if ((litexp->X_op == exp->X_op)
1637           && (exp->X_op == O_symbol)
1638           && (litexp->X_add_number == exp->X_add_number)
1639           && (litexp->X_add_symbol == exp->X_add_symbol)
1640           && (litexp->X_op_symbol == exp->X_op_symbol))
1641         break;
1642     }
1643
1644   /* Do we need to create a new entry?  */
1645   if (entry == pool->next_free_entry)
1646     {
1647       if (entry >= MAX_LITERAL_POOL_SIZE)
1648         {
1649           set_syntax_error (_("literal pool overflow"));
1650           return FALSE;
1651         }
1652
1653       pool->literals[entry].exp = *exp;
1654       pool->next_free_entry += 1;
1655       if (exp->X_op == O_big)
1656         {
1657           /* PR 16688: Bignums are held in a single global array.  We must
1658              copy and preserve that value now, before it is overwritten.  */
1659           pool->literals[entry].bignum = xmalloc (CHARS_PER_LITTLENUM * exp->X_add_number);
1660           memcpy (pool->literals[entry].bignum, generic_bignum,
1661                   CHARS_PER_LITTLENUM * exp->X_add_number);
1662         }
1663       else
1664         pool->literals[entry].bignum = NULL;
1665     }
1666
1667   exp->X_op = O_symbol;
1668   exp->X_add_number = ((int) entry) * size;
1669   exp->X_add_symbol = pool->symbol;
1670
1671   return TRUE;
1672 }
1673
1674 /* Can't use symbol_new here, so have to create a symbol and then at
1675    a later date assign it a value. Thats what these functions do.  */
1676
1677 static void
1678 symbol_locate (symbolS * symbolP,
1679                const char *name,/* It is copied, the caller can modify.  */
1680                segT segment,    /* Segment identifier (SEG_<something>).  */
1681                valueT valu,     /* Symbol value.  */
1682                fragS * frag)    /* Associated fragment.  */
1683 {
1684   size_t name_length;
1685   char *preserved_copy_of_name;
1686
1687   name_length = strlen (name) + 1;      /* +1 for \0.  */
1688   obstack_grow (&notes, name, name_length);
1689   preserved_copy_of_name = obstack_finish (&notes);
1690
1691 #ifdef tc_canonicalize_symbol_name
1692   preserved_copy_of_name =
1693     tc_canonicalize_symbol_name (preserved_copy_of_name);
1694 #endif
1695
1696   S_SET_NAME (symbolP, preserved_copy_of_name);
1697
1698   S_SET_SEGMENT (symbolP, segment);
1699   S_SET_VALUE (symbolP, valu);
1700   symbol_clear_list_pointers (symbolP);
1701
1702   symbol_set_frag (symbolP, frag);
1703
1704   /* Link to end of symbol chain.  */
1705   {
1706     extern int symbol_table_frozen;
1707
1708     if (symbol_table_frozen)
1709       abort ();
1710   }
1711
1712   symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
1713
1714   obj_symbol_new_hook (symbolP);
1715
1716 #ifdef tc_symbol_new_hook
1717   tc_symbol_new_hook (symbolP);
1718 #endif
1719
1720 #ifdef DEBUG_SYMS
1721   verify_symbol_chain (symbol_rootP, symbol_lastP);
1722 #endif /* DEBUG_SYMS  */
1723 }
1724
1725
1726 static void
1727 s_ltorg (int ignored ATTRIBUTE_UNUSED)
1728 {
1729   unsigned int entry;
1730   literal_pool *pool;
1731   char sym_name[20];
1732   int align;
1733
1734   for (align = 2; align <= 4; align++)
1735     {
1736       int size = 1 << align;
1737
1738       pool = find_literal_pool (size);
1739       if (pool == NULL || pool->symbol == NULL || pool->next_free_entry == 0)
1740         continue;
1741
1742       mapping_state (MAP_DATA);
1743
1744       /* Align pool as you have word accesses.
1745          Only make a frag if we have to.  */
1746       if (!need_pass_2)
1747         frag_align (align, 0, 0);
1748
1749       record_alignment (now_seg, align);
1750
1751       sprintf (sym_name, "$$lit_\002%x", pool->id);
1752
1753       symbol_locate (pool->symbol, sym_name, now_seg,
1754                      (valueT) frag_now_fix (), frag_now);
1755       symbol_table_insert (pool->symbol);
1756
1757       for (entry = 0; entry < pool->next_free_entry; entry++)
1758         {
1759           expressionS * exp = & pool->literals[entry].exp;
1760
1761           if (exp->X_op == O_big)
1762             {
1763               /* PR 16688: Restore the global bignum value.  */
1764               gas_assert (pool->literals[entry].bignum != NULL);
1765               memcpy (generic_bignum, pool->literals[entry].bignum,
1766                       CHARS_PER_LITTLENUM * exp->X_add_number);
1767             }
1768
1769           /* First output the expression in the instruction to the pool.  */
1770           emit_expr (exp, size);        /* .word|.xword  */
1771
1772           if (exp->X_op == O_big)
1773             {
1774               free (pool->literals[entry].bignum);
1775               pool->literals[entry].bignum = NULL;
1776             }
1777         }
1778
1779       /* Mark the pool as empty.  */
1780       pool->next_free_entry = 0;
1781       pool->symbol = NULL;
1782     }
1783 }
1784
1785 #ifdef OBJ_ELF
1786 /* Forward declarations for functions below, in the MD interface
1787    section.  */
1788 static fixS *fix_new_aarch64 (fragS *, int, short, expressionS *, int, int);
1789 static struct reloc_table_entry * find_reloc_table_entry (char **);
1790
1791 /* Directives: Data.  */
1792 /* N.B. the support for relocation suffix in this directive needs to be
1793    implemented properly.  */
1794
1795 static void
1796 s_aarch64_elf_cons (int nbytes)
1797 {
1798   expressionS exp;
1799
1800 #ifdef md_flush_pending_output
1801   md_flush_pending_output ();
1802 #endif
1803
1804   if (is_it_end_of_statement ())
1805     {
1806       demand_empty_rest_of_line ();
1807       return;
1808     }
1809
1810 #ifdef md_cons_align
1811   md_cons_align (nbytes);
1812 #endif
1813
1814   mapping_state (MAP_DATA);
1815   do
1816     {
1817       struct reloc_table_entry *reloc;
1818
1819       expression (&exp);
1820
1821       if (exp.X_op != O_symbol)
1822         emit_expr (&exp, (unsigned int) nbytes);
1823       else
1824         {
1825           skip_past_char (&input_line_pointer, '#');
1826           if (skip_past_char (&input_line_pointer, ':'))
1827             {
1828               reloc = find_reloc_table_entry (&input_line_pointer);
1829               if (reloc == NULL)
1830                 as_bad (_("unrecognized relocation suffix"));
1831               else
1832                 as_bad (_("unimplemented relocation suffix"));
1833               ignore_rest_of_line ();
1834               return;
1835             }
1836           else
1837             emit_expr (&exp, (unsigned int) nbytes);
1838         }
1839     }
1840   while (*input_line_pointer++ == ',');
1841
1842   /* Put terminator back into stream.  */
1843   input_line_pointer--;
1844   demand_empty_rest_of_line ();
1845 }
1846
1847 #endif /* OBJ_ELF */
1848
1849 /* Output a 32-bit word, but mark as an instruction.  */
1850
1851 static void
1852 s_aarch64_inst (int ignored ATTRIBUTE_UNUSED)
1853 {
1854   expressionS exp;
1855
1856 #ifdef md_flush_pending_output
1857   md_flush_pending_output ();
1858 #endif
1859
1860   if (is_it_end_of_statement ())
1861     {
1862       demand_empty_rest_of_line ();
1863       return;
1864     }
1865
1866   if (!need_pass_2)
1867     frag_align_code (2, 0);
1868 #ifdef OBJ_ELF
1869   mapping_state (MAP_INSN);
1870 #endif
1871
1872   do
1873     {
1874       expression (&exp);
1875       if (exp.X_op != O_constant)
1876         {
1877           as_bad (_("constant expression required"));
1878           ignore_rest_of_line ();
1879           return;
1880         }
1881
1882       if (target_big_endian)
1883         {
1884           unsigned int val = exp.X_add_number;
1885           exp.X_add_number = SWAP_32 (val);
1886         }
1887       emit_expr (&exp, 4);
1888     }
1889   while (*input_line_pointer++ == ',');
1890
1891   /* Put terminator back into stream.  */
1892   input_line_pointer--;
1893   demand_empty_rest_of_line ();
1894 }
1895
1896 #ifdef OBJ_ELF
1897 /* Emit BFD_RELOC_AARCH64_TLSDESC_CALL on the next BLR instruction.  */
1898
1899 static void
1900 s_tlsdesccall (int ignored ATTRIBUTE_UNUSED)
1901 {
1902   expressionS exp;
1903
1904   /* Since we're just labelling the code, there's no need to define a
1905      mapping symbol.  */
1906   expression (&exp);
1907   /* Make sure there is enough room in this frag for the following
1908      blr.  This trick only works if the blr follows immediately after
1909      the .tlsdesc directive.  */
1910   frag_grow (4);
1911   fix_new_aarch64 (frag_now, frag_more (0) - frag_now->fr_literal, 4, &exp, 0,
1912                    BFD_RELOC_AARCH64_TLSDESC_CALL);
1913
1914   demand_empty_rest_of_line ();
1915 }
1916 #endif  /* OBJ_ELF */
1917
1918 static void s_aarch64_arch (int);
1919 static void s_aarch64_cpu (int);
1920
1921 /* This table describes all the machine specific pseudo-ops the assembler
1922    has to support.  The fields are:
1923      pseudo-op name without dot
1924      function to call to execute this pseudo-op
1925      Integer arg to pass to the function.  */
1926
1927 const pseudo_typeS md_pseudo_table[] = {
1928   /* Never called because '.req' does not start a line.  */
1929   {"req", s_req, 0},
1930   {"unreq", s_unreq, 0},
1931   {"bss", s_bss, 0},
1932   {"even", s_even, 0},
1933   {"ltorg", s_ltorg, 0},
1934   {"pool", s_ltorg, 0},
1935   {"cpu", s_aarch64_cpu, 0},
1936   {"arch", s_aarch64_arch, 0},
1937   {"inst", s_aarch64_inst, 0},
1938 #ifdef OBJ_ELF
1939   {"tlsdesccall", s_tlsdesccall, 0},
1940   {"word", s_aarch64_elf_cons, 4},
1941   {"long", s_aarch64_elf_cons, 4},
1942   {"xword", s_aarch64_elf_cons, 8},
1943   {"dword", s_aarch64_elf_cons, 8},
1944 #endif
1945   {0, 0, 0}
1946 };
1947 \f
1948
1949 /* Check whether STR points to a register name followed by a comma or the
1950    end of line; REG_TYPE indicates which register types are checked
1951    against.  Return TRUE if STR is such a register name; otherwise return
1952    FALSE.  The function does not intend to produce any diagnostics, but since
1953    the register parser aarch64_reg_parse, which is called by this function,
1954    does produce diagnostics, we call clear_error to clear any diagnostics
1955    that may be generated by aarch64_reg_parse.
1956    Also, the function returns FALSE directly if there is any user error
1957    present at the function entry.  This prevents the existing diagnostics
1958    state from being spoiled.
1959    The function currently serves parse_constant_immediate and
1960    parse_big_immediate only.  */
1961 static bfd_boolean
1962 reg_name_p (char *str, aarch64_reg_type reg_type)
1963 {
1964   int reg;
1965
1966   /* Prevent the diagnostics state from being spoiled.  */
1967   if (error_p ())
1968     return FALSE;
1969
1970   reg = aarch64_reg_parse (&str, reg_type, NULL, NULL);
1971
1972   /* Clear the parsing error that may be set by the reg parser.  */
1973   clear_error ();
1974
1975   if (reg == PARSE_FAIL)
1976     return FALSE;
1977
1978   skip_whitespace (str);
1979   if (*str == ',' || is_end_of_line[(unsigned int) *str])
1980     return TRUE;
1981
1982   return FALSE;
1983 }
1984
1985 /* Parser functions used exclusively in instruction operands.  */
1986
1987 /* Parse an immediate expression which may not be constant.
1988
1989    To prevent the expression parser from pushing a register name
1990    into the symbol table as an undefined symbol, firstly a check is
1991    done to find out whether STR is a valid register name followed
1992    by a comma or the end of line.  Return FALSE if STR is such a
1993    string.  */
1994
1995 static bfd_boolean
1996 parse_immediate_expression (char **str, expressionS *exp)
1997 {
1998   if (reg_name_p (*str, REG_TYPE_R_Z_BHSDQ_V))
1999     {
2000       set_recoverable_error (_("immediate operand required"));
2001       return FALSE;
2002     }
2003
2004   my_get_expression (exp, str, GE_OPT_PREFIX, 1);
2005
2006   if (exp->X_op == O_absent)
2007     {
2008       set_fatal_syntax_error (_("missing immediate expression"));
2009       return FALSE;
2010     }
2011
2012   return TRUE;
2013 }
2014
2015 /* Constant immediate-value read function for use in insn parsing.
2016    STR points to the beginning of the immediate (with the optional
2017    leading #); *VAL receives the value.
2018
2019    Return TRUE on success; otherwise return FALSE.  */
2020
2021 static bfd_boolean
2022 parse_constant_immediate (char **str, int64_t * val)
2023 {
2024   expressionS exp;
2025
2026   if (! parse_immediate_expression (str, &exp))
2027     return FALSE;
2028
2029   if (exp.X_op != O_constant)
2030     {
2031       set_syntax_error (_("constant expression required"));
2032       return FALSE;
2033     }
2034
2035   *val = exp.X_add_number;
2036   return TRUE;
2037 }
2038
2039 static uint32_t
2040 encode_imm_float_bits (uint32_t imm)
2041 {
2042   return ((imm >> 19) & 0x7f)   /* b[25:19] -> b[6:0] */
2043     | ((imm >> (31 - 7)) & 0x80);       /* b[31]    -> b[7]   */
2044 }
2045
2046 /* Return TRUE if the single-precision floating-point value encoded in IMM
2047    can be expressed in the AArch64 8-bit signed floating-point format with
2048    3-bit exponent and normalized 4 bits of precision; in other words, the
2049    floating-point value must be expressable as
2050      (+/-) n / 16 * power (2, r)
2051    where n and r are integers such that 16 <= n <=31 and -3 <= r <= 4.  */
2052
2053 static bfd_boolean
2054 aarch64_imm_float_p (uint32_t imm)
2055 {
2056   /* If a single-precision floating-point value has the following bit
2057      pattern, it can be expressed in the AArch64 8-bit floating-point
2058      format:
2059
2060      3 32222222 2221111111111
2061      1 09876543 21098765432109876543210
2062      n Eeeeeexx xxxx0000000000000000000
2063
2064      where n, e and each x are either 0 or 1 independently, with
2065      E == ~ e.  */
2066
2067   uint32_t pattern;
2068
2069   /* Prepare the pattern for 'Eeeeee'.  */
2070   if (((imm >> 30) & 0x1) == 0)
2071     pattern = 0x3e000000;
2072   else
2073     pattern = 0x40000000;
2074
2075   return (imm & 0x7ffff) == 0           /* lower 19 bits are 0.  */
2076     && ((imm & 0x7e000000) == pattern); /* bits 25 - 29 == ~ bit 30.  */
2077 }
2078
2079 /* Like aarch64_imm_float_p but for a double-precision floating-point value.
2080
2081    Return TRUE if the value encoded in IMM can be expressed in the AArch64
2082    8-bit signed floating-point format with 3-bit exponent and normalized 4
2083    bits of precision (i.e. can be used in an FMOV instruction); return the
2084    equivalent single-precision encoding in *FPWORD.
2085
2086    Otherwise return FALSE.  */
2087
2088 static bfd_boolean
2089 aarch64_double_precision_fmovable (uint64_t imm, uint32_t *fpword)
2090 {
2091   /* If a double-precision floating-point value has the following bit
2092      pattern, it can be expressed in the AArch64 8-bit floating-point
2093      format:
2094
2095      6 66655555555 554444444...21111111111
2096      3 21098765432 109876543...098765432109876543210
2097      n Eeeeeeeeexx xxxx00000...000000000000000000000
2098
2099      where n, e and each x are either 0 or 1 independently, with
2100      E == ~ e.  */
2101
2102   uint32_t pattern;
2103   uint32_t high32 = imm >> 32;
2104
2105   /* Lower 32 bits need to be 0s.  */
2106   if ((imm & 0xffffffff) != 0)
2107     return FALSE;
2108
2109   /* Prepare the pattern for 'Eeeeeeeee'.  */
2110   if (((high32 >> 30) & 0x1) == 0)
2111     pattern = 0x3fc00000;
2112   else
2113     pattern = 0x40000000;
2114
2115   if ((high32 & 0xffff) == 0                    /* bits 32 - 47 are 0.  */
2116       && (high32 & 0x7fc00000) == pattern)      /* bits 54 - 61 == ~ bit 62.  */
2117     {
2118       /* Convert to the single-precision encoding.
2119          i.e. convert
2120            n Eeeeeeeeexx xxxx00000...000000000000000000000
2121          to
2122            n Eeeeeexx xxxx0000000000000000000.  */
2123       *fpword = ((high32 & 0xfe000000)                  /* nEeeeee.  */
2124                  | (((high32 >> 16) & 0x3f) << 19));    /* xxxxxx.  */
2125       return TRUE;
2126     }
2127   else
2128     return FALSE;
2129 }
2130
2131 /* Parse a floating-point immediate.  Return TRUE on success and return the
2132    value in *IMMED in the format of IEEE754 single-precision encoding.
2133    *CCP points to the start of the string; DP_P is TRUE when the immediate
2134    is expected to be in double-precision (N.B. this only matters when
2135    hexadecimal representation is involved).
2136
2137    N.B. 0.0 is accepted by this function.  */
2138
2139 static bfd_boolean
2140 parse_aarch64_imm_float (char **ccp, int *immed, bfd_boolean dp_p)
2141 {
2142   char *str = *ccp;
2143   char *fpnum;
2144   LITTLENUM_TYPE words[MAX_LITTLENUMS];
2145   int found_fpchar = 0;
2146   int64_t val = 0;
2147   unsigned fpword = 0;
2148   bfd_boolean hex_p = FALSE;
2149
2150   skip_past_char (&str, '#');
2151
2152   fpnum = str;
2153   skip_whitespace (fpnum);
2154
2155   if (strncmp (fpnum, "0x", 2) == 0)
2156     {
2157       /* Support the hexadecimal representation of the IEEE754 encoding.
2158          Double-precision is expected when DP_P is TRUE, otherwise the
2159          representation should be in single-precision.  */
2160       if (! parse_constant_immediate (&str, &val))
2161         goto invalid_fp;
2162
2163       if (dp_p)
2164         {
2165           if (! aarch64_double_precision_fmovable (val, &fpword))
2166             goto invalid_fp;
2167         }
2168       else if ((uint64_t) val > 0xffffffff)
2169         goto invalid_fp;
2170       else
2171         fpword = val;
2172
2173       hex_p = TRUE;
2174     }
2175   else
2176     {
2177       /* We must not accidentally parse an integer as a floating-point number.
2178          Make sure that the value we parse is not an integer by checking for
2179          special characters '.' or 'e'.  */
2180       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
2181         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
2182           {
2183             found_fpchar = 1;
2184             break;
2185           }
2186
2187       if (!found_fpchar)
2188         return FALSE;
2189     }
2190
2191   if (! hex_p)
2192     {
2193       int i;
2194
2195       if ((str = atof_ieee (str, 's', words)) == NULL)
2196         goto invalid_fp;
2197
2198       /* Our FP word must be 32 bits (single-precision FP).  */
2199       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
2200         {
2201           fpword <<= LITTLENUM_NUMBER_OF_BITS;
2202           fpword |= words[i];
2203         }
2204     }
2205
2206   if (aarch64_imm_float_p (fpword) || (fpword & 0x7fffffff) == 0)
2207     {
2208       *immed = fpword;
2209       *ccp = str;
2210       return TRUE;
2211     }
2212
2213 invalid_fp:
2214   set_fatal_syntax_error (_("invalid floating-point constant"));
2215   return FALSE;
2216 }
2217
2218 /* Less-generic immediate-value read function with the possibility of loading
2219    a big (64-bit) immediate, as required by AdvSIMD Modified immediate
2220    instructions.
2221
2222    To prevent the expression parser from pushing a register name into the
2223    symbol table as an undefined symbol, a check is firstly done to find
2224    out whether STR is a valid register name followed by a comma or the end
2225    of line.  Return FALSE if STR is such a register.  */
2226
2227 static bfd_boolean
2228 parse_big_immediate (char **str, int64_t *imm)
2229 {
2230   char *ptr = *str;
2231
2232   if (reg_name_p (ptr, REG_TYPE_R_Z_BHSDQ_V))
2233     {
2234       set_syntax_error (_("immediate operand required"));
2235       return FALSE;
2236     }
2237
2238   my_get_expression (&inst.reloc.exp, &ptr, GE_OPT_PREFIX, 1);
2239
2240   if (inst.reloc.exp.X_op == O_constant)
2241     *imm = inst.reloc.exp.X_add_number;
2242
2243   *str = ptr;
2244
2245   return TRUE;
2246 }
2247
2248 /* Set operand IDX of the *INSTR that needs a GAS internal fixup.
2249    if NEED_LIBOPCODES is non-zero, the fixup will need
2250    assistance from the libopcodes.   */
2251
2252 static inline void
2253 aarch64_set_gas_internal_fixup (struct reloc *reloc,
2254                                 const aarch64_opnd_info *operand,
2255                                 int need_libopcodes_p)
2256 {
2257   reloc->type = BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP;
2258   reloc->opnd = operand->type;
2259   if (need_libopcodes_p)
2260     reloc->need_libopcodes_p = 1;
2261 };
2262
2263 /* Return TRUE if the instruction needs to be fixed up later internally by
2264    the GAS; otherwise return FALSE.  */
2265
2266 static inline bfd_boolean
2267 aarch64_gas_internal_fixup_p (void)
2268 {
2269   return inst.reloc.type == BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP;
2270 }
2271
2272 /* Assign the immediate value to the relavant field in *OPERAND if
2273    RELOC->EXP is a constant expression; otherwise, flag that *OPERAND
2274    needs an internal fixup in a later stage.
2275    ADDR_OFF_P determines whether it is the field ADDR.OFFSET.IMM or
2276    IMM.VALUE that may get assigned with the constant.  */
2277 static inline void
2278 assign_imm_if_const_or_fixup_later (struct reloc *reloc,
2279                                     aarch64_opnd_info *operand,
2280                                     int addr_off_p,
2281                                     int need_libopcodes_p,
2282                                     int skip_p)
2283 {
2284   if (reloc->exp.X_op == O_constant)
2285     {
2286       if (addr_off_p)
2287         operand->addr.offset.imm = reloc->exp.X_add_number;
2288       else
2289         operand->imm.value = reloc->exp.X_add_number;
2290       reloc->type = BFD_RELOC_UNUSED;
2291     }
2292   else
2293     {
2294       aarch64_set_gas_internal_fixup (reloc, operand, need_libopcodes_p);
2295       /* Tell libopcodes to ignore this operand or not.  This is helpful
2296          when one of the operands needs to be fixed up later but we need
2297          libopcodes to check the other operands.  */
2298       operand->skip = skip_p;
2299     }
2300 }
2301
2302 /* Relocation modifiers.  Each entry in the table contains the textual
2303    name for the relocation which may be placed before a symbol used as
2304    a load/store offset, or add immediate. It must be surrounded by a
2305    leading and trailing colon, for example:
2306
2307         ldr     x0, [x1, #:rello:varsym]
2308         add     x0, x1, #:rello:varsym  */
2309
2310 struct reloc_table_entry
2311 {
2312   const char *name;
2313   int pc_rel;
2314   bfd_reloc_code_real_type adrp_type;
2315   bfd_reloc_code_real_type movw_type;
2316   bfd_reloc_code_real_type add_type;
2317   bfd_reloc_code_real_type ldst_type;
2318 };
2319
2320 static struct reloc_table_entry reloc_table[] = {
2321   /* Low 12 bits of absolute address: ADD/i and LDR/STR */
2322   {"lo12", 0,
2323    0,
2324    0,
2325    BFD_RELOC_AARCH64_ADD_LO12,
2326    BFD_RELOC_AARCH64_LDST_LO12},
2327
2328   /* Higher 21 bits of pc-relative page offset: ADRP */
2329   {"pg_hi21", 1,
2330    BFD_RELOC_AARCH64_ADR_HI21_PCREL,
2331    0,
2332    0,
2333    0},
2334
2335   /* Higher 21 bits of pc-relative page offset: ADRP, no check */
2336   {"pg_hi21_nc", 1,
2337    BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL,
2338    0,
2339    0,
2340    0},
2341
2342   /* Most significant bits 0-15 of unsigned address/value: MOVZ */
2343   {"abs_g0", 0,
2344    0,
2345    BFD_RELOC_AARCH64_MOVW_G0,
2346    0,
2347    0},
2348
2349   /* Most significant bits 0-15 of signed address/value: MOVN/Z */
2350   {"abs_g0_s", 0,
2351    0,
2352    BFD_RELOC_AARCH64_MOVW_G0_S,
2353    0,
2354    0},
2355
2356   /* Less significant bits 0-15 of address/value: MOVK, no check */
2357   {"abs_g0_nc", 0,
2358    0,
2359    BFD_RELOC_AARCH64_MOVW_G0_NC,
2360    0,
2361    0},
2362
2363   /* Most significant bits 16-31 of unsigned address/value: MOVZ */
2364   {"abs_g1", 0,
2365    0,
2366    BFD_RELOC_AARCH64_MOVW_G1,
2367    0,
2368    0},
2369
2370   /* Most significant bits 16-31 of signed address/value: MOVN/Z */
2371   {"abs_g1_s", 0,
2372    0,
2373    BFD_RELOC_AARCH64_MOVW_G1_S,
2374    0,
2375    0},
2376
2377   /* Less significant bits 16-31 of address/value: MOVK, no check */
2378   {"abs_g1_nc", 0,
2379    0,
2380    BFD_RELOC_AARCH64_MOVW_G1_NC,
2381    0,
2382    0},
2383
2384   /* Most significant bits 32-47 of unsigned address/value: MOVZ */
2385   {"abs_g2", 0,
2386    0,
2387    BFD_RELOC_AARCH64_MOVW_G2,
2388    0,
2389    0},
2390
2391   /* Most significant bits 32-47 of signed address/value: MOVN/Z */
2392   {"abs_g2_s", 0,
2393    0,
2394    BFD_RELOC_AARCH64_MOVW_G2_S,
2395    0,
2396    0},
2397
2398   /* Less significant bits 32-47 of address/value: MOVK, no check */
2399   {"abs_g2_nc", 0,
2400    0,
2401    BFD_RELOC_AARCH64_MOVW_G2_NC,
2402    0,
2403    0},
2404
2405   /* Most significant bits 48-63 of signed/unsigned address/value: MOVZ */
2406   {"abs_g3", 0,
2407    0,
2408    BFD_RELOC_AARCH64_MOVW_G3,
2409    0,
2410    0},
2411
2412   /* Get to the page containing GOT entry for a symbol.  */
2413   {"got", 1,
2414    BFD_RELOC_AARCH64_ADR_GOT_PAGE,
2415    0,
2416    0,
2417    BFD_RELOC_AARCH64_GOT_LD_PREL19},
2418
2419   /* 12 bit offset into the page containing GOT entry for that symbol.  */
2420   {"got_lo12", 0,
2421    0,
2422    0,
2423    0,
2424    BFD_RELOC_AARCH64_LD_GOT_LO12_NC},
2425
2426   /* Get to the page containing GOT TLS entry for a symbol */
2427   {"tlsgd", 0,
2428    BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21,
2429    0,
2430    0,
2431    0},
2432
2433   /* 12 bit offset into the page containing GOT TLS entry for a symbol */
2434   {"tlsgd_lo12", 0,
2435    0,
2436    0,
2437    BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC,
2438    0},
2439
2440   /* Get to the page containing GOT TLS entry for a symbol */
2441   {"tlsdesc", 0,
2442    BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21,
2443    0,
2444    0,
2445    0},
2446
2447   /* 12 bit offset into the page containing GOT TLS entry for a symbol */
2448   {"tlsdesc_lo12", 0,
2449    0,
2450    0,
2451    BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC,
2452    BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC},
2453
2454   /* Get to the page containing GOT TLS entry for a symbol */
2455   {"gottprel", 0,
2456    BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21,
2457    0,
2458    0,
2459    0},
2460
2461   /* 12 bit offset into the page containing GOT TLS entry for a symbol */
2462   {"gottprel_lo12", 0,
2463    0,
2464    0,
2465    0,
2466    BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC},
2467
2468   /* Get tp offset for a symbol.  */
2469   {"tprel", 0,
2470    0,
2471    0,
2472    BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12,
2473    0},
2474
2475   /* Get tp offset for a symbol.  */
2476   {"tprel_lo12", 0,
2477    0,
2478    0,
2479    BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12,
2480    0},
2481
2482   /* Get tp offset for a symbol.  */
2483   {"tprel_hi12", 0,
2484    0,
2485    0,
2486    BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12,
2487    0},
2488
2489   /* Get tp offset for a symbol.  */
2490   {"tprel_lo12_nc", 0,
2491    0,
2492    0,
2493    BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC,
2494    0},
2495
2496   /* Most significant bits 32-47 of address/value: MOVZ.  */
2497   {"tprel_g2", 0,
2498    0,
2499    BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2,
2500    0,
2501    0},
2502
2503   /* Most significant bits 16-31 of address/value: MOVZ.  */
2504   {"tprel_g1", 0,
2505    0,
2506    BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1,
2507    0,
2508    0},
2509
2510   /* Most significant bits 16-31 of address/value: MOVZ, no check.  */
2511   {"tprel_g1_nc", 0,
2512    0,
2513    BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC,
2514    0,
2515    0},
2516
2517   /* Most significant bits 0-15 of address/value: MOVZ.  */
2518   {"tprel_g0", 0,
2519    0,
2520    BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0,
2521    0,
2522    0},
2523
2524   /* Most significant bits 0-15 of address/value: MOVZ, no check.  */
2525   {"tprel_g0_nc", 0,
2526    0,
2527    BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC,
2528    0,
2529    0},
2530 };
2531
2532 /* Given the address of a pointer pointing to the textual name of a
2533    relocation as may appear in assembler source, attempt to find its
2534    details in reloc_table.  The pointer will be updated to the character
2535    after the trailing colon.  On failure, NULL will be returned;
2536    otherwise return the reloc_table_entry.  */
2537
2538 static struct reloc_table_entry *
2539 find_reloc_table_entry (char **str)
2540 {
2541   unsigned int i;
2542   for (i = 0; i < ARRAY_SIZE (reloc_table); i++)
2543     {
2544       int length = strlen (reloc_table[i].name);
2545
2546       if (strncasecmp (reloc_table[i].name, *str, length) == 0
2547           && (*str)[length] == ':')
2548         {
2549           *str += (length + 1);
2550           return &reloc_table[i];
2551         }
2552     }
2553
2554   return NULL;
2555 }
2556
2557 /* Mode argument to parse_shift and parser_shifter_operand.  */
2558 enum parse_shift_mode
2559 {
2560   SHIFTED_ARITH_IMM,            /* "rn{,lsl|lsr|asl|asr|uxt|sxt #n}" or
2561                                    "#imm{,lsl #n}"  */
2562   SHIFTED_LOGIC_IMM,            /* "rn{,lsl|lsr|asl|asr|ror #n}" or
2563                                    "#imm"  */
2564   SHIFTED_LSL,                  /* bare "lsl #n"  */
2565   SHIFTED_LSL_MSL,              /* "lsl|msl #n"  */
2566   SHIFTED_REG_OFFSET            /* [su]xtw|sxtx {#n} or lsl #n  */
2567 };
2568
2569 /* Parse a <shift> operator on an AArch64 data processing instruction.
2570    Return TRUE on success; otherwise return FALSE.  */
2571 static bfd_boolean
2572 parse_shift (char **str, aarch64_opnd_info *operand, enum parse_shift_mode mode)
2573 {
2574   const struct aarch64_name_value_pair *shift_op;
2575   enum aarch64_modifier_kind kind;
2576   expressionS exp;
2577   int exp_has_prefix;
2578   char *s = *str;
2579   char *p = s;
2580
2581   for (p = *str; ISALPHA (*p); p++)
2582     ;
2583
2584   if (p == *str)
2585     {
2586       set_syntax_error (_("shift expression expected"));
2587       return FALSE;
2588     }
2589
2590   shift_op = hash_find_n (aarch64_shift_hsh, *str, p - *str);
2591
2592   if (shift_op == NULL)
2593     {
2594       set_syntax_error (_("shift operator expected"));
2595       return FALSE;
2596     }
2597
2598   kind = aarch64_get_operand_modifier (shift_op);
2599
2600   if (kind == AARCH64_MOD_MSL && mode != SHIFTED_LSL_MSL)
2601     {
2602       set_syntax_error (_("invalid use of 'MSL'"));
2603       return FALSE;
2604     }
2605
2606   switch (mode)
2607     {
2608     case SHIFTED_LOGIC_IMM:
2609       if (aarch64_extend_operator_p (kind) == TRUE)
2610         {
2611           set_syntax_error (_("extending shift is not permitted"));
2612           return FALSE;
2613         }
2614       break;
2615
2616     case SHIFTED_ARITH_IMM:
2617       if (kind == AARCH64_MOD_ROR)
2618         {
2619           set_syntax_error (_("'ROR' shift is not permitted"));
2620           return FALSE;
2621         }
2622       break;
2623
2624     case SHIFTED_LSL:
2625       if (kind != AARCH64_MOD_LSL)
2626         {
2627           set_syntax_error (_("only 'LSL' shift is permitted"));
2628           return FALSE;
2629         }
2630       break;
2631
2632     case SHIFTED_REG_OFFSET:
2633       if (kind != AARCH64_MOD_UXTW && kind != AARCH64_MOD_LSL
2634           && kind != AARCH64_MOD_SXTW && kind != AARCH64_MOD_SXTX)
2635         {
2636           set_fatal_syntax_error
2637             (_("invalid shift for the register offset addressing mode"));
2638           return FALSE;
2639         }
2640       break;
2641
2642     case SHIFTED_LSL_MSL:
2643       if (kind != AARCH64_MOD_LSL && kind != AARCH64_MOD_MSL)
2644         {
2645           set_syntax_error (_("invalid shift operator"));
2646           return FALSE;
2647         }
2648       break;
2649
2650     default:
2651       abort ();
2652     }
2653
2654   /* Whitespace can appear here if the next thing is a bare digit.  */
2655   skip_whitespace (p);
2656
2657   /* Parse shift amount.  */
2658   exp_has_prefix = 0;
2659   if (mode == SHIFTED_REG_OFFSET && *p == ']')
2660     exp.X_op = O_absent;
2661   else
2662     {
2663       if (is_immediate_prefix (*p))
2664         {
2665           p++;
2666           exp_has_prefix = 1;
2667         }
2668       my_get_expression (&exp, &p, GE_NO_PREFIX, 0);
2669     }
2670   if (exp.X_op == O_absent)
2671     {
2672       if (aarch64_extend_operator_p (kind) == FALSE || exp_has_prefix)
2673         {
2674           set_syntax_error (_("missing shift amount"));
2675           return FALSE;
2676         }
2677       operand->shifter.amount = 0;
2678     }
2679   else if (exp.X_op != O_constant)
2680     {
2681       set_syntax_error (_("constant shift amount required"));
2682       return FALSE;
2683     }
2684   else if (exp.X_add_number < 0 || exp.X_add_number > 63)
2685     {
2686       set_fatal_syntax_error (_("shift amount out of range 0 to 63"));
2687       return FALSE;
2688     }
2689   else
2690     {
2691       operand->shifter.amount = exp.X_add_number;
2692       operand->shifter.amount_present = 1;
2693     }
2694
2695   operand->shifter.operator_present = 1;
2696   operand->shifter.kind = kind;
2697
2698   *str = p;
2699   return TRUE;
2700 }
2701
2702 /* Parse a <shifter_operand> for a data processing instruction:
2703
2704       #<immediate>
2705       #<immediate>, LSL #imm
2706
2707    Validation of immediate operands is deferred to md_apply_fix.
2708
2709    Return TRUE on success; otherwise return FALSE.  */
2710
2711 static bfd_boolean
2712 parse_shifter_operand_imm (char **str, aarch64_opnd_info *operand,
2713                            enum parse_shift_mode mode)
2714 {
2715   char *p;
2716
2717   if (mode != SHIFTED_ARITH_IMM && mode != SHIFTED_LOGIC_IMM)
2718     return FALSE;
2719
2720   p = *str;
2721
2722   /* Accept an immediate expression.  */
2723   if (! my_get_expression (&inst.reloc.exp, &p, GE_OPT_PREFIX, 1))
2724     return FALSE;
2725
2726   /* Accept optional LSL for arithmetic immediate values.  */
2727   if (mode == SHIFTED_ARITH_IMM && skip_past_comma (&p))
2728     if (! parse_shift (&p, operand, SHIFTED_LSL))
2729       return FALSE;
2730
2731   /* Not accept any shifter for logical immediate values.  */
2732   if (mode == SHIFTED_LOGIC_IMM && skip_past_comma (&p)
2733       && parse_shift (&p, operand, mode))
2734     {
2735       set_syntax_error (_("unexpected shift operator"));
2736       return FALSE;
2737     }
2738
2739   *str = p;
2740   return TRUE;
2741 }
2742
2743 /* Parse a <shifter_operand> for a data processing instruction:
2744
2745       <Rm>
2746       <Rm>, <shift>
2747       #<immediate>
2748       #<immediate>, LSL #imm
2749
2750    where <shift> is handled by parse_shift above, and the last two
2751    cases are handled by the function above.
2752
2753    Validation of immediate operands is deferred to md_apply_fix.
2754
2755    Return TRUE on success; otherwise return FALSE.  */
2756
2757 static bfd_boolean
2758 parse_shifter_operand (char **str, aarch64_opnd_info *operand,
2759                        enum parse_shift_mode mode)
2760 {
2761   int reg;
2762   int isreg32, isregzero;
2763   enum aarch64_operand_class opd_class
2764     = aarch64_get_operand_class (operand->type);
2765
2766   if ((reg =
2767        aarch64_reg_parse_32_64 (str, 0, 0, &isreg32, &isregzero)) != PARSE_FAIL)
2768     {
2769       if (opd_class == AARCH64_OPND_CLASS_IMMEDIATE)
2770         {
2771           set_syntax_error (_("unexpected register in the immediate operand"));
2772           return FALSE;
2773         }
2774
2775       if (!isregzero && reg == REG_SP)
2776         {
2777           set_syntax_error (BAD_SP);
2778           return FALSE;
2779         }
2780
2781       operand->reg.regno = reg;
2782       operand->qualifier = isreg32 ? AARCH64_OPND_QLF_W : AARCH64_OPND_QLF_X;
2783
2784       /* Accept optional shift operation on register.  */
2785       if (! skip_past_comma (str))
2786         return TRUE;
2787
2788       if (! parse_shift (str, operand, mode))
2789         return FALSE;
2790
2791       return TRUE;
2792     }
2793   else if (opd_class == AARCH64_OPND_CLASS_MODIFIED_REG)
2794     {
2795       set_syntax_error
2796         (_("integer register expected in the extended/shifted operand "
2797            "register"));
2798       return FALSE;
2799     }
2800
2801   /* We have a shifted immediate variable.  */
2802   return parse_shifter_operand_imm (str, operand, mode);
2803 }
2804
2805 /* Return TRUE on success; return FALSE otherwise.  */
2806
2807 static bfd_boolean
2808 parse_shifter_operand_reloc (char **str, aarch64_opnd_info *operand,
2809                              enum parse_shift_mode mode)
2810 {
2811   char *p = *str;
2812
2813   /* Determine if we have the sequence of characters #: or just :
2814      coming next.  If we do, then we check for a :rello: relocation
2815      modifier.  If we don't, punt the whole lot to
2816      parse_shifter_operand.  */
2817
2818   if ((p[0] == '#' && p[1] == ':') || p[0] == ':')
2819     {
2820       struct reloc_table_entry *entry;
2821
2822       if (p[0] == '#')
2823         p += 2;
2824       else
2825         p++;
2826       *str = p;
2827
2828       /* Try to parse a relocation.  Anything else is an error.  */
2829       if (!(entry = find_reloc_table_entry (str)))
2830         {
2831           set_syntax_error (_("unknown relocation modifier"));
2832           return FALSE;
2833         }
2834
2835       if (entry->add_type == 0)
2836         {
2837           set_syntax_error
2838             (_("this relocation modifier is not allowed on this instruction"));
2839           return FALSE;
2840         }
2841
2842       /* Save str before we decompose it.  */
2843       p = *str;
2844
2845       /* Next, we parse the expression.  */
2846       if (! my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX, 1))
2847         return FALSE;
2848
2849       /* Record the relocation type (use the ADD variant here).  */
2850       inst.reloc.type = entry->add_type;
2851       inst.reloc.pc_rel = entry->pc_rel;
2852
2853       /* If str is empty, we've reached the end, stop here.  */
2854       if (**str == '\0')
2855         return TRUE;
2856
2857       /* Otherwise, we have a shifted reloc modifier, so rewind to
2858          recover the variable name and continue parsing for the shifter.  */
2859       *str = p;
2860       return parse_shifter_operand_imm (str, operand, mode);
2861     }
2862
2863   return parse_shifter_operand (str, operand, mode);
2864 }
2865
2866 /* Parse all forms of an address expression.  Information is written
2867    to *OPERAND and/or inst.reloc.
2868
2869    The A64 instruction set has the following addressing modes:
2870
2871    Offset
2872      [base]                     // in SIMD ld/st structure
2873      [base{,#0}]                // in ld/st exclusive
2874      [base{,#imm}]
2875      [base,Xm{,LSL #imm}]
2876      [base,Xm,SXTX {#imm}]
2877      [base,Wm,(S|U)XTW {#imm}]
2878    Pre-indexed
2879      [base,#imm]!
2880    Post-indexed
2881      [base],#imm
2882      [base],Xm                  // in SIMD ld/st structure
2883    PC-relative (literal)
2884      label
2885      =immediate
2886
2887    (As a convenience, the notation "=immediate" is permitted in conjunction
2888    with the pc-relative literal load instructions to automatically place an
2889    immediate value or symbolic address in a nearby literal pool and generate
2890    a hidden label which references it.)
2891
2892    Upon a successful parsing, the address structure in *OPERAND will be
2893    filled in the following way:
2894
2895      .base_regno = <base>
2896      .offset.is_reg     // 1 if the offset is a register
2897      .offset.imm = <imm>
2898      .offset.regno = <Rm>
2899
2900    For different addressing modes defined in the A64 ISA:
2901
2902    Offset
2903      .pcrel=0; .preind=1; .postind=0; .writeback=0
2904    Pre-indexed
2905      .pcrel=0; .preind=1; .postind=0; .writeback=1
2906    Post-indexed
2907      .pcrel=0; .preind=0; .postind=1; .writeback=1
2908    PC-relative (literal)
2909      .pcrel=1; .preind=1; .postind=0; .writeback=0
2910
2911    The shift/extension information, if any, will be stored in .shifter.
2912
2913    It is the caller's responsibility to check for addressing modes not
2914    supported by the instruction, and to set inst.reloc.type.  */
2915
2916 static bfd_boolean
2917 parse_address_main (char **str, aarch64_opnd_info *operand, int reloc,
2918                     int accept_reg_post_index)
2919 {
2920   char *p = *str;
2921   int reg;
2922   int isreg32, isregzero;
2923   expressionS *exp = &inst.reloc.exp;
2924
2925   if (! skip_past_char (&p, '['))
2926     {
2927       /* =immediate or label.  */
2928       operand->addr.pcrel = 1;
2929       operand->addr.preind = 1;
2930
2931       /* #:<reloc_op>:<symbol>  */
2932       skip_past_char (&p, '#');
2933       if (reloc && skip_past_char (&p, ':'))
2934         {
2935           struct reloc_table_entry *entry;
2936
2937           /* Try to parse a relocation modifier.  Anything else is
2938              an error.  */
2939           entry = find_reloc_table_entry (&p);
2940           if (! entry)
2941             {
2942               set_syntax_error (_("unknown relocation modifier"));
2943               return FALSE;
2944             }
2945
2946           if (entry->ldst_type == 0)
2947             {
2948               set_syntax_error
2949                 (_("this relocation modifier is not allowed on this "
2950                    "instruction"));
2951               return FALSE;
2952             }
2953
2954           /* #:<reloc_op>:  */
2955           if (! my_get_expression (exp, &p, GE_NO_PREFIX, 1))
2956             {
2957               set_syntax_error (_("invalid relocation expression"));
2958               return FALSE;
2959             }
2960
2961           /* #:<reloc_op>:<expr>  */
2962           /* Record the load/store relocation type.  */
2963           inst.reloc.type = entry->ldst_type;
2964           inst.reloc.pc_rel = entry->pc_rel;
2965         }
2966       else
2967         {
2968
2969           if (skip_past_char (&p, '='))
2970             /* =immediate; need to generate the literal in the literal pool. */
2971             inst.gen_lit_pool = 1;
2972
2973           if (!my_get_expression (exp, &p, GE_NO_PREFIX, 1))
2974             {
2975               set_syntax_error (_("invalid address"));
2976               return FALSE;
2977             }
2978         }
2979
2980       *str = p;
2981       return TRUE;
2982     }
2983
2984   /* [ */
2985
2986   /* Accept SP and reject ZR */
2987   reg = aarch64_reg_parse_32_64 (&p, 0, 1, &isreg32, &isregzero);
2988   if (reg == PARSE_FAIL || isreg32)
2989     {
2990       set_syntax_error (_(get_reg_expected_msg (REG_TYPE_R_64)));
2991       return FALSE;
2992     }
2993   operand->addr.base_regno = reg;
2994
2995   /* [Xn */
2996   if (skip_past_comma (&p))
2997     {
2998       /* [Xn, */
2999       operand->addr.preind = 1;
3000
3001       /* Reject SP and accept ZR */
3002       reg = aarch64_reg_parse_32_64 (&p, 1, 0, &isreg32, &isregzero);
3003       if (reg != PARSE_FAIL)
3004         {
3005           /* [Xn,Rm  */
3006           operand->addr.offset.regno = reg;
3007           operand->addr.offset.is_reg = 1;
3008           /* Shifted index.  */
3009           if (skip_past_comma (&p))
3010             {
3011               /* [Xn,Rm,  */
3012               if (! parse_shift (&p, operand, SHIFTED_REG_OFFSET))
3013                 /* Use the diagnostics set in parse_shift, so not set new
3014                    error message here.  */
3015                 return FALSE;
3016             }
3017           /* We only accept:
3018              [base,Xm{,LSL #imm}]
3019              [base,Xm,SXTX {#imm}]
3020              [base,Wm,(S|U)XTW {#imm}]  */
3021           if (operand->shifter.kind == AARCH64_MOD_NONE
3022               || operand->shifter.kind == AARCH64_MOD_LSL
3023               || operand->shifter.kind == AARCH64_MOD_SXTX)
3024             {
3025               if (isreg32)
3026                 {
3027                   set_syntax_error (_("invalid use of 32-bit register offset"));
3028                   return FALSE;
3029                 }
3030             }
3031           else if (!isreg32)
3032             {
3033               set_syntax_error (_("invalid use of 64-bit register offset"));
3034               return FALSE;
3035             }
3036         }
3037       else
3038         {
3039           /* [Xn,#:<reloc_op>:<symbol>  */
3040           skip_past_char (&p, '#');
3041           if (reloc && skip_past_char (&p, ':'))
3042             {
3043               struct reloc_table_entry *entry;
3044
3045               /* Try to parse a relocation modifier.  Anything else is
3046                  an error.  */
3047               if (!(entry = find_reloc_table_entry (&p)))
3048                 {
3049                   set_syntax_error (_("unknown relocation modifier"));
3050                   return FALSE;
3051                 }
3052
3053               if (entry->ldst_type == 0)
3054                 {
3055                   set_syntax_error
3056                     (_("this relocation modifier is not allowed on this "
3057                        "instruction"));
3058                   return FALSE;
3059                 }
3060
3061               /* [Xn,#:<reloc_op>:  */
3062               /* We now have the group relocation table entry corresponding to
3063                  the name in the assembler source.  Next, we parse the
3064                  expression.  */
3065               if (! my_get_expression (exp, &p, GE_NO_PREFIX, 1))
3066                 {
3067                   set_syntax_error (_("invalid relocation expression"));
3068                   return FALSE;
3069                 }
3070
3071               /* [Xn,#:<reloc_op>:<expr>  */
3072               /* Record the load/store relocation type.  */
3073               inst.reloc.type = entry->ldst_type;
3074               inst.reloc.pc_rel = entry->pc_rel;
3075             }
3076           else if (! my_get_expression (exp, &p, GE_OPT_PREFIX, 1))
3077             {
3078               set_syntax_error (_("invalid expression in the address"));
3079               return FALSE;
3080             }
3081           /* [Xn,<expr>  */
3082         }
3083     }
3084
3085   if (! skip_past_char (&p, ']'))
3086     {
3087       set_syntax_error (_("']' expected"));
3088       return FALSE;
3089     }
3090
3091   if (skip_past_char (&p, '!'))
3092     {
3093       if (operand->addr.preind && operand->addr.offset.is_reg)
3094         {
3095           set_syntax_error (_("register offset not allowed in pre-indexed "
3096                               "addressing mode"));
3097           return FALSE;
3098         }
3099       /* [Xn]! */
3100       operand->addr.writeback = 1;
3101     }
3102   else if (skip_past_comma (&p))
3103     {
3104       /* [Xn], */
3105       operand->addr.postind = 1;
3106       operand->addr.writeback = 1;
3107
3108       if (operand->addr.preind)
3109         {
3110           set_syntax_error (_("cannot combine pre- and post-indexing"));
3111           return FALSE;
3112         }
3113
3114       if (accept_reg_post_index
3115           && (reg = aarch64_reg_parse_32_64 (&p, 1, 1, &isreg32,
3116                                              &isregzero)) != PARSE_FAIL)
3117         {
3118           /* [Xn],Xm */
3119           if (isreg32)
3120             {
3121               set_syntax_error (_("invalid 32-bit register offset"));
3122               return FALSE;
3123             }
3124           operand->addr.offset.regno = reg;
3125           operand->addr.offset.is_reg = 1;
3126         }
3127       else if (! my_get_expression (exp, &p, GE_OPT_PREFIX, 1))
3128         {
3129           /* [Xn],#expr */
3130           set_syntax_error (_("invalid expression in the address"));
3131           return FALSE;
3132         }
3133     }
3134
3135   /* If at this point neither .preind nor .postind is set, we have a
3136      bare [Rn]{!}; reject [Rn]! but accept [Rn] as a shorthand for [Rn,#0].  */
3137   if (operand->addr.preind == 0 && operand->addr.postind == 0)
3138     {
3139       if (operand->addr.writeback)
3140         {
3141           /* Reject [Rn]!   */
3142           set_syntax_error (_("missing offset in the pre-indexed address"));
3143           return FALSE;
3144         }
3145       operand->addr.preind = 1;
3146       inst.reloc.exp.X_op = O_constant;
3147       inst.reloc.exp.X_add_number = 0;
3148     }
3149
3150   *str = p;
3151   return TRUE;
3152 }
3153
3154 /* Return TRUE on success; otherwise return FALSE.  */
3155 static bfd_boolean
3156 parse_address (char **str, aarch64_opnd_info *operand,
3157                int accept_reg_post_index)
3158 {
3159   return parse_address_main (str, operand, 0, accept_reg_post_index);
3160 }
3161
3162 /* Return TRUE on success; otherwise return FALSE.  */
3163 static bfd_boolean
3164 parse_address_reloc (char **str, aarch64_opnd_info *operand)
3165 {
3166   return parse_address_main (str, operand, 1, 0);
3167 }
3168
3169 /* Parse an operand for a MOVZ, MOVN or MOVK instruction.
3170    Return TRUE on success; otherwise return FALSE.  */
3171 static bfd_boolean
3172 parse_half (char **str, int *internal_fixup_p)
3173 {
3174   char *p, *saved;
3175   int dummy;
3176
3177   p = *str;
3178   skip_past_char (&p, '#');
3179
3180   gas_assert (internal_fixup_p);
3181   *internal_fixup_p = 0;
3182
3183   if (*p == ':')
3184     {
3185       struct reloc_table_entry *entry;
3186
3187       /* Try to parse a relocation.  Anything else is an error.  */
3188       ++p;
3189       if (!(entry = find_reloc_table_entry (&p)))
3190         {
3191           set_syntax_error (_("unknown relocation modifier"));
3192           return FALSE;
3193         }
3194
3195       if (entry->movw_type == 0)
3196         {
3197           set_syntax_error
3198             (_("this relocation modifier is not allowed on this instruction"));
3199           return FALSE;
3200         }
3201
3202       inst.reloc.type = entry->movw_type;
3203     }
3204   else
3205     *internal_fixup_p = 1;
3206
3207   /* Avoid parsing a register as a general symbol.  */
3208   saved = p;
3209   if (aarch64_reg_parse_32_64 (&p, 0, 0, &dummy, &dummy) != PARSE_FAIL)
3210     return FALSE;
3211   p = saved;
3212
3213   if (! my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, 1))
3214     return FALSE;
3215
3216   *str = p;
3217   return TRUE;
3218 }
3219
3220 /* Parse an operand for an ADRP instruction:
3221      ADRP <Xd>, <label>
3222    Return TRUE on success; otherwise return FALSE.  */
3223
3224 static bfd_boolean
3225 parse_adrp (char **str)
3226 {
3227   char *p;
3228
3229   p = *str;
3230   if (*p == ':')
3231     {
3232       struct reloc_table_entry *entry;
3233
3234       /* Try to parse a relocation.  Anything else is an error.  */
3235       ++p;
3236       if (!(entry = find_reloc_table_entry (&p)))
3237         {
3238           set_syntax_error (_("unknown relocation modifier"));
3239           return FALSE;
3240         }
3241
3242       if (entry->adrp_type == 0)
3243         {
3244           set_syntax_error
3245             (_("this relocation modifier is not allowed on this instruction"));
3246           return FALSE;
3247         }
3248
3249       inst.reloc.type = entry->adrp_type;
3250     }
3251   else
3252     inst.reloc.type = BFD_RELOC_AARCH64_ADR_HI21_PCREL;
3253
3254   inst.reloc.pc_rel = 1;
3255
3256   if (! my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, 1))
3257     return FALSE;
3258
3259   *str = p;
3260   return TRUE;
3261 }
3262
3263 /* Miscellaneous. */
3264
3265 /* Parse an option for a preload instruction.  Returns the encoding for the
3266    option, or PARSE_FAIL.  */
3267
3268 static int
3269 parse_pldop (char **str)
3270 {
3271   char *p, *q;
3272   const struct aarch64_name_value_pair *o;
3273
3274   p = q = *str;
3275   while (ISALNUM (*q))
3276     q++;
3277
3278   o = hash_find_n (aarch64_pldop_hsh, p, q - p);
3279   if (!o)
3280     return PARSE_FAIL;
3281
3282   *str = q;
3283   return o->value;
3284 }
3285
3286 /* Parse an option for a barrier instruction.  Returns the encoding for the
3287    option, or PARSE_FAIL.  */
3288
3289 static int
3290 parse_barrier (char **str)
3291 {
3292   char *p, *q;
3293   const asm_barrier_opt *o;
3294
3295   p = q = *str;
3296   while (ISALPHA (*q))
3297     q++;
3298
3299   o = hash_find_n (aarch64_barrier_opt_hsh, p, q - p);
3300   if (!o)
3301     return PARSE_FAIL;
3302
3303   *str = q;
3304   return o->value;
3305 }
3306
3307 /* Parse a system register or a PSTATE field name for an MSR/MRS instruction.
3308    Returns the encoding for the option, or PARSE_FAIL.
3309
3310    If IMPLE_DEFINED_P is non-zero, the function will also try to parse the
3311    implementation defined system register name S<op0>_<op1>_<Cn>_<Cm>_<op2>.  */
3312
3313 static int
3314 parse_sys_reg (char **str, struct hash_control *sys_regs, int imple_defined_p)
3315 {
3316   char *p, *q;
3317   char buf[32];
3318   const aarch64_sys_reg *o;
3319   int value;
3320
3321   p = buf;
3322   for (q = *str; ISALNUM (*q) || *q == '_'; q++)
3323     if (p < buf + 31)
3324       *p++ = TOLOWER (*q);
3325   *p = '\0';
3326   /* Assert that BUF be large enough.  */
3327   gas_assert (p - buf == q - *str);
3328
3329   o = hash_find (sys_regs, buf);
3330   if (!o)
3331     {
3332       if (!imple_defined_p)
3333         return PARSE_FAIL;
3334       else
3335         {
3336           /* Parse S<op0>_<op1>_<Cn>_<Cm>_<op2>.  */
3337           unsigned int op0, op1, cn, cm, op2;
3338
3339           if (sscanf (buf, "s%u_%u_c%u_c%u_%u", &op0, &op1, &cn, &cm, &op2)
3340               != 5)
3341             return PARSE_FAIL;
3342           if (op0 > 3 || op1 > 7 || cn > 15 || cm > 15 || op2 > 7)
3343             return PARSE_FAIL;
3344           value = (op0 << 14) | (op1 << 11) | (cn << 7) | (cm << 3) | op2;
3345         }
3346     }
3347   else
3348     {
3349       if (aarch64_sys_reg_deprecated_p (o))
3350         as_warn (_("system register name '%s' is deprecated and may be "
3351 "removed in a future release"), buf);
3352       value = o->value;
3353     }
3354
3355   *str = q;
3356   return value;
3357 }
3358
3359 /* Parse a system reg for ic/dc/at/tlbi instructions.  Returns the table entry
3360    for the option, or NULL.  */
3361
3362 static const aarch64_sys_ins_reg *
3363 parse_sys_ins_reg (char **str, struct hash_control *sys_ins_regs)
3364 {
3365   char *p, *q;
3366   char buf[32];
3367   const aarch64_sys_ins_reg *o;
3368
3369   p = buf;
3370   for (q = *str; ISALNUM (*q) || *q == '_'; q++)
3371     if (p < buf + 31)
3372       *p++ = TOLOWER (*q);
3373   *p = '\0';
3374
3375   o = hash_find (sys_ins_regs, buf);
3376   if (!o)
3377     return NULL;
3378
3379   *str = q;
3380   return o;
3381 }
3382 \f
3383 #define po_char_or_fail(chr) do {                               \
3384     if (! skip_past_char (&str, chr))                           \
3385       goto failure;                                             \
3386 } while (0)
3387
3388 #define po_reg_or_fail(regtype) do {                            \
3389     val = aarch64_reg_parse (&str, regtype, &rtype, NULL);      \
3390     if (val == PARSE_FAIL)                                      \
3391       {                                                         \
3392         set_default_error ();                                   \
3393         goto failure;                                           \
3394       }                                                         \
3395   } while (0)
3396
3397 #define po_int_reg_or_fail(reject_sp, reject_rz) do {           \
3398     val = aarch64_reg_parse_32_64 (&str, reject_sp, reject_rz,  \
3399                                    &isreg32, &isregzero);       \
3400     if (val == PARSE_FAIL)                                      \
3401       {                                                         \
3402         set_default_error ();                                   \
3403         goto failure;                                           \
3404       }                                                         \
3405     info->reg.regno = val;                                      \
3406     if (isreg32)                                                \
3407       info->qualifier = AARCH64_OPND_QLF_W;                     \
3408     else                                                        \
3409       info->qualifier = AARCH64_OPND_QLF_X;                     \
3410   } while (0)
3411
3412 #define po_imm_nc_or_fail() do {                                \
3413     if (! parse_constant_immediate (&str, &val))                \
3414       goto failure;                                             \
3415   } while (0)
3416
3417 #define po_imm_or_fail(min, max) do {                           \
3418     if (! parse_constant_immediate (&str, &val))                \
3419       goto failure;                                             \
3420     if (val < min || val > max)                                 \
3421       {                                                         \
3422         set_fatal_syntax_error (_("immediate value out of range "\
3423 #min " to "#max));                                              \
3424         goto failure;                                           \
3425       }                                                         \
3426   } while (0)
3427
3428 #define po_misc_or_fail(expr) do {                              \
3429     if (!expr)                                                  \
3430       goto failure;                                             \
3431   } while (0)
3432 \f
3433 /* encode the 12-bit imm field of Add/sub immediate */
3434 static inline uint32_t
3435 encode_addsub_imm (uint32_t imm)
3436 {
3437   return imm << 10;
3438 }
3439
3440 /* encode the shift amount field of Add/sub immediate */
3441 static inline uint32_t
3442 encode_addsub_imm_shift_amount (uint32_t cnt)
3443 {
3444   return cnt << 22;
3445 }
3446
3447
3448 /* encode the imm field of Adr instruction */
3449 static inline uint32_t
3450 encode_adr_imm (uint32_t imm)
3451 {
3452   return (((imm & 0x3) << 29)   /*  [1:0] -> [30:29] */
3453           | ((imm & (0x7ffff << 2)) << 3));     /* [20:2] -> [23:5]  */
3454 }
3455
3456 /* encode the immediate field of Move wide immediate */
3457 static inline uint32_t
3458 encode_movw_imm (uint32_t imm)
3459 {
3460   return imm << 5;
3461 }
3462
3463 /* encode the 26-bit offset of unconditional branch */
3464 static inline uint32_t
3465 encode_branch_ofs_26 (uint32_t ofs)
3466 {
3467   return ofs & ((1 << 26) - 1);
3468 }
3469
3470 /* encode the 19-bit offset of conditional branch and compare & branch */
3471 static inline uint32_t
3472 encode_cond_branch_ofs_19 (uint32_t ofs)
3473 {
3474   return (ofs & ((1 << 19) - 1)) << 5;
3475 }
3476
3477 /* encode the 19-bit offset of ld literal */
3478 static inline uint32_t
3479 encode_ld_lit_ofs_19 (uint32_t ofs)
3480 {
3481   return (ofs & ((1 << 19) - 1)) << 5;
3482 }
3483
3484 /* Encode the 14-bit offset of test & branch.  */
3485 static inline uint32_t
3486 encode_tst_branch_ofs_14 (uint32_t ofs)
3487 {
3488   return (ofs & ((1 << 14) - 1)) << 5;
3489 }
3490
3491 /* Encode the 16-bit imm field of svc/hvc/smc.  */
3492 static inline uint32_t
3493 encode_svc_imm (uint32_t imm)
3494 {
3495   return imm << 5;
3496 }
3497
3498 /* Reencode add(s) to sub(s), or sub(s) to add(s).  */
3499 static inline uint32_t
3500 reencode_addsub_switch_add_sub (uint32_t opcode)
3501 {
3502   return opcode ^ (1 << 30);
3503 }
3504
3505 static inline uint32_t
3506 reencode_movzn_to_movz (uint32_t opcode)
3507 {
3508   return opcode | (1 << 30);
3509 }
3510
3511 static inline uint32_t
3512 reencode_movzn_to_movn (uint32_t opcode)
3513 {
3514   return opcode & ~(1 << 30);
3515 }
3516
3517 /* Overall per-instruction processing.  */
3518
3519 /* We need to be able to fix up arbitrary expressions in some statements.
3520    This is so that we can handle symbols that are an arbitrary distance from
3521    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
3522    which returns part of an address in a form which will be valid for
3523    a data instruction.  We do this by pushing the expression into a symbol
3524    in the expr_section, and creating a fix for that.  */
3525
3526 static fixS *
3527 fix_new_aarch64 (fragS * frag,
3528                  int where,
3529                  short int size, expressionS * exp, int pc_rel, int reloc)
3530 {
3531   fixS *new_fix;
3532
3533   switch (exp->X_op)
3534     {
3535     case O_constant:
3536     case O_symbol:
3537     case O_add:
3538     case O_subtract:
3539       new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc);
3540       break;
3541
3542     default:
3543       new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0,
3544                          pc_rel, reloc);
3545       break;
3546     }
3547   return new_fix;
3548 }
3549 \f
3550 /* Diagnostics on operands errors.  */
3551
3552 /* By default, output verbose error message.
3553    Disable the verbose error message by -mno-verbose-error.  */
3554 static int verbose_error_p = 1;
3555
3556 #ifdef DEBUG_AARCH64
3557 /* N.B. this is only for the purpose of debugging.  */
3558 const char* operand_mismatch_kind_names[] =
3559 {
3560   "AARCH64_OPDE_NIL",
3561   "AARCH64_OPDE_RECOVERABLE",
3562   "AARCH64_OPDE_SYNTAX_ERROR",
3563   "AARCH64_OPDE_FATAL_SYNTAX_ERROR",
3564   "AARCH64_OPDE_INVALID_VARIANT",
3565   "AARCH64_OPDE_OUT_OF_RANGE",
3566   "AARCH64_OPDE_UNALIGNED",
3567   "AARCH64_OPDE_REG_LIST",
3568   "AARCH64_OPDE_OTHER_ERROR",
3569 };
3570 #endif /* DEBUG_AARCH64 */
3571
3572 /* Return TRUE if LHS is of higher severity than RHS, otherwise return FALSE.
3573
3574    When multiple errors of different kinds are found in the same assembly
3575    line, only the error of the highest severity will be picked up for
3576    issuing the diagnostics.  */
3577
3578 static inline bfd_boolean
3579 operand_error_higher_severity_p (enum aarch64_operand_error_kind lhs,
3580                                  enum aarch64_operand_error_kind rhs)
3581 {
3582   gas_assert (AARCH64_OPDE_RECOVERABLE > AARCH64_OPDE_NIL);
3583   gas_assert (AARCH64_OPDE_SYNTAX_ERROR > AARCH64_OPDE_RECOVERABLE);
3584   gas_assert (AARCH64_OPDE_FATAL_SYNTAX_ERROR > AARCH64_OPDE_SYNTAX_ERROR);
3585   gas_assert (AARCH64_OPDE_INVALID_VARIANT > AARCH64_OPDE_FATAL_SYNTAX_ERROR);
3586   gas_assert (AARCH64_OPDE_OUT_OF_RANGE > AARCH64_OPDE_INVALID_VARIANT);
3587   gas_assert (AARCH64_OPDE_UNALIGNED > AARCH64_OPDE_OUT_OF_RANGE);
3588   gas_assert (AARCH64_OPDE_REG_LIST > AARCH64_OPDE_UNALIGNED);
3589   gas_assert (AARCH64_OPDE_OTHER_ERROR > AARCH64_OPDE_REG_LIST);
3590   return lhs > rhs;
3591 }
3592
3593 /* Helper routine to get the mnemonic name from the assembly instruction
3594    line; should only be called for the diagnosis purpose, as there is
3595    string copy operation involved, which may affect the runtime
3596    performance if used in elsewhere.  */
3597
3598 static const char*
3599 get_mnemonic_name (const char *str)
3600 {
3601   static char mnemonic[32];
3602   char *ptr;
3603
3604   /* Get the first 15 bytes and assume that the full name is included.  */
3605   strncpy (mnemonic, str, 31);
3606   mnemonic[31] = '\0';
3607
3608   /* Scan up to the end of the mnemonic, which must end in white space,
3609      '.', or end of string.  */
3610   for (ptr = mnemonic; is_part_of_name(*ptr); ++ptr)
3611     ;
3612
3613   *ptr = '\0';
3614
3615   /* Append '...' to the truncated long name.  */
3616   if (ptr - mnemonic == 31)
3617     mnemonic[28] = mnemonic[29] = mnemonic[30] = '.';
3618
3619   return mnemonic;
3620 }
3621
3622 static void
3623 reset_aarch64_instruction (aarch64_instruction *instruction)
3624 {
3625   memset (instruction, '\0', sizeof (aarch64_instruction));
3626   instruction->reloc.type = BFD_RELOC_UNUSED;
3627 }
3628
3629 /* Data strutures storing one user error in the assembly code related to
3630    operands.  */
3631
3632 struct operand_error_record
3633 {
3634   const aarch64_opcode *opcode;
3635   aarch64_operand_error detail;
3636   struct operand_error_record *next;
3637 };
3638
3639 typedef struct operand_error_record operand_error_record;
3640
3641 struct operand_errors
3642 {
3643   operand_error_record *head;
3644   operand_error_record *tail;
3645 };
3646
3647 typedef struct operand_errors operand_errors;
3648
3649 /* Top-level data structure reporting user errors for the current line of
3650    the assembly code.
3651    The way md_assemble works is that all opcodes sharing the same mnemonic
3652    name are iterated to find a match to the assembly line.  In this data
3653    structure, each of the such opcodes will have one operand_error_record
3654    allocated and inserted.  In other words, excessive errors related with
3655    a single opcode are disregarded.  */
3656 operand_errors operand_error_report;
3657
3658 /* Free record nodes.  */
3659 static operand_error_record *free_opnd_error_record_nodes = NULL;
3660
3661 /* Initialize the data structure that stores the operand mismatch
3662    information on assembling one line of the assembly code.  */
3663 static void
3664 init_operand_error_report (void)
3665 {
3666   if (operand_error_report.head != NULL)
3667     {
3668       gas_assert (operand_error_report.tail != NULL);
3669       operand_error_report.tail->next = free_opnd_error_record_nodes;
3670       free_opnd_error_record_nodes = operand_error_report.head;
3671       operand_error_report.head = NULL;
3672       operand_error_report.tail = NULL;
3673       return;
3674     }
3675   gas_assert (operand_error_report.tail == NULL);
3676 }
3677
3678 /* Return TRUE if some operand error has been recorded during the
3679    parsing of the current assembly line using the opcode *OPCODE;
3680    otherwise return FALSE.  */
3681 static inline bfd_boolean
3682 opcode_has_operand_error_p (const aarch64_opcode *opcode)
3683 {
3684   operand_error_record *record = operand_error_report.head;
3685   return record && record->opcode == opcode;
3686 }
3687
3688 /* Add the error record *NEW_RECORD to operand_error_report.  The record's
3689    OPCODE field is initialized with OPCODE.
3690    N.B. only one record for each opcode, i.e. the maximum of one error is
3691    recorded for each instruction template.  */
3692
3693 static void
3694 add_operand_error_record (const operand_error_record* new_record)
3695 {
3696   const aarch64_opcode *opcode = new_record->opcode;
3697   operand_error_record* record = operand_error_report.head;
3698
3699   /* The record may have been created for this opcode.  If not, we need
3700      to prepare one.  */
3701   if (! opcode_has_operand_error_p (opcode))
3702     {
3703       /* Get one empty record.  */
3704       if (free_opnd_error_record_nodes == NULL)
3705         {
3706           record = xmalloc (sizeof (operand_error_record));
3707           if (record == NULL)
3708             abort ();
3709         }
3710       else
3711         {
3712           record = free_opnd_error_record_nodes;
3713           free_opnd_error_record_nodes = record->next;
3714         }
3715       record->opcode = opcode;
3716       /* Insert at the head.  */
3717       record->next = operand_error_report.head;
3718       operand_error_report.head = record;
3719       if (operand_error_report.tail == NULL)
3720         operand_error_report.tail = record;
3721     }
3722   else if (record->detail.kind != AARCH64_OPDE_NIL
3723            && record->detail.index <= new_record->detail.index
3724            && operand_error_higher_severity_p (record->detail.kind,
3725                                                new_record->detail.kind))
3726     {
3727       /* In the case of multiple errors found on operands related with a
3728          single opcode, only record the error of the leftmost operand and
3729          only if the error is of higher severity.  */
3730       DEBUG_TRACE ("error %s on operand %d not added to the report due to"
3731                    " the existing error %s on operand %d",
3732                    operand_mismatch_kind_names[new_record->detail.kind],
3733                    new_record->detail.index,
3734                    operand_mismatch_kind_names[record->detail.kind],
3735                    record->detail.index);
3736       return;
3737     }
3738
3739   record->detail = new_record->detail;
3740 }
3741
3742 static inline void
3743 record_operand_error_info (const aarch64_opcode *opcode,
3744                            aarch64_operand_error *error_info)
3745 {
3746   operand_error_record record;
3747   record.opcode = opcode;
3748   record.detail = *error_info;
3749   add_operand_error_record (&record);
3750 }
3751
3752 /* Record an error of kind KIND and, if ERROR is not NULL, of the detailed
3753    error message *ERROR, for operand IDX (count from 0).  */
3754
3755 static void
3756 record_operand_error (const aarch64_opcode *opcode, int idx,
3757                       enum aarch64_operand_error_kind kind,
3758                       const char* error)
3759 {
3760   aarch64_operand_error info;
3761   memset(&info, 0, sizeof (info));
3762   info.index = idx;
3763   info.kind = kind;
3764   info.error = error;
3765   record_operand_error_info (opcode, &info);
3766 }
3767
3768 static void
3769 record_operand_error_with_data (const aarch64_opcode *opcode, int idx,
3770                                 enum aarch64_operand_error_kind kind,
3771                                 const char* error, const int *extra_data)
3772 {
3773   aarch64_operand_error info;
3774   info.index = idx;
3775   info.kind = kind;
3776   info.error = error;
3777   info.data[0] = extra_data[0];
3778   info.data[1] = extra_data[1];
3779   info.data[2] = extra_data[2];
3780   record_operand_error_info (opcode, &info);
3781 }
3782
3783 static void
3784 record_operand_out_of_range_error (const aarch64_opcode *opcode, int idx,
3785                                    const char* error, int lower_bound,
3786                                    int upper_bound)
3787 {
3788   int data[3] = {lower_bound, upper_bound, 0};
3789   record_operand_error_with_data (opcode, idx, AARCH64_OPDE_OUT_OF_RANGE,
3790                                   error, data);
3791 }
3792
3793 /* Remove the operand error record for *OPCODE.  */
3794 static void ATTRIBUTE_UNUSED
3795 remove_operand_error_record (const aarch64_opcode *opcode)
3796 {
3797   if (opcode_has_operand_error_p (opcode))
3798     {
3799       operand_error_record* record = operand_error_report.head;
3800       gas_assert (record != NULL && operand_error_report.tail != NULL);
3801       operand_error_report.head = record->next;
3802       record->next = free_opnd_error_record_nodes;
3803       free_opnd_error_record_nodes = record;
3804       if (operand_error_report.head == NULL)
3805         {
3806           gas_assert (operand_error_report.tail == record);
3807           operand_error_report.tail = NULL;
3808         }
3809     }
3810 }
3811
3812 /* Given the instruction in *INSTR, return the index of the best matched
3813    qualifier sequence in the list (an array) headed by QUALIFIERS_LIST.
3814
3815    Return -1 if there is no qualifier sequence; return the first match
3816    if there is multiple matches found.  */
3817
3818 static int
3819 find_best_match (const aarch64_inst *instr,
3820                  const aarch64_opnd_qualifier_seq_t *qualifiers_list)
3821 {
3822   int i, num_opnds, max_num_matched, idx;
3823
3824   num_opnds = aarch64_num_of_operands (instr->opcode);
3825   if (num_opnds == 0)
3826     {
3827       DEBUG_TRACE ("no operand");
3828       return -1;
3829     }
3830
3831   max_num_matched = 0;
3832   idx = -1;
3833
3834   /* For each pattern.  */
3835   for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i, ++qualifiers_list)
3836     {
3837       int j, num_matched;
3838       const aarch64_opnd_qualifier_t *qualifiers = *qualifiers_list;
3839
3840       /* Most opcodes has much fewer patterns in the list.  */
3841       if (empty_qualifier_sequence_p (qualifiers) == TRUE)
3842         {
3843           DEBUG_TRACE_IF (i == 0, "empty list of qualifier sequence");
3844           if (i != 0 && idx == -1)
3845             /* If nothing has been matched, return the 1st sequence.  */
3846             idx = 0;
3847           break;
3848         }
3849
3850       for (j = 0, num_matched = 0; j < num_opnds; ++j, ++qualifiers)
3851         if (*qualifiers == instr->operands[j].qualifier)
3852           ++num_matched;
3853
3854       if (num_matched > max_num_matched)
3855         {
3856           max_num_matched = num_matched;
3857           idx = i;
3858         }
3859     }
3860
3861   DEBUG_TRACE ("return with %d", idx);
3862   return idx;
3863 }
3864
3865 /* Assign qualifiers in the qualifier seqence (headed by QUALIFIERS) to the
3866    corresponding operands in *INSTR.  */
3867
3868 static inline void
3869 assign_qualifier_sequence (aarch64_inst *instr,
3870                            const aarch64_opnd_qualifier_t *qualifiers)
3871 {
3872   int i = 0;
3873   int num_opnds = aarch64_num_of_operands (instr->opcode);
3874   gas_assert (num_opnds);
3875   for (i = 0; i < num_opnds; ++i, ++qualifiers)
3876     instr->operands[i].qualifier = *qualifiers;
3877 }
3878
3879 /* Print operands for the diagnosis purpose.  */
3880
3881 static void
3882 print_operands (char *buf, const aarch64_opcode *opcode,
3883                 const aarch64_opnd_info *opnds)
3884 {
3885   int i;
3886
3887   for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i)
3888     {
3889       const size_t size = 128;
3890       char str[size];
3891
3892       /* We regard the opcode operand info more, however we also look into
3893          the inst->operands to support the disassembling of the optional
3894          operand.
3895          The two operand code should be the same in all cases, apart from
3896          when the operand can be optional.  */
3897       if (opcode->operands[i] == AARCH64_OPND_NIL
3898           || opnds[i].type == AARCH64_OPND_NIL)
3899         break;
3900
3901       /* Generate the operand string in STR.  */
3902       aarch64_print_operand (str, size, 0, opcode, opnds, i, NULL, NULL);
3903
3904       /* Delimiter.  */
3905       if (str[0] != '\0')
3906         strcat (buf, i == 0 ? " " : ",");
3907
3908       /* Append the operand string.  */
3909       strcat (buf, str);
3910     }
3911 }
3912
3913 /* Send to stderr a string as information.  */
3914
3915 static void
3916 output_info (const char *format, ...)
3917 {
3918   char *file;
3919   unsigned int line;
3920   va_list args;
3921
3922   as_where (&file, &line);
3923   if (file)
3924     {
3925       if (line != 0)
3926         fprintf (stderr, "%s:%u: ", file, line);
3927       else
3928         fprintf (stderr, "%s: ", file);
3929     }
3930   fprintf (stderr, _("Info: "));
3931   va_start (args, format);
3932   vfprintf (stderr, format, args);
3933   va_end (args);
3934   (void) putc ('\n', stderr);
3935 }
3936
3937 /* Output one operand error record.  */
3938
3939 static void
3940 output_operand_error_record (const operand_error_record *record, char *str)
3941 {
3942   int idx = record->detail.index;
3943   const aarch64_opcode *opcode = record->opcode;
3944   enum aarch64_opnd opd_code = (idx != -1 ? opcode->operands[idx]
3945                                 : AARCH64_OPND_NIL);
3946   const aarch64_operand_error *detail = &record->detail;
3947
3948   switch (detail->kind)
3949     {
3950     case AARCH64_OPDE_NIL:
3951       gas_assert (0);
3952       break;
3953
3954     case AARCH64_OPDE_SYNTAX_ERROR:
3955     case AARCH64_OPDE_RECOVERABLE:
3956     case AARCH64_OPDE_FATAL_SYNTAX_ERROR:
3957     case AARCH64_OPDE_OTHER_ERROR:
3958       gas_assert (idx >= 0);
3959       /* Use the prepared error message if there is, otherwise use the
3960          operand description string to describe the error.  */
3961       if (detail->error != NULL)
3962         {
3963           if (detail->index == -1)
3964             as_bad (_("%s -- `%s'"), detail->error, str);
3965           else
3966             as_bad (_("%s at operand %d -- `%s'"),
3967                     detail->error, detail->index + 1, str);
3968         }
3969       else
3970         as_bad (_("operand %d should be %s -- `%s'"), idx + 1,
3971                 aarch64_get_operand_desc (opd_code), str);
3972       break;
3973
3974     case AARCH64_OPDE_INVALID_VARIANT:
3975       as_bad (_("operand mismatch -- `%s'"), str);
3976       if (verbose_error_p)
3977         {
3978           /* We will try to correct the erroneous instruction and also provide
3979              more information e.g. all other valid variants.
3980
3981              The string representation of the corrected instruction and other
3982              valid variants are generated by
3983
3984              1) obtaining the intermediate representation of the erroneous
3985              instruction;
3986              2) manipulating the IR, e.g. replacing the operand qualifier;
3987              3) printing out the instruction by calling the printer functions
3988              shared with the disassembler.
3989
3990              The limitation of this method is that the exact input assembly
3991              line cannot be accurately reproduced in some cases, for example an
3992              optional operand present in the actual assembly line will be
3993              omitted in the output; likewise for the optional syntax rules,
3994              e.g. the # before the immediate.  Another limitation is that the
3995              assembly symbols and relocation operations in the assembly line
3996              currently cannot be printed out in the error report.  Last but not
3997              least, when there is other error(s) co-exist with this error, the
3998              'corrected' instruction may be still incorrect, e.g.  given
3999                'ldnp h0,h1,[x0,#6]!'
4000              this diagnosis will provide the version:
4001                'ldnp s0,s1,[x0,#6]!'
4002              which is still not right.  */
4003           size_t len = strlen (get_mnemonic_name (str));
4004           int i, qlf_idx;
4005           bfd_boolean result;
4006           const size_t size = 2048;
4007           char buf[size];
4008           aarch64_inst *inst_base = &inst.base;
4009           const aarch64_opnd_qualifier_seq_t *qualifiers_list;
4010
4011           /* Init inst.  */
4012           reset_aarch64_instruction (&inst);
4013           inst_base->opcode = opcode;
4014
4015           /* Reset the error report so that there is no side effect on the
4016              following operand parsing.  */
4017           init_operand_error_report ();
4018
4019           /* Fill inst.  */
4020           result = parse_operands (str + len, opcode)
4021             && programmer_friendly_fixup (&inst);
4022           gas_assert (result);
4023           result = aarch64_opcode_encode (opcode, inst_base, &inst_base->value,
4024                                           NULL, NULL);
4025           gas_assert (!result);
4026
4027           /* Find the most matched qualifier sequence.  */
4028           qlf_idx = find_best_match (inst_base, opcode->qualifiers_list);
4029           gas_assert (qlf_idx > -1);
4030
4031           /* Assign the qualifiers.  */
4032           assign_qualifier_sequence (inst_base,
4033                                      opcode->qualifiers_list[qlf_idx]);
4034
4035           /* Print the hint.  */
4036           output_info (_("   did you mean this?"));
4037           snprintf (buf, size, "\t%s", get_mnemonic_name (str));
4038           print_operands (buf, opcode, inst_base->operands);
4039           output_info (_("   %s"), buf);
4040
4041           /* Print out other variant(s) if there is any.  */
4042           if (qlf_idx != 0 ||
4043               !empty_qualifier_sequence_p (opcode->qualifiers_list[1]))
4044             output_info (_("   other valid variant(s):"));
4045
4046           /* For each pattern.  */
4047           qualifiers_list = opcode->qualifiers_list;
4048           for (i = 0; i < AARCH64_MAX_QLF_SEQ_NUM; ++i, ++qualifiers_list)
4049             {
4050               /* Most opcodes has much fewer patterns in the list.
4051                  First NIL qualifier indicates the end in the list.   */
4052               if (empty_qualifier_sequence_p (*qualifiers_list) == TRUE)
4053                 break;
4054
4055               if (i != qlf_idx)
4056                 {
4057                   /* Mnemonics name.  */
4058                   snprintf (buf, size, "\t%s", get_mnemonic_name (str));
4059
4060                   /* Assign the qualifiers.  */
4061                   assign_qualifier_sequence (inst_base, *qualifiers_list);
4062
4063                   /* Print instruction.  */
4064                   print_operands (buf, opcode, inst_base->operands);
4065
4066                   output_info (_("   %s"), buf);
4067                 }
4068             }
4069         }
4070       break;
4071
4072     case AARCH64_OPDE_OUT_OF_RANGE:
4073       if (detail->data[0] != detail->data[1])
4074         as_bad (_("%s out of range %d to %d at operand %d -- `%s'"),
4075                 detail->error ? detail->error : _("immediate value"),
4076                 detail->data[0], detail->data[1], detail->index + 1, str);
4077       else
4078         as_bad (_("%s expected to be %d at operand %d -- `%s'"),
4079                 detail->error ? detail->error : _("immediate value"),
4080                 detail->data[0], detail->index + 1, str);
4081       break;
4082
4083     case AARCH64_OPDE_REG_LIST:
4084       if (detail->data[0] == 1)
4085         as_bad (_("invalid number of registers in the list; "
4086                   "only 1 register is expected at operand %d -- `%s'"),
4087                 detail->index + 1, str);
4088       else
4089         as_bad (_("invalid number of registers in the list; "
4090                   "%d registers are expected at operand %d -- `%s'"),
4091               detail->data[0], detail->index + 1, str);
4092       break;
4093
4094     case AARCH64_OPDE_UNALIGNED:
4095       as_bad (_("immediate value should be a multiple of "
4096                 "%d at operand %d -- `%s'"),
4097               detail->data[0], detail->index + 1, str);
4098       break;
4099
4100     default:
4101       gas_assert (0);
4102       break;
4103     }
4104 }
4105
4106 /* Process and output the error message about the operand mismatching.
4107
4108    When this function is called, the operand error information had
4109    been collected for an assembly line and there will be multiple
4110    errors in the case of mulitple instruction templates; output the
4111    error message that most closely describes the problem.  */
4112
4113 static void
4114 output_operand_error_report (char *str)
4115 {
4116   int largest_error_pos;
4117   const char *msg = NULL;
4118   enum aarch64_operand_error_kind kind;
4119   operand_error_record *curr;
4120   operand_error_record *head = operand_error_report.head;
4121   operand_error_record *record = NULL;
4122
4123   /* No error to report.  */
4124   if (head == NULL)
4125     return;
4126
4127   gas_assert (head != NULL && operand_error_report.tail != NULL);
4128
4129   /* Only one error.  */
4130   if (head == operand_error_report.tail)
4131     {
4132       DEBUG_TRACE ("single opcode entry with error kind: %s",
4133                    operand_mismatch_kind_names[head->detail.kind]);
4134       output_operand_error_record (head, str);
4135       return;
4136     }
4137
4138   /* Find the error kind of the highest severity.  */
4139   DEBUG_TRACE ("multiple opcode entres with error kind");
4140   kind = AARCH64_OPDE_NIL;
4141   for (curr = head; curr != NULL; curr = curr->next)
4142     {
4143       gas_assert (curr->detail.kind != AARCH64_OPDE_NIL);
4144       DEBUG_TRACE ("\t%s", operand_mismatch_kind_names[curr->detail.kind]);
4145       if (operand_error_higher_severity_p (curr->detail.kind, kind))
4146         kind = curr->detail.kind;
4147     }
4148   gas_assert (kind != AARCH64_OPDE_NIL);
4149
4150   /* Pick up one of errors of KIND to report.  */
4151   largest_error_pos = -2; /* Index can be -1 which means unknown index.  */
4152   for (curr = head; curr != NULL; curr = curr->next)
4153     {
4154       if (curr->detail.kind != kind)
4155         continue;
4156       /* If there are multiple errors, pick up the one with the highest
4157          mismatching operand index.  In the case of multiple errors with
4158          the equally highest operand index, pick up the first one or the
4159          first one with non-NULL error message.  */
4160       if (curr->detail.index > largest_error_pos
4161           || (curr->detail.index == largest_error_pos && msg == NULL
4162               && curr->detail.error != NULL))
4163         {
4164           largest_error_pos = curr->detail.index;
4165           record = curr;
4166           msg = record->detail.error;
4167         }
4168     }
4169
4170   gas_assert (largest_error_pos != -2 && record != NULL);
4171   DEBUG_TRACE ("Pick up error kind %s to report",
4172                operand_mismatch_kind_names[record->detail.kind]);
4173
4174   /* Output.  */
4175   output_operand_error_record (record, str);
4176 }
4177 \f
4178 /* Write an AARCH64 instruction to buf - always little-endian.  */
4179 static void
4180 put_aarch64_insn (char *buf, uint32_t insn)
4181 {
4182   unsigned char *where = (unsigned char *) buf;
4183   where[0] = insn;
4184   where[1] = insn >> 8;
4185   where[2] = insn >> 16;
4186   where[3] = insn >> 24;
4187 }
4188
4189 static uint32_t
4190 get_aarch64_insn (char *buf)
4191 {
4192   unsigned char *where = (unsigned char *) buf;
4193   uint32_t result;
4194   result = (where[0] | (where[1] << 8) | (where[2] << 16) | (where[3] << 24));
4195   return result;
4196 }
4197
4198 static void
4199 output_inst (struct aarch64_inst *new_inst)
4200 {
4201   char *to = NULL;
4202
4203   to = frag_more (INSN_SIZE);
4204
4205   frag_now->tc_frag_data.recorded = 1;
4206
4207   put_aarch64_insn (to, inst.base.value);
4208
4209   if (inst.reloc.type != BFD_RELOC_UNUSED)
4210     {
4211       fixS *fixp = fix_new_aarch64 (frag_now, to - frag_now->fr_literal,
4212                                     INSN_SIZE, &inst.reloc.exp,
4213                                     inst.reloc.pc_rel,
4214                                     inst.reloc.type);
4215       DEBUG_TRACE ("Prepared relocation fix up");
4216       /* Don't check the addend value against the instruction size,
4217          that's the job of our code in md_apply_fix(). */
4218       fixp->fx_no_overflow = 1;
4219       if (new_inst != NULL)
4220         fixp->tc_fix_data.inst = new_inst;
4221       if (aarch64_gas_internal_fixup_p ())
4222         {
4223           gas_assert (inst.reloc.opnd != AARCH64_OPND_NIL);
4224           fixp->tc_fix_data.opnd = inst.reloc.opnd;
4225           fixp->fx_addnumber = inst.reloc.flags;
4226         }
4227     }
4228
4229   dwarf2_emit_insn (INSN_SIZE);
4230 }
4231
4232 /* Link together opcodes of the same name.  */
4233
4234 struct templates
4235 {
4236   aarch64_opcode *opcode;
4237   struct templates *next;
4238 };
4239
4240 typedef struct templates templates;
4241
4242 static templates *
4243 lookup_mnemonic (const char *start, int len)
4244 {
4245   templates *templ = NULL;
4246
4247   templ = hash_find_n (aarch64_ops_hsh, start, len);
4248   return templ;
4249 }
4250
4251 /* Subroutine of md_assemble, responsible for looking up the primary
4252    opcode from the mnemonic the user wrote.  STR points to the
4253    beginning of the mnemonic. */
4254
4255 static templates *
4256 opcode_lookup (char **str)
4257 {
4258   char *end, *base;
4259   const aarch64_cond *cond;
4260   char condname[16];
4261   int len;
4262
4263   /* Scan up to the end of the mnemonic, which must end in white space,
4264      '.', or end of string.  */
4265   for (base = end = *str; is_part_of_name(*end); end++)
4266     if (*end == '.')
4267       break;
4268
4269   if (end == base)
4270     return 0;
4271
4272   inst.cond = COND_ALWAYS;
4273
4274   /* Handle a possible condition.  */
4275   if (end[0] == '.')
4276     {
4277       cond = hash_find_n (aarch64_cond_hsh, end + 1, 2);
4278       if (cond)
4279         {
4280           inst.cond = cond->value;
4281           *str = end + 3;
4282         }
4283       else
4284         {
4285           *str = end;
4286           return 0;
4287         }
4288     }
4289   else
4290     *str = end;
4291
4292   len = end - base;
4293
4294   if (inst.cond == COND_ALWAYS)
4295     {
4296       /* Look for unaffixed mnemonic.  */
4297       return lookup_mnemonic (base, len);
4298     }
4299   else if (len <= 13)
4300     {
4301       /* append ".c" to mnemonic if conditional */
4302       memcpy (condname, base, len);
4303       memcpy (condname + len, ".c", 2);
4304       base = condname;
4305       len += 2;
4306       return lookup_mnemonic (base, len);
4307     }
4308
4309   return NULL;
4310 }
4311
4312 /* Internal helper routine converting a vector neon_type_el structure
4313    *VECTYPE to a corresponding operand qualifier.  */
4314
4315 static inline aarch64_opnd_qualifier_t
4316 vectype_to_qualifier (const struct neon_type_el *vectype)
4317 {
4318   /* Element size in bytes indexed by neon_el_type.  */
4319   const unsigned char ele_size[5]
4320     = {1, 2, 4, 8, 16};
4321
4322   if (!vectype->defined || vectype->type == NT_invtype)
4323     goto vectype_conversion_fail;
4324
4325   gas_assert (vectype->type >= NT_b && vectype->type <= NT_q);
4326
4327   if (vectype->defined & NTA_HASINDEX)
4328     /* Vector element register.  */
4329     return AARCH64_OPND_QLF_S_B + vectype->type;
4330   else
4331     {
4332       /* Vector register.  */
4333       int reg_size = ele_size[vectype->type] * vectype->width;
4334       unsigned offset;
4335       if (reg_size != 16 && reg_size != 8)
4336         goto vectype_conversion_fail;
4337       /* The conversion is calculated based on the relation of the order of
4338          qualifiers to the vector element size and vector register size.  */
4339       offset = (vectype->type == NT_q)
4340         ? 8 : (vectype->type << 1) + (reg_size >> 4);
4341       gas_assert (offset <= 8);
4342       return AARCH64_OPND_QLF_V_8B + offset;
4343     }
4344
4345 vectype_conversion_fail:
4346   first_error (_("bad vector arrangement type"));
4347   return AARCH64_OPND_QLF_NIL;
4348 }
4349
4350 /* Process an optional operand that is found omitted from the assembly line.
4351    Fill *OPERAND for such an operand of type TYPE.  OPCODE points to the
4352    instruction's opcode entry while IDX is the index of this omitted operand.
4353    */
4354
4355 static void
4356 process_omitted_operand (enum aarch64_opnd type, const aarch64_opcode *opcode,
4357                          int idx, aarch64_opnd_info *operand)
4358 {
4359   aarch64_insn default_value = get_optional_operand_default_value (opcode);
4360   gas_assert (optional_operand_p (opcode, idx));
4361   gas_assert (!operand->present);
4362
4363   switch (type)
4364     {
4365     case AARCH64_OPND_Rd:
4366     case AARCH64_OPND_Rn:
4367     case AARCH64_OPND_Rm:
4368     case AARCH64_OPND_Rt:
4369     case AARCH64_OPND_Rt2:
4370     case AARCH64_OPND_Rs:
4371     case AARCH64_OPND_Ra:
4372     case AARCH64_OPND_Rt_SYS:
4373     case AARCH64_OPND_Rd_SP:
4374     case AARCH64_OPND_Rn_SP:
4375     case AARCH64_OPND_Fd:
4376     case AARCH64_OPND_Fn:
4377     case AARCH64_OPND_Fm:
4378     case AARCH64_OPND_Fa:
4379     case AARCH64_OPND_Ft:
4380     case AARCH64_OPND_Ft2:
4381     case AARCH64_OPND_Sd:
4382     case AARCH64_OPND_Sn:
4383     case AARCH64_OPND_Sm:
4384     case AARCH64_OPND_Vd:
4385     case AARCH64_OPND_Vn:
4386     case AARCH64_OPND_Vm:
4387     case AARCH64_OPND_VdD1:
4388     case AARCH64_OPND_VnD1:
4389       operand->reg.regno = default_value;
4390       break;
4391
4392     case AARCH64_OPND_Ed:
4393     case AARCH64_OPND_En:
4394     case AARCH64_OPND_Em:
4395       operand->reglane.regno = default_value;
4396       break;
4397
4398     case AARCH64_OPND_IDX:
4399     case AARCH64_OPND_BIT_NUM:
4400     case AARCH64_OPND_IMMR:
4401     case AARCH64_OPND_IMMS:
4402     case AARCH64_OPND_SHLL_IMM:
4403     case AARCH64_OPND_IMM_VLSL:
4404     case AARCH64_OPND_IMM_VLSR:
4405     case AARCH64_OPND_CCMP_IMM:
4406     case AARCH64_OPND_FBITS:
4407     case AARCH64_OPND_UIMM4:
4408     case AARCH64_OPND_UIMM3_OP1:
4409     case AARCH64_OPND_UIMM3_OP2:
4410     case AARCH64_OPND_IMM:
4411     case AARCH64_OPND_WIDTH:
4412     case AARCH64_OPND_UIMM7:
4413     case AARCH64_OPND_NZCV:
4414       operand->imm.value = default_value;
4415       break;
4416
4417     case AARCH64_OPND_EXCEPTION:
4418       inst.reloc.type = BFD_RELOC_UNUSED;
4419       break;
4420
4421     case AARCH64_OPND_BARRIER_ISB:
4422       operand->barrier = aarch64_barrier_options + default_value;
4423
4424     default:
4425       break;
4426     }
4427 }
4428
4429 /* Process the relocation type for move wide instructions.
4430    Return TRUE on success; otherwise return FALSE.  */
4431
4432 static bfd_boolean
4433 process_movw_reloc_info (void)
4434 {
4435   int is32;
4436   unsigned shift;
4437
4438   is32 = inst.base.operands[0].qualifier == AARCH64_OPND_QLF_W ? 1 : 0;
4439
4440   if (inst.base.opcode->op == OP_MOVK)
4441     switch (inst.reloc.type)
4442       {
4443       case BFD_RELOC_AARCH64_MOVW_G0_S:
4444       case BFD_RELOC_AARCH64_MOVW_G1_S:
4445       case BFD_RELOC_AARCH64_MOVW_G2_S:
4446       case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
4447       case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
4448       case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
4449       case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
4450       case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
4451         set_syntax_error
4452           (_("the specified relocation type is not allowed for MOVK"));
4453         return FALSE;
4454       default:
4455         break;
4456       }
4457
4458   switch (inst.reloc.type)
4459     {
4460     case BFD_RELOC_AARCH64_MOVW_G0:
4461     case BFD_RELOC_AARCH64_MOVW_G0_S:
4462     case BFD_RELOC_AARCH64_MOVW_G0_NC:
4463     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
4464     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
4465       shift = 0;
4466       break;
4467     case BFD_RELOC_AARCH64_MOVW_G1:
4468     case BFD_RELOC_AARCH64_MOVW_G1_S:
4469     case BFD_RELOC_AARCH64_MOVW_G1_NC:
4470     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
4471     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
4472       shift = 16;
4473       break;
4474     case BFD_RELOC_AARCH64_MOVW_G2:
4475     case BFD_RELOC_AARCH64_MOVW_G2_S:
4476     case BFD_RELOC_AARCH64_MOVW_G2_NC:
4477     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
4478       if (is32)
4479         {
4480           set_fatal_syntax_error
4481             (_("the specified relocation type is not allowed for 32-bit "
4482                "register"));
4483           return FALSE;
4484         }
4485       shift = 32;
4486       break;
4487     case BFD_RELOC_AARCH64_MOVW_G3:
4488       if (is32)
4489         {
4490           set_fatal_syntax_error
4491             (_("the specified relocation type is not allowed for 32-bit "
4492                "register"));
4493           return FALSE;
4494         }
4495       shift = 48;
4496       break;
4497     default:
4498       /* More cases should be added when more MOVW-related relocation types
4499          are supported in GAS.  */
4500       gas_assert (aarch64_gas_internal_fixup_p ());
4501       /* The shift amount should have already been set by the parser.  */
4502       return TRUE;
4503     }
4504   inst.base.operands[1].shifter.amount = shift;
4505   return TRUE;
4506 }
4507
4508 /* A primitive log caculator.  */
4509
4510 static inline unsigned int
4511 get_logsz (unsigned int size)
4512 {
4513   const unsigned char ls[16] =
4514     {0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4};
4515   if (size > 16)
4516     {
4517       gas_assert (0);
4518       return -1;
4519     }
4520   gas_assert (ls[size - 1] != (unsigned char)-1);
4521   return ls[size - 1];
4522 }
4523
4524 /* Determine and return the real reloc type code for an instruction
4525    with the pseudo reloc type code BFD_RELOC_AARCH64_LDST_LO12.  */
4526
4527 static inline bfd_reloc_code_real_type
4528 ldst_lo12_determine_real_reloc_type (void)
4529 {
4530   int logsz;
4531   enum aarch64_opnd_qualifier opd0_qlf = inst.base.operands[0].qualifier;
4532   enum aarch64_opnd_qualifier opd1_qlf = inst.base.operands[1].qualifier;
4533
4534   const bfd_reloc_code_real_type reloc_ldst_lo12[5] = {
4535       BFD_RELOC_AARCH64_LDST8_LO12, BFD_RELOC_AARCH64_LDST16_LO12,
4536       BFD_RELOC_AARCH64_LDST32_LO12, BFD_RELOC_AARCH64_LDST64_LO12,
4537       BFD_RELOC_AARCH64_LDST128_LO12
4538   };
4539
4540   gas_assert (inst.reloc.type == BFD_RELOC_AARCH64_LDST_LO12);
4541   gas_assert (inst.base.opcode->operands[1] == AARCH64_OPND_ADDR_UIMM12);
4542
4543   if (opd1_qlf == AARCH64_OPND_QLF_NIL)
4544     opd1_qlf =
4545       aarch64_get_expected_qualifier (inst.base.opcode->qualifiers_list,
4546                                       1, opd0_qlf, 0);
4547   gas_assert (opd1_qlf != AARCH64_OPND_QLF_NIL);
4548
4549   logsz = get_logsz (aarch64_get_qualifier_esize (opd1_qlf));
4550   gas_assert (logsz >= 0 && logsz <= 4);
4551
4552   return reloc_ldst_lo12[logsz];
4553 }
4554
4555 /* Check whether a register list REGINFO is valid.  The registers must be
4556    numbered in increasing order (modulo 32), in increments of one or two.
4557
4558    If ACCEPT_ALTERNATE is non-zero, the register numbers should be in
4559    increments of two.
4560
4561    Return FALSE if such a register list is invalid, otherwise return TRUE.  */
4562
4563 static bfd_boolean
4564 reg_list_valid_p (uint32_t reginfo, int accept_alternate)
4565 {
4566   uint32_t i, nb_regs, prev_regno, incr;
4567
4568   nb_regs = 1 + (reginfo & 0x3);
4569   reginfo >>= 2;
4570   prev_regno = reginfo & 0x1f;
4571   incr = accept_alternate ? 2 : 1;
4572
4573   for (i = 1; i < nb_regs; ++i)
4574     {
4575       uint32_t curr_regno;
4576       reginfo >>= 5;
4577       curr_regno = reginfo & 0x1f;
4578       if (curr_regno != ((prev_regno + incr) & 0x1f))
4579         return FALSE;
4580       prev_regno = curr_regno;
4581     }
4582
4583   return TRUE;
4584 }
4585
4586 /* Generic instruction operand parser.  This does no encoding and no
4587    semantic validation; it merely squirrels values away in the inst
4588    structure.  Returns TRUE or FALSE depending on whether the
4589    specified grammar matched.  */
4590
4591 static bfd_boolean
4592 parse_operands (char *str, const aarch64_opcode *opcode)
4593 {
4594   int i;
4595   char *backtrack_pos = 0;
4596   const enum aarch64_opnd *operands = opcode->operands;
4597
4598   clear_error ();
4599   skip_whitespace (str);
4600
4601   for (i = 0; operands[i] != AARCH64_OPND_NIL; i++)
4602     {
4603       int64_t val;
4604       int isreg32, isregzero;
4605       int comma_skipped_p = 0;
4606       aarch64_reg_type rtype;
4607       struct neon_type_el vectype;
4608       aarch64_opnd_info *info = &inst.base.operands[i];
4609
4610       DEBUG_TRACE ("parse operand %d", i);
4611
4612       /* Assign the operand code.  */
4613       info->type = operands[i];
4614
4615       if (optional_operand_p (opcode, i))
4616         {
4617           /* Remember where we are in case we need to backtrack.  */
4618           gas_assert (!backtrack_pos);
4619           backtrack_pos = str;
4620         }
4621
4622       /* Expect comma between operands; the backtrack mechanizm will take
4623          care of cases of omitted optional operand.  */
4624       if (i > 0 && ! skip_past_char (&str, ','))
4625         {
4626           set_syntax_error (_("comma expected between operands"));
4627           goto failure;
4628         }
4629       else
4630         comma_skipped_p = 1;
4631
4632       switch (operands[i])
4633         {
4634         case AARCH64_OPND_Rd:
4635         case AARCH64_OPND_Rn:
4636         case AARCH64_OPND_Rm:
4637         case AARCH64_OPND_Rt:
4638         case AARCH64_OPND_Rt2:
4639         case AARCH64_OPND_Rs:
4640         case AARCH64_OPND_Ra:
4641         case AARCH64_OPND_Rt_SYS:
4642         case AARCH64_OPND_PAIRREG:
4643           po_int_reg_or_fail (1, 0);
4644           break;
4645
4646         case AARCH64_OPND_Rd_SP:
4647         case AARCH64_OPND_Rn_SP:
4648           po_int_reg_or_fail (0, 1);
4649           break;
4650
4651         case AARCH64_OPND_Rm_EXT:
4652         case AARCH64_OPND_Rm_SFT:
4653           po_misc_or_fail (parse_shifter_operand
4654                            (&str, info, (operands[i] == AARCH64_OPND_Rm_EXT
4655                                          ? SHIFTED_ARITH_IMM
4656                                          : SHIFTED_LOGIC_IMM)));
4657           if (!info->shifter.operator_present)
4658             {
4659               /* Default to LSL if not present.  Libopcodes prefers shifter
4660                  kind to be explicit.  */
4661               gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
4662               info->shifter.kind = AARCH64_MOD_LSL;
4663               /* For Rm_EXT, libopcodes will carry out further check on whether
4664                  or not stack pointer is used in the instruction (Recall that
4665                  "the extend operator is not optional unless at least one of
4666                  "Rd" or "Rn" is '11111' (i.e. WSP)").  */
4667             }
4668           break;
4669
4670         case AARCH64_OPND_Fd:
4671         case AARCH64_OPND_Fn:
4672         case AARCH64_OPND_Fm:
4673         case AARCH64_OPND_Fa:
4674         case AARCH64_OPND_Ft:
4675         case AARCH64_OPND_Ft2:
4676         case AARCH64_OPND_Sd:
4677         case AARCH64_OPND_Sn:
4678         case AARCH64_OPND_Sm:
4679           val = aarch64_reg_parse (&str, REG_TYPE_BHSDQ, &rtype, NULL);
4680           if (val == PARSE_FAIL)
4681             {
4682               first_error (_(get_reg_expected_msg (REG_TYPE_BHSDQ)));
4683               goto failure;
4684             }
4685           gas_assert (rtype >= REG_TYPE_FP_B && rtype <= REG_TYPE_FP_Q);
4686
4687           info->reg.regno = val;
4688           info->qualifier = AARCH64_OPND_QLF_S_B + (rtype - REG_TYPE_FP_B);
4689           break;
4690
4691         case AARCH64_OPND_Vd:
4692         case AARCH64_OPND_Vn:
4693         case AARCH64_OPND_Vm:
4694           val = aarch64_reg_parse (&str, REG_TYPE_VN, NULL, &vectype);
4695           if (val == PARSE_FAIL)
4696             {
4697               first_error (_(get_reg_expected_msg (REG_TYPE_VN)));
4698               goto failure;
4699             }
4700           if (vectype.defined & NTA_HASINDEX)
4701             goto failure;
4702
4703           info->reg.regno = val;
4704           info->qualifier = vectype_to_qualifier (&vectype);
4705           if (info->qualifier == AARCH64_OPND_QLF_NIL)
4706             goto failure;
4707           break;
4708
4709         case AARCH64_OPND_VdD1:
4710         case AARCH64_OPND_VnD1:
4711           val = aarch64_reg_parse (&str, REG_TYPE_VN, NULL, &vectype);
4712           if (val == PARSE_FAIL)
4713             {
4714               set_first_syntax_error (_(get_reg_expected_msg (REG_TYPE_VN)));
4715               goto failure;
4716             }
4717           if (vectype.type != NT_d || vectype.index != 1)
4718             {
4719               set_fatal_syntax_error
4720                 (_("the top half of a 128-bit FP/SIMD register is expected"));
4721               goto failure;
4722             }
4723           info->reg.regno = val;
4724           /* N.B: VdD1 and VnD1 are treated as an fp or advsimd scalar register
4725              here; it is correct for the purpose of encoding/decoding since
4726              only the register number is explicitly encoded in the related
4727              instructions, although this appears a bit hacky.  */
4728           info->qualifier = AARCH64_OPND_QLF_S_D;
4729           break;
4730
4731         case AARCH64_OPND_Ed:
4732         case AARCH64_OPND_En:
4733         case AARCH64_OPND_Em:
4734           val = aarch64_reg_parse (&str, REG_TYPE_VN, NULL, &vectype);
4735           if (val == PARSE_FAIL)
4736             {
4737               first_error (_(get_reg_expected_msg (REG_TYPE_VN)));
4738               goto failure;
4739             }
4740           if (vectype.type == NT_invtype || !(vectype.defined & NTA_HASINDEX))
4741             goto failure;
4742
4743           info->reglane.regno = val;
4744           info->reglane.index = vectype.index;
4745           info->qualifier = vectype_to_qualifier (&vectype);
4746           if (info->qualifier == AARCH64_OPND_QLF_NIL)
4747             goto failure;
4748           break;
4749
4750         case AARCH64_OPND_LVn:
4751         case AARCH64_OPND_LVt:
4752         case AARCH64_OPND_LVt_AL:
4753         case AARCH64_OPND_LEt:
4754           if ((val = parse_neon_reg_list (&str, &vectype)) == PARSE_FAIL)
4755             goto failure;
4756           if (! reg_list_valid_p (val, /* accept_alternate */ 0))
4757             {
4758               set_fatal_syntax_error (_("invalid register list"));
4759               goto failure;
4760             }
4761           info->reglist.first_regno = (val >> 2) & 0x1f;
4762           info->reglist.num_regs = (val & 0x3) + 1;
4763           if (operands[i] == AARCH64_OPND_LEt)
4764             {
4765               if (!(vectype.defined & NTA_HASINDEX))
4766                 goto failure;
4767               info->reglist.has_index = 1;
4768               info->reglist.index = vectype.index;
4769             }
4770           else if (!(vectype.defined & NTA_HASTYPE))
4771             goto failure;
4772           info->qualifier = vectype_to_qualifier (&vectype);
4773           if (info->qualifier == AARCH64_OPND_QLF_NIL)
4774             goto failure;
4775           break;
4776
4777         case AARCH64_OPND_Cn:
4778         case AARCH64_OPND_Cm:
4779           po_reg_or_fail (REG_TYPE_CN);
4780           if (val > 15)
4781             {
4782               set_fatal_syntax_error (_(get_reg_expected_msg (REG_TYPE_CN)));
4783               goto failure;
4784             }
4785           inst.base.operands[i].reg.regno = val;
4786           break;
4787
4788         case AARCH64_OPND_SHLL_IMM:
4789         case AARCH64_OPND_IMM_VLSR:
4790           po_imm_or_fail (1, 64);
4791           info->imm.value = val;
4792           break;
4793
4794         case AARCH64_OPND_CCMP_IMM:
4795         case AARCH64_OPND_FBITS:
4796         case AARCH64_OPND_UIMM4:
4797         case AARCH64_OPND_UIMM3_OP1:
4798         case AARCH64_OPND_UIMM3_OP2:
4799         case AARCH64_OPND_IMM_VLSL:
4800         case AARCH64_OPND_IMM:
4801         case AARCH64_OPND_WIDTH:
4802           po_imm_nc_or_fail ();
4803           info->imm.value = val;
4804           break;
4805
4806         case AARCH64_OPND_UIMM7:
4807           po_imm_or_fail (0, 127);
4808           info->imm.value = val;
4809           break;
4810
4811         case AARCH64_OPND_IDX:
4812         case AARCH64_OPND_BIT_NUM:
4813         case AARCH64_OPND_IMMR:
4814         case AARCH64_OPND_IMMS:
4815           po_imm_or_fail (0, 63);
4816           info->imm.value = val;
4817           break;
4818
4819         case AARCH64_OPND_IMM0:
4820           po_imm_nc_or_fail ();
4821           if (val != 0)
4822             {
4823               set_fatal_syntax_error (_("immediate zero expected"));
4824               goto failure;
4825             }
4826           info->imm.value = 0;
4827           break;
4828
4829         case AARCH64_OPND_FPIMM0:
4830           {
4831             int qfloat;
4832             bfd_boolean res1 = FALSE, res2 = FALSE;
4833             /* N.B. -0.0 will be rejected; although -0.0 shouldn't be rejected,
4834                it is probably not worth the effort to support it.  */
4835             if (!(res1 = parse_aarch64_imm_float (&str, &qfloat, FALSE))
4836                 && !(res2 = parse_constant_immediate (&str, &val)))
4837               goto failure;
4838             if ((res1 && qfloat == 0) || (res2 && val == 0))
4839               {
4840                 info->imm.value = 0;
4841                 info->imm.is_fp = 1;
4842                 break;
4843               }
4844             set_fatal_syntax_error (_("immediate zero expected"));
4845             goto failure;
4846           }
4847
4848         case AARCH64_OPND_IMM_MOV:
4849           {
4850             char *saved = str;
4851             if (reg_name_p (str, REG_TYPE_R_Z_SP) ||
4852                 reg_name_p (str, REG_TYPE_VN))
4853               goto failure;
4854             str = saved;
4855             po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
4856                                                 GE_OPT_PREFIX, 1));
4857             /* The MOV immediate alias will be fixed up by fix_mov_imm_insn
4858                later.  fix_mov_imm_insn will try to determine a machine
4859                instruction (MOVZ, MOVN or ORR) for it and will issue an error
4860                message if the immediate cannot be moved by a single
4861                instruction.  */
4862             aarch64_set_gas_internal_fixup (&inst.reloc, info, 1);
4863             inst.base.operands[i].skip = 1;
4864           }
4865           break;
4866
4867         case AARCH64_OPND_SIMD_IMM:
4868         case AARCH64_OPND_SIMD_IMM_SFT:
4869           if (! parse_big_immediate (&str, &val))
4870             goto failure;
4871           assign_imm_if_const_or_fixup_later (&inst.reloc, info,
4872                                               /* addr_off_p */ 0,
4873                                               /* need_libopcodes_p */ 1,
4874                                               /* skip_p */ 1);
4875           /* Parse shift.
4876              N.B. although AARCH64_OPND_SIMD_IMM doesn't permit any
4877              shift, we don't check it here; we leave the checking to
4878              the libopcodes (operand_general_constraint_met_p).  By
4879              doing this, we achieve better diagnostics.  */
4880           if (skip_past_comma (&str)
4881               && ! parse_shift (&str, info, SHIFTED_LSL_MSL))
4882             goto failure;
4883           if (!info->shifter.operator_present
4884               && info->type == AARCH64_OPND_SIMD_IMM_SFT)
4885             {
4886               /* Default to LSL if not present.  Libopcodes prefers shifter
4887                  kind to be explicit.  */
4888               gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
4889               info->shifter.kind = AARCH64_MOD_LSL;
4890             }
4891           break;
4892
4893         case AARCH64_OPND_FPIMM:
4894         case AARCH64_OPND_SIMD_FPIMM:
4895           {
4896             int qfloat;
4897             bfd_boolean dp_p
4898               = (aarch64_get_qualifier_esize (inst.base.operands[0].qualifier)
4899                  == 8);
4900             if (! parse_aarch64_imm_float (&str, &qfloat, dp_p))
4901               goto failure;
4902             if (qfloat == 0)
4903               {
4904                 set_fatal_syntax_error (_("invalid floating-point constant"));
4905                 goto failure;
4906               }
4907             inst.base.operands[i].imm.value = encode_imm_float_bits (qfloat);
4908             inst.base.operands[i].imm.is_fp = 1;
4909           }
4910           break;
4911
4912         case AARCH64_OPND_LIMM:
4913           po_misc_or_fail (parse_shifter_operand (&str, info,
4914                                                   SHIFTED_LOGIC_IMM));
4915           if (info->shifter.operator_present)
4916             {
4917               set_fatal_syntax_error
4918                 (_("shift not allowed for bitmask immediate"));
4919               goto failure;
4920             }
4921           assign_imm_if_const_or_fixup_later (&inst.reloc, info,
4922                                               /* addr_off_p */ 0,
4923                                               /* need_libopcodes_p */ 1,
4924                                               /* skip_p */ 1);
4925           break;
4926
4927         case AARCH64_OPND_AIMM:
4928           if (opcode->op == OP_ADD)
4929             /* ADD may have relocation types.  */
4930             po_misc_or_fail (parse_shifter_operand_reloc (&str, info,
4931                                                           SHIFTED_ARITH_IMM));
4932           else
4933             po_misc_or_fail (parse_shifter_operand (&str, info,
4934                                                     SHIFTED_ARITH_IMM));
4935           switch (inst.reloc.type)
4936             {
4937             case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
4938               info->shifter.amount = 12;
4939               break;
4940             case BFD_RELOC_UNUSED:
4941               aarch64_set_gas_internal_fixup (&inst.reloc, info, 0);
4942               if (info->shifter.kind != AARCH64_MOD_NONE)
4943                 inst.reloc.flags = FIXUP_F_HAS_EXPLICIT_SHIFT;
4944               inst.reloc.pc_rel = 0;
4945               break;
4946             default:
4947               break;
4948             }
4949           info->imm.value = 0;
4950           if (!info->shifter.operator_present)
4951             {
4952               /* Default to LSL if not present.  Libopcodes prefers shifter
4953                  kind to be explicit.  */
4954               gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
4955               info->shifter.kind = AARCH64_MOD_LSL;
4956             }
4957           break;
4958
4959         case AARCH64_OPND_HALF:
4960             {
4961               /* #<imm16> or relocation.  */
4962               int internal_fixup_p;
4963               po_misc_or_fail (parse_half (&str, &internal_fixup_p));
4964               if (internal_fixup_p)
4965                 aarch64_set_gas_internal_fixup (&inst.reloc, info, 0);
4966               skip_whitespace (str);
4967               if (skip_past_comma (&str))
4968                 {
4969                   /* {, LSL #<shift>}  */
4970                   if (! aarch64_gas_internal_fixup_p ())
4971                     {
4972                       set_fatal_syntax_error (_("can't mix relocation modifier "
4973                                                 "with explicit shift"));
4974                       goto failure;
4975                     }
4976                   po_misc_or_fail (parse_shift (&str, info, SHIFTED_LSL));
4977                 }
4978               else
4979                 inst.base.operands[i].shifter.amount = 0;
4980               inst.base.operands[i].shifter.kind = AARCH64_MOD_LSL;
4981               inst.base.operands[i].imm.value = 0;
4982               if (! process_movw_reloc_info ())
4983                 goto failure;
4984             }
4985           break;
4986
4987         case AARCH64_OPND_EXCEPTION:
4988           po_misc_or_fail (parse_immediate_expression (&str, &inst.reloc.exp));
4989           assign_imm_if_const_or_fixup_later (&inst.reloc, info,
4990                                               /* addr_off_p */ 0,
4991                                               /* need_libopcodes_p */ 0,
4992                                               /* skip_p */ 1);
4993           break;
4994
4995         case AARCH64_OPND_NZCV:
4996           {
4997             const asm_nzcv *nzcv = hash_find_n (aarch64_nzcv_hsh, str, 4);
4998             if (nzcv != NULL)
4999               {
5000                 str += 4;
5001                 info->imm.value = nzcv->value;
5002                 break;
5003               }
5004             po_imm_or_fail (0, 15);
5005             info->imm.value = val;
5006           }
5007           break;
5008
5009         case AARCH64_OPND_COND:
5010         case AARCH64_OPND_COND1:
5011           info->cond = hash_find_n (aarch64_cond_hsh, str, 2);
5012           str += 2;
5013           if (info->cond == NULL)
5014             {
5015               set_syntax_error (_("invalid condition"));
5016               goto failure;
5017             }
5018           else if (operands[i] == AARCH64_OPND_COND1
5019                    && (info->cond->value & 0xe) == 0xe)
5020             {
5021               /* Not allow AL or NV.  */
5022               set_default_error ();
5023               goto failure;
5024             }
5025           break;
5026
5027         case AARCH64_OPND_ADDR_ADRP:
5028           po_misc_or_fail (parse_adrp (&str));
5029           /* Clear the value as operand needs to be relocated.  */
5030           info->imm.value = 0;
5031           break;
5032
5033         case AARCH64_OPND_ADDR_PCREL14:
5034         case AARCH64_OPND_ADDR_PCREL19:
5035         case AARCH64_OPND_ADDR_PCREL21:
5036         case AARCH64_OPND_ADDR_PCREL26:
5037           po_misc_or_fail (parse_address_reloc (&str, info));
5038           if (!info->addr.pcrel)
5039             {
5040               set_syntax_error (_("invalid pc-relative address"));
5041               goto failure;
5042             }
5043           if (inst.gen_lit_pool
5044               && (opcode->iclass != loadlit || opcode->op == OP_PRFM_LIT))
5045             {
5046               /* Only permit "=value" in the literal load instructions.
5047                  The literal will be generated by programmer_friendly_fixup.  */
5048               set_syntax_error (_("invalid use of \"=immediate\""));
5049               goto failure;
5050             }
5051           if (inst.reloc.exp.X_op == O_symbol && find_reloc_table_entry (&str))
5052             {
5053               set_syntax_error (_("unrecognized relocation suffix"));
5054               goto failure;
5055             }
5056           if (inst.reloc.exp.X_op == O_constant && !inst.gen_lit_pool)
5057             {
5058               info->imm.value = inst.reloc.exp.X_add_number;
5059               inst.reloc.type = BFD_RELOC_UNUSED;
5060             }
5061           else
5062             {
5063               info->imm.value = 0;
5064               if (inst.reloc.type == BFD_RELOC_UNUSED)
5065                 switch (opcode->iclass)
5066                   {
5067                   case compbranch:
5068                   case condbranch:
5069                     /* e.g. CBZ or B.COND  */
5070                     gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL19);
5071                     inst.reloc.type = BFD_RELOC_AARCH64_BRANCH19;
5072                     break;
5073                   case testbranch:
5074                     /* e.g. TBZ  */
5075                     gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL14);
5076                     inst.reloc.type = BFD_RELOC_AARCH64_TSTBR14;
5077                     break;
5078                   case branch_imm:
5079                     /* e.g. B or BL  */
5080                     gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL26);
5081                     inst.reloc.type =
5082                       (opcode->op == OP_BL) ? BFD_RELOC_AARCH64_CALL26
5083                          : BFD_RELOC_AARCH64_JUMP26;
5084                     break;
5085                   case loadlit:
5086                     gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL19);
5087                     inst.reloc.type = BFD_RELOC_AARCH64_LD_LO19_PCREL;
5088                     break;
5089                   case pcreladdr:
5090                     gas_assert (operands[i] == AARCH64_OPND_ADDR_PCREL21);
5091                     inst.reloc.type = BFD_RELOC_AARCH64_ADR_LO21_PCREL;
5092                     break;
5093                   default:
5094                     gas_assert (0);
5095                     abort ();
5096                   }
5097               inst.reloc.pc_rel = 1;
5098             }
5099           break;
5100
5101         case AARCH64_OPND_ADDR_SIMPLE:
5102         case AARCH64_OPND_SIMD_ADDR_SIMPLE:
5103           /* [<Xn|SP>{, #<simm>}]  */
5104           po_char_or_fail ('[');
5105           po_reg_or_fail (REG_TYPE_R64_SP);
5106           /* Accept optional ", #0".  */
5107           if (operands[i] == AARCH64_OPND_ADDR_SIMPLE
5108               && skip_past_char (&str, ','))
5109             {
5110               skip_past_char (&str, '#');
5111               if (! skip_past_char (&str, '0'))
5112                 {
5113                   set_fatal_syntax_error
5114                     (_("the optional immediate offset can only be 0"));
5115                   goto failure;
5116                 }
5117             }
5118           po_char_or_fail (']');
5119           info->addr.base_regno = val;
5120           break;
5121
5122         case AARCH64_OPND_ADDR_REGOFF:
5123           /* [<Xn|SP>, <R><m>{, <extend> {<amount>}}]  */
5124           po_misc_or_fail (parse_address (&str, info, 0));
5125           if (info->addr.pcrel || !info->addr.offset.is_reg
5126               || !info->addr.preind || info->addr.postind
5127               || info->addr.writeback)
5128             {
5129               set_syntax_error (_("invalid addressing mode"));
5130               goto failure;
5131             }
5132           if (!info->shifter.operator_present)
5133             {
5134               /* Default to LSL if not present.  Libopcodes prefers shifter
5135                  kind to be explicit.  */
5136               gas_assert (info->shifter.kind == AARCH64_MOD_NONE);
5137               info->shifter.kind = AARCH64_MOD_LSL;
5138             }
5139           /* Qualifier to be deduced by libopcodes.  */
5140           break;
5141
5142         case AARCH64_OPND_ADDR_SIMM7:
5143           po_misc_or_fail (parse_address (&str, info, 0));
5144           if (info->addr.pcrel || info->addr.offset.is_reg
5145               || (!info->addr.preind && !info->addr.postind))
5146             {
5147               set_syntax_error (_("invalid addressing mode"));
5148               goto failure;
5149             }
5150           assign_imm_if_const_or_fixup_later (&inst.reloc, info,
5151                                               /* addr_off_p */ 1,
5152                                               /* need_libopcodes_p */ 1,
5153                                               /* skip_p */ 0);
5154           break;
5155
5156         case AARCH64_OPND_ADDR_SIMM9:
5157         case AARCH64_OPND_ADDR_SIMM9_2:
5158           po_misc_or_fail (parse_address_reloc (&str, info));
5159           if (info->addr.pcrel || info->addr.offset.is_reg
5160               || (!info->addr.preind && !info->addr.postind)
5161               || (operands[i] == AARCH64_OPND_ADDR_SIMM9_2
5162                   && info->addr.writeback))
5163             {
5164               set_syntax_error (_("invalid addressing mode"));
5165               goto failure;
5166             }
5167           if (inst.reloc.type != BFD_RELOC_UNUSED)
5168             {
5169               set_syntax_error (_("relocation not allowed"));
5170               goto failure;
5171             }
5172           assign_imm_if_const_or_fixup_later (&inst.reloc, info,
5173                                               /* addr_off_p */ 1,
5174                                               /* need_libopcodes_p */ 1,
5175                                               /* skip_p */ 0);
5176           break;
5177
5178         case AARCH64_OPND_ADDR_UIMM12:
5179           po_misc_or_fail (parse_address_reloc (&str, info));
5180           if (info->addr.pcrel || info->addr.offset.is_reg
5181               || !info->addr.preind || info->addr.writeback)
5182             {
5183               set_syntax_error (_("invalid addressing mode"));
5184               goto failure;
5185             }
5186           if (inst.reloc.type == BFD_RELOC_UNUSED)
5187             aarch64_set_gas_internal_fixup (&inst.reloc, info, 1);
5188           else if (inst.reloc.type == BFD_RELOC_AARCH64_LDST_LO12)
5189             inst.reloc.type = ldst_lo12_determine_real_reloc_type ();
5190           /* Leave qualifier to be determined by libopcodes.  */
5191           break;
5192
5193         case AARCH64_OPND_SIMD_ADDR_POST:
5194           /* [<Xn|SP>], <Xm|#<amount>>  */
5195           po_misc_or_fail (parse_address (&str, info, 1));
5196           if (!info->addr.postind || !info->addr.writeback)
5197             {
5198               set_syntax_error (_("invalid addressing mode"));
5199               goto failure;
5200             }
5201           if (!info->addr.offset.is_reg)
5202             {
5203               if (inst.reloc.exp.X_op == O_constant)
5204                 info->addr.offset.imm = inst.reloc.exp.X_add_number;
5205               else
5206                 {
5207                   set_fatal_syntax_error
5208                     (_("writeback value should be an immediate constant"));
5209                   goto failure;
5210                 }
5211             }
5212           /* No qualifier.  */
5213           break;
5214
5215         case AARCH64_OPND_SYSREG:
5216           if ((val = parse_sys_reg (&str, aarch64_sys_regs_hsh, 1))
5217               == PARSE_FAIL)
5218             {
5219               set_syntax_error (_("unknown or missing system register name"));
5220               goto failure;
5221             }
5222           inst.base.operands[i].sysreg = val;
5223           break;
5224
5225         case AARCH64_OPND_PSTATEFIELD:
5226           if ((val = parse_sys_reg (&str, aarch64_pstatefield_hsh, 0))
5227               == PARSE_FAIL)
5228             {
5229               set_syntax_error (_("unknown or missing PSTATE field name"));
5230               goto failure;
5231             }
5232           inst.base.operands[i].pstatefield = val;
5233           break;
5234
5235         case AARCH64_OPND_SYSREG_IC:
5236           inst.base.operands[i].sysins_op =
5237             parse_sys_ins_reg (&str, aarch64_sys_regs_ic_hsh);
5238           goto sys_reg_ins;
5239         case AARCH64_OPND_SYSREG_DC:
5240           inst.base.operands[i].sysins_op =
5241             parse_sys_ins_reg (&str, aarch64_sys_regs_dc_hsh);
5242           goto sys_reg_ins;
5243         case AARCH64_OPND_SYSREG_AT:
5244           inst.base.operands[i].sysins_op =
5245             parse_sys_ins_reg (&str, aarch64_sys_regs_at_hsh);
5246           goto sys_reg_ins;
5247         case AARCH64_OPND_SYSREG_TLBI:
5248           inst.base.operands[i].sysins_op =
5249             parse_sys_ins_reg (&str, aarch64_sys_regs_tlbi_hsh);
5250 sys_reg_ins:
5251           if (inst.base.operands[i].sysins_op == NULL)
5252             {
5253               set_fatal_syntax_error ( _("unknown or missing operation name"));
5254               goto failure;
5255             }
5256           break;
5257
5258         case AARCH64_OPND_BARRIER:
5259         case AARCH64_OPND_BARRIER_ISB:
5260           val = parse_barrier (&str);
5261           if (val != PARSE_FAIL
5262               && operands[i] == AARCH64_OPND_BARRIER_ISB && val != 0xf)
5263             {
5264               /* ISB only accepts options name 'sy'.  */
5265               set_syntax_error
5266                 (_("the specified option is not accepted in ISB"));
5267               /* Turn off backtrack as this optional operand is present.  */
5268               backtrack_pos = 0;
5269               goto failure;
5270             }
5271           /* This is an extension to accept a 0..15 immediate.  */
5272           if (val == PARSE_FAIL)
5273             po_imm_or_fail (0, 15);
5274           info->barrier = aarch64_barrier_options + val;
5275           break;
5276
5277         case AARCH64_OPND_PRFOP:
5278           val = parse_pldop (&str);
5279           /* This is an extension to accept a 0..31 immediate.  */
5280           if (val == PARSE_FAIL)
5281             po_imm_or_fail (0, 31);
5282           inst.base.operands[i].prfop = aarch64_prfops + val;
5283           break;
5284
5285         default:
5286           as_fatal (_("unhandled operand code %d"), operands[i]);
5287         }
5288
5289       /* If we get here, this operand was successfully parsed.  */
5290       inst.base.operands[i].present = 1;
5291       continue;
5292
5293 failure:
5294       /* The parse routine should already have set the error, but in case
5295          not, set a default one here.  */
5296       if (! error_p ())
5297         set_default_error ();
5298
5299       if (! backtrack_pos)
5300         goto parse_operands_return;
5301
5302       {
5303         /* We reach here because this operand is marked as optional, and
5304            either no operand was supplied or the operand was supplied but it
5305            was syntactically incorrect.  In the latter case we report an
5306            error.  In the former case we perform a few more checks before
5307            dropping through to the code to insert the default operand.  */
5308
5309         char *tmp = backtrack_pos;
5310         char endchar = END_OF_INSN;
5311
5312         if (i != (aarch64_num_of_operands (opcode) - 1))
5313           endchar = ',';
5314         skip_past_char (&tmp, ',');
5315
5316         if (*tmp != endchar)
5317           /* The user has supplied an operand in the wrong format.  */
5318           goto parse_operands_return;
5319
5320         /* Make sure there is not a comma before the optional operand.
5321            For example the fifth operand of 'sys' is optional:
5322
5323              sys #0,c0,c0,#0,  <--- wrong
5324              sys #0,c0,c0,#0   <--- correct.  */
5325         if (comma_skipped_p && i && endchar == END_OF_INSN)
5326           {
5327             set_fatal_syntax_error
5328               (_("unexpected comma before the omitted optional operand"));
5329             goto parse_operands_return;
5330           }
5331       }
5332
5333       /* Reaching here means we are dealing with an optional operand that is
5334          omitted from the assembly line.  */
5335       gas_assert (optional_operand_p (opcode, i));
5336       info->present = 0;
5337       process_omitted_operand (operands[i], opcode, i, info);
5338
5339       /* Try again, skipping the optional operand at backtrack_pos.  */
5340       str = backtrack_pos;
5341       backtrack_pos = 0;
5342
5343       /* Clear any error record after the omitted optional operand has been
5344          successfully handled.  */
5345       clear_error ();
5346     }
5347
5348   /* Check if we have parsed all the operands.  */
5349   if (*str != '\0' && ! error_p ())
5350     {
5351       /* Set I to the index of the last present operand; this is
5352          for the purpose of diagnostics.  */
5353       for (i -= 1; i >= 0 && !inst.base.operands[i].present; --i)
5354         ;
5355       set_fatal_syntax_error
5356         (_("unexpected characters following instruction"));
5357     }
5358
5359 parse_operands_return:
5360
5361   if (error_p ())
5362     {
5363       DEBUG_TRACE ("parsing FAIL: %s - %s",
5364                    operand_mismatch_kind_names[get_error_kind ()],
5365                    get_error_message ());
5366       /* Record the operand error properly; this is useful when there
5367          are multiple instruction templates for a mnemonic name, so that
5368          later on, we can select the error that most closely describes
5369          the problem.  */
5370       record_operand_error (opcode, i, get_error_kind (),
5371                             get_error_message ());
5372       return FALSE;
5373     }
5374   else
5375     {
5376       DEBUG_TRACE ("parsing SUCCESS");
5377       return TRUE;
5378     }
5379 }
5380
5381 /* It does some fix-up to provide some programmer friendly feature while
5382    keeping the libopcodes happy, i.e. libopcodes only accepts
5383    the preferred architectural syntax.
5384    Return FALSE if there is any failure; otherwise return TRUE.  */
5385
5386 static bfd_boolean
5387 programmer_friendly_fixup (aarch64_instruction *instr)
5388 {
5389   aarch64_inst *base = &instr->base;
5390   const aarch64_opcode *opcode = base->opcode;
5391   enum aarch64_op op = opcode->op;
5392   aarch64_opnd_info *operands = base->operands;
5393
5394   DEBUG_TRACE ("enter");
5395
5396   switch (opcode->iclass)
5397     {
5398     case testbranch:
5399       /* TBNZ Xn|Wn, #uimm6, label
5400          Test and Branch Not Zero: conditionally jumps to label if bit number
5401          uimm6 in register Xn is not zero.  The bit number implies the width of
5402          the register, which may be written and should be disassembled as Wn if
5403          uimm is less than 32.  */
5404       if (operands[0].qualifier == AARCH64_OPND_QLF_W)
5405         {
5406           if (operands[1].imm.value >= 32)
5407             {
5408               record_operand_out_of_range_error (opcode, 1, _("immediate value"),
5409                                                  0, 31);
5410               return FALSE;
5411             }
5412           operands[0].qualifier = AARCH64_OPND_QLF_X;
5413         }
5414       break;
5415     case loadlit:
5416       /* LDR Wt, label | =value
5417          As a convenience assemblers will typically permit the notation
5418          "=value" in conjunction with the pc-relative literal load instructions
5419          to automatically place an immediate value or symbolic address in a
5420          nearby literal pool and generate a hidden label which references it.
5421          ISREG has been set to 0 in the case of =value.  */
5422       if (instr->gen_lit_pool
5423           && (op == OP_LDR_LIT || op == OP_LDRV_LIT || op == OP_LDRSW_LIT))
5424         {
5425           int size = aarch64_get_qualifier_esize (operands[0].qualifier);
5426           if (op == OP_LDRSW_LIT)
5427             size = 4;
5428           if (instr->reloc.exp.X_op != O_constant
5429               && instr->reloc.exp.X_op != O_big
5430               && instr->reloc.exp.X_op != O_symbol)
5431             {
5432               record_operand_error (opcode, 1,
5433                                     AARCH64_OPDE_FATAL_SYNTAX_ERROR,
5434                                     _("constant expression expected"));
5435               return FALSE;
5436             }
5437           if (! add_to_lit_pool (&instr->reloc.exp, size))
5438             {
5439               record_operand_error (opcode, 1,
5440                                     AARCH64_OPDE_OTHER_ERROR,
5441                                     _("literal pool insertion failed"));
5442               return FALSE;
5443             }
5444         }
5445       break;
5446     case log_shift:
5447     case bitfield:
5448       /* UXT[BHW] Wd, Wn
5449          Unsigned Extend Byte|Halfword|Word: UXT[BH] is architectural alias
5450          for UBFM Wd,Wn,#0,#7|15, while UXTW is pseudo instruction which is
5451          encoded using ORR Wd, WZR, Wn (MOV Wd,Wn).
5452          A programmer-friendly assembler should accept a destination Xd in
5453          place of Wd, however that is not the preferred form for disassembly.
5454          */
5455       if ((op == OP_UXTB || op == OP_UXTH || op == OP_UXTW)
5456           && operands[1].qualifier == AARCH64_OPND_QLF_W
5457           && operands[0].qualifier == AARCH64_OPND_QLF_X)
5458         operands[0].qualifier = AARCH64_OPND_QLF_W;
5459       break;
5460
5461     case addsub_ext:
5462         {
5463           /* In the 64-bit form, the final register operand is written as Wm
5464              for all but the (possibly omitted) UXTX/LSL and SXTX
5465              operators.
5466              As a programmer-friendly assembler, we accept e.g.
5467              ADDS <Xd>, <Xn|SP>, <Xm>{, UXTB {#<amount>}} and change it to
5468              ADDS <Xd>, <Xn|SP>, <Wm>{, UXTB {#<amount>}}.  */
5469           int idx = aarch64_operand_index (opcode->operands,
5470                                            AARCH64_OPND_Rm_EXT);
5471           gas_assert (idx == 1 || idx == 2);
5472           if (operands[0].qualifier == AARCH64_OPND_QLF_X
5473               && operands[idx].qualifier == AARCH64_OPND_QLF_X
5474               && operands[idx].shifter.kind != AARCH64_MOD_LSL
5475               && operands[idx].shifter.kind != AARCH64_MOD_UXTX
5476               && operands[idx].shifter.kind != AARCH64_MOD_SXTX)
5477             operands[idx].qualifier = AARCH64_OPND_QLF_W;
5478         }
5479       break;
5480
5481     default:
5482       break;
5483     }
5484
5485   DEBUG_TRACE ("exit with SUCCESS");
5486   return TRUE;
5487 }
5488
5489 /* A wrapper function to interface with libopcodes on encoding and
5490    record the error message if there is any.
5491
5492    Return TRUE on success; otherwise return FALSE.  */
5493
5494 static bfd_boolean
5495 do_encode (const aarch64_opcode *opcode, aarch64_inst *instr,
5496            aarch64_insn *code)
5497 {
5498   aarch64_operand_error error_info;
5499   error_info.kind = AARCH64_OPDE_NIL;
5500   if (aarch64_opcode_encode (opcode, instr, code, NULL, &error_info))
5501     return TRUE;
5502   else
5503     {
5504       gas_assert (error_info.kind != AARCH64_OPDE_NIL);
5505       record_operand_error_info (opcode, &error_info);
5506       return FALSE;
5507     }
5508 }
5509
5510 #ifdef DEBUG_AARCH64
5511 static inline void
5512 dump_opcode_operands (const aarch64_opcode *opcode)
5513 {
5514   int i = 0;
5515   while (opcode->operands[i] != AARCH64_OPND_NIL)
5516     {
5517       aarch64_verbose ("\t\t opnd%d: %s", i,
5518                        aarch64_get_operand_name (opcode->operands[i])[0] != '\0'
5519                        ? aarch64_get_operand_name (opcode->operands[i])
5520                        : aarch64_get_operand_desc (opcode->operands[i]));
5521       ++i;
5522     }
5523 }
5524 #endif /* DEBUG_AARCH64 */
5525
5526 /* This is the guts of the machine-dependent assembler.  STR points to a
5527    machine dependent instruction.  This function is supposed to emit
5528    the frags/bytes it assembles to.  */
5529
5530 void
5531 md_assemble (char *str)
5532 {
5533   char *p = str;
5534   templates *template;
5535   aarch64_opcode *opcode;
5536   aarch64_inst *inst_base;
5537   unsigned saved_cond;
5538
5539   /* Align the previous label if needed.  */
5540   if (last_label_seen != NULL)
5541     {
5542       symbol_set_frag (last_label_seen, frag_now);
5543       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
5544       S_SET_SEGMENT (last_label_seen, now_seg);
5545     }
5546
5547   inst.reloc.type = BFD_RELOC_UNUSED;
5548
5549   DEBUG_TRACE ("\n\n");
5550   DEBUG_TRACE ("==============================");
5551   DEBUG_TRACE ("Enter md_assemble with %s", str);
5552
5553   template = opcode_lookup (&p);
5554   if (!template)
5555     {
5556       /* It wasn't an instruction, but it might be a register alias of
5557          the form alias .req reg directive.  */
5558       if (!create_register_alias (str, p))
5559         as_bad (_("unknown mnemonic `%s' -- `%s'"), get_mnemonic_name (str),
5560                 str);
5561       return;
5562     }
5563
5564   skip_whitespace (p);
5565   if (*p == ',')
5566     {
5567       as_bad (_("unexpected comma after the mnemonic name `%s' -- `%s'"),
5568               get_mnemonic_name (str), str);
5569       return;
5570     }
5571
5572   init_operand_error_report ();
5573
5574   saved_cond = inst.cond;
5575   reset_aarch64_instruction (&inst);
5576   inst.cond = saved_cond;
5577
5578   /* Iterate through all opcode entries with the same mnemonic name.  */
5579   do
5580     {
5581       opcode = template->opcode;
5582
5583       DEBUG_TRACE ("opcode %s found", opcode->name);
5584 #ifdef DEBUG_AARCH64
5585       if (debug_dump)
5586         dump_opcode_operands (opcode);
5587 #endif /* DEBUG_AARCH64 */
5588
5589       mapping_state (MAP_INSN);
5590
5591       inst_base = &inst.base;
5592       inst_base->opcode = opcode;
5593
5594       /* Truly conditionally executed instructions, e.g. b.cond.  */
5595       if (opcode->flags & F_COND)
5596         {
5597           gas_assert (inst.cond != COND_ALWAYS);
5598           inst_base->cond = get_cond_from_value (inst.cond);
5599           DEBUG_TRACE ("condition found %s", inst_base->cond->names[0]);
5600         }
5601       else if (inst.cond != COND_ALWAYS)
5602         {
5603           /* It shouldn't arrive here, where the assembly looks like a
5604              conditional instruction but the found opcode is unconditional.  */
5605           gas_assert (0);
5606           continue;
5607         }
5608
5609       if (parse_operands (p, opcode)
5610           && programmer_friendly_fixup (&inst)
5611           && do_encode (inst_base->opcode, &inst.base, &inst_base->value))
5612         {
5613           /* Check that this instruction is supported for this CPU.  */
5614           if (!opcode->avariant
5615               || !AARCH64_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant))
5616             {
5617               as_bad (_("selected processor does not support `%s'"), str);
5618               return;
5619             }
5620
5621           if (inst.reloc.type == BFD_RELOC_UNUSED
5622               || !inst.reloc.need_libopcodes_p)
5623             output_inst (NULL);
5624           else
5625             {
5626               /* If there is relocation generated for the instruction,
5627                  store the instruction information for the future fix-up.  */
5628               struct aarch64_inst *copy;
5629               gas_assert (inst.reloc.type != BFD_RELOC_UNUSED);
5630               if ((copy = xmalloc (sizeof (struct aarch64_inst))) == NULL)
5631                 abort ();
5632               memcpy (copy, &inst.base, sizeof (struct aarch64_inst));
5633               output_inst (copy);
5634             }
5635           return;
5636         }
5637
5638       template = template->next;
5639       if (template != NULL)
5640         {
5641           reset_aarch64_instruction (&inst);
5642           inst.cond = saved_cond;
5643         }
5644     }
5645   while (template != NULL);
5646
5647   /* Issue the error messages if any.  */
5648   output_operand_error_report (str);
5649 }
5650
5651 /* Various frobbings of labels and their addresses.  */
5652
5653 void
5654 aarch64_start_line_hook (void)
5655 {
5656   last_label_seen = NULL;
5657 }
5658
5659 void
5660 aarch64_frob_label (symbolS * sym)
5661 {
5662   last_label_seen = sym;
5663
5664   dwarf2_emit_label (sym);
5665 }
5666
5667 int
5668 aarch64_data_in_code (void)
5669 {
5670   if (!strncmp (input_line_pointer + 1, "data:", 5))
5671     {
5672       *input_line_pointer = '/';
5673       input_line_pointer += 5;
5674       *input_line_pointer = 0;
5675       return 1;
5676     }
5677
5678   return 0;
5679 }
5680
5681 char *
5682 aarch64_canonicalize_symbol_name (char *name)
5683 {
5684   int len;
5685
5686   if ((len = strlen (name)) > 5 && streq (name + len - 5, "/data"))
5687     *(name + len - 5) = 0;
5688
5689   return name;
5690 }
5691 \f
5692 /* Table of all register names defined by default.  The user can
5693    define additional names with .req.  Note that all register names
5694    should appear in both upper and lowercase variants.  Some registers
5695    also have mixed-case names.  */
5696
5697 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE }
5698 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
5699 #define REGSET31(p,t) \
5700   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
5701   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
5702   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
5703   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t), \
5704   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
5705   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
5706   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
5707   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t)
5708 #define REGSET(p,t) \
5709   REGSET31(p,t), REGNUM(p,31,t)
5710
5711 /* These go into aarch64_reg_hsh hash-table.  */
5712 static const reg_entry reg_names[] = {
5713   /* Integer registers.  */
5714   REGSET31 (x, R_64), REGSET31 (X, R_64),
5715   REGSET31 (w, R_32), REGSET31 (W, R_32),
5716
5717   REGDEF (wsp, 31, SP_32), REGDEF (WSP, 31, SP_32),
5718   REGDEF (sp, 31, SP_64), REGDEF (SP, 31, SP_64),
5719
5720   REGDEF (wzr, 31, Z_32), REGDEF (WZR, 31, Z_32),
5721   REGDEF (xzr, 31, Z_64), REGDEF (XZR, 31, Z_64),
5722
5723   /* Coprocessor register numbers.  */
5724   REGSET (c, CN), REGSET (C, CN),
5725
5726   /* Floating-point single precision registers.  */
5727   REGSET (s, FP_S), REGSET (S, FP_S),
5728
5729   /* Floating-point double precision registers.  */
5730   REGSET (d, FP_D), REGSET (D, FP_D),
5731
5732   /* Floating-point half precision registers.  */
5733   REGSET (h, FP_H), REGSET (H, FP_H),
5734
5735   /* Floating-point byte precision registers.  */
5736   REGSET (b, FP_B), REGSET (B, FP_B),
5737
5738   /* Floating-point quad precision registers.  */
5739   REGSET (q, FP_Q), REGSET (Q, FP_Q),
5740
5741   /* FP/SIMD registers.  */
5742   REGSET (v, VN), REGSET (V, VN),
5743 };
5744
5745 #undef REGDEF
5746 #undef REGNUM
5747 #undef REGSET
5748
5749 #define N 1
5750 #define n 0
5751 #define Z 1
5752 #define z 0
5753 #define C 1
5754 #define c 0
5755 #define V 1
5756 #define v 0
5757 #define B(a,b,c,d) (((a) << 3) | ((b) << 2) | ((c) << 1) | (d))
5758 static const asm_nzcv nzcv_names[] = {
5759   {"nzcv", B (n, z, c, v)},
5760   {"nzcV", B (n, z, c, V)},
5761   {"nzCv", B (n, z, C, v)},
5762   {"nzCV", B (n, z, C, V)},
5763   {"nZcv", B (n, Z, c, v)},
5764   {"nZcV", B (n, Z, c, V)},
5765   {"nZCv", B (n, Z, C, v)},
5766   {"nZCV", B (n, Z, C, V)},
5767   {"Nzcv", B (N, z, c, v)},
5768   {"NzcV", B (N, z, c, V)},
5769   {"NzCv", B (N, z, C, v)},
5770   {"NzCV", B (N, z, C, V)},
5771   {"NZcv", B (N, Z, c, v)},
5772   {"NZcV", B (N, Z, c, V)},
5773   {"NZCv", B (N, Z, C, v)},
5774   {"NZCV", B (N, Z, C, V)}
5775 };
5776
5777 #undef N
5778 #undef n
5779 #undef Z
5780 #undef z
5781 #undef C
5782 #undef c
5783 #undef V
5784 #undef v
5785 #undef B
5786 \f
5787 /* MD interface: bits in the object file.  */
5788
5789 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
5790    for use in the a.out file, and stores them in the array pointed to by buf.
5791    This knows about the endian-ness of the target machine and does
5792    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
5793    2 (short) and 4 (long)  Floating numbers are put out as a series of
5794    LITTLENUMS (shorts, here at least).  */
5795
5796 void
5797 md_number_to_chars (char *buf, valueT val, int n)
5798 {
5799   if (target_big_endian)
5800     number_to_chars_bigendian (buf, val, n);
5801   else
5802     number_to_chars_littleendian (buf, val, n);
5803 }
5804
5805 /* MD interface: Sections.  */
5806
5807 /* Estimate the size of a frag before relaxing.  Assume everything fits in
5808    4 bytes.  */
5809
5810 int
5811 md_estimate_size_before_relax (fragS * fragp, segT segtype ATTRIBUTE_UNUSED)
5812 {
5813   fragp->fr_var = 4;
5814   return 4;
5815 }
5816
5817 /* Round up a section size to the appropriate boundary.  */
5818
5819 valueT
5820 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
5821 {
5822   return size;
5823 }
5824
5825 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
5826    of an rs_align_code fragment.  */
5827
5828 void
5829 aarch64_handle_align (fragS * fragP)
5830 {
5831   /* NOP = d503201f */
5832   /* AArch64 instructions are always little-endian.  */
5833   static char const aarch64_noop[4] = { 0x1f, 0x20, 0x03, 0xd5 };
5834
5835   int bytes, fix, noop_size;
5836   char *p;
5837   const char *noop;
5838
5839   if (fragP->fr_type != rs_align_code)
5840     return;
5841
5842   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
5843   p = fragP->fr_literal + fragP->fr_fix;
5844   fix = 0;
5845
5846   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
5847     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
5848
5849 #ifdef OBJ_ELF
5850   gas_assert (fragP->tc_frag_data.recorded);
5851 #endif
5852
5853   noop = aarch64_noop;
5854   noop_size = sizeof (aarch64_noop);
5855   fragP->fr_var = noop_size;
5856
5857   if (bytes & (noop_size - 1))
5858     {
5859       fix = bytes & (noop_size - 1);
5860 #ifdef OBJ_ELF
5861       insert_data_mapping_symbol (MAP_INSN, fragP->fr_fix, fragP, fix);
5862 #endif
5863       memset (p, 0, fix);
5864       p += fix;
5865       bytes -= fix;
5866     }
5867
5868   while (bytes >= noop_size)
5869     {
5870       memcpy (p, noop, noop_size);
5871       p += noop_size;
5872       bytes -= noop_size;
5873       fix += noop_size;
5874     }
5875
5876   fragP->fr_fix += fix;
5877 }
5878
5879 /* Called from md_do_align.  Used to create an alignment
5880    frag in a code section.  */
5881
5882 void
5883 aarch64_frag_align_code (int n, int max)
5884 {
5885   char *p;
5886
5887   /* We assume that there will never be a requirement
5888      to support alignments greater than x bytes.  */
5889   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
5890     as_fatal (_
5891               ("alignments greater than %d bytes not supported in .text sections"),
5892               MAX_MEM_FOR_RS_ALIGN_CODE + 1);
5893
5894   p = frag_var (rs_align_code,
5895                 MAX_MEM_FOR_RS_ALIGN_CODE,
5896                 1,
5897                 (relax_substateT) max,
5898                 (symbolS *) NULL, (offsetT) n, (char *) NULL);
5899   *p = 0;
5900 }
5901
5902 /* Perform target specific initialisation of a frag.
5903    Note - despite the name this initialisation is not done when the frag
5904    is created, but only when its type is assigned.  A frag can be created
5905    and used a long time before its type is set, so beware of assuming that
5906    this initialisationis performed first.  */
5907
5908 #ifndef OBJ_ELF
5909 void
5910 aarch64_init_frag (fragS * fragP ATTRIBUTE_UNUSED,
5911                    int max_chars ATTRIBUTE_UNUSED)
5912 {
5913 }
5914
5915 #else /* OBJ_ELF is defined.  */
5916 void
5917 aarch64_init_frag (fragS * fragP, int max_chars)
5918 {
5919   /* Record a mapping symbol for alignment frags.  We will delete this
5920      later if the alignment ends up empty.  */
5921   if (!fragP->tc_frag_data.recorded)
5922     {
5923       fragP->tc_frag_data.recorded = 1;
5924       switch (fragP->fr_type)
5925         {
5926         case rs_align:
5927         case rs_align_test:
5928         case rs_fill:
5929           mapping_state_2 (MAP_DATA, max_chars);
5930           break;
5931         case rs_align_code:
5932           mapping_state_2 (MAP_INSN, max_chars);
5933           break;
5934         default:
5935           break;
5936         }
5937     }
5938 }
5939 \f
5940 /* Initialize the DWARF-2 unwind information for this procedure.  */
5941
5942 void
5943 tc_aarch64_frame_initial_instructions (void)
5944 {
5945   cfi_add_CFA_def_cfa (REG_SP, 0);
5946 }
5947 #endif /* OBJ_ELF */
5948
5949 /* Convert REGNAME to a DWARF-2 register number.  */
5950
5951 int
5952 tc_aarch64_regname_to_dw2regnum (char *regname)
5953 {
5954   const reg_entry *reg = parse_reg (&regname);
5955   if (reg == NULL)
5956     return -1;
5957
5958   switch (reg->type)
5959     {
5960     case REG_TYPE_SP_32:
5961     case REG_TYPE_SP_64:
5962     case REG_TYPE_R_32:
5963     case REG_TYPE_R_64:
5964       return reg->number;
5965
5966     case REG_TYPE_FP_B:
5967     case REG_TYPE_FP_H:
5968     case REG_TYPE_FP_S:
5969     case REG_TYPE_FP_D:
5970     case REG_TYPE_FP_Q:
5971       return reg->number + 64;
5972
5973     default:
5974       break;
5975     }
5976   return -1;
5977 }
5978
5979 /* Implement DWARF2_ADDR_SIZE.  */
5980
5981 int
5982 aarch64_dwarf2_addr_size (void)
5983 {
5984 #if defined (OBJ_MAYBE_ELF) || defined (OBJ_ELF)
5985   if (ilp32_p)
5986     return 4;
5987 #endif
5988   return bfd_arch_bits_per_address (stdoutput) / 8;
5989 }
5990
5991 /* MD interface: Symbol and relocation handling.  */
5992
5993 /* Return the address within the segment that a PC-relative fixup is
5994    relative to.  For AArch64 PC-relative fixups applied to instructions
5995    are generally relative to the location plus AARCH64_PCREL_OFFSET bytes.  */
5996
5997 long
5998 md_pcrel_from_section (fixS * fixP, segT seg)
5999 {
6000   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
6001
6002   /* If this is pc-relative and we are going to emit a relocation
6003      then we just want to put out any pipeline compensation that the linker
6004      will need.  Otherwise we want to use the calculated base.  */
6005   if (fixP->fx_pcrel
6006       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
6007           || aarch64_force_relocation (fixP)))
6008     base = 0;
6009
6010   /* AArch64 should be consistent for all pc-relative relocations.  */
6011   return base + AARCH64_PCREL_OFFSET;
6012 }
6013
6014 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
6015    Otherwise we have no need to default values of symbols.  */
6016
6017 symbolS *
6018 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
6019 {
6020 #ifdef OBJ_ELF
6021   if (name[0] == '_' && name[1] == 'G'
6022       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
6023     {
6024       if (!GOT_symbol)
6025         {
6026           if (symbol_find (name))
6027             as_bad (_("GOT already in the symbol table"));
6028
6029           GOT_symbol = symbol_new (name, undefined_section,
6030                                    (valueT) 0, &zero_address_frag);
6031         }
6032
6033       return GOT_symbol;
6034     }
6035 #endif
6036
6037   return 0;
6038 }
6039
6040 /* Return non-zero if the indicated VALUE has overflowed the maximum
6041    range expressible by a unsigned number with the indicated number of
6042    BITS.  */
6043
6044 static bfd_boolean
6045 unsigned_overflow (valueT value, unsigned bits)
6046 {
6047   valueT lim;
6048   if (bits >= sizeof (valueT) * 8)
6049     return FALSE;
6050   lim = (valueT) 1 << bits;
6051   return (value >= lim);
6052 }
6053
6054
6055 /* Return non-zero if the indicated VALUE has overflowed the maximum
6056    range expressible by an signed number with the indicated number of
6057    BITS.  */
6058
6059 static bfd_boolean
6060 signed_overflow (offsetT value, unsigned bits)
6061 {
6062   offsetT lim;
6063   if (bits >= sizeof (offsetT) * 8)
6064     return FALSE;
6065   lim = (offsetT) 1 << (bits - 1);
6066   return (value < -lim || value >= lim);
6067 }
6068
6069 /* Given an instruction in *INST, which is expected to be a scaled, 12-bit,
6070    unsigned immediate offset load/store instruction, try to encode it as
6071    an unscaled, 9-bit, signed immediate offset load/store instruction.
6072    Return TRUE if it is successful; otherwise return FALSE.
6073
6074    As a programmer-friendly assembler, LDUR/STUR instructions can be generated
6075    in response to the standard LDR/STR mnemonics when the immediate offset is
6076    unambiguous, i.e. when it is negative or unaligned.  */
6077
6078 static bfd_boolean
6079 try_to_encode_as_unscaled_ldst (aarch64_inst *instr)
6080 {
6081   int idx;
6082   enum aarch64_op new_op;
6083   const aarch64_opcode *new_opcode;
6084
6085   gas_assert (instr->opcode->iclass == ldst_pos);
6086
6087   switch (instr->opcode->op)
6088     {
6089     case OP_LDRB_POS:new_op = OP_LDURB; break;
6090     case OP_STRB_POS: new_op = OP_STURB; break;
6091     case OP_LDRSB_POS: new_op = OP_LDURSB; break;
6092     case OP_LDRH_POS: new_op = OP_LDURH; break;
6093     case OP_STRH_POS: new_op = OP_STURH; break;
6094     case OP_LDRSH_POS: new_op = OP_LDURSH; break;
6095     case OP_LDR_POS: new_op = OP_LDUR; break;
6096     case OP_STR_POS: new_op = OP_STUR; break;
6097     case OP_LDRF_POS: new_op = OP_LDURV; break;
6098     case OP_STRF_POS: new_op = OP_STURV; break;
6099     case OP_LDRSW_POS: new_op = OP_LDURSW; break;
6100     case OP_PRFM_POS: new_op = OP_PRFUM; break;
6101     default: new_op = OP_NIL; break;
6102     }
6103
6104   if (new_op == OP_NIL)
6105     return FALSE;
6106
6107   new_opcode = aarch64_get_opcode (new_op);
6108   gas_assert (new_opcode != NULL);
6109
6110   DEBUG_TRACE ("Check programmer-friendly STURB/LDURB -> STRB/LDRB: %d == %d",
6111                instr->opcode->op, new_opcode->op);
6112
6113   aarch64_replace_opcode (instr, new_opcode);
6114
6115   /* Clear up the ADDR_SIMM9's qualifier; otherwise the
6116      qualifier matching may fail because the out-of-date qualifier will
6117      prevent the operand being updated with a new and correct qualifier.  */
6118   idx = aarch64_operand_index (instr->opcode->operands,
6119                                AARCH64_OPND_ADDR_SIMM9);
6120   gas_assert (idx == 1);
6121   instr->operands[idx].qualifier = AARCH64_OPND_QLF_NIL;
6122
6123   DEBUG_TRACE ("Found LDURB entry to encode programmer-friendly LDRB");
6124
6125   if (!aarch64_opcode_encode (instr->opcode, instr, &instr->value, NULL, NULL))
6126     return FALSE;
6127
6128   return TRUE;
6129 }
6130
6131 /* Called by fix_insn to fix a MOV immediate alias instruction.
6132
6133    Operand for a generic move immediate instruction, which is an alias
6134    instruction that generates a single MOVZ, MOVN or ORR instruction to loads
6135    a 32-bit/64-bit immediate value into general register.  An assembler error
6136    shall result if the immediate cannot be created by a single one of these
6137    instructions. If there is a choice, then to ensure reversability an
6138    assembler must prefer a MOVZ to MOVN, and MOVZ or MOVN to ORR.  */
6139
6140 static void
6141 fix_mov_imm_insn (fixS *fixP, char *buf, aarch64_inst *instr, offsetT value)
6142 {
6143   const aarch64_opcode *opcode;
6144
6145   /* Need to check if the destination is SP/ZR.  The check has to be done
6146      before any aarch64_replace_opcode.  */
6147   int try_mov_wide_p = !aarch64_stack_pointer_p (&instr->operands[0]);
6148   int try_mov_bitmask_p = !aarch64_zero_register_p (&instr->operands[0]);
6149
6150   instr->operands[1].imm.value = value;
6151   instr->operands[1].skip = 0;
6152
6153   if (try_mov_wide_p)
6154     {
6155       /* Try the MOVZ alias.  */
6156       opcode = aarch64_get_opcode (OP_MOV_IMM_WIDE);
6157       aarch64_replace_opcode (instr, opcode);
6158       if (aarch64_opcode_encode (instr->opcode, instr,
6159                                  &instr->value, NULL, NULL))
6160         {
6161           put_aarch64_insn (buf, instr->value);
6162           return;
6163         }
6164       /* Try the MOVK alias.  */
6165       opcode = aarch64_get_opcode (OP_MOV_IMM_WIDEN);
6166       aarch64_replace_opcode (instr, opcode);
6167       if (aarch64_opcode_encode (instr->opcode, instr,
6168                                  &instr->value, NULL, NULL))
6169         {
6170           put_aarch64_insn (buf, instr->value);
6171           return;
6172         }
6173     }
6174
6175   if (try_mov_bitmask_p)
6176     {
6177       /* Try the ORR alias.  */
6178       opcode = aarch64_get_opcode (OP_MOV_IMM_LOG);
6179       aarch64_replace_opcode (instr, opcode);
6180       if (aarch64_opcode_encode (instr->opcode, instr,
6181                                  &instr->value, NULL, NULL))
6182         {
6183           put_aarch64_insn (buf, instr->value);
6184           return;
6185         }
6186     }
6187
6188   as_bad_where (fixP->fx_file, fixP->fx_line,
6189                 _("immediate cannot be moved by a single instruction"));
6190 }
6191
6192 /* An instruction operand which is immediate related may have symbol used
6193    in the assembly, e.g.
6194
6195      mov     w0, u32
6196      .set    u32,    0x00ffff00
6197
6198    At the time when the assembly instruction is parsed, a referenced symbol,
6199    like 'u32' in the above example may not have been seen; a fixS is created
6200    in such a case and is handled here after symbols have been resolved.
6201    Instruction is fixed up with VALUE using the information in *FIXP plus
6202    extra information in FLAGS.
6203
6204    This function is called by md_apply_fix to fix up instructions that need
6205    a fix-up described above but does not involve any linker-time relocation.  */
6206
6207 static void
6208 fix_insn (fixS *fixP, uint32_t flags, offsetT value)
6209 {
6210   int idx;
6211   uint32_t insn;
6212   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
6213   enum aarch64_opnd opnd = fixP->tc_fix_data.opnd;
6214   aarch64_inst *new_inst = fixP->tc_fix_data.inst;
6215
6216   if (new_inst)
6217     {
6218       /* Now the instruction is about to be fixed-up, so the operand that
6219          was previously marked as 'ignored' needs to be unmarked in order
6220          to get the encoding done properly.  */
6221       idx = aarch64_operand_index (new_inst->opcode->operands, opnd);
6222       new_inst->operands[idx].skip = 0;
6223     }
6224
6225   gas_assert (opnd != AARCH64_OPND_NIL);
6226
6227   switch (opnd)
6228     {
6229     case AARCH64_OPND_EXCEPTION:
6230       if (unsigned_overflow (value, 16))
6231         as_bad_where (fixP->fx_file, fixP->fx_line,
6232                       _("immediate out of range"));
6233       insn = get_aarch64_insn (buf);
6234       insn |= encode_svc_imm (value);
6235       put_aarch64_insn (buf, insn);
6236       break;
6237
6238     case AARCH64_OPND_AIMM:
6239       /* ADD or SUB with immediate.
6240          NOTE this assumes we come here with a add/sub shifted reg encoding
6241                   3  322|2222|2  2  2 21111 111111
6242                   1  098|7654|3  2  1 09876 543210 98765 43210
6243          0b000000 sf 000|1011|shift 0 Rm    imm6   Rn    Rd    ADD
6244          2b000000 sf 010|1011|shift 0 Rm    imm6   Rn    Rd    ADDS
6245          4b000000 sf 100|1011|shift 0 Rm    imm6   Rn    Rd    SUB
6246          6b000000 sf 110|1011|shift 0 Rm    imm6   Rn    Rd    SUBS
6247          ->
6248                   3  322|2222|2 2   221111111111
6249                   1  098|7654|3 2   109876543210 98765 43210
6250          11000000 sf 001|0001|shift imm12        Rn    Rd    ADD
6251          31000000 sf 011|0001|shift imm12        Rn    Rd    ADDS
6252          51000000 sf 101|0001|shift imm12        Rn    Rd    SUB
6253          71000000 sf 111|0001|shift imm12        Rn    Rd    SUBS
6254          Fields sf Rn Rd are already set.  */
6255       insn = get_aarch64_insn (buf);
6256       if (value < 0)
6257         {
6258           /* Add <-> sub.  */
6259           insn = reencode_addsub_switch_add_sub (insn);
6260           value = -value;
6261         }
6262
6263       if ((flags & FIXUP_F_HAS_EXPLICIT_SHIFT) == 0
6264           && unsigned_overflow (value, 12))
6265         {
6266           /* Try to shift the value by 12 to make it fit.  */
6267           if (((value >> 12) << 12) == value
6268               && ! unsigned_overflow (value, 12 + 12))
6269             {
6270               value >>= 12;
6271               insn |= encode_addsub_imm_shift_amount (1);
6272             }
6273         }
6274
6275       if (unsigned_overflow (value, 12))
6276         as_bad_where (fixP->fx_file, fixP->fx_line,
6277                       _("immediate out of range"));
6278
6279       insn |= encode_addsub_imm (value);
6280
6281       put_aarch64_insn (buf, insn);
6282       break;
6283
6284     case AARCH64_OPND_SIMD_IMM:
6285     case AARCH64_OPND_SIMD_IMM_SFT:
6286     case AARCH64_OPND_LIMM:
6287       /* Bit mask immediate.  */
6288       gas_assert (new_inst != NULL);
6289       idx = aarch64_operand_index (new_inst->opcode->operands, opnd);
6290       new_inst->operands[idx].imm.value = value;
6291       if (aarch64_opcode_encode (new_inst->opcode, new_inst,
6292                                  &new_inst->value, NULL, NULL))
6293         put_aarch64_insn (buf, new_inst->value);
6294       else
6295         as_bad_where (fixP->fx_file, fixP->fx_line,
6296                       _("invalid immediate"));
6297       break;
6298
6299     case AARCH64_OPND_HALF:
6300       /* 16-bit unsigned immediate.  */
6301       if (unsigned_overflow (value, 16))
6302         as_bad_where (fixP->fx_file, fixP->fx_line,
6303                       _("immediate out of range"));
6304       insn = get_aarch64_insn (buf);
6305       insn |= encode_movw_imm (value & 0xffff);
6306       put_aarch64_insn (buf, insn);
6307       break;
6308
6309     case AARCH64_OPND_IMM_MOV:
6310       /* Operand for a generic move immediate instruction, which is
6311          an alias instruction that generates a single MOVZ, MOVN or ORR
6312          instruction to loads a 32-bit/64-bit immediate value into general
6313          register.  An assembler error shall result if the immediate cannot be
6314          created by a single one of these instructions. If there is a choice,
6315          then to ensure reversability an assembler must prefer a MOVZ to MOVN,
6316          and MOVZ or MOVN to ORR.  */
6317       gas_assert (new_inst != NULL);
6318       fix_mov_imm_insn (fixP, buf, new_inst, value);
6319       break;
6320
6321     case AARCH64_OPND_ADDR_SIMM7:
6322     case AARCH64_OPND_ADDR_SIMM9:
6323     case AARCH64_OPND_ADDR_SIMM9_2:
6324     case AARCH64_OPND_ADDR_UIMM12:
6325       /* Immediate offset in an address.  */
6326       insn = get_aarch64_insn (buf);
6327
6328       gas_assert (new_inst != NULL && new_inst->value == insn);
6329       gas_assert (new_inst->opcode->operands[1] == opnd
6330                   || new_inst->opcode->operands[2] == opnd);
6331
6332       /* Get the index of the address operand.  */
6333       if (new_inst->opcode->operands[1] == opnd)
6334         /* e.g. STR <Xt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}].  */
6335         idx = 1;
6336       else
6337         /* e.g. LDP <Qt1>, <Qt2>, [<Xn|SP>{, #<imm>}].  */
6338         idx = 2;
6339
6340       /* Update the resolved offset value.  */
6341       new_inst->operands[idx].addr.offset.imm = value;
6342
6343       /* Encode/fix-up.  */
6344       if (aarch64_opcode_encode (new_inst->opcode, new_inst,
6345                                  &new_inst->value, NULL, NULL))
6346         {
6347           put_aarch64_insn (buf, new_inst->value);
6348           break;
6349         }
6350       else if (new_inst->opcode->iclass == ldst_pos
6351                && try_to_encode_as_unscaled_ldst (new_inst))
6352         {
6353           put_aarch64_insn (buf, new_inst->value);
6354           break;
6355         }
6356
6357       as_bad_where (fixP->fx_file, fixP->fx_line,
6358                     _("immediate offset out of range"));
6359       break;
6360
6361     default:
6362       gas_assert (0);
6363       as_fatal (_("unhandled operand code %d"), opnd);
6364     }
6365 }
6366
6367 /* Apply a fixup (fixP) to segment data, once it has been determined
6368    by our caller that we have all the info we need to fix it up.
6369
6370    Parameter valP is the pointer to the value of the bits.  */
6371
6372 void
6373 md_apply_fix (fixS * fixP, valueT * valP, segT seg)
6374 {
6375   offsetT value = *valP;
6376   uint32_t insn;
6377   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
6378   int scale;
6379   unsigned flags = fixP->fx_addnumber;
6380
6381   DEBUG_TRACE ("\n\n");
6382   DEBUG_TRACE ("~~~~~~~~~~~~~~~~~~~~~~~~~");
6383   DEBUG_TRACE ("Enter md_apply_fix");
6384
6385   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
6386
6387   /* Note whether this will delete the relocation.  */
6388
6389   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
6390     fixP->fx_done = 1;
6391
6392   /* Process the relocations.  */
6393   switch (fixP->fx_r_type)
6394     {
6395     case BFD_RELOC_NONE:
6396       /* This will need to go in the object file.  */
6397       fixP->fx_done = 0;
6398       break;
6399
6400     case BFD_RELOC_8:
6401     case BFD_RELOC_8_PCREL:
6402       if (fixP->fx_done || !seg->use_rela_p)
6403         md_number_to_chars (buf, value, 1);
6404       break;
6405
6406     case BFD_RELOC_16:
6407     case BFD_RELOC_16_PCREL:
6408       if (fixP->fx_done || !seg->use_rela_p)
6409         md_number_to_chars (buf, value, 2);
6410       break;
6411
6412     case BFD_RELOC_32:
6413     case BFD_RELOC_32_PCREL:
6414       if (fixP->fx_done || !seg->use_rela_p)
6415         md_number_to_chars (buf, value, 4);
6416       break;
6417
6418     case BFD_RELOC_64:
6419     case BFD_RELOC_64_PCREL:
6420       if (fixP->fx_done || !seg->use_rela_p)
6421         md_number_to_chars (buf, value, 8);
6422       break;
6423
6424     case BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP:
6425       /* We claim that these fixups have been processed here, even if
6426          in fact we generate an error because we do not have a reloc
6427          for them, so tc_gen_reloc() will reject them.  */
6428       fixP->fx_done = 1;
6429       if (fixP->fx_addsy && !S_IS_DEFINED (fixP->fx_addsy))
6430         {
6431           as_bad_where (fixP->fx_file, fixP->fx_line,
6432                         _("undefined symbol %s used as an immediate value"),
6433                         S_GET_NAME (fixP->fx_addsy));
6434           goto apply_fix_return;
6435         }
6436       fix_insn (fixP, flags, value);
6437       break;
6438
6439     case BFD_RELOC_AARCH64_LD_LO19_PCREL:
6440       if (fixP->fx_done || !seg->use_rela_p)
6441         {
6442           if (value & 3)
6443             as_bad_where (fixP->fx_file, fixP->fx_line,
6444                           _("pc-relative load offset not word aligned"));
6445           if (signed_overflow (value, 21))
6446             as_bad_where (fixP->fx_file, fixP->fx_line,
6447                           _("pc-relative load offset out of range"));
6448           insn = get_aarch64_insn (buf);
6449           insn |= encode_ld_lit_ofs_19 (value >> 2);
6450           put_aarch64_insn (buf, insn);
6451         }
6452       break;
6453
6454     case BFD_RELOC_AARCH64_ADR_LO21_PCREL:
6455       if (fixP->fx_done || !seg->use_rela_p)
6456         {
6457           if (signed_overflow (value, 21))
6458             as_bad_where (fixP->fx_file, fixP->fx_line,
6459                           _("pc-relative address offset out of range"));
6460           insn = get_aarch64_insn (buf);
6461           insn |= encode_adr_imm (value);
6462           put_aarch64_insn (buf, insn);
6463         }
6464       break;
6465
6466     case BFD_RELOC_AARCH64_BRANCH19:
6467       if (fixP->fx_done || !seg->use_rela_p)
6468         {
6469           if (value & 3)
6470             as_bad_where (fixP->fx_file, fixP->fx_line,
6471                           _("conditional branch target not word aligned"));
6472           if (signed_overflow (value, 21))
6473             as_bad_where (fixP->fx_file, fixP->fx_line,
6474                           _("conditional branch out of range"));
6475           insn = get_aarch64_insn (buf);
6476           insn |= encode_cond_branch_ofs_19 (value >> 2);
6477           put_aarch64_insn (buf, insn);
6478         }
6479       break;
6480
6481     case BFD_RELOC_AARCH64_TSTBR14:
6482       if (fixP->fx_done || !seg->use_rela_p)
6483         {
6484           if (value & 3)
6485             as_bad_where (fixP->fx_file, fixP->fx_line,
6486                           _("conditional branch target not word aligned"));
6487           if (signed_overflow (value, 16))
6488             as_bad_where (fixP->fx_file, fixP->fx_line,
6489                           _("conditional branch out of range"));
6490           insn = get_aarch64_insn (buf);
6491           insn |= encode_tst_branch_ofs_14 (value >> 2);
6492           put_aarch64_insn (buf, insn);
6493         }
6494       break;
6495
6496     case BFD_RELOC_AARCH64_JUMP26:
6497     case BFD_RELOC_AARCH64_CALL26:
6498       if (fixP->fx_done || !seg->use_rela_p)
6499         {
6500           if (value & 3)
6501             as_bad_where (fixP->fx_file, fixP->fx_line,
6502                           _("branch target not word aligned"));
6503           if (signed_overflow (value, 28))
6504             as_bad_where (fixP->fx_file, fixP->fx_line,
6505                           _("branch out of range"));
6506           insn = get_aarch64_insn (buf);
6507           insn |= encode_branch_ofs_26 (value >> 2);
6508           put_aarch64_insn (buf, insn);
6509         }
6510       break;
6511
6512     case BFD_RELOC_AARCH64_MOVW_G0:
6513     case BFD_RELOC_AARCH64_MOVW_G0_S:
6514     case BFD_RELOC_AARCH64_MOVW_G0_NC:
6515       scale = 0;
6516       goto movw_common;
6517     case BFD_RELOC_AARCH64_MOVW_G1:
6518     case BFD_RELOC_AARCH64_MOVW_G1_S:
6519     case BFD_RELOC_AARCH64_MOVW_G1_NC:
6520       scale = 16;
6521       goto movw_common;
6522     case BFD_RELOC_AARCH64_MOVW_G2:
6523     case BFD_RELOC_AARCH64_MOVW_G2_S:
6524     case BFD_RELOC_AARCH64_MOVW_G2_NC:
6525       scale = 32;
6526       goto movw_common;
6527     case BFD_RELOC_AARCH64_MOVW_G3:
6528       scale = 48;
6529     movw_common:
6530       if (fixP->fx_done || !seg->use_rela_p)
6531         {
6532           insn = get_aarch64_insn (buf);
6533
6534           if (!fixP->fx_done)
6535             {
6536               /* REL signed addend must fit in 16 bits */
6537               if (signed_overflow (value, 16))
6538                 as_bad_where (fixP->fx_file, fixP->fx_line,
6539                               _("offset out of range"));
6540             }
6541           else
6542             {
6543               /* Check for overflow and scale. */
6544               switch (fixP->fx_r_type)
6545                 {
6546                 case BFD_RELOC_AARCH64_MOVW_G0:
6547                 case BFD_RELOC_AARCH64_MOVW_G1:
6548                 case BFD_RELOC_AARCH64_MOVW_G2:
6549                 case BFD_RELOC_AARCH64_MOVW_G3:
6550                   if (unsigned_overflow (value, scale + 16))
6551                     as_bad_where (fixP->fx_file, fixP->fx_line,
6552                                   _("unsigned value out of range"));
6553                   break;
6554                 case BFD_RELOC_AARCH64_MOVW_G0_S:
6555                 case BFD_RELOC_AARCH64_MOVW_G1_S:
6556                 case BFD_RELOC_AARCH64_MOVW_G2_S:
6557                   /* NOTE: We can only come here with movz or movn. */
6558                   if (signed_overflow (value, scale + 16))
6559                     as_bad_where (fixP->fx_file, fixP->fx_line,
6560                                   _("signed value out of range"));
6561                   if (value < 0)
6562                     {
6563                       /* Force use of MOVN.  */
6564                       value = ~value;
6565                       insn = reencode_movzn_to_movn (insn);
6566                     }
6567                   else
6568                     {
6569                       /* Force use of MOVZ.  */
6570                       insn = reencode_movzn_to_movz (insn);
6571                     }
6572                   break;
6573                 default:
6574                   /* Unchecked relocations.  */
6575                   break;
6576                 }
6577               value >>= scale;
6578             }
6579
6580           /* Insert value into MOVN/MOVZ/MOVK instruction. */
6581           insn |= encode_movw_imm (value & 0xffff);
6582
6583           put_aarch64_insn (buf, insn);
6584         }
6585       break;
6586
6587     case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC:
6588       fixP->fx_r_type = (ilp32_p
6589                          ? BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC
6590                          : BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC);
6591       S_SET_THREAD_LOCAL (fixP->fx_addsy);
6592       /* Should always be exported to object file, see
6593          aarch64_force_relocation().  */
6594       gas_assert (!fixP->fx_done);
6595       gas_assert (seg->use_rela_p);
6596       break;
6597
6598     case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC:
6599       fixP->fx_r_type = (ilp32_p
6600                          ? BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC
6601                          : BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC);
6602       S_SET_THREAD_LOCAL (fixP->fx_addsy);
6603       /* Should always be exported to object file, see
6604          aarch64_force_relocation().  */
6605       gas_assert (!fixP->fx_done);
6606       gas_assert (seg->use_rela_p);
6607       break;
6608
6609     case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
6610     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
6611     case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
6612     case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC:
6613     case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
6614     case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
6615     case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
6616     case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
6617     case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
6618     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
6619     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
6620     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
6621     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
6622     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
6623     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
6624     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
6625     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
6626       S_SET_THREAD_LOCAL (fixP->fx_addsy);
6627       /* Should always be exported to object file, see
6628          aarch64_force_relocation().  */
6629       gas_assert (!fixP->fx_done);
6630       gas_assert (seg->use_rela_p);
6631       break;
6632
6633     case BFD_RELOC_AARCH64_LD_GOT_LO12_NC:
6634       /* Should always be exported to object file, see
6635          aarch64_force_relocation().  */
6636       fixP->fx_r_type = (ilp32_p
6637                          ? BFD_RELOC_AARCH64_LD32_GOT_LO12_NC
6638                          : BFD_RELOC_AARCH64_LD64_GOT_LO12_NC);
6639       gas_assert (!fixP->fx_done);
6640       gas_assert (seg->use_rela_p);
6641       break;
6642
6643     case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
6644     case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
6645     case BFD_RELOC_AARCH64_ADD_LO12:
6646     case BFD_RELOC_AARCH64_LDST8_LO12:
6647     case BFD_RELOC_AARCH64_LDST16_LO12:
6648     case BFD_RELOC_AARCH64_LDST32_LO12:
6649     case BFD_RELOC_AARCH64_LDST64_LO12:
6650     case BFD_RELOC_AARCH64_LDST128_LO12:
6651     case BFD_RELOC_AARCH64_GOT_LD_PREL19:
6652     case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
6653     case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
6654     case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
6655       /* Should always be exported to object file, see
6656          aarch64_force_relocation().  */
6657       gas_assert (!fixP->fx_done);
6658       gas_assert (seg->use_rela_p);
6659       break;
6660
6661     case BFD_RELOC_AARCH64_TLSDESC_ADD:
6662     case BFD_RELOC_AARCH64_TLSDESC_LDR:
6663     case BFD_RELOC_AARCH64_TLSDESC_CALL:
6664       break;
6665
6666     case BFD_RELOC_UNUSED:
6667       /* An error will already have been reported.  */
6668       break;
6669
6670     default:
6671       as_bad_where (fixP->fx_file, fixP->fx_line,
6672                     _("unexpected %s fixup"),
6673                     bfd_get_reloc_code_name (fixP->fx_r_type));
6674       break;
6675     }
6676
6677 apply_fix_return:
6678   /* Free the allocated the struct aarch64_inst.
6679      N.B. currently there are very limited number of fix-up types actually use
6680      this field, so the impact on the performance should be minimal .  */
6681   if (fixP->tc_fix_data.inst != NULL)
6682     free (fixP->tc_fix_data.inst);
6683
6684   return;
6685 }
6686
6687 /* Translate internal representation of relocation info to BFD target
6688    format.  */
6689
6690 arelent *
6691 tc_gen_reloc (asection * section, fixS * fixp)
6692 {
6693   arelent *reloc;
6694   bfd_reloc_code_real_type code;
6695
6696   reloc = xmalloc (sizeof (arelent));
6697
6698   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
6699   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
6700   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6701
6702   if (fixp->fx_pcrel)
6703     {
6704       if (section->use_rela_p)
6705         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
6706       else
6707         fixp->fx_offset = reloc->address;
6708     }
6709   reloc->addend = fixp->fx_offset;
6710
6711   code = fixp->fx_r_type;
6712   switch (code)
6713     {
6714     case BFD_RELOC_16:
6715       if (fixp->fx_pcrel)
6716         code = BFD_RELOC_16_PCREL;
6717       break;
6718
6719     case BFD_RELOC_32:
6720       if (fixp->fx_pcrel)
6721         code = BFD_RELOC_32_PCREL;
6722       break;
6723
6724     case BFD_RELOC_64:
6725       if (fixp->fx_pcrel)
6726         code = BFD_RELOC_64_PCREL;
6727       break;
6728
6729     default:
6730       break;
6731     }
6732
6733   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
6734   if (reloc->howto == NULL)
6735     {
6736       as_bad_where (fixp->fx_file, fixp->fx_line,
6737                     _
6738                     ("cannot represent %s relocation in this object file format"),
6739                     bfd_get_reloc_code_name (code));
6740       return NULL;
6741     }
6742
6743   return reloc;
6744 }
6745
6746 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
6747
6748 void
6749 cons_fix_new_aarch64 (fragS * frag, int where, int size, expressionS * exp)
6750 {
6751   bfd_reloc_code_real_type type;
6752   int pcrel = 0;
6753
6754   /* Pick a reloc.
6755      FIXME: @@ Should look at CPU word size.  */
6756   switch (size)
6757     {
6758     case 1:
6759       type = BFD_RELOC_8;
6760       break;
6761     case 2:
6762       type = BFD_RELOC_16;
6763       break;
6764     case 4:
6765       type = BFD_RELOC_32;
6766       break;
6767     case 8:
6768       type = BFD_RELOC_64;
6769       break;
6770     default:
6771       as_bad (_("cannot do %u-byte relocation"), size);
6772       type = BFD_RELOC_UNUSED;
6773       break;
6774     }
6775
6776   fix_new_exp (frag, where, (int) size, exp, pcrel, type);
6777 }
6778
6779 int
6780 aarch64_force_relocation (struct fix *fixp)
6781 {
6782   switch (fixp->fx_r_type)
6783     {
6784     case BFD_RELOC_AARCH64_GAS_INTERNAL_FIXUP:
6785       /* Perform these "immediate" internal relocations
6786          even if the symbol is extern or weak.  */
6787       return 0;
6788
6789     case BFD_RELOC_AARCH64_TLSIE_LD_GOTTPREL_LO12_NC:
6790     case BFD_RELOC_AARCH64_TLSDESC_LD_LO12_NC:
6791     case BFD_RELOC_AARCH64_LD_GOT_LO12_NC:
6792       /* Pseudo relocs that need to be fixed up according to
6793          ilp32_p.  */
6794       return 0;
6795
6796     case BFD_RELOC_AARCH64_ADD_LO12:
6797     case BFD_RELOC_AARCH64_ADR_GOT_PAGE:
6798     case BFD_RELOC_AARCH64_ADR_HI21_NC_PCREL:
6799     case BFD_RELOC_AARCH64_ADR_HI21_PCREL:
6800     case BFD_RELOC_AARCH64_GOT_LD_PREL19:
6801     case BFD_RELOC_AARCH64_LD32_GOT_LO12_NC:
6802     case BFD_RELOC_AARCH64_LD64_GOT_LO12_NC:
6803     case BFD_RELOC_AARCH64_LDST128_LO12:
6804     case BFD_RELOC_AARCH64_LDST16_LO12:
6805     case BFD_RELOC_AARCH64_LDST32_LO12:
6806     case BFD_RELOC_AARCH64_LDST64_LO12:
6807     case BFD_RELOC_AARCH64_LDST8_LO12:
6808     case BFD_RELOC_AARCH64_TLSDESC_ADD_LO12_NC:
6809     case BFD_RELOC_AARCH64_TLSDESC_ADR_PAGE21:
6810     case BFD_RELOC_AARCH64_TLSDESC_LD32_LO12_NC:
6811     case BFD_RELOC_AARCH64_TLSDESC_LD64_LO12_NC:
6812     case BFD_RELOC_AARCH64_TLSGD_ADD_LO12_NC:
6813     case BFD_RELOC_AARCH64_TLSGD_ADR_PAGE21:
6814     case BFD_RELOC_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
6815     case BFD_RELOC_AARCH64_TLSIE_LD32_GOTTPREL_LO12_NC:
6816     case BFD_RELOC_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
6817     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_HI12:
6818     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12:
6819     case BFD_RELOC_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
6820     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0:
6821     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
6822     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1:
6823     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G1_NC:
6824     case BFD_RELOC_AARCH64_TLSLE_MOVW_TPREL_G2:
6825       /* Always leave these relocations for the linker.  */
6826       return 1;
6827
6828     default:
6829       break;
6830     }
6831
6832   return generic_force_reloc (fixp);
6833 }
6834
6835 #ifdef OBJ_ELF
6836
6837 const char *
6838 elf64_aarch64_target_format (void)
6839 {
6840   if (target_big_endian)
6841     return ilp32_p ? "elf32-bigaarch64" : "elf64-bigaarch64";
6842   else
6843     return ilp32_p ? "elf32-littleaarch64" : "elf64-littleaarch64";
6844 }
6845
6846 void
6847 aarch64elf_frob_symbol (symbolS * symp, int *puntp)
6848 {
6849   elf_frob_symbol (symp, puntp);
6850 }
6851 #endif
6852
6853 /* MD interface: Finalization.  */
6854
6855 /* A good place to do this, although this was probably not intended
6856    for this kind of use.  We need to dump the literal pool before
6857    references are made to a null symbol pointer.  */
6858
6859 void
6860 aarch64_cleanup (void)
6861 {
6862   literal_pool *pool;
6863
6864   for (pool = list_of_pools; pool; pool = pool->next)
6865     {
6866       /* Put it at the end of the relevant section.  */
6867       subseg_set (pool->section, pool->sub_section);
6868       s_ltorg (0);
6869     }
6870 }
6871
6872 #ifdef OBJ_ELF
6873 /* Remove any excess mapping symbols generated for alignment frags in
6874    SEC.  We may have created a mapping symbol before a zero byte
6875    alignment; remove it if there's a mapping symbol after the
6876    alignment.  */
6877 static void
6878 check_mapping_symbols (bfd * abfd ATTRIBUTE_UNUSED, asection * sec,
6879                        void *dummy ATTRIBUTE_UNUSED)
6880 {
6881   segment_info_type *seginfo = seg_info (sec);
6882   fragS *fragp;
6883
6884   if (seginfo == NULL || seginfo->frchainP == NULL)
6885     return;
6886
6887   for (fragp = seginfo->frchainP->frch_root;
6888        fragp != NULL; fragp = fragp->fr_next)
6889     {
6890       symbolS *sym = fragp->tc_frag_data.last_map;
6891       fragS *next = fragp->fr_next;
6892
6893       /* Variable-sized frags have been converted to fixed size by
6894          this point.  But if this was variable-sized to start with,
6895          there will be a fixed-size frag after it.  So don't handle
6896          next == NULL.  */
6897       if (sym == NULL || next == NULL)
6898         continue;
6899
6900       if (S_GET_VALUE (sym) < next->fr_address)
6901         /* Not at the end of this frag.  */
6902         continue;
6903       know (S_GET_VALUE (sym) == next->fr_address);
6904
6905       do
6906         {
6907           if (next->tc_frag_data.first_map != NULL)
6908             {
6909               /* Next frag starts with a mapping symbol.  Discard this
6910                  one.  */
6911               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
6912               break;
6913             }
6914
6915           if (next->fr_next == NULL)
6916             {
6917               /* This mapping symbol is at the end of the section.  Discard
6918                  it.  */
6919               know (next->fr_fix == 0 && next->fr_var == 0);
6920               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
6921               break;
6922             }
6923
6924           /* As long as we have empty frags without any mapping symbols,
6925              keep looking.  */
6926           /* If the next frag is non-empty and does not start with a
6927              mapping symbol, then this mapping symbol is required.  */
6928           if (next->fr_address != next->fr_next->fr_address)
6929             break;
6930
6931           next = next->fr_next;
6932         }
6933       while (next != NULL);
6934     }
6935 }
6936 #endif
6937
6938 /* Adjust the symbol table.  */
6939
6940 void
6941 aarch64_adjust_symtab (void)
6942 {
6943 #ifdef OBJ_ELF
6944   /* Remove any overlapping mapping symbols generated by alignment frags.  */
6945   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
6946   /* Now do generic ELF adjustments.  */
6947   elf_adjust_symtab ();
6948 #endif
6949 }
6950
6951 static void
6952 checked_hash_insert (struct hash_control *table, const char *key, void *value)
6953 {
6954   const char *hash_err;
6955
6956   hash_err = hash_insert (table, key, value);
6957   if (hash_err)
6958     printf ("Internal Error:  Can't hash %s\n", key);
6959 }
6960
6961 static void
6962 fill_instruction_hash_table (void)
6963 {
6964   aarch64_opcode *opcode = aarch64_opcode_table;
6965
6966   while (opcode->name != NULL)
6967     {
6968       templates *templ, *new_templ;
6969       templ = hash_find (aarch64_ops_hsh, opcode->name);
6970
6971       new_templ = (templates *) xmalloc (sizeof (templates));
6972       new_templ->opcode = opcode;
6973       new_templ->next = NULL;
6974
6975       if (!templ)
6976         checked_hash_insert (aarch64_ops_hsh, opcode->name, (void *) new_templ);
6977       else
6978         {
6979           new_templ->next = templ->next;
6980           templ->next = new_templ;
6981         }
6982       ++opcode;
6983     }
6984 }
6985
6986 static inline void
6987 convert_to_upper (char *dst, const char *src, size_t num)
6988 {
6989   unsigned int i;
6990   for (i = 0; i < num && *src != '\0'; ++i, ++dst, ++src)
6991     *dst = TOUPPER (*src);
6992   *dst = '\0';
6993 }
6994
6995 /* Assume STR point to a lower-case string, allocate, convert and return
6996    the corresponding upper-case string.  */
6997 static inline const char*
6998 get_upper_str (const char *str)
6999 {
7000   char *ret;
7001   size_t len = strlen (str);
7002   if ((ret = xmalloc (len + 1)) == NULL)
7003     abort ();
7004   convert_to_upper (ret, str, len);
7005   return ret;
7006 }
7007
7008 /* MD interface: Initialization.  */
7009
7010 void
7011 md_begin (void)
7012 {
7013   unsigned mach;
7014   unsigned int i;
7015
7016   if ((aarch64_ops_hsh = hash_new ()) == NULL
7017       || (aarch64_cond_hsh = hash_new ()) == NULL
7018       || (aarch64_shift_hsh = hash_new ()) == NULL
7019       || (aarch64_sys_regs_hsh = hash_new ()) == NULL
7020       || (aarch64_pstatefield_hsh = hash_new ()) == NULL
7021       || (aarch64_sys_regs_ic_hsh = hash_new ()) == NULL
7022       || (aarch64_sys_regs_dc_hsh = hash_new ()) == NULL
7023       || (aarch64_sys_regs_at_hsh = hash_new ()) == NULL
7024       || (aarch64_sys_regs_tlbi_hsh = hash_new ()) == NULL
7025       || (aarch64_reg_hsh = hash_new ()) == NULL
7026       || (aarch64_barrier_opt_hsh = hash_new ()) == NULL
7027       || (aarch64_nzcv_hsh = hash_new ()) == NULL
7028       || (aarch64_pldop_hsh = hash_new ()) == NULL)
7029     as_fatal (_("virtual memory exhausted"));
7030
7031   fill_instruction_hash_table ();
7032
7033   for (i = 0; aarch64_sys_regs[i].name != NULL; ++i)
7034     checked_hash_insert (aarch64_sys_regs_hsh, aarch64_sys_regs[i].name,
7035                          (void *) (aarch64_sys_regs + i));
7036
7037   for (i = 0; aarch64_pstatefields[i].name != NULL; ++i)
7038     checked_hash_insert (aarch64_pstatefield_hsh,
7039                          aarch64_pstatefields[i].name,
7040                          (void *) (aarch64_pstatefields + i));
7041
7042   for (i = 0; aarch64_sys_regs_ic[i].template != NULL; i++)
7043     checked_hash_insert (aarch64_sys_regs_ic_hsh,
7044                          aarch64_sys_regs_ic[i].template,
7045                          (void *) (aarch64_sys_regs_ic + i));
7046
7047   for (i = 0; aarch64_sys_regs_dc[i].template != NULL; i++)
7048     checked_hash_insert (aarch64_sys_regs_dc_hsh,
7049                          aarch64_sys_regs_dc[i].template,
7050                          (void *) (aarch64_sys_regs_dc + i));
7051
7052   for (i = 0; aarch64_sys_regs_at[i].template != NULL; i++)
7053     checked_hash_insert (aarch64_sys_regs_at_hsh,
7054                          aarch64_sys_regs_at[i].template,
7055                          (void *) (aarch64_sys_regs_at + i));
7056
7057   for (i = 0; aarch64_sys_regs_tlbi[i].template != NULL; i++)
7058     checked_hash_insert (aarch64_sys_regs_tlbi_hsh,
7059                          aarch64_sys_regs_tlbi[i].template,
7060                          (void *) (aarch64_sys_regs_tlbi + i));
7061
7062   for (i = 0; i < ARRAY_SIZE (reg_names); i++)
7063     checked_hash_insert (aarch64_reg_hsh, reg_names[i].name,
7064                          (void *) (reg_names + i));
7065
7066   for (i = 0; i < ARRAY_SIZE (nzcv_names); i++)
7067     checked_hash_insert (aarch64_nzcv_hsh, nzcv_names[i].template,
7068                          (void *) (nzcv_names + i));
7069
7070   for (i = 0; aarch64_operand_modifiers[i].name != NULL; i++)
7071     {
7072       const char *name = aarch64_operand_modifiers[i].name;
7073       checked_hash_insert (aarch64_shift_hsh, name,
7074                            (void *) (aarch64_operand_modifiers + i));
7075       /* Also hash the name in the upper case.  */
7076       checked_hash_insert (aarch64_shift_hsh, get_upper_str (name),
7077                            (void *) (aarch64_operand_modifiers + i));
7078     }
7079
7080   for (i = 0; i < ARRAY_SIZE (aarch64_conds); i++)
7081     {
7082       unsigned int j;
7083       /* A condition code may have alias(es), e.g. "cc", "lo" and "ul" are
7084          the same condition code.  */
7085       for (j = 0; j < ARRAY_SIZE (aarch64_conds[i].names); ++j)
7086         {
7087           const char *name = aarch64_conds[i].names[j];
7088           if (name == NULL)
7089             break;
7090           checked_hash_insert (aarch64_cond_hsh, name,
7091                                (void *) (aarch64_conds + i));
7092           /* Also hash the name in the upper case.  */
7093           checked_hash_insert (aarch64_cond_hsh, get_upper_str (name),
7094                                (void *) (aarch64_conds + i));
7095         }
7096     }
7097
7098   for (i = 0; i < ARRAY_SIZE (aarch64_barrier_options); i++)
7099     {
7100       const char *name = aarch64_barrier_options[i].name;
7101       /* Skip xx00 - the unallocated values of option.  */
7102       if ((i & 0x3) == 0)
7103         continue;
7104       checked_hash_insert (aarch64_barrier_opt_hsh, name,
7105                            (void *) (aarch64_barrier_options + i));
7106       /* Also hash the name in the upper case.  */
7107       checked_hash_insert (aarch64_barrier_opt_hsh, get_upper_str (name),
7108                            (void *) (aarch64_barrier_options + i));
7109     }
7110
7111   for (i = 0; i < ARRAY_SIZE (aarch64_prfops); i++)
7112     {
7113       const char* name = aarch64_prfops[i].name;
7114       /* Skip the unallocated hint encodings.  */
7115       if (name == NULL)
7116         continue;
7117       checked_hash_insert (aarch64_pldop_hsh, name,
7118                            (void *) (aarch64_prfops + i));
7119       /* Also hash the name in the upper case.  */
7120       checked_hash_insert (aarch64_pldop_hsh, get_upper_str (name),
7121                            (void *) (aarch64_prfops + i));
7122     }
7123
7124   /* Set the cpu variant based on the command-line options.  */
7125   if (!mcpu_cpu_opt)
7126     mcpu_cpu_opt = march_cpu_opt;
7127
7128   if (!mcpu_cpu_opt)
7129     mcpu_cpu_opt = &cpu_default;
7130
7131   cpu_variant = *mcpu_cpu_opt;
7132
7133   /* Record the CPU type.  */
7134   mach = ilp32_p ? bfd_mach_aarch64_ilp32 : bfd_mach_aarch64;
7135
7136   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
7137 }
7138
7139 /* Command line processing.  */
7140
7141 const char *md_shortopts = "m:";
7142
7143 #ifdef AARCH64_BI_ENDIAN
7144 #define OPTION_EB (OPTION_MD_BASE + 0)
7145 #define OPTION_EL (OPTION_MD_BASE + 1)
7146 #else
7147 #if TARGET_BYTES_BIG_ENDIAN
7148 #define OPTION_EB (OPTION_MD_BASE + 0)
7149 #else
7150 #define OPTION_EL (OPTION_MD_BASE + 1)
7151 #endif
7152 #endif
7153
7154 struct option md_longopts[] = {
7155 #ifdef OPTION_EB
7156   {"EB", no_argument, NULL, OPTION_EB},
7157 #endif
7158 #ifdef OPTION_EL
7159   {"EL", no_argument, NULL, OPTION_EL},
7160 #endif
7161   {NULL, no_argument, NULL, 0}
7162 };
7163
7164 size_t md_longopts_size = sizeof (md_longopts);
7165
7166 struct aarch64_option_table
7167 {
7168   char *option;                 /* Option name to match.  */
7169   char *help;                   /* Help information.  */
7170   int *var;                     /* Variable to change.  */
7171   int value;                    /* What to change it to.  */
7172   char *deprecated;             /* If non-null, print this message.  */
7173 };
7174
7175 static struct aarch64_option_table aarch64_opts[] = {
7176   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
7177   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
7178    NULL},
7179 #ifdef DEBUG_AARCH64
7180   {"mdebug-dump", N_("temporary switch for dumping"), &debug_dump, 1, NULL},
7181 #endif /* DEBUG_AARCH64 */
7182   {"mverbose-error", N_("output verbose error messages"), &verbose_error_p, 1,
7183    NULL},
7184   {"mno-verbose-error", N_("do not output verbose error messages"),
7185    &verbose_error_p, 0, NULL},
7186   {NULL, NULL, NULL, 0, NULL}
7187 };
7188
7189 struct aarch64_cpu_option_table
7190 {
7191   char *name;
7192   const aarch64_feature_set value;
7193   /* The canonical name of the CPU, or NULL to use NAME converted to upper
7194      case.  */
7195   const char *canonical_name;
7196 };
7197
7198 /* This list should, at a minimum, contain all the cpu names
7199    recognized by GCC.  */
7200 static const struct aarch64_cpu_option_table aarch64_cpus[] = {
7201   {"all", AARCH64_ANY, NULL},
7202   {"cortex-a53",        AARCH64_ARCH_V8, "Cortex-A53"},
7203   {"cortex-a57",        AARCH64_ARCH_V8, "Cortex-A57"},
7204   {"xgene-1", AARCH64_ARCH_V8, "APM X-Gene 1"},
7205   {"generic", AARCH64_ARCH_V8, NULL},
7206
7207   /* These two are example CPUs supported in GCC, once we have real
7208      CPUs they will be removed.  */
7209   {"example-1", AARCH64_ARCH_V8, NULL},
7210   {"example-2", AARCH64_ARCH_V8, NULL},
7211
7212   {NULL, AARCH64_ARCH_NONE, NULL}
7213 };
7214
7215 struct aarch64_arch_option_table
7216 {
7217   char *name;
7218   const aarch64_feature_set value;
7219 };
7220
7221 /* This list should, at a minimum, contain all the architecture names
7222    recognized by GCC.  */
7223 static const struct aarch64_arch_option_table aarch64_archs[] = {
7224   {"all", AARCH64_ANY},
7225   {"armv8-a", AARCH64_ARCH_V8},
7226   {NULL, AARCH64_ARCH_NONE}
7227 };
7228
7229 /* ISA extensions.  */
7230 struct aarch64_option_cpu_value_table
7231 {
7232   char *name;
7233   const aarch64_feature_set value;
7234 };
7235
7236 static const struct aarch64_option_cpu_value_table aarch64_features[] = {
7237   {"crc",               AARCH64_FEATURE (AARCH64_FEATURE_CRC, 0)},
7238   {"crypto",            AARCH64_FEATURE (AARCH64_FEATURE_CRYPTO, 0)},
7239   {"fp",                AARCH64_FEATURE (AARCH64_FEATURE_FP, 0)},
7240   {"lse",               AARCH64_FEATURE (AARCH64_FEATURE_LSE, 0)},
7241   {"simd",              AARCH64_FEATURE (AARCH64_FEATURE_SIMD, 0)},
7242   {NULL,                AARCH64_ARCH_NONE}
7243 };
7244
7245 struct aarch64_long_option_table
7246 {
7247   char *option;                 /* Substring to match.  */
7248   char *help;                   /* Help information.  */
7249   int (*func) (char *subopt);   /* Function to decode sub-option.  */
7250   char *deprecated;             /* If non-null, print this message.  */
7251 };
7252
7253 static int
7254 aarch64_parse_features (char *str, const aarch64_feature_set **opt_p)
7255 {
7256   /* We insist on extensions being added before being removed.  We achieve
7257      this by using the ADDING_VALUE variable to indicate whether we are
7258      adding an extension (1) or removing it (0) and only allowing it to
7259      change in the order -1 -> 1 -> 0.  */
7260   int adding_value = -1;
7261   aarch64_feature_set *ext_set = xmalloc (sizeof (aarch64_feature_set));
7262
7263   /* Copy the feature set, so that we can modify it.  */
7264   *ext_set = **opt_p;
7265   *opt_p = ext_set;
7266
7267   while (str != NULL && *str != 0)
7268     {
7269       const struct aarch64_option_cpu_value_table *opt;
7270       char *ext;
7271       int optlen;
7272
7273       if (*str != '+')
7274         {
7275           as_bad (_("invalid architectural extension"));
7276           return 0;
7277         }
7278
7279       str++;
7280       ext = strchr (str, '+');
7281
7282       if (ext != NULL)
7283         optlen = ext - str;
7284       else
7285         optlen = strlen (str);
7286
7287       if (optlen >= 2 && strncmp (str, "no", 2) == 0)
7288         {
7289           if (adding_value != 0)
7290             adding_value = 0;
7291           optlen -= 2;
7292           str += 2;
7293         }
7294       else if (optlen > 0)
7295         {
7296           if (adding_value == -1)
7297             adding_value = 1;
7298           else if (adding_value != 1)
7299             {
7300               as_bad (_("must specify extensions to add before specifying "
7301                         "those to remove"));
7302               return FALSE;
7303             }
7304         }
7305
7306       if (optlen == 0)
7307         {
7308           as_bad (_("missing architectural extension"));
7309           return 0;
7310         }
7311
7312       gas_assert (adding_value != -1);
7313
7314       for (opt = aarch64_features; opt->name != NULL; opt++)
7315         if (strncmp (opt->name, str, optlen) == 0)
7316           {
7317             /* Add or remove the extension.  */
7318             if (adding_value)
7319               AARCH64_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
7320             else
7321               AARCH64_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
7322             break;
7323           }
7324
7325       if (opt->name == NULL)
7326         {
7327           as_bad (_("unknown architectural extension `%s'"), str);
7328           return 0;
7329         }
7330
7331       str = ext;
7332     };
7333
7334   return 1;
7335 }
7336
7337 static int
7338 aarch64_parse_cpu (char *str)
7339 {
7340   const struct aarch64_cpu_option_table *opt;
7341   char *ext = strchr (str, '+');
7342   size_t optlen;
7343
7344   if (ext != NULL)
7345     optlen = ext - str;
7346   else
7347     optlen = strlen (str);
7348
7349   if (optlen == 0)
7350     {
7351       as_bad (_("missing cpu name `%s'"), str);
7352       return 0;
7353     }
7354
7355   for (opt = aarch64_cpus; opt->name != NULL; opt++)
7356     if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
7357       {
7358         mcpu_cpu_opt = &opt->value;
7359         if (ext != NULL)
7360           return aarch64_parse_features (ext, &mcpu_cpu_opt);
7361
7362         return 1;
7363       }
7364
7365   as_bad (_("unknown cpu `%s'"), str);
7366   return 0;
7367 }
7368
7369 static int
7370 aarch64_parse_arch (char *str)
7371 {
7372   const struct aarch64_arch_option_table *opt;
7373   char *ext = strchr (str, '+');
7374   size_t optlen;
7375
7376   if (ext != NULL)
7377     optlen = ext - str;
7378   else
7379     optlen = strlen (str);
7380
7381   if (optlen == 0)
7382     {
7383       as_bad (_("missing architecture name `%s'"), str);
7384       return 0;
7385     }
7386
7387   for (opt = aarch64_archs; opt->name != NULL; opt++)
7388     if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
7389       {
7390         march_cpu_opt = &opt->value;
7391         if (ext != NULL)
7392           return aarch64_parse_features (ext, &march_cpu_opt);
7393
7394         return 1;
7395       }
7396
7397   as_bad (_("unknown architecture `%s'\n"), str);
7398   return 0;
7399 }
7400
7401 /* ABIs.  */
7402 struct aarch64_option_abi_value_table
7403 {
7404   char *name;
7405   enum aarch64_abi_type value;
7406 };
7407
7408 static const struct aarch64_option_abi_value_table aarch64_abis[] = {
7409   {"ilp32",             AARCH64_ABI_ILP32},
7410   {"lp64",              AARCH64_ABI_LP64},
7411   {NULL,                0}
7412 };
7413
7414 static int
7415 aarch64_parse_abi (char *str)
7416 {
7417   const struct aarch64_option_abi_value_table *opt;
7418   size_t optlen = strlen (str);
7419
7420   if (optlen == 0)
7421     {
7422       as_bad (_("missing abi name `%s'"), str);
7423       return 0;
7424     }
7425
7426   for (opt = aarch64_abis; opt->name != NULL; opt++)
7427     if (strlen (opt->name) == optlen && strncmp (str, opt->name, optlen) == 0)
7428       {
7429         aarch64_abi = opt->value;
7430         return 1;
7431       }
7432
7433   as_bad (_("unknown abi `%s'\n"), str);
7434   return 0;
7435 }
7436
7437 static struct aarch64_long_option_table aarch64_long_opts[] = {
7438 #ifdef OBJ_ELF
7439   {"mabi=", N_("<abi name>\t  specify for ABI <abi name>"),
7440    aarch64_parse_abi, NULL},
7441 #endif /* OBJ_ELF */
7442   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
7443    aarch64_parse_cpu, NULL},
7444   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
7445    aarch64_parse_arch, NULL},
7446   {NULL, NULL, 0, NULL}
7447 };
7448
7449 int
7450 md_parse_option (int c, char *arg)
7451 {
7452   struct aarch64_option_table *opt;
7453   struct aarch64_long_option_table *lopt;
7454
7455   switch (c)
7456     {
7457 #ifdef OPTION_EB
7458     case OPTION_EB:
7459       target_big_endian = 1;
7460       break;
7461 #endif
7462
7463 #ifdef OPTION_EL
7464     case OPTION_EL:
7465       target_big_endian = 0;
7466       break;
7467 #endif
7468
7469     case 'a':
7470       /* Listing option.  Just ignore these, we don't support additional
7471          ones.  */
7472       return 0;
7473
7474     default:
7475       for (opt = aarch64_opts; opt->option != NULL; opt++)
7476         {
7477           if (c == opt->option[0]
7478               && ((arg == NULL && opt->option[1] == 0)
7479                   || streq (arg, opt->option + 1)))
7480             {
7481               /* If the option is deprecated, tell the user.  */
7482               if (opt->deprecated != NULL)
7483                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
7484                            arg ? arg : "", _(opt->deprecated));
7485
7486               if (opt->var != NULL)
7487                 *opt->var = opt->value;
7488
7489               return 1;
7490             }
7491         }
7492
7493       for (lopt = aarch64_long_opts; lopt->option != NULL; lopt++)
7494         {
7495           /* These options are expected to have an argument.  */
7496           if (c == lopt->option[0]
7497               && arg != NULL
7498               && strncmp (arg, lopt->option + 1,
7499                           strlen (lopt->option + 1)) == 0)
7500             {
7501               /* If the option is deprecated, tell the user.  */
7502               if (lopt->deprecated != NULL)
7503                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
7504                            _(lopt->deprecated));
7505
7506               /* Call the sup-option parser.  */
7507               return lopt->func (arg + strlen (lopt->option) - 1);
7508             }
7509         }
7510
7511       return 0;
7512     }
7513
7514   return 1;
7515 }
7516
7517 void
7518 md_show_usage (FILE * fp)
7519 {
7520   struct aarch64_option_table *opt;
7521   struct aarch64_long_option_table *lopt;
7522
7523   fprintf (fp, _(" AArch64-specific assembler options:\n"));
7524
7525   for (opt = aarch64_opts; opt->option != NULL; opt++)
7526     if (opt->help != NULL)
7527       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
7528
7529   for (lopt = aarch64_long_opts; lopt->option != NULL; lopt++)
7530     if (lopt->help != NULL)
7531       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
7532
7533 #ifdef OPTION_EB
7534   fprintf (fp, _("\
7535   -EB                     assemble code for a big-endian cpu\n"));
7536 #endif
7537
7538 #ifdef OPTION_EL
7539   fprintf (fp, _("\
7540   -EL                     assemble code for a little-endian cpu\n"));
7541 #endif
7542 }
7543
7544 /* Parse a .cpu directive.  */
7545
7546 static void
7547 s_aarch64_cpu (int ignored ATTRIBUTE_UNUSED)
7548 {
7549   const struct aarch64_cpu_option_table *opt;
7550   char saved_char;
7551   char *name;
7552   char *ext;
7553   size_t optlen;
7554
7555   name = input_line_pointer;
7556   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
7557     input_line_pointer++;
7558   saved_char = *input_line_pointer;
7559   *input_line_pointer = 0;
7560
7561   ext = strchr (name, '+');
7562
7563   if (ext != NULL)
7564     optlen = ext - name;
7565   else
7566     optlen = strlen (name);
7567
7568   /* Skip the first "all" entry.  */
7569   for (opt = aarch64_cpus + 1; opt->name != NULL; opt++)
7570     if (strlen (opt->name) == optlen
7571         && strncmp (name, opt->name, optlen) == 0)
7572       {
7573         mcpu_cpu_opt = &opt->value;
7574         if (ext != NULL)
7575           if (!aarch64_parse_features (ext, &mcpu_cpu_opt))
7576             return;
7577
7578         cpu_variant = *mcpu_cpu_opt;
7579
7580         *input_line_pointer = saved_char;
7581         demand_empty_rest_of_line ();
7582         return;
7583       }
7584   as_bad (_("unknown cpu `%s'"), name);
7585   *input_line_pointer = saved_char;
7586   ignore_rest_of_line ();
7587 }
7588
7589
7590 /* Parse a .arch directive.  */
7591
7592 static void
7593 s_aarch64_arch (int ignored ATTRIBUTE_UNUSED)
7594 {
7595   const struct aarch64_arch_option_table *opt;
7596   char saved_char;
7597   char *name;
7598   char *ext;
7599   size_t optlen;
7600
7601   name = input_line_pointer;
7602   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
7603     input_line_pointer++;
7604   saved_char = *input_line_pointer;
7605   *input_line_pointer = 0;
7606
7607   ext = strchr (name, '+');
7608
7609   if (ext != NULL)
7610     optlen = ext - name;
7611   else
7612     optlen = strlen (name);
7613
7614   /* Skip the first "all" entry.  */
7615   for (opt = aarch64_archs + 1; opt->name != NULL; opt++)
7616     if (strlen (opt->name) == optlen
7617         && strncmp (name, opt->name, optlen) == 0)
7618       {
7619         mcpu_cpu_opt = &opt->value;
7620         if (ext != NULL)
7621           if (!aarch64_parse_features (ext, &mcpu_cpu_opt))
7622             return;
7623
7624         cpu_variant = *mcpu_cpu_opt;
7625
7626         *input_line_pointer = saved_char;
7627         demand_empty_rest_of_line ();
7628         return;
7629       }
7630
7631   as_bad (_("unknown architecture `%s'\n"), name);
7632   *input_line_pointer = saved_char;
7633   ignore_rest_of_line ();
7634 }
7635
7636 /* Copy symbol information.  */
7637
7638 void
7639 aarch64_copy_symbol_attributes (symbolS * dest, symbolS * src)
7640 {
7641   AARCH64_GET_FLAG (dest) = AARCH64_GET_FLAG (src);
7642 }