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