b3c974bbe521b6d14bb5b164d9831433d9dd04c2
[external/binutils.git] / gas / config / tc-arm.c
1 /* tc-arm.c -- Assemble for the ARM
2    Copyright (C) 1994-2014 Free Software Foundation, Inc.
3    Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
4         Modified by David Taylor (dtaylor@armltd.co.uk)
5         Cirrus coprocessor mods by Aldy Hernandez (aldyh@redhat.com)
6         Cirrus coprocessor fixes by Petko Manolov (petkan@nucleusys.com)
7         Cirrus coprocessor fixes by Vladimir Ivanov (vladitx@nucleusys.com)
8
9    This file is part of GAS, the GNU Assembler.
10
11    GAS is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3, or (at your option)
14    any later version.
15
16    GAS is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with GAS; see the file COPYING.  If not, write to the Free
23    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25
26 #include "as.h"
27 #include <limits.h>
28 #include <stdarg.h>
29 #define  NO_RELOC 0
30 #include "safe-ctype.h"
31 #include "subsegs.h"
32 #include "obstack.h"
33 #include "libiberty.h"
34 #include "opcode/arm.h"
35
36 #ifdef OBJ_ELF
37 #include "elf/arm.h"
38 #include "dw2gencfi.h"
39 #endif
40
41 #include "dwarf2dbg.h"
42
43 #ifdef OBJ_ELF
44 /* Must be at least the size of the largest unwind opcode (currently two).  */
45 #define ARM_OPCODE_CHUNK_SIZE 8
46
47 /* This structure holds the unwinding state.  */
48
49 static struct
50 {
51   symbolS *       proc_start;
52   symbolS *       table_entry;
53   symbolS *       personality_routine;
54   int             personality_index;
55   /* The segment containing the function.  */
56   segT            saved_seg;
57   subsegT         saved_subseg;
58   /* Opcodes generated from this function.  */
59   unsigned char * opcodes;
60   int             opcode_count;
61   int             opcode_alloc;
62   /* The number of bytes pushed to the stack.  */
63   offsetT         frame_size;
64   /* We don't add stack adjustment opcodes immediately so that we can merge
65      multiple adjustments.  We can also omit the final adjustment
66      when using a frame pointer.  */
67   offsetT         pending_offset;
68   /* These two fields are set by both unwind_movsp and unwind_setfp.  They
69      hold the reg+offset to use when restoring sp from a frame pointer.  */
70   offsetT         fp_offset;
71   int             fp_reg;
72   /* Nonzero if an unwind_setfp directive has been seen.  */
73   unsigned        fp_used:1;
74   /* Nonzero if the last opcode restores sp from fp_reg.  */
75   unsigned        sp_restored:1;
76 } unwind;
77
78 #endif /* OBJ_ELF */
79
80 /* Results from operand parsing worker functions.  */
81
82 typedef enum
83 {
84   PARSE_OPERAND_SUCCESS,
85   PARSE_OPERAND_FAIL,
86   PARSE_OPERAND_FAIL_NO_BACKTRACK
87 } parse_operand_result;
88
89 enum arm_float_abi
90 {
91   ARM_FLOAT_ABI_HARD,
92   ARM_FLOAT_ABI_SOFTFP,
93   ARM_FLOAT_ABI_SOFT
94 };
95
96 /* Types of processor to assemble for.  */
97 #ifndef CPU_DEFAULT
98 /* The code that was here used to select a default CPU depending on compiler
99    pre-defines which were only present when doing native builds, thus
100    changing gas' default behaviour depending upon the build host.
101
102    If you have a target that requires a default CPU option then the you
103    should define CPU_DEFAULT here.  */
104 #endif
105
106 #ifndef FPU_DEFAULT
107 # ifdef TE_LINUX
108 #  define FPU_DEFAULT FPU_ARCH_FPA
109 # elif defined (TE_NetBSD)
110 #  ifdef OBJ_ELF
111 #   define FPU_DEFAULT FPU_ARCH_VFP     /* Soft-float, but VFP order.  */
112 #  else
113     /* Legacy a.out format.  */
114 #   define FPU_DEFAULT FPU_ARCH_FPA     /* Soft-float, but FPA order.  */
115 #  endif
116 # elif defined (TE_VXWORKS)
117 #  define FPU_DEFAULT FPU_ARCH_VFP      /* Soft-float, VFP order.  */
118 # else
119    /* For backwards compatibility, default to FPA.  */
120 #  define FPU_DEFAULT FPU_ARCH_FPA
121 # endif
122 #endif /* ifndef FPU_DEFAULT */
123
124 #define streq(a, b)           (strcmp (a, b) == 0)
125
126 static arm_feature_set cpu_variant;
127 static arm_feature_set arm_arch_used;
128 static arm_feature_set thumb_arch_used;
129
130 /* Flags stored in private area of BFD structure.  */
131 static int uses_apcs_26      = FALSE;
132 static int atpcs             = FALSE;
133 static int support_interwork = FALSE;
134 static int uses_apcs_float   = FALSE;
135 static int pic_code          = FALSE;
136 static int fix_v4bx          = FALSE;
137 /* Warn on using deprecated features.  */
138 static int warn_on_deprecated = TRUE;
139
140
141 /* Variables that we set while parsing command-line options.  Once all
142    options have been read we re-process these values to set the real
143    assembly flags.  */
144 static const arm_feature_set *legacy_cpu = NULL;
145 static const arm_feature_set *legacy_fpu = NULL;
146
147 static const arm_feature_set *mcpu_cpu_opt = NULL;
148 static const arm_feature_set *mcpu_fpu_opt = NULL;
149 static const arm_feature_set *march_cpu_opt = NULL;
150 static const arm_feature_set *march_fpu_opt = NULL;
151 static const arm_feature_set *mfpu_opt = NULL;
152 static const arm_feature_set *object_arch = NULL;
153
154 /* Constants for known architecture features.  */
155 static const arm_feature_set fpu_default = FPU_DEFAULT;
156 static const arm_feature_set fpu_arch_vfp_v1 = FPU_ARCH_VFP_V1;
157 static const arm_feature_set fpu_arch_vfp_v2 = FPU_ARCH_VFP_V2;
158 static const arm_feature_set fpu_arch_vfp_v3 = FPU_ARCH_VFP_V3;
159 static const arm_feature_set fpu_arch_neon_v1 = FPU_ARCH_NEON_V1;
160 static const arm_feature_set fpu_arch_fpa = FPU_ARCH_FPA;
161 static const arm_feature_set fpu_any_hard = FPU_ANY_HARD;
162 static const arm_feature_set fpu_arch_maverick = FPU_ARCH_MAVERICK;
163 static const arm_feature_set fpu_endian_pure = FPU_ARCH_ENDIAN_PURE;
164
165 #ifdef CPU_DEFAULT
166 static const arm_feature_set cpu_default = CPU_DEFAULT;
167 #endif
168
169 static const arm_feature_set arm_ext_v1 = ARM_FEATURE (ARM_EXT_V1, 0);
170 static const arm_feature_set arm_ext_v2 = ARM_FEATURE (ARM_EXT_V1, 0);
171 static const arm_feature_set arm_ext_v2s = ARM_FEATURE (ARM_EXT_V2S, 0);
172 static const arm_feature_set arm_ext_v3 = ARM_FEATURE (ARM_EXT_V3, 0);
173 static const arm_feature_set arm_ext_v3m = ARM_FEATURE (ARM_EXT_V3M, 0);
174 static const arm_feature_set arm_ext_v4 = ARM_FEATURE (ARM_EXT_V4, 0);
175 static const arm_feature_set arm_ext_v4t = ARM_FEATURE (ARM_EXT_V4T, 0);
176 static const arm_feature_set arm_ext_v5 = ARM_FEATURE (ARM_EXT_V5, 0);
177 static const arm_feature_set arm_ext_v4t_5 =
178   ARM_FEATURE (ARM_EXT_V4T | ARM_EXT_V5, 0);
179 static const arm_feature_set arm_ext_v5t = ARM_FEATURE (ARM_EXT_V5T, 0);
180 static const arm_feature_set arm_ext_v5e = ARM_FEATURE (ARM_EXT_V5E, 0);
181 static const arm_feature_set arm_ext_v5exp = ARM_FEATURE (ARM_EXT_V5ExP, 0);
182 static const arm_feature_set arm_ext_v5j = ARM_FEATURE (ARM_EXT_V5J, 0);
183 static const arm_feature_set arm_ext_v6 = ARM_FEATURE (ARM_EXT_V6, 0);
184 static const arm_feature_set arm_ext_v6k = ARM_FEATURE (ARM_EXT_V6K, 0);
185 static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE (ARM_EXT_V6T2, 0);
186 static const arm_feature_set arm_ext_v6m = ARM_FEATURE (ARM_EXT_V6M, 0);
187 static const arm_feature_set arm_ext_v6_notm = ARM_FEATURE (ARM_EXT_V6_NOTM, 0);
188 static const arm_feature_set arm_ext_v6_dsp = ARM_FEATURE (ARM_EXT_V6_DSP, 0);
189 static const arm_feature_set arm_ext_barrier = ARM_FEATURE (ARM_EXT_BARRIER, 0);
190 static const arm_feature_set arm_ext_msr = ARM_FEATURE (ARM_EXT_THUMB_MSR, 0);
191 static const arm_feature_set arm_ext_div = ARM_FEATURE (ARM_EXT_DIV, 0);
192 static const arm_feature_set arm_ext_v7 = ARM_FEATURE (ARM_EXT_V7, 0);
193 static const arm_feature_set arm_ext_v7a = ARM_FEATURE (ARM_EXT_V7A, 0);
194 static const arm_feature_set arm_ext_v7r = ARM_FEATURE (ARM_EXT_V7R, 0);
195 static const arm_feature_set arm_ext_v7m = ARM_FEATURE (ARM_EXT_V7M, 0);
196 static const arm_feature_set arm_ext_v8 = ARM_FEATURE (ARM_EXT_V8, 0);
197 static const arm_feature_set arm_ext_m =
198   ARM_FEATURE (ARM_EXT_V6M | ARM_EXT_OS | ARM_EXT_V7M, 0);
199 static const arm_feature_set arm_ext_mp = ARM_FEATURE (ARM_EXT_MP, 0);
200 static const arm_feature_set arm_ext_sec = ARM_FEATURE (ARM_EXT_SEC, 0);
201 static const arm_feature_set arm_ext_os = ARM_FEATURE (ARM_EXT_OS, 0);
202 static const arm_feature_set arm_ext_adiv = ARM_FEATURE (ARM_EXT_ADIV, 0);
203 static const arm_feature_set arm_ext_virt = ARM_FEATURE (ARM_EXT_VIRT, 0);
204
205 static const arm_feature_set arm_arch_any = ARM_ANY;
206 static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1);
207 static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
208 static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
209 static const arm_feature_set arm_arch_v6m_only = ARM_ARCH_V6M_ONLY;
210
211 static const arm_feature_set arm_cext_iwmmxt2 =
212   ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
213 static const arm_feature_set arm_cext_iwmmxt =
214   ARM_FEATURE (0, ARM_CEXT_IWMMXT);
215 static const arm_feature_set arm_cext_xscale =
216   ARM_FEATURE (0, ARM_CEXT_XSCALE);
217 static const arm_feature_set arm_cext_maverick =
218   ARM_FEATURE (0, ARM_CEXT_MAVERICK);
219 static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
220 static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
221 static const arm_feature_set fpu_vfp_ext_v1xd =
222   ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
223 static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
224 static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
225 static const arm_feature_set fpu_vfp_ext_v3xd = ARM_FEATURE (0, FPU_VFP_EXT_V3xD);
226 static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
227 static const arm_feature_set fpu_vfp_ext_d32 =
228   ARM_FEATURE (0, FPU_VFP_EXT_D32);
229 static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
230 static const arm_feature_set fpu_vfp_v3_or_neon_ext =
231   ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
232 static const arm_feature_set fpu_vfp_fp16 = ARM_FEATURE (0, FPU_VFP_EXT_FP16);
233 static const arm_feature_set fpu_neon_ext_fma = ARM_FEATURE (0, FPU_NEON_EXT_FMA);
234 static const arm_feature_set fpu_vfp_ext_fma = ARM_FEATURE (0, FPU_VFP_EXT_FMA);
235 static const arm_feature_set fpu_vfp_ext_armv8 =
236   ARM_FEATURE (0, FPU_VFP_EXT_ARMV8);
237 static const arm_feature_set fpu_neon_ext_armv8 =
238   ARM_FEATURE (0, FPU_NEON_EXT_ARMV8);
239 static const arm_feature_set fpu_crypto_ext_armv8 =
240   ARM_FEATURE (0, FPU_CRYPTO_EXT_ARMV8);
241 static const arm_feature_set crc_ext_armv8 =
242   ARM_FEATURE (0, CRC_EXT_ARMV8);
243
244 static int mfloat_abi_opt = -1;
245 /* Record user cpu selection for object attributes.  */
246 static arm_feature_set selected_cpu = ARM_ARCH_NONE;
247 /* Must be long enough to hold any of the names in arm_cpus.  */
248 static char selected_cpu_name[16];
249
250 /* Return if no cpu was selected on command-line.  */
251 static bfd_boolean
252 no_cpu_selected (void)
253 {
254   return selected_cpu.core == arm_arch_none.core
255     && selected_cpu.coproc == arm_arch_none.coproc;
256 }
257
258 #ifdef OBJ_ELF
259 # ifdef EABI_DEFAULT
260 static int meabi_flags = EABI_DEFAULT;
261 # else
262 static int meabi_flags = EF_ARM_EABI_UNKNOWN;
263 # endif
264
265 static int attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
266
267 bfd_boolean
268 arm_is_eabi (void)
269 {
270   return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
271 }
272 #endif
273
274 #ifdef OBJ_ELF
275 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
276 symbolS * GOT_symbol;
277 #endif
278
279 /* 0: assemble for ARM,
280    1: assemble for Thumb,
281    2: assemble for Thumb even though target CPU does not support thumb
282       instructions.  */
283 static int thumb_mode = 0;
284 /* A value distinct from the possible values for thumb_mode that we
285    can use to record whether thumb_mode has been copied into the
286    tc_frag_data field of a frag.  */
287 #define MODE_RECORDED (1 << 4)
288
289 /* Specifies the intrinsic IT insn behavior mode.  */
290 enum implicit_it_mode
291 {
292   IMPLICIT_IT_MODE_NEVER  = 0x00,
293   IMPLICIT_IT_MODE_ARM    = 0x01,
294   IMPLICIT_IT_MODE_THUMB  = 0x02,
295   IMPLICIT_IT_MODE_ALWAYS = (IMPLICIT_IT_MODE_ARM | IMPLICIT_IT_MODE_THUMB)
296 };
297 static int implicit_it_mode = IMPLICIT_IT_MODE_ARM;
298
299 /* If unified_syntax is true, we are processing the new unified
300    ARM/Thumb syntax.  Important differences from the old ARM mode:
301
302      - Immediate operands do not require a # prefix.
303      - Conditional affixes always appear at the end of the
304        instruction.  (For backward compatibility, those instructions
305        that formerly had them in the middle, continue to accept them
306        there.)
307      - The IT instruction may appear, and if it does is validated
308        against subsequent conditional affixes.  It does not generate
309        machine code.
310
311    Important differences from the old Thumb mode:
312
313      - Immediate operands do not require a # prefix.
314      - Most of the V6T2 instructions are only available in unified mode.
315      - The .N and .W suffixes are recognized and honored (it is an error
316        if they cannot be honored).
317      - All instructions set the flags if and only if they have an 's' affix.
318      - Conditional affixes may be used.  They are validated against
319        preceding IT instructions.  Unlike ARM mode, you cannot use a
320        conditional affix except in the scope of an IT instruction.  */
321
322 static bfd_boolean unified_syntax = FALSE;
323
324 /* An immediate operand can start with #, and ld*, st*, pld operands
325    can contain [ and ].  We need to tell APP not to elide whitespace
326    before a [, which can appear as the first operand for pld.
327    Likewise, a { can appear as the first operand for push, pop, vld*, etc.  */
328 const char arm_symbol_chars[] = "#[]{}";
329
330 enum neon_el_type
331 {
332   NT_invtype,
333   NT_untyped,
334   NT_integer,
335   NT_float,
336   NT_poly,
337   NT_signed,
338   NT_unsigned
339 };
340
341 struct neon_type_el
342 {
343   enum neon_el_type type;
344   unsigned size;
345 };
346
347 #define NEON_MAX_TYPE_ELS 4
348
349 struct neon_type
350 {
351   struct neon_type_el el[NEON_MAX_TYPE_ELS];
352   unsigned elems;
353 };
354
355 enum it_instruction_type
356 {
357    OUTSIDE_IT_INSN,
358    INSIDE_IT_INSN,
359    INSIDE_IT_LAST_INSN,
360    IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
361                               if inside, should be the last one.  */
362    NEUTRAL_IT_INSN,        /* This could be either inside or outside,
363                               i.e. BKPT and NOP.  */
364    IT_INSN                 /* The IT insn has been parsed.  */
365 };
366
367 /* The maximum number of operands we need.  */
368 #define ARM_IT_MAX_OPERANDS 6
369
370 struct arm_it
371 {
372   const char *  error;
373   unsigned long instruction;
374   int           size;
375   int           size_req;
376   int           cond;
377   /* "uncond_value" is set to the value in place of the conditional field in
378      unconditional versions of the instruction, or -1 if nothing is
379      appropriate.  */
380   int           uncond_value;
381   struct neon_type vectype;
382   /* This does not indicate an actual NEON instruction, only that
383      the mnemonic accepts neon-style type suffixes.  */
384   int           is_neon;
385   /* Set to the opcode if the instruction needs relaxation.
386      Zero if the instruction is not relaxed.  */
387   unsigned long relax;
388   struct
389   {
390     bfd_reloc_code_real_type type;
391     expressionS              exp;
392     int                      pc_rel;
393   } reloc;
394
395   enum it_instruction_type it_insn_type;
396
397   struct
398   {
399     unsigned reg;
400     signed int imm;
401     struct neon_type_el vectype;
402     unsigned present    : 1;  /* Operand present.  */
403     unsigned isreg      : 1;  /* Operand was a register.  */
404     unsigned immisreg   : 1;  /* .imm field is a second register.  */
405     unsigned isscalar   : 1;  /* Operand is a (Neon) scalar.  */
406     unsigned immisalign : 1;  /* Immediate is an alignment specifier.  */
407     unsigned immisfloat : 1;  /* Immediate was parsed as a float.  */
408     /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
409        instructions. This allows us to disambiguate ARM <-> vector insns.  */
410     unsigned regisimm   : 1;  /* 64-bit immediate, reg forms high 32 bits.  */
411     unsigned isvec      : 1;  /* Is a single, double or quad VFP/Neon reg.  */
412     unsigned isquad     : 1;  /* Operand is Neon quad-precision register.  */
413     unsigned issingle   : 1;  /* Operand is VFP single-precision register.  */
414     unsigned hasreloc   : 1;  /* Operand has relocation suffix.  */
415     unsigned writeback  : 1;  /* Operand has trailing !  */
416     unsigned preind     : 1;  /* Preindexed address.  */
417     unsigned postind    : 1;  /* Postindexed address.  */
418     unsigned negative   : 1;  /* Index register was negated.  */
419     unsigned shifted    : 1;  /* Shift applied to operation.  */
420     unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
421   } operands[ARM_IT_MAX_OPERANDS];
422 };
423
424 static struct arm_it inst;
425
426 #define NUM_FLOAT_VALS 8
427
428 const char * fp_const[] =
429 {
430   "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
431 };
432
433 /* Number of littlenums required to hold an extended precision number.  */
434 #define MAX_LITTLENUMS 6
435
436 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
437
438 #define FAIL    (-1)
439 #define SUCCESS (0)
440
441 #define SUFF_S 1
442 #define SUFF_D 2
443 #define SUFF_E 3
444 #define SUFF_P 4
445
446 #define CP_T_X   0x00008000
447 #define CP_T_Y   0x00400000
448
449 #define CONDS_BIT        0x00100000
450 #define LOAD_BIT         0x00100000
451
452 #define DOUBLE_LOAD_FLAG 0x00000001
453
454 struct asm_cond
455 {
456   const char *   template_name;
457   unsigned long  value;
458 };
459
460 #define COND_ALWAYS 0xE
461
462 struct asm_psr
463 {
464   const char *   template_name;
465   unsigned long  field;
466 };
467
468 struct asm_barrier_opt
469 {
470   const char *    template_name;
471   unsigned long   value;
472   const arm_feature_set arch;
473 };
474
475 /* The bit that distinguishes CPSR and SPSR.  */
476 #define SPSR_BIT   (1 << 22)
477
478 /* The individual PSR flag bits.  */
479 #define PSR_c   (1 << 16)
480 #define PSR_x   (1 << 17)
481 #define PSR_s   (1 << 18)
482 #define PSR_f   (1 << 19)
483
484 struct reloc_entry
485 {
486   char *                    name;
487   bfd_reloc_code_real_type  reloc;
488 };
489
490 enum vfp_reg_pos
491 {
492   VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
493   VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
494 };
495
496 enum vfp_ldstm_type
497 {
498   VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
499 };
500
501 /* Bits for DEFINED field in neon_typed_alias.  */
502 #define NTA_HASTYPE  1
503 #define NTA_HASINDEX 2
504
505 struct neon_typed_alias
506 {
507   unsigned char        defined;
508   unsigned char        index;
509   struct neon_type_el  eltype;
510 };
511
512 /* ARM register categories.  This includes coprocessor numbers and various
513    architecture extensions' registers.  */
514 enum arm_reg_type
515 {
516   REG_TYPE_RN,
517   REG_TYPE_CP,
518   REG_TYPE_CN,
519   REG_TYPE_FN,
520   REG_TYPE_VFS,
521   REG_TYPE_VFD,
522   REG_TYPE_NQ,
523   REG_TYPE_VFSD,
524   REG_TYPE_NDQ,
525   REG_TYPE_NSDQ,
526   REG_TYPE_VFC,
527   REG_TYPE_MVF,
528   REG_TYPE_MVD,
529   REG_TYPE_MVFX,
530   REG_TYPE_MVDX,
531   REG_TYPE_MVAX,
532   REG_TYPE_DSPSC,
533   REG_TYPE_MMXWR,
534   REG_TYPE_MMXWC,
535   REG_TYPE_MMXWCG,
536   REG_TYPE_XSCALE,
537   REG_TYPE_RNB
538 };
539
540 /* Structure for a hash table entry for a register.
541    If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
542    information which states whether a vector type or index is specified (for a
543    register alias created with .dn or .qn). Otherwise NEON should be NULL.  */
544 struct reg_entry
545 {
546   const char *               name;
547   unsigned int               number;
548   unsigned char              type;
549   unsigned char              builtin;
550   struct neon_typed_alias *  neon;
551 };
552
553 /* Diagnostics used when we don't get a register of the expected type.  */
554 const char * const reg_expected_msgs[] =
555 {
556   N_("ARM register expected"),
557   N_("bad or missing co-processor number"),
558   N_("co-processor register expected"),
559   N_("FPA register expected"),
560   N_("VFP single precision register expected"),
561   N_("VFP/Neon double precision register expected"),
562   N_("Neon quad precision register expected"),
563   N_("VFP single or double precision register expected"),
564   N_("Neon double or quad precision register expected"),
565   N_("VFP single, double or Neon quad precision register expected"),
566   N_("VFP system register expected"),
567   N_("Maverick MVF register expected"),
568   N_("Maverick MVD register expected"),
569   N_("Maverick MVFX register expected"),
570   N_("Maverick MVDX register expected"),
571   N_("Maverick MVAX register expected"),
572   N_("Maverick DSPSC register expected"),
573   N_("iWMMXt data register expected"),
574   N_("iWMMXt control register expected"),
575   N_("iWMMXt scalar register expected"),
576   N_("XScale accumulator register expected"),
577 };
578
579 /* Some well known registers that we refer to directly elsewhere.  */
580 #define REG_R12 12
581 #define REG_SP  13
582 #define REG_LR  14
583 #define REG_PC  15
584
585 /* ARM instructions take 4bytes in the object file, Thumb instructions
586    take 2:  */
587 #define INSN_SIZE       4
588
589 struct asm_opcode
590 {
591   /* Basic string to match.  */
592   const char * template_name;
593
594   /* Parameters to instruction.  */
595   unsigned int operands[8];
596
597   /* Conditional tag - see opcode_lookup.  */
598   unsigned int tag : 4;
599
600   /* Basic instruction code.  */
601   unsigned int avalue : 28;
602
603   /* Thumb-format instruction code.  */
604   unsigned int tvalue;
605
606   /* Which architecture variant provides this instruction.  */
607   const arm_feature_set * avariant;
608   const arm_feature_set * tvariant;
609
610   /* Function to call to encode instruction in ARM format.  */
611   void (* aencode) (void);
612
613   /* Function to call to encode instruction in Thumb format.  */
614   void (* tencode) (void);
615 };
616
617 /* Defines for various bits that we will want to toggle.  */
618 #define INST_IMMEDIATE  0x02000000
619 #define OFFSET_REG      0x02000000
620 #define HWOFFSET_IMM    0x00400000
621 #define SHIFT_BY_REG    0x00000010
622 #define PRE_INDEX       0x01000000
623 #define INDEX_UP        0x00800000
624 #define WRITE_BACK      0x00200000
625 #define LDM_TYPE_2_OR_3 0x00400000
626 #define CPSI_MMOD       0x00020000
627
628 #define LITERAL_MASK    0xf000f000
629 #define OPCODE_MASK     0xfe1fffff
630 #define V4_STR_BIT      0x00000020
631
632 #define T2_SUBS_PC_LR   0xf3de8f00
633
634 #define DATA_OP_SHIFT   21
635
636 #define T2_OPCODE_MASK  0xfe1fffff
637 #define T2_DATA_OP_SHIFT 21
638
639 #define A_COND_MASK         0xf0000000
640 #define A_PUSH_POP_OP_MASK  0x0fff0000
641
642 /* Opcodes for pushing/poping registers to/from the stack.  */
643 #define A1_OPCODE_PUSH    0x092d0000
644 #define A2_OPCODE_PUSH    0x052d0004
645 #define A2_OPCODE_POP     0x049d0004
646
647 /* Codes to distinguish the arithmetic instructions.  */
648 #define OPCODE_AND      0
649 #define OPCODE_EOR      1
650 #define OPCODE_SUB      2
651 #define OPCODE_RSB      3
652 #define OPCODE_ADD      4
653 #define OPCODE_ADC      5
654 #define OPCODE_SBC      6
655 #define OPCODE_RSC      7
656 #define OPCODE_TST      8
657 #define OPCODE_TEQ      9
658 #define OPCODE_CMP      10
659 #define OPCODE_CMN      11
660 #define OPCODE_ORR      12
661 #define OPCODE_MOV      13
662 #define OPCODE_BIC      14
663 #define OPCODE_MVN      15
664
665 #define T2_OPCODE_AND   0
666 #define T2_OPCODE_BIC   1
667 #define T2_OPCODE_ORR   2
668 #define T2_OPCODE_ORN   3
669 #define T2_OPCODE_EOR   4
670 #define T2_OPCODE_ADD   8
671 #define T2_OPCODE_ADC   10
672 #define T2_OPCODE_SBC   11
673 #define T2_OPCODE_SUB   13
674 #define T2_OPCODE_RSB   14
675
676 #define T_OPCODE_MUL 0x4340
677 #define T_OPCODE_TST 0x4200
678 #define T_OPCODE_CMN 0x42c0
679 #define T_OPCODE_NEG 0x4240
680 #define T_OPCODE_MVN 0x43c0
681
682 #define T_OPCODE_ADD_R3 0x1800
683 #define T_OPCODE_SUB_R3 0x1a00
684 #define T_OPCODE_ADD_HI 0x4400
685 #define T_OPCODE_ADD_ST 0xb000
686 #define T_OPCODE_SUB_ST 0xb080
687 #define T_OPCODE_ADD_SP 0xa800
688 #define T_OPCODE_ADD_PC 0xa000
689 #define T_OPCODE_ADD_I8 0x3000
690 #define T_OPCODE_SUB_I8 0x3800
691 #define T_OPCODE_ADD_I3 0x1c00
692 #define T_OPCODE_SUB_I3 0x1e00
693
694 #define T_OPCODE_ASR_R  0x4100
695 #define T_OPCODE_LSL_R  0x4080
696 #define T_OPCODE_LSR_R  0x40c0
697 #define T_OPCODE_ROR_R  0x41c0
698 #define T_OPCODE_ASR_I  0x1000
699 #define T_OPCODE_LSL_I  0x0000
700 #define T_OPCODE_LSR_I  0x0800
701
702 #define T_OPCODE_MOV_I8 0x2000
703 #define T_OPCODE_CMP_I8 0x2800
704 #define T_OPCODE_CMP_LR 0x4280
705 #define T_OPCODE_MOV_HR 0x4600
706 #define T_OPCODE_CMP_HR 0x4500
707
708 #define T_OPCODE_LDR_PC 0x4800
709 #define T_OPCODE_LDR_SP 0x9800
710 #define T_OPCODE_STR_SP 0x9000
711 #define T_OPCODE_LDR_IW 0x6800
712 #define T_OPCODE_STR_IW 0x6000
713 #define T_OPCODE_LDR_IH 0x8800
714 #define T_OPCODE_STR_IH 0x8000
715 #define T_OPCODE_LDR_IB 0x7800
716 #define T_OPCODE_STR_IB 0x7000
717 #define T_OPCODE_LDR_RW 0x5800
718 #define T_OPCODE_STR_RW 0x5000
719 #define T_OPCODE_LDR_RH 0x5a00
720 #define T_OPCODE_STR_RH 0x5200
721 #define T_OPCODE_LDR_RB 0x5c00
722 #define T_OPCODE_STR_RB 0x5400
723
724 #define T_OPCODE_PUSH   0xb400
725 #define T_OPCODE_POP    0xbc00
726
727 #define T_OPCODE_BRANCH 0xe000
728
729 #define THUMB_SIZE      2       /* Size of thumb instruction.  */
730 #define THUMB_PP_PC_LR 0x0100
731 #define THUMB_LOAD_BIT 0x0800
732 #define THUMB2_LOAD_BIT 0x00100000
733
734 #define BAD_ARGS        _("bad arguments to instruction")
735 #define BAD_SP          _("r13 not allowed here")
736 #define BAD_PC          _("r15 not allowed here")
737 #define BAD_COND        _("instruction cannot be conditional")
738 #define BAD_OVERLAP     _("registers may not be the same")
739 #define BAD_HIREG       _("lo register required")
740 #define BAD_THUMB32     _("instruction not supported in Thumb16 mode")
741 #define BAD_ADDR_MODE   _("instruction does not accept this addressing mode");
742 #define BAD_BRANCH      _("branch must be last instruction in IT block")
743 #define BAD_NOT_IT      _("instruction not allowed in IT block")
744 #define BAD_FPU         _("selected FPU does not support instruction")
745 #define BAD_OUT_IT      _("thumb conditional instruction should be in IT block")
746 #define BAD_IT_COND     _("incorrect condition in IT block")
747 #define BAD_IT_IT       _("IT falling in the range of a previous IT block")
748 #define MISSING_FNSTART _("missing .fnstart before unwinding directive")
749 #define BAD_PC_ADDRESSING \
750         _("cannot use register index with PC-relative addressing")
751 #define BAD_PC_WRITEBACK \
752         _("cannot use writeback with PC-relative addressing")
753 #define BAD_RANGE     _("branch out of range")
754 #define UNPRED_REG(R)   _("using " R " results in unpredictable behaviour")
755
756 static struct hash_control * arm_ops_hsh;
757 static struct hash_control * arm_cond_hsh;
758 static struct hash_control * arm_shift_hsh;
759 static struct hash_control * arm_psr_hsh;
760 static struct hash_control * arm_v7m_psr_hsh;
761 static struct hash_control * arm_reg_hsh;
762 static struct hash_control * arm_reloc_hsh;
763 static struct hash_control * arm_barrier_opt_hsh;
764
765 /* Stuff needed to resolve the label ambiguity
766    As:
767      ...
768      label:   <insn>
769    may differ from:
770      ...
771      label:
772               <insn>  */
773
774 symbolS *  last_label_seen;
775 static int label_is_thumb_function_name = FALSE;
776
777 /* Literal pool structure.  Held on a per-section
778    and per-sub-section basis.  */
779
780 #define MAX_LITERAL_POOL_SIZE 1024
781 typedef struct literal_pool
782 {
783   expressionS            literals [MAX_LITERAL_POOL_SIZE];
784   unsigned int           next_free_entry;
785   unsigned int           id;
786   symbolS *              symbol;
787   segT                   section;
788   subsegT                sub_section;
789 #ifdef OBJ_ELF
790   struct dwarf2_line_info locs [MAX_LITERAL_POOL_SIZE];
791 #endif
792   struct literal_pool *  next;
793 } literal_pool;
794
795 /* Pointer to a linked list of literal pools.  */
796 literal_pool * list_of_pools = NULL;
797
798 #ifdef OBJ_ELF
799 #  define now_it seg_info (now_seg)->tc_segment_info_data.current_it
800 #else
801 static struct current_it now_it;
802 #endif
803
804 static inline int
805 now_it_compatible (int cond)
806 {
807   return (cond & ~1) == (now_it.cc & ~1);
808 }
809
810 static inline int
811 conditional_insn (void)
812 {
813   return inst.cond != COND_ALWAYS;
814 }
815
816 static int in_it_block (void);
817
818 static int handle_it_state (void);
819
820 static void force_automatic_it_block_close (void);
821
822 static void it_fsm_post_encode (void);
823
824 #define set_it_insn_type(type)                  \
825   do                                            \
826     {                                           \
827       inst.it_insn_type = type;                 \
828       if (handle_it_state () == FAIL)           \
829         return;                                 \
830     }                                           \
831   while (0)
832
833 #define set_it_insn_type_nonvoid(type, failret) \
834   do                                            \
835     {                                           \
836       inst.it_insn_type = type;                 \
837       if (handle_it_state () == FAIL)           \
838         return failret;                         \
839     }                                           \
840   while(0)
841
842 #define set_it_insn_type_last()                         \
843   do                                                    \
844     {                                                   \
845       if (inst.cond == COND_ALWAYS)                     \
846         set_it_insn_type (IF_INSIDE_IT_LAST_INSN);      \
847       else                                              \
848         set_it_insn_type (INSIDE_IT_LAST_INSN);         \
849     }                                                   \
850   while (0)
851
852 /* Pure syntax.  */
853
854 /* This array holds the chars that always start a comment.  If the
855    pre-processor is disabled, these aren't very useful.  */
856 const char comment_chars[] = "@";
857
858 /* This array holds the chars that only start a comment at the beginning of
859    a line.  If the line seems to have the form '# 123 filename'
860    .line and .file directives will appear in the pre-processed output.  */
861 /* Note that input_file.c hand checks for '#' at the beginning of the
862    first line of the input file.  This is because the compiler outputs
863    #NO_APP at the beginning of its output.  */
864 /* Also note that comments like this one will always work.  */
865 const char line_comment_chars[] = "#";
866
867 const char line_separator_chars[] = ";";
868
869 /* Chars that can be used to separate mant
870    from exp in floating point numbers.  */
871 const char EXP_CHARS[] = "eE";
872
873 /* Chars that mean this number is a floating point constant.  */
874 /* As in 0f12.456  */
875 /* or    0d1.2345e12  */
876
877 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
878
879 /* Prefix characters that indicate the start of an immediate
880    value.  */
881 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
882
883 /* Separator character handling.  */
884
885 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
886
887 static inline int
888 skip_past_char (char ** str, char c)
889 {
890   /* PR gas/14987: Allow for whitespace before the expected character.  */
891   skip_whitespace (*str);
892
893   if (**str == c)
894     {
895       (*str)++;
896       return SUCCESS;
897     }
898   else
899     return FAIL;
900 }
901
902 #define skip_past_comma(str) skip_past_char (str, ',')
903
904 /* Arithmetic expressions (possibly involving symbols).  */
905
906 /* Return TRUE if anything in the expression is a bignum.  */
907
908 static int
909 walk_no_bignums (symbolS * sp)
910 {
911   if (symbol_get_value_expression (sp)->X_op == O_big)
912     return 1;
913
914   if (symbol_get_value_expression (sp)->X_add_symbol)
915     {
916       return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
917               || (symbol_get_value_expression (sp)->X_op_symbol
918                   && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
919     }
920
921   return 0;
922 }
923
924 static int in_my_get_expression = 0;
925
926 /* Third argument to my_get_expression.  */
927 #define GE_NO_PREFIX 0
928 #define GE_IMM_PREFIX 1
929 #define GE_OPT_PREFIX 2
930 /* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
931    immediates, as can be used in Neon VMVN and VMOV immediate instructions.  */
932 #define GE_OPT_PREFIX_BIG 3
933
934 static int
935 my_get_expression (expressionS * ep, char ** str, int prefix_mode)
936 {
937   char * save_in;
938   segT   seg;
939
940   /* In unified syntax, all prefixes are optional.  */
941   if (unified_syntax)
942     prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
943                   : GE_OPT_PREFIX;
944
945   switch (prefix_mode)
946     {
947     case GE_NO_PREFIX: break;
948     case GE_IMM_PREFIX:
949       if (!is_immediate_prefix (**str))
950         {
951           inst.error = _("immediate expression requires a # prefix");
952           return FAIL;
953         }
954       (*str)++;
955       break;
956     case GE_OPT_PREFIX:
957     case GE_OPT_PREFIX_BIG:
958       if (is_immediate_prefix (**str))
959         (*str)++;
960       break;
961     default: abort ();
962     }
963
964   memset (ep, 0, sizeof (expressionS));
965
966   save_in = input_line_pointer;
967   input_line_pointer = *str;
968   in_my_get_expression = 1;
969   seg = expression (ep);
970   in_my_get_expression = 0;
971
972   if (ep->X_op == O_illegal || ep->X_op == O_absent)
973     {
974       /* We found a bad or missing expression in md_operand().  */
975       *str = input_line_pointer;
976       input_line_pointer = save_in;
977       if (inst.error == NULL)
978         inst.error = (ep->X_op == O_absent
979                       ? _("missing expression") :_("bad expression"));
980       return 1;
981     }
982
983 #ifdef OBJ_AOUT
984   if (seg != absolute_section
985       && seg != text_section
986       && seg != data_section
987       && seg != bss_section
988       && seg != undefined_section)
989     {
990       inst.error = _("bad segment");
991       *str = input_line_pointer;
992       input_line_pointer = save_in;
993       return 1;
994     }
995 #else
996   (void) seg;
997 #endif
998
999   /* Get rid of any bignums now, so that we don't generate an error for which
1000      we can't establish a line number later on.  Big numbers are never valid
1001      in instructions, which is where this routine is always called.  */
1002   if (prefix_mode != GE_OPT_PREFIX_BIG
1003       && (ep->X_op == O_big
1004           || (ep->X_add_symbol
1005               && (walk_no_bignums (ep->X_add_symbol)
1006                   || (ep->X_op_symbol
1007                       && walk_no_bignums (ep->X_op_symbol))))))
1008     {
1009       inst.error = _("invalid constant");
1010       *str = input_line_pointer;
1011       input_line_pointer = save_in;
1012       return 1;
1013     }
1014
1015   *str = input_line_pointer;
1016   input_line_pointer = save_in;
1017   return 0;
1018 }
1019
1020 /* Turn a string in input_line_pointer into a floating point constant
1021    of type TYPE, and store the appropriate bytes in *LITP.  The number
1022    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
1023    returned, or NULL on OK.
1024
1025    Note that fp constants aren't represent in the normal way on the ARM.
1026    In big endian mode, things are as expected.  However, in little endian
1027    mode fp constants are big-endian word-wise, and little-endian byte-wise
1028    within the words.  For example, (double) 1.1 in big endian mode is
1029    the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
1030    the byte sequence 99 99 f1 3f 9a 99 99 99.
1031
1032    ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
1033
1034 char *
1035 md_atof (int type, char * litP, int * sizeP)
1036 {
1037   int prec;
1038   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1039   char *t;
1040   int i;
1041
1042   switch (type)
1043     {
1044     case 'f':
1045     case 'F':
1046     case 's':
1047     case 'S':
1048       prec = 2;
1049       break;
1050
1051     case 'd':
1052     case 'D':
1053     case 'r':
1054     case 'R':
1055       prec = 4;
1056       break;
1057
1058     case 'x':
1059     case 'X':
1060       prec = 5;
1061       break;
1062
1063     case 'p':
1064     case 'P':
1065       prec = 5;
1066       break;
1067
1068     default:
1069       *sizeP = 0;
1070       return _("Unrecognized or unsupported floating point constant");
1071     }
1072
1073   t = atof_ieee (input_line_pointer, type, words);
1074   if (t)
1075     input_line_pointer = t;
1076   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1077
1078   if (target_big_endian)
1079     {
1080       for (i = 0; i < prec; i++)
1081         {
1082           md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1083           litP += sizeof (LITTLENUM_TYPE);
1084         }
1085     }
1086   else
1087     {
1088       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
1089         for (i = prec - 1; i >= 0; i--)
1090           {
1091             md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1092             litP += sizeof (LITTLENUM_TYPE);
1093           }
1094       else
1095         /* For a 4 byte float the order of elements in `words' is 1 0.
1096            For an 8 byte float the order is 1 0 3 2.  */
1097         for (i = 0; i < prec; i += 2)
1098           {
1099             md_number_to_chars (litP, (valueT) words[i + 1],
1100                                 sizeof (LITTLENUM_TYPE));
1101             md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1102                                 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1103             litP += 2 * sizeof (LITTLENUM_TYPE);
1104           }
1105     }
1106
1107   return NULL;
1108 }
1109
1110 /* We handle all bad expressions here, so that we can report the faulty
1111    instruction in the error message.  */
1112 void
1113 md_operand (expressionS * exp)
1114 {
1115   if (in_my_get_expression)
1116     exp->X_op = O_illegal;
1117 }
1118
1119 /* Immediate values.  */
1120
1121 /* Generic immediate-value read function for use in directives.
1122    Accepts anything that 'expression' can fold to a constant.
1123    *val receives the number.  */
1124 #ifdef OBJ_ELF
1125 static int
1126 immediate_for_directive (int *val)
1127 {
1128   expressionS exp;
1129   exp.X_op = O_illegal;
1130
1131   if (is_immediate_prefix (*input_line_pointer))
1132     {
1133       input_line_pointer++;
1134       expression (&exp);
1135     }
1136
1137   if (exp.X_op != O_constant)
1138     {
1139       as_bad (_("expected #constant"));
1140       ignore_rest_of_line ();
1141       return FAIL;
1142     }
1143   *val = exp.X_add_number;
1144   return SUCCESS;
1145 }
1146 #endif
1147
1148 /* Register parsing.  */
1149
1150 /* Generic register parser.  CCP points to what should be the
1151    beginning of a register name.  If it is indeed a valid register
1152    name, advance CCP over it and return the reg_entry structure;
1153    otherwise return NULL.  Does not issue diagnostics.  */
1154
1155 static struct reg_entry *
1156 arm_reg_parse_multi (char **ccp)
1157 {
1158   char *start = *ccp;
1159   char *p;
1160   struct reg_entry *reg;
1161
1162   skip_whitespace (start);
1163
1164 #ifdef REGISTER_PREFIX
1165   if (*start != REGISTER_PREFIX)
1166     return NULL;
1167   start++;
1168 #endif
1169 #ifdef OPTIONAL_REGISTER_PREFIX
1170   if (*start == OPTIONAL_REGISTER_PREFIX)
1171     start++;
1172 #endif
1173
1174   p = start;
1175   if (!ISALPHA (*p) || !is_name_beginner (*p))
1176     return NULL;
1177
1178   do
1179     p++;
1180   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1181
1182   reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1183
1184   if (!reg)
1185     return NULL;
1186
1187   *ccp = p;
1188   return reg;
1189 }
1190
1191 static int
1192 arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1193                     enum arm_reg_type type)
1194 {
1195   /* Alternative syntaxes are accepted for a few register classes.  */
1196   switch (type)
1197     {
1198     case REG_TYPE_MVF:
1199     case REG_TYPE_MVD:
1200     case REG_TYPE_MVFX:
1201     case REG_TYPE_MVDX:
1202       /* Generic coprocessor register names are allowed for these.  */
1203       if (reg && reg->type == REG_TYPE_CN)
1204         return reg->number;
1205       break;
1206
1207     case REG_TYPE_CP:
1208       /* For backward compatibility, a bare number is valid here.  */
1209       {
1210         unsigned long processor = strtoul (start, ccp, 10);
1211         if (*ccp != start && processor <= 15)
1212           return processor;
1213       }
1214
1215     case REG_TYPE_MMXWC:
1216       /* WC includes WCG.  ??? I'm not sure this is true for all
1217          instructions that take WC registers.  */
1218       if (reg && reg->type == REG_TYPE_MMXWCG)
1219         return reg->number;
1220       break;
1221
1222     default:
1223       break;
1224     }
1225
1226   return FAIL;
1227 }
1228
1229 /* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1230    return value is the register number or FAIL.  */
1231
1232 static int
1233 arm_reg_parse (char **ccp, enum arm_reg_type type)
1234 {
1235   char *start = *ccp;
1236   struct reg_entry *reg = arm_reg_parse_multi (ccp);
1237   int ret;
1238
1239   /* Do not allow a scalar (reg+index) to parse as a register.  */
1240   if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1241     return FAIL;
1242
1243   if (reg && reg->type == type)
1244     return reg->number;
1245
1246   if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1247     return ret;
1248
1249   *ccp = start;
1250   return FAIL;
1251 }
1252
1253 /* Parse a Neon type specifier. *STR should point at the leading '.'
1254    character. Does no verification at this stage that the type fits the opcode
1255    properly. E.g.,
1256
1257      .i32.i32.s16
1258      .s32.f32
1259      .u16
1260
1261    Can all be legally parsed by this function.
1262
1263    Fills in neon_type struct pointer with parsed information, and updates STR
1264    to point after the parsed type specifier. Returns SUCCESS if this was a legal
1265    type, FAIL if not.  */
1266
1267 static int
1268 parse_neon_type (struct neon_type *type, char **str)
1269 {
1270   char *ptr = *str;
1271
1272   if (type)
1273     type->elems = 0;
1274
1275   while (type->elems < NEON_MAX_TYPE_ELS)
1276     {
1277       enum neon_el_type thistype = NT_untyped;
1278       unsigned thissize = -1u;
1279
1280       if (*ptr != '.')
1281         break;
1282
1283       ptr++;
1284
1285       /* Just a size without an explicit type.  */
1286       if (ISDIGIT (*ptr))
1287         goto parsesize;
1288
1289       switch (TOLOWER (*ptr))
1290         {
1291         case 'i': thistype = NT_integer; break;
1292         case 'f': thistype = NT_float; break;
1293         case 'p': thistype = NT_poly; break;
1294         case 's': thistype = NT_signed; break;
1295         case 'u': thistype = NT_unsigned; break;
1296         case 'd':
1297           thistype = NT_float;
1298           thissize = 64;
1299           ptr++;
1300           goto done;
1301         default:
1302           as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1303           return FAIL;
1304         }
1305
1306       ptr++;
1307
1308       /* .f is an abbreviation for .f32.  */
1309       if (thistype == NT_float && !ISDIGIT (*ptr))
1310         thissize = 32;
1311       else
1312         {
1313         parsesize:
1314           thissize = strtoul (ptr, &ptr, 10);
1315
1316           if (thissize != 8 && thissize != 16 && thissize != 32
1317               && thissize != 64)
1318             {
1319               as_bad (_("bad size %d in type specifier"), thissize);
1320               return FAIL;
1321             }
1322         }
1323
1324       done:
1325       if (type)
1326         {
1327           type->el[type->elems].type = thistype;
1328           type->el[type->elems].size = thissize;
1329           type->elems++;
1330         }
1331     }
1332
1333   /* Empty/missing type is not a successful parse.  */
1334   if (type->elems == 0)
1335     return FAIL;
1336
1337   *str = ptr;
1338
1339   return SUCCESS;
1340 }
1341
1342 /* Errors may be set multiple times during parsing or bit encoding
1343    (particularly in the Neon bits), but usually the earliest error which is set
1344    will be the most meaningful. Avoid overwriting it with later (cascading)
1345    errors by calling this function.  */
1346
1347 static void
1348 first_error (const char *err)
1349 {
1350   if (!inst.error)
1351     inst.error = err;
1352 }
1353
1354 /* Parse a single type, e.g. ".s32", leading period included.  */
1355 static int
1356 parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1357 {
1358   char *str = *ccp;
1359   struct neon_type optype;
1360
1361   if (*str == '.')
1362     {
1363       if (parse_neon_type (&optype, &str) == SUCCESS)
1364         {
1365           if (optype.elems == 1)
1366             *vectype = optype.el[0];
1367           else
1368             {
1369               first_error (_("only one type should be specified for operand"));
1370               return FAIL;
1371             }
1372         }
1373       else
1374         {
1375           first_error (_("vector type expected"));
1376           return FAIL;
1377         }
1378     }
1379   else
1380     return FAIL;
1381
1382   *ccp = str;
1383
1384   return SUCCESS;
1385 }
1386
1387 /* Special meanings for indices (which have a range of 0-7), which will fit into
1388    a 4-bit integer.  */
1389
1390 #define NEON_ALL_LANES          15
1391 #define NEON_INTERLEAVE_LANES   14
1392
1393 /* Parse either a register or a scalar, with an optional type. Return the
1394    register number, and optionally fill in the actual type of the register
1395    when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1396    type/index information in *TYPEINFO.  */
1397
1398 static int
1399 parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1400                            enum arm_reg_type *rtype,
1401                            struct neon_typed_alias *typeinfo)
1402 {
1403   char *str = *ccp;
1404   struct reg_entry *reg = arm_reg_parse_multi (&str);
1405   struct neon_typed_alias atype;
1406   struct neon_type_el parsetype;
1407
1408   atype.defined = 0;
1409   atype.index = -1;
1410   atype.eltype.type = NT_invtype;
1411   atype.eltype.size = -1;
1412
1413   /* Try alternate syntax for some types of register. Note these are mutually
1414      exclusive with the Neon syntax extensions.  */
1415   if (reg == NULL)
1416     {
1417       int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1418       if (altreg != FAIL)
1419         *ccp = str;
1420       if (typeinfo)
1421         *typeinfo = atype;
1422       return altreg;
1423     }
1424
1425   /* Undo polymorphism when a set of register types may be accepted.  */
1426   if ((type == REG_TYPE_NDQ
1427        && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1428       || (type == REG_TYPE_VFSD
1429           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1430       || (type == REG_TYPE_NSDQ
1431           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1432               || reg->type == REG_TYPE_NQ))
1433       || (type == REG_TYPE_MMXWC
1434           && (reg->type == REG_TYPE_MMXWCG)))
1435     type = (enum arm_reg_type) reg->type;
1436
1437   if (type != reg->type)
1438     return FAIL;
1439
1440   if (reg->neon)
1441     atype = *reg->neon;
1442
1443   if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1444     {
1445       if ((atype.defined & NTA_HASTYPE) != 0)
1446         {
1447           first_error (_("can't redefine type for operand"));
1448           return FAIL;
1449         }
1450       atype.defined |= NTA_HASTYPE;
1451       atype.eltype = parsetype;
1452     }
1453
1454   if (skip_past_char (&str, '[') == SUCCESS)
1455     {
1456       if (type != REG_TYPE_VFD)
1457         {
1458           first_error (_("only D registers may be indexed"));
1459           return FAIL;
1460         }
1461
1462       if ((atype.defined & NTA_HASINDEX) != 0)
1463         {
1464           first_error (_("can't change index for operand"));
1465           return FAIL;
1466         }
1467
1468       atype.defined |= NTA_HASINDEX;
1469
1470       if (skip_past_char (&str, ']') == SUCCESS)
1471         atype.index = NEON_ALL_LANES;
1472       else
1473         {
1474           expressionS exp;
1475
1476           my_get_expression (&exp, &str, GE_NO_PREFIX);
1477
1478           if (exp.X_op != O_constant)
1479             {
1480               first_error (_("constant expression required"));
1481               return FAIL;
1482             }
1483
1484           if (skip_past_char (&str, ']') == FAIL)
1485             return FAIL;
1486
1487           atype.index = exp.X_add_number;
1488         }
1489     }
1490
1491   if (typeinfo)
1492     *typeinfo = atype;
1493
1494   if (rtype)
1495     *rtype = type;
1496
1497   *ccp = str;
1498
1499   return reg->number;
1500 }
1501
1502 /* Like arm_reg_parse, but allow allow the following extra features:
1503     - If RTYPE is non-zero, return the (possibly restricted) type of the
1504       register (e.g. Neon double or quad reg when either has been requested).
1505     - If this is a Neon vector type with additional type information, fill
1506       in the struct pointed to by VECTYPE (if non-NULL).
1507    This function will fault on encountering a scalar.  */
1508
1509 static int
1510 arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1511                      enum arm_reg_type *rtype, struct neon_type_el *vectype)
1512 {
1513   struct neon_typed_alias atype;
1514   char *str = *ccp;
1515   int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1516
1517   if (reg == FAIL)
1518     return FAIL;
1519
1520   /* Do not allow regname(... to parse as a register.  */
1521   if (*str == '(')
1522     return FAIL;
1523
1524   /* Do not allow a scalar (reg+index) to parse as a register.  */
1525   if ((atype.defined & NTA_HASINDEX) != 0)
1526     {
1527       first_error (_("register operand expected, but got scalar"));
1528       return FAIL;
1529     }
1530
1531   if (vectype)
1532     *vectype = atype.eltype;
1533
1534   *ccp = str;
1535
1536   return reg;
1537 }
1538
1539 #define NEON_SCALAR_REG(X)      ((X) >> 4)
1540 #define NEON_SCALAR_INDEX(X)    ((X) & 15)
1541
1542 /* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1543    have enough information to be able to do a good job bounds-checking. So, we
1544    just do easy checks here, and do further checks later.  */
1545
1546 static int
1547 parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
1548 {
1549   int reg;
1550   char *str = *ccp;
1551   struct neon_typed_alias atype;
1552
1553   reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
1554
1555   if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
1556     return FAIL;
1557
1558   if (atype.index == NEON_ALL_LANES)
1559     {
1560       first_error (_("scalar must have an index"));
1561       return FAIL;
1562     }
1563   else if (atype.index >= 64 / elsize)
1564     {
1565       first_error (_("scalar index out of range"));
1566       return FAIL;
1567     }
1568
1569   if (type)
1570     *type = atype.eltype;
1571
1572   *ccp = str;
1573
1574   return reg * 16 + atype.index;
1575 }
1576
1577 /* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
1578
1579 static long
1580 parse_reg_list (char ** strp)
1581 {
1582   char * str = * strp;
1583   long   range = 0;
1584   int    another_range;
1585
1586   /* We come back here if we get ranges concatenated by '+' or '|'.  */
1587   do
1588     {
1589       skip_whitespace (str);
1590
1591       another_range = 0;
1592
1593       if (*str == '{')
1594         {
1595           int in_range = 0;
1596           int cur_reg = -1;
1597
1598           str++;
1599           do
1600             {
1601               int reg;
1602
1603               if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
1604                 {
1605                   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
1606                   return FAIL;
1607                 }
1608
1609               if (in_range)
1610                 {
1611                   int i;
1612
1613                   if (reg <= cur_reg)
1614                     {
1615                       first_error (_("bad range in register list"));
1616                       return FAIL;
1617                     }
1618
1619                   for (i = cur_reg + 1; i < reg; i++)
1620                     {
1621                       if (range & (1 << i))
1622                         as_tsktsk
1623                           (_("Warning: duplicated register (r%d) in register list"),
1624                            i);
1625                       else
1626                         range |= 1 << i;
1627                     }
1628                   in_range = 0;
1629                 }
1630
1631               if (range & (1 << reg))
1632                 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1633                            reg);
1634               else if (reg <= cur_reg)
1635                 as_tsktsk (_("Warning: register range not in ascending order"));
1636
1637               range |= 1 << reg;
1638               cur_reg = reg;
1639             }
1640           while (skip_past_comma (&str) != FAIL
1641                  || (in_range = 1, *str++ == '-'));
1642           str--;
1643
1644           if (skip_past_char (&str, '}') == FAIL)
1645             {
1646               first_error (_("missing `}'"));
1647               return FAIL;
1648             }
1649         }
1650       else
1651         {
1652           expressionS exp;
1653
1654           if (my_get_expression (&exp, &str, GE_NO_PREFIX))
1655             return FAIL;
1656
1657           if (exp.X_op == O_constant)
1658             {
1659               if (exp.X_add_number
1660                   != (exp.X_add_number & 0x0000ffff))
1661                 {
1662                   inst.error = _("invalid register mask");
1663                   return FAIL;
1664                 }
1665
1666               if ((range & exp.X_add_number) != 0)
1667                 {
1668                   int regno = range & exp.X_add_number;
1669
1670                   regno &= -regno;
1671                   regno = (1 << regno) - 1;
1672                   as_tsktsk
1673                     (_("Warning: duplicated register (r%d) in register list"),
1674                      regno);
1675                 }
1676
1677               range |= exp.X_add_number;
1678             }
1679           else
1680             {
1681               if (inst.reloc.type != 0)
1682                 {
1683                   inst.error = _("expression too complex");
1684                   return FAIL;
1685                 }
1686
1687               memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
1688               inst.reloc.type = BFD_RELOC_ARM_MULTI;
1689               inst.reloc.pc_rel = 0;
1690             }
1691         }
1692
1693       if (*str == '|' || *str == '+')
1694         {
1695           str++;
1696           another_range = 1;
1697         }
1698     }
1699   while (another_range);
1700
1701   *strp = str;
1702   return range;
1703 }
1704
1705 /* Types of registers in a list.  */
1706
1707 enum reg_list_els
1708 {
1709   REGLIST_VFP_S,
1710   REGLIST_VFP_D,
1711   REGLIST_NEON_D
1712 };
1713
1714 /* Parse a VFP register list.  If the string is invalid return FAIL.
1715    Otherwise return the number of registers, and set PBASE to the first
1716    register.  Parses registers of type ETYPE.
1717    If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1718      - Q registers can be used to specify pairs of D registers
1719      - { } can be omitted from around a singleton register list
1720          FIXME: This is not implemented, as it would require backtracking in
1721          some cases, e.g.:
1722            vtbl.8 d3,d4,d5
1723          This could be done (the meaning isn't really ambiguous), but doesn't
1724          fit in well with the current parsing framework.
1725      - 32 D registers may be used (also true for VFPv3).
1726    FIXME: Types are ignored in these register lists, which is probably a
1727    bug.  */
1728
1729 static int
1730 parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
1731 {
1732   char *str = *ccp;
1733   int base_reg;
1734   int new_base;
1735   enum arm_reg_type regtype = (enum arm_reg_type) 0;
1736   int max_regs = 0;
1737   int count = 0;
1738   int warned = 0;
1739   unsigned long mask = 0;
1740   int i;
1741
1742   if (skip_past_char (&str, '{') == FAIL)
1743     {
1744       inst.error = _("expecting {");
1745       return FAIL;
1746     }
1747
1748   switch (etype)
1749     {
1750     case REGLIST_VFP_S:
1751       regtype = REG_TYPE_VFS;
1752       max_regs = 32;
1753       break;
1754
1755     case REGLIST_VFP_D:
1756       regtype = REG_TYPE_VFD;
1757       break;
1758
1759     case REGLIST_NEON_D:
1760       regtype = REG_TYPE_NDQ;
1761       break;
1762     }
1763
1764   if (etype != REGLIST_VFP_S)
1765     {
1766       /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant.  */
1767       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
1768         {
1769           max_regs = 32;
1770           if (thumb_mode)
1771             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1772                                     fpu_vfp_ext_d32);
1773           else
1774             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1775                                     fpu_vfp_ext_d32);
1776         }
1777       else
1778         max_regs = 16;
1779     }
1780
1781   base_reg = max_regs;
1782
1783   do
1784     {
1785       int setmask = 1, addregs = 1;
1786
1787       new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
1788
1789       if (new_base == FAIL)
1790         {
1791           first_error (_(reg_expected_msgs[regtype]));
1792           return FAIL;
1793         }
1794
1795       if (new_base >= max_regs)
1796         {
1797           first_error (_("register out of range in list"));
1798           return FAIL;
1799         }
1800
1801       /* Note: a value of 2 * n is returned for the register Q<n>.  */
1802       if (regtype == REG_TYPE_NQ)
1803         {
1804           setmask = 3;
1805           addregs = 2;
1806         }
1807
1808       if (new_base < base_reg)
1809         base_reg = new_base;
1810
1811       if (mask & (setmask << new_base))
1812         {
1813           first_error (_("invalid register list"));
1814           return FAIL;
1815         }
1816
1817       if ((mask >> new_base) != 0 && ! warned)
1818         {
1819           as_tsktsk (_("register list not in ascending order"));
1820           warned = 1;
1821         }
1822
1823       mask |= setmask << new_base;
1824       count += addregs;
1825
1826       if (*str == '-') /* We have the start of a range expression */
1827         {
1828           int high_range;
1829
1830           str++;
1831
1832           if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
1833               == FAIL)
1834             {
1835               inst.error = gettext (reg_expected_msgs[regtype]);
1836               return FAIL;
1837             }
1838
1839           if (high_range >= max_regs)
1840             {
1841               first_error (_("register out of range in list"));
1842               return FAIL;
1843             }
1844
1845           if (regtype == REG_TYPE_NQ)
1846             high_range = high_range + 1;
1847
1848           if (high_range <= new_base)
1849             {
1850               inst.error = _("register range not in ascending order");
1851               return FAIL;
1852             }
1853
1854           for (new_base += addregs; new_base <= high_range; new_base += addregs)
1855             {
1856               if (mask & (setmask << new_base))
1857                 {
1858                   inst.error = _("invalid register list");
1859                   return FAIL;
1860                 }
1861
1862               mask |= setmask << new_base;
1863               count += addregs;
1864             }
1865         }
1866     }
1867   while (skip_past_comma (&str) != FAIL);
1868
1869   str++;
1870
1871   /* Sanity check -- should have raised a parse error above.  */
1872   if (count == 0 || count > max_regs)
1873     abort ();
1874
1875   *pbase = base_reg;
1876
1877   /* Final test -- the registers must be consecutive.  */
1878   mask >>= base_reg;
1879   for (i = 0; i < count; i++)
1880     {
1881       if ((mask & (1u << i)) == 0)
1882         {
1883           inst.error = _("non-contiguous register range");
1884           return FAIL;
1885         }
1886     }
1887
1888   *ccp = str;
1889
1890   return count;
1891 }
1892
1893 /* True if two alias types are the same.  */
1894
1895 static bfd_boolean
1896 neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1897 {
1898   if (!a && !b)
1899     return TRUE;
1900
1901   if (!a || !b)
1902     return FALSE;
1903
1904   if (a->defined != b->defined)
1905     return FALSE;
1906
1907   if ((a->defined & NTA_HASTYPE) != 0
1908       && (a->eltype.type != b->eltype.type
1909           || a->eltype.size != b->eltype.size))
1910     return FALSE;
1911
1912   if ((a->defined & NTA_HASINDEX) != 0
1913       && (a->index != b->index))
1914     return FALSE;
1915
1916   return TRUE;
1917 }
1918
1919 /* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1920    The base register is put in *PBASE.
1921    The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
1922    the return value.
1923    The register stride (minus one) is put in bit 4 of the return value.
1924    Bits [6:5] encode the list length (minus one).
1925    The type of the list elements is put in *ELTYPE, if non-NULL.  */
1926
1927 #define NEON_LANE(X)            ((X) & 0xf)
1928 #define NEON_REG_STRIDE(X)      ((((X) >> 4) & 1) + 1)
1929 #define NEON_REGLIST_LENGTH(X)  ((((X) >> 5) & 3) + 1)
1930
1931 static int
1932 parse_neon_el_struct_list (char **str, unsigned *pbase,
1933                            struct neon_type_el *eltype)
1934 {
1935   char *ptr = *str;
1936   int base_reg = -1;
1937   int reg_incr = -1;
1938   int count = 0;
1939   int lane = -1;
1940   int leading_brace = 0;
1941   enum arm_reg_type rtype = REG_TYPE_NDQ;
1942   const char *const incr_error = _("register stride must be 1 or 2");
1943   const char *const type_error = _("mismatched element/structure types in list");
1944   struct neon_typed_alias firsttype;
1945
1946   if (skip_past_char (&ptr, '{') == SUCCESS)
1947     leading_brace = 1;
1948
1949   do
1950     {
1951       struct neon_typed_alias atype;
1952       int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1953
1954       if (getreg == FAIL)
1955         {
1956           first_error (_(reg_expected_msgs[rtype]));
1957           return FAIL;
1958         }
1959
1960       if (base_reg == -1)
1961         {
1962           base_reg = getreg;
1963           if (rtype == REG_TYPE_NQ)
1964             {
1965               reg_incr = 1;
1966             }
1967           firsttype = atype;
1968         }
1969       else if (reg_incr == -1)
1970         {
1971           reg_incr = getreg - base_reg;
1972           if (reg_incr < 1 || reg_incr > 2)
1973             {
1974               first_error (_(incr_error));
1975               return FAIL;
1976             }
1977         }
1978       else if (getreg != base_reg + reg_incr * count)
1979         {
1980           first_error (_(incr_error));
1981           return FAIL;
1982         }
1983
1984       if (! neon_alias_types_same (&atype, &firsttype))
1985         {
1986           first_error (_(type_error));
1987           return FAIL;
1988         }
1989
1990       /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
1991          modes.  */
1992       if (ptr[0] == '-')
1993         {
1994           struct neon_typed_alias htype;
1995           int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1996           if (lane == -1)
1997             lane = NEON_INTERLEAVE_LANES;
1998           else if (lane != NEON_INTERLEAVE_LANES)
1999             {
2000               first_error (_(type_error));
2001               return FAIL;
2002             }
2003           if (reg_incr == -1)
2004             reg_incr = 1;
2005           else if (reg_incr != 1)
2006             {
2007               first_error (_("don't use Rn-Rm syntax with non-unit stride"));
2008               return FAIL;
2009             }
2010           ptr++;
2011           hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
2012           if (hireg == FAIL)
2013             {
2014               first_error (_(reg_expected_msgs[rtype]));
2015               return FAIL;
2016             }
2017           if (! neon_alias_types_same (&htype, &firsttype))
2018             {
2019               first_error (_(type_error));
2020               return FAIL;
2021             }
2022           count += hireg + dregs - getreg;
2023           continue;
2024         }
2025
2026       /* If we're using Q registers, we can't use [] or [n] syntax.  */
2027       if (rtype == REG_TYPE_NQ)
2028         {
2029           count += 2;
2030           continue;
2031         }
2032
2033       if ((atype.defined & NTA_HASINDEX) != 0)
2034         {
2035           if (lane == -1)
2036             lane = atype.index;
2037           else if (lane != atype.index)
2038             {
2039               first_error (_(type_error));
2040               return FAIL;
2041             }
2042         }
2043       else if (lane == -1)
2044         lane = NEON_INTERLEAVE_LANES;
2045       else if (lane != NEON_INTERLEAVE_LANES)
2046         {
2047           first_error (_(type_error));
2048           return FAIL;
2049         }
2050       count++;
2051     }
2052   while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
2053
2054   /* No lane set by [x]. We must be interleaving structures.  */
2055   if (lane == -1)
2056     lane = NEON_INTERLEAVE_LANES;
2057
2058   /* Sanity check.  */
2059   if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2060       || (count > 1 && reg_incr == -1))
2061     {
2062       first_error (_("error parsing element/structure list"));
2063       return FAIL;
2064     }
2065
2066   if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2067     {
2068       first_error (_("expected }"));
2069       return FAIL;
2070     }
2071
2072   if (reg_incr == -1)
2073     reg_incr = 1;
2074
2075   if (eltype)
2076     *eltype = firsttype.eltype;
2077
2078   *pbase = base_reg;
2079   *str = ptr;
2080
2081   return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2082 }
2083
2084 /* Parse an explicit relocation suffix on an expression.  This is
2085    either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
2086    arm_reloc_hsh contains no entries, so this function can only
2087    succeed if there is no () after the word.  Returns -1 on error,
2088    BFD_RELOC_UNUSED if there wasn't any suffix.  */
2089
2090 static int
2091 parse_reloc (char **str)
2092 {
2093   struct reloc_entry *r;
2094   char *p, *q;
2095
2096   if (**str != '(')
2097     return BFD_RELOC_UNUSED;
2098
2099   p = *str + 1;
2100   q = p;
2101
2102   while (*q && *q != ')' && *q != ',')
2103     q++;
2104   if (*q != ')')
2105     return -1;
2106
2107   if ((r = (struct reloc_entry *)
2108        hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
2109     return -1;
2110
2111   *str = q + 1;
2112   return r->reloc;
2113 }
2114
2115 /* Directives: register aliases.  */
2116
2117 static struct reg_entry *
2118 insert_reg_alias (char *str, unsigned number, int type)
2119 {
2120   struct reg_entry *new_reg;
2121   const char *name;
2122
2123   if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
2124     {
2125       if (new_reg->builtin)
2126         as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
2127
2128       /* Only warn about a redefinition if it's not defined as the
2129          same register.  */
2130       else if (new_reg->number != number || new_reg->type != type)
2131         as_warn (_("ignoring redefinition of register alias '%s'"), str);
2132
2133       return NULL;
2134     }
2135
2136   name = xstrdup (str);
2137   new_reg = (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
2138
2139   new_reg->name = name;
2140   new_reg->number = number;
2141   new_reg->type = type;
2142   new_reg->builtin = FALSE;
2143   new_reg->neon = NULL;
2144
2145   if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
2146     abort ();
2147
2148   return new_reg;
2149 }
2150
2151 static void
2152 insert_neon_reg_alias (char *str, int number, int type,
2153                        struct neon_typed_alias *atype)
2154 {
2155   struct reg_entry *reg = insert_reg_alias (str, number, type);
2156
2157   if (!reg)
2158     {
2159       first_error (_("attempt to redefine typed alias"));
2160       return;
2161     }
2162
2163   if (atype)
2164     {
2165       reg->neon = (struct neon_typed_alias *)
2166           xmalloc (sizeof (struct neon_typed_alias));
2167       *reg->neon = *atype;
2168     }
2169 }
2170
2171 /* Look for the .req directive.  This is of the form:
2172
2173         new_register_name .req existing_register_name
2174
2175    If we find one, or if it looks sufficiently like one that we want to
2176    handle any error here, return TRUE.  Otherwise return FALSE.  */
2177
2178 static bfd_boolean
2179 create_register_alias (char * newname, char *p)
2180 {
2181   struct reg_entry *old;
2182   char *oldname, *nbuf;
2183   size_t nlen;
2184
2185   /* The input scrubber ensures that whitespace after the mnemonic is
2186      collapsed to single spaces.  */
2187   oldname = p;
2188   if (strncmp (oldname, " .req ", 6) != 0)
2189     return FALSE;
2190
2191   oldname += 6;
2192   if (*oldname == '\0')
2193     return FALSE;
2194
2195   old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
2196   if (!old)
2197     {
2198       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2199       return TRUE;
2200     }
2201
2202   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2203      the desired alias name, and p points to its end.  If not, then
2204      the desired alias name is in the global original_case_string.  */
2205 #ifdef TC_CASE_SENSITIVE
2206   nlen = p - newname;
2207 #else
2208   newname = original_case_string;
2209   nlen = strlen (newname);
2210 #endif
2211
2212   nbuf = (char *) alloca (nlen + 1);
2213   memcpy (nbuf, newname, nlen);
2214   nbuf[nlen] = '\0';
2215
2216   /* Create aliases under the new name as stated; an all-lowercase
2217      version of the new name; and an all-uppercase version of the new
2218      name.  */
2219   if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2220     {
2221       for (p = nbuf; *p; p++)
2222         *p = TOUPPER (*p);
2223
2224       if (strncmp (nbuf, newname, nlen))
2225         {
2226           /* If this attempt to create an additional alias fails, do not bother
2227              trying to create the all-lower case alias.  We will fail and issue
2228              a second, duplicate error message.  This situation arises when the
2229              programmer does something like:
2230                foo .req r0
2231                Foo .req r1
2232              The second .req creates the "Foo" alias but then fails to create
2233              the artificial FOO alias because it has already been created by the
2234              first .req.  */
2235           if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2236             return TRUE;
2237         }
2238
2239       for (p = nbuf; *p; p++)
2240         *p = TOLOWER (*p);
2241
2242       if (strncmp (nbuf, newname, nlen))
2243         insert_reg_alias (nbuf, old->number, old->type);
2244     }
2245
2246   return TRUE;
2247 }
2248
2249 /* Create a Neon typed/indexed register alias using directives, e.g.:
2250      X .dn d5.s32[1]
2251      Y .qn 6.s16
2252      Z .dn d7
2253      T .dn Z[0]
2254    These typed registers can be used instead of the types specified after the
2255    Neon mnemonic, so long as all operands given have types. Types can also be
2256    specified directly, e.g.:
2257      vadd d0.s32, d1.s32, d2.s32  */
2258
2259 static bfd_boolean
2260 create_neon_reg_alias (char *newname, char *p)
2261 {
2262   enum arm_reg_type basetype;
2263   struct reg_entry *basereg;
2264   struct reg_entry mybasereg;
2265   struct neon_type ntype;
2266   struct neon_typed_alias typeinfo;
2267   char *namebuf, *nameend ATTRIBUTE_UNUSED;
2268   int namelen;
2269
2270   typeinfo.defined = 0;
2271   typeinfo.eltype.type = NT_invtype;
2272   typeinfo.eltype.size = -1;
2273   typeinfo.index = -1;
2274
2275   nameend = p;
2276
2277   if (strncmp (p, " .dn ", 5) == 0)
2278     basetype = REG_TYPE_VFD;
2279   else if (strncmp (p, " .qn ", 5) == 0)
2280     basetype = REG_TYPE_NQ;
2281   else
2282     return FALSE;
2283
2284   p += 5;
2285
2286   if (*p == '\0')
2287     return FALSE;
2288
2289   basereg = arm_reg_parse_multi (&p);
2290
2291   if (basereg && basereg->type != basetype)
2292     {
2293       as_bad (_("bad type for register"));
2294       return FALSE;
2295     }
2296
2297   if (basereg == NULL)
2298     {
2299       expressionS exp;
2300       /* Try parsing as an integer.  */
2301       my_get_expression (&exp, &p, GE_NO_PREFIX);
2302       if (exp.X_op != O_constant)
2303         {
2304           as_bad (_("expression must be constant"));
2305           return FALSE;
2306         }
2307       basereg = &mybasereg;
2308       basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2309                                                   : exp.X_add_number;
2310       basereg->neon = 0;
2311     }
2312
2313   if (basereg->neon)
2314     typeinfo = *basereg->neon;
2315
2316   if (parse_neon_type (&ntype, &p) == SUCCESS)
2317     {
2318       /* We got a type.  */
2319       if (typeinfo.defined & NTA_HASTYPE)
2320         {
2321           as_bad (_("can't redefine the type of a register alias"));
2322           return FALSE;
2323         }
2324
2325       typeinfo.defined |= NTA_HASTYPE;
2326       if (ntype.elems != 1)
2327         {
2328           as_bad (_("you must specify a single type only"));
2329           return FALSE;
2330         }
2331       typeinfo.eltype = ntype.el[0];
2332     }
2333
2334   if (skip_past_char (&p, '[') == SUCCESS)
2335     {
2336       expressionS exp;
2337       /* We got a scalar index.  */
2338
2339       if (typeinfo.defined & NTA_HASINDEX)
2340         {
2341           as_bad (_("can't redefine the index of a scalar alias"));
2342           return FALSE;
2343         }
2344
2345       my_get_expression (&exp, &p, GE_NO_PREFIX);
2346
2347       if (exp.X_op != O_constant)
2348         {
2349           as_bad (_("scalar index must be constant"));
2350           return FALSE;
2351         }
2352
2353       typeinfo.defined |= NTA_HASINDEX;
2354       typeinfo.index = exp.X_add_number;
2355
2356       if (skip_past_char (&p, ']') == FAIL)
2357         {
2358           as_bad (_("expecting ]"));
2359           return FALSE;
2360         }
2361     }
2362
2363   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2364      the desired alias name, and p points to its end.  If not, then
2365      the desired alias name is in the global original_case_string.  */
2366 #ifdef TC_CASE_SENSITIVE
2367   namelen = nameend - newname;
2368 #else
2369   newname = original_case_string;
2370   namelen = strlen (newname);
2371 #endif
2372
2373   namebuf = (char *) alloca (namelen + 1);
2374   strncpy (namebuf, newname, namelen);
2375   namebuf[namelen] = '\0';
2376
2377   insert_neon_reg_alias (namebuf, basereg->number, basetype,
2378                          typeinfo.defined != 0 ? &typeinfo : NULL);
2379
2380   /* Insert name in all uppercase.  */
2381   for (p = namebuf; *p; p++)
2382     *p = TOUPPER (*p);
2383
2384   if (strncmp (namebuf, newname, namelen))
2385     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2386                            typeinfo.defined != 0 ? &typeinfo : NULL);
2387
2388   /* Insert name in all lowercase.  */
2389   for (p = namebuf; *p; p++)
2390     *p = TOLOWER (*p);
2391
2392   if (strncmp (namebuf, newname, namelen))
2393     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2394                            typeinfo.defined != 0 ? &typeinfo : NULL);
2395
2396   return TRUE;
2397 }
2398
2399 /* Should never be called, as .req goes between the alias and the
2400    register name, not at the beginning of the line.  */
2401
2402 static void
2403 s_req (int a ATTRIBUTE_UNUSED)
2404 {
2405   as_bad (_("invalid syntax for .req directive"));
2406 }
2407
2408 static void
2409 s_dn (int a ATTRIBUTE_UNUSED)
2410 {
2411   as_bad (_("invalid syntax for .dn directive"));
2412 }
2413
2414 static void
2415 s_qn (int a ATTRIBUTE_UNUSED)
2416 {
2417   as_bad (_("invalid syntax for .qn directive"));
2418 }
2419
2420 /* The .unreq directive deletes an alias which was previously defined
2421    by .req.  For example:
2422
2423        my_alias .req r11
2424        .unreq my_alias    */
2425
2426 static void
2427 s_unreq (int a ATTRIBUTE_UNUSED)
2428 {
2429   char * name;
2430   char saved_char;
2431
2432   name = input_line_pointer;
2433
2434   while (*input_line_pointer != 0
2435          && *input_line_pointer != ' '
2436          && *input_line_pointer != '\n')
2437     ++input_line_pointer;
2438
2439   saved_char = *input_line_pointer;
2440   *input_line_pointer = 0;
2441
2442   if (!*name)
2443     as_bad (_("invalid syntax for .unreq directive"));
2444   else
2445     {
2446       struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2447                                                               name);
2448
2449       if (!reg)
2450         as_bad (_("unknown register alias '%s'"), name);
2451       else if (reg->builtin)
2452         as_warn (_("ignoring attempt to use .unreq on fixed register name: '%s'"),
2453                  name);
2454       else
2455         {
2456           char * p;
2457           char * nbuf;
2458
2459           hash_delete (arm_reg_hsh, name, FALSE);
2460           free ((char *) reg->name);
2461           if (reg->neon)
2462             free (reg->neon);
2463           free (reg);
2464
2465           /* Also locate the all upper case and all lower case versions.
2466              Do not complain if we cannot find one or the other as it
2467              was probably deleted above.  */
2468
2469           nbuf = strdup (name);
2470           for (p = nbuf; *p; p++)
2471             *p = TOUPPER (*p);
2472           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2473           if (reg)
2474             {
2475               hash_delete (arm_reg_hsh, nbuf, FALSE);
2476               free ((char *) reg->name);
2477               if (reg->neon)
2478                 free (reg->neon);
2479               free (reg);
2480             }
2481
2482           for (p = nbuf; *p; p++)
2483             *p = TOLOWER (*p);
2484           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2485           if (reg)
2486             {
2487               hash_delete (arm_reg_hsh, nbuf, FALSE);
2488               free ((char *) reg->name);
2489               if (reg->neon)
2490                 free (reg->neon);
2491               free (reg);
2492             }
2493
2494           free (nbuf);
2495         }
2496     }
2497
2498   *input_line_pointer = saved_char;
2499   demand_empty_rest_of_line ();
2500 }
2501
2502 /* Directives: Instruction set selection.  */
2503
2504 #ifdef OBJ_ELF
2505 /* This code is to handle mapping symbols as defined in the ARM ELF spec.
2506    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2507    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2508    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
2509
2510 /* Create a new mapping symbol for the transition to STATE.  */
2511
2512 static void
2513 make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
2514 {
2515   symbolS * symbolP;
2516   const char * symname;
2517   int type;
2518
2519   switch (state)
2520     {
2521     case MAP_DATA:
2522       symname = "$d";
2523       type = BSF_NO_FLAGS;
2524       break;
2525     case MAP_ARM:
2526       symname = "$a";
2527       type = BSF_NO_FLAGS;
2528       break;
2529     case MAP_THUMB:
2530       symname = "$t";
2531       type = BSF_NO_FLAGS;
2532       break;
2533     default:
2534       abort ();
2535     }
2536
2537   symbolP = symbol_new (symname, now_seg, value, frag);
2538   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2539
2540   switch (state)
2541     {
2542     case MAP_ARM:
2543       THUMB_SET_FUNC (symbolP, 0);
2544       ARM_SET_THUMB (symbolP, 0);
2545       ARM_SET_INTERWORK (symbolP, support_interwork);
2546       break;
2547
2548     case MAP_THUMB:
2549       THUMB_SET_FUNC (symbolP, 1);
2550       ARM_SET_THUMB (symbolP, 1);
2551       ARM_SET_INTERWORK (symbolP, support_interwork);
2552       break;
2553
2554     case MAP_DATA:
2555     default:
2556       break;
2557     }
2558
2559   /* Save the mapping symbols for future reference.  Also check that
2560      we do not place two mapping symbols at the same offset within a
2561      frag.  We'll handle overlap between frags in
2562      check_mapping_symbols.
2563
2564      If .fill or other data filling directive generates zero sized data,
2565      the mapping symbol for the following code will have the same value
2566      as the one generated for the data filling directive.  In this case,
2567      we replace the old symbol with the new one at the same address.  */
2568   if (value == 0)
2569     {
2570       if (frag->tc_frag_data.first_map != NULL)
2571         {
2572           know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2573           symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2574         }
2575       frag->tc_frag_data.first_map = symbolP;
2576     }
2577   if (frag->tc_frag_data.last_map != NULL)
2578     {
2579       know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
2580       if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2581         symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2582     }
2583   frag->tc_frag_data.last_map = symbolP;
2584 }
2585
2586 /* We must sometimes convert a region marked as code to data during
2587    code alignment, if an odd number of bytes have to be padded.  The
2588    code mapping symbol is pushed to an aligned address.  */
2589
2590 static void
2591 insert_data_mapping_symbol (enum mstate state,
2592                             valueT value, fragS *frag, offsetT bytes)
2593 {
2594   /* If there was already a mapping symbol, remove it.  */
2595   if (frag->tc_frag_data.last_map != NULL
2596       && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2597     {
2598       symbolS *symp = frag->tc_frag_data.last_map;
2599
2600       if (value == 0)
2601         {
2602           know (frag->tc_frag_data.first_map == symp);
2603           frag->tc_frag_data.first_map = NULL;
2604         }
2605       frag->tc_frag_data.last_map = NULL;
2606       symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2607     }
2608
2609   make_mapping_symbol (MAP_DATA, value, frag);
2610   make_mapping_symbol (state, value + bytes, frag);
2611 }
2612
2613 static void mapping_state_2 (enum mstate state, int max_chars);
2614
2615 /* Set the mapping state to STATE.  Only call this when about to
2616    emit some STATE bytes to the file.  */
2617
2618 void
2619 mapping_state (enum mstate state)
2620 {
2621   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2622
2623 #define TRANSITION(from, to) (mapstate == (from) && state == (to))
2624
2625   if (mapstate == state)
2626     /* The mapping symbol has already been emitted.
2627        There is nothing else to do.  */
2628     return;
2629
2630   if (state == MAP_ARM || state == MAP_THUMB)
2631     /*  PR gas/12931
2632         All ARM instructions require 4-byte alignment.
2633         (Almost) all Thumb instructions require 2-byte alignment.
2634
2635         When emitting instructions into any section, mark the section
2636         appropriately.
2637
2638         Some Thumb instructions are alignment-sensitive modulo 4 bytes,
2639         but themselves require 2-byte alignment; this applies to some
2640         PC- relative forms.  However, these cases will invovle implicit
2641         literal pool generation or an explicit .align >=2, both of
2642         which will cause the section to me marked with sufficient
2643         alignment.  Thus, we don't handle those cases here.  */
2644     record_alignment (now_seg, state == MAP_ARM ? 2 : 1);
2645
2646   if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
2647     /* This case will be evaluated later in the next else.  */
2648     return;
2649   else if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2650           || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2651     {
2652       /* Only add the symbol if the offset is > 0:
2653          if we're at the first frag, check it's size > 0;
2654          if we're not at the first frag, then for sure
2655             the offset is > 0.  */
2656       struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2657       const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2658
2659       if (add_symbol)
2660         make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2661     }
2662
2663   mapping_state_2 (state, 0);
2664 #undef TRANSITION
2665 }
2666
2667 /* Same as mapping_state, but MAX_CHARS bytes have already been
2668    allocated.  Put the mapping symbol that far back.  */
2669
2670 static void
2671 mapping_state_2 (enum mstate state, int max_chars)
2672 {
2673   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2674
2675   if (!SEG_NORMAL (now_seg))
2676     return;
2677
2678   if (mapstate == state)
2679     /* The mapping symbol has already been emitted.
2680        There is nothing else to do.  */
2681     return;
2682
2683   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2684   make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
2685 }
2686 #else
2687 #define mapping_state(x) ((void)0)
2688 #define mapping_state_2(x, y) ((void)0)
2689 #endif
2690
2691 /* Find the real, Thumb encoded start of a Thumb function.  */
2692
2693 #ifdef OBJ_COFF
2694 static symbolS *
2695 find_real_start (symbolS * symbolP)
2696 {
2697   char *       real_start;
2698   const char * name = S_GET_NAME (symbolP);
2699   symbolS *    new_target;
2700
2701   /* This definition must agree with the one in gcc/config/arm/thumb.c.  */
2702 #define STUB_NAME ".real_start_of"
2703
2704   if (name == NULL)
2705     abort ();
2706
2707   /* The compiler may generate BL instructions to local labels because
2708      it needs to perform a branch to a far away location. These labels
2709      do not have a corresponding ".real_start_of" label.  We check
2710      both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2711      the ".real_start_of" convention for nonlocal branches.  */
2712   if (S_IS_LOCAL (symbolP) || name[0] == '.')
2713     return symbolP;
2714
2715   real_start = ACONCAT ((STUB_NAME, name, NULL));
2716   new_target = symbol_find (real_start);
2717
2718   if (new_target == NULL)
2719     {
2720       as_warn (_("Failed to find real start of function: %s\n"), name);
2721       new_target = symbolP;
2722     }
2723
2724   return new_target;
2725 }
2726 #endif
2727
2728 static void
2729 opcode_select (int width)
2730 {
2731   switch (width)
2732     {
2733     case 16:
2734       if (! thumb_mode)
2735         {
2736           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
2737             as_bad (_("selected processor does not support THUMB opcodes"));
2738
2739           thumb_mode = 1;
2740           /* No need to force the alignment, since we will have been
2741              coming from ARM mode, which is word-aligned.  */
2742           record_alignment (now_seg, 1);
2743         }
2744       break;
2745
2746     case 32:
2747       if (thumb_mode)
2748         {
2749           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
2750             as_bad (_("selected processor does not support ARM opcodes"));
2751
2752           thumb_mode = 0;
2753
2754           if (!need_pass_2)
2755             frag_align (2, 0, 0);
2756
2757           record_alignment (now_seg, 1);
2758         }
2759       break;
2760
2761     default:
2762       as_bad (_("invalid instruction size selected (%d)"), width);
2763     }
2764 }
2765
2766 static void
2767 s_arm (int ignore ATTRIBUTE_UNUSED)
2768 {
2769   opcode_select (32);
2770   demand_empty_rest_of_line ();
2771 }
2772
2773 static void
2774 s_thumb (int ignore ATTRIBUTE_UNUSED)
2775 {
2776   opcode_select (16);
2777   demand_empty_rest_of_line ();
2778 }
2779
2780 static void
2781 s_code (int unused ATTRIBUTE_UNUSED)
2782 {
2783   int temp;
2784
2785   temp = get_absolute_expression ();
2786   switch (temp)
2787     {
2788     case 16:
2789     case 32:
2790       opcode_select (temp);
2791       break;
2792
2793     default:
2794       as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2795     }
2796 }
2797
2798 static void
2799 s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2800 {
2801   /* If we are not already in thumb mode go into it, EVEN if
2802      the target processor does not support thumb instructions.
2803      This is used by gcc/config/arm/lib1funcs.asm for example
2804      to compile interworking support functions even if the
2805      target processor should not support interworking.  */
2806   if (! thumb_mode)
2807     {
2808       thumb_mode = 2;
2809       record_alignment (now_seg, 1);
2810     }
2811
2812   demand_empty_rest_of_line ();
2813 }
2814
2815 static void
2816 s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2817 {
2818   s_thumb (0);
2819
2820   /* The following label is the name/address of the start of a Thumb function.
2821      We need to know this for the interworking support.  */
2822   label_is_thumb_function_name = TRUE;
2823 }
2824
2825 /* Perform a .set directive, but also mark the alias as
2826    being a thumb function.  */
2827
2828 static void
2829 s_thumb_set (int equiv)
2830 {
2831   /* XXX the following is a duplicate of the code for s_set() in read.c
2832      We cannot just call that code as we need to get at the symbol that
2833      is created.  */
2834   char *    name;
2835   char      delim;
2836   char *    end_name;
2837   symbolS * symbolP;
2838
2839   /* Especial apologies for the random logic:
2840      This just grew, and could be parsed much more simply!
2841      Dean - in haste.  */
2842   name      = input_line_pointer;
2843   delim     = get_symbol_end ();
2844   end_name  = input_line_pointer;
2845   *end_name = delim;
2846
2847   if (*input_line_pointer != ',')
2848     {
2849       *end_name = 0;
2850       as_bad (_("expected comma after name \"%s\""), name);
2851       *end_name = delim;
2852       ignore_rest_of_line ();
2853       return;
2854     }
2855
2856   input_line_pointer++;
2857   *end_name = 0;
2858
2859   if (name[0] == '.' && name[1] == '\0')
2860     {
2861       /* XXX - this should not happen to .thumb_set.  */
2862       abort ();
2863     }
2864
2865   if ((symbolP = symbol_find (name)) == NULL
2866       && (symbolP = md_undefined_symbol (name)) == NULL)
2867     {
2868 #ifndef NO_LISTING
2869       /* When doing symbol listings, play games with dummy fragments living
2870          outside the normal fragment chain to record the file and line info
2871          for this symbol.  */
2872       if (listing & LISTING_SYMBOLS)
2873         {
2874           extern struct list_info_struct * listing_tail;
2875           fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
2876
2877           memset (dummy_frag, 0, sizeof (fragS));
2878           dummy_frag->fr_type = rs_fill;
2879           dummy_frag->line = listing_tail;
2880           symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2881           dummy_frag->fr_symbol = symbolP;
2882         }
2883       else
2884 #endif
2885         symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2886
2887 #ifdef OBJ_COFF
2888       /* "set" symbols are local unless otherwise specified.  */
2889       SF_SET_LOCAL (symbolP);
2890 #endif /* OBJ_COFF  */
2891     }                           /* Make a new symbol.  */
2892
2893   symbol_table_insert (symbolP);
2894
2895   * end_name = delim;
2896
2897   if (equiv
2898       && S_IS_DEFINED (symbolP)
2899       && S_GET_SEGMENT (symbolP) != reg_section)
2900     as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2901
2902   pseudo_set (symbolP);
2903
2904   demand_empty_rest_of_line ();
2905
2906   /* XXX Now we come to the Thumb specific bit of code.  */
2907
2908   THUMB_SET_FUNC (symbolP, 1);
2909   ARM_SET_THUMB (symbolP, 1);
2910 #if defined OBJ_ELF || defined OBJ_COFF
2911   ARM_SET_INTERWORK (symbolP, support_interwork);
2912 #endif
2913 }
2914
2915 /* Directives: Mode selection.  */
2916
2917 /* .syntax [unified|divided] - choose the new unified syntax
2918    (same for Arm and Thumb encoding, modulo slight differences in what
2919    can be represented) or the old divergent syntax for each mode.  */
2920 static void
2921 s_syntax (int unused ATTRIBUTE_UNUSED)
2922 {
2923   char *name, delim;
2924
2925   name = input_line_pointer;
2926   delim = get_symbol_end ();
2927
2928   if (!strcasecmp (name, "unified"))
2929     unified_syntax = TRUE;
2930   else if (!strcasecmp (name, "divided"))
2931     unified_syntax = FALSE;
2932   else
2933     {
2934       as_bad (_("unrecognized syntax mode \"%s\""), name);
2935       return;
2936     }
2937   *input_line_pointer = delim;
2938   demand_empty_rest_of_line ();
2939 }
2940
2941 /* Directives: sectioning and alignment.  */
2942
2943 /* Same as s_align_ptwo but align 0 => align 2.  */
2944
2945 static void
2946 s_align (int unused ATTRIBUTE_UNUSED)
2947 {
2948   int temp;
2949   bfd_boolean fill_p;
2950   long temp_fill;
2951   long max_alignment = 15;
2952
2953   temp = get_absolute_expression ();
2954   if (temp > max_alignment)
2955     as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2956   else if (temp < 0)
2957     {
2958       as_bad (_("alignment negative. 0 assumed."));
2959       temp = 0;
2960     }
2961
2962   if (*input_line_pointer == ',')
2963     {
2964       input_line_pointer++;
2965       temp_fill = get_absolute_expression ();
2966       fill_p = TRUE;
2967     }
2968   else
2969     {
2970       fill_p = FALSE;
2971       temp_fill = 0;
2972     }
2973
2974   if (!temp)
2975     temp = 2;
2976
2977   /* Only make a frag if we HAVE to.  */
2978   if (temp && !need_pass_2)
2979     {
2980       if (!fill_p && subseg_text_p (now_seg))
2981         frag_align_code (temp, 0);
2982       else
2983         frag_align (temp, (int) temp_fill, 0);
2984     }
2985   demand_empty_rest_of_line ();
2986
2987   record_alignment (now_seg, temp);
2988 }
2989
2990 static void
2991 s_bss (int ignore ATTRIBUTE_UNUSED)
2992 {
2993   /* We don't support putting frags in the BSS segment, we fake it by
2994      marking in_bss, then looking at s_skip for clues.  */
2995   subseg_set (bss_section, 0);
2996   demand_empty_rest_of_line ();
2997
2998 #ifdef md_elf_section_change_hook
2999   md_elf_section_change_hook ();
3000 #endif
3001 }
3002
3003 static void
3004 s_even (int ignore ATTRIBUTE_UNUSED)
3005 {
3006   /* Never make frag if expect extra pass.  */
3007   if (!need_pass_2)
3008     frag_align (1, 0, 0);
3009
3010   record_alignment (now_seg, 1);
3011
3012   demand_empty_rest_of_line ();
3013 }
3014
3015 /* Directives: Literal pools.  */
3016
3017 static literal_pool *
3018 find_literal_pool (void)
3019 {
3020   literal_pool * pool;
3021
3022   for (pool = list_of_pools; pool != NULL; pool = pool->next)
3023     {
3024       if (pool->section == now_seg
3025           && pool->sub_section == now_subseg)
3026         break;
3027     }
3028
3029   return pool;
3030 }
3031
3032 static literal_pool *
3033 find_or_make_literal_pool (void)
3034 {
3035   /* Next literal pool ID number.  */
3036   static unsigned int latest_pool_num = 1;
3037   literal_pool *      pool;
3038
3039   pool = find_literal_pool ();
3040
3041   if (pool == NULL)
3042     {
3043       /* Create a new pool.  */
3044       pool = (literal_pool *) xmalloc (sizeof (* pool));
3045       if (! pool)
3046         return NULL;
3047
3048       pool->next_free_entry = 0;
3049       pool->section         = now_seg;
3050       pool->sub_section     = now_subseg;
3051       pool->next            = list_of_pools;
3052       pool->symbol          = NULL;
3053
3054       /* Add it to the list.  */
3055       list_of_pools = pool;
3056     }
3057
3058   /* New pools, and emptied pools, will have a NULL symbol.  */
3059   if (pool->symbol == NULL)
3060     {
3061       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
3062                                     (valueT) 0, &zero_address_frag);
3063       pool->id = latest_pool_num ++;
3064     }
3065
3066   /* Done.  */
3067   return pool;
3068 }
3069
3070 /* Add the literal in the global 'inst'
3071    structure to the relevant literal pool.  */
3072
3073 static int
3074 add_to_lit_pool (void)
3075 {
3076   literal_pool * pool;
3077   unsigned int entry;
3078
3079   pool = find_or_make_literal_pool ();
3080
3081   /* Check if this literal value is already in the pool.  */
3082   for (entry = 0; entry < pool->next_free_entry; entry ++)
3083     {
3084       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3085           && (inst.reloc.exp.X_op == O_constant)
3086           && (pool->literals[entry].X_add_number
3087               == inst.reloc.exp.X_add_number)
3088           && (pool->literals[entry].X_unsigned
3089               == inst.reloc.exp.X_unsigned))
3090         break;
3091
3092       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3093           && (inst.reloc.exp.X_op == O_symbol)
3094           && (pool->literals[entry].X_add_number
3095               == inst.reloc.exp.X_add_number)
3096           && (pool->literals[entry].X_add_symbol
3097               == inst.reloc.exp.X_add_symbol)
3098           && (pool->literals[entry].X_op_symbol
3099               == inst.reloc.exp.X_op_symbol))
3100         break;
3101     }
3102
3103   /* Do we need to create a new entry?  */
3104   if (entry == pool->next_free_entry)
3105     {
3106       if (entry >= MAX_LITERAL_POOL_SIZE)
3107         {
3108           inst.error = _("literal pool overflow");
3109           return FAIL;
3110         }
3111
3112       pool->literals[entry] = inst.reloc.exp;
3113 #ifdef OBJ_ELF
3114       /* PR ld/12974: Record the location of the first source line to reference
3115          this entry in the literal pool.  If it turns out during linking that the
3116          symbol does not exist we will be able to give an accurate line number for
3117          the (first use of the) missing reference.  */
3118       if (debug_type == DEBUG_DWARF2)
3119         dwarf2_where (pool->locs + entry);
3120 #endif
3121       pool->next_free_entry += 1;
3122     }
3123
3124   inst.reloc.exp.X_op         = O_symbol;
3125   inst.reloc.exp.X_add_number = ((int) entry) * 4;
3126   inst.reloc.exp.X_add_symbol = pool->symbol;
3127
3128   return SUCCESS;
3129 }
3130
3131 /* Can't use symbol_new here, so have to create a symbol and then at
3132    a later date assign it a value. Thats what these functions do.  */
3133
3134 static void
3135 symbol_locate (symbolS *    symbolP,
3136                const char * name,       /* It is copied, the caller can modify.  */
3137                segT         segment,    /* Segment identifier (SEG_<something>).  */
3138                valueT       valu,       /* Symbol value.  */
3139                fragS *      frag)       /* Associated fragment.  */
3140 {
3141   unsigned int name_length;
3142   char * preserved_copy_of_name;
3143
3144   name_length = strlen (name) + 1;   /* +1 for \0.  */
3145   obstack_grow (&notes, name, name_length);
3146   preserved_copy_of_name = (char *) obstack_finish (&notes);
3147
3148 #ifdef tc_canonicalize_symbol_name
3149   preserved_copy_of_name =
3150     tc_canonicalize_symbol_name (preserved_copy_of_name);
3151 #endif
3152
3153   S_SET_NAME (symbolP, preserved_copy_of_name);
3154
3155   S_SET_SEGMENT (symbolP, segment);
3156   S_SET_VALUE (symbolP, valu);
3157   symbol_clear_list_pointers (symbolP);
3158
3159   symbol_set_frag (symbolP, frag);
3160
3161   /* Link to end of symbol chain.  */
3162   {
3163     extern int symbol_table_frozen;
3164
3165     if (symbol_table_frozen)
3166       abort ();
3167   }
3168
3169   symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
3170
3171   obj_symbol_new_hook (symbolP);
3172
3173 #ifdef tc_symbol_new_hook
3174   tc_symbol_new_hook (symbolP);
3175 #endif
3176
3177 #ifdef DEBUG_SYMS
3178   verify_symbol_chain (symbol_rootP, symbol_lastP);
3179 #endif /* DEBUG_SYMS  */
3180 }
3181
3182
3183 static void
3184 s_ltorg (int ignored ATTRIBUTE_UNUSED)
3185 {
3186   unsigned int entry;
3187   literal_pool * pool;
3188   char sym_name[20];
3189
3190   pool = find_literal_pool ();
3191   if (pool == NULL
3192       || pool->symbol == NULL
3193       || pool->next_free_entry == 0)
3194     return;
3195
3196   mapping_state (MAP_DATA);
3197
3198   /* Align pool as you have word accesses.
3199      Only make a frag if we have to.  */
3200   if (!need_pass_2)
3201     frag_align (2, 0, 0);
3202
3203   record_alignment (now_seg, 2);
3204
3205   sprintf (sym_name, "$$lit_\002%x", pool->id);
3206
3207   symbol_locate (pool->symbol, sym_name, now_seg,
3208                  (valueT) frag_now_fix (), frag_now);
3209   symbol_table_insert (pool->symbol);
3210
3211   ARM_SET_THUMB (pool->symbol, thumb_mode);
3212
3213 #if defined OBJ_COFF || defined OBJ_ELF
3214   ARM_SET_INTERWORK (pool->symbol, support_interwork);
3215 #endif
3216
3217   for (entry = 0; entry < pool->next_free_entry; entry ++)
3218     {
3219 #ifdef OBJ_ELF
3220       if (debug_type == DEBUG_DWARF2)
3221         dwarf2_gen_line_info (frag_now_fix (), pool->locs + entry);
3222 #endif
3223       /* First output the expression in the instruction to the pool.  */
3224       emit_expr (&(pool->literals[entry]), 4); /* .word  */
3225     }
3226
3227   /* Mark the pool as empty.  */
3228   pool->next_free_entry = 0;
3229   pool->symbol = NULL;
3230 }
3231
3232 #ifdef OBJ_ELF
3233 /* Forward declarations for functions below, in the MD interface
3234    section.  */
3235 static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3236 static valueT create_unwind_entry (int);
3237 static void start_unwind_section (const segT, int);
3238 static void add_unwind_opcode (valueT, int);
3239 static void flush_pending_unwind (void);
3240
3241 /* Directives: Data.  */
3242
3243 static void
3244 s_arm_elf_cons (int nbytes)
3245 {
3246   expressionS exp;
3247
3248 #ifdef md_flush_pending_output
3249   md_flush_pending_output ();
3250 #endif
3251
3252   if (is_it_end_of_statement ())
3253     {
3254       demand_empty_rest_of_line ();
3255       return;
3256     }
3257
3258 #ifdef md_cons_align
3259   md_cons_align (nbytes);
3260 #endif
3261
3262   mapping_state (MAP_DATA);
3263   do
3264     {
3265       int reloc;
3266       char *base = input_line_pointer;
3267
3268       expression (& exp);
3269
3270       if (exp.X_op != O_symbol)
3271         emit_expr (&exp, (unsigned int) nbytes);
3272       else
3273         {
3274           char *before_reloc = input_line_pointer;
3275           reloc = parse_reloc (&input_line_pointer);
3276           if (reloc == -1)
3277             {
3278               as_bad (_("unrecognized relocation suffix"));
3279               ignore_rest_of_line ();
3280               return;
3281             }
3282           else if (reloc == BFD_RELOC_UNUSED)
3283             emit_expr (&exp, (unsigned int) nbytes);
3284           else
3285             {
3286               reloc_howto_type *howto = (reloc_howto_type *)
3287                   bfd_reloc_type_lookup (stdoutput,
3288                                          (bfd_reloc_code_real_type) reloc);
3289               int size = bfd_get_reloc_size (howto);
3290
3291               if (reloc == BFD_RELOC_ARM_PLT32)
3292                 {
3293                   as_bad (_("(plt) is only valid on branch targets"));
3294                   reloc = BFD_RELOC_UNUSED;
3295                   size = 0;
3296                 }
3297
3298               if (size > nbytes)
3299                 as_bad (_("%s relocations do not fit in %d bytes"),
3300                         howto->name, nbytes);
3301               else
3302                 {
3303                   /* We've parsed an expression stopping at O_symbol.
3304                      But there may be more expression left now that we
3305                      have parsed the relocation marker.  Parse it again.
3306                      XXX Surely there is a cleaner way to do this.  */
3307                   char *p = input_line_pointer;
3308                   int offset;
3309                   char *save_buf = (char *) alloca (input_line_pointer - base);
3310                   memcpy (save_buf, base, input_line_pointer - base);
3311                   memmove (base + (input_line_pointer - before_reloc),
3312                            base, before_reloc - base);
3313
3314                   input_line_pointer = base + (input_line_pointer-before_reloc);
3315                   expression (&exp);
3316                   memcpy (base, save_buf, p - base);
3317
3318                   offset = nbytes - size;
3319                   p = frag_more ((int) nbytes);
3320                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
3321                                size, &exp, 0, (enum bfd_reloc_code_real) reloc);
3322                 }
3323             }
3324         }
3325     }
3326   while (*input_line_pointer++ == ',');
3327
3328   /* Put terminator back into stream.  */
3329   input_line_pointer --;
3330   demand_empty_rest_of_line ();
3331 }
3332
3333 /* Emit an expression containing a 32-bit thumb instruction.
3334    Implementation based on put_thumb32_insn.  */
3335
3336 static void
3337 emit_thumb32_expr (expressionS * exp)
3338 {
3339   expressionS exp_high = *exp;
3340
3341   exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3342   emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3343   exp->X_add_number &= 0xffff;
3344   emit_expr (exp, (unsigned int) THUMB_SIZE);
3345 }
3346
3347 /*  Guess the instruction size based on the opcode.  */
3348
3349 static int
3350 thumb_insn_size (int opcode)
3351 {
3352   if ((unsigned int) opcode < 0xe800u)
3353     return 2;
3354   else if ((unsigned int) opcode >= 0xe8000000u)
3355     return 4;
3356   else
3357     return 0;
3358 }
3359
3360 static bfd_boolean
3361 emit_insn (expressionS *exp, int nbytes)
3362 {
3363   int size = 0;
3364
3365   if (exp->X_op == O_constant)
3366     {
3367       size = nbytes;
3368
3369       if (size == 0)
3370         size = thumb_insn_size (exp->X_add_number);
3371
3372       if (size != 0)
3373         {
3374           if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3375             {
3376               as_bad (_(".inst.n operand too big. "\
3377                         "Use .inst.w instead"));
3378               size = 0;
3379             }
3380           else
3381             {
3382               if (now_it.state == AUTOMATIC_IT_BLOCK)
3383                 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3384               else
3385                 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3386
3387               if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3388                 emit_thumb32_expr (exp);
3389               else
3390                 emit_expr (exp, (unsigned int) size);
3391
3392               it_fsm_post_encode ();
3393             }
3394         }
3395       else
3396         as_bad (_("cannot determine Thumb instruction size. "   \
3397                   "Use .inst.n/.inst.w instead"));
3398     }
3399   else
3400     as_bad (_("constant expression required"));
3401
3402   return (size != 0);
3403 }
3404
3405 /* Like s_arm_elf_cons but do not use md_cons_align and
3406    set the mapping state to MAP_ARM/MAP_THUMB.  */
3407
3408 static void
3409 s_arm_elf_inst (int nbytes)
3410 {
3411   if (is_it_end_of_statement ())
3412     {
3413       demand_empty_rest_of_line ();
3414       return;
3415     }
3416
3417   /* Calling mapping_state () here will not change ARM/THUMB,
3418      but will ensure not to be in DATA state.  */
3419
3420   if (thumb_mode)
3421     mapping_state (MAP_THUMB);
3422   else
3423     {
3424       if (nbytes != 0)
3425         {
3426           as_bad (_("width suffixes are invalid in ARM mode"));
3427           ignore_rest_of_line ();
3428           return;
3429         }
3430
3431       nbytes = 4;
3432
3433       mapping_state (MAP_ARM);
3434     }
3435
3436   do
3437     {
3438       expressionS exp;
3439
3440       expression (& exp);
3441
3442       if (! emit_insn (& exp, nbytes))
3443         {
3444           ignore_rest_of_line ();
3445           return;
3446         }
3447     }
3448   while (*input_line_pointer++ == ',');
3449
3450   /* Put terminator back into stream.  */
3451   input_line_pointer --;
3452   demand_empty_rest_of_line ();
3453 }
3454
3455 /* Parse a .rel31 directive.  */
3456
3457 static void
3458 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3459 {
3460   expressionS exp;
3461   char *p;
3462   valueT highbit;
3463
3464   highbit = 0;
3465   if (*input_line_pointer == '1')
3466     highbit = 0x80000000;
3467   else if (*input_line_pointer != '0')
3468     as_bad (_("expected 0 or 1"));
3469
3470   input_line_pointer++;
3471   if (*input_line_pointer != ',')
3472     as_bad (_("missing comma"));
3473   input_line_pointer++;
3474
3475 #ifdef md_flush_pending_output
3476   md_flush_pending_output ();
3477 #endif
3478
3479 #ifdef md_cons_align
3480   md_cons_align (4);
3481 #endif
3482
3483   mapping_state (MAP_DATA);
3484
3485   expression (&exp);
3486
3487   p = frag_more (4);
3488   md_number_to_chars (p, highbit, 4);
3489   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3490                BFD_RELOC_ARM_PREL31);
3491
3492   demand_empty_rest_of_line ();
3493 }
3494
3495 /* Directives: AEABI stack-unwind tables.  */
3496
3497 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
3498
3499 static void
3500 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3501 {
3502   demand_empty_rest_of_line ();
3503   if (unwind.proc_start)
3504     {
3505       as_bad (_("duplicate .fnstart directive"));
3506       return;
3507     }
3508
3509   /* Mark the start of the function.  */
3510   unwind.proc_start = expr_build_dot ();
3511
3512   /* Reset the rest of the unwind info.  */
3513   unwind.opcode_count = 0;
3514   unwind.table_entry = NULL;
3515   unwind.personality_routine = NULL;
3516   unwind.personality_index = -1;
3517   unwind.frame_size = 0;
3518   unwind.fp_offset = 0;
3519   unwind.fp_reg = REG_SP;
3520   unwind.fp_used = 0;
3521   unwind.sp_restored = 0;
3522 }
3523
3524
3525 /* Parse a handlerdata directive.  Creates the exception handling table entry
3526    for the function.  */
3527
3528 static void
3529 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3530 {
3531   demand_empty_rest_of_line ();
3532   if (!unwind.proc_start)
3533     as_bad (MISSING_FNSTART);
3534
3535   if (unwind.table_entry)
3536     as_bad (_("duplicate .handlerdata directive"));
3537
3538   create_unwind_entry (1);
3539 }
3540
3541 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
3542
3543 static void
3544 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3545 {
3546   long where;
3547   char *ptr;
3548   valueT val;
3549   unsigned int marked_pr_dependency;
3550
3551   demand_empty_rest_of_line ();
3552
3553   if (!unwind.proc_start)
3554     {
3555       as_bad (_(".fnend directive without .fnstart"));
3556       return;
3557     }
3558
3559   /* Add eh table entry.  */
3560   if (unwind.table_entry == NULL)
3561     val = create_unwind_entry (0);
3562   else
3563     val = 0;
3564
3565   /* Add index table entry.  This is two words.  */
3566   start_unwind_section (unwind.saved_seg, 1);
3567   frag_align (2, 0, 0);
3568   record_alignment (now_seg, 2);
3569
3570   ptr = frag_more (8);
3571   memset (ptr, 0, 8);
3572   where = frag_now_fix () - 8;
3573
3574   /* Self relative offset of the function start.  */
3575   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3576            BFD_RELOC_ARM_PREL31);
3577
3578   /* Indicate dependency on EHABI-defined personality routines to the
3579      linker, if it hasn't been done already.  */
3580   marked_pr_dependency
3581     = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
3582   if (unwind.personality_index >= 0 && unwind.personality_index < 3
3583       && !(marked_pr_dependency & (1 << unwind.personality_index)))
3584     {
3585       static const char *const name[] =
3586         {
3587           "__aeabi_unwind_cpp_pr0",
3588           "__aeabi_unwind_cpp_pr1",
3589           "__aeabi_unwind_cpp_pr2"
3590         };
3591       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3592       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3593       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3594         |= 1 << unwind.personality_index;
3595     }
3596
3597   if (val)
3598     /* Inline exception table entry.  */
3599     md_number_to_chars (ptr + 4, val, 4);
3600   else
3601     /* Self relative offset of the table entry.  */
3602     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3603              BFD_RELOC_ARM_PREL31);
3604
3605   /* Restore the original section.  */
3606   subseg_set (unwind.saved_seg, unwind.saved_subseg);
3607
3608   unwind.proc_start = NULL;
3609 }
3610
3611
3612 /* Parse an unwind_cantunwind directive.  */
3613
3614 static void
3615 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3616 {
3617   demand_empty_rest_of_line ();
3618   if (!unwind.proc_start)
3619     as_bad (MISSING_FNSTART);
3620
3621   if (unwind.personality_routine || unwind.personality_index != -1)
3622     as_bad (_("personality routine specified for cantunwind frame"));
3623
3624   unwind.personality_index = -2;
3625 }
3626
3627
3628 /* Parse a personalityindex directive.  */
3629
3630 static void
3631 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3632 {
3633   expressionS exp;
3634
3635   if (!unwind.proc_start)
3636     as_bad (MISSING_FNSTART);
3637
3638   if (unwind.personality_routine || unwind.personality_index != -1)
3639     as_bad (_("duplicate .personalityindex directive"));
3640
3641   expression (&exp);
3642
3643   if (exp.X_op != O_constant
3644       || exp.X_add_number < 0 || exp.X_add_number > 15)
3645     {
3646       as_bad (_("bad personality routine number"));
3647       ignore_rest_of_line ();
3648       return;
3649     }
3650
3651   unwind.personality_index = exp.X_add_number;
3652
3653   demand_empty_rest_of_line ();
3654 }
3655
3656
3657 /* Parse a personality directive.  */
3658
3659 static void
3660 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3661 {
3662   char *name, *p, c;
3663
3664   if (!unwind.proc_start)
3665     as_bad (MISSING_FNSTART);
3666
3667   if (unwind.personality_routine || unwind.personality_index != -1)
3668     as_bad (_("duplicate .personality directive"));
3669
3670   name = input_line_pointer;
3671   c = get_symbol_end ();
3672   p = input_line_pointer;
3673   unwind.personality_routine = symbol_find_or_make (name);
3674   *p = c;
3675   demand_empty_rest_of_line ();
3676 }
3677
3678
3679 /* Parse a directive saving core registers.  */
3680
3681 static void
3682 s_arm_unwind_save_core (void)
3683 {
3684   valueT op;
3685   long range;
3686   int n;
3687
3688   range = parse_reg_list (&input_line_pointer);
3689   if (range == FAIL)
3690     {
3691       as_bad (_("expected register list"));
3692       ignore_rest_of_line ();
3693       return;
3694     }
3695
3696   demand_empty_rest_of_line ();
3697
3698   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3699      into .unwind_save {..., sp...}.  We aren't bothered about the value of
3700      ip because it is clobbered by calls.  */
3701   if (unwind.sp_restored && unwind.fp_reg == 12
3702       && (range & 0x3000) == 0x1000)
3703     {
3704       unwind.opcode_count--;
3705       unwind.sp_restored = 0;
3706       range = (range | 0x2000) & ~0x1000;
3707       unwind.pending_offset = 0;
3708     }
3709
3710   /* Pop r4-r15.  */
3711   if (range & 0xfff0)
3712     {
3713       /* See if we can use the short opcodes.  These pop a block of up to 8
3714          registers starting with r4, plus maybe r14.  */
3715       for (n = 0; n < 8; n++)
3716         {
3717           /* Break at the first non-saved register.      */
3718           if ((range & (1 << (n + 4))) == 0)
3719             break;
3720         }
3721       /* See if there are any other bits set.  */
3722       if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3723         {
3724           /* Use the long form.  */
3725           op = 0x8000 | ((range >> 4) & 0xfff);
3726           add_unwind_opcode (op, 2);
3727         }
3728       else
3729         {
3730           /* Use the short form.  */
3731           if (range & 0x4000)
3732             op = 0xa8; /* Pop r14.      */
3733           else
3734             op = 0xa0; /* Do not pop r14.  */
3735           op |= (n - 1);
3736           add_unwind_opcode (op, 1);
3737         }
3738     }
3739
3740   /* Pop r0-r3.  */
3741   if (range & 0xf)
3742     {
3743       op = 0xb100 | (range & 0xf);
3744       add_unwind_opcode (op, 2);
3745     }
3746
3747   /* Record the number of bytes pushed.  */
3748   for (n = 0; n < 16; n++)
3749     {
3750       if (range & (1 << n))
3751         unwind.frame_size += 4;
3752     }
3753 }
3754
3755
3756 /* Parse a directive saving FPA registers.  */
3757
3758 static void
3759 s_arm_unwind_save_fpa (int reg)
3760 {
3761   expressionS exp;
3762   int num_regs;
3763   valueT op;
3764
3765   /* Get Number of registers to transfer.  */
3766   if (skip_past_comma (&input_line_pointer) != FAIL)
3767     expression (&exp);
3768   else
3769     exp.X_op = O_illegal;
3770
3771   if (exp.X_op != O_constant)
3772     {
3773       as_bad (_("expected , <constant>"));
3774       ignore_rest_of_line ();
3775       return;
3776     }
3777
3778   num_regs = exp.X_add_number;
3779
3780   if (num_regs < 1 || num_regs > 4)
3781     {
3782       as_bad (_("number of registers must be in the range [1:4]"));
3783       ignore_rest_of_line ();
3784       return;
3785     }
3786
3787   demand_empty_rest_of_line ();
3788
3789   if (reg == 4)
3790     {
3791       /* Short form.  */
3792       op = 0xb4 | (num_regs - 1);
3793       add_unwind_opcode (op, 1);
3794     }
3795   else
3796     {
3797       /* Long form.  */
3798       op = 0xc800 | (reg << 4) | (num_regs - 1);
3799       add_unwind_opcode (op, 2);
3800     }
3801   unwind.frame_size += num_regs * 12;
3802 }
3803
3804
3805 /* Parse a directive saving VFP registers for ARMv6 and above.  */
3806
3807 static void
3808 s_arm_unwind_save_vfp_armv6 (void)
3809 {
3810   int count;
3811   unsigned int start;
3812   valueT op;
3813   int num_vfpv3_regs = 0;
3814   int num_regs_below_16;
3815
3816   count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3817   if (count == FAIL)
3818     {
3819       as_bad (_("expected register list"));
3820       ignore_rest_of_line ();
3821       return;
3822     }
3823
3824   demand_empty_rest_of_line ();
3825
3826   /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3827      than FSTMX/FLDMX-style ones).  */
3828
3829   /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
3830   if (start >= 16)
3831     num_vfpv3_regs = count;
3832   else if (start + count > 16)
3833     num_vfpv3_regs = start + count - 16;
3834
3835   if (num_vfpv3_regs > 0)
3836     {
3837       int start_offset = start > 16 ? start - 16 : 0;
3838       op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3839       add_unwind_opcode (op, 2);
3840     }
3841
3842   /* Generate opcode for registers numbered in the range 0 .. 15.  */
3843   num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
3844   gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
3845   if (num_regs_below_16 > 0)
3846     {
3847       op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3848       add_unwind_opcode (op, 2);
3849     }
3850
3851   unwind.frame_size += count * 8;
3852 }
3853
3854
3855 /* Parse a directive saving VFP registers for pre-ARMv6.  */
3856
3857 static void
3858 s_arm_unwind_save_vfp (void)
3859 {
3860   int count;
3861   unsigned int reg;
3862   valueT op;
3863
3864   count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
3865   if (count == FAIL)
3866     {
3867       as_bad (_("expected register list"));
3868       ignore_rest_of_line ();
3869       return;
3870     }
3871
3872   demand_empty_rest_of_line ();
3873
3874   if (reg == 8)
3875     {
3876       /* Short form.  */
3877       op = 0xb8 | (count - 1);
3878       add_unwind_opcode (op, 1);
3879     }
3880   else
3881     {
3882       /* Long form.  */
3883       op = 0xb300 | (reg << 4) | (count - 1);
3884       add_unwind_opcode (op, 2);
3885     }
3886   unwind.frame_size += count * 8 + 4;
3887 }
3888
3889
3890 /* Parse a directive saving iWMMXt data registers.  */
3891
3892 static void
3893 s_arm_unwind_save_mmxwr (void)
3894 {
3895   int reg;
3896   int hi_reg;
3897   int i;
3898   unsigned mask = 0;
3899   valueT op;
3900
3901   if (*input_line_pointer == '{')
3902     input_line_pointer++;
3903
3904   do
3905     {
3906       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3907
3908       if (reg == FAIL)
3909         {
3910           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3911           goto error;
3912         }
3913
3914       if (mask >> reg)
3915         as_tsktsk (_("register list not in ascending order"));
3916       mask |= 1 << reg;
3917
3918       if (*input_line_pointer == '-')
3919         {
3920           input_line_pointer++;
3921           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3922           if (hi_reg == FAIL)
3923             {
3924               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3925               goto error;
3926             }
3927           else if (reg >= hi_reg)
3928             {
3929               as_bad (_("bad register range"));
3930               goto error;
3931             }
3932           for (; reg < hi_reg; reg++)
3933             mask |= 1 << reg;
3934         }
3935     }
3936   while (skip_past_comma (&input_line_pointer) != FAIL);
3937
3938   skip_past_char (&input_line_pointer, '}');
3939
3940   demand_empty_rest_of_line ();
3941
3942   /* Generate any deferred opcodes because we're going to be looking at
3943      the list.  */
3944   flush_pending_unwind ();
3945
3946   for (i = 0; i < 16; i++)
3947     {
3948       if (mask & (1 << i))
3949         unwind.frame_size += 8;
3950     }
3951
3952   /* Attempt to combine with a previous opcode.  We do this because gcc
3953      likes to output separate unwind directives for a single block of
3954      registers.  */
3955   if (unwind.opcode_count > 0)
3956     {
3957       i = unwind.opcodes[unwind.opcode_count - 1];
3958       if ((i & 0xf8) == 0xc0)
3959         {
3960           i &= 7;
3961           /* Only merge if the blocks are contiguous.  */
3962           if (i < 6)
3963             {
3964               if ((mask & 0xfe00) == (1 << 9))
3965                 {
3966                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3967                   unwind.opcode_count--;
3968                 }
3969             }
3970           else if (i == 6 && unwind.opcode_count >= 2)
3971             {
3972               i = unwind.opcodes[unwind.opcode_count - 2];
3973               reg = i >> 4;
3974               i &= 0xf;
3975
3976               op = 0xffff << (reg - 1);
3977               if (reg > 0
3978                   && ((mask & op) == (1u << (reg - 1))))
3979                 {
3980                   op = (1 << (reg + i + 1)) - 1;
3981                   op &= ~((1 << reg) - 1);
3982                   mask |= op;
3983                   unwind.opcode_count -= 2;
3984                 }
3985             }
3986         }
3987     }
3988
3989   hi_reg = 15;
3990   /* We want to generate opcodes in the order the registers have been
3991      saved, ie. descending order.  */
3992   for (reg = 15; reg >= -1; reg--)
3993     {
3994       /* Save registers in blocks.  */
3995       if (reg < 0
3996           || !(mask & (1 << reg)))
3997         {
3998           /* We found an unsaved reg.  Generate opcodes to save the
3999              preceding block.   */
4000           if (reg != hi_reg)
4001             {
4002               if (reg == 9)
4003                 {
4004                   /* Short form.  */
4005                   op = 0xc0 | (hi_reg - 10);
4006                   add_unwind_opcode (op, 1);
4007                 }
4008               else
4009                 {
4010                   /* Long form.  */
4011                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
4012                   add_unwind_opcode (op, 2);
4013                 }
4014             }
4015           hi_reg = reg - 1;
4016         }
4017     }
4018
4019   return;
4020 error:
4021   ignore_rest_of_line ();
4022 }
4023
4024 static void
4025 s_arm_unwind_save_mmxwcg (void)
4026 {
4027   int reg;
4028   int hi_reg;
4029   unsigned mask = 0;
4030   valueT op;
4031
4032   if (*input_line_pointer == '{')
4033     input_line_pointer++;
4034
4035   skip_whitespace (input_line_pointer);
4036
4037   do
4038     {
4039       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4040
4041       if (reg == FAIL)
4042         {
4043           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4044           goto error;
4045         }
4046
4047       reg -= 8;
4048       if (mask >> reg)
4049         as_tsktsk (_("register list not in ascending order"));
4050       mask |= 1 << reg;
4051
4052       if (*input_line_pointer == '-')
4053         {
4054           input_line_pointer++;
4055           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4056           if (hi_reg == FAIL)
4057             {
4058               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4059               goto error;
4060             }
4061           else if (reg >= hi_reg)
4062             {
4063               as_bad (_("bad register range"));
4064               goto error;
4065             }
4066           for (; reg < hi_reg; reg++)
4067             mask |= 1 << reg;
4068         }
4069     }
4070   while (skip_past_comma (&input_line_pointer) != FAIL);
4071
4072   skip_past_char (&input_line_pointer, '}');
4073
4074   demand_empty_rest_of_line ();
4075
4076   /* Generate any deferred opcodes because we're going to be looking at
4077      the list.  */
4078   flush_pending_unwind ();
4079
4080   for (reg = 0; reg < 16; reg++)
4081     {
4082       if (mask & (1 << reg))
4083         unwind.frame_size += 4;
4084     }
4085   op = 0xc700 | mask;
4086   add_unwind_opcode (op, 2);
4087   return;
4088 error:
4089   ignore_rest_of_line ();
4090 }
4091
4092
4093 /* Parse an unwind_save directive.
4094    If the argument is non-zero, this is a .vsave directive.  */
4095
4096 static void
4097 s_arm_unwind_save (int arch_v6)
4098 {
4099   char *peek;
4100   struct reg_entry *reg;
4101   bfd_boolean had_brace = FALSE;
4102
4103   if (!unwind.proc_start)
4104     as_bad (MISSING_FNSTART);
4105
4106   /* Figure out what sort of save we have.  */
4107   peek = input_line_pointer;
4108
4109   if (*peek == '{')
4110     {
4111       had_brace = TRUE;
4112       peek++;
4113     }
4114
4115   reg = arm_reg_parse_multi (&peek);
4116
4117   if (!reg)
4118     {
4119       as_bad (_("register expected"));
4120       ignore_rest_of_line ();
4121       return;
4122     }
4123
4124   switch (reg->type)
4125     {
4126     case REG_TYPE_FN:
4127       if (had_brace)
4128         {
4129           as_bad (_("FPA .unwind_save does not take a register list"));
4130           ignore_rest_of_line ();
4131           return;
4132         }
4133       input_line_pointer = peek;
4134       s_arm_unwind_save_fpa (reg->number);
4135       return;
4136
4137     case REG_TYPE_RN:     s_arm_unwind_save_core ();   return;
4138     case REG_TYPE_VFD:
4139       if (arch_v6)
4140         s_arm_unwind_save_vfp_armv6 ();
4141       else
4142         s_arm_unwind_save_vfp ();
4143       return;
4144     case REG_TYPE_MMXWR:  s_arm_unwind_save_mmxwr ();  return;
4145     case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
4146
4147     default:
4148       as_bad (_(".unwind_save does not support this kind of register"));
4149       ignore_rest_of_line ();
4150     }
4151 }
4152
4153
4154 /* Parse an unwind_movsp directive.  */
4155
4156 static void
4157 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4158 {
4159   int reg;
4160   valueT op;
4161   int offset;
4162
4163   if (!unwind.proc_start)
4164     as_bad (MISSING_FNSTART);
4165
4166   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4167   if (reg == FAIL)
4168     {
4169       as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
4170       ignore_rest_of_line ();
4171       return;
4172     }
4173
4174   /* Optional constant.  */
4175   if (skip_past_comma (&input_line_pointer) != FAIL)
4176     {
4177       if (immediate_for_directive (&offset) == FAIL)
4178         return;
4179     }
4180   else
4181     offset = 0;
4182
4183   demand_empty_rest_of_line ();
4184
4185   if (reg == REG_SP || reg == REG_PC)
4186     {
4187       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
4188       return;
4189     }
4190
4191   if (unwind.fp_reg != REG_SP)
4192     as_bad (_("unexpected .unwind_movsp directive"));
4193
4194   /* Generate opcode to restore the value.  */
4195   op = 0x90 | reg;
4196   add_unwind_opcode (op, 1);
4197
4198   /* Record the information for later.  */
4199   unwind.fp_reg = reg;
4200   unwind.fp_offset = unwind.frame_size - offset;
4201   unwind.sp_restored = 1;
4202 }
4203
4204 /* Parse an unwind_pad directive.  */
4205
4206 static void
4207 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
4208 {
4209   int offset;
4210
4211   if (!unwind.proc_start)
4212     as_bad (MISSING_FNSTART);
4213
4214   if (immediate_for_directive (&offset) == FAIL)
4215     return;
4216
4217   if (offset & 3)
4218     {
4219       as_bad (_("stack increment must be multiple of 4"));
4220       ignore_rest_of_line ();
4221       return;
4222     }
4223
4224   /* Don't generate any opcodes, just record the details for later.  */
4225   unwind.frame_size += offset;
4226   unwind.pending_offset += offset;
4227
4228   demand_empty_rest_of_line ();
4229 }
4230
4231 /* Parse an unwind_setfp directive.  */
4232
4233 static void
4234 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
4235 {
4236   int sp_reg;
4237   int fp_reg;
4238   int offset;
4239
4240   if (!unwind.proc_start)
4241     as_bad (MISSING_FNSTART);
4242
4243   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4244   if (skip_past_comma (&input_line_pointer) == FAIL)
4245     sp_reg = FAIL;
4246   else
4247     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4248
4249   if (fp_reg == FAIL || sp_reg == FAIL)
4250     {
4251       as_bad (_("expected <reg>, <reg>"));
4252       ignore_rest_of_line ();
4253       return;
4254     }
4255
4256   /* Optional constant.  */
4257   if (skip_past_comma (&input_line_pointer) != FAIL)
4258     {
4259       if (immediate_for_directive (&offset) == FAIL)
4260         return;
4261     }
4262   else
4263     offset = 0;
4264
4265   demand_empty_rest_of_line ();
4266
4267   if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4268     {
4269       as_bad (_("register must be either sp or set by a previous"
4270                 "unwind_movsp directive"));
4271       return;
4272     }
4273
4274   /* Don't generate any opcodes, just record the information for later.  */
4275   unwind.fp_reg = fp_reg;
4276   unwind.fp_used = 1;
4277   if (sp_reg == REG_SP)
4278     unwind.fp_offset = unwind.frame_size - offset;
4279   else
4280     unwind.fp_offset -= offset;
4281 }
4282
4283 /* Parse an unwind_raw directive.  */
4284
4285 static void
4286 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
4287 {
4288   expressionS exp;
4289   /* This is an arbitrary limit.         */
4290   unsigned char op[16];
4291   int count;
4292
4293   if (!unwind.proc_start)
4294     as_bad (MISSING_FNSTART);
4295
4296   expression (&exp);
4297   if (exp.X_op == O_constant
4298       && skip_past_comma (&input_line_pointer) != FAIL)
4299     {
4300       unwind.frame_size += exp.X_add_number;
4301       expression (&exp);
4302     }
4303   else
4304     exp.X_op = O_illegal;
4305
4306   if (exp.X_op != O_constant)
4307     {
4308       as_bad (_("expected <offset>, <opcode>"));
4309       ignore_rest_of_line ();
4310       return;
4311     }
4312
4313   count = 0;
4314
4315   /* Parse the opcode.  */
4316   for (;;)
4317     {
4318       if (count >= 16)
4319         {
4320           as_bad (_("unwind opcode too long"));
4321           ignore_rest_of_line ();
4322         }
4323       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
4324         {
4325           as_bad (_("invalid unwind opcode"));
4326           ignore_rest_of_line ();
4327           return;
4328         }
4329       op[count++] = exp.X_add_number;
4330
4331       /* Parse the next byte.  */
4332       if (skip_past_comma (&input_line_pointer) == FAIL)
4333         break;
4334
4335       expression (&exp);
4336     }
4337
4338   /* Add the opcode bytes in reverse order.  */
4339   while (count--)
4340     add_unwind_opcode (op[count], 1);
4341
4342   demand_empty_rest_of_line ();
4343 }
4344
4345
4346 /* Parse a .eabi_attribute directive.  */
4347
4348 static void
4349 s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4350 {
4351   int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
4352
4353   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4354     attributes_set_explicitly[tag] = 1;
4355 }
4356
4357 /* Emit a tls fix for the symbol.  */
4358
4359 static void
4360 s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4361 {
4362   char *p;
4363   expressionS exp;
4364 #ifdef md_flush_pending_output
4365   md_flush_pending_output ();
4366 #endif
4367
4368 #ifdef md_cons_align
4369   md_cons_align (4);
4370 #endif
4371
4372   /* Since we're just labelling the code, there's no need to define a
4373      mapping symbol.  */
4374   expression (&exp);
4375   p = obstack_next_free (&frchain_now->frch_obstack);
4376   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4377                thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4378                : BFD_RELOC_ARM_TLS_DESCSEQ);
4379 }
4380 #endif /* OBJ_ELF */
4381
4382 static void s_arm_arch (int);
4383 static void s_arm_object_arch (int);
4384 static void s_arm_cpu (int);
4385 static void s_arm_fpu (int);
4386 static void s_arm_arch_extension (int);
4387
4388 #ifdef TE_PE
4389
4390 static void
4391 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
4392 {
4393   expressionS exp;
4394
4395   do
4396     {
4397       expression (&exp);
4398       if (exp.X_op == O_symbol)
4399         exp.X_op = O_secrel;
4400
4401       emit_expr (&exp, 4);
4402     }
4403   while (*input_line_pointer++ == ',');
4404
4405   input_line_pointer--;
4406   demand_empty_rest_of_line ();
4407 }
4408 #endif /* TE_PE */
4409
4410 /* This table describes all the machine specific pseudo-ops the assembler
4411    has to support.  The fields are:
4412      pseudo-op name without dot
4413      function to call to execute this pseudo-op
4414      Integer arg to pass to the function.  */
4415
4416 const pseudo_typeS md_pseudo_table[] =
4417 {
4418   /* Never called because '.req' does not start a line.  */
4419   { "req",         s_req,         0 },
4420   /* Following two are likewise never called.  */
4421   { "dn",          s_dn,          0 },
4422   { "qn",          s_qn,          0 },
4423   { "unreq",       s_unreq,       0 },
4424   { "bss",         s_bss,         0 },
4425   { "align",       s_align,       0 },
4426   { "arm",         s_arm,         0 },
4427   { "thumb",       s_thumb,       0 },
4428   { "code",        s_code,        0 },
4429   { "force_thumb", s_force_thumb, 0 },
4430   { "thumb_func",  s_thumb_func,  0 },
4431   { "thumb_set",   s_thumb_set,   0 },
4432   { "even",        s_even,        0 },
4433   { "ltorg",       s_ltorg,       0 },
4434   { "pool",        s_ltorg,       0 },
4435   { "syntax",      s_syntax,      0 },
4436   { "cpu",         s_arm_cpu,     0 },
4437   { "arch",        s_arm_arch,    0 },
4438   { "object_arch", s_arm_object_arch,   0 },
4439   { "fpu",         s_arm_fpu,     0 },
4440   { "arch_extension", s_arm_arch_extension, 0 },
4441 #ifdef OBJ_ELF
4442   { "word",             s_arm_elf_cons, 4 },
4443   { "long",             s_arm_elf_cons, 4 },
4444   { "inst.n",           s_arm_elf_inst, 2 },
4445   { "inst.w",           s_arm_elf_inst, 4 },
4446   { "inst",             s_arm_elf_inst, 0 },
4447   { "rel31",            s_arm_rel31,      0 },
4448   { "fnstart",          s_arm_unwind_fnstart,   0 },
4449   { "fnend",            s_arm_unwind_fnend,     0 },
4450   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
4451   { "personality",      s_arm_unwind_personality, 0 },
4452   { "personalityindex", s_arm_unwind_personalityindex, 0 },
4453   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
4454   { "save",             s_arm_unwind_save,      0 },
4455   { "vsave",            s_arm_unwind_save,      1 },
4456   { "movsp",            s_arm_unwind_movsp,     0 },
4457   { "pad",              s_arm_unwind_pad,       0 },
4458   { "setfp",            s_arm_unwind_setfp,     0 },
4459   { "unwind_raw",       s_arm_unwind_raw,       0 },
4460   { "eabi_attribute",   s_arm_eabi_attribute,   0 },
4461   { "tlsdescseq",       s_arm_tls_descseq,      0 },
4462 #else
4463   { "word",        cons, 4},
4464
4465   /* These are used for dwarf.  */
4466   {"2byte", cons, 2},
4467   {"4byte", cons, 4},
4468   {"8byte", cons, 8},
4469   /* These are used for dwarf2.  */
4470   { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4471   { "loc",  dwarf2_directive_loc,  0 },
4472   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
4473 #endif
4474   { "extend",      float_cons, 'x' },
4475   { "ldouble",     float_cons, 'x' },
4476   { "packed",      float_cons, 'p' },
4477 #ifdef TE_PE
4478   {"secrel32", pe_directive_secrel, 0},
4479 #endif
4480   { 0, 0, 0 }
4481 };
4482 \f
4483 /* Parser functions used exclusively in instruction operands.  */
4484
4485 /* Generic immediate-value read function for use in insn parsing.
4486    STR points to the beginning of the immediate (the leading #);
4487    VAL receives the value; if the value is outside [MIN, MAX]
4488    issue an error.  PREFIX_OPT is true if the immediate prefix is
4489    optional.  */
4490
4491 static int
4492 parse_immediate (char **str, int *val, int min, int max,
4493                  bfd_boolean prefix_opt)
4494 {
4495   expressionS exp;
4496   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4497   if (exp.X_op != O_constant)
4498     {
4499       inst.error = _("constant expression required");
4500       return FAIL;
4501     }
4502
4503   if (exp.X_add_number < min || exp.X_add_number > max)
4504     {
4505       inst.error = _("immediate value out of range");
4506       return FAIL;
4507     }
4508
4509   *val = exp.X_add_number;
4510   return SUCCESS;
4511 }
4512
4513 /* Less-generic immediate-value read function with the possibility of loading a
4514    big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
4515    instructions. Puts the result directly in inst.operands[i].  */
4516
4517 static int
4518 parse_big_immediate (char **str, int i)
4519 {
4520   expressionS exp;
4521   char *ptr = *str;
4522
4523   my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4524
4525   if (exp.X_op == O_constant)
4526     {
4527       inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4528       /* If we're on a 64-bit host, then a 64-bit number can be returned using
4529          O_constant.  We have to be careful not to break compilation for
4530          32-bit X_add_number, though.  */
4531       if ((exp.X_add_number & ~(offsetT)(0xffffffffU)) != 0)
4532         {
4533           /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4.  */
4534           inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4535           inst.operands[i].regisimm = 1;
4536         }
4537     }
4538   else if (exp.X_op == O_big
4539            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
4540     {
4541       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
4542
4543       /* Bignums have their least significant bits in
4544          generic_bignum[0]. Make sure we put 32 bits in imm and
4545          32 bits in reg,  in a (hopefully) portable way.  */
4546       gas_assert (parts != 0);
4547
4548       /* Make sure that the number is not too big.
4549          PR 11972: Bignums can now be sign-extended to the
4550          size of a .octa so check that the out of range bits
4551          are all zero or all one.  */
4552       if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
4553         {
4554           LITTLENUM_TYPE m = -1;
4555
4556           if (generic_bignum[parts * 2] != 0
4557               && generic_bignum[parts * 2] != m)
4558             return FAIL;
4559
4560           for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
4561             if (generic_bignum[j] != generic_bignum[j-1])
4562               return FAIL;
4563         }
4564
4565       inst.operands[i].imm = 0;
4566       for (j = 0; j < parts; j++, idx++)
4567         inst.operands[i].imm |= generic_bignum[idx]
4568                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4569       inst.operands[i].reg = 0;
4570       for (j = 0; j < parts; j++, idx++)
4571         inst.operands[i].reg |= generic_bignum[idx]
4572                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4573       inst.operands[i].regisimm = 1;
4574     }
4575   else
4576     return FAIL;
4577
4578   *str = ptr;
4579
4580   return SUCCESS;
4581 }
4582
4583 /* Returns the pseudo-register number of an FPA immediate constant,
4584    or FAIL if there isn't a valid constant here.  */
4585
4586 static int
4587 parse_fpa_immediate (char ** str)
4588 {
4589   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4590   char *         save_in;
4591   expressionS    exp;
4592   int            i;
4593   int            j;
4594
4595   /* First try and match exact strings, this is to guarantee
4596      that some formats will work even for cross assembly.  */
4597
4598   for (i = 0; fp_const[i]; i++)
4599     {
4600       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
4601         {
4602           char *start = *str;
4603
4604           *str += strlen (fp_const[i]);
4605           if (is_end_of_line[(unsigned char) **str])
4606             return i + 8;
4607           *str = start;
4608         }
4609     }
4610
4611   /* Just because we didn't get a match doesn't mean that the constant
4612      isn't valid, just that it is in a format that we don't
4613      automatically recognize.  Try parsing it with the standard
4614      expression routines.  */
4615
4616   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
4617
4618   /* Look for a raw floating point number.  */
4619   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4620       && is_end_of_line[(unsigned char) *save_in])
4621     {
4622       for (i = 0; i < NUM_FLOAT_VALS; i++)
4623         {
4624           for (j = 0; j < MAX_LITTLENUMS; j++)
4625             {
4626               if (words[j] != fp_values[i][j])
4627                 break;
4628             }
4629
4630           if (j == MAX_LITTLENUMS)
4631             {
4632               *str = save_in;
4633               return i + 8;
4634             }
4635         }
4636     }
4637
4638   /* Try and parse a more complex expression, this will probably fail
4639      unless the code uses a floating point prefix (eg "0f").  */
4640   save_in = input_line_pointer;
4641   input_line_pointer = *str;
4642   if (expression (&exp) == absolute_section
4643       && exp.X_op == O_big
4644       && exp.X_add_number < 0)
4645     {
4646       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4647          Ditto for 15.  */
4648       if (gen_to_words (words, 5, (long) 15) == 0)
4649         {
4650           for (i = 0; i < NUM_FLOAT_VALS; i++)
4651             {
4652               for (j = 0; j < MAX_LITTLENUMS; j++)
4653                 {
4654                   if (words[j] != fp_values[i][j])
4655                     break;
4656                 }
4657
4658               if (j == MAX_LITTLENUMS)
4659                 {
4660                   *str = input_line_pointer;
4661                   input_line_pointer = save_in;
4662                   return i + 8;
4663                 }
4664             }
4665         }
4666     }
4667
4668   *str = input_line_pointer;
4669   input_line_pointer = save_in;
4670   inst.error = _("invalid FPA immediate expression");
4671   return FAIL;
4672 }
4673
4674 /* Returns 1 if a number has "quarter-precision" float format
4675    0baBbbbbbc defgh000 00000000 00000000.  */
4676
4677 static int
4678 is_quarter_float (unsigned imm)
4679 {
4680   int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4681   return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4682 }
4683
4684 /* Parse an 8-bit "quarter-precision" floating point number of the form:
4685    0baBbbbbbc defgh000 00000000 00000000.
4686    The zero and minus-zero cases need special handling, since they can't be
4687    encoded in the "quarter-precision" float format, but can nonetheless be
4688    loaded as integer constants.  */
4689
4690 static unsigned
4691 parse_qfloat_immediate (char **ccp, int *immed)
4692 {
4693   char *str = *ccp;
4694   char *fpnum;
4695   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4696   int found_fpchar = 0;
4697
4698   skip_past_char (&str, '#');
4699
4700   /* We must not accidentally parse an integer as a floating-point number. Make
4701      sure that the value we parse is not an integer by checking for special
4702      characters '.' or 'e'.
4703      FIXME: This is a horrible hack, but doing better is tricky because type
4704      information isn't in a very usable state at parse time.  */
4705   fpnum = str;
4706   skip_whitespace (fpnum);
4707
4708   if (strncmp (fpnum, "0x", 2) == 0)
4709     return FAIL;
4710   else
4711     {
4712       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4713         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4714           {
4715             found_fpchar = 1;
4716             break;
4717           }
4718
4719       if (!found_fpchar)
4720         return FAIL;
4721     }
4722
4723   if ((str = atof_ieee (str, 's', words)) != NULL)
4724     {
4725       unsigned fpword = 0;
4726       int i;
4727
4728       /* Our FP word must be 32 bits (single-precision FP).  */
4729       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4730         {
4731           fpword <<= LITTLENUM_NUMBER_OF_BITS;
4732           fpword |= words[i];
4733         }
4734
4735       if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
4736         *immed = fpword;
4737       else
4738         return FAIL;
4739
4740       *ccp = str;
4741
4742       return SUCCESS;
4743     }
4744
4745   return FAIL;
4746 }
4747
4748 /* Shift operands.  */
4749 enum shift_kind
4750 {
4751   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4752 };
4753
4754 struct asm_shift_name
4755 {
4756   const char      *name;
4757   enum shift_kind  kind;
4758 };
4759
4760 /* Third argument to parse_shift.  */
4761 enum parse_shift_mode
4762 {
4763   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
4764   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
4765   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
4766   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
4767   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
4768 };
4769
4770 /* Parse a <shift> specifier on an ARM data processing instruction.
4771    This has three forms:
4772
4773      (LSL|LSR|ASL|ASR|ROR) Rs
4774      (LSL|LSR|ASL|ASR|ROR) #imm
4775      RRX
4776
4777    Note that ASL is assimilated to LSL in the instruction encoding, and
4778    RRX to ROR #0 (which cannot be written as such).  */
4779
4780 static int
4781 parse_shift (char **str, int i, enum parse_shift_mode mode)
4782 {
4783   const struct asm_shift_name *shift_name;
4784   enum shift_kind shift;
4785   char *s = *str;
4786   char *p = s;
4787   int reg;
4788
4789   for (p = *str; ISALPHA (*p); p++)
4790     ;
4791
4792   if (p == *str)
4793     {
4794       inst.error = _("shift expression expected");
4795       return FAIL;
4796     }
4797
4798   shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
4799                                                             p - *str);
4800
4801   if (shift_name == NULL)
4802     {
4803       inst.error = _("shift expression expected");
4804       return FAIL;
4805     }
4806
4807   shift = shift_name->kind;
4808
4809   switch (mode)
4810     {
4811     case NO_SHIFT_RESTRICT:
4812     case SHIFT_IMMEDIATE:   break;
4813
4814     case SHIFT_LSL_OR_ASR_IMMEDIATE:
4815       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4816         {
4817           inst.error = _("'LSL' or 'ASR' required");
4818           return FAIL;
4819         }
4820       break;
4821
4822     case SHIFT_LSL_IMMEDIATE:
4823       if (shift != SHIFT_LSL)
4824         {
4825           inst.error = _("'LSL' required");
4826           return FAIL;
4827         }
4828       break;
4829
4830     case SHIFT_ASR_IMMEDIATE:
4831       if (shift != SHIFT_ASR)
4832         {
4833           inst.error = _("'ASR' required");
4834           return FAIL;
4835         }
4836       break;
4837
4838     default: abort ();
4839     }
4840
4841   if (shift != SHIFT_RRX)
4842     {
4843       /* Whitespace can appear here if the next thing is a bare digit.  */
4844       skip_whitespace (p);
4845
4846       if (mode == NO_SHIFT_RESTRICT
4847           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
4848         {
4849           inst.operands[i].imm = reg;
4850           inst.operands[i].immisreg = 1;
4851         }
4852       else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4853         return FAIL;
4854     }
4855   inst.operands[i].shift_kind = shift;
4856   inst.operands[i].shifted = 1;
4857   *str = p;
4858   return SUCCESS;
4859 }
4860
4861 /* Parse a <shifter_operand> for an ARM data processing instruction:
4862
4863       #<immediate>
4864       #<immediate>, <rotate>
4865       <Rm>
4866       <Rm>, <shift>
4867
4868    where <shift> is defined by parse_shift above, and <rotate> is a
4869    multiple of 2 between 0 and 30.  Validation of immediate operands
4870    is deferred to md_apply_fix.  */
4871
4872 static int
4873 parse_shifter_operand (char **str, int i)
4874 {
4875   int value;
4876   expressionS exp;
4877
4878   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
4879     {
4880       inst.operands[i].reg = value;
4881       inst.operands[i].isreg = 1;
4882
4883       /* parse_shift will override this if appropriate */
4884       inst.reloc.exp.X_op = O_constant;
4885       inst.reloc.exp.X_add_number = 0;
4886
4887       if (skip_past_comma (str) == FAIL)
4888         return SUCCESS;
4889
4890       /* Shift operation on register.  */
4891       return parse_shift (str, i, NO_SHIFT_RESTRICT);
4892     }
4893
4894   if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4895     return FAIL;
4896
4897   if (skip_past_comma (str) == SUCCESS)
4898     {
4899       /* #x, y -- ie explicit rotation by Y.  */
4900       if (my_get_expression (&exp, str, GE_NO_PREFIX))
4901         return FAIL;
4902
4903       if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
4904         {
4905           inst.error = _("constant expression expected");
4906           return FAIL;
4907         }
4908
4909       value = exp.X_add_number;
4910       if (value < 0 || value > 30 || value % 2 != 0)
4911         {
4912           inst.error = _("invalid rotation");
4913           return FAIL;
4914         }
4915       if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4916         {
4917           inst.error = _("invalid constant");
4918           return FAIL;
4919         }
4920
4921       /* Encode as specified.  */
4922       inst.operands[i].imm = inst.reloc.exp.X_add_number | value << 7;
4923       return SUCCESS;
4924     }
4925
4926   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4927   inst.reloc.pc_rel = 0;
4928   return SUCCESS;
4929 }
4930
4931 /* Group relocation information.  Each entry in the table contains the
4932    textual name of the relocation as may appear in assembler source
4933    and must end with a colon.
4934    Along with this textual name are the relocation codes to be used if
4935    the corresponding instruction is an ALU instruction (ADD or SUB only),
4936    an LDR, an LDRS, or an LDC.  */
4937
4938 struct group_reloc_table_entry
4939 {
4940   const char *name;
4941   int alu_code;
4942   int ldr_code;
4943   int ldrs_code;
4944   int ldc_code;
4945 };
4946
4947 typedef enum
4948 {
4949   /* Varieties of non-ALU group relocation.  */
4950
4951   GROUP_LDR,
4952   GROUP_LDRS,
4953   GROUP_LDC
4954 } group_reloc_type;
4955
4956 static struct group_reloc_table_entry group_reloc_table[] =
4957   { /* Program counter relative: */
4958     { "pc_g0_nc",
4959       BFD_RELOC_ARM_ALU_PC_G0_NC,       /* ALU */
4960       0,                                /* LDR */
4961       0,                                /* LDRS */
4962       0 },                              /* LDC */
4963     { "pc_g0",
4964       BFD_RELOC_ARM_ALU_PC_G0,          /* ALU */
4965       BFD_RELOC_ARM_LDR_PC_G0,          /* LDR */
4966       BFD_RELOC_ARM_LDRS_PC_G0,         /* LDRS */
4967       BFD_RELOC_ARM_LDC_PC_G0 },        /* LDC */
4968     { "pc_g1_nc",
4969       BFD_RELOC_ARM_ALU_PC_G1_NC,       /* ALU */
4970       0,                                /* LDR */
4971       0,                                /* LDRS */
4972       0 },                              /* LDC */
4973     { "pc_g1",
4974       BFD_RELOC_ARM_ALU_PC_G1,          /* ALU */
4975       BFD_RELOC_ARM_LDR_PC_G1,          /* LDR */
4976       BFD_RELOC_ARM_LDRS_PC_G1,         /* LDRS */
4977       BFD_RELOC_ARM_LDC_PC_G1 },        /* LDC */
4978     { "pc_g2",
4979       BFD_RELOC_ARM_ALU_PC_G2,          /* ALU */
4980       BFD_RELOC_ARM_LDR_PC_G2,          /* LDR */
4981       BFD_RELOC_ARM_LDRS_PC_G2,         /* LDRS */
4982       BFD_RELOC_ARM_LDC_PC_G2 },        /* LDC */
4983     /* Section base relative */
4984     { "sb_g0_nc",
4985       BFD_RELOC_ARM_ALU_SB_G0_NC,       /* ALU */
4986       0,                                /* LDR */
4987       0,                                /* LDRS */
4988       0 },                              /* LDC */
4989     { "sb_g0",
4990       BFD_RELOC_ARM_ALU_SB_G0,          /* ALU */
4991       BFD_RELOC_ARM_LDR_SB_G0,          /* LDR */
4992       BFD_RELOC_ARM_LDRS_SB_G0,         /* LDRS */
4993       BFD_RELOC_ARM_LDC_SB_G0 },        /* LDC */
4994     { "sb_g1_nc",
4995       BFD_RELOC_ARM_ALU_SB_G1_NC,       /* ALU */
4996       0,                                /* LDR */
4997       0,                                /* LDRS */
4998       0 },                              /* LDC */
4999     { "sb_g1",
5000       BFD_RELOC_ARM_ALU_SB_G1,          /* ALU */
5001       BFD_RELOC_ARM_LDR_SB_G1,          /* LDR */
5002       BFD_RELOC_ARM_LDRS_SB_G1,         /* LDRS */
5003       BFD_RELOC_ARM_LDC_SB_G1 },        /* LDC */
5004     { "sb_g2",
5005       BFD_RELOC_ARM_ALU_SB_G2,          /* ALU */
5006       BFD_RELOC_ARM_LDR_SB_G2,          /* LDR */
5007       BFD_RELOC_ARM_LDRS_SB_G2,         /* LDRS */
5008       BFD_RELOC_ARM_LDC_SB_G2 } };      /* LDC */
5009
5010 /* Given the address of a pointer pointing to the textual name of a group
5011    relocation as may appear in assembler source, attempt to find its details
5012    in group_reloc_table.  The pointer will be updated to the character after
5013    the trailing colon.  On failure, FAIL will be returned; SUCCESS
5014    otherwise.  On success, *entry will be updated to point at the relevant
5015    group_reloc_table entry. */
5016
5017 static int
5018 find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
5019 {
5020   unsigned int i;
5021   for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
5022     {
5023       int length = strlen (group_reloc_table[i].name);
5024
5025       if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
5026           && (*str)[length] == ':')
5027         {
5028           *out = &group_reloc_table[i];
5029           *str += (length + 1);
5030           return SUCCESS;
5031         }
5032     }
5033
5034   return FAIL;
5035 }
5036
5037 /* Parse a <shifter_operand> for an ARM data processing instruction
5038    (as for parse_shifter_operand) where group relocations are allowed:
5039
5040       #<immediate>
5041       #<immediate>, <rotate>
5042       #:<group_reloc>:<expression>
5043       <Rm>
5044       <Rm>, <shift>
5045
5046    where <group_reloc> is one of the strings defined in group_reloc_table.
5047    The hashes are optional.
5048
5049    Everything else is as for parse_shifter_operand.  */
5050
5051 static parse_operand_result
5052 parse_shifter_operand_group_reloc (char **str, int i)
5053 {
5054   /* Determine if we have the sequence of characters #: or just :
5055      coming next.  If we do, then we check for a group relocation.
5056      If we don't, punt the whole lot to parse_shifter_operand.  */
5057
5058   if (((*str)[0] == '#' && (*str)[1] == ':')
5059       || (*str)[0] == ':')
5060     {
5061       struct group_reloc_table_entry *entry;
5062
5063       if ((*str)[0] == '#')
5064         (*str) += 2;
5065       else
5066         (*str)++;
5067
5068       /* Try to parse a group relocation.  Anything else is an error.  */
5069       if (find_group_reloc_table_entry (str, &entry) == FAIL)
5070         {
5071           inst.error = _("unknown group relocation");
5072           return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5073         }
5074
5075       /* We now have the group relocation table entry corresponding to
5076          the name in the assembler source.  Next, we parse the expression.  */
5077       if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
5078         return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5079
5080       /* Record the relocation type (always the ALU variant here).  */
5081       inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
5082       gas_assert (inst.reloc.type != 0);
5083
5084       return PARSE_OPERAND_SUCCESS;
5085     }
5086   else
5087     return parse_shifter_operand (str, i) == SUCCESS
5088            ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
5089
5090   /* Never reached.  */
5091 }
5092
5093 /* Parse a Neon alignment expression.  Information is written to
5094    inst.operands[i].  We assume the initial ':' has been skipped.
5095
5096    align        .imm = align << 8, .immisalign=1, .preind=0  */
5097 static parse_operand_result
5098 parse_neon_alignment (char **str, int i)
5099 {
5100   char *p = *str;
5101   expressionS exp;
5102
5103   my_get_expression (&exp, &p, GE_NO_PREFIX);
5104
5105   if (exp.X_op != O_constant)
5106     {
5107       inst.error = _("alignment must be constant");
5108       return PARSE_OPERAND_FAIL;
5109     }
5110
5111   inst.operands[i].imm = exp.X_add_number << 8;
5112   inst.operands[i].immisalign = 1;
5113   /* Alignments are not pre-indexes.  */
5114   inst.operands[i].preind = 0;
5115
5116   *str = p;
5117   return PARSE_OPERAND_SUCCESS;
5118 }
5119
5120 /* Parse all forms of an ARM address expression.  Information is written
5121    to inst.operands[i] and/or inst.reloc.
5122
5123    Preindexed addressing (.preind=1):
5124
5125    [Rn, #offset]       .reg=Rn .reloc.exp=offset
5126    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5127    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5128                        .shift_kind=shift .reloc.exp=shift_imm
5129
5130    These three may have a trailing ! which causes .writeback to be set also.
5131
5132    Postindexed addressing (.postind=1, .writeback=1):
5133
5134    [Rn], #offset       .reg=Rn .reloc.exp=offset
5135    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5136    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5137                        .shift_kind=shift .reloc.exp=shift_imm
5138
5139    Unindexed addressing (.preind=0, .postind=0):
5140
5141    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
5142
5143    Other:
5144
5145    [Rn]{!}             shorthand for [Rn,#0]{!}
5146    =immediate          .isreg=0 .reloc.exp=immediate
5147    label               .reg=PC .reloc.pc_rel=1 .reloc.exp=label
5148
5149   It is the caller's responsibility to check for addressing modes not
5150   supported by the instruction, and to set inst.reloc.type.  */
5151
5152 static parse_operand_result
5153 parse_address_main (char **str, int i, int group_relocations,
5154                     group_reloc_type group_type)
5155 {
5156   char *p = *str;
5157   int reg;
5158
5159   if (skip_past_char (&p, '[') == FAIL)
5160     {
5161       if (skip_past_char (&p, '=') == FAIL)
5162         {
5163           /* Bare address - translate to PC-relative offset.  */
5164           inst.reloc.pc_rel = 1;
5165           inst.operands[i].reg = REG_PC;
5166           inst.operands[i].isreg = 1;
5167           inst.operands[i].preind = 1;
5168         }
5169       /* Otherwise a load-constant pseudo op, no special treatment needed here.  */
5170
5171       if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5172         return PARSE_OPERAND_FAIL;
5173
5174       *str = p;
5175       return PARSE_OPERAND_SUCCESS;
5176     }
5177
5178   /* PR gas/14887: Allow for whitespace after the opening bracket.  */
5179   skip_whitespace (p);
5180
5181   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5182     {
5183       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5184       return PARSE_OPERAND_FAIL;
5185     }
5186   inst.operands[i].reg = reg;
5187   inst.operands[i].isreg = 1;
5188
5189   if (skip_past_comma (&p) == SUCCESS)
5190     {
5191       inst.operands[i].preind = 1;
5192
5193       if (*p == '+') p++;
5194       else if (*p == '-') p++, inst.operands[i].negative = 1;
5195
5196       if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5197         {
5198           inst.operands[i].imm = reg;
5199           inst.operands[i].immisreg = 1;
5200
5201           if (skip_past_comma (&p) == SUCCESS)
5202             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5203               return PARSE_OPERAND_FAIL;
5204         }
5205       else if (skip_past_char (&p, ':') == SUCCESS)
5206         {
5207           /* FIXME: '@' should be used here, but it's filtered out by generic
5208              code before we get to see it here. This may be subject to
5209              change.  */
5210           parse_operand_result result = parse_neon_alignment (&p, i);
5211
5212           if (result != PARSE_OPERAND_SUCCESS)
5213             return result;
5214         }
5215       else
5216         {
5217           if (inst.operands[i].negative)
5218             {
5219               inst.operands[i].negative = 0;
5220               p--;
5221             }
5222
5223           if (group_relocations
5224               && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
5225             {
5226               struct group_reloc_table_entry *entry;
5227
5228               /* Skip over the #: or : sequence.  */
5229               if (*p == '#')
5230                 p += 2;
5231               else
5232                 p++;
5233
5234               /* Try to parse a group relocation.  Anything else is an
5235                  error.  */
5236               if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5237                 {
5238                   inst.error = _("unknown group relocation");
5239                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5240                 }
5241
5242               /* We now have the group relocation table entry corresponding to
5243                  the name in the assembler source.  Next, we parse the
5244                  expression.  */
5245               if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5246                 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5247
5248               /* Record the relocation type.  */
5249               switch (group_type)
5250                 {
5251                   case GROUP_LDR:
5252                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
5253                     break;
5254
5255                   case GROUP_LDRS:
5256                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
5257                     break;
5258
5259                   case GROUP_LDC:
5260                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
5261                     break;
5262
5263                   default:
5264                     gas_assert (0);
5265                 }
5266
5267               if (inst.reloc.type == 0)
5268                 {
5269                   inst.error = _("this group relocation is not allowed on this instruction");
5270                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5271                 }
5272             }
5273           else
5274             {
5275               char *q = p;
5276               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5277                 return PARSE_OPERAND_FAIL;
5278               /* If the offset is 0, find out if it's a +0 or -0.  */
5279               if (inst.reloc.exp.X_op == O_constant
5280                   && inst.reloc.exp.X_add_number == 0)
5281                 {
5282                   skip_whitespace (q);
5283                   if (*q == '#')
5284                     {
5285                       q++;
5286                       skip_whitespace (q);
5287                     }
5288                   if (*q == '-')
5289                     inst.operands[i].negative = 1;
5290                 }
5291             }
5292         }
5293     }
5294   else if (skip_past_char (&p, ':') == SUCCESS)
5295     {
5296       /* FIXME: '@' should be used here, but it's filtered out by generic code
5297          before we get to see it here. This may be subject to change.  */
5298       parse_operand_result result = parse_neon_alignment (&p, i);
5299
5300       if (result != PARSE_OPERAND_SUCCESS)
5301         return result;
5302     }
5303
5304   if (skip_past_char (&p, ']') == FAIL)
5305     {
5306       inst.error = _("']' expected");
5307       return PARSE_OPERAND_FAIL;
5308     }
5309
5310   if (skip_past_char (&p, '!') == SUCCESS)
5311     inst.operands[i].writeback = 1;
5312
5313   else if (skip_past_comma (&p) == SUCCESS)
5314     {
5315       if (skip_past_char (&p, '{') == SUCCESS)
5316         {
5317           /* [Rn], {expr} - unindexed, with option */
5318           if (parse_immediate (&p, &inst.operands[i].imm,
5319                                0, 255, TRUE) == FAIL)
5320             return PARSE_OPERAND_FAIL;
5321
5322           if (skip_past_char (&p, '}') == FAIL)
5323             {
5324               inst.error = _("'}' expected at end of 'option' field");
5325               return PARSE_OPERAND_FAIL;
5326             }
5327           if (inst.operands[i].preind)
5328             {
5329               inst.error = _("cannot combine index with option");
5330               return PARSE_OPERAND_FAIL;
5331             }
5332           *str = p;
5333           return PARSE_OPERAND_SUCCESS;
5334         }
5335       else
5336         {
5337           inst.operands[i].postind = 1;
5338           inst.operands[i].writeback = 1;
5339
5340           if (inst.operands[i].preind)
5341             {
5342               inst.error = _("cannot combine pre- and post-indexing");
5343               return PARSE_OPERAND_FAIL;
5344             }
5345
5346           if (*p == '+') p++;
5347           else if (*p == '-') p++, inst.operands[i].negative = 1;
5348
5349           if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5350             {
5351               /* We might be using the immediate for alignment already. If we
5352                  are, OR the register number into the low-order bits.  */
5353               if (inst.operands[i].immisalign)
5354                 inst.operands[i].imm |= reg;
5355               else
5356                 inst.operands[i].imm = reg;
5357               inst.operands[i].immisreg = 1;
5358
5359               if (skip_past_comma (&p) == SUCCESS)
5360                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5361                   return PARSE_OPERAND_FAIL;
5362             }
5363           else
5364             {
5365               char *q = p;
5366               if (inst.operands[i].negative)
5367                 {
5368                   inst.operands[i].negative = 0;
5369                   p--;
5370                 }
5371               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5372                 return PARSE_OPERAND_FAIL;
5373               /* If the offset is 0, find out if it's a +0 or -0.  */
5374               if (inst.reloc.exp.X_op == O_constant
5375                   && inst.reloc.exp.X_add_number == 0)
5376                 {
5377                   skip_whitespace (q);
5378                   if (*q == '#')
5379                     {
5380                       q++;
5381                       skip_whitespace (q);
5382                     }
5383                   if (*q == '-')
5384                     inst.operands[i].negative = 1;
5385                 }
5386             }
5387         }
5388     }
5389
5390   /* If at this point neither .preind nor .postind is set, we have a
5391      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
5392   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5393     {
5394       inst.operands[i].preind = 1;
5395       inst.reloc.exp.X_op = O_constant;
5396       inst.reloc.exp.X_add_number = 0;
5397     }
5398   *str = p;
5399   return PARSE_OPERAND_SUCCESS;
5400 }
5401
5402 static int
5403 parse_address (char **str, int i)
5404 {
5405   return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
5406          ? SUCCESS : FAIL;
5407 }
5408
5409 static parse_operand_result
5410 parse_address_group_reloc (char **str, int i, group_reloc_type type)
5411 {
5412   return parse_address_main (str, i, 1, type);
5413 }
5414
5415 /* Parse an operand for a MOVW or MOVT instruction.  */
5416 static int
5417 parse_half (char **str)
5418 {
5419   char * p;
5420
5421   p = *str;
5422   skip_past_char (&p, '#');
5423   if (strncasecmp (p, ":lower16:", 9) == 0)
5424     inst.reloc.type = BFD_RELOC_ARM_MOVW;
5425   else if (strncasecmp (p, ":upper16:", 9) == 0)
5426     inst.reloc.type = BFD_RELOC_ARM_MOVT;
5427
5428   if (inst.reloc.type != BFD_RELOC_UNUSED)
5429     {
5430       p += 9;
5431       skip_whitespace (p);
5432     }
5433
5434   if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5435     return FAIL;
5436
5437   if (inst.reloc.type == BFD_RELOC_UNUSED)
5438     {
5439       if (inst.reloc.exp.X_op != O_constant)
5440         {
5441           inst.error = _("constant expression expected");
5442           return FAIL;
5443         }
5444       if (inst.reloc.exp.X_add_number < 0
5445           || inst.reloc.exp.X_add_number > 0xffff)
5446         {
5447           inst.error = _("immediate value out of range");
5448           return FAIL;
5449         }
5450     }
5451   *str = p;
5452   return SUCCESS;
5453 }
5454
5455 /* Miscellaneous. */
5456
5457 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
5458    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
5459 static int
5460 parse_psr (char **str, bfd_boolean lhs)
5461 {
5462   char *p;
5463   unsigned long psr_field;
5464   const struct asm_psr *psr;
5465   char *start;
5466   bfd_boolean is_apsr = FALSE;
5467   bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
5468
5469   /* PR gas/12698:  If the user has specified -march=all then m_profile will
5470      be TRUE, but we want to ignore it in this case as we are building for any
5471      CPU type, including non-m variants.  */
5472   if (selected_cpu.core == arm_arch_any.core)
5473     m_profile = FALSE;
5474
5475   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
5476      feature for ease of use and backwards compatibility.  */
5477   p = *str;
5478   if (strncasecmp (p, "SPSR", 4) == 0)
5479     {
5480       if (m_profile)
5481         goto unsupported_psr;
5482
5483       psr_field = SPSR_BIT;
5484     }
5485   else if (strncasecmp (p, "CPSR", 4) == 0)
5486     {
5487       if (m_profile)
5488         goto unsupported_psr;
5489
5490       psr_field = 0;
5491     }
5492   else if (strncasecmp (p, "APSR", 4) == 0)
5493     {
5494       /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
5495          and ARMv7-R architecture CPUs.  */
5496       is_apsr = TRUE;
5497       psr_field = 0;
5498     }
5499   else if (m_profile)
5500     {
5501       start = p;
5502       do
5503         p++;
5504       while (ISALNUM (*p) || *p == '_');
5505
5506       if (strncasecmp (start, "iapsr", 5) == 0
5507           || strncasecmp (start, "eapsr", 5) == 0
5508           || strncasecmp (start, "xpsr", 4) == 0
5509           || strncasecmp (start, "psr", 3) == 0)
5510         p = start + strcspn (start, "rR") + 1;
5511
5512       psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5513                                                   p - start);
5514
5515       if (!psr)
5516         return FAIL;
5517
5518       /* If APSR is being written, a bitfield may be specified.  Note that
5519          APSR itself is handled above.  */
5520       if (psr->field <= 3)
5521         {
5522           psr_field = psr->field;
5523           is_apsr = TRUE;
5524           goto check_suffix;
5525         }
5526
5527       *str = p;
5528       /* M-profile MSR instructions have the mask field set to "10", except
5529          *PSR variants which modify APSR, which may use a different mask (and
5530          have been handled already).  Do that by setting the PSR_f field
5531          here.  */
5532       return psr->field | (lhs ? PSR_f : 0);
5533     }
5534   else
5535     goto unsupported_psr;
5536
5537   p += 4;
5538 check_suffix:
5539   if (*p == '_')
5540     {
5541       /* A suffix follows.  */
5542       p++;
5543       start = p;
5544
5545       do
5546         p++;
5547       while (ISALNUM (*p) || *p == '_');
5548
5549       if (is_apsr)
5550         {
5551           /* APSR uses a notation for bits, rather than fields.  */
5552           unsigned int nzcvq_bits = 0;
5553           unsigned int g_bit = 0;
5554           char *bit;
5555
5556           for (bit = start; bit != p; bit++)
5557             {
5558               switch (TOLOWER (*bit))
5559                 {
5560                 case 'n':
5561                   nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
5562                   break;
5563
5564                 case 'z':
5565                   nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
5566                   break;
5567
5568                 case 'c':
5569                   nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
5570                   break;
5571
5572                 case 'v':
5573                   nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
5574                   break;
5575
5576                 case 'q':
5577                   nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
5578                   break;
5579
5580                 case 'g':
5581                   g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
5582                   break;
5583
5584                 default:
5585                   inst.error = _("unexpected bit specified after APSR");
5586                   return FAIL;
5587                 }
5588             }
5589
5590           if (nzcvq_bits == 0x1f)
5591             psr_field |= PSR_f;
5592
5593           if (g_bit == 0x1)
5594             {
5595               if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
5596                 {
5597                   inst.error = _("selected processor does not "
5598                                  "support DSP extension");
5599                   return FAIL;
5600                 }
5601
5602               psr_field |= PSR_s;
5603             }
5604
5605           if ((nzcvq_bits & 0x20) != 0
5606               || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
5607               || (g_bit & 0x2) != 0)
5608             {
5609               inst.error = _("bad bitmask specified after APSR");
5610               return FAIL;
5611             }
5612         }
5613       else
5614         {
5615           psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5616                                                       p - start);
5617           if (!psr)
5618             goto error;
5619
5620           psr_field |= psr->field;
5621         }
5622     }
5623   else
5624     {
5625       if (ISALNUM (*p))
5626         goto error;    /* Garbage after "[CS]PSR".  */
5627
5628       /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes).  This
5629          is deprecated, but allow it anyway.  */
5630       if (is_apsr && lhs)
5631         {
5632           psr_field |= PSR_f;
5633           as_tsktsk (_("writing to APSR without specifying a bitmask is "
5634                        "deprecated"));
5635         }
5636       else if (!m_profile)
5637         /* These bits are never right for M-profile devices: don't set them
5638            (only code paths which read/write APSR reach here).  */
5639         psr_field |= (PSR_c | PSR_f);
5640     }
5641   *str = p;
5642   return psr_field;
5643
5644  unsupported_psr:
5645   inst.error = _("selected processor does not support requested special "
5646                  "purpose register");
5647   return FAIL;
5648
5649  error:
5650   inst.error = _("flag for {c}psr instruction expected");
5651   return FAIL;
5652 }
5653
5654 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
5655    value suitable for splatting into the AIF field of the instruction.  */
5656
5657 static int
5658 parse_cps_flags (char **str)
5659 {
5660   int val = 0;
5661   int saw_a_flag = 0;
5662   char *s = *str;
5663
5664   for (;;)
5665     switch (*s++)
5666       {
5667       case '\0': case ',':
5668         goto done;
5669
5670       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5671       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5672       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
5673
5674       default:
5675         inst.error = _("unrecognized CPS flag");
5676         return FAIL;
5677       }
5678
5679  done:
5680   if (saw_a_flag == 0)
5681     {
5682       inst.error = _("missing CPS flags");
5683       return FAIL;
5684     }
5685
5686   *str = s - 1;
5687   return val;
5688 }
5689
5690 /* Parse an endian specifier ("BE" or "LE", case insensitive);
5691    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
5692
5693 static int
5694 parse_endian_specifier (char **str)
5695 {
5696   int little_endian;
5697   char *s = *str;
5698
5699   if (strncasecmp (s, "BE", 2))
5700     little_endian = 0;
5701   else if (strncasecmp (s, "LE", 2))
5702     little_endian = 1;
5703   else
5704     {
5705       inst.error = _("valid endian specifiers are be or le");
5706       return FAIL;
5707     }
5708
5709   if (ISALNUM (s[2]) || s[2] == '_')
5710     {
5711       inst.error = _("valid endian specifiers are be or le");
5712       return FAIL;
5713     }
5714
5715   *str = s + 2;
5716   return little_endian;
5717 }
5718
5719 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
5720    value suitable for poking into the rotate field of an sxt or sxta
5721    instruction, or FAIL on error.  */
5722
5723 static int
5724 parse_ror (char **str)
5725 {
5726   int rot;
5727   char *s = *str;
5728
5729   if (strncasecmp (s, "ROR", 3) == 0)
5730     s += 3;
5731   else
5732     {
5733       inst.error = _("missing rotation field after comma");
5734       return FAIL;
5735     }
5736
5737   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5738     return FAIL;
5739
5740   switch (rot)
5741     {
5742     case  0: *str = s; return 0x0;
5743     case  8: *str = s; return 0x1;
5744     case 16: *str = s; return 0x2;
5745     case 24: *str = s; return 0x3;
5746
5747     default:
5748       inst.error = _("rotation can only be 0, 8, 16, or 24");
5749       return FAIL;
5750     }
5751 }
5752
5753 /* Parse a conditional code (from conds[] below).  The value returned is in the
5754    range 0 .. 14, or FAIL.  */
5755 static int
5756 parse_cond (char **str)
5757 {
5758   char *q;
5759   const struct asm_cond *c;
5760   int n;
5761   /* Condition codes are always 2 characters, so matching up to
5762      3 characters is sufficient.  */
5763   char cond[3];
5764
5765   q = *str;
5766   n = 0;
5767   while (ISALPHA (*q) && n < 3)
5768     {
5769       cond[n] = TOLOWER (*q);
5770       q++;
5771       n++;
5772     }
5773
5774   c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
5775   if (!c)
5776     {
5777       inst.error = _("condition required");
5778       return FAIL;
5779     }
5780
5781   *str = q;
5782   return c->value;
5783 }
5784
5785 /* If the given feature available in the selected CPU, mark it as used.
5786    Returns TRUE iff feature is available.  */
5787 static bfd_boolean
5788 mark_feature_used (const arm_feature_set *feature)
5789 {
5790   /* Ensure the option is valid on the current architecture.  */
5791   if (!ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
5792     return FALSE;
5793
5794   /* Add the appropriate architecture feature for the barrier option used.
5795      */
5796   if (thumb_mode)
5797     ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, *feature);
5798   else
5799     ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, *feature);
5800
5801   return TRUE;
5802 }
5803
5804 /* Parse an option for a barrier instruction.  Returns the encoding for the
5805    option, or FAIL.  */
5806 static int
5807 parse_barrier (char **str)
5808 {
5809   char *p, *q;
5810   const struct asm_barrier_opt *o;
5811
5812   p = q = *str;
5813   while (ISALPHA (*q))
5814     q++;
5815
5816   o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
5817                                                     q - p);
5818   if (!o)
5819     return FAIL;
5820
5821   if (!mark_feature_used (&o->arch))
5822     return FAIL;
5823
5824   *str = q;
5825   return o->value;
5826 }
5827
5828 /* Parse the operands of a table branch instruction.  Similar to a memory
5829    operand.  */
5830 static int
5831 parse_tb (char **str)
5832 {
5833   char * p = *str;
5834   int reg;
5835
5836   if (skip_past_char (&p, '[') == FAIL)
5837     {
5838       inst.error = _("'[' expected");
5839       return FAIL;
5840     }
5841
5842   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5843     {
5844       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5845       return FAIL;
5846     }
5847   inst.operands[0].reg = reg;
5848
5849   if (skip_past_comma (&p) == FAIL)
5850     {
5851       inst.error = _("',' expected");
5852       return FAIL;
5853     }
5854
5855   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5856     {
5857       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5858       return FAIL;
5859     }
5860   inst.operands[0].imm = reg;
5861
5862   if (skip_past_comma (&p) == SUCCESS)
5863     {
5864       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5865         return FAIL;
5866       if (inst.reloc.exp.X_add_number != 1)
5867         {
5868           inst.error = _("invalid shift");
5869           return FAIL;
5870         }
5871       inst.operands[0].shifted = 1;
5872     }
5873
5874   if (skip_past_char (&p, ']') == FAIL)
5875     {
5876       inst.error = _("']' expected");
5877       return FAIL;
5878     }
5879   *str = p;
5880   return SUCCESS;
5881 }
5882
5883 /* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5884    information on the types the operands can take and how they are encoded.
5885    Up to four operands may be read; this function handles setting the
5886    ".present" field for each read operand itself.
5887    Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5888    else returns FAIL.  */
5889
5890 static int
5891 parse_neon_mov (char **str, int *which_operand)
5892 {
5893   int i = *which_operand, val;
5894   enum arm_reg_type rtype;
5895   char *ptr = *str;
5896   struct neon_type_el optype;
5897
5898   if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5899     {
5900       /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
5901       inst.operands[i].reg = val;
5902       inst.operands[i].isscalar = 1;
5903       inst.operands[i].vectype = optype;
5904       inst.operands[i++].present = 1;
5905
5906       if (skip_past_comma (&ptr) == FAIL)
5907         goto wanted_comma;
5908
5909       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5910         goto wanted_arm;
5911
5912       inst.operands[i].reg = val;
5913       inst.operands[i].isreg = 1;
5914       inst.operands[i].present = 1;
5915     }
5916   else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
5917            != FAIL)
5918     {
5919       /* Cases 0, 1, 2, 3, 5 (D only).  */
5920       if (skip_past_comma (&ptr) == FAIL)
5921         goto wanted_comma;
5922
5923       inst.operands[i].reg = val;
5924       inst.operands[i].isreg = 1;
5925       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5926       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5927       inst.operands[i].isvec = 1;
5928       inst.operands[i].vectype = optype;
5929       inst.operands[i++].present = 1;
5930
5931       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5932         {
5933           /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5934              Case 13: VMOV <Sd>, <Rm>  */
5935           inst.operands[i].reg = val;
5936           inst.operands[i].isreg = 1;
5937           inst.operands[i].present = 1;
5938
5939           if (rtype == REG_TYPE_NQ)
5940             {
5941               first_error (_("can't use Neon quad register here"));
5942               return FAIL;
5943             }
5944           else if (rtype != REG_TYPE_VFS)
5945             {
5946               i++;
5947               if (skip_past_comma (&ptr) == FAIL)
5948                 goto wanted_comma;
5949               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5950                 goto wanted_arm;
5951               inst.operands[i].reg = val;
5952               inst.operands[i].isreg = 1;
5953               inst.operands[i].present = 1;
5954             }
5955         }
5956       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
5957                                            &optype)) != FAIL)
5958         {
5959           /* Case 0: VMOV<c><q> <Qd>, <Qm>
5960              Case 1: VMOV<c><q> <Dd>, <Dm>
5961              Case 8: VMOV.F32 <Sd>, <Sm>
5962              Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
5963
5964           inst.operands[i].reg = val;
5965           inst.operands[i].isreg = 1;
5966           inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5967           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5968           inst.operands[i].isvec = 1;
5969           inst.operands[i].vectype = optype;
5970           inst.operands[i].present = 1;
5971
5972           if (skip_past_comma (&ptr) == SUCCESS)
5973             {
5974               /* Case 15.  */
5975               i++;
5976
5977               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5978                 goto wanted_arm;
5979
5980               inst.operands[i].reg = val;
5981               inst.operands[i].isreg = 1;
5982               inst.operands[i++].present = 1;
5983
5984               if (skip_past_comma (&ptr) == FAIL)
5985                 goto wanted_comma;
5986
5987               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5988                 goto wanted_arm;
5989
5990               inst.operands[i].reg = val;
5991               inst.operands[i].isreg = 1;
5992               inst.operands[i].present = 1;
5993             }
5994         }
5995       else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
5996           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
5997              Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
5998              Case 10: VMOV.F32 <Sd>, #<imm>
5999              Case 11: VMOV.F64 <Dd>, #<imm>  */
6000         inst.operands[i].immisfloat = 1;
6001       else if (parse_big_immediate (&ptr, i) == SUCCESS)
6002           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
6003              Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
6004         ;
6005       else
6006         {
6007           first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
6008           return FAIL;
6009         }
6010     }
6011   else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6012     {
6013       /* Cases 6, 7.  */
6014       inst.operands[i].reg = val;
6015       inst.operands[i].isreg = 1;
6016       inst.operands[i++].present = 1;
6017
6018       if (skip_past_comma (&ptr) == FAIL)
6019         goto wanted_comma;
6020
6021       if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
6022         {
6023           /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
6024           inst.operands[i].reg = val;
6025           inst.operands[i].isscalar = 1;
6026           inst.operands[i].present = 1;
6027           inst.operands[i].vectype = optype;
6028         }
6029       else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6030         {
6031           /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
6032           inst.operands[i].reg = val;
6033           inst.operands[i].isreg = 1;
6034           inst.operands[i++].present = 1;
6035
6036           if (skip_past_comma (&ptr) == FAIL)
6037             goto wanted_comma;
6038
6039           if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
6040               == FAIL)
6041             {
6042               first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
6043               return FAIL;
6044             }
6045
6046           inst.operands[i].reg = val;
6047           inst.operands[i].isreg = 1;
6048           inst.operands[i].isvec = 1;
6049           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6050           inst.operands[i].vectype = optype;
6051           inst.operands[i].present = 1;
6052
6053           if (rtype == REG_TYPE_VFS)
6054             {
6055               /* Case 14.  */
6056               i++;
6057               if (skip_past_comma (&ptr) == FAIL)
6058                 goto wanted_comma;
6059               if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
6060                                               &optype)) == FAIL)
6061                 {
6062                   first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
6063                   return FAIL;
6064                 }
6065               inst.operands[i].reg = val;
6066               inst.operands[i].isreg = 1;
6067               inst.operands[i].isvec = 1;
6068               inst.operands[i].issingle = 1;
6069               inst.operands[i].vectype = optype;
6070               inst.operands[i].present = 1;
6071             }
6072         }
6073       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
6074                != FAIL)
6075         {
6076           /* Case 13.  */
6077           inst.operands[i].reg = val;
6078           inst.operands[i].isreg = 1;
6079           inst.operands[i].isvec = 1;
6080           inst.operands[i].issingle = 1;
6081           inst.operands[i].vectype = optype;
6082           inst.operands[i].present = 1;
6083         }
6084     }
6085   else
6086     {
6087       first_error (_("parse error"));
6088       return FAIL;
6089     }
6090
6091   /* Successfully parsed the operands. Update args.  */
6092   *which_operand = i;
6093   *str = ptr;
6094   return SUCCESS;
6095
6096  wanted_comma:
6097   first_error (_("expected comma"));
6098   return FAIL;
6099
6100  wanted_arm:
6101   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
6102   return FAIL;
6103 }
6104
6105 /* Use this macro when the operand constraints are different
6106    for ARM and THUMB (e.g. ldrd).  */
6107 #define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6108         ((arm_operand) | ((thumb_operand) << 16))
6109
6110 /* Matcher codes for parse_operands.  */
6111 enum operand_parse_code
6112 {
6113   OP_stop,      /* end of line */
6114
6115   OP_RR,        /* ARM register */
6116   OP_RRnpc,     /* ARM register, not r15 */
6117   OP_RRnpcsp,   /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
6118   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
6119   OP_RRnpctw,   /* ARM register, not r15 in Thumb-state or with writeback,
6120                    optional trailing ! */
6121   OP_RRw,       /* ARM register, not r15, optional trailing ! */
6122   OP_RCP,       /* Coprocessor number */
6123   OP_RCN,       /* Coprocessor register */
6124   OP_RF,        /* FPA register */
6125   OP_RVS,       /* VFP single precision register */
6126   OP_RVD,       /* VFP double precision register (0..15) */
6127   OP_RND,       /* Neon double precision register (0..31) */
6128   OP_RNQ,       /* Neon quad precision register */
6129   OP_RVSD,      /* VFP single or double precision register */
6130   OP_RNDQ,      /* Neon double or quad precision register */
6131   OP_RNSDQ,     /* Neon single, double or quad precision register */
6132   OP_RNSC,      /* Neon scalar D[X] */
6133   OP_RVC,       /* VFP control register */
6134   OP_RMF,       /* Maverick F register */
6135   OP_RMD,       /* Maverick D register */
6136   OP_RMFX,      /* Maverick FX register */
6137   OP_RMDX,      /* Maverick DX register */
6138   OP_RMAX,      /* Maverick AX register */
6139   OP_RMDS,      /* Maverick DSPSC register */
6140   OP_RIWR,      /* iWMMXt wR register */
6141   OP_RIWC,      /* iWMMXt wC register */
6142   OP_RIWG,      /* iWMMXt wCG register */
6143   OP_RXA,       /* XScale accumulator register */
6144
6145   OP_REGLST,    /* ARM register list */
6146   OP_VRSLST,    /* VFP single-precision register list */
6147   OP_VRDLST,    /* VFP double-precision register list */
6148   OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
6149   OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
6150   OP_NSTRLST,   /* Neon element/structure list */
6151
6152   OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
6153   OP_RVSD_I0,   /* VFP S or D reg, or immediate zero.  */
6154   OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
6155   OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
6156   OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
6157   OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
6158   OP_VMOV,      /* Neon VMOV operands.  */
6159   OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN.  */
6160   OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
6161   OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
6162
6163   OP_I0,        /* immediate zero */
6164   OP_I7,        /* immediate value 0 .. 7 */
6165   OP_I15,       /*                 0 .. 15 */
6166   OP_I16,       /*                 1 .. 16 */
6167   OP_I16z,      /*                 0 .. 16 */
6168   OP_I31,       /*                 0 .. 31 */
6169   OP_I31w,      /*                 0 .. 31, optional trailing ! */
6170   OP_I32,       /*                 1 .. 32 */
6171   OP_I32z,      /*                 0 .. 32 */
6172   OP_I63,       /*                 0 .. 63 */
6173   OP_I63s,      /*               -64 .. 63 */
6174   OP_I64,       /*                 1 .. 64 */
6175   OP_I64z,      /*                 0 .. 64 */
6176   OP_I255,      /*                 0 .. 255 */
6177
6178   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
6179   OP_I7b,       /*                             0 .. 7 */
6180   OP_I15b,      /*                             0 .. 15 */
6181   OP_I31b,      /*                             0 .. 31 */
6182
6183   OP_SH,        /* shifter operand */
6184   OP_SHG,       /* shifter operand with possible group relocation */
6185   OP_ADDR,      /* Memory address expression (any mode) */
6186   OP_ADDRGLDR,  /* Mem addr expr (any mode) with possible LDR group reloc */
6187   OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6188   OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
6189   OP_EXP,       /* arbitrary expression */
6190   OP_EXPi,      /* same, with optional immediate prefix */
6191   OP_EXPr,      /* same, with optional relocation suffix */
6192   OP_HALF,      /* 0 .. 65535 or low/high reloc.  */
6193
6194   OP_CPSF,      /* CPS flags */
6195   OP_ENDI,      /* Endianness specifier */
6196   OP_wPSR,      /* CPSR/SPSR/APSR mask for msr (writing).  */
6197   OP_rPSR,      /* CPSR/SPSR/APSR mask for msr (reading).  */
6198   OP_COND,      /* conditional code */
6199   OP_TB,        /* Table branch.  */
6200
6201   OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
6202
6203   OP_RRnpc_I0,  /* ARM register or literal 0 */
6204   OP_RR_EXr,    /* ARM register or expression with opt. reloc suff. */
6205   OP_RR_EXi,    /* ARM register or expression with imm prefix */
6206   OP_RF_IF,     /* FPA register or immediate */
6207   OP_RIWR_RIWC, /* iWMMXt R or C reg */
6208   OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
6209
6210   /* Optional operands.  */
6211   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
6212   OP_oI31b,      /*                             0 .. 31 */
6213   OP_oI32b,      /*                             1 .. 32 */
6214   OP_oI32z,      /*                             0 .. 32 */
6215   OP_oIffffb,    /*                             0 .. 65535 */
6216   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
6217
6218   OP_oRR,        /* ARM register */
6219   OP_oRRnpc,     /* ARM register, not the PC */
6220   OP_oRRnpcsp,   /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
6221   OP_oRRw,       /* ARM register, not r15, optional trailing ! */
6222   OP_oRND,       /* Optional Neon double precision register */
6223   OP_oRNQ,       /* Optional Neon quad precision register */
6224   OP_oRNDQ,      /* Optional Neon double or quad precision register */
6225   OP_oRNSDQ,     /* Optional single, double or quad precision vector register */
6226   OP_oSHll,      /* LSL immediate */
6227   OP_oSHar,      /* ASR immediate */
6228   OP_oSHllar,    /* LSL or ASR immediate */
6229   OP_oROR,       /* ROR 0/8/16/24 */
6230   OP_oBARRIER_I15, /* Option argument for a barrier instruction.  */
6231
6232   /* Some pre-defined mixed (ARM/THUMB) operands.  */
6233   OP_RR_npcsp           = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
6234   OP_RRnpc_npcsp        = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
6235   OP_oRRnpc_npcsp       = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
6236
6237   OP_FIRST_OPTIONAL = OP_oI7b
6238 };
6239
6240 /* Generic instruction operand parser.  This does no encoding and no
6241    semantic validation; it merely squirrels values away in the inst
6242    structure.  Returns SUCCESS or FAIL depending on whether the
6243    specified grammar matched.  */
6244 static int
6245 parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
6246 {
6247   unsigned const int *upat = pattern;
6248   char *backtrack_pos = 0;
6249   const char *backtrack_error = 0;
6250   int i, val = 0, backtrack_index = 0;
6251   enum arm_reg_type rtype;
6252   parse_operand_result result;
6253   unsigned int op_parse_code;
6254
6255 #define po_char_or_fail(chr)                    \
6256   do                                            \
6257     {                                           \
6258       if (skip_past_char (&str, chr) == FAIL)   \
6259         goto bad_args;                          \
6260     }                                           \
6261   while (0)
6262
6263 #define po_reg_or_fail(regtype)                                 \
6264   do                                                            \
6265     {                                                           \
6266       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6267                                  & inst.operands[i].vectype);   \
6268       if (val == FAIL)                                          \
6269         {                                                       \
6270           first_error (_(reg_expected_msgs[regtype]));          \
6271           goto failure;                                         \
6272         }                                                       \
6273       inst.operands[i].reg = val;                               \
6274       inst.operands[i].isreg = 1;                               \
6275       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6276       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6277       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6278                              || rtype == REG_TYPE_VFD           \
6279                              || rtype == REG_TYPE_NQ);          \
6280     }                                                           \
6281   while (0)
6282
6283 #define po_reg_or_goto(regtype, label)                          \
6284   do                                                            \
6285     {                                                           \
6286       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6287                                  & inst.operands[i].vectype);   \
6288       if (val == FAIL)                                          \
6289         goto label;                                             \
6290                                                                 \
6291       inst.operands[i].reg = val;                               \
6292       inst.operands[i].isreg = 1;                               \
6293       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6294       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6295       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6296                              || rtype == REG_TYPE_VFD           \
6297                              || rtype == REG_TYPE_NQ);          \
6298     }                                                           \
6299   while (0)
6300
6301 #define po_imm_or_fail(min, max, popt)                          \
6302   do                                                            \
6303     {                                                           \
6304       if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
6305         goto failure;                                           \
6306       inst.operands[i].imm = val;                               \
6307     }                                                           \
6308   while (0)
6309
6310 #define po_scalar_or_goto(elsz, label)                                  \
6311   do                                                                    \
6312     {                                                                   \
6313       val = parse_scalar (& str, elsz, & inst.operands[i].vectype);     \
6314       if (val == FAIL)                                                  \
6315         goto label;                                                     \
6316       inst.operands[i].reg = val;                                       \
6317       inst.operands[i].isscalar = 1;                                    \
6318     }                                                                   \
6319   while (0)
6320
6321 #define po_misc_or_fail(expr)                   \
6322   do                                            \
6323     {                                           \
6324       if (expr)                                 \
6325         goto failure;                           \
6326     }                                           \
6327   while (0)
6328
6329 #define po_misc_or_fail_no_backtrack(expr)              \
6330   do                                                    \
6331     {                                                   \
6332       result = expr;                                    \
6333       if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)    \
6334         backtrack_pos = 0;                              \
6335       if (result != PARSE_OPERAND_SUCCESS)              \
6336         goto failure;                                   \
6337     }                                                   \
6338   while (0)
6339
6340 #define po_barrier_or_imm(str)                             \
6341   do                                                       \
6342     {                                                      \
6343       val = parse_barrier (&str);                          \
6344       if (val == FAIL && ! ISALPHA (*str))                 \
6345         goto immediate;                                    \
6346       if (val == FAIL                                      \
6347           /* ISB can only take SY as an option.  */        \
6348           || ((inst.instruction & 0xf0) == 0x60            \
6349                && val != 0xf))                             \
6350         {                                                  \
6351            inst.error = _("invalid barrier type");         \
6352            backtrack_pos = 0;                              \
6353            goto failure;                                   \
6354         }                                                  \
6355     }                                                      \
6356   while (0)
6357
6358   skip_whitespace (str);
6359
6360   for (i = 0; upat[i] != OP_stop; i++)
6361     {
6362       op_parse_code = upat[i];
6363       if (op_parse_code >= 1<<16)
6364         op_parse_code = thumb ? (op_parse_code >> 16)
6365                                 : (op_parse_code & ((1<<16)-1));
6366
6367       if (op_parse_code >= OP_FIRST_OPTIONAL)
6368         {
6369           /* Remember where we are in case we need to backtrack.  */
6370           gas_assert (!backtrack_pos);
6371           backtrack_pos = str;
6372           backtrack_error = inst.error;
6373           backtrack_index = i;
6374         }
6375
6376       if (i > 0 && (i > 1 || inst.operands[0].present))
6377         po_char_or_fail (',');
6378
6379       switch (op_parse_code)
6380         {
6381           /* Registers */
6382         case OP_oRRnpc:
6383         case OP_oRRnpcsp:
6384         case OP_RRnpc:
6385         case OP_RRnpcsp:
6386         case OP_oRR:
6387         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
6388         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
6389         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
6390         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
6391         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
6392         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
6393         case OP_oRND:
6394         case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);     break;
6395         case OP_RVC:
6396           po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6397           break;
6398           /* Also accept generic coprocessor regs for unknown registers.  */
6399           coproc_reg:
6400           po_reg_or_fail (REG_TYPE_CN);
6401           break;
6402         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
6403         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
6404         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
6405         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
6406         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
6407         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
6408         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
6409         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
6410         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
6411         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
6412         case OP_oRNQ:
6413         case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
6414         case OP_oRNDQ:
6415         case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
6416         case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
6417         case OP_oRNSDQ:
6418         case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
6419
6420         /* Neon scalar. Using an element size of 8 means that some invalid
6421            scalars are accepted here, so deal with those in later code.  */
6422         case OP_RNSC:  po_scalar_or_goto (8, failure);    break;
6423
6424         case OP_RNDQ_I0:
6425           {
6426             po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6427             break;
6428             try_imm0:
6429             po_imm_or_fail (0, 0, TRUE);
6430           }
6431           break;
6432
6433         case OP_RVSD_I0:
6434           po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6435           break;
6436
6437         case OP_RR_RNSC:
6438           {
6439             po_scalar_or_goto (8, try_rr);
6440             break;
6441             try_rr:
6442             po_reg_or_fail (REG_TYPE_RN);
6443           }
6444           break;
6445
6446         case OP_RNSDQ_RNSC:
6447           {
6448             po_scalar_or_goto (8, try_nsdq);
6449             break;
6450             try_nsdq:
6451             po_reg_or_fail (REG_TYPE_NSDQ);
6452           }
6453           break;
6454
6455         case OP_RNDQ_RNSC:
6456           {
6457             po_scalar_or_goto (8, try_ndq);
6458             break;
6459             try_ndq:
6460             po_reg_or_fail (REG_TYPE_NDQ);
6461           }
6462           break;
6463
6464         case OP_RND_RNSC:
6465           {
6466             po_scalar_or_goto (8, try_vfd);
6467             break;
6468             try_vfd:
6469             po_reg_or_fail (REG_TYPE_VFD);
6470           }
6471           break;
6472
6473         case OP_VMOV:
6474           /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6475              not careful then bad things might happen.  */
6476           po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6477           break;
6478
6479         case OP_RNDQ_Ibig:
6480           {
6481             po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
6482             break;
6483             try_immbig:
6484             /* There's a possibility of getting a 64-bit immediate here, so
6485                we need special handling.  */
6486             if (parse_big_immediate (&str, i) == FAIL)
6487               {
6488                 inst.error = _("immediate value is out of range");
6489                 goto failure;
6490               }
6491           }
6492           break;
6493
6494         case OP_RNDQ_I63b:
6495           {
6496             po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6497             break;
6498             try_shimm:
6499             po_imm_or_fail (0, 63, TRUE);
6500           }
6501           break;
6502
6503         case OP_RRnpcb:
6504           po_char_or_fail ('[');
6505           po_reg_or_fail  (REG_TYPE_RN);
6506           po_char_or_fail (']');
6507           break;
6508
6509         case OP_RRnpctw:
6510         case OP_RRw:
6511         case OP_oRRw:
6512           po_reg_or_fail (REG_TYPE_RN);
6513           if (skip_past_char (&str, '!') == SUCCESS)
6514             inst.operands[i].writeback = 1;
6515           break;
6516
6517           /* Immediates */
6518         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
6519         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
6520         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
6521         case OP_I16z:    po_imm_or_fail (  0,     16, FALSE);   break;
6522         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
6523         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
6524         case OP_I32z:    po_imm_or_fail (  0,     32, FALSE);   break;
6525         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
6526         case OP_I63:     po_imm_or_fail (  0,     63, FALSE);   break;
6527         case OP_I64:     po_imm_or_fail (  1,     64, FALSE);   break;
6528         case OP_I64z:    po_imm_or_fail (  0,     64, FALSE);   break;
6529         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
6530
6531         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
6532         case OP_oI7b:
6533         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
6534         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
6535         case OP_oI31b:
6536         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
6537         case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
6538         case OP_oI32z:   po_imm_or_fail (  0,     32, TRUE);    break;
6539         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
6540
6541           /* Immediate variants */
6542         case OP_oI255c:
6543           po_char_or_fail ('{');
6544           po_imm_or_fail (0, 255, TRUE);
6545           po_char_or_fail ('}');
6546           break;
6547
6548         case OP_I31w:
6549           /* The expression parser chokes on a trailing !, so we have
6550              to find it first and zap it.  */
6551           {
6552             char *s = str;
6553             while (*s && *s != ',')
6554               s++;
6555             if (s[-1] == '!')
6556               {
6557                 s[-1] = '\0';
6558                 inst.operands[i].writeback = 1;
6559               }
6560             po_imm_or_fail (0, 31, TRUE);
6561             if (str == s - 1)
6562               str = s;
6563           }
6564           break;
6565
6566           /* Expressions */
6567         case OP_EXPi:   EXPi:
6568           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6569                                               GE_OPT_PREFIX));
6570           break;
6571
6572         case OP_EXP:
6573           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6574                                               GE_NO_PREFIX));
6575           break;
6576
6577         case OP_EXPr:   EXPr:
6578           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6579                                               GE_NO_PREFIX));
6580           if (inst.reloc.exp.X_op == O_symbol)
6581             {
6582               val = parse_reloc (&str);
6583               if (val == -1)
6584                 {
6585                   inst.error = _("unrecognized relocation suffix");
6586                   goto failure;
6587                 }
6588               else if (val != BFD_RELOC_UNUSED)
6589                 {
6590                   inst.operands[i].imm = val;
6591                   inst.operands[i].hasreloc = 1;
6592                 }
6593             }
6594           break;
6595
6596           /* Operand for MOVW or MOVT.  */
6597         case OP_HALF:
6598           po_misc_or_fail (parse_half (&str));
6599           break;
6600
6601           /* Register or expression.  */
6602         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6603         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
6604
6605           /* Register or immediate.  */
6606         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
6607         I0:               po_imm_or_fail (0, 0, FALSE);       break;
6608
6609         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
6610         IF:
6611           if (!is_immediate_prefix (*str))
6612             goto bad_args;
6613           str++;
6614           val = parse_fpa_immediate (&str);
6615           if (val == FAIL)
6616             goto failure;
6617           /* FPA immediates are encoded as registers 8-15.
6618              parse_fpa_immediate has already applied the offset.  */
6619           inst.operands[i].reg = val;
6620           inst.operands[i].isreg = 1;
6621           break;
6622
6623         case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6624         I32z:             po_imm_or_fail (0, 32, FALSE);          break;
6625
6626           /* Two kinds of register.  */
6627         case OP_RIWR_RIWC:
6628           {
6629             struct reg_entry *rege = arm_reg_parse_multi (&str);
6630             if (!rege
6631                 || (rege->type != REG_TYPE_MMXWR
6632                     && rege->type != REG_TYPE_MMXWC
6633                     && rege->type != REG_TYPE_MMXWCG))
6634               {
6635                 inst.error = _("iWMMXt data or control register expected");
6636                 goto failure;
6637               }
6638             inst.operands[i].reg = rege->number;
6639             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6640           }
6641           break;
6642
6643         case OP_RIWC_RIWG:
6644           {
6645             struct reg_entry *rege = arm_reg_parse_multi (&str);
6646             if (!rege
6647                 || (rege->type != REG_TYPE_MMXWC
6648                     && rege->type != REG_TYPE_MMXWCG))
6649               {
6650                 inst.error = _("iWMMXt control register expected");
6651                 goto failure;
6652               }
6653             inst.operands[i].reg = rege->number;
6654             inst.operands[i].isreg = 1;
6655           }
6656           break;
6657
6658           /* Misc */
6659         case OP_CPSF:    val = parse_cps_flags (&str);          break;
6660         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
6661         case OP_oROR:    val = parse_ror (&str);                break;
6662         case OP_COND:    val = parse_cond (&str);               break;
6663         case OP_oBARRIER_I15:
6664           po_barrier_or_imm (str); break;
6665           immediate:
6666           if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
6667             goto failure;
6668           break;
6669
6670         case OP_wPSR:
6671         case OP_rPSR:
6672           po_reg_or_goto (REG_TYPE_RNB, try_psr);
6673           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
6674             {
6675               inst.error = _("Banked registers are not available with this "
6676                              "architecture.");
6677               goto failure;
6678             }
6679           break;
6680           try_psr:
6681           val = parse_psr (&str, op_parse_code == OP_wPSR);
6682           break;
6683
6684         case OP_APSR_RR:
6685           po_reg_or_goto (REG_TYPE_RN, try_apsr);
6686           break;
6687           try_apsr:
6688           /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6689              instruction).  */
6690           if (strncasecmp (str, "APSR_", 5) == 0)
6691             {
6692               unsigned found = 0;
6693               str += 5;
6694               while (found < 15)
6695                 switch (*str++)
6696                   {
6697                   case 'c': found = (found & 1) ? 16 : found | 1; break;
6698                   case 'n': found = (found & 2) ? 16 : found | 2; break;
6699                   case 'z': found = (found & 4) ? 16 : found | 4; break;
6700                   case 'v': found = (found & 8) ? 16 : found | 8; break;
6701                   default: found = 16;
6702                   }
6703               if (found != 15)
6704                 goto failure;
6705               inst.operands[i].isvec = 1;
6706               /* APSR_nzcv is encoded in instructions as if it were the REG_PC.  */
6707               inst.operands[i].reg = REG_PC;
6708             }
6709           else
6710             goto failure;
6711           break;
6712
6713         case OP_TB:
6714           po_misc_or_fail (parse_tb (&str));
6715           break;
6716
6717           /* Register lists.  */
6718         case OP_REGLST:
6719           val = parse_reg_list (&str);
6720           if (*str == '^')
6721             {
6722               inst.operands[1].writeback = 1;
6723               str++;
6724             }
6725           break;
6726
6727         case OP_VRSLST:
6728           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
6729           break;
6730
6731         case OP_VRDLST:
6732           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
6733           break;
6734
6735         case OP_VRSDLST:
6736           /* Allow Q registers too.  */
6737           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6738                                     REGLIST_NEON_D);
6739           if (val == FAIL)
6740             {
6741               inst.error = NULL;
6742               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6743                                         REGLIST_VFP_S);
6744               inst.operands[i].issingle = 1;
6745             }
6746           break;
6747
6748         case OP_NRDLST:
6749           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6750                                     REGLIST_NEON_D);
6751           break;
6752
6753         case OP_NSTRLST:
6754           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6755                                            &inst.operands[i].vectype);
6756           break;
6757
6758           /* Addressing modes */
6759         case OP_ADDR:
6760           po_misc_or_fail (parse_address (&str, i));
6761           break;
6762
6763         case OP_ADDRGLDR:
6764           po_misc_or_fail_no_backtrack (
6765             parse_address_group_reloc (&str, i, GROUP_LDR));
6766           break;
6767
6768         case OP_ADDRGLDRS:
6769           po_misc_or_fail_no_backtrack (
6770             parse_address_group_reloc (&str, i, GROUP_LDRS));
6771           break;
6772
6773         case OP_ADDRGLDC:
6774           po_misc_or_fail_no_backtrack (
6775             parse_address_group_reloc (&str, i, GROUP_LDC));
6776           break;
6777
6778         case OP_SH:
6779           po_misc_or_fail (parse_shifter_operand (&str, i));
6780           break;
6781
6782         case OP_SHG:
6783           po_misc_or_fail_no_backtrack (
6784             parse_shifter_operand_group_reloc (&str, i));
6785           break;
6786
6787         case OP_oSHll:
6788           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6789           break;
6790
6791         case OP_oSHar:
6792           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6793           break;
6794
6795         case OP_oSHllar:
6796           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6797           break;
6798
6799         default:
6800           as_fatal (_("unhandled operand code %d"), op_parse_code);
6801         }
6802
6803       /* Various value-based sanity checks and shared operations.  We
6804          do not signal immediate failures for the register constraints;
6805          this allows a syntax error to take precedence.  */
6806       switch (op_parse_code)
6807         {
6808         case OP_oRRnpc:
6809         case OP_RRnpc:
6810         case OP_RRnpcb:
6811         case OP_RRw:
6812         case OP_oRRw:
6813         case OP_RRnpc_I0:
6814           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6815             inst.error = BAD_PC;
6816           break;
6817
6818         case OP_oRRnpcsp:
6819         case OP_RRnpcsp:
6820           if (inst.operands[i].isreg)
6821             {
6822               if (inst.operands[i].reg == REG_PC)
6823                 inst.error = BAD_PC;
6824               else if (inst.operands[i].reg == REG_SP)
6825                 inst.error = BAD_SP;
6826             }
6827           break;
6828
6829         case OP_RRnpctw:
6830           if (inst.operands[i].isreg
6831               && inst.operands[i].reg == REG_PC
6832               && (inst.operands[i].writeback || thumb))
6833             inst.error = BAD_PC;
6834           break;
6835
6836         case OP_CPSF:
6837         case OP_ENDI:
6838         case OP_oROR:
6839         case OP_wPSR:
6840         case OP_rPSR:
6841         case OP_COND:
6842         case OP_oBARRIER_I15:
6843         case OP_REGLST:
6844         case OP_VRSLST:
6845         case OP_VRDLST:
6846         case OP_VRSDLST:
6847         case OP_NRDLST:
6848         case OP_NSTRLST:
6849           if (val == FAIL)
6850             goto failure;
6851           inst.operands[i].imm = val;
6852           break;
6853
6854         default:
6855           break;
6856         }
6857
6858       /* If we get here, this operand was successfully parsed.  */
6859       inst.operands[i].present = 1;
6860       continue;
6861
6862     bad_args:
6863       inst.error = BAD_ARGS;
6864
6865     failure:
6866       if (!backtrack_pos)
6867         {
6868           /* The parse routine should already have set inst.error, but set a
6869              default here just in case.  */
6870           if (!inst.error)
6871             inst.error = _("syntax error");
6872           return FAIL;
6873         }
6874
6875       /* Do not backtrack over a trailing optional argument that
6876          absorbed some text.  We will only fail again, with the
6877          'garbage following instruction' error message, which is
6878          probably less helpful than the current one.  */
6879       if (backtrack_index == i && backtrack_pos != str
6880           && upat[i+1] == OP_stop)
6881         {
6882           if (!inst.error)
6883             inst.error = _("syntax error");
6884           return FAIL;
6885         }
6886
6887       /* Try again, skipping the optional argument at backtrack_pos.  */
6888       str = backtrack_pos;
6889       inst.error = backtrack_error;
6890       inst.operands[backtrack_index].present = 0;
6891       i = backtrack_index;
6892       backtrack_pos = 0;
6893     }
6894
6895   /* Check that we have parsed all the arguments.  */
6896   if (*str != '\0' && !inst.error)
6897     inst.error = _("garbage following instruction");
6898
6899   return inst.error ? FAIL : SUCCESS;
6900 }
6901
6902 #undef po_char_or_fail
6903 #undef po_reg_or_fail
6904 #undef po_reg_or_goto
6905 #undef po_imm_or_fail
6906 #undef po_scalar_or_fail
6907 #undef po_barrier_or_imm
6908
6909 /* Shorthand macro for instruction encoding functions issuing errors.  */
6910 #define constraint(expr, err)                   \
6911   do                                            \
6912     {                                           \
6913       if (expr)                                 \
6914         {                                       \
6915           inst.error = err;                     \
6916           return;                               \
6917         }                                       \
6918     }                                           \
6919   while (0)
6920
6921 /* Reject "bad registers" for Thumb-2 instructions.  Many Thumb-2
6922    instructions are unpredictable if these registers are used.  This
6923    is the BadReg predicate in ARM's Thumb-2 documentation.  */
6924 #define reject_bad_reg(reg)                             \
6925   do                                                    \
6926    if (reg == REG_SP || reg == REG_PC)                  \
6927      {                                                  \
6928        inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC;  \
6929        return;                                          \
6930      }                                                  \
6931   while (0)
6932
6933 /* If REG is R13 (the stack pointer), warn that its use is
6934    deprecated.  */
6935 #define warn_deprecated_sp(reg)                 \
6936   do                                            \
6937     if (warn_on_deprecated && reg == REG_SP)    \
6938        as_warn (_("use of r13 is deprecated")); \
6939   while (0)
6940
6941 /* Functions for operand encoding.  ARM, then Thumb.  */
6942
6943 #define rotate_left(v, n) (v << n | v >> (32 - n))
6944
6945 /* If VAL can be encoded in the immediate field of an ARM instruction,
6946    return the encoded form.  Otherwise, return FAIL.  */
6947
6948 static unsigned int
6949 encode_arm_immediate (unsigned int val)
6950 {
6951   unsigned int a, i;
6952
6953   for (i = 0; i < 32; i += 2)
6954     if ((a = rotate_left (val, i)) <= 0xff)
6955       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
6956
6957   return FAIL;
6958 }
6959
6960 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6961    return the encoded form.  Otherwise, return FAIL.  */
6962 static unsigned int
6963 encode_thumb32_immediate (unsigned int val)
6964 {
6965   unsigned int a, i;
6966
6967   if (val <= 0xff)
6968     return val;
6969
6970   for (i = 1; i <= 24; i++)
6971     {
6972       a = val >> i;
6973       if ((val & ~(0xff << i)) == 0)
6974         return ((val >> i) & 0x7f) | ((32 - i) << 7);
6975     }
6976
6977   a = val & 0xff;
6978   if (val == ((a << 16) | a))
6979     return 0x100 | a;
6980   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6981     return 0x300 | a;
6982
6983   a = val & 0xff00;
6984   if (val == ((a << 16) | a))
6985     return 0x200 | (a >> 8);
6986
6987   return FAIL;
6988 }
6989 /* Encode a VFP SP or DP register number into inst.instruction.  */
6990
6991 static void
6992 encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6993 {
6994   if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6995       && reg > 15)
6996     {
6997       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
6998         {
6999           if (thumb_mode)
7000             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
7001                                     fpu_vfp_ext_d32);
7002           else
7003             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
7004                                     fpu_vfp_ext_d32);
7005         }
7006       else
7007         {
7008           first_error (_("D register out of range for selected VFP version"));
7009           return;
7010         }
7011     }
7012
7013   switch (pos)
7014     {
7015     case VFP_REG_Sd:
7016       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
7017       break;
7018
7019     case VFP_REG_Sn:
7020       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
7021       break;
7022
7023     case VFP_REG_Sm:
7024       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
7025       break;
7026
7027     case VFP_REG_Dd:
7028       inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
7029       break;
7030
7031     case VFP_REG_Dn:
7032       inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
7033       break;
7034
7035     case VFP_REG_Dm:
7036       inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
7037       break;
7038
7039     default:
7040       abort ();
7041     }
7042 }
7043
7044 /* Encode a <shift> in an ARM-format instruction.  The immediate,
7045    if any, is handled by md_apply_fix.   */
7046 static void
7047 encode_arm_shift (int i)
7048 {
7049   if (inst.operands[i].shift_kind == SHIFT_RRX)
7050     inst.instruction |= SHIFT_ROR << 5;
7051   else
7052     {
7053       inst.instruction |= inst.operands[i].shift_kind << 5;
7054       if (inst.operands[i].immisreg)
7055         {
7056           inst.instruction |= SHIFT_BY_REG;
7057           inst.instruction |= inst.operands[i].imm << 8;
7058         }
7059       else
7060         inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7061     }
7062 }
7063
7064 static void
7065 encode_arm_shifter_operand (int i)
7066 {
7067   if (inst.operands[i].isreg)
7068     {
7069       inst.instruction |= inst.operands[i].reg;
7070       encode_arm_shift (i);
7071     }
7072   else
7073     {
7074       inst.instruction |= INST_IMMEDIATE;
7075       if (inst.reloc.type != BFD_RELOC_ARM_IMMEDIATE)
7076         inst.instruction |= inst.operands[i].imm;
7077     }
7078 }
7079
7080 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
7081 static void
7082 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
7083 {
7084   /* PR 14260:
7085      Generate an error if the operand is not a register.  */
7086   constraint (!inst.operands[i].isreg,
7087               _("Instruction does not support =N addresses"));
7088
7089   inst.instruction |= inst.operands[i].reg << 16;
7090
7091   if (inst.operands[i].preind)
7092     {
7093       if (is_t)
7094         {
7095           inst.error = _("instruction does not accept preindexed addressing");
7096           return;
7097         }
7098       inst.instruction |= PRE_INDEX;
7099       if (inst.operands[i].writeback)
7100         inst.instruction |= WRITE_BACK;
7101
7102     }
7103   else if (inst.operands[i].postind)
7104     {
7105       gas_assert (inst.operands[i].writeback);
7106       if (is_t)
7107         inst.instruction |= WRITE_BACK;
7108     }
7109   else /* unindexed - only for coprocessor */
7110     {
7111       inst.error = _("instruction does not accept unindexed addressing");
7112       return;
7113     }
7114
7115   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
7116       && (((inst.instruction & 0x000f0000) >> 16)
7117           == ((inst.instruction & 0x0000f000) >> 12)))
7118     as_warn ((inst.instruction & LOAD_BIT)
7119              ? _("destination register same as write-back base")
7120              : _("source register same as write-back base"));
7121 }
7122
7123 /* inst.operands[i] was set up by parse_address.  Encode it into an
7124    ARM-format mode 2 load or store instruction.  If is_t is true,
7125    reject forms that cannot be used with a T instruction (i.e. not
7126    post-indexed).  */
7127 static void
7128 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
7129 {
7130   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
7131
7132   encode_arm_addr_mode_common (i, is_t);
7133
7134   if (inst.operands[i].immisreg)
7135     {
7136       constraint ((inst.operands[i].imm == REG_PC
7137                    || (is_pc && inst.operands[i].writeback)),
7138                   BAD_PC_ADDRESSING);
7139       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
7140       inst.instruction |= inst.operands[i].imm;
7141       if (!inst.operands[i].negative)
7142         inst.instruction |= INDEX_UP;
7143       if (inst.operands[i].shifted)
7144         {
7145           if (inst.operands[i].shift_kind == SHIFT_RRX)
7146             inst.instruction |= SHIFT_ROR << 5;
7147           else
7148             {
7149               inst.instruction |= inst.operands[i].shift_kind << 5;
7150               inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7151             }
7152         }
7153     }
7154   else /* immediate offset in inst.reloc */
7155     {
7156       if (is_pc && !inst.reloc.pc_rel)
7157         {
7158           const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
7159
7160           /* If is_t is TRUE, it's called from do_ldstt.  ldrt/strt
7161              cannot use PC in addressing.
7162              PC cannot be used in writeback addressing, either.  */
7163           constraint ((is_t || inst.operands[i].writeback),
7164                       BAD_PC_ADDRESSING);
7165
7166           /* Use of PC in str is deprecated for ARMv7.  */
7167           if (warn_on_deprecated
7168               && !is_load
7169               && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
7170             as_warn (_("use of PC in this instruction is deprecated"));
7171         }
7172
7173       if (inst.reloc.type == BFD_RELOC_UNUSED)
7174         {
7175           /* Prefer + for zero encoded value.  */
7176           if (!inst.operands[i].negative)
7177             inst.instruction |= INDEX_UP;
7178           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
7179         }
7180     }
7181 }
7182
7183 /* inst.operands[i] was set up by parse_address.  Encode it into an
7184    ARM-format mode 3 load or store instruction.  Reject forms that
7185    cannot be used with such instructions.  If is_t is true, reject
7186    forms that cannot be used with a T instruction (i.e. not
7187    post-indexed).  */
7188 static void
7189 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
7190 {
7191   if (inst.operands[i].immisreg && inst.operands[i].shifted)
7192     {
7193       inst.error = _("instruction does not accept scaled register index");
7194       return;
7195     }
7196
7197   encode_arm_addr_mode_common (i, is_t);
7198
7199   if (inst.operands[i].immisreg)
7200     {
7201       constraint ((inst.operands[i].imm == REG_PC
7202                    || (is_t && inst.operands[i].reg == REG_PC)),
7203                   BAD_PC_ADDRESSING);
7204       constraint (inst.operands[i].reg == REG_PC && inst.operands[i].writeback,
7205                   BAD_PC_WRITEBACK);
7206       inst.instruction |= inst.operands[i].imm;
7207       if (!inst.operands[i].negative)
7208         inst.instruction |= INDEX_UP;
7209     }
7210   else /* immediate offset in inst.reloc */
7211     {
7212       constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
7213                    && inst.operands[i].writeback),
7214                   BAD_PC_WRITEBACK);
7215       inst.instruction |= HWOFFSET_IMM;
7216       if (inst.reloc.type == BFD_RELOC_UNUSED)
7217         {
7218           /* Prefer + for zero encoded value.  */
7219           if (!inst.operands[i].negative)
7220             inst.instruction |= INDEX_UP;
7221
7222           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
7223         }
7224     }
7225 }
7226
7227 /* inst.operands[i] was set up by parse_address.  Encode it into an
7228    ARM-format instruction.  Reject all forms which cannot be encoded
7229    into a coprocessor load/store instruction.  If wb_ok is false,
7230    reject use of writeback; if unind_ok is false, reject use of
7231    unindexed addressing.  If reloc_override is not 0, use it instead
7232    of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
7233    (in which case it is preserved).  */
7234
7235 static int
7236 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
7237 {
7238   inst.instruction |= inst.operands[i].reg << 16;
7239
7240   gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
7241
7242   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
7243     {
7244       gas_assert (!inst.operands[i].writeback);
7245       if (!unind_ok)
7246         {
7247           inst.error = _("instruction does not support unindexed addressing");
7248           return FAIL;
7249         }
7250       inst.instruction |= inst.operands[i].imm;
7251       inst.instruction |= INDEX_UP;
7252       return SUCCESS;
7253     }
7254
7255   if (inst.operands[i].preind)
7256     inst.instruction |= PRE_INDEX;
7257
7258   if (inst.operands[i].writeback)
7259     {
7260       if (inst.operands[i].reg == REG_PC)
7261         {
7262           inst.error = _("pc may not be used with write-back");
7263           return FAIL;
7264         }
7265       if (!wb_ok)
7266         {
7267           inst.error = _("instruction does not support writeback");
7268           return FAIL;
7269         }
7270       inst.instruction |= WRITE_BACK;
7271     }
7272
7273   if (reloc_override)
7274     inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
7275   else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
7276             || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
7277            && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
7278     {
7279       if (thumb_mode)
7280         inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
7281       else
7282         inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
7283     }
7284
7285   /* Prefer + for zero encoded value.  */
7286   if (!inst.operands[i].negative)
7287     inst.instruction |= INDEX_UP;
7288
7289   return SUCCESS;
7290 }
7291
7292 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
7293    Determine whether it can be performed with a move instruction; if
7294    it can, convert inst.instruction to that move instruction and
7295    return TRUE; if it can't, convert inst.instruction to a literal-pool
7296    load and return FALSE.  If this is not a valid thing to do in the
7297    current context, set inst.error and return TRUE.
7298
7299    inst.operands[i] describes the destination register.  */
7300
7301 static bfd_boolean
7302 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
7303 {
7304   unsigned long tbit;
7305
7306   if (thumb_p)
7307     tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7308   else
7309     tbit = LOAD_BIT;
7310
7311   if ((inst.instruction & tbit) == 0)
7312     {
7313       inst.error = _("invalid pseudo operation");
7314       return TRUE;
7315     }
7316   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
7317     {
7318       inst.error = _("constant expression expected");
7319       return TRUE;
7320     }
7321   if (inst.reloc.exp.X_op == O_constant)
7322     {
7323       if (thumb_p)
7324         {
7325           if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
7326             {
7327               /* This can be done with a mov(1) instruction.  */
7328               inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
7329               inst.instruction |= inst.reloc.exp.X_add_number;
7330               return TRUE;
7331             }
7332         }
7333       else
7334         {
7335           int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
7336           if (value != FAIL)
7337             {
7338               /* This can be done with a mov instruction.  */
7339               inst.instruction &= LITERAL_MASK;
7340               inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
7341               inst.instruction |= value & 0xfff;
7342               return TRUE;
7343             }
7344
7345           value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
7346           if (value != FAIL)
7347             {
7348               /* This can be done with a mvn instruction.  */
7349               inst.instruction &= LITERAL_MASK;
7350               inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
7351               inst.instruction |= value & 0xfff;
7352               return TRUE;
7353             }
7354         }
7355     }
7356
7357   if (add_to_lit_pool () == FAIL)
7358     {
7359       inst.error = _("literal pool insertion failed");
7360       return TRUE;
7361     }
7362   inst.operands[1].reg = REG_PC;
7363   inst.operands[1].isreg = 1;
7364   inst.operands[1].preind = 1;
7365   inst.reloc.pc_rel = 1;
7366   inst.reloc.type = (thumb_p
7367                      ? BFD_RELOC_ARM_THUMB_OFFSET
7368                      : (mode_3
7369                         ? BFD_RELOC_ARM_HWLITERAL
7370                         : BFD_RELOC_ARM_LITERAL));
7371   return FALSE;
7372 }
7373
7374 /* Functions for instruction encoding, sorted by sub-architecture.
7375    First some generics; their names are taken from the conventional
7376    bit positions for register arguments in ARM format instructions.  */
7377
7378 static void
7379 do_noargs (void)
7380 {
7381 }
7382
7383 static void
7384 do_rd (void)
7385 {
7386   inst.instruction |= inst.operands[0].reg << 12;
7387 }
7388
7389 static void
7390 do_rd_rm (void)
7391 {
7392   inst.instruction |= inst.operands[0].reg << 12;
7393   inst.instruction |= inst.operands[1].reg;
7394 }
7395
7396 static void
7397 do_rm_rn (void)
7398 {
7399   inst.instruction |= inst.operands[0].reg;
7400   inst.instruction |= inst.operands[1].reg << 16;
7401 }
7402
7403 static void
7404 do_rd_rn (void)
7405 {
7406   inst.instruction |= inst.operands[0].reg << 12;
7407   inst.instruction |= inst.operands[1].reg << 16;
7408 }
7409
7410 static void
7411 do_rn_rd (void)
7412 {
7413   inst.instruction |= inst.operands[0].reg << 16;
7414   inst.instruction |= inst.operands[1].reg << 12;
7415 }
7416
7417 static bfd_boolean
7418 check_obsolete (const arm_feature_set *feature, const char *msg)
7419 {
7420   if (ARM_CPU_IS_ANY (cpu_variant))
7421     {
7422       as_warn ("%s", msg);
7423       return TRUE;
7424     }
7425   else if (ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
7426     {
7427       as_bad ("%s", msg);
7428       return TRUE;
7429     }
7430
7431   return FALSE;
7432 }
7433
7434 static void
7435 do_rd_rm_rn (void)
7436 {
7437   unsigned Rn = inst.operands[2].reg;
7438   /* Enforce restrictions on SWP instruction.  */
7439   if ((inst.instruction & 0x0fbfffff) == 0x01000090)
7440     {
7441       constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
7442                   _("Rn must not overlap other operands"));
7443
7444       /* SWP{b} is obsolete for ARMv8-A, and deprecated for ARMv6* and ARMv7.
7445        */
7446       if (!check_obsolete (&arm_ext_v8,
7447                            _("swp{b} use is obsoleted for ARMv8 and later"))
7448           && warn_on_deprecated
7449           && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6))
7450         as_warn (_("swp{b} use is deprecated for ARMv6 and ARMv7"));
7451     }
7452
7453   inst.instruction |= inst.operands[0].reg << 12;
7454   inst.instruction |= inst.operands[1].reg;
7455   inst.instruction |= Rn << 16;
7456 }
7457
7458 static void
7459 do_rd_rn_rm (void)
7460 {
7461   inst.instruction |= inst.operands[0].reg << 12;
7462   inst.instruction |= inst.operands[1].reg << 16;
7463   inst.instruction |= inst.operands[2].reg;
7464 }
7465
7466 static void
7467 do_rm_rd_rn (void)
7468 {
7469   constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7470   constraint (((inst.reloc.exp.X_op != O_constant
7471                 && inst.reloc.exp.X_op != O_illegal)
7472                || inst.reloc.exp.X_add_number != 0),
7473               BAD_ADDR_MODE);
7474   inst.instruction |= inst.operands[0].reg;
7475   inst.instruction |= inst.operands[1].reg << 12;
7476   inst.instruction |= inst.operands[2].reg << 16;
7477 }
7478
7479 static void
7480 do_imm0 (void)
7481 {
7482   inst.instruction |= inst.operands[0].imm;
7483 }
7484
7485 static void
7486 do_rd_cpaddr (void)
7487 {
7488   inst.instruction |= inst.operands[0].reg << 12;
7489   encode_arm_cp_address (1, TRUE, TRUE, 0);
7490 }
7491
7492 /* ARM instructions, in alphabetical order by function name (except
7493    that wrapper functions appear immediately after the function they
7494    wrap).  */
7495
7496 /* This is a pseudo-op of the form "adr rd, label" to be converted
7497    into a relative address of the form "add rd, pc, #label-.-8".  */
7498
7499 static void
7500 do_adr (void)
7501 {
7502   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7503
7504   /* Frag hacking will turn this into a sub instruction if the offset turns
7505      out to be negative.  */
7506   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7507   inst.reloc.pc_rel = 1;
7508   inst.reloc.exp.X_add_number -= 8;
7509 }
7510
7511 /* This is a pseudo-op of the form "adrl rd, label" to be converted
7512    into a relative address of the form:
7513    add rd, pc, #low(label-.-8)"
7514    add rd, rd, #high(label-.-8)"  */
7515
7516 static void
7517 do_adrl (void)
7518 {
7519   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7520
7521   /* Frag hacking will turn this into a sub instruction if the offset turns
7522      out to be negative.  */
7523   inst.reloc.type              = BFD_RELOC_ARM_ADRL_IMMEDIATE;
7524   inst.reloc.pc_rel            = 1;
7525   inst.size                    = INSN_SIZE * 2;
7526   inst.reloc.exp.X_add_number -= 8;
7527 }
7528
7529 static void
7530 do_arit (void)
7531 {
7532   if (!inst.operands[1].present)
7533     inst.operands[1].reg = inst.operands[0].reg;
7534   inst.instruction |= inst.operands[0].reg << 12;
7535   inst.instruction |= inst.operands[1].reg << 16;
7536   encode_arm_shifter_operand (2);
7537 }
7538
7539 static void
7540 do_barrier (void)
7541 {
7542   if (inst.operands[0].present)
7543     inst.instruction |= inst.operands[0].imm;
7544   else
7545     inst.instruction |= 0xf;
7546 }
7547
7548 static void
7549 do_bfc (void)
7550 {
7551   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7552   constraint (msb > 32, _("bit-field extends past end of register"));
7553   /* The instruction encoding stores the LSB and MSB,
7554      not the LSB and width.  */
7555   inst.instruction |= inst.operands[0].reg << 12;
7556   inst.instruction |= inst.operands[1].imm << 7;
7557   inst.instruction |= (msb - 1) << 16;
7558 }
7559
7560 static void
7561 do_bfi (void)
7562 {
7563   unsigned int msb;
7564
7565   /* #0 in second position is alternative syntax for bfc, which is
7566      the same instruction but with REG_PC in the Rm field.  */
7567   if (!inst.operands[1].isreg)
7568     inst.operands[1].reg = REG_PC;
7569
7570   msb = inst.operands[2].imm + inst.operands[3].imm;
7571   constraint (msb > 32, _("bit-field extends past end of register"));
7572   /* The instruction encoding stores the LSB and MSB,
7573      not the LSB and width.  */
7574   inst.instruction |= inst.operands[0].reg << 12;
7575   inst.instruction |= inst.operands[1].reg;
7576   inst.instruction |= inst.operands[2].imm << 7;
7577   inst.instruction |= (msb - 1) << 16;
7578 }
7579
7580 static void
7581 do_bfx (void)
7582 {
7583   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7584               _("bit-field extends past end of register"));
7585   inst.instruction |= inst.operands[0].reg << 12;
7586   inst.instruction |= inst.operands[1].reg;
7587   inst.instruction |= inst.operands[2].imm << 7;
7588   inst.instruction |= (inst.operands[3].imm - 1) << 16;
7589 }
7590
7591 /* ARM V5 breakpoint instruction (argument parse)
7592      BKPT <16 bit unsigned immediate>
7593      Instruction is not conditional.
7594         The bit pattern given in insns[] has the COND_ALWAYS condition,
7595         and it is an error if the caller tried to override that.  */
7596
7597 static void
7598 do_bkpt (void)
7599 {
7600   /* Top 12 of 16 bits to bits 19:8.  */
7601   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
7602
7603   /* Bottom 4 of 16 bits to bits 3:0.  */
7604   inst.instruction |= inst.operands[0].imm & 0xf;
7605 }
7606
7607 static void
7608 encode_branch (int default_reloc)
7609 {
7610   if (inst.operands[0].hasreloc)
7611     {
7612       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
7613                   && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
7614                   _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
7615       inst.reloc.type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
7616         ? BFD_RELOC_ARM_PLT32
7617         : thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
7618     }
7619   else
7620     inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
7621   inst.reloc.pc_rel = 1;
7622 }
7623
7624 static void
7625 do_branch (void)
7626 {
7627 #ifdef OBJ_ELF
7628   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7629     encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7630   else
7631 #endif
7632     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7633 }
7634
7635 static void
7636 do_bl (void)
7637 {
7638 #ifdef OBJ_ELF
7639   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7640     {
7641       if (inst.cond == COND_ALWAYS)
7642         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7643       else
7644         encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7645     }
7646   else
7647 #endif
7648     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7649 }
7650
7651 /* ARM V5 branch-link-exchange instruction (argument parse)
7652      BLX <target_addr>          ie BLX(1)
7653      BLX{<condition>} <Rm>      ie BLX(2)
7654    Unfortunately, there are two different opcodes for this mnemonic.
7655    So, the insns[].value is not used, and the code here zaps values
7656         into inst.instruction.
7657    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
7658
7659 static void
7660 do_blx (void)
7661 {
7662   if (inst.operands[0].isreg)
7663     {
7664       /* Arg is a register; the opcode provided by insns[] is correct.
7665          It is not illegal to do "blx pc", just useless.  */
7666       if (inst.operands[0].reg == REG_PC)
7667         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
7668
7669       inst.instruction |= inst.operands[0].reg;
7670     }
7671   else
7672     {
7673       /* Arg is an address; this instruction cannot be executed
7674          conditionally, and the opcode must be adjusted.
7675          We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7676          where we generate out a BFD_RELOC_ARM_PCREL_CALL instead.  */
7677       constraint (inst.cond != COND_ALWAYS, BAD_COND);
7678       inst.instruction = 0xfa000000;
7679       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
7680     }
7681 }
7682
7683 static void
7684 do_bx (void)
7685 {
7686   bfd_boolean want_reloc;
7687
7688   if (inst.operands[0].reg == REG_PC)
7689     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
7690
7691   inst.instruction |= inst.operands[0].reg;
7692   /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7693      it is for ARMv4t or earlier.  */
7694   want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7695   if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7696       want_reloc = TRUE;
7697
7698 #ifdef OBJ_ELF
7699   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
7700 #endif
7701     want_reloc = FALSE;
7702
7703   if (want_reloc)
7704     inst.reloc.type = BFD_RELOC_ARM_V4BX;
7705 }
7706
7707
7708 /* ARM v5TEJ.  Jump to Jazelle code.  */
7709
7710 static void
7711 do_bxj (void)
7712 {
7713   if (inst.operands[0].reg == REG_PC)
7714     as_tsktsk (_("use of r15 in bxj is not really useful"));
7715
7716   inst.instruction |= inst.operands[0].reg;
7717 }
7718
7719 /* Co-processor data operation:
7720       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7721       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
7722 static void
7723 do_cdp (void)
7724 {
7725   inst.instruction |= inst.operands[0].reg << 8;
7726   inst.instruction |= inst.operands[1].imm << 20;
7727   inst.instruction |= inst.operands[2].reg << 12;
7728   inst.instruction |= inst.operands[3].reg << 16;
7729   inst.instruction |= inst.operands[4].reg;
7730   inst.instruction |= inst.operands[5].imm << 5;
7731 }
7732
7733 static void
7734 do_cmp (void)
7735 {
7736   inst.instruction |= inst.operands[0].reg << 16;
7737   encode_arm_shifter_operand (1);
7738 }
7739
7740 /* Transfer between coprocessor and ARM registers.
7741    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7742    MRC2
7743    MCR{cond}
7744    MCR2
7745
7746    No special properties.  */
7747
7748 struct deprecated_coproc_regs_s
7749 {
7750   unsigned cp;
7751   int opc1;
7752   unsigned crn;
7753   unsigned crm;
7754   int opc2;
7755   arm_feature_set deprecated;
7756   arm_feature_set obsoleted;
7757   const char *dep_msg;
7758   const char *obs_msg;
7759 };
7760
7761 #define DEPR_ACCESS_V8 \
7762   N_("This coprocessor register access is deprecated in ARMv8")
7763
7764 /* Table of all deprecated coprocessor registers.  */
7765 static struct deprecated_coproc_regs_s deprecated_coproc_regs[] =
7766 {
7767     {15, 0, 7, 10, 5,                                   /* CP15DMB.  */
7768      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7769      DEPR_ACCESS_V8, NULL},
7770     {15, 0, 7, 10, 4,                                   /* CP15DSB.  */
7771      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7772      DEPR_ACCESS_V8, NULL},
7773     {15, 0, 7,  5, 4,                                   /* CP15ISB.  */
7774      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7775      DEPR_ACCESS_V8, NULL},
7776     {14, 6, 1,  0, 0,                                   /* TEEHBR.  */
7777      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7778      DEPR_ACCESS_V8, NULL},
7779     {14, 6, 0,  0, 0,                                   /* TEECR.  */
7780      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7781      DEPR_ACCESS_V8, NULL},
7782 };
7783
7784 #undef DEPR_ACCESS_V8
7785
7786 static const size_t deprecated_coproc_reg_count =
7787   sizeof (deprecated_coproc_regs) / sizeof (deprecated_coproc_regs[0]);
7788
7789 static void
7790 do_co_reg (void)
7791 {
7792   unsigned Rd;
7793   size_t i;
7794
7795   Rd = inst.operands[2].reg;
7796   if (thumb_mode)
7797     {
7798       if (inst.instruction == 0xee000010
7799           || inst.instruction == 0xfe000010)
7800         /* MCR, MCR2  */
7801         reject_bad_reg (Rd);
7802       else
7803         /* MRC, MRC2  */
7804         constraint (Rd == REG_SP, BAD_SP);
7805     }
7806   else
7807     {
7808       /* MCR */
7809       if (inst.instruction == 0xe000010)
7810         constraint (Rd == REG_PC, BAD_PC);
7811     }
7812
7813     for (i = 0; i < deprecated_coproc_reg_count; ++i)
7814       {
7815         const struct deprecated_coproc_regs_s *r =
7816           deprecated_coproc_regs + i;
7817
7818         if (inst.operands[0].reg == r->cp
7819             && inst.operands[1].imm == r->opc1
7820             && inst.operands[3].reg == r->crn
7821             && inst.operands[4].reg == r->crm
7822             && inst.operands[5].imm == r->opc2)
7823           {
7824             if (! ARM_CPU_IS_ANY (cpu_variant)
7825                 && warn_on_deprecated
7826                 && ARM_CPU_HAS_FEATURE (cpu_variant, r->deprecated))
7827               as_warn ("%s", r->dep_msg);
7828           }
7829       }
7830
7831   inst.instruction |= inst.operands[0].reg << 8;
7832   inst.instruction |= inst.operands[1].imm << 21;
7833   inst.instruction |= Rd << 12;
7834   inst.instruction |= inst.operands[3].reg << 16;
7835   inst.instruction |= inst.operands[4].reg;
7836   inst.instruction |= inst.operands[5].imm << 5;
7837 }
7838
7839 /* Transfer between coprocessor register and pair of ARM registers.
7840    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7841    MCRR2
7842    MRRC{cond}
7843    MRRC2
7844
7845    Two XScale instructions are special cases of these:
7846
7847      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
7848      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
7849
7850    Result unpredictable if Rd or Rn is R15.  */
7851
7852 static void
7853 do_co_reg2c (void)
7854 {
7855   unsigned Rd, Rn;
7856
7857   Rd = inst.operands[2].reg;
7858   Rn = inst.operands[3].reg;
7859
7860   if (thumb_mode)
7861     {
7862       reject_bad_reg (Rd);
7863       reject_bad_reg (Rn);
7864     }
7865   else
7866     {
7867       constraint (Rd == REG_PC, BAD_PC);
7868       constraint (Rn == REG_PC, BAD_PC);
7869     }
7870
7871   inst.instruction |= inst.operands[0].reg << 8;
7872   inst.instruction |= inst.operands[1].imm << 4;
7873   inst.instruction |= Rd << 12;
7874   inst.instruction |= Rn << 16;
7875   inst.instruction |= inst.operands[4].reg;
7876 }
7877
7878 static void
7879 do_cpsi (void)
7880 {
7881   inst.instruction |= inst.operands[0].imm << 6;
7882   if (inst.operands[1].present)
7883     {
7884       inst.instruction |= CPSI_MMOD;
7885       inst.instruction |= inst.operands[1].imm;
7886     }
7887 }
7888
7889 static void
7890 do_dbg (void)
7891 {
7892   inst.instruction |= inst.operands[0].imm;
7893 }
7894
7895 static void
7896 do_div (void)
7897 {
7898   unsigned Rd, Rn, Rm;
7899
7900   Rd = inst.operands[0].reg;
7901   Rn = (inst.operands[1].present
7902         ? inst.operands[1].reg : Rd);
7903   Rm = inst.operands[2].reg;
7904
7905   constraint ((Rd == REG_PC), BAD_PC);
7906   constraint ((Rn == REG_PC), BAD_PC);
7907   constraint ((Rm == REG_PC), BAD_PC);
7908
7909   inst.instruction |= Rd << 16;
7910   inst.instruction |= Rn << 0;
7911   inst.instruction |= Rm << 8;
7912 }
7913
7914 static void
7915 do_it (void)
7916 {
7917   /* There is no IT instruction in ARM mode.  We
7918      process it to do the validation as if in
7919      thumb mode, just in case the code gets
7920      assembled for thumb using the unified syntax.  */
7921
7922   inst.size = 0;
7923   if (unified_syntax)
7924     {
7925       set_it_insn_type (IT_INSN);
7926       now_it.mask = (inst.instruction & 0xf) | 0x10;
7927       now_it.cc = inst.operands[0].imm;
7928     }
7929 }
7930
7931 /* If there is only one register in the register list,
7932    then return its register number.  Otherwise return -1.  */
7933 static int
7934 only_one_reg_in_list (int range)
7935 {
7936   int i = ffs (range) - 1;
7937   return (i > 15 || range != (1 << i)) ? -1 : i;
7938 }
7939
7940 static void
7941 encode_ldmstm(int from_push_pop_mnem)
7942 {
7943   int base_reg = inst.operands[0].reg;
7944   int range = inst.operands[1].imm;
7945   int one_reg;
7946
7947   inst.instruction |= base_reg << 16;
7948   inst.instruction |= range;
7949
7950   if (inst.operands[1].writeback)
7951     inst.instruction |= LDM_TYPE_2_OR_3;
7952
7953   if (inst.operands[0].writeback)
7954     {
7955       inst.instruction |= WRITE_BACK;
7956       /* Check for unpredictable uses of writeback.  */
7957       if (inst.instruction & LOAD_BIT)
7958         {
7959           /* Not allowed in LDM type 2.  */
7960           if ((inst.instruction & LDM_TYPE_2_OR_3)
7961               && ((range & (1 << REG_PC)) == 0))
7962             as_warn (_("writeback of base register is UNPREDICTABLE"));
7963           /* Only allowed if base reg not in list for other types.  */
7964           else if (range & (1 << base_reg))
7965             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
7966         }
7967       else /* STM.  */
7968         {
7969           /* Not allowed for type 2.  */
7970           if (inst.instruction & LDM_TYPE_2_OR_3)
7971             as_warn (_("writeback of base register is UNPREDICTABLE"));
7972           /* Only allowed if base reg not in list, or first in list.  */
7973           else if ((range & (1 << base_reg))
7974                    && (range & ((1 << base_reg) - 1)))
7975             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
7976         }
7977     }
7978
7979   /* If PUSH/POP has only one register, then use the A2 encoding.  */
7980   one_reg = only_one_reg_in_list (range);
7981   if (from_push_pop_mnem && one_reg >= 0)
7982     {
7983       int is_push = (inst.instruction & A_PUSH_POP_OP_MASK) == A1_OPCODE_PUSH;
7984
7985       inst.instruction &= A_COND_MASK;
7986       inst.instruction |= is_push ? A2_OPCODE_PUSH : A2_OPCODE_POP;
7987       inst.instruction |= one_reg << 12;
7988     }
7989 }
7990
7991 static void
7992 do_ldmstm (void)
7993 {
7994   encode_ldmstm (/*from_push_pop_mnem=*/FALSE);
7995 }
7996
7997 /* ARMv5TE load-consecutive (argument parse)
7998    Mode is like LDRH.
7999
8000      LDRccD R, mode
8001      STRccD R, mode.  */
8002
8003 static void
8004 do_ldrd (void)
8005 {
8006   constraint (inst.operands[0].reg % 2 != 0,
8007               _("first transfer register must be even"));
8008   constraint (inst.operands[1].present
8009               && inst.operands[1].reg != inst.operands[0].reg + 1,
8010               _("can only transfer two consecutive registers"));
8011   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
8012   constraint (!inst.operands[2].isreg, _("'[' expected"));
8013
8014   if (!inst.operands[1].present)
8015     inst.operands[1].reg = inst.operands[0].reg + 1;
8016
8017   /* encode_arm_addr_mode_3 will diagnose overlap between the base
8018      register and the first register written; we have to diagnose
8019      overlap between the base and the second register written here.  */
8020
8021   if (inst.operands[2].reg == inst.operands[1].reg
8022       && (inst.operands[2].writeback || inst.operands[2].postind))
8023     as_warn (_("base register written back, and overlaps "
8024                "second transfer register"));
8025
8026   if (!(inst.instruction & V4_STR_BIT))
8027     {
8028       /* For an index-register load, the index register must not overlap the
8029         destination (even if not write-back).  */
8030       if (inst.operands[2].immisreg
8031               && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
8032               || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
8033         as_warn (_("index register overlaps transfer register"));
8034     }
8035   inst.instruction |= inst.operands[0].reg << 12;
8036   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
8037 }
8038
8039 static void
8040 do_ldrex (void)
8041 {
8042   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
8043               || inst.operands[1].postind || inst.operands[1].writeback
8044               || inst.operands[1].immisreg || inst.operands[1].shifted
8045               || inst.operands[1].negative
8046               /* This can arise if the programmer has written
8047                    strex rN, rM, foo
8048                  or if they have mistakenly used a register name as the last
8049                  operand,  eg:
8050                    strex rN, rM, rX
8051                  It is very difficult to distinguish between these two cases
8052                  because "rX" might actually be a label. ie the register
8053                  name has been occluded by a symbol of the same name. So we
8054                  just generate a general 'bad addressing mode' type error
8055                  message and leave it up to the programmer to discover the
8056                  true cause and fix their mistake.  */
8057               || (inst.operands[1].reg == REG_PC),
8058               BAD_ADDR_MODE);
8059
8060   constraint (inst.reloc.exp.X_op != O_constant
8061               || inst.reloc.exp.X_add_number != 0,
8062               _("offset must be zero in ARM encoding"));
8063
8064   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
8065
8066   inst.instruction |= inst.operands[0].reg << 12;
8067   inst.instruction |= inst.operands[1].reg << 16;
8068   inst.reloc.type = BFD_RELOC_UNUSED;
8069 }
8070
8071 static void
8072 do_ldrexd (void)
8073 {
8074   constraint (inst.operands[0].reg % 2 != 0,
8075               _("even register required"));
8076   constraint (inst.operands[1].present
8077               && inst.operands[1].reg != inst.operands[0].reg + 1,
8078               _("can only load two consecutive registers"));
8079   /* If op 1 were present and equal to PC, this function wouldn't
8080      have been called in the first place.  */
8081   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
8082
8083   inst.instruction |= inst.operands[0].reg << 12;
8084   inst.instruction |= inst.operands[2].reg << 16;
8085 }
8086
8087 /* In both ARM and thumb state 'ldr pc, #imm'  with an immediate
8088    which is not a multiple of four is UNPREDICTABLE.  */
8089 static void
8090 check_ldr_r15_aligned (void)
8091 {
8092   constraint (!(inst.operands[1].immisreg)
8093               && (inst.operands[0].reg == REG_PC
8094               && inst.operands[1].reg == REG_PC
8095               && (inst.reloc.exp.X_add_number & 0x3)),
8096               _("ldr to register 15 must be 4-byte alligned"));
8097 }
8098
8099 static void
8100 do_ldst (void)
8101 {
8102   inst.instruction |= inst.operands[0].reg << 12;
8103   if (!inst.operands[1].isreg)
8104     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
8105       return;
8106   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
8107   check_ldr_r15_aligned ();
8108 }
8109
8110 static void
8111 do_ldstt (void)
8112 {
8113   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
8114      reject [Rn,...].  */
8115   if (inst.operands[1].preind)
8116     {
8117       constraint (inst.reloc.exp.X_op != O_constant
8118                   || inst.reloc.exp.X_add_number != 0,
8119                   _("this instruction requires a post-indexed address"));
8120
8121       inst.operands[1].preind = 0;
8122       inst.operands[1].postind = 1;
8123       inst.operands[1].writeback = 1;
8124     }
8125   inst.instruction |= inst.operands[0].reg << 12;
8126   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
8127 }
8128
8129 /* Halfword and signed-byte load/store operations.  */
8130
8131 static void
8132 do_ldstv4 (void)
8133 {
8134   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
8135   inst.instruction |= inst.operands[0].reg << 12;
8136   if (!inst.operands[1].isreg)
8137     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
8138       return;
8139   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
8140 }
8141
8142 static void
8143 do_ldsttv4 (void)
8144 {
8145   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
8146      reject [Rn,...].  */
8147   if (inst.operands[1].preind)
8148     {
8149       constraint (inst.reloc.exp.X_op != O_constant
8150                   || inst.reloc.exp.X_add_number != 0,
8151                   _("this instruction requires a post-indexed address"));
8152
8153       inst.operands[1].preind = 0;
8154       inst.operands[1].postind = 1;
8155       inst.operands[1].writeback = 1;
8156     }
8157   inst.instruction |= inst.operands[0].reg << 12;
8158   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
8159 }
8160
8161 /* Co-processor register load/store.
8162    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
8163 static void
8164 do_lstc (void)
8165 {
8166   inst.instruction |= inst.operands[0].reg << 8;
8167   inst.instruction |= inst.operands[1].reg << 12;
8168   encode_arm_cp_address (2, TRUE, TRUE, 0);
8169 }
8170
8171 static void
8172 do_mlas (void)
8173 {
8174   /* This restriction does not apply to mls (nor to mla in v6 or later).  */
8175   if (inst.operands[0].reg == inst.operands[1].reg
8176       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
8177       && !(inst.instruction & 0x00400000))
8178     as_tsktsk (_("Rd and Rm should be different in mla"));
8179
8180   inst.instruction |= inst.operands[0].reg << 16;
8181   inst.instruction |= inst.operands[1].reg;
8182   inst.instruction |= inst.operands[2].reg << 8;
8183   inst.instruction |= inst.operands[3].reg << 12;
8184 }
8185
8186 static void
8187 do_mov (void)
8188 {
8189   inst.instruction |= inst.operands[0].reg << 12;
8190   encode_arm_shifter_operand (1);
8191 }
8192
8193 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
8194 static void
8195 do_mov16 (void)
8196 {
8197   bfd_vma imm;
8198   bfd_boolean top;
8199
8200   top = (inst.instruction & 0x00400000) != 0;
8201   constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
8202               _(":lower16: not allowed this instruction"));
8203   constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
8204               _(":upper16: not allowed instruction"));
8205   inst.instruction |= inst.operands[0].reg << 12;
8206   if (inst.reloc.type == BFD_RELOC_UNUSED)
8207     {
8208       imm = inst.reloc.exp.X_add_number;
8209       /* The value is in two pieces: 0:11, 16:19.  */
8210       inst.instruction |= (imm & 0x00000fff);
8211       inst.instruction |= (imm & 0x0000f000) << 4;
8212     }
8213 }
8214
8215 static void do_vfp_nsyn_opcode (const char *);
8216
8217 static int
8218 do_vfp_nsyn_mrs (void)
8219 {
8220   if (inst.operands[0].isvec)
8221     {
8222       if (inst.operands[1].reg != 1)
8223         first_error (_("operand 1 must be FPSCR"));
8224       memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
8225       memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
8226       do_vfp_nsyn_opcode ("fmstat");
8227     }
8228   else if (inst.operands[1].isvec)
8229     do_vfp_nsyn_opcode ("fmrx");
8230   else
8231     return FAIL;
8232
8233   return SUCCESS;
8234 }
8235
8236 static int
8237 do_vfp_nsyn_msr (void)
8238 {
8239   if (inst.operands[0].isvec)
8240     do_vfp_nsyn_opcode ("fmxr");
8241   else
8242     return FAIL;
8243
8244   return SUCCESS;
8245 }
8246
8247 static void
8248 do_vmrs (void)
8249 {
8250   unsigned Rt = inst.operands[0].reg;
8251
8252   if (thumb_mode && Rt == REG_SP)
8253     {
8254       inst.error = BAD_SP;
8255       return;
8256     }
8257
8258   /* APSR_ sets isvec. All other refs to PC are illegal.  */
8259   if (!inst.operands[0].isvec && Rt == REG_PC)
8260     {
8261       inst.error = BAD_PC;
8262       return;
8263     }
8264
8265   /* If we get through parsing the register name, we just insert the number
8266      generated into the instruction without further validation.  */
8267   inst.instruction |= (inst.operands[1].reg << 16);
8268   inst.instruction |= (Rt << 12);
8269 }
8270
8271 static void
8272 do_vmsr (void)
8273 {
8274   unsigned Rt = inst.operands[1].reg;
8275
8276   if (thumb_mode)
8277     reject_bad_reg (Rt);
8278   else if (Rt == REG_PC)
8279     {
8280       inst.error = BAD_PC;
8281       return;
8282     }
8283
8284   /* If we get through parsing the register name, we just insert the number
8285      generated into the instruction without further validation.  */
8286   inst.instruction |= (inst.operands[0].reg << 16);
8287   inst.instruction |= (Rt << 12);
8288 }
8289
8290 static void
8291 do_mrs (void)
8292 {
8293   unsigned br;
8294
8295   if (do_vfp_nsyn_mrs () == SUCCESS)
8296     return;
8297
8298   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
8299   inst.instruction |= inst.operands[0].reg << 12;
8300
8301   if (inst.operands[1].isreg)
8302     {
8303       br = inst.operands[1].reg;
8304       if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf000))
8305         as_bad (_("bad register for mrs"));
8306     }
8307   else
8308     {
8309       /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
8310       constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
8311                   != (PSR_c|PSR_f),
8312                   _("'APSR', 'CPSR' or 'SPSR' expected"));
8313       br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
8314     }
8315
8316   inst.instruction |= br;
8317 }
8318
8319 /* Two possible forms:
8320       "{C|S}PSR_<field>, Rm",
8321       "{C|S}PSR_f, #expression".  */
8322
8323 static void
8324 do_msr (void)
8325 {
8326   if (do_vfp_nsyn_msr () == SUCCESS)
8327     return;
8328
8329   inst.instruction |= inst.operands[0].imm;
8330   if (inst.operands[1].isreg)
8331     inst.instruction |= inst.operands[1].reg;
8332   else
8333     {
8334       inst.instruction |= INST_IMMEDIATE;
8335       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
8336       inst.reloc.pc_rel = 0;
8337     }
8338 }
8339
8340 static void
8341 do_mul (void)
8342 {
8343   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
8344
8345   if (!inst.operands[2].present)
8346     inst.operands[2].reg = inst.operands[0].reg;
8347   inst.instruction |= inst.operands[0].reg << 16;
8348   inst.instruction |= inst.operands[1].reg;
8349   inst.instruction |= inst.operands[2].reg << 8;
8350
8351   if (inst.operands[0].reg == inst.operands[1].reg
8352       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8353     as_tsktsk (_("Rd and Rm should be different in mul"));
8354 }
8355
8356 /* Long Multiply Parser
8357    UMULL RdLo, RdHi, Rm, Rs
8358    SMULL RdLo, RdHi, Rm, Rs
8359    UMLAL RdLo, RdHi, Rm, Rs
8360    SMLAL RdLo, RdHi, Rm, Rs.  */
8361
8362 static void
8363 do_mull (void)
8364 {
8365   inst.instruction |= inst.operands[0].reg << 12;
8366   inst.instruction |= inst.operands[1].reg << 16;
8367   inst.instruction |= inst.operands[2].reg;
8368   inst.instruction |= inst.operands[3].reg << 8;
8369
8370   /* rdhi and rdlo must be different.  */
8371   if (inst.operands[0].reg == inst.operands[1].reg)
8372     as_tsktsk (_("rdhi and rdlo must be different"));
8373
8374   /* rdhi, rdlo and rm must all be different before armv6.  */
8375   if ((inst.operands[0].reg == inst.operands[2].reg
8376       || inst.operands[1].reg == inst.operands[2].reg)
8377       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8378     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
8379 }
8380
8381 static void
8382 do_nop (void)
8383 {
8384   if (inst.operands[0].present
8385       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
8386     {
8387       /* Architectural NOP hints are CPSR sets with no bits selected.  */
8388       inst.instruction &= 0xf0000000;
8389       inst.instruction |= 0x0320f000;
8390       if (inst.operands[0].present)
8391         inst.instruction |= inst.operands[0].imm;
8392     }
8393 }
8394
8395 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
8396    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
8397    Condition defaults to COND_ALWAYS.
8398    Error if Rd, Rn or Rm are R15.  */
8399
8400 static void
8401 do_pkhbt (void)
8402 {
8403   inst.instruction |= inst.operands[0].reg << 12;
8404   inst.instruction |= inst.operands[1].reg << 16;
8405   inst.instruction |= inst.operands[2].reg;
8406   if (inst.operands[3].present)
8407     encode_arm_shift (3);
8408 }
8409
8410 /* ARM V6 PKHTB (Argument Parse).  */
8411
8412 static void
8413 do_pkhtb (void)
8414 {
8415   if (!inst.operands[3].present)
8416     {
8417       /* If the shift specifier is omitted, turn the instruction
8418          into pkhbt rd, rm, rn. */
8419       inst.instruction &= 0xfff00010;
8420       inst.instruction |= inst.operands[0].reg << 12;
8421       inst.instruction |= inst.operands[1].reg;
8422       inst.instruction |= inst.operands[2].reg << 16;
8423     }
8424   else
8425     {
8426       inst.instruction |= inst.operands[0].reg << 12;
8427       inst.instruction |= inst.operands[1].reg << 16;
8428       inst.instruction |= inst.operands[2].reg;
8429       encode_arm_shift (3);
8430     }
8431 }
8432
8433 /* ARMv5TE: Preload-Cache
8434    MP Extensions: Preload for write
8435
8436     PLD(W) <addr_mode>
8437
8438   Syntactically, like LDR with B=1, W=0, L=1.  */
8439
8440 static void
8441 do_pld (void)
8442 {
8443   constraint (!inst.operands[0].isreg,
8444               _("'[' expected after PLD mnemonic"));
8445   constraint (inst.operands[0].postind,
8446               _("post-indexed expression used in preload instruction"));
8447   constraint (inst.operands[0].writeback,
8448               _("writeback used in preload instruction"));
8449   constraint (!inst.operands[0].preind,
8450               _("unindexed addressing used in preload instruction"));
8451   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8452 }
8453
8454 /* ARMv7: PLI <addr_mode>  */
8455 static void
8456 do_pli (void)
8457 {
8458   constraint (!inst.operands[0].isreg,
8459               _("'[' expected after PLI mnemonic"));
8460   constraint (inst.operands[0].postind,
8461               _("post-indexed expression used in preload instruction"));
8462   constraint (inst.operands[0].writeback,
8463               _("writeback used in preload instruction"));
8464   constraint (!inst.operands[0].preind,
8465               _("unindexed addressing used in preload instruction"));
8466   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8467   inst.instruction &= ~PRE_INDEX;
8468 }
8469
8470 static void
8471 do_push_pop (void)
8472 {
8473   inst.operands[1] = inst.operands[0];
8474   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
8475   inst.operands[0].isreg = 1;
8476   inst.operands[0].writeback = 1;
8477   inst.operands[0].reg = REG_SP;
8478   encode_ldmstm (/*from_push_pop_mnem=*/TRUE);
8479 }
8480
8481 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
8482    word at the specified address and the following word
8483    respectively.
8484    Unconditionally executed.
8485    Error if Rn is R15.  */
8486
8487 static void
8488 do_rfe (void)
8489 {
8490   inst.instruction |= inst.operands[0].reg << 16;
8491   if (inst.operands[0].writeback)
8492     inst.instruction |= WRITE_BACK;
8493 }
8494
8495 /* ARM V6 ssat (argument parse).  */
8496
8497 static void
8498 do_ssat (void)
8499 {
8500   inst.instruction |= inst.operands[0].reg << 12;
8501   inst.instruction |= (inst.operands[1].imm - 1) << 16;
8502   inst.instruction |= inst.operands[2].reg;
8503
8504   if (inst.operands[3].present)
8505     encode_arm_shift (3);
8506 }
8507
8508 /* ARM V6 usat (argument parse).  */
8509
8510 static void
8511 do_usat (void)
8512 {
8513   inst.instruction |= inst.operands[0].reg << 12;
8514   inst.instruction |= inst.operands[1].imm << 16;
8515   inst.instruction |= inst.operands[2].reg;
8516
8517   if (inst.operands[3].present)
8518     encode_arm_shift (3);
8519 }
8520
8521 /* ARM V6 ssat16 (argument parse).  */
8522
8523 static void
8524 do_ssat16 (void)
8525 {
8526   inst.instruction |= inst.operands[0].reg << 12;
8527   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
8528   inst.instruction |= inst.operands[2].reg;
8529 }
8530
8531 static void
8532 do_usat16 (void)
8533 {
8534   inst.instruction |= inst.operands[0].reg << 12;
8535   inst.instruction |= inst.operands[1].imm << 16;
8536   inst.instruction |= inst.operands[2].reg;
8537 }
8538
8539 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
8540    preserving the other bits.
8541
8542    setend <endian_specifier>, where <endian_specifier> is either
8543    BE or LE.  */
8544
8545 static void
8546 do_setend (void)
8547 {
8548   if (warn_on_deprecated
8549       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
8550       as_warn (_("setend use is deprecated for ARMv8"));
8551
8552   if (inst.operands[0].imm)
8553     inst.instruction |= 0x200;
8554 }
8555
8556 static void
8557 do_shift (void)
8558 {
8559   unsigned int Rm = (inst.operands[1].present
8560                      ? inst.operands[1].reg
8561                      : inst.operands[0].reg);
8562
8563   inst.instruction |= inst.operands[0].reg << 12;
8564   inst.instruction |= Rm;
8565   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
8566     {
8567       inst.instruction |= inst.operands[2].reg << 8;
8568       inst.instruction |= SHIFT_BY_REG;
8569       /* PR 12854: Error on extraneous shifts.  */
8570       constraint (inst.operands[2].shifted,
8571                   _("extraneous shift as part of operand to shift insn"));
8572     }
8573   else
8574     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
8575 }
8576
8577 static void
8578 do_smc (void)
8579 {
8580   inst.reloc.type = BFD_RELOC_ARM_SMC;
8581   inst.reloc.pc_rel = 0;
8582 }
8583
8584 static void
8585 do_hvc (void)
8586 {
8587   inst.reloc.type = BFD_RELOC_ARM_HVC;
8588   inst.reloc.pc_rel = 0;
8589 }
8590
8591 static void
8592 do_swi (void)
8593 {
8594   inst.reloc.type = BFD_RELOC_ARM_SWI;
8595   inst.reloc.pc_rel = 0;
8596 }
8597
8598 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
8599    SMLAxy{cond} Rd,Rm,Rs,Rn
8600    SMLAWy{cond} Rd,Rm,Rs,Rn
8601    Error if any register is R15.  */
8602
8603 static void
8604 do_smla (void)
8605 {
8606   inst.instruction |= inst.operands[0].reg << 16;
8607   inst.instruction |= inst.operands[1].reg;
8608   inst.instruction |= inst.operands[2].reg << 8;
8609   inst.instruction |= inst.operands[3].reg << 12;
8610 }
8611
8612 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8613    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8614    Error if any register is R15.
8615    Warning if Rdlo == Rdhi.  */
8616
8617 static void
8618 do_smlal (void)
8619 {
8620   inst.instruction |= inst.operands[0].reg << 12;
8621   inst.instruction |= inst.operands[1].reg << 16;
8622   inst.instruction |= inst.operands[2].reg;
8623   inst.instruction |= inst.operands[3].reg << 8;
8624
8625   if (inst.operands[0].reg == inst.operands[1].reg)
8626     as_tsktsk (_("rdhi and rdlo must be different"));
8627 }
8628
8629 /* ARM V5E (El Segundo) signed-multiply (argument parse)
8630    SMULxy{cond} Rd,Rm,Rs
8631    Error if any register is R15.  */
8632
8633 static void
8634 do_smul (void)
8635 {
8636   inst.instruction |= inst.operands[0].reg << 16;
8637   inst.instruction |= inst.operands[1].reg;
8638   inst.instruction |= inst.operands[2].reg << 8;
8639 }
8640
8641 /* ARM V6 srs (argument parse).  The variable fields in the encoding are
8642    the same for both ARM and Thumb-2.  */
8643
8644 static void
8645 do_srs (void)
8646 {
8647   int reg;
8648
8649   if (inst.operands[0].present)
8650     {
8651       reg = inst.operands[0].reg;
8652       constraint (reg != REG_SP, _("SRS base register must be r13"));
8653     }
8654   else
8655     reg = REG_SP;
8656
8657   inst.instruction |= reg << 16;
8658   inst.instruction |= inst.operands[1].imm;
8659   if (inst.operands[0].writeback || inst.operands[1].writeback)
8660     inst.instruction |= WRITE_BACK;
8661 }
8662
8663 /* ARM V6 strex (argument parse).  */
8664
8665 static void
8666 do_strex (void)
8667 {
8668   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8669               || inst.operands[2].postind || inst.operands[2].writeback
8670               || inst.operands[2].immisreg || inst.operands[2].shifted
8671               || inst.operands[2].negative
8672               /* See comment in do_ldrex().  */
8673               || (inst.operands[2].reg == REG_PC),
8674               BAD_ADDR_MODE);
8675
8676   constraint (inst.operands[0].reg == inst.operands[1].reg
8677               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8678
8679   constraint (inst.reloc.exp.X_op != O_constant
8680               || inst.reloc.exp.X_add_number != 0,
8681               _("offset must be zero in ARM encoding"));
8682
8683   inst.instruction |= inst.operands[0].reg << 12;
8684   inst.instruction |= inst.operands[1].reg;
8685   inst.instruction |= inst.operands[2].reg << 16;
8686   inst.reloc.type = BFD_RELOC_UNUSED;
8687 }
8688
8689 static void
8690 do_t_strexbh (void)
8691 {
8692   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8693               || inst.operands[2].postind || inst.operands[2].writeback
8694               || inst.operands[2].immisreg || inst.operands[2].shifted
8695               || inst.operands[2].negative,
8696               BAD_ADDR_MODE);
8697
8698   constraint (inst.operands[0].reg == inst.operands[1].reg
8699               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8700
8701   do_rm_rd_rn ();
8702 }
8703
8704 static void
8705 do_strexd (void)
8706 {
8707   constraint (inst.operands[1].reg % 2 != 0,
8708               _("even register required"));
8709   constraint (inst.operands[2].present
8710               && inst.operands[2].reg != inst.operands[1].reg + 1,
8711               _("can only store two consecutive registers"));
8712   /* If op 2 were present and equal to PC, this function wouldn't
8713      have been called in the first place.  */
8714   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
8715
8716   constraint (inst.operands[0].reg == inst.operands[1].reg
8717               || inst.operands[0].reg == inst.operands[1].reg + 1
8718               || inst.operands[0].reg == inst.operands[3].reg,
8719               BAD_OVERLAP);
8720
8721   inst.instruction |= inst.operands[0].reg << 12;
8722   inst.instruction |= inst.operands[1].reg;
8723   inst.instruction |= inst.operands[3].reg << 16;
8724 }
8725
8726 /* ARM V8 STRL.  */
8727 static void
8728 do_stlex (void)
8729 {
8730   constraint (inst.operands[0].reg == inst.operands[1].reg
8731               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8732
8733   do_rd_rm_rn ();
8734 }
8735
8736 static void
8737 do_t_stlex (void)
8738 {
8739   constraint (inst.operands[0].reg == inst.operands[1].reg
8740               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8741
8742   do_rm_rd_rn ();
8743 }
8744
8745 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8746    extends it to 32-bits, and adds the result to a value in another
8747    register.  You can specify a rotation by 0, 8, 16, or 24 bits
8748    before extracting the 16-bit value.
8749    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8750    Condition defaults to COND_ALWAYS.
8751    Error if any register uses R15.  */
8752
8753 static void
8754 do_sxtah (void)
8755 {
8756   inst.instruction |= inst.operands[0].reg << 12;
8757   inst.instruction |= inst.operands[1].reg << 16;
8758   inst.instruction |= inst.operands[2].reg;
8759   inst.instruction |= inst.operands[3].imm << 10;
8760 }
8761
8762 /* ARM V6 SXTH.
8763
8764    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8765    Condition defaults to COND_ALWAYS.
8766    Error if any register uses R15.  */
8767
8768 static void
8769 do_sxth (void)
8770 {
8771   inst.instruction |= inst.operands[0].reg << 12;
8772   inst.instruction |= inst.operands[1].reg;
8773   inst.instruction |= inst.operands[2].imm << 10;
8774 }
8775 \f
8776 /* VFP instructions.  In a logical order: SP variant first, monad
8777    before dyad, arithmetic then move then load/store.  */
8778
8779 static void
8780 do_vfp_sp_monadic (void)
8781 {
8782   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8783   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8784 }
8785
8786 static void
8787 do_vfp_sp_dyadic (void)
8788 {
8789   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8790   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8791   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8792 }
8793
8794 static void
8795 do_vfp_sp_compare_z (void)
8796 {
8797   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8798 }
8799
8800 static void
8801 do_vfp_dp_sp_cvt (void)
8802 {
8803   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8804   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8805 }
8806
8807 static void
8808 do_vfp_sp_dp_cvt (void)
8809 {
8810   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8811   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8812 }
8813
8814 static void
8815 do_vfp_reg_from_sp (void)
8816 {
8817   inst.instruction |= inst.operands[0].reg << 12;
8818   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8819 }
8820
8821 static void
8822 do_vfp_reg2_from_sp2 (void)
8823 {
8824   constraint (inst.operands[2].imm != 2,
8825               _("only two consecutive VFP SP registers allowed here"));
8826   inst.instruction |= inst.operands[0].reg << 12;
8827   inst.instruction |= inst.operands[1].reg << 16;
8828   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8829 }
8830
8831 static void
8832 do_vfp_sp_from_reg (void)
8833 {
8834   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
8835   inst.instruction |= inst.operands[1].reg << 12;
8836 }
8837
8838 static void
8839 do_vfp_sp2_from_reg2 (void)
8840 {
8841   constraint (inst.operands[0].imm != 2,
8842               _("only two consecutive VFP SP registers allowed here"));
8843   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
8844   inst.instruction |= inst.operands[1].reg << 12;
8845   inst.instruction |= inst.operands[2].reg << 16;
8846 }
8847
8848 static void
8849 do_vfp_sp_ldst (void)
8850 {
8851   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8852   encode_arm_cp_address (1, FALSE, TRUE, 0);
8853 }
8854
8855 static void
8856 do_vfp_dp_ldst (void)
8857 {
8858   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8859   encode_arm_cp_address (1, FALSE, TRUE, 0);
8860 }
8861
8862
8863 static void
8864 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
8865 {
8866   if (inst.operands[0].writeback)
8867     inst.instruction |= WRITE_BACK;
8868   else
8869     constraint (ldstm_type != VFP_LDSTMIA,
8870                 _("this addressing mode requires base-register writeback"));
8871   inst.instruction |= inst.operands[0].reg << 16;
8872   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
8873   inst.instruction |= inst.operands[1].imm;
8874 }
8875
8876 static void
8877 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
8878 {
8879   int count;
8880
8881   if (inst.operands[0].writeback)
8882     inst.instruction |= WRITE_BACK;
8883   else
8884     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
8885                 _("this addressing mode requires base-register writeback"));
8886
8887   inst.instruction |= inst.operands[0].reg << 16;
8888   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8889
8890   count = inst.operands[1].imm << 1;
8891   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
8892     count += 1;
8893
8894   inst.instruction |= count;
8895 }
8896
8897 static void
8898 do_vfp_sp_ldstmia (void)
8899 {
8900   vfp_sp_ldstm (VFP_LDSTMIA);
8901 }
8902
8903 static void
8904 do_vfp_sp_ldstmdb (void)
8905 {
8906   vfp_sp_ldstm (VFP_LDSTMDB);
8907 }
8908
8909 static void
8910 do_vfp_dp_ldstmia (void)
8911 {
8912   vfp_dp_ldstm (VFP_LDSTMIA);
8913 }
8914
8915 static void
8916 do_vfp_dp_ldstmdb (void)
8917 {
8918   vfp_dp_ldstm (VFP_LDSTMDB);
8919 }
8920
8921 static void
8922 do_vfp_xp_ldstmia (void)
8923 {
8924   vfp_dp_ldstm (VFP_LDSTMIAX);
8925 }
8926
8927 static void
8928 do_vfp_xp_ldstmdb (void)
8929 {
8930   vfp_dp_ldstm (VFP_LDSTMDBX);
8931 }
8932
8933 static void
8934 do_vfp_dp_rd_rm (void)
8935 {
8936   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8937   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8938 }
8939
8940 static void
8941 do_vfp_dp_rn_rd (void)
8942 {
8943   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
8944   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8945 }
8946
8947 static void
8948 do_vfp_dp_rd_rn (void)
8949 {
8950   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8951   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8952 }
8953
8954 static void
8955 do_vfp_dp_rd_rn_rm (void)
8956 {
8957   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8958   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8959   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
8960 }
8961
8962 static void
8963 do_vfp_dp_rd (void)
8964 {
8965   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8966 }
8967
8968 static void
8969 do_vfp_dp_rm_rd_rn (void)
8970 {
8971   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
8972   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8973   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
8974 }
8975
8976 /* VFPv3 instructions.  */
8977 static void
8978 do_vfp_sp_const (void)
8979 {
8980   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8981   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8982   inst.instruction |= (inst.operands[1].imm & 0x0f);
8983 }
8984
8985 static void
8986 do_vfp_dp_const (void)
8987 {
8988   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8989   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8990   inst.instruction |= (inst.operands[1].imm & 0x0f);
8991 }
8992
8993 static void
8994 vfp_conv (int srcsize)
8995 {
8996   int immbits = srcsize - inst.operands[1].imm;
8997
8998   if (srcsize == 16 && !(immbits >= 0 && immbits <= srcsize))
8999     {
9000       /* If srcsize is 16, inst.operands[1].imm must be in the range 0-16.
9001          i.e. immbits must be in range 0 - 16.  */
9002       inst.error = _("immediate value out of range, expected range [0, 16]");
9003       return;
9004     }
9005   else if (srcsize == 32 && !(immbits >= 0 && immbits < srcsize))
9006     {
9007       /* If srcsize is 32, inst.operands[1].imm must be in the range 1-32.
9008          i.e. immbits must be in range 0 - 31.  */
9009       inst.error = _("immediate value out of range, expected range [1, 32]");
9010       return;
9011     }
9012
9013   inst.instruction |= (immbits & 1) << 5;
9014   inst.instruction |= (immbits >> 1);
9015 }
9016
9017 static void
9018 do_vfp_sp_conv_16 (void)
9019 {
9020   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9021   vfp_conv (16);
9022 }
9023
9024 static void
9025 do_vfp_dp_conv_16 (void)
9026 {
9027   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9028   vfp_conv (16);
9029 }
9030
9031 static void
9032 do_vfp_sp_conv_32 (void)
9033 {
9034   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9035   vfp_conv (32);
9036 }
9037
9038 static void
9039 do_vfp_dp_conv_32 (void)
9040 {
9041   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9042   vfp_conv (32);
9043 }
9044 \f
9045 /* FPA instructions.  Also in a logical order.  */
9046
9047 static void
9048 do_fpa_cmp (void)
9049 {
9050   inst.instruction |= inst.operands[0].reg << 16;
9051   inst.instruction |= inst.operands[1].reg;
9052 }
9053
9054 static void
9055 do_fpa_ldmstm (void)
9056 {
9057   inst.instruction |= inst.operands[0].reg << 12;
9058   switch (inst.operands[1].imm)
9059     {
9060     case 1: inst.instruction |= CP_T_X;          break;
9061     case 2: inst.instruction |= CP_T_Y;          break;
9062     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
9063     case 4:                                      break;
9064     default: abort ();
9065     }
9066
9067   if (inst.instruction & (PRE_INDEX | INDEX_UP))
9068     {
9069       /* The instruction specified "ea" or "fd", so we can only accept
9070          [Rn]{!}.  The instruction does not really support stacking or
9071          unstacking, so we have to emulate these by setting appropriate
9072          bits and offsets.  */
9073       constraint (inst.reloc.exp.X_op != O_constant
9074                   || inst.reloc.exp.X_add_number != 0,
9075                   _("this instruction does not support indexing"));
9076
9077       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
9078         inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
9079
9080       if (!(inst.instruction & INDEX_UP))
9081         inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
9082
9083       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
9084         {
9085           inst.operands[2].preind = 0;
9086           inst.operands[2].postind = 1;
9087         }
9088     }
9089
9090   encode_arm_cp_address (2, TRUE, TRUE, 0);
9091 }
9092 \f
9093 /* iWMMXt instructions: strictly in alphabetical order.  */
9094
9095 static void
9096 do_iwmmxt_tandorc (void)
9097 {
9098   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
9099 }
9100
9101 static void
9102 do_iwmmxt_textrc (void)
9103 {
9104   inst.instruction |= inst.operands[0].reg << 12;
9105   inst.instruction |= inst.operands[1].imm;
9106 }
9107
9108 static void
9109 do_iwmmxt_textrm (void)
9110 {
9111   inst.instruction |= inst.operands[0].reg << 12;
9112   inst.instruction |= inst.operands[1].reg << 16;
9113   inst.instruction |= inst.operands[2].imm;
9114 }
9115
9116 static void
9117 do_iwmmxt_tinsr (void)
9118 {
9119   inst.instruction |= inst.operands[0].reg << 16;
9120   inst.instruction |= inst.operands[1].reg << 12;
9121   inst.instruction |= inst.operands[2].imm;
9122 }
9123
9124 static void
9125 do_iwmmxt_tmia (void)
9126 {
9127   inst.instruction |= inst.operands[0].reg << 5;
9128   inst.instruction |= inst.operands[1].reg;
9129   inst.instruction |= inst.operands[2].reg << 12;
9130 }
9131
9132 static void
9133 do_iwmmxt_waligni (void)
9134 {
9135   inst.instruction |= inst.operands[0].reg << 12;
9136   inst.instruction |= inst.operands[1].reg << 16;
9137   inst.instruction |= inst.operands[2].reg;
9138   inst.instruction |= inst.operands[3].imm << 20;
9139 }
9140
9141 static void
9142 do_iwmmxt_wmerge (void)
9143 {
9144   inst.instruction |= inst.operands[0].reg << 12;
9145   inst.instruction |= inst.operands[1].reg << 16;
9146   inst.instruction |= inst.operands[2].reg;
9147   inst.instruction |= inst.operands[3].imm << 21;
9148 }
9149
9150 static void
9151 do_iwmmxt_wmov (void)
9152 {
9153   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
9154   inst.instruction |= inst.operands[0].reg << 12;
9155   inst.instruction |= inst.operands[1].reg << 16;
9156   inst.instruction |= inst.operands[1].reg;
9157 }
9158
9159 static void
9160 do_iwmmxt_wldstbh (void)
9161 {
9162   int reloc;
9163   inst.instruction |= inst.operands[0].reg << 12;
9164   if (thumb_mode)
9165     reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
9166   else
9167     reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
9168   encode_arm_cp_address (1, TRUE, FALSE, reloc);
9169 }
9170
9171 static void
9172 do_iwmmxt_wldstw (void)
9173 {
9174   /* RIWR_RIWC clears .isreg for a control register.  */
9175   if (!inst.operands[0].isreg)
9176     {
9177       constraint (inst.cond != COND_ALWAYS, BAD_COND);
9178       inst.instruction |= 0xf0000000;
9179     }
9180
9181   inst.instruction |= inst.operands[0].reg << 12;
9182   encode_arm_cp_address (1, TRUE, TRUE, 0);
9183 }
9184
9185 static void
9186 do_iwmmxt_wldstd (void)
9187 {
9188   inst.instruction |= inst.operands[0].reg << 12;
9189   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
9190       && inst.operands[1].immisreg)
9191     {
9192       inst.instruction &= ~0x1a000ff;
9193       inst.instruction |= (0xf << 28);
9194       if (inst.operands[1].preind)
9195         inst.instruction |= PRE_INDEX;
9196       if (!inst.operands[1].negative)
9197         inst.instruction |= INDEX_UP;
9198       if (inst.operands[1].writeback)
9199         inst.instruction |= WRITE_BACK;
9200       inst.instruction |= inst.operands[1].reg << 16;
9201       inst.instruction |= inst.reloc.exp.X_add_number << 4;
9202       inst.instruction |= inst.operands[1].imm;
9203     }
9204   else
9205     encode_arm_cp_address (1, TRUE, FALSE, 0);
9206 }
9207
9208 static void
9209 do_iwmmxt_wshufh (void)
9210 {
9211   inst.instruction |= inst.operands[0].reg << 12;
9212   inst.instruction |= inst.operands[1].reg << 16;
9213   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
9214   inst.instruction |= (inst.operands[2].imm & 0x0f);
9215 }
9216
9217 static void
9218 do_iwmmxt_wzero (void)
9219 {
9220   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
9221   inst.instruction |= inst.operands[0].reg;
9222   inst.instruction |= inst.operands[0].reg << 12;
9223   inst.instruction |= inst.operands[0].reg << 16;
9224 }
9225
9226 static void
9227 do_iwmmxt_wrwrwr_or_imm5 (void)
9228 {
9229   if (inst.operands[2].isreg)
9230     do_rd_rn_rm ();
9231   else {
9232     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
9233                 _("immediate operand requires iWMMXt2"));
9234     do_rd_rn ();
9235     if (inst.operands[2].imm == 0)
9236       {
9237         switch ((inst.instruction >> 20) & 0xf)
9238           {
9239           case 4:
9240           case 5:
9241           case 6:
9242           case 7:
9243             /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
9244             inst.operands[2].imm = 16;
9245             inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
9246             break;
9247           case 8:
9248           case 9:
9249           case 10:
9250           case 11:
9251             /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
9252             inst.operands[2].imm = 32;
9253             inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
9254             break;
9255           case 12:
9256           case 13:
9257           case 14:
9258           case 15:
9259             {
9260               /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
9261               unsigned long wrn;
9262               wrn = (inst.instruction >> 16) & 0xf;
9263               inst.instruction &= 0xff0fff0f;
9264               inst.instruction |= wrn;
9265               /* Bail out here; the instruction is now assembled.  */
9266               return;
9267             }
9268           }
9269       }
9270     /* Map 32 -> 0, etc.  */
9271     inst.operands[2].imm &= 0x1f;
9272     inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
9273   }
9274 }
9275 \f
9276 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
9277    operations first, then control, shift, and load/store.  */
9278
9279 /* Insns like "foo X,Y,Z".  */
9280
9281 static void
9282 do_mav_triple (void)
9283 {
9284   inst.instruction |= inst.operands[0].reg << 16;
9285   inst.instruction |= inst.operands[1].reg;
9286   inst.instruction |= inst.operands[2].reg << 12;
9287 }
9288
9289 /* Insns like "foo W,X,Y,Z".
9290     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
9291
9292 static void
9293 do_mav_quad (void)
9294 {
9295   inst.instruction |= inst.operands[0].reg << 5;
9296   inst.instruction |= inst.operands[1].reg << 12;
9297   inst.instruction |= inst.operands[2].reg << 16;
9298   inst.instruction |= inst.operands[3].reg;
9299 }
9300
9301 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
9302 static void
9303 do_mav_dspsc (void)
9304 {
9305   inst.instruction |= inst.operands[1].reg << 12;
9306 }
9307
9308 /* Maverick shift immediate instructions.
9309    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
9310    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
9311
9312 static void
9313 do_mav_shift (void)
9314 {
9315   int imm = inst.operands[2].imm;
9316
9317   inst.instruction |= inst.operands[0].reg << 12;
9318   inst.instruction |= inst.operands[1].reg << 16;
9319
9320   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
9321      Bits 5-7 of the insn should have bits 4-6 of the immediate.
9322      Bit 4 should be 0.  */
9323   imm = (imm & 0xf) | ((imm & 0x70) << 1);
9324
9325   inst.instruction |= imm;
9326 }
9327 \f
9328 /* XScale instructions.  Also sorted arithmetic before move.  */
9329
9330 /* Xscale multiply-accumulate (argument parse)
9331      MIAcc   acc0,Rm,Rs
9332      MIAPHcc acc0,Rm,Rs
9333      MIAxycc acc0,Rm,Rs.  */
9334
9335 static void
9336 do_xsc_mia (void)
9337 {
9338   inst.instruction |= inst.operands[1].reg;
9339   inst.instruction |= inst.operands[2].reg << 12;
9340 }
9341
9342 /* Xscale move-accumulator-register (argument parse)
9343
9344      MARcc   acc0,RdLo,RdHi.  */
9345
9346 static void
9347 do_xsc_mar (void)
9348 {
9349   inst.instruction |= inst.operands[1].reg << 12;
9350   inst.instruction |= inst.operands[2].reg << 16;
9351 }
9352
9353 /* Xscale move-register-accumulator (argument parse)
9354
9355      MRAcc   RdLo,RdHi,acc0.  */
9356
9357 static void
9358 do_xsc_mra (void)
9359 {
9360   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
9361   inst.instruction |= inst.operands[0].reg << 12;
9362   inst.instruction |= inst.operands[1].reg << 16;
9363 }
9364 \f
9365 /* Encoding functions relevant only to Thumb.  */
9366
9367 /* inst.operands[i] is a shifted-register operand; encode
9368    it into inst.instruction in the format used by Thumb32.  */
9369
9370 static void
9371 encode_thumb32_shifted_operand (int i)
9372 {
9373   unsigned int value = inst.reloc.exp.X_add_number;
9374   unsigned int shift = inst.operands[i].shift_kind;
9375
9376   constraint (inst.operands[i].immisreg,
9377               _("shift by register not allowed in thumb mode"));
9378   inst.instruction |= inst.operands[i].reg;
9379   if (shift == SHIFT_RRX)
9380     inst.instruction |= SHIFT_ROR << 4;
9381   else
9382     {
9383       constraint (inst.reloc.exp.X_op != O_constant,
9384                   _("expression too complex"));
9385
9386       constraint (value > 32
9387                   || (value == 32 && (shift == SHIFT_LSL
9388                                       || shift == SHIFT_ROR)),
9389                   _("shift expression is too large"));
9390
9391       if (value == 0)
9392         shift = SHIFT_LSL;
9393       else if (value == 32)
9394         value = 0;
9395
9396       inst.instruction |= shift << 4;
9397       inst.instruction |= (value & 0x1c) << 10;
9398       inst.instruction |= (value & 0x03) << 6;
9399     }
9400 }
9401
9402
9403 /* inst.operands[i] was set up by parse_address.  Encode it into a
9404    Thumb32 format load or store instruction.  Reject forms that cannot
9405    be used with such instructions.  If is_t is true, reject forms that
9406    cannot be used with a T instruction; if is_d is true, reject forms
9407    that cannot be used with a D instruction.  If it is a store insn,
9408    reject PC in Rn.  */
9409
9410 static void
9411 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
9412 {
9413   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
9414
9415   constraint (!inst.operands[i].isreg,
9416               _("Instruction does not support =N addresses"));
9417
9418   inst.instruction |= inst.operands[i].reg << 16;
9419   if (inst.operands[i].immisreg)
9420     {
9421       constraint (is_pc, BAD_PC_ADDRESSING);
9422       constraint (is_t || is_d, _("cannot use register index with this instruction"));
9423       constraint (inst.operands[i].negative,
9424                   _("Thumb does not support negative register indexing"));
9425       constraint (inst.operands[i].postind,
9426                   _("Thumb does not support register post-indexing"));
9427       constraint (inst.operands[i].writeback,
9428                   _("Thumb does not support register indexing with writeback"));
9429       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
9430                   _("Thumb supports only LSL in shifted register indexing"));
9431
9432       inst.instruction |= inst.operands[i].imm;
9433       if (inst.operands[i].shifted)
9434         {
9435           constraint (inst.reloc.exp.X_op != O_constant,
9436                       _("expression too complex"));
9437           constraint (inst.reloc.exp.X_add_number < 0
9438                       || inst.reloc.exp.X_add_number > 3,
9439                       _("shift out of range"));
9440           inst.instruction |= inst.reloc.exp.X_add_number << 4;
9441         }
9442       inst.reloc.type = BFD_RELOC_UNUSED;
9443     }
9444   else if (inst.operands[i].preind)
9445     {
9446       constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
9447       constraint (is_t && inst.operands[i].writeback,
9448                   _("cannot use writeback with this instruction"));
9449       constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0),
9450                   BAD_PC_ADDRESSING);
9451
9452       if (is_d)
9453         {
9454           inst.instruction |= 0x01000000;
9455           if (inst.operands[i].writeback)
9456             inst.instruction |= 0x00200000;
9457         }
9458       else
9459         {
9460           inst.instruction |= 0x00000c00;
9461           if (inst.operands[i].writeback)
9462             inst.instruction |= 0x00000100;
9463         }
9464       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9465     }
9466   else if (inst.operands[i].postind)
9467     {
9468       gas_assert (inst.operands[i].writeback);
9469       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
9470       constraint (is_t, _("cannot use post-indexing with this instruction"));
9471
9472       if (is_d)
9473         inst.instruction |= 0x00200000;
9474       else
9475         inst.instruction |= 0x00000900;
9476       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9477     }
9478   else /* unindexed - only for coprocessor */
9479     inst.error = _("instruction does not accept unindexed addressing");
9480 }
9481
9482 /* Table of Thumb instructions which exist in both 16- and 32-bit
9483    encodings (the latter only in post-V6T2 cores).  The index is the
9484    value used in the insns table below.  When there is more than one
9485    possible 16-bit encoding for the instruction, this table always
9486    holds variant (1).
9487    Also contains several pseudo-instructions used during relaxation.  */
9488 #define T16_32_TAB                              \
9489   X(_adc,   4140, eb400000),                    \
9490   X(_adcs,  4140, eb500000),                    \
9491   X(_add,   1c00, eb000000),                    \
9492   X(_adds,  1c00, eb100000),                    \
9493   X(_addi,  0000, f1000000),                    \
9494   X(_addis, 0000, f1100000),                    \
9495   X(_add_pc,000f, f20f0000),                    \
9496   X(_add_sp,000d, f10d0000),                    \
9497   X(_adr,   000f, f20f0000),                    \
9498   X(_and,   4000, ea000000),                    \
9499   X(_ands,  4000, ea100000),                    \
9500   X(_asr,   1000, fa40f000),                    \
9501   X(_asrs,  1000, fa50f000),                    \
9502   X(_b,     e000, f000b000),                    \
9503   X(_bcond, d000, f0008000),                    \
9504   X(_bic,   4380, ea200000),                    \
9505   X(_bics,  4380, ea300000),                    \
9506   X(_cmn,   42c0, eb100f00),                    \
9507   X(_cmp,   2800, ebb00f00),                    \
9508   X(_cpsie, b660, f3af8400),                    \
9509   X(_cpsid, b670, f3af8600),                    \
9510   X(_cpy,   4600, ea4f0000),                    \
9511   X(_dec_sp,80dd, f1ad0d00),                    \
9512   X(_eor,   4040, ea800000),                    \
9513   X(_eors,  4040, ea900000),                    \
9514   X(_inc_sp,00dd, f10d0d00),                    \
9515   X(_ldmia, c800, e8900000),                    \
9516   X(_ldr,   6800, f8500000),                    \
9517   X(_ldrb,  7800, f8100000),                    \
9518   X(_ldrh,  8800, f8300000),                    \
9519   X(_ldrsb, 5600, f9100000),                    \
9520   X(_ldrsh, 5e00, f9300000),                    \
9521   X(_ldr_pc,4800, f85f0000),                    \
9522   X(_ldr_pc2,4800, f85f0000),                   \
9523   X(_ldr_sp,9800, f85d0000),                    \
9524   X(_lsl,   0000, fa00f000),                    \
9525   X(_lsls,  0000, fa10f000),                    \
9526   X(_lsr,   0800, fa20f000),                    \
9527   X(_lsrs,  0800, fa30f000),                    \
9528   X(_mov,   2000, ea4f0000),                    \
9529   X(_movs,  2000, ea5f0000),                    \
9530   X(_mul,   4340, fb00f000),                     \
9531   X(_muls,  4340, ffffffff), /* no 32b muls */  \
9532   X(_mvn,   43c0, ea6f0000),                    \
9533   X(_mvns,  43c0, ea7f0000),                    \
9534   X(_neg,   4240, f1c00000), /* rsb #0 */       \
9535   X(_negs,  4240, f1d00000), /* rsbs #0 */      \
9536   X(_orr,   4300, ea400000),                    \
9537   X(_orrs,  4300, ea500000),                    \
9538   X(_pop,   bc00, e8bd0000), /* ldmia sp!,... */        \
9539   X(_push,  b400, e92d0000), /* stmdb sp!,... */        \
9540   X(_rev,   ba00, fa90f080),                    \
9541   X(_rev16, ba40, fa90f090),                    \
9542   X(_revsh, bac0, fa90f0b0),                    \
9543   X(_ror,   41c0, fa60f000),                    \
9544   X(_rors,  41c0, fa70f000),                    \
9545   X(_sbc,   4180, eb600000),                    \
9546   X(_sbcs,  4180, eb700000),                    \
9547   X(_stmia, c000, e8800000),                    \
9548   X(_str,   6000, f8400000),                    \
9549   X(_strb,  7000, f8000000),                    \
9550   X(_strh,  8000, f8200000),                    \
9551   X(_str_sp,9000, f84d0000),                    \
9552   X(_sub,   1e00, eba00000),                    \
9553   X(_subs,  1e00, ebb00000),                    \
9554   X(_subi,  8000, f1a00000),                    \
9555   X(_subis, 8000, f1b00000),                    \
9556   X(_sxtb,  b240, fa4ff080),                    \
9557   X(_sxth,  b200, fa0ff080),                    \
9558   X(_tst,   4200, ea100f00),                    \
9559   X(_uxtb,  b2c0, fa5ff080),                    \
9560   X(_uxth,  b280, fa1ff080),                    \
9561   X(_nop,   bf00, f3af8000),                    \
9562   X(_yield, bf10, f3af8001),                    \
9563   X(_wfe,   bf20, f3af8002),                    \
9564   X(_wfi,   bf30, f3af8003),                    \
9565   X(_sev,   bf40, f3af8004),                    \
9566   X(_sevl,  bf50, f3af8005),                    \
9567   X(_udf,   de00, f7f0a000)
9568
9569 /* To catch errors in encoding functions, the codes are all offset by
9570    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
9571    as 16-bit instructions.  */
9572 #define X(a,b,c) T_MNEM##a
9573 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
9574 #undef X
9575
9576 #define X(a,b,c) 0x##b
9577 static const unsigned short thumb_op16[] = { T16_32_TAB };
9578 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
9579 #undef X
9580
9581 #define X(a,b,c) 0x##c
9582 static const unsigned int thumb_op32[] = { T16_32_TAB };
9583 #define THUMB_OP32(n)        (thumb_op32[(n) - (T16_32_OFFSET + 1)])
9584 #define THUMB_SETS_FLAGS(n)  (THUMB_OP32 (n) & 0x00100000)
9585 #undef X
9586 #undef T16_32_TAB
9587
9588 /* Thumb instruction encoders, in alphabetical order.  */
9589
9590 /* ADDW or SUBW.  */
9591
9592 static void
9593 do_t_add_sub_w (void)
9594 {
9595   int Rd, Rn;
9596
9597   Rd = inst.operands[0].reg;
9598   Rn = inst.operands[1].reg;
9599
9600   /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
9601      is the SP-{plus,minus}-immediate form of the instruction.  */
9602   if (Rn == REG_SP)
9603     constraint (Rd == REG_PC, BAD_PC);
9604   else
9605     reject_bad_reg (Rd);
9606
9607   inst.instruction |= (Rn << 16) | (Rd << 8);
9608   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9609 }
9610
9611 /* Parse an add or subtract instruction.  We get here with inst.instruction
9612    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
9613
9614 static void
9615 do_t_add_sub (void)
9616 {
9617   int Rd, Rs, Rn;
9618
9619   Rd = inst.operands[0].reg;
9620   Rs = (inst.operands[1].present
9621         ? inst.operands[1].reg    /* Rd, Rs, foo */
9622         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9623
9624   if (Rd == REG_PC)
9625     set_it_insn_type_last ();
9626
9627   if (unified_syntax)
9628     {
9629       bfd_boolean flags;
9630       bfd_boolean narrow;
9631       int opcode;
9632
9633       flags = (inst.instruction == T_MNEM_adds
9634                || inst.instruction == T_MNEM_subs);
9635       if (flags)
9636         narrow = !in_it_block ();
9637       else
9638         narrow = in_it_block ();
9639       if (!inst.operands[2].isreg)
9640         {
9641           int add;
9642
9643           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9644
9645           add = (inst.instruction == T_MNEM_add
9646                  || inst.instruction == T_MNEM_adds);
9647           opcode = 0;
9648           if (inst.size_req != 4)
9649             {
9650               /* Attempt to use a narrow opcode, with relaxation if
9651                  appropriate.  */
9652               if (Rd == REG_SP && Rs == REG_SP && !flags)
9653                 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
9654               else if (Rd <= 7 && Rs == REG_SP && add && !flags)
9655                 opcode = T_MNEM_add_sp;
9656               else if (Rd <= 7 && Rs == REG_PC && add && !flags)
9657                 opcode = T_MNEM_add_pc;
9658               else if (Rd <= 7 && Rs <= 7 && narrow)
9659                 {
9660                   if (flags)
9661                     opcode = add ? T_MNEM_addis : T_MNEM_subis;
9662                   else
9663                     opcode = add ? T_MNEM_addi : T_MNEM_subi;
9664                 }
9665               if (opcode)
9666                 {
9667                   inst.instruction = THUMB_OP16(opcode);
9668                   inst.instruction |= (Rd << 4) | Rs;
9669                   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9670                   if (inst.size_req != 2)
9671                     inst.relax = opcode;
9672                 }
9673               else
9674                 constraint (inst.size_req == 2, BAD_HIREG);
9675             }
9676           if (inst.size_req == 4
9677               || (inst.size_req != 2 && !opcode))
9678             {
9679               if (Rd == REG_PC)
9680                 {
9681                   constraint (add, BAD_PC);
9682                   constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9683                              _("only SUBS PC, LR, #const allowed"));
9684                   constraint (inst.reloc.exp.X_op != O_constant,
9685                               _("expression too complex"));
9686                   constraint (inst.reloc.exp.X_add_number < 0
9687                               || inst.reloc.exp.X_add_number > 0xff,
9688                              _("immediate value out of range"));
9689                   inst.instruction = T2_SUBS_PC_LR
9690                                      | inst.reloc.exp.X_add_number;
9691                   inst.reloc.type = BFD_RELOC_UNUSED;
9692                   return;
9693                 }
9694               else if (Rs == REG_PC)
9695                 {
9696                   /* Always use addw/subw.  */
9697                   inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9698                   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9699                 }
9700               else
9701                 {
9702                   inst.instruction = THUMB_OP32 (inst.instruction);
9703                   inst.instruction = (inst.instruction & 0xe1ffffff)
9704                                      | 0x10000000;
9705                   if (flags)
9706                     inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9707                   else
9708                     inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9709                 }
9710               inst.instruction |= Rd << 8;
9711               inst.instruction |= Rs << 16;
9712             }
9713         }
9714       else
9715         {
9716           unsigned int value = inst.reloc.exp.X_add_number;
9717           unsigned int shift = inst.operands[2].shift_kind;
9718
9719           Rn = inst.operands[2].reg;
9720           /* See if we can do this with a 16-bit instruction.  */
9721           if (!inst.operands[2].shifted && inst.size_req != 4)
9722             {
9723               if (Rd > 7 || Rs > 7 || Rn > 7)
9724                 narrow = FALSE;
9725
9726               if (narrow)
9727                 {
9728                   inst.instruction = ((inst.instruction == T_MNEM_adds
9729                                        || inst.instruction == T_MNEM_add)
9730                                       ? T_OPCODE_ADD_R3
9731                                       : T_OPCODE_SUB_R3);
9732                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9733                   return;
9734                 }
9735
9736               if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
9737                 {
9738                   /* Thumb-1 cores (except v6-M) require at least one high
9739                      register in a narrow non flag setting add.  */
9740                   if (Rd > 7 || Rn > 7
9741                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9742                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
9743                     {
9744                       if (Rd == Rn)
9745                         {
9746                           Rn = Rs;
9747                           Rs = Rd;
9748                         }
9749                       inst.instruction = T_OPCODE_ADD_HI;
9750                       inst.instruction |= (Rd & 8) << 4;
9751                       inst.instruction |= (Rd & 7);
9752                       inst.instruction |= Rn << 3;
9753                       return;
9754                     }
9755                 }
9756             }
9757
9758           constraint (Rd == REG_PC, BAD_PC);
9759           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9760           constraint (Rs == REG_PC, BAD_PC);
9761           reject_bad_reg (Rn);
9762
9763           /* If we get here, it can't be done in 16 bits.  */
9764           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9765                       _("shift must be constant"));
9766           inst.instruction = THUMB_OP32 (inst.instruction);
9767           inst.instruction |= Rd << 8;
9768           inst.instruction |= Rs << 16;
9769           constraint (Rd == REG_SP && Rs == REG_SP && value > 3,
9770                       _("shift value over 3 not allowed in thumb mode"));
9771           constraint (Rd == REG_SP && Rs == REG_SP && shift != SHIFT_LSL,
9772                       _("only LSL shift allowed in thumb mode"));
9773           encode_thumb32_shifted_operand (2);
9774         }
9775     }
9776   else
9777     {
9778       constraint (inst.instruction == T_MNEM_adds
9779                   || inst.instruction == T_MNEM_subs,
9780                   BAD_THUMB32);
9781
9782       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
9783         {
9784           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9785                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9786                       BAD_HIREG);
9787
9788           inst.instruction = (inst.instruction == T_MNEM_add
9789                               ? 0x0000 : 0x8000);
9790           inst.instruction |= (Rd << 4) | Rs;
9791           inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9792           return;
9793         }
9794
9795       Rn = inst.operands[2].reg;
9796       constraint (inst.operands[2].shifted, _("unshifted register required"));
9797
9798       /* We now have Rd, Rs, and Rn set to registers.  */
9799       if (Rd > 7 || Rs > 7 || Rn > 7)
9800         {
9801           /* Can't do this for SUB.      */
9802           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9803           inst.instruction = T_OPCODE_ADD_HI;
9804           inst.instruction |= (Rd & 8) << 4;
9805           inst.instruction |= (Rd & 7);
9806           if (Rs == Rd)
9807             inst.instruction |= Rn << 3;
9808           else if (Rn == Rd)
9809             inst.instruction |= Rs << 3;
9810           else
9811             constraint (1, _("dest must overlap one source register"));
9812         }
9813       else
9814         {
9815           inst.instruction = (inst.instruction == T_MNEM_add
9816                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9817           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9818         }
9819     }
9820 }
9821
9822 static void
9823 do_t_adr (void)
9824 {
9825   unsigned Rd;
9826
9827   Rd = inst.operands[0].reg;
9828   reject_bad_reg (Rd);
9829
9830   if (unified_syntax && inst.size_req == 0 && Rd <= 7)
9831     {
9832       /* Defer to section relaxation.  */
9833       inst.relax = inst.instruction;
9834       inst.instruction = THUMB_OP16 (inst.instruction);
9835       inst.instruction |= Rd << 4;
9836     }
9837   else if (unified_syntax && inst.size_req != 2)
9838     {
9839       /* Generate a 32-bit opcode.  */
9840       inst.instruction = THUMB_OP32 (inst.instruction);
9841       inst.instruction |= Rd << 8;
9842       inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9843       inst.reloc.pc_rel = 1;
9844     }
9845   else
9846     {
9847       /* Generate a 16-bit opcode.  */
9848       inst.instruction = THUMB_OP16 (inst.instruction);
9849       inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9850       inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
9851       inst.reloc.pc_rel = 1;
9852
9853       inst.instruction |= Rd << 4;
9854     }
9855 }
9856
9857 /* Arithmetic instructions for which there is just one 16-bit
9858    instruction encoding, and it allows only two low registers.
9859    For maximal compatibility with ARM syntax, we allow three register
9860    operands even when Thumb-32 instructions are not available, as long
9861    as the first two are identical.  For instance, both "sbc r0,r1" and
9862    "sbc r0,r0,r1" are allowed.  */
9863 static void
9864 do_t_arit3 (void)
9865 {
9866   int Rd, Rs, Rn;
9867
9868   Rd = inst.operands[0].reg;
9869   Rs = (inst.operands[1].present
9870         ? inst.operands[1].reg    /* Rd, Rs, foo */
9871         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9872   Rn = inst.operands[2].reg;
9873
9874   reject_bad_reg (Rd);
9875   reject_bad_reg (Rs);
9876   if (inst.operands[2].isreg)
9877     reject_bad_reg (Rn);
9878
9879   if (unified_syntax)
9880     {
9881       if (!inst.operands[2].isreg)
9882         {
9883           /* For an immediate, we always generate a 32-bit opcode;
9884              section relaxation will shrink it later if possible.  */
9885           inst.instruction = THUMB_OP32 (inst.instruction);
9886           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9887           inst.instruction |= Rd << 8;
9888           inst.instruction |= Rs << 16;
9889           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9890         }
9891       else
9892         {
9893           bfd_boolean narrow;
9894
9895           /* See if we can do this with a 16-bit instruction.  */
9896           if (THUMB_SETS_FLAGS (inst.instruction))
9897             narrow = !in_it_block ();
9898           else
9899             narrow = in_it_block ();
9900
9901           if (Rd > 7 || Rn > 7 || Rs > 7)
9902             narrow = FALSE;
9903           if (inst.operands[2].shifted)
9904             narrow = FALSE;
9905           if (inst.size_req == 4)
9906             narrow = FALSE;
9907
9908           if (narrow
9909               && Rd == Rs)
9910             {
9911               inst.instruction = THUMB_OP16 (inst.instruction);
9912               inst.instruction |= Rd;
9913               inst.instruction |= Rn << 3;
9914               return;
9915             }
9916
9917           /* If we get here, it can't be done in 16 bits.  */
9918           constraint (inst.operands[2].shifted
9919                       && inst.operands[2].immisreg,
9920                       _("shift must be constant"));
9921           inst.instruction = THUMB_OP32 (inst.instruction);
9922           inst.instruction |= Rd << 8;
9923           inst.instruction |= Rs << 16;
9924           encode_thumb32_shifted_operand (2);
9925         }
9926     }
9927   else
9928     {
9929       /* On its face this is a lie - the instruction does set the
9930          flags.  However, the only supported mnemonic in this mode
9931          says it doesn't.  */
9932       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9933
9934       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9935                   _("unshifted register required"));
9936       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9937       constraint (Rd != Rs,
9938                   _("dest and source1 must be the same register"));
9939
9940       inst.instruction = THUMB_OP16 (inst.instruction);
9941       inst.instruction |= Rd;
9942       inst.instruction |= Rn << 3;
9943     }
9944 }
9945
9946 /* Similarly, but for instructions where the arithmetic operation is
9947    commutative, so we can allow either of them to be different from
9948    the destination operand in a 16-bit instruction.  For instance, all
9949    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
9950    accepted.  */
9951 static void
9952 do_t_arit3c (void)
9953 {
9954   int Rd, Rs, Rn;
9955
9956   Rd = inst.operands[0].reg;
9957   Rs = (inst.operands[1].present
9958         ? inst.operands[1].reg    /* Rd, Rs, foo */
9959         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9960   Rn = inst.operands[2].reg;
9961
9962   reject_bad_reg (Rd);
9963   reject_bad_reg (Rs);
9964   if (inst.operands[2].isreg)
9965     reject_bad_reg (Rn);
9966
9967   if (unified_syntax)
9968     {
9969       if (!inst.operands[2].isreg)
9970         {
9971           /* For an immediate, we always generate a 32-bit opcode;
9972              section relaxation will shrink it later if possible.  */
9973           inst.instruction = THUMB_OP32 (inst.instruction);
9974           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9975           inst.instruction |= Rd << 8;
9976           inst.instruction |= Rs << 16;
9977           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9978         }
9979       else
9980         {
9981           bfd_boolean narrow;
9982
9983           /* See if we can do this with a 16-bit instruction.  */
9984           if (THUMB_SETS_FLAGS (inst.instruction))
9985             narrow = !in_it_block ();
9986           else
9987             narrow = in_it_block ();
9988
9989           if (Rd > 7 || Rn > 7 || Rs > 7)
9990             narrow = FALSE;
9991           if (inst.operands[2].shifted)
9992             narrow = FALSE;
9993           if (inst.size_req == 4)
9994             narrow = FALSE;
9995
9996           if (narrow)
9997             {
9998               if (Rd == Rs)
9999                 {
10000                   inst.instruction = THUMB_OP16 (inst.instruction);
10001                   inst.instruction |= Rd;
10002                   inst.instruction |= Rn << 3;
10003                   return;
10004                 }
10005               if (Rd == Rn)
10006                 {
10007                   inst.instruction = THUMB_OP16 (inst.instruction);
10008                   inst.instruction |= Rd;
10009                   inst.instruction |= Rs << 3;
10010                   return;
10011                 }
10012             }
10013
10014           /* If we get here, it can't be done in 16 bits.  */
10015           constraint (inst.operands[2].shifted
10016                       && inst.operands[2].immisreg,
10017                       _("shift must be constant"));
10018           inst.instruction = THUMB_OP32 (inst.instruction);
10019           inst.instruction |= Rd << 8;
10020           inst.instruction |= Rs << 16;
10021           encode_thumb32_shifted_operand (2);
10022         }
10023     }
10024   else
10025     {
10026       /* On its face this is a lie - the instruction does set the
10027          flags.  However, the only supported mnemonic in this mode
10028          says it doesn't.  */
10029       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
10030
10031       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
10032                   _("unshifted register required"));
10033       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
10034
10035       inst.instruction = THUMB_OP16 (inst.instruction);
10036       inst.instruction |= Rd;
10037
10038       if (Rd == Rs)
10039         inst.instruction |= Rn << 3;
10040       else if (Rd == Rn)
10041         inst.instruction |= Rs << 3;
10042       else
10043         constraint (1, _("dest must overlap one source register"));
10044     }
10045 }
10046
10047 static void
10048 do_t_bfc (void)
10049 {
10050   unsigned Rd;
10051   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
10052   constraint (msb > 32, _("bit-field extends past end of register"));
10053   /* The instruction encoding stores the LSB and MSB,
10054      not the LSB and width.  */
10055   Rd = inst.operands[0].reg;
10056   reject_bad_reg (Rd);
10057   inst.instruction |= Rd << 8;
10058   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
10059   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
10060   inst.instruction |= msb - 1;
10061 }
10062
10063 static void
10064 do_t_bfi (void)
10065 {
10066   int Rd, Rn;
10067   unsigned int msb;
10068
10069   Rd = inst.operands[0].reg;
10070   reject_bad_reg (Rd);
10071
10072   /* #0 in second position is alternative syntax for bfc, which is
10073      the same instruction but with REG_PC in the Rm field.  */
10074   if (!inst.operands[1].isreg)
10075     Rn = REG_PC;
10076   else
10077     {
10078       Rn = inst.operands[1].reg;
10079       reject_bad_reg (Rn);
10080     }
10081
10082   msb = inst.operands[2].imm + inst.operands[3].imm;
10083   constraint (msb > 32, _("bit-field extends past end of register"));
10084   /* The instruction encoding stores the LSB and MSB,
10085      not the LSB and width.  */
10086   inst.instruction |= Rd << 8;
10087   inst.instruction |= Rn << 16;
10088   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10089   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10090   inst.instruction |= msb - 1;
10091 }
10092
10093 static void
10094 do_t_bfx (void)
10095 {
10096   unsigned Rd, Rn;
10097
10098   Rd = inst.operands[0].reg;
10099   Rn = inst.operands[1].reg;
10100
10101   reject_bad_reg (Rd);
10102   reject_bad_reg (Rn);
10103
10104   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
10105               _("bit-field extends past end of register"));
10106   inst.instruction |= Rd << 8;
10107   inst.instruction |= Rn << 16;
10108   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10109   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10110   inst.instruction |= inst.operands[3].imm - 1;
10111 }
10112
10113 /* ARM V5 Thumb BLX (argument parse)
10114         BLX <target_addr>       which is BLX(1)
10115         BLX <Rm>                which is BLX(2)
10116    Unfortunately, there are two different opcodes for this mnemonic.
10117    So, the insns[].value is not used, and the code here zaps values
10118         into inst.instruction.
10119
10120    ??? How to take advantage of the additional two bits of displacement
10121    available in Thumb32 mode?  Need new relocation?  */
10122
10123 static void
10124 do_t_blx (void)
10125 {
10126   set_it_insn_type_last ();
10127
10128   if (inst.operands[0].isreg)
10129     {
10130       constraint (inst.operands[0].reg == REG_PC, BAD_PC);
10131       /* We have a register, so this is BLX(2).  */
10132       inst.instruction |= inst.operands[0].reg << 3;
10133     }
10134   else
10135     {
10136       /* No register.  This must be BLX(1).  */
10137       inst.instruction = 0xf000e800;
10138       encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
10139     }
10140 }
10141
10142 static void
10143 do_t_branch (void)
10144 {
10145   int opcode;
10146   int cond;
10147   int reloc;
10148
10149   cond = inst.cond;
10150   set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
10151
10152   if (in_it_block ())
10153     {
10154       /* Conditional branches inside IT blocks are encoded as unconditional
10155          branches.  */
10156       cond = COND_ALWAYS;
10157     }
10158   else
10159     cond = inst.cond;
10160
10161   if (cond != COND_ALWAYS)
10162     opcode = T_MNEM_bcond;
10163   else
10164     opcode = inst.instruction;
10165
10166   if (unified_syntax
10167       && (inst.size_req == 4
10168           || (inst.size_req != 2
10169               && (inst.operands[0].hasreloc
10170                   || inst.reloc.exp.X_op == O_constant))))
10171     {
10172       inst.instruction = THUMB_OP32(opcode);
10173       if (cond == COND_ALWAYS)
10174         reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
10175       else
10176         {
10177           gas_assert (cond != 0xF);
10178           inst.instruction |= cond << 22;
10179           reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
10180         }
10181     }
10182   else
10183     {
10184       inst.instruction = THUMB_OP16(opcode);
10185       if (cond == COND_ALWAYS)
10186         reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
10187       else
10188         {
10189           inst.instruction |= cond << 8;
10190           reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
10191         }
10192       /* Allow section relaxation.  */
10193       if (unified_syntax && inst.size_req != 2)
10194         inst.relax = opcode;
10195     }
10196   inst.reloc.type = reloc;
10197   inst.reloc.pc_rel = 1;
10198 }
10199
10200 /* Actually do the work for Thumb state bkpt and hlt.  The only difference
10201    between the two is the maximum immediate allowed - which is passed in
10202    RANGE.  */
10203 static void
10204 do_t_bkpt_hlt1 (int range)
10205 {
10206   constraint (inst.cond != COND_ALWAYS,
10207               _("instruction is always unconditional"));
10208   if (inst.operands[0].present)
10209     {
10210       constraint (inst.operands[0].imm > range,
10211                   _("immediate value out of range"));
10212       inst.instruction |= inst.operands[0].imm;
10213     }
10214
10215   set_it_insn_type (NEUTRAL_IT_INSN);
10216 }
10217
10218 static void
10219 do_t_hlt (void)
10220 {
10221   do_t_bkpt_hlt1 (63);
10222 }
10223
10224 static void
10225 do_t_bkpt (void)
10226 {
10227   do_t_bkpt_hlt1 (255);
10228 }
10229
10230 static void
10231 do_t_branch23 (void)
10232 {
10233   set_it_insn_type_last ();
10234   encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
10235
10236   /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
10237      this file.  We used to simply ignore the PLT reloc type here --
10238      the branch encoding is now needed to deal with TLSCALL relocs.
10239      So if we see a PLT reloc now, put it back to how it used to be to
10240      keep the preexisting behaviour.  */
10241   if (inst.reloc.type == BFD_RELOC_ARM_PLT32)
10242     inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
10243
10244 #if defined(OBJ_COFF)
10245   /* If the destination of the branch is a defined symbol which does not have
10246      the THUMB_FUNC attribute, then we must be calling a function which has
10247      the (interfacearm) attribute.  We look for the Thumb entry point to that
10248      function and change the branch to refer to that function instead.  */
10249   if (   inst.reloc.exp.X_op == O_symbol
10250       && inst.reloc.exp.X_add_symbol != NULL
10251       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
10252       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
10253     inst.reloc.exp.X_add_symbol =
10254       find_real_start (inst.reloc.exp.X_add_symbol);
10255 #endif
10256 }
10257
10258 static void
10259 do_t_bx (void)
10260 {
10261   set_it_insn_type_last ();
10262   inst.instruction |= inst.operands[0].reg << 3;
10263   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
10264      should cause the alignment to be checked once it is known.  This is
10265      because BX PC only works if the instruction is word aligned.  */
10266 }
10267
10268 static void
10269 do_t_bxj (void)
10270 {
10271   int Rm;
10272
10273   set_it_insn_type_last ();
10274   Rm = inst.operands[0].reg;
10275   reject_bad_reg (Rm);
10276   inst.instruction |= Rm << 16;
10277 }
10278
10279 static void
10280 do_t_clz (void)
10281 {
10282   unsigned Rd;
10283   unsigned Rm;
10284
10285   Rd = inst.operands[0].reg;
10286   Rm = inst.operands[1].reg;
10287
10288   reject_bad_reg (Rd);
10289   reject_bad_reg (Rm);
10290
10291   inst.instruction |= Rd << 8;
10292   inst.instruction |= Rm << 16;
10293   inst.instruction |= Rm;
10294 }
10295
10296 static void
10297 do_t_cps (void)
10298 {
10299   set_it_insn_type (OUTSIDE_IT_INSN);
10300   inst.instruction |= inst.operands[0].imm;
10301 }
10302
10303 static void
10304 do_t_cpsi (void)
10305 {
10306   set_it_insn_type (OUTSIDE_IT_INSN);
10307   if (unified_syntax
10308       && (inst.operands[1].present || inst.size_req == 4)
10309       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
10310     {
10311       unsigned int imod = (inst.instruction & 0x0030) >> 4;
10312       inst.instruction = 0xf3af8000;
10313       inst.instruction |= imod << 9;
10314       inst.instruction |= inst.operands[0].imm << 5;
10315       if (inst.operands[1].present)
10316         inst.instruction |= 0x100 | inst.operands[1].imm;
10317     }
10318   else
10319     {
10320       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
10321                   && (inst.operands[0].imm & 4),
10322                   _("selected processor does not support 'A' form "
10323                     "of this instruction"));
10324       constraint (inst.operands[1].present || inst.size_req == 4,
10325                   _("Thumb does not support the 2-argument "
10326                     "form of this instruction"));
10327       inst.instruction |= inst.operands[0].imm;
10328     }
10329 }
10330
10331 /* THUMB CPY instruction (argument parse).  */
10332
10333 static void
10334 do_t_cpy (void)
10335 {
10336   if (inst.size_req == 4)
10337     {
10338       inst.instruction = THUMB_OP32 (T_MNEM_mov);
10339       inst.instruction |= inst.operands[0].reg << 8;
10340       inst.instruction |= inst.operands[1].reg;
10341     }
10342   else
10343     {
10344       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
10345       inst.instruction |= (inst.operands[0].reg & 0x7);
10346       inst.instruction |= inst.operands[1].reg << 3;
10347     }
10348 }
10349
10350 static void
10351 do_t_cbz (void)
10352 {
10353   set_it_insn_type (OUTSIDE_IT_INSN);
10354   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10355   inst.instruction |= inst.operands[0].reg;
10356   inst.reloc.pc_rel = 1;
10357   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
10358 }
10359
10360 static void
10361 do_t_dbg (void)
10362 {
10363   inst.instruction |= inst.operands[0].imm;
10364 }
10365
10366 static void
10367 do_t_div (void)
10368 {
10369   unsigned Rd, Rn, Rm;
10370
10371   Rd = inst.operands[0].reg;
10372   Rn = (inst.operands[1].present
10373         ? inst.operands[1].reg : Rd);
10374   Rm = inst.operands[2].reg;
10375
10376   reject_bad_reg (Rd);
10377   reject_bad_reg (Rn);
10378   reject_bad_reg (Rm);
10379
10380   inst.instruction |= Rd << 8;
10381   inst.instruction |= Rn << 16;
10382   inst.instruction |= Rm;
10383 }
10384
10385 static void
10386 do_t_hint (void)
10387 {
10388   if (unified_syntax && inst.size_req == 4)
10389     inst.instruction = THUMB_OP32 (inst.instruction);
10390   else
10391     inst.instruction = THUMB_OP16 (inst.instruction);
10392 }
10393
10394 static void
10395 do_t_it (void)
10396 {
10397   unsigned int cond = inst.operands[0].imm;
10398
10399   set_it_insn_type (IT_INSN);
10400   now_it.mask = (inst.instruction & 0xf) | 0x10;
10401   now_it.cc = cond;
10402   now_it.warn_deprecated = FALSE;
10403
10404   /* If the condition is a negative condition, invert the mask.  */
10405   if ((cond & 0x1) == 0x0)
10406     {
10407       unsigned int mask = inst.instruction & 0x000f;
10408
10409       if ((mask & 0x7) == 0)
10410         {
10411           /* No conversion needed.  */
10412           now_it.block_length = 1;
10413         }
10414       else if ((mask & 0x3) == 0)
10415         {
10416           mask ^= 0x8;
10417           now_it.block_length = 2;
10418         }
10419       else if ((mask & 0x1) == 0)
10420         {
10421           mask ^= 0xC;
10422           now_it.block_length = 3;
10423         }
10424       else
10425         {
10426           mask ^= 0xE;
10427           now_it.block_length = 4;
10428         }
10429
10430       inst.instruction &= 0xfff0;
10431       inst.instruction |= mask;
10432     }
10433
10434   inst.instruction |= cond << 4;
10435 }
10436
10437 /* Helper function used for both push/pop and ldm/stm.  */
10438 static void
10439 encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
10440 {
10441   bfd_boolean load;
10442
10443   load = (inst.instruction & (1 << 20)) != 0;
10444
10445   if (mask & (1 << 13))
10446     inst.error =  _("SP not allowed in register list");
10447
10448   if ((mask & (1 << base)) != 0
10449       && writeback)
10450     inst.error = _("having the base register in the register list when "
10451                    "using write back is UNPREDICTABLE");
10452
10453   if (load)
10454     {
10455       if (mask & (1 << 15))
10456         {
10457           if (mask & (1 << 14))
10458             inst.error = _("LR and PC should not both be in register list");
10459           else
10460             set_it_insn_type_last ();
10461         }
10462     }
10463   else
10464     {
10465       if (mask & (1 << 15))
10466         inst.error = _("PC not allowed in register list");
10467     }
10468
10469   if ((mask & (mask - 1)) == 0)
10470     {
10471       /* Single register transfers implemented as str/ldr.  */
10472       if (writeback)
10473         {
10474           if (inst.instruction & (1 << 23))
10475             inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
10476           else
10477             inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
10478         }
10479       else
10480         {
10481           if (inst.instruction & (1 << 23))
10482             inst.instruction = 0x00800000; /* ia -> [base] */
10483           else
10484             inst.instruction = 0x00000c04; /* db -> [base, #-4] */
10485         }
10486
10487       inst.instruction |= 0xf8400000;
10488       if (load)
10489         inst.instruction |= 0x00100000;
10490
10491       mask = ffs (mask) - 1;
10492       mask <<= 12;
10493     }
10494   else if (writeback)
10495     inst.instruction |= WRITE_BACK;
10496
10497   inst.instruction |= mask;
10498   inst.instruction |= base << 16;
10499 }
10500
10501 static void
10502 do_t_ldmstm (void)
10503 {
10504   /* This really doesn't seem worth it.  */
10505   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10506               _("expression too complex"));
10507   constraint (inst.operands[1].writeback,
10508               _("Thumb load/store multiple does not support {reglist}^"));
10509
10510   if (unified_syntax)
10511     {
10512       bfd_boolean narrow;
10513       unsigned mask;
10514
10515       narrow = FALSE;
10516       /* See if we can use a 16-bit instruction.  */
10517       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
10518           && inst.size_req != 4
10519           && !(inst.operands[1].imm & ~0xff))
10520         {
10521           mask = 1 << inst.operands[0].reg;
10522
10523           if (inst.operands[0].reg <= 7)
10524             {
10525               if (inst.instruction == T_MNEM_stmia
10526                   ? inst.operands[0].writeback
10527                   : (inst.operands[0].writeback
10528                      == !(inst.operands[1].imm & mask)))
10529                 {
10530                   if (inst.instruction == T_MNEM_stmia
10531                       && (inst.operands[1].imm & mask)
10532                       && (inst.operands[1].imm & (mask - 1)))
10533                     as_warn (_("value stored for r%d is UNKNOWN"),
10534                              inst.operands[0].reg);
10535
10536                   inst.instruction = THUMB_OP16 (inst.instruction);
10537                   inst.instruction |= inst.operands[0].reg << 8;
10538                   inst.instruction |= inst.operands[1].imm;
10539                   narrow = TRUE;
10540                 }
10541               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10542                 {
10543                   /* This means 1 register in reg list one of 3 situations:
10544                      1. Instruction is stmia, but without writeback.
10545                      2. lmdia without writeback, but with Rn not in
10546                         reglist.
10547                      3. ldmia with writeback, but with Rn in reglist.
10548                      Case 3 is UNPREDICTABLE behaviour, so we handle
10549                      case 1 and 2 which can be converted into a 16-bit
10550                      str or ldr. The SP cases are handled below.  */
10551                   unsigned long opcode;
10552                   /* First, record an error for Case 3.  */
10553                   if (inst.operands[1].imm & mask
10554                       && inst.operands[0].writeback)
10555                     inst.error =
10556                         _("having the base register in the register list when "
10557                           "using write back is UNPREDICTABLE");
10558
10559                   opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str
10560                                                              : T_MNEM_ldr);
10561                   inst.instruction = THUMB_OP16 (opcode);
10562                   inst.instruction |= inst.operands[0].reg << 3;
10563                   inst.instruction |= (ffs (inst.operands[1].imm)-1);
10564                   narrow = TRUE;
10565                 }
10566             }
10567           else if (inst.operands[0] .reg == REG_SP)
10568             {
10569               if (inst.operands[0].writeback)
10570                 {
10571                   inst.instruction =
10572                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10573                                     ? T_MNEM_push : T_MNEM_pop);
10574                   inst.instruction |= inst.operands[1].imm;
10575                   narrow = TRUE;
10576                 }
10577               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10578                 {
10579                   inst.instruction =
10580                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10581                                     ? T_MNEM_str_sp : T_MNEM_ldr_sp);
10582                   inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
10583                   narrow = TRUE;
10584                 }
10585             }
10586         }
10587
10588       if (!narrow)
10589         {
10590           if (inst.instruction < 0xffff)
10591             inst.instruction = THUMB_OP32 (inst.instruction);
10592
10593           encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
10594                                 inst.operands[0].writeback);
10595         }
10596     }
10597   else
10598     {
10599       constraint (inst.operands[0].reg > 7
10600                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
10601       constraint (inst.instruction != T_MNEM_ldmia
10602                   && inst.instruction != T_MNEM_stmia,
10603                   _("Thumb-2 instruction only valid in unified syntax"));
10604       if (inst.instruction == T_MNEM_stmia)
10605         {
10606           if (!inst.operands[0].writeback)
10607             as_warn (_("this instruction will write back the base register"));
10608           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
10609               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
10610             as_warn (_("value stored for r%d is UNKNOWN"),
10611                      inst.operands[0].reg);
10612         }
10613       else
10614         {
10615           if (!inst.operands[0].writeback
10616               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
10617             as_warn (_("this instruction will write back the base register"));
10618           else if (inst.operands[0].writeback
10619                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
10620             as_warn (_("this instruction will not write back the base register"));
10621         }
10622
10623       inst.instruction = THUMB_OP16 (inst.instruction);
10624       inst.instruction |= inst.operands[0].reg << 8;
10625       inst.instruction |= inst.operands[1].imm;
10626     }
10627 }
10628
10629 static void
10630 do_t_ldrex (void)
10631 {
10632   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
10633               || inst.operands[1].postind || inst.operands[1].writeback
10634               || inst.operands[1].immisreg || inst.operands[1].shifted
10635               || inst.operands[1].negative,
10636               BAD_ADDR_MODE);
10637
10638   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
10639
10640   inst.instruction |= inst.operands[0].reg << 12;
10641   inst.instruction |= inst.operands[1].reg << 16;
10642   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10643 }
10644
10645 static void
10646 do_t_ldrexd (void)
10647 {
10648   if (!inst.operands[1].present)
10649     {
10650       constraint (inst.operands[0].reg == REG_LR,
10651                   _("r14 not allowed as first register "
10652                     "when second register is omitted"));
10653       inst.operands[1].reg = inst.operands[0].reg + 1;
10654     }
10655   constraint (inst.operands[0].reg == inst.operands[1].reg,
10656               BAD_OVERLAP);
10657
10658   inst.instruction |= inst.operands[0].reg << 12;
10659   inst.instruction |= inst.operands[1].reg << 8;
10660   inst.instruction |= inst.operands[2].reg << 16;
10661 }
10662
10663 static void
10664 do_t_ldst (void)
10665 {
10666   unsigned long opcode;
10667   int Rn;
10668
10669   if (inst.operands[0].isreg
10670       && !inst.operands[0].preind
10671       && inst.operands[0].reg == REG_PC)
10672     set_it_insn_type_last ();
10673
10674   opcode = inst.instruction;
10675   if (unified_syntax)
10676     {
10677       if (!inst.operands[1].isreg)
10678         {
10679           if (opcode <= 0xffff)
10680             inst.instruction = THUMB_OP32 (opcode);
10681           if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10682             return;
10683         }
10684       if (inst.operands[1].isreg
10685           && !inst.operands[1].writeback
10686           && !inst.operands[1].shifted && !inst.operands[1].postind
10687           && !inst.operands[1].negative && inst.operands[0].reg <= 7
10688           && opcode <= 0xffff
10689           && inst.size_req != 4)
10690         {
10691           /* Insn may have a 16-bit form.  */
10692           Rn = inst.operands[1].reg;
10693           if (inst.operands[1].immisreg)
10694             {
10695               inst.instruction = THUMB_OP16 (opcode);
10696               /* [Rn, Rik] */
10697               if (Rn <= 7 && inst.operands[1].imm <= 7)
10698                 goto op16;
10699               else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
10700                 reject_bad_reg (inst.operands[1].imm);
10701             }
10702           else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
10703                     && opcode != T_MNEM_ldrsb)
10704                    || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
10705                    || (Rn == REG_SP && opcode == T_MNEM_str))
10706             {
10707               /* [Rn, #const] */
10708               if (Rn > 7)
10709                 {
10710                   if (Rn == REG_PC)
10711                     {
10712                       if (inst.reloc.pc_rel)
10713                         opcode = T_MNEM_ldr_pc2;
10714                       else
10715                         opcode = T_MNEM_ldr_pc;
10716                     }
10717                   else
10718                     {
10719                       if (opcode == T_MNEM_ldr)
10720                         opcode = T_MNEM_ldr_sp;
10721                       else
10722                         opcode = T_MNEM_str_sp;
10723                     }
10724                   inst.instruction = inst.operands[0].reg << 8;
10725                 }
10726               else
10727                 {
10728                   inst.instruction = inst.operands[0].reg;
10729                   inst.instruction |= inst.operands[1].reg << 3;
10730                 }
10731               inst.instruction |= THUMB_OP16 (opcode);
10732               if (inst.size_req == 2)
10733                 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10734               else
10735                 inst.relax = opcode;
10736               return;
10737             }
10738         }
10739       /* Definitely a 32-bit variant.  */
10740
10741       /* Warning for Erratum 752419.  */
10742       if (opcode == T_MNEM_ldr
10743           && inst.operands[0].reg == REG_SP
10744           && inst.operands[1].writeback == 1
10745           && !inst.operands[1].immisreg)
10746         {
10747           if (no_cpu_selected ()
10748               || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
10749                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
10750                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
10751             as_warn (_("This instruction may be unpredictable "
10752                        "if executed on M-profile cores "
10753                        "with interrupts enabled."));
10754         }
10755
10756       /* Do some validations regarding addressing modes.  */
10757       if (inst.operands[1].immisreg)
10758         reject_bad_reg (inst.operands[1].imm);
10759
10760       constraint (inst.operands[1].writeback == 1
10761                   && inst.operands[0].reg == inst.operands[1].reg,
10762                   BAD_OVERLAP);
10763
10764       inst.instruction = THUMB_OP32 (opcode);
10765       inst.instruction |= inst.operands[0].reg << 12;
10766       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
10767       check_ldr_r15_aligned ();
10768       return;
10769     }
10770
10771   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10772
10773   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
10774     {
10775       /* Only [Rn,Rm] is acceptable.  */
10776       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10777       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10778                   || inst.operands[1].postind || inst.operands[1].shifted
10779                   || inst.operands[1].negative,
10780                   _("Thumb does not support this addressing mode"));
10781       inst.instruction = THUMB_OP16 (inst.instruction);
10782       goto op16;
10783     }
10784
10785   inst.instruction = THUMB_OP16 (inst.instruction);
10786   if (!inst.operands[1].isreg)
10787     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10788       return;
10789
10790   constraint (!inst.operands[1].preind
10791               || inst.operands[1].shifted
10792               || inst.operands[1].writeback,
10793               _("Thumb does not support this addressing mode"));
10794   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
10795     {
10796       constraint (inst.instruction & 0x0600,
10797                   _("byte or halfword not valid for base register"));
10798       constraint (inst.operands[1].reg == REG_PC
10799                   && !(inst.instruction & THUMB_LOAD_BIT),
10800                   _("r15 based store not allowed"));
10801       constraint (inst.operands[1].immisreg,
10802                   _("invalid base register for register offset"));
10803
10804       if (inst.operands[1].reg == REG_PC)
10805         inst.instruction = T_OPCODE_LDR_PC;
10806       else if (inst.instruction & THUMB_LOAD_BIT)
10807         inst.instruction = T_OPCODE_LDR_SP;
10808       else
10809         inst.instruction = T_OPCODE_STR_SP;
10810
10811       inst.instruction |= inst.operands[0].reg << 8;
10812       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10813       return;
10814     }
10815
10816   constraint (inst.operands[1].reg > 7, BAD_HIREG);
10817   if (!inst.operands[1].immisreg)
10818     {
10819       /* Immediate offset.  */
10820       inst.instruction |= inst.operands[0].reg;
10821       inst.instruction |= inst.operands[1].reg << 3;
10822       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10823       return;
10824     }
10825
10826   /* Register offset.  */
10827   constraint (inst.operands[1].imm > 7, BAD_HIREG);
10828   constraint (inst.operands[1].negative,
10829               _("Thumb does not support this addressing mode"));
10830
10831  op16:
10832   switch (inst.instruction)
10833     {
10834     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10835     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10836     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10837     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10838     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10839     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10840     case 0x5600 /* ldrsb */:
10841     case 0x5e00 /* ldrsh */: break;
10842     default: abort ();
10843     }
10844
10845   inst.instruction |= inst.operands[0].reg;
10846   inst.instruction |= inst.operands[1].reg << 3;
10847   inst.instruction |= inst.operands[1].imm << 6;
10848 }
10849
10850 static void
10851 do_t_ldstd (void)
10852 {
10853   if (!inst.operands[1].present)
10854     {
10855       inst.operands[1].reg = inst.operands[0].reg + 1;
10856       constraint (inst.operands[0].reg == REG_LR,
10857                   _("r14 not allowed here"));
10858       constraint (inst.operands[0].reg == REG_R12,
10859                   _("r12 not allowed here"));
10860     }
10861
10862   if (inst.operands[2].writeback
10863       && (inst.operands[0].reg == inst.operands[2].reg
10864       || inst.operands[1].reg == inst.operands[2].reg))
10865     as_warn (_("base register written back, and overlaps "
10866                "one of transfer registers"));
10867
10868   inst.instruction |= inst.operands[0].reg << 12;
10869   inst.instruction |= inst.operands[1].reg << 8;
10870   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
10871 }
10872
10873 static void
10874 do_t_ldstt (void)
10875 {
10876   inst.instruction |= inst.operands[0].reg << 12;
10877   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
10878 }
10879
10880 static void
10881 do_t_mla (void)
10882 {
10883   unsigned Rd, Rn, Rm, Ra;
10884
10885   Rd = inst.operands[0].reg;
10886   Rn = inst.operands[1].reg;
10887   Rm = inst.operands[2].reg;
10888   Ra = inst.operands[3].reg;
10889
10890   reject_bad_reg (Rd);
10891   reject_bad_reg (Rn);
10892   reject_bad_reg (Rm);
10893   reject_bad_reg (Ra);
10894
10895   inst.instruction |= Rd << 8;
10896   inst.instruction |= Rn << 16;
10897   inst.instruction |= Rm;
10898   inst.instruction |= Ra << 12;
10899 }
10900
10901 static void
10902 do_t_mlal (void)
10903 {
10904   unsigned RdLo, RdHi, Rn, Rm;
10905
10906   RdLo = inst.operands[0].reg;
10907   RdHi = inst.operands[1].reg;
10908   Rn = inst.operands[2].reg;
10909   Rm = inst.operands[3].reg;
10910
10911   reject_bad_reg (RdLo);
10912   reject_bad_reg (RdHi);
10913   reject_bad_reg (Rn);
10914   reject_bad_reg (Rm);
10915
10916   inst.instruction |= RdLo << 12;
10917   inst.instruction |= RdHi << 8;
10918   inst.instruction |= Rn << 16;
10919   inst.instruction |= Rm;
10920 }
10921
10922 static void
10923 do_t_mov_cmp (void)
10924 {
10925   unsigned Rn, Rm;
10926
10927   Rn = inst.operands[0].reg;
10928   Rm = inst.operands[1].reg;
10929
10930   if (Rn == REG_PC)
10931     set_it_insn_type_last ();
10932
10933   if (unified_syntax)
10934     {
10935       int r0off = (inst.instruction == T_MNEM_mov
10936                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
10937       unsigned long opcode;
10938       bfd_boolean narrow;
10939       bfd_boolean low_regs;
10940
10941       low_regs = (Rn <= 7 && Rm <= 7);
10942       opcode = inst.instruction;
10943       if (in_it_block ())
10944         narrow = opcode != T_MNEM_movs;
10945       else
10946         narrow = opcode != T_MNEM_movs || low_regs;
10947       if (inst.size_req == 4
10948           || inst.operands[1].shifted)
10949         narrow = FALSE;
10950
10951       /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
10952       if (opcode == T_MNEM_movs && inst.operands[1].isreg
10953           && !inst.operands[1].shifted
10954           && Rn == REG_PC
10955           && Rm == REG_LR)
10956         {
10957           inst.instruction = T2_SUBS_PC_LR;
10958           return;
10959         }
10960
10961       if (opcode == T_MNEM_cmp)
10962         {
10963           constraint (Rn == REG_PC, BAD_PC);
10964           if (narrow)
10965             {
10966               /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
10967                  but valid.  */
10968               warn_deprecated_sp (Rm);
10969               /* R15 was documented as a valid choice for Rm in ARMv6,
10970                  but as UNPREDICTABLE in ARMv7.  ARM's proprietary
10971                  tools reject R15, so we do too.  */
10972               constraint (Rm == REG_PC, BAD_PC);
10973             }
10974           else
10975             reject_bad_reg (Rm);
10976         }
10977       else if (opcode == T_MNEM_mov
10978                || opcode == T_MNEM_movs)
10979         {
10980           if (inst.operands[1].isreg)
10981             {
10982               if (opcode == T_MNEM_movs)
10983                 {
10984                   reject_bad_reg (Rn);
10985                   reject_bad_reg (Rm);
10986                 }
10987               else if (narrow)
10988                 {
10989                   /* This is mov.n.  */
10990                   if ((Rn == REG_SP || Rn == REG_PC)
10991                       && (Rm == REG_SP || Rm == REG_PC))
10992                     {
10993                       as_warn (_("Use of r%u as a source register is "
10994                                  "deprecated when r%u is the destination "
10995                                  "register."), Rm, Rn);
10996                     }
10997                 }
10998               else
10999                 {
11000                   /* This is mov.w.  */
11001                   constraint (Rn == REG_PC, BAD_PC);
11002                   constraint (Rm == REG_PC, BAD_PC);
11003                   constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
11004                 }
11005             }
11006           else
11007             reject_bad_reg (Rn);
11008         }
11009
11010       if (!inst.operands[1].isreg)
11011         {
11012           /* Immediate operand.  */
11013           if (!in_it_block () && opcode == T_MNEM_mov)
11014             narrow = 0;
11015           if (low_regs && narrow)
11016             {
11017               inst.instruction = THUMB_OP16 (opcode);
11018               inst.instruction |= Rn << 8;
11019               if (inst.size_req == 2)
11020                 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11021               else
11022                 inst.relax = opcode;
11023             }
11024           else
11025             {
11026               inst.instruction = THUMB_OP32 (inst.instruction);
11027               inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11028               inst.instruction |= Rn << r0off;
11029               inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11030             }
11031         }
11032       else if (inst.operands[1].shifted && inst.operands[1].immisreg
11033                && (inst.instruction == T_MNEM_mov
11034                    || inst.instruction == T_MNEM_movs))
11035         {
11036           /* Register shifts are encoded as separate shift instructions.  */
11037           bfd_boolean flags = (inst.instruction == T_MNEM_movs);
11038
11039           if (in_it_block ())
11040             narrow = !flags;
11041           else
11042             narrow = flags;
11043
11044           if (inst.size_req == 4)
11045             narrow = FALSE;
11046
11047           if (!low_regs || inst.operands[1].imm > 7)
11048             narrow = FALSE;
11049
11050           if (Rn != Rm)
11051             narrow = FALSE;
11052
11053           switch (inst.operands[1].shift_kind)
11054             {
11055             case SHIFT_LSL:
11056               opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
11057               break;
11058             case SHIFT_ASR:
11059               opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
11060               break;
11061             case SHIFT_LSR:
11062               opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
11063               break;
11064             case SHIFT_ROR:
11065               opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
11066               break;
11067             default:
11068               abort ();
11069             }
11070
11071           inst.instruction = opcode;
11072           if (narrow)
11073             {
11074               inst.instruction |= Rn;
11075               inst.instruction |= inst.operands[1].imm << 3;
11076             }
11077           else
11078             {
11079               if (flags)
11080                 inst.instruction |= CONDS_BIT;
11081
11082               inst.instruction |= Rn << 8;
11083               inst.instruction |= Rm << 16;
11084               inst.instruction |= inst.operands[1].imm;
11085             }
11086         }
11087       else if (!narrow)
11088         {
11089           /* Some mov with immediate shift have narrow variants.
11090              Register shifts are handled above.  */
11091           if (low_regs && inst.operands[1].shifted
11092               && (inst.instruction == T_MNEM_mov
11093                   || inst.instruction == T_MNEM_movs))
11094             {
11095               if (in_it_block ())
11096                 narrow = (inst.instruction == T_MNEM_mov);
11097               else
11098                 narrow = (inst.instruction == T_MNEM_movs);
11099             }
11100
11101           if (narrow)
11102             {
11103               switch (inst.operands[1].shift_kind)
11104                 {
11105                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11106                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11107                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11108                 default: narrow = FALSE; break;
11109                 }
11110             }
11111
11112           if (narrow)
11113             {
11114               inst.instruction |= Rn;
11115               inst.instruction |= Rm << 3;
11116               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11117             }
11118           else
11119             {
11120               inst.instruction = THUMB_OP32 (inst.instruction);
11121               inst.instruction |= Rn << r0off;
11122               encode_thumb32_shifted_operand (1);
11123             }
11124         }
11125       else
11126         switch (inst.instruction)
11127           {
11128           case T_MNEM_mov:
11129             /* In v4t or v5t a move of two lowregs produces unpredictable
11130                results. Don't allow this.  */
11131             if (low_regs)
11132               {
11133                 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6),
11134                             "MOV Rd, Rs with two low registers is not "
11135                             "permitted on this architecture");
11136                 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
11137                                         arm_ext_v6);
11138               }
11139
11140             inst.instruction = T_OPCODE_MOV_HR;
11141             inst.instruction |= (Rn & 0x8) << 4;
11142             inst.instruction |= (Rn & 0x7);
11143             inst.instruction |= Rm << 3;
11144             break;
11145
11146           case T_MNEM_movs:
11147             /* We know we have low registers at this point.
11148                Generate LSLS Rd, Rs, #0.  */
11149             inst.instruction = T_OPCODE_LSL_I;
11150             inst.instruction |= Rn;
11151             inst.instruction |= Rm << 3;
11152             break;
11153
11154           case T_MNEM_cmp:
11155             if (low_regs)
11156               {
11157                 inst.instruction = T_OPCODE_CMP_LR;
11158                 inst.instruction |= Rn;
11159                 inst.instruction |= Rm << 3;
11160               }
11161             else
11162               {
11163                 inst.instruction = T_OPCODE_CMP_HR;
11164                 inst.instruction |= (Rn & 0x8) << 4;
11165                 inst.instruction |= (Rn & 0x7);
11166                 inst.instruction |= Rm << 3;
11167               }
11168             break;
11169           }
11170       return;
11171     }
11172
11173   inst.instruction = THUMB_OP16 (inst.instruction);
11174
11175   /* PR 10443: Do not silently ignore shifted operands.  */
11176   constraint (inst.operands[1].shifted,
11177               _("shifts in CMP/MOV instructions are only supported in unified syntax"));
11178
11179   if (inst.operands[1].isreg)
11180     {
11181       if (Rn < 8 && Rm < 8)
11182         {
11183           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
11184              since a MOV instruction produces unpredictable results.  */
11185           if (inst.instruction == T_OPCODE_MOV_I8)
11186             inst.instruction = T_OPCODE_ADD_I3;
11187           else
11188             inst.instruction = T_OPCODE_CMP_LR;
11189
11190           inst.instruction |= Rn;
11191           inst.instruction |= Rm << 3;
11192         }
11193       else
11194         {
11195           if (inst.instruction == T_OPCODE_MOV_I8)
11196             inst.instruction = T_OPCODE_MOV_HR;
11197           else
11198             inst.instruction = T_OPCODE_CMP_HR;
11199           do_t_cpy ();
11200         }
11201     }
11202   else
11203     {
11204       constraint (Rn > 7,
11205                   _("only lo regs allowed with immediate"));
11206       inst.instruction |= Rn << 8;
11207       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11208     }
11209 }
11210
11211 static void
11212 do_t_mov16 (void)
11213 {
11214   unsigned Rd;
11215   bfd_vma imm;
11216   bfd_boolean top;
11217
11218   top = (inst.instruction & 0x00800000) != 0;
11219   if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
11220     {
11221       constraint (top, _(":lower16: not allowed this instruction"));
11222       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
11223     }
11224   else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
11225     {
11226       constraint (!top, _(":upper16: not allowed this instruction"));
11227       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
11228     }
11229
11230   Rd = inst.operands[0].reg;
11231   reject_bad_reg (Rd);
11232
11233   inst.instruction |= Rd << 8;
11234   if (inst.reloc.type == BFD_RELOC_UNUSED)
11235     {
11236       imm = inst.reloc.exp.X_add_number;
11237       inst.instruction |= (imm & 0xf000) << 4;
11238       inst.instruction |= (imm & 0x0800) << 15;
11239       inst.instruction |= (imm & 0x0700) << 4;
11240       inst.instruction |= (imm & 0x00ff);
11241     }
11242 }
11243
11244 static void
11245 do_t_mvn_tst (void)
11246 {
11247   unsigned Rn, Rm;
11248
11249   Rn = inst.operands[0].reg;
11250   Rm = inst.operands[1].reg;
11251
11252   if (inst.instruction == T_MNEM_cmp
11253       || inst.instruction == T_MNEM_cmn)
11254     constraint (Rn == REG_PC, BAD_PC);
11255   else
11256     reject_bad_reg (Rn);
11257   reject_bad_reg (Rm);
11258
11259   if (unified_syntax)
11260     {
11261       int r0off = (inst.instruction == T_MNEM_mvn
11262                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
11263       bfd_boolean narrow;
11264
11265       if (inst.size_req == 4
11266           || inst.instruction > 0xffff
11267           || inst.operands[1].shifted
11268           || Rn > 7 || Rm > 7)
11269         narrow = FALSE;
11270       else if (inst.instruction == T_MNEM_cmn
11271                || inst.instruction == T_MNEM_tst)
11272         narrow = TRUE;
11273       else if (THUMB_SETS_FLAGS (inst.instruction))
11274         narrow = !in_it_block ();
11275       else
11276         narrow = in_it_block ();
11277
11278       if (!inst.operands[1].isreg)
11279         {
11280           /* For an immediate, we always generate a 32-bit opcode;
11281              section relaxation will shrink it later if possible.  */
11282           if (inst.instruction < 0xffff)
11283             inst.instruction = THUMB_OP32 (inst.instruction);
11284           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11285           inst.instruction |= Rn << r0off;
11286           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11287         }
11288       else
11289         {
11290           /* See if we can do this with a 16-bit instruction.  */
11291           if (narrow)
11292             {
11293               inst.instruction = THUMB_OP16 (inst.instruction);
11294               inst.instruction |= Rn;
11295               inst.instruction |= Rm << 3;
11296             }
11297           else
11298             {
11299               constraint (inst.operands[1].shifted
11300                           && inst.operands[1].immisreg,
11301                           _("shift must be constant"));
11302               if (inst.instruction < 0xffff)
11303                 inst.instruction = THUMB_OP32 (inst.instruction);
11304               inst.instruction |= Rn << r0off;
11305               encode_thumb32_shifted_operand (1);
11306             }
11307         }
11308     }
11309   else
11310     {
11311       constraint (inst.instruction > 0xffff
11312                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
11313       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
11314                   _("unshifted register required"));
11315       constraint (Rn > 7 || Rm > 7,
11316                   BAD_HIREG);
11317
11318       inst.instruction = THUMB_OP16 (inst.instruction);
11319       inst.instruction |= Rn;
11320       inst.instruction |= Rm << 3;
11321     }
11322 }
11323
11324 static void
11325 do_t_mrs (void)
11326 {
11327   unsigned Rd;
11328
11329   if (do_vfp_nsyn_mrs () == SUCCESS)
11330     return;
11331
11332   Rd = inst.operands[0].reg;
11333   reject_bad_reg (Rd);
11334   inst.instruction |= Rd << 8;
11335
11336   if (inst.operands[1].isreg)
11337     {
11338       unsigned br = inst.operands[1].reg;
11339       if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
11340         as_bad (_("bad register for mrs"));
11341
11342       inst.instruction |= br & (0xf << 16);
11343       inst.instruction |= (br & 0x300) >> 4;
11344       inst.instruction |= (br & SPSR_BIT) >> 2;
11345     }
11346   else
11347     {
11348       int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11349
11350       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11351         {
11352           /* PR gas/12698:  The constraint is only applied for m_profile.
11353              If the user has specified -march=all, we want to ignore it as
11354              we are building for any CPU type, including non-m variants.  */
11355           bfd_boolean m_profile = selected_cpu.core != arm_arch_any.core;
11356           constraint ((flags != 0) && m_profile, _("selected processor does "
11357                                                    "not support requested special purpose register"));
11358         }
11359       else
11360         /* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
11361            devices).  */
11362         constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
11363                     _("'APSR', 'CPSR' or 'SPSR' expected"));
11364
11365       inst.instruction |= (flags & SPSR_BIT) >> 2;
11366       inst.instruction |= inst.operands[1].imm & 0xff;
11367       inst.instruction |= 0xf0000;
11368     }
11369 }
11370
11371 static void
11372 do_t_msr (void)
11373 {
11374   int flags;
11375   unsigned Rn;
11376
11377   if (do_vfp_nsyn_msr () == SUCCESS)
11378     return;
11379
11380   constraint (!inst.operands[1].isreg,
11381               _("Thumb encoding does not support an immediate here"));
11382
11383   if (inst.operands[0].isreg)
11384     flags = (int)(inst.operands[0].reg);
11385   else
11386     flags = inst.operands[0].imm;
11387
11388   if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11389     {
11390       int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11391
11392       /* PR gas/12698:  The constraint is only applied for m_profile.
11393          If the user has specified -march=all, we want to ignore it as
11394          we are building for any CPU type, including non-m variants.  */
11395       bfd_boolean m_profile = selected_cpu.core != arm_arch_any.core;
11396       constraint (((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11397            && (bits & ~(PSR_s | PSR_f)) != 0)
11398           || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11399               && bits != PSR_f)) && m_profile,
11400           _("selected processor does not support requested special "
11401             "purpose register"));
11402     }
11403   else
11404      constraint ((flags & 0xff) != 0, _("selected processor does not support "
11405                  "requested special purpose register"));
11406
11407   Rn = inst.operands[1].reg;
11408   reject_bad_reg (Rn);
11409
11410   inst.instruction |= (flags & SPSR_BIT) >> 2;
11411   inst.instruction |= (flags & 0xf0000) >> 8;
11412   inst.instruction |= (flags & 0x300) >> 4;
11413   inst.instruction |= (flags & 0xff);
11414   inst.instruction |= Rn << 16;
11415 }
11416
11417 static void
11418 do_t_mul (void)
11419 {
11420   bfd_boolean narrow;
11421   unsigned Rd, Rn, Rm;
11422
11423   if (!inst.operands[2].present)
11424     inst.operands[2].reg = inst.operands[0].reg;
11425
11426   Rd = inst.operands[0].reg;
11427   Rn = inst.operands[1].reg;
11428   Rm = inst.operands[2].reg;
11429
11430   if (unified_syntax)
11431     {
11432       if (inst.size_req == 4
11433           || (Rd != Rn
11434               && Rd != Rm)
11435           || Rn > 7
11436           || Rm > 7)
11437         narrow = FALSE;
11438       else if (inst.instruction == T_MNEM_muls)
11439         narrow = !in_it_block ();
11440       else
11441         narrow = in_it_block ();
11442     }
11443   else
11444     {
11445       constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
11446       constraint (Rn > 7 || Rm > 7,
11447                   BAD_HIREG);
11448       narrow = TRUE;
11449     }
11450
11451   if (narrow)
11452     {
11453       /* 16-bit MULS/Conditional MUL.  */
11454       inst.instruction = THUMB_OP16 (inst.instruction);
11455       inst.instruction |= Rd;
11456
11457       if (Rd == Rn)
11458         inst.instruction |= Rm << 3;
11459       else if (Rd == Rm)
11460         inst.instruction |= Rn << 3;
11461       else
11462         constraint (1, _("dest must overlap one source register"));
11463     }
11464   else
11465     {
11466       constraint (inst.instruction != T_MNEM_mul,
11467                   _("Thumb-2 MUL must not set flags"));
11468       /* 32-bit MUL.  */
11469       inst.instruction = THUMB_OP32 (inst.instruction);
11470       inst.instruction |= Rd << 8;
11471       inst.instruction |= Rn << 16;
11472       inst.instruction |= Rm << 0;
11473
11474       reject_bad_reg (Rd);
11475       reject_bad_reg (Rn);
11476       reject_bad_reg (Rm);
11477     }
11478 }
11479
11480 static void
11481 do_t_mull (void)
11482 {
11483   unsigned RdLo, RdHi, Rn, Rm;
11484
11485   RdLo = inst.operands[0].reg;
11486   RdHi = inst.operands[1].reg;
11487   Rn = inst.operands[2].reg;
11488   Rm = inst.operands[3].reg;
11489
11490   reject_bad_reg (RdLo);
11491   reject_bad_reg (RdHi);
11492   reject_bad_reg (Rn);
11493   reject_bad_reg (Rm);
11494
11495   inst.instruction |= RdLo << 12;
11496   inst.instruction |= RdHi << 8;
11497   inst.instruction |= Rn << 16;
11498   inst.instruction |= Rm;
11499
11500  if (RdLo == RdHi)
11501     as_tsktsk (_("rdhi and rdlo must be different"));
11502 }
11503
11504 static void
11505 do_t_nop (void)
11506 {
11507   set_it_insn_type (NEUTRAL_IT_INSN);
11508
11509   if (unified_syntax)
11510     {
11511       if (inst.size_req == 4 || inst.operands[0].imm > 15)
11512         {
11513           inst.instruction = THUMB_OP32 (inst.instruction);
11514           inst.instruction |= inst.operands[0].imm;
11515         }
11516       else
11517         {
11518           /* PR9722: Check for Thumb2 availability before
11519              generating a thumb2 nop instruction.  */
11520           if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
11521             {
11522               inst.instruction = THUMB_OP16 (inst.instruction);
11523               inst.instruction |= inst.operands[0].imm << 4;
11524             }
11525           else
11526             inst.instruction = 0x46c0;
11527         }
11528     }
11529   else
11530     {
11531       constraint (inst.operands[0].present,
11532                   _("Thumb does not support NOP with hints"));
11533       inst.instruction = 0x46c0;
11534     }
11535 }
11536
11537 static void
11538 do_t_neg (void)
11539 {
11540   if (unified_syntax)
11541     {
11542       bfd_boolean narrow;
11543
11544       if (THUMB_SETS_FLAGS (inst.instruction))
11545         narrow = !in_it_block ();
11546       else
11547         narrow = in_it_block ();
11548       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11549         narrow = FALSE;
11550       if (inst.size_req == 4)
11551         narrow = FALSE;
11552
11553       if (!narrow)
11554         {
11555           inst.instruction = THUMB_OP32 (inst.instruction);
11556           inst.instruction |= inst.operands[0].reg << 8;
11557           inst.instruction |= inst.operands[1].reg << 16;
11558         }
11559       else
11560         {
11561           inst.instruction = THUMB_OP16 (inst.instruction);
11562           inst.instruction |= inst.operands[0].reg;
11563           inst.instruction |= inst.operands[1].reg << 3;
11564         }
11565     }
11566   else
11567     {
11568       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
11569                   BAD_HIREG);
11570       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11571
11572       inst.instruction = THUMB_OP16 (inst.instruction);
11573       inst.instruction |= inst.operands[0].reg;
11574       inst.instruction |= inst.operands[1].reg << 3;
11575     }
11576 }
11577
11578 static void
11579 do_t_orn (void)
11580 {
11581   unsigned Rd, Rn;
11582
11583   Rd = inst.operands[0].reg;
11584   Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
11585
11586   reject_bad_reg (Rd);
11587   /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN.  */
11588   reject_bad_reg (Rn);
11589
11590   inst.instruction |= Rd << 8;
11591   inst.instruction |= Rn << 16;
11592
11593   if (!inst.operands[2].isreg)
11594     {
11595       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11596       inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11597     }
11598   else
11599     {
11600       unsigned Rm;
11601
11602       Rm = inst.operands[2].reg;
11603       reject_bad_reg (Rm);
11604
11605       constraint (inst.operands[2].shifted
11606                   && inst.operands[2].immisreg,
11607                   _("shift must be constant"));
11608       encode_thumb32_shifted_operand (2);
11609     }
11610 }
11611
11612 static void
11613 do_t_pkhbt (void)
11614 {
11615   unsigned Rd, Rn, Rm;
11616
11617   Rd = inst.operands[0].reg;
11618   Rn = inst.operands[1].reg;
11619   Rm = inst.operands[2].reg;
11620
11621   reject_bad_reg (Rd);
11622   reject_bad_reg (Rn);
11623   reject_bad_reg (Rm);
11624
11625   inst.instruction |= Rd << 8;
11626   inst.instruction |= Rn << 16;
11627   inst.instruction |= Rm;
11628   if (inst.operands[3].present)
11629     {
11630       unsigned int val = inst.reloc.exp.X_add_number;
11631       constraint (inst.reloc.exp.X_op != O_constant,
11632                   _("expression too complex"));
11633       inst.instruction |= (val & 0x1c) << 10;
11634       inst.instruction |= (val & 0x03) << 6;
11635     }
11636 }
11637
11638 static void
11639 do_t_pkhtb (void)
11640 {
11641   if (!inst.operands[3].present)
11642     {
11643       unsigned Rtmp;
11644
11645       inst.instruction &= ~0x00000020;
11646
11647       /* PR 10168.  Swap the Rm and Rn registers.  */
11648       Rtmp = inst.operands[1].reg;
11649       inst.operands[1].reg = inst.operands[2].reg;
11650       inst.operands[2].reg = Rtmp;
11651     }
11652   do_t_pkhbt ();
11653 }
11654
11655 static void
11656 do_t_pld (void)
11657 {
11658   if (inst.operands[0].immisreg)
11659     reject_bad_reg (inst.operands[0].imm);
11660
11661   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
11662 }
11663
11664 static void
11665 do_t_push_pop (void)
11666 {
11667   unsigned mask;
11668
11669   constraint (inst.operands[0].writeback,
11670               _("push/pop do not support {reglist}^"));
11671   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11672               _("expression too complex"));
11673
11674   mask = inst.operands[0].imm;
11675   if (inst.size_req != 4 && (mask & ~0xff) == 0)
11676     inst.instruction = THUMB_OP16 (inst.instruction) | mask;
11677   else if (inst.size_req != 4
11678            && (mask & ~0xff) == (1 << (inst.instruction == T_MNEM_push
11679                                        ? REG_LR : REG_PC)))
11680     {
11681       inst.instruction = THUMB_OP16 (inst.instruction);
11682       inst.instruction |= THUMB_PP_PC_LR;
11683       inst.instruction |= mask & 0xff;
11684     }
11685   else if (unified_syntax)
11686     {
11687       inst.instruction = THUMB_OP32 (inst.instruction);
11688       encode_thumb2_ldmstm (13, mask, TRUE);
11689     }
11690   else
11691     {
11692       inst.error = _("invalid register list to push/pop instruction");
11693       return;
11694     }
11695 }
11696
11697 static void
11698 do_t_rbit (void)
11699 {
11700   unsigned Rd, Rm;
11701
11702   Rd = inst.operands[0].reg;
11703   Rm = inst.operands[1].reg;
11704
11705   reject_bad_reg (Rd);
11706   reject_bad_reg (Rm);
11707
11708   inst.instruction |= Rd << 8;
11709   inst.instruction |= Rm << 16;
11710   inst.instruction |= Rm;
11711 }
11712
11713 static void
11714 do_t_rev (void)
11715 {
11716   unsigned Rd, Rm;
11717
11718   Rd = inst.operands[0].reg;
11719   Rm = inst.operands[1].reg;
11720
11721   reject_bad_reg (Rd);
11722   reject_bad_reg (Rm);
11723
11724   if (Rd <= 7 && Rm <= 7
11725       && inst.size_req != 4)
11726     {
11727       inst.instruction = THUMB_OP16 (inst.instruction);
11728       inst.instruction |= Rd;
11729       inst.instruction |= Rm << 3;
11730     }
11731   else if (unified_syntax)
11732     {
11733       inst.instruction = THUMB_OP32 (inst.instruction);
11734       inst.instruction |= Rd << 8;
11735       inst.instruction |= Rm << 16;
11736       inst.instruction |= Rm;
11737     }
11738   else
11739     inst.error = BAD_HIREG;
11740 }
11741
11742 static void
11743 do_t_rrx (void)
11744 {
11745   unsigned Rd, Rm;
11746
11747   Rd = inst.operands[0].reg;
11748   Rm = inst.operands[1].reg;
11749
11750   reject_bad_reg (Rd);
11751   reject_bad_reg (Rm);
11752
11753   inst.instruction |= Rd << 8;
11754   inst.instruction |= Rm;
11755 }
11756
11757 static void
11758 do_t_rsb (void)
11759 {
11760   unsigned Rd, Rs;
11761
11762   Rd = inst.operands[0].reg;
11763   Rs = (inst.operands[1].present
11764         ? inst.operands[1].reg    /* Rd, Rs, foo */
11765         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
11766
11767   reject_bad_reg (Rd);
11768   reject_bad_reg (Rs);
11769   if (inst.operands[2].isreg)
11770     reject_bad_reg (inst.operands[2].reg);
11771
11772   inst.instruction |= Rd << 8;
11773   inst.instruction |= Rs << 16;
11774   if (!inst.operands[2].isreg)
11775     {
11776       bfd_boolean narrow;
11777
11778       if ((inst.instruction & 0x00100000) != 0)
11779         narrow = !in_it_block ();
11780       else
11781         narrow = in_it_block ();
11782
11783       if (Rd > 7 || Rs > 7)
11784         narrow = FALSE;
11785
11786       if (inst.size_req == 4 || !unified_syntax)
11787         narrow = FALSE;
11788
11789       if (inst.reloc.exp.X_op != O_constant
11790           || inst.reloc.exp.X_add_number != 0)
11791         narrow = FALSE;
11792
11793       /* Turn rsb #0 into 16-bit neg.  We should probably do this via
11794          relaxation, but it doesn't seem worth the hassle.  */
11795       if (narrow)
11796         {
11797           inst.reloc.type = BFD_RELOC_UNUSED;
11798           inst.instruction = THUMB_OP16 (T_MNEM_negs);
11799           inst.instruction |= Rs << 3;
11800           inst.instruction |= Rd;
11801         }
11802       else
11803         {
11804           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11805           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11806         }
11807     }
11808   else
11809     encode_thumb32_shifted_operand (2);
11810 }
11811
11812 static void
11813 do_t_setend (void)
11814 {
11815   if (warn_on_deprecated
11816       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
11817       as_warn (_("setend use is deprecated for ARMv8"));
11818
11819   set_it_insn_type (OUTSIDE_IT_INSN);
11820   if (inst.operands[0].imm)
11821     inst.instruction |= 0x8;
11822 }
11823
11824 static void
11825 do_t_shift (void)
11826 {
11827   if (!inst.operands[1].present)
11828     inst.operands[1].reg = inst.operands[0].reg;
11829
11830   if (unified_syntax)
11831     {
11832       bfd_boolean narrow;
11833       int shift_kind;
11834
11835       switch (inst.instruction)
11836         {
11837         case T_MNEM_asr:
11838         case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11839         case T_MNEM_lsl:
11840         case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11841         case T_MNEM_lsr:
11842         case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11843         case T_MNEM_ror:
11844         case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11845         default: abort ();
11846         }
11847
11848       if (THUMB_SETS_FLAGS (inst.instruction))
11849         narrow = !in_it_block ();
11850       else
11851         narrow = in_it_block ();
11852       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11853         narrow = FALSE;
11854       if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
11855         narrow = FALSE;
11856       if (inst.operands[2].isreg
11857           && (inst.operands[1].reg != inst.operands[0].reg
11858               || inst.operands[2].reg > 7))
11859         narrow = FALSE;
11860       if (inst.size_req == 4)
11861         narrow = FALSE;
11862
11863       reject_bad_reg (inst.operands[0].reg);
11864       reject_bad_reg (inst.operands[1].reg);
11865
11866       if (!narrow)
11867         {
11868           if (inst.operands[2].isreg)
11869             {
11870               reject_bad_reg (inst.operands[2].reg);
11871               inst.instruction = THUMB_OP32 (inst.instruction);
11872               inst.instruction |= inst.operands[0].reg << 8;
11873               inst.instruction |= inst.operands[1].reg << 16;
11874               inst.instruction |= inst.operands[2].reg;
11875
11876               /* PR 12854: Error on extraneous shifts.  */
11877               constraint (inst.operands[2].shifted,
11878                           _("extraneous shift as part of operand to shift insn"));
11879             }
11880           else
11881             {
11882               inst.operands[1].shifted = 1;
11883               inst.operands[1].shift_kind = shift_kind;
11884               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
11885                                              ? T_MNEM_movs : T_MNEM_mov);
11886               inst.instruction |= inst.operands[0].reg << 8;
11887               encode_thumb32_shifted_operand (1);
11888               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
11889               inst.reloc.type = BFD_RELOC_UNUSED;
11890             }
11891         }
11892       else
11893         {
11894           if (inst.operands[2].isreg)
11895             {
11896               switch (shift_kind)
11897                 {
11898                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
11899                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
11900                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
11901                 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
11902                 default: abort ();
11903                 }
11904
11905               inst.instruction |= inst.operands[0].reg;
11906               inst.instruction |= inst.operands[2].reg << 3;
11907
11908               /* PR 12854: Error on extraneous shifts.  */
11909               constraint (inst.operands[2].shifted,
11910                           _("extraneous shift as part of operand to shift insn"));
11911             }
11912           else
11913             {
11914               switch (shift_kind)
11915                 {
11916                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11917                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11918                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11919                 default: abort ();
11920                 }
11921               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11922               inst.instruction |= inst.operands[0].reg;
11923               inst.instruction |= inst.operands[1].reg << 3;
11924             }
11925         }
11926     }
11927   else
11928     {
11929       constraint (inst.operands[0].reg > 7
11930                   || inst.operands[1].reg > 7, BAD_HIREG);
11931       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11932
11933       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
11934         {
11935           constraint (inst.operands[2].reg > 7, BAD_HIREG);
11936           constraint (inst.operands[0].reg != inst.operands[1].reg,
11937                       _("source1 and dest must be same register"));
11938
11939           switch (inst.instruction)
11940             {
11941             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
11942             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
11943             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
11944             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
11945             default: abort ();
11946             }
11947
11948           inst.instruction |= inst.operands[0].reg;
11949           inst.instruction |= inst.operands[2].reg << 3;
11950
11951           /* PR 12854: Error on extraneous shifts.  */
11952           constraint (inst.operands[2].shifted,
11953                       _("extraneous shift as part of operand to shift insn"));
11954         }
11955       else
11956         {
11957           switch (inst.instruction)
11958             {
11959             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
11960             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
11961             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
11962             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
11963             default: abort ();
11964             }
11965           inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11966           inst.instruction |= inst.operands[0].reg;
11967           inst.instruction |= inst.operands[1].reg << 3;
11968         }
11969     }
11970 }
11971
11972 static void
11973 do_t_simd (void)
11974 {
11975   unsigned Rd, Rn, Rm;
11976
11977   Rd = inst.operands[0].reg;
11978   Rn = inst.operands[1].reg;
11979   Rm = inst.operands[2].reg;
11980
11981   reject_bad_reg (Rd);
11982   reject_bad_reg (Rn);
11983   reject_bad_reg (Rm);
11984
11985   inst.instruction |= Rd << 8;
11986   inst.instruction |= Rn << 16;
11987   inst.instruction |= Rm;
11988 }
11989
11990 static void
11991 do_t_simd2 (void)
11992 {
11993   unsigned Rd, Rn, Rm;
11994
11995   Rd = inst.operands[0].reg;
11996   Rm = inst.operands[1].reg;
11997   Rn = inst.operands[2].reg;
11998
11999   reject_bad_reg (Rd);
12000   reject_bad_reg (Rn);
12001   reject_bad_reg (Rm);
12002
12003   inst.instruction |= Rd << 8;
12004   inst.instruction |= Rn << 16;
12005   inst.instruction |= Rm;
12006 }
12007
12008 static void
12009 do_t_smc (void)
12010 {
12011   unsigned int value = inst.reloc.exp.X_add_number;
12012   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
12013               _("SMC is not permitted on this architecture"));
12014   constraint (inst.reloc.exp.X_op != O_constant,
12015               _("expression too complex"));
12016   inst.reloc.type = BFD_RELOC_UNUSED;
12017   inst.instruction |= (value & 0xf000) >> 12;
12018   inst.instruction |= (value & 0x0ff0);
12019   inst.instruction |= (value & 0x000f) << 16;
12020   /* PR gas/15623: SMC instructions must be last in an IT block.  */
12021   set_it_insn_type_last ();
12022 }
12023
12024 static void
12025 do_t_hvc (void)
12026 {
12027   unsigned int value = inst.reloc.exp.X_add_number;
12028
12029   inst.reloc.type = BFD_RELOC_UNUSED;
12030   inst.instruction |= (value & 0x0fff);
12031   inst.instruction |= (value & 0xf000) << 4;
12032 }
12033
12034 static void
12035 do_t_ssat_usat (int bias)
12036 {
12037   unsigned Rd, Rn;
12038
12039   Rd = inst.operands[0].reg;
12040   Rn = inst.operands[2].reg;
12041
12042   reject_bad_reg (Rd);
12043   reject_bad_reg (Rn);
12044
12045   inst.instruction |= Rd << 8;
12046   inst.instruction |= inst.operands[1].imm - bias;
12047   inst.instruction |= Rn << 16;
12048
12049   if (inst.operands[3].present)
12050     {
12051       offsetT shift_amount = inst.reloc.exp.X_add_number;
12052
12053       inst.reloc.type = BFD_RELOC_UNUSED;
12054
12055       constraint (inst.reloc.exp.X_op != O_constant,
12056                   _("expression too complex"));
12057
12058       if (shift_amount != 0)
12059         {
12060           constraint (shift_amount > 31,
12061                       _("shift expression is too large"));
12062
12063           if (inst.operands[3].shift_kind == SHIFT_ASR)
12064             inst.instruction |= 0x00200000;  /* sh bit.  */
12065
12066           inst.instruction |= (shift_amount & 0x1c) << 10;
12067           inst.instruction |= (shift_amount & 0x03) << 6;
12068         }
12069     }
12070 }
12071
12072 static void
12073 do_t_ssat (void)
12074 {
12075   do_t_ssat_usat (1);
12076 }
12077
12078 static void
12079 do_t_ssat16 (void)
12080 {
12081   unsigned Rd, Rn;
12082
12083   Rd = inst.operands[0].reg;
12084   Rn = inst.operands[2].reg;
12085
12086   reject_bad_reg (Rd);
12087   reject_bad_reg (Rn);
12088
12089   inst.instruction |= Rd << 8;
12090   inst.instruction |= inst.operands[1].imm - 1;
12091   inst.instruction |= Rn << 16;
12092 }
12093
12094 static void
12095 do_t_strex (void)
12096 {
12097   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
12098               || inst.operands[2].postind || inst.operands[2].writeback
12099               || inst.operands[2].immisreg || inst.operands[2].shifted
12100               || inst.operands[2].negative,
12101               BAD_ADDR_MODE);
12102
12103   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
12104
12105   inst.instruction |= inst.operands[0].reg << 8;
12106   inst.instruction |= inst.operands[1].reg << 12;
12107   inst.instruction |= inst.operands[2].reg << 16;
12108   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
12109 }
12110
12111 static void
12112 do_t_strexd (void)
12113 {
12114   if (!inst.operands[2].present)
12115     inst.operands[2].reg = inst.operands[1].reg + 1;
12116
12117   constraint (inst.operands[0].reg == inst.operands[1].reg
12118               || inst.operands[0].reg == inst.operands[2].reg
12119               || inst.operands[0].reg == inst.operands[3].reg,
12120               BAD_OVERLAP);
12121
12122   inst.instruction |= inst.operands[0].reg;
12123   inst.instruction |= inst.operands[1].reg << 12;
12124   inst.instruction |= inst.operands[2].reg << 8;
12125   inst.instruction |= inst.operands[3].reg << 16;
12126 }
12127
12128 static void
12129 do_t_sxtah (void)
12130 {
12131   unsigned Rd, Rn, Rm;
12132
12133   Rd = inst.operands[0].reg;
12134   Rn = inst.operands[1].reg;
12135   Rm = inst.operands[2].reg;
12136
12137   reject_bad_reg (Rd);
12138   reject_bad_reg (Rn);
12139   reject_bad_reg (Rm);
12140
12141   inst.instruction |= Rd << 8;
12142   inst.instruction |= Rn << 16;
12143   inst.instruction |= Rm;
12144   inst.instruction |= inst.operands[3].imm << 4;
12145 }
12146
12147 static void
12148 do_t_sxth (void)
12149 {
12150   unsigned Rd, Rm;
12151
12152   Rd = inst.operands[0].reg;
12153   Rm = inst.operands[1].reg;
12154
12155   reject_bad_reg (Rd);
12156   reject_bad_reg (Rm);
12157
12158   if (inst.instruction <= 0xffff
12159       && inst.size_req != 4
12160       && Rd <= 7 && Rm <= 7
12161       && (!inst.operands[2].present || inst.operands[2].imm == 0))
12162     {
12163       inst.instruction = THUMB_OP16 (inst.instruction);
12164       inst.instruction |= Rd;
12165       inst.instruction |= Rm << 3;
12166     }
12167   else if (unified_syntax)
12168     {
12169       if (inst.instruction <= 0xffff)
12170         inst.instruction = THUMB_OP32 (inst.instruction);
12171       inst.instruction |= Rd << 8;
12172       inst.instruction |= Rm;
12173       inst.instruction |= inst.operands[2].imm << 4;
12174     }
12175   else
12176     {
12177       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
12178                   _("Thumb encoding does not support rotation"));
12179       constraint (1, BAD_HIREG);
12180     }
12181 }
12182
12183 static void
12184 do_t_swi (void)
12185 {
12186   /* We have to do the following check manually as ARM_EXT_OS only applies
12187      to ARM_EXT_V6M.  */
12188   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6m))
12189     {
12190       if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_os)
12191           /* This only applies to the v6m howver, not later architectures.  */
12192           && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7))
12193         as_bad (_("SVC is not permitted on this architecture"));
12194       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, arm_ext_os);
12195     }
12196
12197   inst.reloc.type = BFD_RELOC_ARM_SWI;
12198 }
12199
12200 static void
12201 do_t_tb (void)
12202 {
12203   unsigned Rn, Rm;
12204   int half;
12205
12206   half = (inst.instruction & 0x10) != 0;
12207   set_it_insn_type_last ();
12208   constraint (inst.operands[0].immisreg,
12209               _("instruction requires register index"));
12210
12211   Rn = inst.operands[0].reg;
12212   Rm = inst.operands[0].imm;
12213
12214   constraint (Rn == REG_SP, BAD_SP);
12215   reject_bad_reg (Rm);
12216
12217   constraint (!half && inst.operands[0].shifted,
12218               _("instruction does not allow shifted index"));
12219   inst.instruction |= (Rn << 16) | Rm;
12220 }
12221
12222 static void
12223 do_t_udf (void)
12224 {
12225   if (!inst.operands[0].present)
12226     inst.operands[0].imm = 0;
12227
12228   if ((unsigned int) inst.operands[0].imm > 255 || inst.size_req == 4)
12229     {
12230       constraint (inst.size_req == 2,
12231                   _("immediate value out of range"));
12232       inst.instruction = THUMB_OP32 (inst.instruction);
12233       inst.instruction |= (inst.operands[0].imm & 0xf000u) << 4;
12234       inst.instruction |= (inst.operands[0].imm & 0x0fffu) << 0;
12235     }
12236   else
12237     {
12238       inst.instruction = THUMB_OP16 (inst.instruction);
12239       inst.instruction |= inst.operands[0].imm;
12240     }
12241
12242   set_it_insn_type (NEUTRAL_IT_INSN);
12243 }
12244
12245
12246 static void
12247 do_t_usat (void)
12248 {
12249   do_t_ssat_usat (0);
12250 }
12251
12252 static void
12253 do_t_usat16 (void)
12254 {
12255   unsigned Rd, Rn;
12256
12257   Rd = inst.operands[0].reg;
12258   Rn = inst.operands[2].reg;
12259
12260   reject_bad_reg (Rd);
12261   reject_bad_reg (Rn);
12262
12263   inst.instruction |= Rd << 8;
12264   inst.instruction |= inst.operands[1].imm;
12265   inst.instruction |= Rn << 16;
12266 }
12267
12268 /* Neon instruction encoder helpers.  */
12269
12270 /* Encodings for the different types for various Neon opcodes.  */
12271
12272 /* An "invalid" code for the following tables.  */
12273 #define N_INV -1u
12274
12275 struct neon_tab_entry
12276 {
12277   unsigned integer;
12278   unsigned float_or_poly;
12279   unsigned scalar_or_imm;
12280 };
12281
12282 /* Map overloaded Neon opcodes to their respective encodings.  */
12283 #define NEON_ENC_TAB                                    \
12284   X(vabd,       0x0000700, 0x1200d00, N_INV),           \
12285   X(vmax,       0x0000600, 0x0000f00, N_INV),           \
12286   X(vmin,       0x0000610, 0x0200f00, N_INV),           \
12287   X(vpadd,      0x0000b10, 0x1000d00, N_INV),           \
12288   X(vpmax,      0x0000a00, 0x1000f00, N_INV),           \
12289   X(vpmin,      0x0000a10, 0x1200f00, N_INV),           \
12290   X(vadd,       0x0000800, 0x0000d00, N_INV),           \
12291   X(vsub,       0x1000800, 0x0200d00, N_INV),           \
12292   X(vceq,       0x1000810, 0x0000e00, 0x1b10100),       \
12293   X(vcge,       0x0000310, 0x1000e00, 0x1b10080),       \
12294   X(vcgt,       0x0000300, 0x1200e00, 0x1b10000),       \
12295   /* Register variants of the following two instructions are encoded as
12296      vcge / vcgt with the operands reversed.  */        \
12297   X(vclt,       0x0000300, 0x1200e00, 0x1b10200),       \
12298   X(vcle,       0x0000310, 0x1000e00, 0x1b10180),       \
12299   X(vfma,       N_INV, 0x0000c10, N_INV),               \
12300   X(vfms,       N_INV, 0x0200c10, N_INV),               \
12301   X(vmla,       0x0000900, 0x0000d10, 0x0800040),       \
12302   X(vmls,       0x1000900, 0x0200d10, 0x0800440),       \
12303   X(vmul,       0x0000910, 0x1000d10, 0x0800840),       \
12304   X(vmull,      0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
12305   X(vmlal,      0x0800800, N_INV,     0x0800240),       \
12306   X(vmlsl,      0x0800a00, N_INV,     0x0800640),       \
12307   X(vqdmlal,    0x0800900, N_INV,     0x0800340),       \
12308   X(vqdmlsl,    0x0800b00, N_INV,     0x0800740),       \
12309   X(vqdmull,    0x0800d00, N_INV,     0x0800b40),       \
12310   X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),       \
12311   X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),       \
12312   X(vshl,       0x0000400, N_INV,     0x0800510),       \
12313   X(vqshl,      0x0000410, N_INV,     0x0800710),       \
12314   X(vand,       0x0000110, N_INV,     0x0800030),       \
12315   X(vbic,       0x0100110, N_INV,     0x0800030),       \
12316   X(veor,       0x1000110, N_INV,     N_INV),           \
12317   X(vorn,       0x0300110, N_INV,     0x0800010),       \
12318   X(vorr,       0x0200110, N_INV,     0x0800010),       \
12319   X(vmvn,       0x1b00580, N_INV,     0x0800030),       \
12320   X(vshll,      0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
12321   X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
12322   X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
12323   X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
12324   X(vst1,       0x0000000, 0x0800000, N_INV),           \
12325   X(vld2,       0x0200100, 0x0a00100, 0x0a00d00),       \
12326   X(vst2,       0x0000100, 0x0800100, N_INV),           \
12327   X(vld3,       0x0200200, 0x0a00200, 0x0a00e00),       \
12328   X(vst3,       0x0000200, 0x0800200, N_INV),           \
12329   X(vld4,       0x0200300, 0x0a00300, 0x0a00f00),       \
12330   X(vst4,       0x0000300, 0x0800300, N_INV),           \
12331   X(vmovn,      0x1b20200, N_INV,     N_INV),           \
12332   X(vtrn,       0x1b20080, N_INV,     N_INV),           \
12333   X(vqmovn,     0x1b20200, N_INV,     N_INV),           \
12334   X(vqmovun,    0x1b20240, N_INV,     N_INV),           \
12335   X(vnmul,      0xe200a40, 0xe200b40, N_INV),           \
12336   X(vnmla,      0xe100a40, 0xe100b40, N_INV),           \
12337   X(vnmls,      0xe100a00, 0xe100b00, N_INV),           \
12338   X(vfnma,      0xe900a40, 0xe900b40, N_INV),           \
12339   X(vfnms,      0xe900a00, 0xe900b00, N_INV),           \
12340   X(vcmp,       0xeb40a40, 0xeb40b40, N_INV),           \
12341   X(vcmpz,      0xeb50a40, 0xeb50b40, N_INV),           \
12342   X(vcmpe,      0xeb40ac0, 0xeb40bc0, N_INV),           \
12343   X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV),           \
12344   X(vseleq,     0xe000a00, N_INV,     N_INV),           \
12345   X(vselvs,     0xe100a00, N_INV,     N_INV),           \
12346   X(vselge,     0xe200a00, N_INV,     N_INV),           \
12347   X(vselgt,     0xe300a00, N_INV,     N_INV),           \
12348   X(vmaxnm,     0xe800a00, 0x3000f10, N_INV),           \
12349   X(vminnm,     0xe800a40, 0x3200f10, N_INV),           \
12350   X(vcvta,      0xebc0a40, 0x3bb0000, N_INV),           \
12351   X(vrintr,     0xeb60a40, 0x3ba0400, N_INV),           \
12352   X(vrinta,     0xeb80a40, 0x3ba0400, N_INV),           \
12353   X(aes,        0x3b00300, N_INV,     N_INV),           \
12354   X(sha3op,     0x2000c00, N_INV,     N_INV),           \
12355   X(sha1h,      0x3b902c0, N_INV,     N_INV),           \
12356   X(sha2op,     0x3ba0380, N_INV,     N_INV)
12357
12358 enum neon_opc
12359 {
12360 #define X(OPC,I,F,S) N_MNEM_##OPC
12361 NEON_ENC_TAB
12362 #undef X
12363 };
12364
12365 static const struct neon_tab_entry neon_enc_tab[] =
12366 {
12367 #define X(OPC,I,F,S) { (I), (F), (S) }
12368 NEON_ENC_TAB
12369 #undef X
12370 };
12371
12372 /* Do not use these macros; instead, use NEON_ENCODE defined below.  */
12373 #define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12374 #define NEON_ENC_ARMREG_(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
12375 #define NEON_ENC_POLY_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12376 #define NEON_ENC_FLOAT_(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12377 #define NEON_ENC_SCALAR_(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12378 #define NEON_ENC_IMMED_(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12379 #define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12380 #define NEON_ENC_LANE_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12381 #define NEON_ENC_DUP_(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12382 #define NEON_ENC_SINGLE_(X) \
12383   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
12384 #define NEON_ENC_DOUBLE_(X) \
12385   ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
12386 #define NEON_ENC_FPV8_(X) \
12387   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf000000))
12388
12389 #define NEON_ENCODE(type, inst)                                 \
12390   do                                                            \
12391     {                                                           \
12392       inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
12393       inst.is_neon = 1;                                         \
12394     }                                                           \
12395   while (0)
12396
12397 #define check_neon_suffixes                                             \
12398   do                                                                    \
12399     {                                                                   \
12400       if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon)       \
12401         {                                                               \
12402           as_bad (_("invalid neon suffix for non neon instruction"));   \
12403           return;                                                       \
12404         }                                                               \
12405     }                                                                   \
12406   while (0)
12407
12408 /* Define shapes for instruction operands. The following mnemonic characters
12409    are used in this table:
12410
12411      F - VFP S<n> register
12412      D - Neon D<n> register
12413      Q - Neon Q<n> register
12414      I - Immediate
12415      S - Scalar
12416      R - ARM register
12417      L - D<n> register list
12418
12419    This table is used to generate various data:
12420      - enumerations of the form NS_DDR to be used as arguments to
12421        neon_select_shape.
12422      - a table classifying shapes into single, double, quad, mixed.
12423      - a table used to drive neon_select_shape.  */
12424
12425 #define NEON_SHAPE_DEF                  \
12426   X(3, (D, D, D), DOUBLE),              \
12427   X(3, (Q, Q, Q), QUAD),                \
12428   X(3, (D, D, I), DOUBLE),              \
12429   X(3, (Q, Q, I), QUAD),                \
12430   X(3, (D, D, S), DOUBLE),              \
12431   X(3, (Q, Q, S), QUAD),                \
12432   X(2, (D, D), DOUBLE),                 \
12433   X(2, (Q, Q), QUAD),                   \
12434   X(2, (D, S), DOUBLE),                 \
12435   X(2, (Q, S), QUAD),                   \
12436   X(2, (D, R), DOUBLE),                 \
12437   X(2, (Q, R), QUAD),                   \
12438   X(2, (D, I), DOUBLE),                 \
12439   X(2, (Q, I), QUAD),                   \
12440   X(3, (D, L, D), DOUBLE),              \
12441   X(2, (D, Q), MIXED),                  \
12442   X(2, (Q, D), MIXED),                  \
12443   X(3, (D, Q, I), MIXED),               \
12444   X(3, (Q, D, I), MIXED),               \
12445   X(3, (Q, D, D), MIXED),               \
12446   X(3, (D, Q, Q), MIXED),               \
12447   X(3, (Q, Q, D), MIXED),               \
12448   X(3, (Q, D, S), MIXED),               \
12449   X(3, (D, Q, S), MIXED),               \
12450   X(4, (D, D, D, I), DOUBLE),           \
12451   X(4, (Q, Q, Q, I), QUAD),             \
12452   X(2, (F, F), SINGLE),                 \
12453   X(3, (F, F, F), SINGLE),              \
12454   X(2, (F, I), SINGLE),                 \
12455   X(2, (F, D), MIXED),                  \
12456   X(2, (D, F), MIXED),                  \
12457   X(3, (F, F, I), MIXED),               \
12458   X(4, (R, R, F, F), SINGLE),           \
12459   X(4, (F, F, R, R), SINGLE),           \
12460   X(3, (D, R, R), DOUBLE),              \
12461   X(3, (R, R, D), DOUBLE),              \
12462   X(2, (S, R), SINGLE),                 \
12463   X(2, (R, S), SINGLE),                 \
12464   X(2, (F, R), SINGLE),                 \
12465   X(2, (R, F), SINGLE)
12466
12467 #define S2(A,B)         NS_##A##B
12468 #define S3(A,B,C)       NS_##A##B##C
12469 #define S4(A,B,C,D)     NS_##A##B##C##D
12470
12471 #define X(N, L, C) S##N L
12472
12473 enum neon_shape
12474 {
12475   NEON_SHAPE_DEF,
12476   NS_NULL
12477 };
12478
12479 #undef X
12480 #undef S2
12481 #undef S3
12482 #undef S4
12483
12484 enum neon_shape_class
12485 {
12486   SC_SINGLE,
12487   SC_DOUBLE,
12488   SC_QUAD,
12489   SC_MIXED
12490 };
12491
12492 #define X(N, L, C) SC_##C
12493
12494 static enum neon_shape_class neon_shape_class[] =
12495 {
12496   NEON_SHAPE_DEF
12497 };
12498
12499 #undef X
12500
12501 enum neon_shape_el
12502 {
12503   SE_F,
12504   SE_D,
12505   SE_Q,
12506   SE_I,
12507   SE_S,
12508   SE_R,
12509   SE_L
12510 };
12511
12512 /* Register widths of above.  */
12513 static unsigned neon_shape_el_size[] =
12514 {
12515   32,
12516   64,
12517   128,
12518   0,
12519   32,
12520   32,
12521   0
12522 };
12523
12524 struct neon_shape_info
12525 {
12526   unsigned els;
12527   enum neon_shape_el el[NEON_MAX_TYPE_ELS];
12528 };
12529
12530 #define S2(A,B)         { SE_##A, SE_##B }
12531 #define S3(A,B,C)       { SE_##A, SE_##B, SE_##C }
12532 #define S4(A,B,C,D)     { SE_##A, SE_##B, SE_##C, SE_##D }
12533
12534 #define X(N, L, C) { N, S##N L }
12535
12536 static struct neon_shape_info neon_shape_tab[] =
12537 {
12538   NEON_SHAPE_DEF
12539 };
12540
12541 #undef X
12542 #undef S2
12543 #undef S3
12544 #undef S4
12545
12546 /* Bit masks used in type checking given instructions.
12547   'N_EQK' means the type must be the same as (or based on in some way) the key
12548    type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
12549    set, various other bits can be set as well in order to modify the meaning of
12550    the type constraint.  */
12551
12552 enum neon_type_mask
12553 {
12554   N_S8   = 0x0000001,
12555   N_S16  = 0x0000002,
12556   N_S32  = 0x0000004,
12557   N_S64  = 0x0000008,
12558   N_U8   = 0x0000010,
12559   N_U16  = 0x0000020,
12560   N_U32  = 0x0000040,
12561   N_U64  = 0x0000080,
12562   N_I8   = 0x0000100,
12563   N_I16  = 0x0000200,
12564   N_I32  = 0x0000400,
12565   N_I64  = 0x0000800,
12566   N_8    = 0x0001000,
12567   N_16   = 0x0002000,
12568   N_32   = 0x0004000,
12569   N_64   = 0x0008000,
12570   N_P8   = 0x0010000,
12571   N_P16  = 0x0020000,
12572   N_F16  = 0x0040000,
12573   N_F32  = 0x0080000,
12574   N_F64  = 0x0100000,
12575   N_P64  = 0x0200000,
12576   N_KEY  = 0x1000000, /* Key element (main type specifier).  */
12577   N_EQK  = 0x2000000, /* Given operand has the same type & size as the key.  */
12578   N_VFP  = 0x4000000, /* VFP mode: operand size must match register width.  */
12579   N_UNT  = 0x8000000, /* Must be explicitly untyped.  */
12580   N_DBL  = 0x0000001, /* If N_EQK, this operand is twice the size.  */
12581   N_HLF  = 0x0000002, /* If N_EQK, this operand is half the size.  */
12582   N_SGN  = 0x0000004, /* If N_EQK, this operand is forced to be signed.  */
12583   N_UNS  = 0x0000008, /* If N_EQK, this operand is forced to be unsigned.  */
12584   N_INT  = 0x0000010, /* If N_EQK, this operand is forced to be integer.  */
12585   N_FLT  = 0x0000020, /* If N_EQK, this operand is forced to be float.  */
12586   N_SIZ  = 0x0000040, /* If N_EQK, this operand is forced to be size-only.  */
12587   N_UTYP = 0,
12588   N_MAX_NONSPECIAL = N_P64
12589 };
12590
12591 #define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
12592
12593 #define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
12594 #define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
12595 #define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
12596 #define N_SUF_32   (N_SU_32 | N_F32)
12597 #define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
12598 #define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F32)
12599
12600 /* Pass this as the first type argument to neon_check_type to ignore types
12601    altogether.  */
12602 #define N_IGNORE_TYPE (N_KEY | N_EQK)
12603
12604 /* Select a "shape" for the current instruction (describing register types or
12605    sizes) from a list of alternatives. Return NS_NULL if the current instruction
12606    doesn't fit. For non-polymorphic shapes, checking is usually done as a
12607    function of operand parsing, so this function doesn't need to be called.
12608    Shapes should be listed in order of decreasing length.  */
12609
12610 static enum neon_shape
12611 neon_select_shape (enum neon_shape shape, ...)
12612 {
12613   va_list ap;
12614   enum neon_shape first_shape = shape;
12615
12616   /* Fix missing optional operands. FIXME: we don't know at this point how
12617      many arguments we should have, so this makes the assumption that we have
12618      > 1. This is true of all current Neon opcodes, I think, but may not be
12619      true in the future.  */
12620   if (!inst.operands[1].present)
12621     inst.operands[1] = inst.operands[0];
12622
12623   va_start (ap, shape);
12624
12625   for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
12626     {
12627       unsigned j;
12628       int matches = 1;
12629
12630       for (j = 0; j < neon_shape_tab[shape].els; j++)
12631         {
12632           if (!inst.operands[j].present)
12633             {
12634               matches = 0;
12635               break;
12636             }
12637
12638           switch (neon_shape_tab[shape].el[j])
12639             {
12640             case SE_F:
12641               if (!(inst.operands[j].isreg
12642                     && inst.operands[j].isvec
12643                     && inst.operands[j].issingle
12644                     && !inst.operands[j].isquad))
12645                 matches = 0;
12646               break;
12647
12648             case SE_D:
12649               if (!(inst.operands[j].isreg
12650                     && inst.operands[j].isvec
12651                     && !inst.operands[j].isquad
12652                     && !inst.operands[j].issingle))
12653                 matches = 0;
12654               break;
12655
12656             case SE_R:
12657               if (!(inst.operands[j].isreg
12658                     && !inst.operands[j].isvec))
12659                 matches = 0;
12660               break;
12661
12662             case SE_Q:
12663               if (!(inst.operands[j].isreg
12664                     && inst.operands[j].isvec
12665                     && inst.operands[j].isquad
12666                     && !inst.operands[j].issingle))
12667                 matches = 0;
12668               break;
12669
12670             case SE_I:
12671               if (!(!inst.operands[j].isreg
12672                     && !inst.operands[j].isscalar))
12673                 matches = 0;
12674               break;
12675
12676             case SE_S:
12677               if (!(!inst.operands[j].isreg
12678                     && inst.operands[j].isscalar))
12679                 matches = 0;
12680               break;
12681
12682             case SE_L:
12683               break;
12684             }
12685           if (!matches)
12686             break;
12687         }
12688       if (matches && (j >= ARM_IT_MAX_OPERANDS || !inst.operands[j].present))
12689         /* We've matched all the entries in the shape table, and we don't
12690            have any left over operands which have not been matched.  */
12691         break;
12692     }
12693
12694   va_end (ap);
12695
12696   if (shape == NS_NULL && first_shape != NS_NULL)
12697     first_error (_("invalid instruction shape"));
12698
12699   return shape;
12700 }
12701
12702 /* True if SHAPE is predominantly a quadword operation (most of the time, this
12703    means the Q bit should be set).  */
12704
12705 static int
12706 neon_quad (enum neon_shape shape)
12707 {
12708   return neon_shape_class[shape] == SC_QUAD;
12709 }
12710
12711 static void
12712 neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
12713                        unsigned *g_size)
12714 {
12715   /* Allow modification to be made to types which are constrained to be
12716      based on the key element, based on bits set alongside N_EQK.  */
12717   if ((typebits & N_EQK) != 0)
12718     {
12719       if ((typebits & N_HLF) != 0)
12720         *g_size /= 2;
12721       else if ((typebits & N_DBL) != 0)
12722         *g_size *= 2;
12723       if ((typebits & N_SGN) != 0)
12724         *g_type = NT_signed;
12725       else if ((typebits & N_UNS) != 0)
12726         *g_type = NT_unsigned;
12727       else if ((typebits & N_INT) != 0)
12728         *g_type = NT_integer;
12729       else if ((typebits & N_FLT) != 0)
12730         *g_type = NT_float;
12731       else if ((typebits & N_SIZ) != 0)
12732         *g_type = NT_untyped;
12733     }
12734 }
12735
12736 /* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
12737    operand type, i.e. the single type specified in a Neon instruction when it
12738    is the only one given.  */
12739
12740 static struct neon_type_el
12741 neon_type_promote (struct neon_type_el *key, unsigned thisarg)
12742 {
12743   struct neon_type_el dest = *key;
12744
12745   gas_assert ((thisarg & N_EQK) != 0);
12746
12747   neon_modify_type_size (thisarg, &dest.type, &dest.size);
12748
12749   return dest;
12750 }
12751
12752 /* Convert Neon type and size into compact bitmask representation.  */
12753
12754 static enum neon_type_mask
12755 type_chk_of_el_type (enum neon_el_type type, unsigned size)
12756 {
12757   switch (type)
12758     {
12759     case NT_untyped:
12760       switch (size)
12761         {
12762         case 8:  return N_8;
12763         case 16: return N_16;
12764         case 32: return N_32;
12765         case 64: return N_64;
12766         default: ;
12767         }
12768       break;
12769
12770     case NT_integer:
12771       switch (size)
12772         {
12773         case 8:  return N_I8;
12774         case 16: return N_I16;
12775         case 32: return N_I32;
12776         case 64: return N_I64;
12777         default: ;
12778         }
12779       break;
12780
12781     case NT_float:
12782       switch (size)
12783         {
12784         case 16: return N_F16;
12785         case 32: return N_F32;
12786         case 64: return N_F64;
12787         default: ;
12788         }
12789       break;
12790
12791     case NT_poly:
12792       switch (size)
12793         {
12794         case 8:  return N_P8;
12795         case 16: return N_P16;
12796         case 64: return N_P64;
12797         default: ;
12798         }
12799       break;
12800
12801     case NT_signed:
12802       switch (size)
12803         {
12804         case 8:  return N_S8;
12805         case 16: return N_S16;
12806         case 32: return N_S32;
12807         case 64: return N_S64;
12808         default: ;
12809         }
12810       break;
12811
12812     case NT_unsigned:
12813       switch (size)
12814         {
12815         case 8:  return N_U8;
12816         case 16: return N_U16;
12817         case 32: return N_U32;
12818         case 64: return N_U64;
12819         default: ;
12820         }
12821       break;
12822
12823     default: ;
12824     }
12825
12826   return N_UTYP;
12827 }
12828
12829 /* Convert compact Neon bitmask type representation to a type and size. Only
12830    handles the case where a single bit is set in the mask.  */
12831
12832 static int
12833 el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
12834                      enum neon_type_mask mask)
12835 {
12836   if ((mask & N_EQK) != 0)
12837     return FAIL;
12838
12839   if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
12840     *size = 8;
12841   else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_F16 | N_P16)) != 0)
12842     *size = 16;
12843   else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
12844     *size = 32;
12845   else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64 | N_P64)) != 0)
12846     *size = 64;
12847   else
12848     return FAIL;
12849
12850   if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
12851     *type = NT_signed;
12852   else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
12853     *type = NT_unsigned;
12854   else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
12855     *type = NT_integer;
12856   else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
12857     *type = NT_untyped;
12858   else if ((mask & (N_P8 | N_P16 | N_P64)) != 0)
12859     *type = NT_poly;
12860   else if ((mask & (N_F16 | N_F32 | N_F64)) != 0)
12861     *type = NT_float;
12862   else
12863     return FAIL;
12864
12865   return SUCCESS;
12866 }
12867
12868 /* Modify a bitmask of allowed types. This is only needed for type
12869    relaxation.  */
12870
12871 static unsigned
12872 modify_types_allowed (unsigned allowed, unsigned mods)
12873 {
12874   unsigned size;
12875   enum neon_el_type type;
12876   unsigned destmask;
12877   int i;
12878
12879   destmask = 0;
12880
12881   for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
12882     {
12883       if (el_type_of_type_chk (&type, &size,
12884                                (enum neon_type_mask) (allowed & i)) == SUCCESS)
12885         {
12886           neon_modify_type_size (mods, &type, &size);
12887           destmask |= type_chk_of_el_type (type, size);
12888         }
12889     }
12890
12891   return destmask;
12892 }
12893
12894 /* Check type and return type classification.
12895    The manual states (paraphrase): If one datatype is given, it indicates the
12896    type given in:
12897     - the second operand, if there is one
12898     - the operand, if there is no second operand
12899     - the result, if there are no operands.
12900    This isn't quite good enough though, so we use a concept of a "key" datatype
12901    which is set on a per-instruction basis, which is the one which matters when
12902    only one data type is written.
12903    Note: this function has side-effects (e.g. filling in missing operands). All
12904    Neon instructions should call it before performing bit encoding.  */
12905
12906 static struct neon_type_el
12907 neon_check_type (unsigned els, enum neon_shape ns, ...)
12908 {
12909   va_list ap;
12910   unsigned i, pass, key_el = 0;
12911   unsigned types[NEON_MAX_TYPE_ELS];
12912   enum neon_el_type k_type = NT_invtype;
12913   unsigned k_size = -1u;
12914   struct neon_type_el badtype = {NT_invtype, -1};
12915   unsigned key_allowed = 0;
12916
12917   /* Optional registers in Neon instructions are always (not) in operand 1.
12918      Fill in the missing operand here, if it was omitted.  */
12919   if (els > 1 && !inst.operands[1].present)
12920     inst.operands[1] = inst.operands[0];
12921
12922   /* Suck up all the varargs.  */
12923   va_start (ap, ns);
12924   for (i = 0; i < els; i++)
12925     {
12926       unsigned thisarg = va_arg (ap, unsigned);
12927       if (thisarg == N_IGNORE_TYPE)
12928         {
12929           va_end (ap);
12930           return badtype;
12931         }
12932       types[i] = thisarg;
12933       if ((thisarg & N_KEY) != 0)
12934         key_el = i;
12935     }
12936   va_end (ap);
12937
12938   if (inst.vectype.elems > 0)
12939     for (i = 0; i < els; i++)
12940       if (inst.operands[i].vectype.type != NT_invtype)
12941         {
12942           first_error (_("types specified in both the mnemonic and operands"));
12943           return badtype;
12944         }
12945
12946   /* Duplicate inst.vectype elements here as necessary.
12947      FIXME: No idea if this is exactly the same as the ARM assembler,
12948      particularly when an insn takes one register and one non-register
12949      operand. */
12950   if (inst.vectype.elems == 1 && els > 1)
12951     {
12952       unsigned j;
12953       inst.vectype.elems = els;
12954       inst.vectype.el[key_el] = inst.vectype.el[0];
12955       for (j = 0; j < els; j++)
12956         if (j != key_el)
12957           inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12958                                                   types[j]);
12959     }
12960   else if (inst.vectype.elems == 0 && els > 0)
12961     {
12962       unsigned j;
12963       /* No types were given after the mnemonic, so look for types specified
12964          after each operand. We allow some flexibility here; as long as the
12965          "key" operand has a type, we can infer the others.  */
12966       for (j = 0; j < els; j++)
12967         if (inst.operands[j].vectype.type != NT_invtype)
12968           inst.vectype.el[j] = inst.operands[j].vectype;
12969
12970       if (inst.operands[key_el].vectype.type != NT_invtype)
12971         {
12972           for (j = 0; j < els; j++)
12973             if (inst.operands[j].vectype.type == NT_invtype)
12974               inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12975                                                       types[j]);
12976         }
12977       else
12978         {
12979           first_error (_("operand types can't be inferred"));
12980           return badtype;
12981         }
12982     }
12983   else if (inst.vectype.elems != els)
12984     {
12985       first_error (_("type specifier has the wrong number of parts"));
12986       return badtype;
12987     }
12988
12989   for (pass = 0; pass < 2; pass++)
12990     {
12991       for (i = 0; i < els; i++)
12992         {
12993           unsigned thisarg = types[i];
12994           unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
12995             ? modify_types_allowed (key_allowed, thisarg) : thisarg;
12996           enum neon_el_type g_type = inst.vectype.el[i].type;
12997           unsigned g_size = inst.vectype.el[i].size;
12998
12999           /* Decay more-specific signed & unsigned types to sign-insensitive
13000              integer types if sign-specific variants are unavailable.  */
13001           if ((g_type == NT_signed || g_type == NT_unsigned)
13002               && (types_allowed & N_SU_ALL) == 0)
13003             g_type = NT_integer;
13004
13005           /* If only untyped args are allowed, decay any more specific types to
13006              them. Some instructions only care about signs for some element
13007              sizes, so handle that properly.  */
13008           if (((types_allowed & N_UNT) == 0)
13009               && ((g_size == 8 && (types_allowed & N_8) != 0)
13010                   || (g_size == 16 && (types_allowed & N_16) != 0)
13011                   || (g_size == 32 && (types_allowed & N_32) != 0)
13012                   || (g_size == 64 && (types_allowed & N_64) != 0)))
13013             g_type = NT_untyped;
13014
13015           if (pass == 0)
13016             {
13017               if ((thisarg & N_KEY) != 0)
13018                 {
13019                   k_type = g_type;
13020                   k_size = g_size;
13021                   key_allowed = thisarg & ~N_KEY;
13022                 }
13023             }
13024           else
13025             {
13026               if ((thisarg & N_VFP) != 0)
13027                 {
13028                   enum neon_shape_el regshape;
13029                   unsigned regwidth, match;
13030
13031                   /* PR 11136: Catch the case where we are passed a shape of NS_NULL.  */
13032                   if (ns == NS_NULL)
13033                     {
13034                       first_error (_("invalid instruction shape"));
13035                       return badtype;
13036                     }
13037                   regshape = neon_shape_tab[ns].el[i];
13038                   regwidth = neon_shape_el_size[regshape];
13039
13040                   /* In VFP mode, operands must match register widths. If we
13041                      have a key operand, use its width, else use the width of
13042                      the current operand.  */
13043                   if (k_size != -1u)
13044                     match = k_size;
13045                   else
13046                     match = g_size;
13047
13048                   if (regwidth != match)
13049                     {
13050                       first_error (_("operand size must match register width"));
13051                       return badtype;
13052                     }
13053                 }
13054
13055               if ((thisarg & N_EQK) == 0)
13056                 {
13057                   unsigned given_type = type_chk_of_el_type (g_type, g_size);
13058
13059                   if ((given_type & types_allowed) == 0)
13060                     {
13061                       first_error (_("bad type in Neon instruction"));
13062                       return badtype;
13063                     }
13064                 }
13065               else
13066                 {
13067                   enum neon_el_type mod_k_type = k_type;
13068                   unsigned mod_k_size = k_size;
13069                   neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
13070                   if (g_type != mod_k_type || g_size != mod_k_size)
13071                     {
13072                       first_error (_("inconsistent types in Neon instruction"));
13073                       return badtype;
13074                     }
13075                 }
13076             }
13077         }
13078     }
13079
13080   return inst.vectype.el[key_el];
13081 }
13082
13083 /* Neon-style VFP instruction forwarding.  */
13084
13085 /* Thumb VFP instructions have 0xE in the condition field.  */
13086
13087 static void
13088 do_vfp_cond_or_thumb (void)
13089 {
13090   inst.is_neon = 1;
13091
13092   if (thumb_mode)
13093     inst.instruction |= 0xe0000000;
13094   else
13095     inst.instruction |= inst.cond << 28;
13096 }
13097
13098 /* Look up and encode a simple mnemonic, for use as a helper function for the
13099    Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
13100    etc.  It is assumed that operand parsing has already been done, and that the
13101    operands are in the form expected by the given opcode (this isn't necessarily
13102    the same as the form in which they were parsed, hence some massaging must
13103    take place before this function is called).
13104    Checks current arch version against that in the looked-up opcode.  */
13105
13106 static void
13107 do_vfp_nsyn_opcode (const char *opname)
13108 {
13109   const struct asm_opcode *opcode;
13110
13111   opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
13112
13113   if (!opcode)
13114     abort ();
13115
13116   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
13117                 thumb_mode ? *opcode->tvariant : *opcode->avariant),
13118               _(BAD_FPU));
13119
13120   inst.is_neon = 1;
13121
13122   if (thumb_mode)
13123     {
13124       inst.instruction = opcode->tvalue;
13125       opcode->tencode ();
13126     }
13127   else
13128     {
13129       inst.instruction = (inst.cond << 28) | opcode->avalue;
13130       opcode->aencode ();
13131     }
13132 }
13133
13134 static void
13135 do_vfp_nsyn_add_sub (enum neon_shape rs)
13136 {
13137   int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
13138
13139   if (rs == NS_FFF)
13140     {
13141       if (is_add)
13142         do_vfp_nsyn_opcode ("fadds");
13143       else
13144         do_vfp_nsyn_opcode ("fsubs");
13145     }
13146   else
13147     {
13148       if (is_add)
13149         do_vfp_nsyn_opcode ("faddd");
13150       else
13151         do_vfp_nsyn_opcode ("fsubd");
13152     }
13153 }
13154
13155 /* Check operand types to see if this is a VFP instruction, and if so call
13156    PFN ().  */
13157
13158 static int
13159 try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
13160 {
13161   enum neon_shape rs;
13162   struct neon_type_el et;
13163
13164   switch (args)
13165     {
13166     case 2:
13167       rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13168       et = neon_check_type (2, rs,
13169         N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13170       break;
13171
13172     case 3:
13173       rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13174       et = neon_check_type (3, rs,
13175         N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13176       break;
13177
13178     default:
13179       abort ();
13180     }
13181
13182   if (et.type != NT_invtype)
13183     {
13184       pfn (rs);
13185       return SUCCESS;
13186     }
13187
13188   inst.error = NULL;
13189   return FAIL;
13190 }
13191
13192 static void
13193 do_vfp_nsyn_mla_mls (enum neon_shape rs)
13194 {
13195   int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
13196
13197   if (rs == NS_FFF)
13198     {
13199       if (is_mla)
13200         do_vfp_nsyn_opcode ("fmacs");
13201       else
13202         do_vfp_nsyn_opcode ("fnmacs");
13203     }
13204   else
13205     {
13206       if (is_mla)
13207         do_vfp_nsyn_opcode ("fmacd");
13208       else
13209         do_vfp_nsyn_opcode ("fnmacd");
13210     }
13211 }
13212
13213 static void
13214 do_vfp_nsyn_fma_fms (enum neon_shape rs)
13215 {
13216   int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
13217
13218   if (rs == NS_FFF)
13219     {
13220       if (is_fma)
13221         do_vfp_nsyn_opcode ("ffmas");
13222       else
13223         do_vfp_nsyn_opcode ("ffnmas");
13224     }
13225   else
13226     {
13227       if (is_fma)
13228         do_vfp_nsyn_opcode ("ffmad");
13229       else
13230         do_vfp_nsyn_opcode ("ffnmad");
13231     }
13232 }
13233
13234 static void
13235 do_vfp_nsyn_mul (enum neon_shape rs)
13236 {
13237   if (rs == NS_FFF)
13238     do_vfp_nsyn_opcode ("fmuls");
13239   else
13240     do_vfp_nsyn_opcode ("fmuld");
13241 }
13242
13243 static void
13244 do_vfp_nsyn_abs_neg (enum neon_shape rs)
13245 {
13246   int is_neg = (inst.instruction & 0x80) != 0;
13247   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
13248
13249   if (rs == NS_FF)
13250     {
13251       if (is_neg)
13252         do_vfp_nsyn_opcode ("fnegs");
13253       else
13254         do_vfp_nsyn_opcode ("fabss");
13255     }
13256   else
13257     {
13258       if (is_neg)
13259         do_vfp_nsyn_opcode ("fnegd");
13260       else
13261         do_vfp_nsyn_opcode ("fabsd");
13262     }
13263 }
13264
13265 /* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
13266    insns belong to Neon, and are handled elsewhere.  */
13267
13268 static void
13269 do_vfp_nsyn_ldm_stm (int is_dbmode)
13270 {
13271   int is_ldm = (inst.instruction & (1 << 20)) != 0;
13272   if (is_ldm)
13273     {
13274       if (is_dbmode)
13275         do_vfp_nsyn_opcode ("fldmdbs");
13276       else
13277         do_vfp_nsyn_opcode ("fldmias");
13278     }
13279   else
13280     {
13281       if (is_dbmode)
13282         do_vfp_nsyn_opcode ("fstmdbs");
13283       else
13284         do_vfp_nsyn_opcode ("fstmias");
13285     }
13286 }
13287
13288 static void
13289 do_vfp_nsyn_sqrt (void)
13290 {
13291   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13292   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13293
13294   if (rs == NS_FF)
13295     do_vfp_nsyn_opcode ("fsqrts");
13296   else
13297     do_vfp_nsyn_opcode ("fsqrtd");
13298 }
13299
13300 static void
13301 do_vfp_nsyn_div (void)
13302 {
13303   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13304   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13305     N_F32 | N_F64 | N_KEY | N_VFP);
13306
13307   if (rs == NS_FFF)
13308     do_vfp_nsyn_opcode ("fdivs");
13309   else
13310     do_vfp_nsyn_opcode ("fdivd");
13311 }
13312
13313 static void
13314 do_vfp_nsyn_nmul (void)
13315 {
13316   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13317   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13318     N_F32 | N_F64 | N_KEY | N_VFP);
13319
13320   if (rs == NS_FFF)
13321     {
13322       NEON_ENCODE (SINGLE, inst);
13323       do_vfp_sp_dyadic ();
13324     }
13325   else
13326     {
13327       NEON_ENCODE (DOUBLE, inst);
13328       do_vfp_dp_rd_rn_rm ();
13329     }
13330   do_vfp_cond_or_thumb ();
13331 }
13332
13333 static void
13334 do_vfp_nsyn_cmp (void)
13335 {
13336   if (inst.operands[1].isreg)
13337     {
13338       enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13339       neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13340
13341       if (rs == NS_FF)
13342         {
13343           NEON_ENCODE (SINGLE, inst);
13344           do_vfp_sp_monadic ();
13345         }
13346       else
13347         {
13348           NEON_ENCODE (DOUBLE, inst);
13349           do_vfp_dp_rd_rm ();
13350         }
13351     }
13352   else
13353     {
13354       enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
13355       neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
13356
13357       switch (inst.instruction & 0x0fffffff)
13358         {
13359         case N_MNEM_vcmp:
13360           inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
13361           break;
13362         case N_MNEM_vcmpe:
13363           inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
13364           break;
13365         default:
13366           abort ();
13367         }
13368
13369       if (rs == NS_FI)
13370         {
13371           NEON_ENCODE (SINGLE, inst);
13372           do_vfp_sp_compare_z ();
13373         }
13374       else
13375         {
13376           NEON_ENCODE (DOUBLE, inst);
13377           do_vfp_dp_rd ();
13378         }
13379     }
13380   do_vfp_cond_or_thumb ();
13381 }
13382
13383 static void
13384 nsyn_insert_sp (void)
13385 {
13386   inst.operands[1] = inst.operands[0];
13387   memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
13388   inst.operands[0].reg = REG_SP;
13389   inst.operands[0].isreg = 1;
13390   inst.operands[0].writeback = 1;
13391   inst.operands[0].present = 1;
13392 }
13393
13394 static void
13395 do_vfp_nsyn_push (void)
13396 {
13397   nsyn_insert_sp ();
13398   if (inst.operands[1].issingle)
13399     do_vfp_nsyn_opcode ("fstmdbs");
13400   else
13401     do_vfp_nsyn_opcode ("fstmdbd");
13402 }
13403
13404 static void
13405 do_vfp_nsyn_pop (void)
13406 {
13407   nsyn_insert_sp ();
13408   if (inst.operands[1].issingle)
13409     do_vfp_nsyn_opcode ("fldmias");
13410   else
13411     do_vfp_nsyn_opcode ("fldmiad");
13412 }
13413
13414 /* Fix up Neon data-processing instructions, ORing in the correct bits for
13415    ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
13416
13417 static void
13418 neon_dp_fixup (struct arm_it* insn)
13419 {
13420   unsigned int i = insn->instruction;
13421   insn->is_neon = 1;
13422
13423   if (thumb_mode)
13424     {
13425       /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
13426       if (i & (1 << 24))
13427         i |= 1 << 28;
13428
13429       i &= ~(1 << 24);
13430
13431       i |= 0xef000000;
13432     }
13433   else
13434     i |= 0xf2000000;
13435
13436   insn->instruction = i;
13437 }
13438
13439 /* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
13440    (0, 1, 2, 3).  */
13441
13442 static unsigned
13443 neon_logbits (unsigned x)
13444 {
13445   return ffs (x) - 4;
13446 }
13447
13448 #define LOW4(R) ((R) & 0xf)
13449 #define HI1(R) (((R) >> 4) & 1)
13450
13451 /* Encode insns with bit pattern:
13452
13453   |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
13454   |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
13455
13456   SIZE is passed in bits. -1 means size field isn't changed, in case it has a
13457   different meaning for some instruction.  */
13458
13459 static void
13460 neon_three_same (int isquad, int ubit, int size)
13461 {
13462   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13463   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13464   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13465   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13466   inst.instruction |= LOW4 (inst.operands[2].reg);
13467   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13468   inst.instruction |= (isquad != 0) << 6;
13469   inst.instruction |= (ubit != 0) << 24;
13470   if (size != -1)
13471     inst.instruction |= neon_logbits (size) << 20;
13472
13473   neon_dp_fixup (&inst);
13474 }
13475
13476 /* Encode instructions of the form:
13477
13478   |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
13479   |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
13480
13481   Don't write size if SIZE == -1.  */
13482
13483 static void
13484 neon_two_same (int qbit, int ubit, int size)
13485 {
13486   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13487   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13488   inst.instruction |= LOW4 (inst.operands[1].reg);
13489   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13490   inst.instruction |= (qbit != 0) << 6;
13491   inst.instruction |= (ubit != 0) << 24;
13492
13493   if (size != -1)
13494     inst.instruction |= neon_logbits (size) << 18;
13495
13496   neon_dp_fixup (&inst);
13497 }
13498
13499 /* Neon instruction encoders, in approximate order of appearance.  */
13500
13501 static void
13502 do_neon_dyadic_i_su (void)
13503 {
13504   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13505   struct neon_type_el et = neon_check_type (3, rs,
13506     N_EQK, N_EQK, N_SU_32 | N_KEY);
13507   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13508 }
13509
13510 static void
13511 do_neon_dyadic_i64_su (void)
13512 {
13513   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13514   struct neon_type_el et = neon_check_type (3, rs,
13515     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13516   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13517 }
13518
13519 static void
13520 neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
13521                 unsigned immbits)
13522 {
13523   unsigned size = et.size >> 3;
13524   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13525   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13526   inst.instruction |= LOW4 (inst.operands[1].reg);
13527   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13528   inst.instruction |= (isquad != 0) << 6;
13529   inst.instruction |= immbits << 16;
13530   inst.instruction |= (size >> 3) << 7;
13531   inst.instruction |= (size & 0x7) << 19;
13532   if (write_ubit)
13533     inst.instruction |= (uval != 0) << 24;
13534
13535   neon_dp_fixup (&inst);
13536 }
13537
13538 static void
13539 do_neon_shl_imm (void)
13540 {
13541   if (!inst.operands[2].isreg)
13542     {
13543       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13544       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
13545       NEON_ENCODE (IMMED, inst);
13546       neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
13547     }
13548   else
13549     {
13550       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13551       struct neon_type_el et = neon_check_type (3, rs,
13552         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13553       unsigned int tmp;
13554
13555       /* VSHL/VQSHL 3-register variants have syntax such as:
13556            vshl.xx Dd, Dm, Dn
13557          whereas other 3-register operations encoded by neon_three_same have
13558          syntax like:
13559            vadd.xx Dd, Dn, Dm
13560          (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
13561          here.  */
13562       tmp = inst.operands[2].reg;
13563       inst.operands[2].reg = inst.operands[1].reg;
13564       inst.operands[1].reg = tmp;
13565       NEON_ENCODE (INTEGER, inst);
13566       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13567     }
13568 }
13569
13570 static void
13571 do_neon_qshl_imm (void)
13572 {
13573   if (!inst.operands[2].isreg)
13574     {
13575       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13576       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
13577
13578       NEON_ENCODE (IMMED, inst);
13579       neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
13580                       inst.operands[2].imm);
13581     }
13582   else
13583     {
13584       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13585       struct neon_type_el et = neon_check_type (3, rs,
13586         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13587       unsigned int tmp;
13588
13589       /* See note in do_neon_shl_imm.  */
13590       tmp = inst.operands[2].reg;
13591       inst.operands[2].reg = inst.operands[1].reg;
13592       inst.operands[1].reg = tmp;
13593       NEON_ENCODE (INTEGER, inst);
13594       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13595     }
13596 }
13597
13598 static void
13599 do_neon_rshl (void)
13600 {
13601   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13602   struct neon_type_el et = neon_check_type (3, rs,
13603     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13604   unsigned int tmp;
13605
13606   tmp = inst.operands[2].reg;
13607   inst.operands[2].reg = inst.operands[1].reg;
13608   inst.operands[1].reg = tmp;
13609   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13610 }
13611
13612 static int
13613 neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
13614 {
13615   /* Handle .I8 pseudo-instructions.  */
13616   if (size == 8)
13617     {
13618       /* Unfortunately, this will make everything apart from zero out-of-range.
13619          FIXME is this the intended semantics? There doesn't seem much point in
13620          accepting .I8 if so.  */
13621       immediate |= immediate << 8;
13622       size = 16;
13623     }
13624
13625   if (size >= 32)
13626     {
13627       if (immediate == (immediate & 0x000000ff))
13628         {
13629           *immbits = immediate;
13630           return 0x1;
13631         }
13632       else if (immediate == (immediate & 0x0000ff00))
13633         {
13634           *immbits = immediate >> 8;
13635           return 0x3;
13636         }
13637       else if (immediate == (immediate & 0x00ff0000))
13638         {
13639           *immbits = immediate >> 16;
13640           return 0x5;
13641         }
13642       else if (immediate == (immediate & 0xff000000))
13643         {
13644           *immbits = immediate >> 24;
13645           return 0x7;
13646         }
13647       if ((immediate & 0xffff) != (immediate >> 16))
13648         goto bad_immediate;
13649       immediate &= 0xffff;
13650     }
13651
13652   if (immediate == (immediate & 0x000000ff))
13653     {
13654       *immbits = immediate;
13655       return 0x9;
13656     }
13657   else if (immediate == (immediate & 0x0000ff00))
13658     {
13659       *immbits = immediate >> 8;
13660       return 0xb;
13661     }
13662
13663   bad_immediate:
13664   first_error (_("immediate value out of range"));
13665   return FAIL;
13666 }
13667
13668 /* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
13669    A, B, C, D.  */
13670
13671 static int
13672 neon_bits_same_in_bytes (unsigned imm)
13673 {
13674   return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
13675          && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
13676          && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
13677          && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
13678 }
13679
13680 /* For immediate of above form, return 0bABCD.  */
13681
13682 static unsigned
13683 neon_squash_bits (unsigned imm)
13684 {
13685   return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
13686          | ((imm & 0x01000000) >> 21);
13687 }
13688
13689 /* Compress quarter-float representation to 0b...000 abcdefgh.  */
13690
13691 static unsigned
13692 neon_qfloat_bits (unsigned imm)
13693 {
13694   return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
13695 }
13696
13697 /* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
13698    the instruction. *OP is passed as the initial value of the op field, and
13699    may be set to a different value depending on the constant (i.e.
13700    "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
13701    MVN).  If the immediate looks like a repeated pattern then also
13702    try smaller element sizes.  */
13703
13704 static int
13705 neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
13706                          unsigned *immbits, int *op, int size,
13707                          enum neon_el_type type)
13708 {
13709   /* Only permit float immediates (including 0.0/-0.0) if the operand type is
13710      float.  */
13711   if (type == NT_float && !float_p)
13712     return FAIL;
13713
13714   if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
13715     {
13716       if (size != 32 || *op == 1)
13717         return FAIL;
13718       *immbits = neon_qfloat_bits (immlo);
13719       return 0xf;
13720     }
13721
13722   if (size == 64)
13723     {
13724       if (neon_bits_same_in_bytes (immhi)
13725           && neon_bits_same_in_bytes (immlo))
13726         {
13727           if (*op == 1)
13728             return FAIL;
13729           *immbits = (neon_squash_bits (immhi) << 4)
13730                      | neon_squash_bits (immlo);
13731           *op = 1;
13732           return 0xe;
13733         }
13734
13735       if (immhi != immlo)
13736         return FAIL;
13737     }
13738
13739   if (size >= 32)
13740     {
13741       if (immlo == (immlo & 0x000000ff))
13742         {
13743           *immbits = immlo;
13744           return 0x0;
13745         }
13746       else if (immlo == (immlo & 0x0000ff00))
13747         {
13748           *immbits = immlo >> 8;
13749           return 0x2;
13750         }
13751       else if (immlo == (immlo & 0x00ff0000))
13752         {
13753           *immbits = immlo >> 16;
13754           return 0x4;
13755         }
13756       else if (immlo == (immlo & 0xff000000))
13757         {
13758           *immbits = immlo >> 24;
13759           return 0x6;
13760         }
13761       else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
13762         {
13763           *immbits = (immlo >> 8) & 0xff;
13764           return 0xc;
13765         }
13766       else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
13767         {
13768           *immbits = (immlo >> 16) & 0xff;
13769           return 0xd;
13770         }
13771
13772       if ((immlo & 0xffff) != (immlo >> 16))
13773         return FAIL;
13774       immlo &= 0xffff;
13775     }
13776
13777   if (size >= 16)
13778     {
13779       if (immlo == (immlo & 0x000000ff))
13780         {
13781           *immbits = immlo;
13782           return 0x8;
13783         }
13784       else if (immlo == (immlo & 0x0000ff00))
13785         {
13786           *immbits = immlo >> 8;
13787           return 0xa;
13788         }
13789
13790       if ((immlo & 0xff) != (immlo >> 8))
13791         return FAIL;
13792       immlo &= 0xff;
13793     }
13794
13795   if (immlo == (immlo & 0x000000ff))
13796     {
13797       /* Don't allow MVN with 8-bit immediate.  */
13798       if (*op == 1)
13799         return FAIL;
13800       *immbits = immlo;
13801       return 0xe;
13802     }
13803
13804   return FAIL;
13805 }
13806
13807 /* Write immediate bits [7:0] to the following locations:
13808
13809   |28/24|23     19|18 16|15                    4|3     0|
13810   |  a  |x x x x x|b c d|x x x x x x x x x x x x|e f g h|
13811
13812   This function is used by VMOV/VMVN/VORR/VBIC.  */
13813
13814 static void
13815 neon_write_immbits (unsigned immbits)
13816 {
13817   inst.instruction |= immbits & 0xf;
13818   inst.instruction |= ((immbits >> 4) & 0x7) << 16;
13819   inst.instruction |= ((immbits >> 7) & 0x1) << 24;
13820 }
13821
13822 /* Invert low-order SIZE bits of XHI:XLO.  */
13823
13824 static void
13825 neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
13826 {
13827   unsigned immlo = xlo ? *xlo : 0;
13828   unsigned immhi = xhi ? *xhi : 0;
13829
13830   switch (size)
13831     {
13832     case 8:
13833       immlo = (~immlo) & 0xff;
13834       break;
13835
13836     case 16:
13837       immlo = (~immlo) & 0xffff;
13838       break;
13839
13840     case 64:
13841       immhi = (~immhi) & 0xffffffff;
13842       /* fall through.  */
13843
13844     case 32:
13845       immlo = (~immlo) & 0xffffffff;
13846       break;
13847
13848     default:
13849       abort ();
13850     }
13851
13852   if (xlo)
13853     *xlo = immlo;
13854
13855   if (xhi)
13856     *xhi = immhi;
13857 }
13858
13859 static void
13860 do_neon_logic (void)
13861 {
13862   if (inst.operands[2].present && inst.operands[2].isreg)
13863     {
13864       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13865       neon_check_type (3, rs, N_IGNORE_TYPE);
13866       /* U bit and size field were set as part of the bitmask.  */
13867       NEON_ENCODE (INTEGER, inst);
13868       neon_three_same (neon_quad (rs), 0, -1);
13869     }
13870   else
13871     {
13872       const int three_ops_form = (inst.operands[2].present
13873                                   && !inst.operands[2].isreg);
13874       const int immoperand = (three_ops_form ? 2 : 1);
13875       enum neon_shape rs = (three_ops_form
13876                             ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
13877                             : neon_select_shape (NS_DI, NS_QI, NS_NULL));
13878       struct neon_type_el et = neon_check_type (2, rs,
13879         N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
13880       enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
13881       unsigned immbits;
13882       int cmode;
13883
13884       if (et.type == NT_invtype)
13885         return;
13886
13887       if (three_ops_form)
13888         constraint (inst.operands[0].reg != inst.operands[1].reg,
13889                     _("first and second operands shall be the same register"));
13890
13891       NEON_ENCODE (IMMED, inst);
13892
13893       immbits = inst.operands[immoperand].imm;
13894       if (et.size == 64)
13895         {
13896           /* .i64 is a pseudo-op, so the immediate must be a repeating
13897              pattern.  */
13898           if (immbits != (inst.operands[immoperand].regisimm ?
13899                           inst.operands[immoperand].reg : 0))
13900             {
13901               /* Set immbits to an invalid constant.  */
13902               immbits = 0xdeadbeef;
13903             }
13904         }
13905
13906       switch (opcode)
13907         {
13908         case N_MNEM_vbic:
13909           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13910           break;
13911
13912         case N_MNEM_vorr:
13913           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13914           break;
13915
13916         case N_MNEM_vand:
13917           /* Pseudo-instruction for VBIC.  */
13918           neon_invert_size (&immbits, 0, et.size);
13919           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13920           break;
13921
13922         case N_MNEM_vorn:
13923           /* Pseudo-instruction for VORR.  */
13924           neon_invert_size (&immbits, 0, et.size);
13925           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13926           break;
13927
13928         default:
13929           abort ();
13930         }
13931
13932       if (cmode == FAIL)
13933         return;
13934
13935       inst.instruction |= neon_quad (rs) << 6;
13936       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13937       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13938       inst.instruction |= cmode << 8;
13939       neon_write_immbits (immbits);
13940
13941       neon_dp_fixup (&inst);
13942     }
13943 }
13944
13945 static void
13946 do_neon_bitfield (void)
13947 {
13948   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13949   neon_check_type (3, rs, N_IGNORE_TYPE);
13950   neon_three_same (neon_quad (rs), 0, -1);
13951 }
13952
13953 static void
13954 neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
13955                   unsigned destbits)
13956 {
13957   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13958   struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
13959                                             types | N_KEY);
13960   if (et.type == NT_float)
13961     {
13962       NEON_ENCODE (FLOAT, inst);
13963       neon_three_same (neon_quad (rs), 0, -1);
13964     }
13965   else
13966     {
13967       NEON_ENCODE (INTEGER, inst);
13968       neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
13969     }
13970 }
13971
13972 static void
13973 do_neon_dyadic_if_su (void)
13974 {
13975   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13976 }
13977
13978 static void
13979 do_neon_dyadic_if_su_d (void)
13980 {
13981   /* This version only allow D registers, but that constraint is enforced during
13982      operand parsing so we don't need to do anything extra here.  */
13983   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13984 }
13985
13986 static void
13987 do_neon_dyadic_if_i_d (void)
13988 {
13989   /* The "untyped" case can't happen. Do this to stop the "U" bit being
13990      affected if we specify unsigned args.  */
13991   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13992 }
13993
13994 enum vfp_or_neon_is_neon_bits
13995 {
13996   NEON_CHECK_CC = 1,
13997   NEON_CHECK_ARCH = 2,
13998   NEON_CHECK_ARCH8 = 4
13999 };
14000
14001 /* Call this function if an instruction which may have belonged to the VFP or
14002    Neon instruction sets, but turned out to be a Neon instruction (due to the
14003    operand types involved, etc.). We have to check and/or fix-up a couple of
14004    things:
14005
14006      - Make sure the user hasn't attempted to make a Neon instruction
14007        conditional.
14008      - Alter the value in the condition code field if necessary.
14009      - Make sure that the arch supports Neon instructions.
14010
14011    Which of these operations take place depends on bits from enum
14012    vfp_or_neon_is_neon_bits.
14013
14014    WARNING: This function has side effects! If NEON_CHECK_CC is used and the
14015    current instruction's condition is COND_ALWAYS, the condition field is
14016    changed to inst.uncond_value. This is necessary because instructions shared
14017    between VFP and Neon may be conditional for the VFP variants only, and the
14018    unconditional Neon version must have, e.g., 0xF in the condition field.  */
14019
14020 static int
14021 vfp_or_neon_is_neon (unsigned check)
14022 {
14023   /* Conditions are always legal in Thumb mode (IT blocks).  */
14024   if (!thumb_mode && (check & NEON_CHECK_CC))
14025     {
14026       if (inst.cond != COND_ALWAYS)
14027         {
14028           first_error (_(BAD_COND));
14029           return FAIL;
14030         }
14031       if (inst.uncond_value != -1)
14032         inst.instruction |= inst.uncond_value << 28;
14033     }
14034
14035   if ((check & NEON_CHECK_ARCH)
14036       && !mark_feature_used (&fpu_neon_ext_v1))
14037     {
14038       first_error (_(BAD_FPU));
14039       return FAIL;
14040     }
14041
14042   if ((check & NEON_CHECK_ARCH8)
14043       && !mark_feature_used (&fpu_neon_ext_armv8))
14044     {
14045       first_error (_(BAD_FPU));
14046       return FAIL;
14047     }
14048
14049   return SUCCESS;
14050 }
14051
14052 static void
14053 do_neon_addsub_if_i (void)
14054 {
14055   if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
14056     return;
14057
14058   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14059     return;
14060
14061   /* The "untyped" case can't happen. Do this to stop the "U" bit being
14062      affected if we specify unsigned args.  */
14063   neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
14064 }
14065
14066 /* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
14067    result to be:
14068      V<op> A,B     (A is operand 0, B is operand 2)
14069    to mean:
14070      V<op> A,B,A
14071    not:
14072      V<op> A,B,B
14073    so handle that case specially.  */
14074
14075 static void
14076 neon_exchange_operands (void)
14077 {
14078   void *scratch = alloca (sizeof (inst.operands[0]));
14079   if (inst.operands[1].present)
14080     {
14081       /* Swap operands[1] and operands[2].  */
14082       memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
14083       inst.operands[1] = inst.operands[2];
14084       memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
14085     }
14086   else
14087     {
14088       inst.operands[1] = inst.operands[2];
14089       inst.operands[2] = inst.operands[0];
14090     }
14091 }
14092
14093 static void
14094 neon_compare (unsigned regtypes, unsigned immtypes, int invert)
14095 {
14096   if (inst.operands[2].isreg)
14097     {
14098       if (invert)
14099         neon_exchange_operands ();
14100       neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
14101     }
14102   else
14103     {
14104       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14105       struct neon_type_el et = neon_check_type (2, rs,
14106         N_EQK | N_SIZ, immtypes | N_KEY);
14107
14108       NEON_ENCODE (IMMED, inst);
14109       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14110       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14111       inst.instruction |= LOW4 (inst.operands[1].reg);
14112       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14113       inst.instruction |= neon_quad (rs) << 6;
14114       inst.instruction |= (et.type == NT_float) << 10;
14115       inst.instruction |= neon_logbits (et.size) << 18;
14116
14117       neon_dp_fixup (&inst);
14118     }
14119 }
14120
14121 static void
14122 do_neon_cmp (void)
14123 {
14124   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
14125 }
14126
14127 static void
14128 do_neon_cmp_inv (void)
14129 {
14130   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
14131 }
14132
14133 static void
14134 do_neon_ceq (void)
14135 {
14136   neon_compare (N_IF_32, N_IF_32, FALSE);
14137 }
14138
14139 /* For multiply instructions, we have the possibility of 16-bit or 32-bit
14140    scalars, which are encoded in 5 bits, M : Rm.
14141    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
14142    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
14143    index in M.  */
14144
14145 static unsigned
14146 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
14147 {
14148   unsigned regno = NEON_SCALAR_REG (scalar);
14149   unsigned elno = NEON_SCALAR_INDEX (scalar);
14150
14151   switch (elsize)
14152     {
14153     case 16:
14154       if (regno > 7 || elno > 3)
14155         goto bad_scalar;
14156       return regno | (elno << 3);
14157
14158     case 32:
14159       if (regno > 15 || elno > 1)
14160         goto bad_scalar;
14161       return regno | (elno << 4);
14162
14163     default:
14164     bad_scalar:
14165       first_error (_("scalar out of range for multiply instruction"));
14166     }
14167
14168   return 0;
14169 }
14170
14171 /* Encode multiply / multiply-accumulate scalar instructions.  */
14172
14173 static void
14174 neon_mul_mac (struct neon_type_el et, int ubit)
14175 {
14176   unsigned scalar;
14177
14178   /* Give a more helpful error message if we have an invalid type.  */
14179   if (et.type == NT_invtype)
14180     return;
14181
14182   scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
14183   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14184   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14185   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14186   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14187   inst.instruction |= LOW4 (scalar);
14188   inst.instruction |= HI1 (scalar) << 5;
14189   inst.instruction |= (et.type == NT_float) << 8;
14190   inst.instruction |= neon_logbits (et.size) << 20;
14191   inst.instruction |= (ubit != 0) << 24;
14192
14193   neon_dp_fixup (&inst);
14194 }
14195
14196 static void
14197 do_neon_mac_maybe_scalar (void)
14198 {
14199   if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
14200     return;
14201
14202   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14203     return;
14204
14205   if (inst.operands[2].isscalar)
14206     {
14207       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
14208       struct neon_type_el et = neon_check_type (3, rs,
14209         N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
14210       NEON_ENCODE (SCALAR, inst);
14211       neon_mul_mac (et, neon_quad (rs));
14212     }
14213   else
14214     {
14215       /* The "untyped" case can't happen.  Do this to stop the "U" bit being
14216          affected if we specify unsigned args.  */
14217       neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14218     }
14219 }
14220
14221 static void
14222 do_neon_fmac (void)
14223 {
14224   if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
14225     return;
14226
14227   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14228     return;
14229
14230   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14231 }
14232
14233 static void
14234 do_neon_tst (void)
14235 {
14236   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14237   struct neon_type_el et = neon_check_type (3, rs,
14238     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
14239   neon_three_same (neon_quad (rs), 0, et.size);
14240 }
14241
14242 /* VMUL with 3 registers allows the P8 type. The scalar version supports the
14243    same types as the MAC equivalents. The polynomial type for this instruction
14244    is encoded the same as the integer type.  */
14245
14246 static void
14247 do_neon_mul (void)
14248 {
14249   if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
14250     return;
14251
14252   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14253     return;
14254
14255   if (inst.operands[2].isscalar)
14256     do_neon_mac_maybe_scalar ();
14257   else
14258     neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
14259 }
14260
14261 static void
14262 do_neon_qdmulh (void)
14263 {
14264   if (inst.operands[2].isscalar)
14265     {
14266       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
14267       struct neon_type_el et = neon_check_type (3, rs,
14268         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
14269       NEON_ENCODE (SCALAR, inst);
14270       neon_mul_mac (et, neon_quad (rs));
14271     }
14272   else
14273     {
14274       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14275       struct neon_type_el et = neon_check_type (3, rs,
14276         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
14277       NEON_ENCODE (INTEGER, inst);
14278       /* The U bit (rounding) comes from bit mask.  */
14279       neon_three_same (neon_quad (rs), 0, et.size);
14280     }
14281 }
14282
14283 static void
14284 do_neon_fcmp_absolute (void)
14285 {
14286   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14287   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14288   /* Size field comes from bit mask.  */
14289   neon_three_same (neon_quad (rs), 1, -1);
14290 }
14291
14292 static void
14293 do_neon_fcmp_absolute_inv (void)
14294 {
14295   neon_exchange_operands ();
14296   do_neon_fcmp_absolute ();
14297 }
14298
14299 static void
14300 do_neon_step (void)
14301 {
14302   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14303   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14304   neon_three_same (neon_quad (rs), 0, -1);
14305 }
14306
14307 static void
14308 do_neon_abs_neg (void)
14309 {
14310   enum neon_shape rs;
14311   struct neon_type_el et;
14312
14313   if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
14314     return;
14315
14316   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14317     return;
14318
14319   rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14320   et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
14321
14322   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14323   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14324   inst.instruction |= LOW4 (inst.operands[1].reg);
14325   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14326   inst.instruction |= neon_quad (rs) << 6;
14327   inst.instruction |= (et.type == NT_float) << 10;
14328   inst.instruction |= neon_logbits (et.size) << 18;
14329
14330   neon_dp_fixup (&inst);
14331 }
14332
14333 static void
14334 do_neon_sli (void)
14335 {
14336   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14337   struct neon_type_el et = neon_check_type (2, rs,
14338     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14339   int imm = inst.operands[2].imm;
14340   constraint (imm < 0 || (unsigned)imm >= et.size,
14341               _("immediate out of range for insert"));
14342   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
14343 }
14344
14345 static void
14346 do_neon_sri (void)
14347 {
14348   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14349   struct neon_type_el et = neon_check_type (2, rs,
14350     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14351   int imm = inst.operands[2].imm;
14352   constraint (imm < 1 || (unsigned)imm > et.size,
14353               _("immediate out of range for insert"));
14354   neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
14355 }
14356
14357 static void
14358 do_neon_qshlu_imm (void)
14359 {
14360   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14361   struct neon_type_el et = neon_check_type (2, rs,
14362     N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
14363   int imm = inst.operands[2].imm;
14364   constraint (imm < 0 || (unsigned)imm >= et.size,
14365               _("immediate out of range for shift"));
14366   /* Only encodes the 'U present' variant of the instruction.
14367      In this case, signed types have OP (bit 8) set to 0.
14368      Unsigned types have OP set to 1.  */
14369   inst.instruction |= (et.type == NT_unsigned) << 8;
14370   /* The rest of the bits are the same as other immediate shifts.  */
14371   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
14372 }
14373
14374 static void
14375 do_neon_qmovn (void)
14376 {
14377   struct neon_type_el et = neon_check_type (2, NS_DQ,
14378     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14379   /* Saturating move where operands can be signed or unsigned, and the
14380      destination has the same signedness.  */
14381   NEON_ENCODE (INTEGER, inst);
14382   if (et.type == NT_unsigned)
14383     inst.instruction |= 0xc0;
14384   else
14385     inst.instruction |= 0x80;
14386   neon_two_same (0, 1, et.size / 2);
14387 }
14388
14389 static void
14390 do_neon_qmovun (void)
14391 {
14392   struct neon_type_el et = neon_check_type (2, NS_DQ,
14393     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14394   /* Saturating move with unsigned results. Operands must be signed.  */
14395   NEON_ENCODE (INTEGER, inst);
14396   neon_two_same (0, 1, et.size / 2);
14397 }
14398
14399 static void
14400 do_neon_rshift_sat_narrow (void)
14401 {
14402   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14403      or unsigned. If operands are unsigned, results must also be unsigned.  */
14404   struct neon_type_el et = neon_check_type (2, NS_DQI,
14405     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14406   int imm = inst.operands[2].imm;
14407   /* This gets the bounds check, size encoding and immediate bits calculation
14408      right.  */
14409   et.size /= 2;
14410
14411   /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
14412      VQMOVN.I<size> <Dd>, <Qm>.  */
14413   if (imm == 0)
14414     {
14415       inst.operands[2].present = 0;
14416       inst.instruction = N_MNEM_vqmovn;
14417       do_neon_qmovn ();
14418       return;
14419     }
14420
14421   constraint (imm < 1 || (unsigned)imm > et.size,
14422               _("immediate out of range"));
14423   neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
14424 }
14425
14426 static void
14427 do_neon_rshift_sat_narrow_u (void)
14428 {
14429   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14430      or unsigned. If operands are unsigned, results must also be unsigned.  */
14431   struct neon_type_el et = neon_check_type (2, NS_DQI,
14432     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14433   int imm = inst.operands[2].imm;
14434   /* This gets the bounds check, size encoding and immediate bits calculation
14435      right.  */
14436   et.size /= 2;
14437
14438   /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
14439      VQMOVUN.I<size> <Dd>, <Qm>.  */
14440   if (imm == 0)
14441     {
14442       inst.operands[2].present = 0;
14443       inst.instruction = N_MNEM_vqmovun;
14444       do_neon_qmovun ();
14445       return;
14446     }
14447
14448   constraint (imm < 1 || (unsigned)imm > et.size,
14449               _("immediate out of range"));
14450   /* FIXME: The manual is kind of unclear about what value U should have in
14451      VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
14452      must be 1.  */
14453   neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
14454 }
14455
14456 static void
14457 do_neon_movn (void)
14458 {
14459   struct neon_type_el et = neon_check_type (2, NS_DQ,
14460     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14461   NEON_ENCODE (INTEGER, inst);
14462   neon_two_same (0, 1, et.size / 2);
14463 }
14464
14465 static void
14466 do_neon_rshift_narrow (void)
14467 {
14468   struct neon_type_el et = neon_check_type (2, NS_DQI,
14469     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14470   int imm = inst.operands[2].imm;
14471   /* This gets the bounds check, size encoding and immediate bits calculation
14472      right.  */
14473   et.size /= 2;
14474
14475   /* If immediate is zero then we are a pseudo-instruction for
14476      VMOVN.I<size> <Dd>, <Qm>  */
14477   if (imm == 0)
14478     {
14479       inst.operands[2].present = 0;
14480       inst.instruction = N_MNEM_vmovn;
14481       do_neon_movn ();
14482       return;
14483     }
14484
14485   constraint (imm < 1 || (unsigned)imm > et.size,
14486               _("immediate out of range for narrowing operation"));
14487   neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
14488 }
14489
14490 static void
14491 do_neon_shll (void)
14492 {
14493   /* FIXME: Type checking when lengthening.  */
14494   struct neon_type_el et = neon_check_type (2, NS_QDI,
14495     N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
14496   unsigned imm = inst.operands[2].imm;
14497
14498   if (imm == et.size)
14499     {
14500       /* Maximum shift variant.  */
14501       NEON_ENCODE (INTEGER, inst);
14502       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14503       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14504       inst.instruction |= LOW4 (inst.operands[1].reg);
14505       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14506       inst.instruction |= neon_logbits (et.size) << 18;
14507
14508       neon_dp_fixup (&inst);
14509     }
14510   else
14511     {
14512       /* A more-specific type check for non-max versions.  */
14513       et = neon_check_type (2, NS_QDI,
14514         N_EQK | N_DBL, N_SU_32 | N_KEY);
14515       NEON_ENCODE (IMMED, inst);
14516       neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
14517     }
14518 }
14519
14520 /* Check the various types for the VCVT instruction, and return which version
14521    the current instruction is.  */
14522
14523 #define CVT_FLAVOUR_VAR                                                       \
14524   CVT_VAR (s32_f32, N_S32, N_F32, whole_reg,   "ftosls", "ftosis", "ftosizs") \
14525   CVT_VAR (u32_f32, N_U32, N_F32, whole_reg,   "ftouls", "ftouis", "ftouizs") \
14526   CVT_VAR (f32_s32, N_F32, N_S32, whole_reg,   "fsltos", "fsitos", NULL)      \
14527   CVT_VAR (f32_u32, N_F32, N_U32, whole_reg,   "fultos", "fuitos", NULL)      \
14528   /* Half-precision conversions.  */                                          \
14529   CVT_VAR (f32_f16, N_F32, N_F16, whole_reg,   NULL,     NULL,     NULL)      \
14530   CVT_VAR (f16_f32, N_F16, N_F32, whole_reg,   NULL,     NULL,     NULL)      \
14531   /* VFP instructions.  */                                                    \
14532   CVT_VAR (f32_f64, N_F32, N_F64, N_VFP,       NULL,     "fcvtsd", NULL)      \
14533   CVT_VAR (f64_f32, N_F64, N_F32, N_VFP,       NULL,     "fcvtds", NULL)      \
14534   CVT_VAR (s32_f64, N_S32, N_F64 | key, N_VFP, "ftosld", "ftosid", "ftosizd") \
14535   CVT_VAR (u32_f64, N_U32, N_F64 | key, N_VFP, "ftould", "ftouid", "ftouizd") \
14536   CVT_VAR (f64_s32, N_F64 | key, N_S32, N_VFP, "fsltod", "fsitod", NULL)      \
14537   CVT_VAR (f64_u32, N_F64 | key, N_U32, N_VFP, "fultod", "fuitod", NULL)      \
14538   /* VFP instructions with bitshift.  */                                      \
14539   CVT_VAR (f32_s16, N_F32 | key, N_S16, N_VFP, "fshtos", NULL,     NULL)      \
14540   CVT_VAR (f32_u16, N_F32 | key, N_U16, N_VFP, "fuhtos", NULL,     NULL)      \
14541   CVT_VAR (f64_s16, N_F64 | key, N_S16, N_VFP, "fshtod", NULL,     NULL)      \
14542   CVT_VAR (f64_u16, N_F64 | key, N_U16, N_VFP, "fuhtod", NULL,     NULL)      \
14543   CVT_VAR (s16_f32, N_S16, N_F32 | key, N_VFP, "ftoshs", NULL,     NULL)      \
14544   CVT_VAR (u16_f32, N_U16, N_F32 | key, N_VFP, "ftouhs", NULL,     NULL)      \
14545   CVT_VAR (s16_f64, N_S16, N_F64 | key, N_VFP, "ftoshd", NULL,     NULL)      \
14546   CVT_VAR (u16_f64, N_U16, N_F64 | key, N_VFP, "ftouhd", NULL,     NULL)
14547
14548 #define CVT_VAR(C, X, Y, R, BSN, CN, ZN) \
14549   neon_cvt_flavour_##C,
14550
14551 /* The different types of conversions we can do.  */
14552 enum neon_cvt_flavour
14553 {
14554   CVT_FLAVOUR_VAR
14555   neon_cvt_flavour_invalid,
14556   neon_cvt_flavour_first_fp = neon_cvt_flavour_f32_f64
14557 };
14558
14559 #undef CVT_VAR
14560
14561 static enum neon_cvt_flavour
14562 get_neon_cvt_flavour (enum neon_shape rs)
14563 {
14564 #define CVT_VAR(C,X,Y,R,BSN,CN,ZN)                      \
14565   et = neon_check_type (2, rs, (R) | (X), (R) | (Y));   \
14566   if (et.type != NT_invtype)                            \
14567     {                                                   \
14568       inst.error = NULL;                                \
14569       return (neon_cvt_flavour_##C);                    \
14570     }
14571
14572   struct neon_type_el et;
14573   unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
14574                         || rs == NS_FF) ? N_VFP : 0;
14575   /* The instruction versions which take an immediate take one register
14576      argument, which is extended to the width of the full register. Thus the
14577      "source" and "destination" registers must have the same width.  Hack that
14578      here by making the size equal to the key (wider, in this case) operand.  */
14579   unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
14580
14581   CVT_FLAVOUR_VAR;
14582
14583   return neon_cvt_flavour_invalid;
14584 #undef CVT_VAR
14585 }
14586
14587 enum neon_cvt_mode
14588 {
14589   neon_cvt_mode_a,
14590   neon_cvt_mode_n,
14591   neon_cvt_mode_p,
14592   neon_cvt_mode_m,
14593   neon_cvt_mode_z,
14594   neon_cvt_mode_x,
14595   neon_cvt_mode_r
14596 };
14597
14598 /* Neon-syntax VFP conversions.  */
14599
14600 static void
14601 do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
14602 {
14603   const char *opname = 0;
14604
14605   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
14606     {
14607       /* Conversions with immediate bitshift.  */
14608       const char *enc[] =
14609         {
14610 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) BSN,
14611           CVT_FLAVOUR_VAR
14612           NULL
14613 #undef CVT_VAR
14614         };
14615
14616       if (flavour < (int) ARRAY_SIZE (enc))
14617         {
14618           opname = enc[flavour];
14619           constraint (inst.operands[0].reg != inst.operands[1].reg,
14620                       _("operands 0 and 1 must be the same register"));
14621           inst.operands[1] = inst.operands[2];
14622           memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
14623         }
14624     }
14625   else
14626     {
14627       /* Conversions without bitshift.  */
14628       const char *enc[] =
14629         {
14630 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) CN,
14631           CVT_FLAVOUR_VAR
14632           NULL
14633 #undef CVT_VAR
14634         };
14635
14636       if (flavour < (int) ARRAY_SIZE (enc))
14637         opname = enc[flavour];
14638     }
14639
14640   if (opname)
14641     do_vfp_nsyn_opcode (opname);
14642 }
14643
14644 static void
14645 do_vfp_nsyn_cvtz (void)
14646 {
14647   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
14648   enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
14649   const char *enc[] =
14650     {
14651 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) ZN,
14652       CVT_FLAVOUR_VAR
14653       NULL
14654 #undef CVT_VAR
14655     };
14656
14657   if (flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
14658     do_vfp_nsyn_opcode (enc[flavour]);
14659 }
14660
14661 static void
14662 do_vfp_nsyn_cvt_fpv8 (enum neon_cvt_flavour flavour,
14663                       enum neon_cvt_mode mode)
14664 {
14665   int sz, op;
14666   int rm;
14667
14668   set_it_insn_type (OUTSIDE_IT_INSN);
14669
14670   switch (flavour)
14671     {
14672     case neon_cvt_flavour_s32_f64:
14673       sz = 1;
14674       op = 1;
14675       break;
14676     case neon_cvt_flavour_s32_f32:
14677       sz = 0;
14678       op = 1;
14679       break;
14680     case neon_cvt_flavour_u32_f64:
14681       sz = 1;
14682       op = 0;
14683       break;
14684     case neon_cvt_flavour_u32_f32:
14685       sz = 0;
14686       op = 0;
14687       break;
14688     default:
14689       first_error (_("invalid instruction shape"));
14690       return;
14691     }
14692
14693   switch (mode)
14694     {
14695     case neon_cvt_mode_a: rm = 0; break;
14696     case neon_cvt_mode_n: rm = 1; break;
14697     case neon_cvt_mode_p: rm = 2; break;
14698     case neon_cvt_mode_m: rm = 3; break;
14699     default: first_error (_("invalid rounding mode")); return;
14700     }
14701
14702   NEON_ENCODE (FPV8, inst);
14703   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
14704   encode_arm_vfp_reg (inst.operands[1].reg, sz == 1 ? VFP_REG_Dm : VFP_REG_Sm);
14705   inst.instruction |= sz << 8;
14706   inst.instruction |= op << 7;
14707   inst.instruction |= rm << 16;
14708   inst.instruction |= 0xf0000000;
14709   inst.is_neon = TRUE;
14710 }
14711
14712 static void
14713 do_neon_cvt_1 (enum neon_cvt_mode mode)
14714 {
14715   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
14716     NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
14717   enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
14718
14719   /* PR11109: Handle round-to-zero for VCVT conversions.  */
14720   if (mode == neon_cvt_mode_z
14721       && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
14722       && (flavour == neon_cvt_flavour_s32_f32
14723           || flavour == neon_cvt_flavour_u32_f32
14724           || flavour == neon_cvt_flavour_s32_f64
14725           || flavour == neon_cvt_flavour_u32_f64)
14726       && (rs == NS_FD || rs == NS_FF))
14727     {
14728       do_vfp_nsyn_cvtz ();
14729       return;
14730     }
14731
14732   /* VFP rather than Neon conversions.  */
14733   if (flavour >= neon_cvt_flavour_first_fp)
14734     {
14735       if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
14736         do_vfp_nsyn_cvt (rs, flavour);
14737       else
14738         do_vfp_nsyn_cvt_fpv8 (flavour, mode);
14739
14740       return;
14741     }
14742
14743   switch (rs)
14744     {
14745     case NS_DDI:
14746     case NS_QQI:
14747       {
14748         unsigned immbits;
14749         unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
14750
14751         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14752           return;
14753
14754         /* Fixed-point conversion with #0 immediate is encoded as an
14755            integer conversion.  */
14756         if (inst.operands[2].present && inst.operands[2].imm == 0)
14757           goto int_encode;
14758        immbits = 32 - inst.operands[2].imm;
14759         NEON_ENCODE (IMMED, inst);
14760         if (flavour != neon_cvt_flavour_invalid)
14761           inst.instruction |= enctab[flavour];
14762         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14763         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14764         inst.instruction |= LOW4 (inst.operands[1].reg);
14765         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14766         inst.instruction |= neon_quad (rs) << 6;
14767         inst.instruction |= 1 << 21;
14768         inst.instruction |= immbits << 16;
14769
14770         neon_dp_fixup (&inst);
14771       }
14772       break;
14773
14774     case NS_DD:
14775     case NS_QQ:
14776       if (mode != neon_cvt_mode_x && mode != neon_cvt_mode_z)
14777         {
14778           NEON_ENCODE (FLOAT, inst);
14779           set_it_insn_type (OUTSIDE_IT_INSN);
14780
14781           if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
14782             return;
14783
14784           inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14785           inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14786           inst.instruction |= LOW4 (inst.operands[1].reg);
14787           inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14788           inst.instruction |= neon_quad (rs) << 6;
14789           inst.instruction |= (flavour == neon_cvt_flavour_u32_f32) << 7;
14790           inst.instruction |= mode << 8;
14791           if (thumb_mode)
14792             inst.instruction |= 0xfc000000;
14793           else
14794             inst.instruction |= 0xf0000000;
14795         }
14796       else
14797         {
14798     int_encode:
14799           {
14800             unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
14801
14802             NEON_ENCODE (INTEGER, inst);
14803
14804             if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14805               return;
14806
14807             if (flavour != neon_cvt_flavour_invalid)
14808               inst.instruction |= enctab[flavour];
14809
14810             inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14811             inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14812             inst.instruction |= LOW4 (inst.operands[1].reg);
14813             inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14814             inst.instruction |= neon_quad (rs) << 6;
14815             inst.instruction |= 2 << 18;
14816
14817             neon_dp_fixup (&inst);
14818           }
14819         }
14820       break;
14821
14822     /* Half-precision conversions for Advanced SIMD -- neon.  */
14823     case NS_QD:
14824     case NS_DQ:
14825
14826       if ((rs == NS_DQ)
14827           && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
14828           {
14829             as_bad (_("operand size must match register width"));
14830             break;
14831           }
14832
14833       if ((rs == NS_QD)
14834           && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
14835           {
14836             as_bad (_("operand size must match register width"));
14837             break;
14838           }
14839
14840       if (rs == NS_DQ)
14841         inst.instruction = 0x3b60600;
14842       else
14843         inst.instruction = 0x3b60700;
14844
14845       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14846       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14847       inst.instruction |= LOW4 (inst.operands[1].reg);
14848       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14849       neon_dp_fixup (&inst);
14850       break;
14851
14852     default:
14853       /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
14854       if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
14855         do_vfp_nsyn_cvt (rs, flavour);
14856       else
14857         do_vfp_nsyn_cvt_fpv8 (flavour, mode);
14858     }
14859 }
14860
14861 static void
14862 do_neon_cvtr (void)
14863 {
14864   do_neon_cvt_1 (neon_cvt_mode_x);
14865 }
14866
14867 static void
14868 do_neon_cvt (void)
14869 {
14870   do_neon_cvt_1 (neon_cvt_mode_z);
14871 }
14872
14873 static void
14874 do_neon_cvta (void)
14875 {
14876   do_neon_cvt_1 (neon_cvt_mode_a);
14877 }
14878
14879 static void
14880 do_neon_cvtn (void)
14881 {
14882   do_neon_cvt_1 (neon_cvt_mode_n);
14883 }
14884
14885 static void
14886 do_neon_cvtp (void)
14887 {
14888   do_neon_cvt_1 (neon_cvt_mode_p);
14889 }
14890
14891 static void
14892 do_neon_cvtm (void)
14893 {
14894   do_neon_cvt_1 (neon_cvt_mode_m);
14895 }
14896
14897 static void
14898 do_neon_cvttb_2 (bfd_boolean t, bfd_boolean to, bfd_boolean is_double)
14899 {
14900   if (is_double)
14901     mark_feature_used (&fpu_vfp_ext_armv8);
14902
14903   encode_arm_vfp_reg (inst.operands[0].reg,
14904                       (is_double && !to) ? VFP_REG_Dd : VFP_REG_Sd);
14905   encode_arm_vfp_reg (inst.operands[1].reg,
14906                       (is_double && to) ? VFP_REG_Dm : VFP_REG_Sm);
14907   inst.instruction |= to ? 0x10000 : 0;
14908   inst.instruction |= t ? 0x80 : 0;
14909   inst.instruction |= is_double ? 0x100 : 0;
14910   do_vfp_cond_or_thumb ();
14911 }
14912
14913 static void
14914 do_neon_cvttb_1 (bfd_boolean t)
14915 {
14916   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_DF, NS_NULL);
14917
14918   if (rs == NS_NULL)
14919     return;
14920   else if (neon_check_type (2, rs, N_F16, N_F32 | N_VFP).type != NT_invtype)
14921     {
14922       inst.error = NULL;
14923       do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/FALSE);
14924     }
14925   else if (neon_check_type (2, rs, N_F32 | N_VFP, N_F16).type != NT_invtype)
14926     {
14927       inst.error = NULL;
14928       do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/FALSE);
14929     }
14930   else if (neon_check_type (2, rs, N_F16, N_F64 | N_VFP).type != NT_invtype)
14931     {
14932       inst.error = NULL;
14933       do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/TRUE);
14934     }
14935   else if (neon_check_type (2, rs, N_F64 | N_VFP, N_F16).type != NT_invtype)
14936     {
14937       inst.error = NULL;
14938       do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/TRUE);
14939     }
14940   else
14941     return;
14942 }
14943
14944 static void
14945 do_neon_cvtb (void)
14946 {
14947   do_neon_cvttb_1 (FALSE);
14948 }
14949
14950
14951 static void
14952 do_neon_cvtt (void)
14953 {
14954   do_neon_cvttb_1 (TRUE);
14955 }
14956
14957 static void
14958 neon_move_immediate (void)
14959 {
14960   enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
14961   struct neon_type_el et = neon_check_type (2, rs,
14962     N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
14963   unsigned immlo, immhi = 0, immbits;
14964   int op, cmode, float_p;
14965
14966   constraint (et.type == NT_invtype,
14967               _("operand size must be specified for immediate VMOV"));
14968
14969   /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
14970   op = (inst.instruction & (1 << 5)) != 0;
14971
14972   immlo = inst.operands[1].imm;
14973   if (inst.operands[1].regisimm)
14974     immhi = inst.operands[1].reg;
14975
14976   constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
14977               _("immediate has bits set outside the operand size"));
14978
14979   float_p = inst.operands[1].immisfloat;
14980
14981   if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
14982                                         et.size, et.type)) == FAIL)
14983     {
14984       /* Invert relevant bits only.  */
14985       neon_invert_size (&immlo, &immhi, et.size);
14986       /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
14987          with one or the other; those cases are caught by
14988          neon_cmode_for_move_imm.  */
14989       op = !op;
14990       if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
14991                                             &op, et.size, et.type)) == FAIL)
14992         {
14993           first_error (_("immediate out of range"));
14994           return;
14995         }
14996     }
14997
14998   inst.instruction &= ~(1 << 5);
14999   inst.instruction |= op << 5;
15000
15001   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15002   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15003   inst.instruction |= neon_quad (rs) << 6;
15004   inst.instruction |= cmode << 8;
15005
15006   neon_write_immbits (immbits);
15007 }
15008
15009 static void
15010 do_neon_mvn (void)
15011 {
15012   if (inst.operands[1].isreg)
15013     {
15014       enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15015
15016       NEON_ENCODE (INTEGER, inst);
15017       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15018       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15019       inst.instruction |= LOW4 (inst.operands[1].reg);
15020       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15021       inst.instruction |= neon_quad (rs) << 6;
15022     }
15023   else
15024     {
15025       NEON_ENCODE (IMMED, inst);
15026       neon_move_immediate ();
15027     }
15028
15029   neon_dp_fixup (&inst);
15030 }
15031
15032 /* Encode instructions of form:
15033
15034   |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
15035   |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |  */
15036
15037 static void
15038 neon_mixed_length (struct neon_type_el et, unsigned size)
15039 {
15040   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15041   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15042   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15043   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15044   inst.instruction |= LOW4 (inst.operands[2].reg);
15045   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15046   inst.instruction |= (et.type == NT_unsigned) << 24;
15047   inst.instruction |= neon_logbits (size) << 20;
15048
15049   neon_dp_fixup (&inst);
15050 }
15051
15052 static void
15053 do_neon_dyadic_long (void)
15054 {
15055   /* FIXME: Type checking for lengthening op.  */
15056   struct neon_type_el et = neon_check_type (3, NS_QDD,
15057     N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
15058   neon_mixed_length (et, et.size);
15059 }
15060
15061 static void
15062 do_neon_abal (void)
15063 {
15064   struct neon_type_el et = neon_check_type (3, NS_QDD,
15065     N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
15066   neon_mixed_length (et, et.size);
15067 }
15068
15069 static void
15070 neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
15071 {
15072   if (inst.operands[2].isscalar)
15073     {
15074       struct neon_type_el et = neon_check_type (3, NS_QDS,
15075         N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
15076       NEON_ENCODE (SCALAR, inst);
15077       neon_mul_mac (et, et.type == NT_unsigned);
15078     }
15079   else
15080     {
15081       struct neon_type_el et = neon_check_type (3, NS_QDD,
15082         N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
15083       NEON_ENCODE (INTEGER, inst);
15084       neon_mixed_length (et, et.size);
15085     }
15086 }
15087
15088 static void
15089 do_neon_mac_maybe_scalar_long (void)
15090 {
15091   neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
15092 }
15093
15094 static void
15095 do_neon_dyadic_wide (void)
15096 {
15097   struct neon_type_el et = neon_check_type (3, NS_QQD,
15098     N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
15099   neon_mixed_length (et, et.size);
15100 }
15101
15102 static void
15103 do_neon_dyadic_narrow (void)
15104 {
15105   struct neon_type_el et = neon_check_type (3, NS_QDD,
15106     N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
15107   /* Operand sign is unimportant, and the U bit is part of the opcode,
15108      so force the operand type to integer.  */
15109   et.type = NT_integer;
15110   neon_mixed_length (et, et.size / 2);
15111 }
15112
15113 static void
15114 do_neon_mul_sat_scalar_long (void)
15115 {
15116   neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
15117 }
15118
15119 static void
15120 do_neon_vmull (void)
15121 {
15122   if (inst.operands[2].isscalar)
15123     do_neon_mac_maybe_scalar_long ();
15124   else
15125     {
15126       struct neon_type_el et = neon_check_type (3, NS_QDD,
15127         N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_P64 | N_KEY);
15128
15129       if (et.type == NT_poly)
15130         NEON_ENCODE (POLY, inst);
15131       else
15132         NEON_ENCODE (INTEGER, inst);
15133
15134       /* For polynomial encoding the U bit must be zero, and the size must
15135          be 8 (encoded as 0b00) or, on ARMv8 or later 64 (encoded, non
15136          obviously, as 0b10).  */
15137       if (et.size == 64)
15138         {
15139           /* Check we're on the correct architecture.  */
15140           if (!mark_feature_used (&fpu_crypto_ext_armv8))
15141             inst.error =
15142               _("Instruction form not available on this architecture.");
15143
15144           et.size = 32;
15145         }
15146
15147       neon_mixed_length (et, et.size);
15148     }
15149 }
15150
15151 static void
15152 do_neon_ext (void)
15153 {
15154   enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
15155   struct neon_type_el et = neon_check_type (3, rs,
15156     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
15157   unsigned imm = (inst.operands[3].imm * et.size) / 8;
15158
15159   constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
15160               _("shift out of range"));
15161   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15162   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15163   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15164   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15165   inst.instruction |= LOW4 (inst.operands[2].reg);
15166   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15167   inst.instruction |= neon_quad (rs) << 6;
15168   inst.instruction |= imm << 8;
15169
15170   neon_dp_fixup (&inst);
15171 }
15172
15173 static void
15174 do_neon_rev (void)
15175 {
15176   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15177   struct neon_type_el et = neon_check_type (2, rs,
15178     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15179   unsigned op = (inst.instruction >> 7) & 3;
15180   /* N (width of reversed regions) is encoded as part of the bitmask. We
15181      extract it here to check the elements to be reversed are smaller.
15182      Otherwise we'd get a reserved instruction.  */
15183   unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
15184   gas_assert (elsize != 0);
15185   constraint (et.size >= elsize,
15186               _("elements must be smaller than reversal region"));
15187   neon_two_same (neon_quad (rs), 1, et.size);
15188 }
15189
15190 static void
15191 do_neon_dup (void)
15192 {
15193   if (inst.operands[1].isscalar)
15194     {
15195       enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
15196       struct neon_type_el et = neon_check_type (2, rs,
15197         N_EQK, N_8 | N_16 | N_32 | N_KEY);
15198       unsigned sizebits = et.size >> 3;
15199       unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
15200       int logsize = neon_logbits (et.size);
15201       unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
15202
15203       if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
15204         return;
15205
15206       NEON_ENCODE (SCALAR, inst);
15207       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15208       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15209       inst.instruction |= LOW4 (dm);
15210       inst.instruction |= HI1 (dm) << 5;
15211       inst.instruction |= neon_quad (rs) << 6;
15212       inst.instruction |= x << 17;
15213       inst.instruction |= sizebits << 16;
15214
15215       neon_dp_fixup (&inst);
15216     }
15217   else
15218     {
15219       enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
15220       struct neon_type_el et = neon_check_type (2, rs,
15221         N_8 | N_16 | N_32 | N_KEY, N_EQK);
15222       /* Duplicate ARM register to lanes of vector.  */
15223       NEON_ENCODE (ARMREG, inst);
15224       switch (et.size)
15225         {
15226         case 8:  inst.instruction |= 0x400000; break;
15227         case 16: inst.instruction |= 0x000020; break;
15228         case 32: inst.instruction |= 0x000000; break;
15229         default: break;
15230         }
15231       inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15232       inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
15233       inst.instruction |= HI1 (inst.operands[0].reg) << 7;
15234       inst.instruction |= neon_quad (rs) << 21;
15235       /* The encoding for this instruction is identical for the ARM and Thumb
15236          variants, except for the condition field.  */
15237       do_vfp_cond_or_thumb ();
15238     }
15239 }
15240
15241 /* VMOV has particularly many variations. It can be one of:
15242      0. VMOV<c><q> <Qd>, <Qm>
15243      1. VMOV<c><q> <Dd>, <Dm>
15244    (Register operations, which are VORR with Rm = Rn.)
15245      2. VMOV<c><q>.<dt> <Qd>, #<imm>
15246      3. VMOV<c><q>.<dt> <Dd>, #<imm>
15247    (Immediate loads.)
15248      4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
15249    (ARM register to scalar.)
15250      5. VMOV<c><q> <Dm>, <Rd>, <Rn>
15251    (Two ARM registers to vector.)
15252      6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
15253    (Scalar to ARM register.)
15254      7. VMOV<c><q> <Rd>, <Rn>, <Dm>
15255    (Vector to two ARM registers.)
15256      8. VMOV.F32 <Sd>, <Sm>
15257      9. VMOV.F64 <Dd>, <Dm>
15258    (VFP register moves.)
15259     10. VMOV.F32 <Sd>, #imm
15260     11. VMOV.F64 <Dd>, #imm
15261    (VFP float immediate load.)
15262     12. VMOV <Rd>, <Sm>
15263    (VFP single to ARM reg.)
15264     13. VMOV <Sd>, <Rm>
15265    (ARM reg to VFP single.)
15266     14. VMOV <Rd>, <Re>, <Sn>, <Sm>
15267    (Two ARM regs to two VFP singles.)
15268     15. VMOV <Sd>, <Se>, <Rn>, <Rm>
15269    (Two VFP singles to two ARM regs.)
15270
15271    These cases can be disambiguated using neon_select_shape, except cases 1/9
15272    and 3/11 which depend on the operand type too.
15273
15274    All the encoded bits are hardcoded by this function.
15275
15276    Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
15277    Cases 5, 7 may be used with VFPv2 and above.
15278
15279    FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
15280    can specify a type where it doesn't make sense to, and is ignored).  */
15281
15282 static void
15283 do_neon_mov (void)
15284 {
15285   enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
15286     NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
15287     NS_NULL);
15288   struct neon_type_el et;
15289   const char *ldconst = 0;
15290
15291   switch (rs)
15292     {
15293     case NS_DD:  /* case 1/9.  */
15294       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15295       /* It is not an error here if no type is given.  */
15296       inst.error = NULL;
15297       if (et.type == NT_float && et.size == 64)
15298         {
15299           do_vfp_nsyn_opcode ("fcpyd");
15300           break;
15301         }
15302       /* fall through.  */
15303
15304     case NS_QQ:  /* case 0/1.  */
15305       {
15306         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15307           return;
15308         /* The architecture manual I have doesn't explicitly state which
15309            value the U bit should have for register->register moves, but
15310            the equivalent VORR instruction has U = 0, so do that.  */
15311         inst.instruction = 0x0200110;
15312         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15313         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15314         inst.instruction |= LOW4 (inst.operands[1].reg);
15315         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15316         inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15317         inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15318         inst.instruction |= neon_quad (rs) << 6;
15319
15320         neon_dp_fixup (&inst);
15321       }
15322       break;
15323
15324     case NS_DI:  /* case 3/11.  */
15325       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15326       inst.error = NULL;
15327       if (et.type == NT_float && et.size == 64)
15328         {
15329           /* case 11 (fconstd).  */
15330           ldconst = "fconstd";
15331           goto encode_fconstd;
15332         }
15333       /* fall through.  */
15334
15335     case NS_QI:  /* case 2/3.  */
15336       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15337         return;
15338       inst.instruction = 0x0800010;
15339       neon_move_immediate ();
15340       neon_dp_fixup (&inst);
15341       break;
15342
15343     case NS_SR:  /* case 4.  */
15344       {
15345         unsigned bcdebits = 0;
15346         int logsize;
15347         unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
15348         unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
15349
15350         /* .<size> is optional here, defaulting to .32. */
15351         if (inst.vectype.elems == 0
15352             && inst.operands[0].vectype.type == NT_invtype
15353             && inst.operands[1].vectype.type == NT_invtype)
15354           {
15355             inst.vectype.el[0].type = NT_untyped;
15356             inst.vectype.el[0].size = 32;
15357             inst.vectype.elems = 1;
15358           }
15359
15360         et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
15361         logsize = neon_logbits (et.size);
15362
15363         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15364                     _(BAD_FPU));
15365         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15366                     && et.size != 32, _(BAD_FPU));
15367         constraint (et.type == NT_invtype, _("bad type for scalar"));
15368         constraint (x >= 64 / et.size, _("scalar index out of range"));
15369
15370         switch (et.size)
15371           {
15372           case 8:  bcdebits = 0x8; break;
15373           case 16: bcdebits = 0x1; break;
15374           case 32: bcdebits = 0x0; break;
15375           default: ;
15376           }
15377
15378         bcdebits |= x << logsize;
15379
15380         inst.instruction = 0xe000b10;
15381         do_vfp_cond_or_thumb ();
15382         inst.instruction |= LOW4 (dn) << 16;
15383         inst.instruction |= HI1 (dn) << 7;
15384         inst.instruction |= inst.operands[1].reg << 12;
15385         inst.instruction |= (bcdebits & 3) << 5;
15386         inst.instruction |= (bcdebits >> 2) << 21;
15387       }
15388       break;
15389
15390     case NS_DRR:  /* case 5 (fmdrr).  */
15391       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
15392                   _(BAD_FPU));
15393
15394       inst.instruction = 0xc400b10;
15395       do_vfp_cond_or_thumb ();
15396       inst.instruction |= LOW4 (inst.operands[0].reg);
15397       inst.instruction |= HI1 (inst.operands[0].reg) << 5;
15398       inst.instruction |= inst.operands[1].reg << 12;
15399       inst.instruction |= inst.operands[2].reg << 16;
15400       break;
15401
15402     case NS_RS:  /* case 6.  */
15403       {
15404         unsigned logsize;
15405         unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
15406         unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
15407         unsigned abcdebits = 0;
15408
15409         /* .<dt> is optional here, defaulting to .32. */
15410         if (inst.vectype.elems == 0
15411             && inst.operands[0].vectype.type == NT_invtype
15412             && inst.operands[1].vectype.type == NT_invtype)
15413           {
15414             inst.vectype.el[0].type = NT_untyped;
15415             inst.vectype.el[0].size = 32;
15416             inst.vectype.elems = 1;
15417           }
15418
15419         et = neon_check_type (2, NS_NULL,
15420                               N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
15421         logsize = neon_logbits (et.size);
15422
15423         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15424                     _(BAD_FPU));
15425         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15426                     && et.size != 32, _(BAD_FPU));
15427         constraint (et.type == NT_invtype, _("bad type for scalar"));
15428         constraint (x >= 64 / et.size, _("scalar index out of range"));
15429
15430         switch (et.size)
15431           {
15432           case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
15433           case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
15434           case 32: abcdebits = 0x00; break;
15435           default: ;
15436           }
15437
15438         abcdebits |= x << logsize;
15439         inst.instruction = 0xe100b10;
15440         do_vfp_cond_or_thumb ();
15441         inst.instruction |= LOW4 (dn) << 16;
15442         inst.instruction |= HI1 (dn) << 7;
15443         inst.instruction |= inst.operands[0].reg << 12;
15444         inst.instruction |= (abcdebits & 3) << 5;
15445         inst.instruction |= (abcdebits >> 2) << 21;
15446       }
15447       break;
15448
15449     case NS_RRD:  /* case 7 (fmrrd).  */
15450       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
15451                   _(BAD_FPU));
15452
15453       inst.instruction = 0xc500b10;
15454       do_vfp_cond_or_thumb ();
15455       inst.instruction |= inst.operands[0].reg << 12;
15456       inst.instruction |= inst.operands[1].reg << 16;
15457       inst.instruction |= LOW4 (inst.operands[2].reg);
15458       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15459       break;
15460
15461     case NS_FF:  /* case 8 (fcpys).  */
15462       do_vfp_nsyn_opcode ("fcpys");
15463       break;
15464
15465     case NS_FI:  /* case 10 (fconsts).  */
15466       ldconst = "fconsts";
15467       encode_fconstd:
15468       if (is_quarter_float (inst.operands[1].imm))
15469         {
15470           inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
15471           do_vfp_nsyn_opcode (ldconst);
15472         }
15473       else
15474         first_error (_("immediate out of range"));
15475       break;
15476
15477     case NS_RF:  /* case 12 (fmrs).  */
15478       do_vfp_nsyn_opcode ("fmrs");
15479       break;
15480
15481     case NS_FR:  /* case 13 (fmsr).  */
15482       do_vfp_nsyn_opcode ("fmsr");
15483       break;
15484
15485     /* The encoders for the fmrrs and fmsrr instructions expect three operands
15486        (one of which is a list), but we have parsed four.  Do some fiddling to
15487        make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
15488        expect.  */
15489     case NS_RRFF:  /* case 14 (fmrrs).  */
15490       constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
15491                   _("VFP registers must be adjacent"));
15492       inst.operands[2].imm = 2;
15493       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15494       do_vfp_nsyn_opcode ("fmrrs");
15495       break;
15496
15497     case NS_FFRR:  /* case 15 (fmsrr).  */
15498       constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
15499                   _("VFP registers must be adjacent"));
15500       inst.operands[1] = inst.operands[2];
15501       inst.operands[2] = inst.operands[3];
15502       inst.operands[0].imm = 2;
15503       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15504       do_vfp_nsyn_opcode ("fmsrr");
15505       break;
15506
15507     case NS_NULL:
15508       /* neon_select_shape has determined that the instruction
15509          shape is wrong and has already set the error message.  */
15510       break;
15511
15512     default:
15513       abort ();
15514     }
15515 }
15516
15517 static void
15518 do_neon_rshift_round_imm (void)
15519 {
15520   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
15521   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
15522   int imm = inst.operands[2].imm;
15523
15524   /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
15525   if (imm == 0)
15526     {
15527       inst.operands[2].present = 0;
15528       do_neon_mov ();
15529       return;
15530     }
15531
15532   constraint (imm < 1 || (unsigned)imm > et.size,
15533               _("immediate out of range for shift"));
15534   neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
15535                   et.size - imm);
15536 }
15537
15538 static void
15539 do_neon_movl (void)
15540 {
15541   struct neon_type_el et = neon_check_type (2, NS_QD,
15542     N_EQK | N_DBL, N_SU_32 | N_KEY);
15543   unsigned sizebits = et.size >> 3;
15544   inst.instruction |= sizebits << 19;
15545   neon_two_same (0, et.type == NT_unsigned, -1);
15546 }
15547
15548 static void
15549 do_neon_trn (void)
15550 {
15551   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15552   struct neon_type_el et = neon_check_type (2, rs,
15553     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15554   NEON_ENCODE (INTEGER, inst);
15555   neon_two_same (neon_quad (rs), 1, et.size);
15556 }
15557
15558 static void
15559 do_neon_zip_uzp (void)
15560 {
15561   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15562   struct neon_type_el et = neon_check_type (2, rs,
15563     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15564   if (rs == NS_DD && et.size == 32)
15565     {
15566       /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
15567       inst.instruction = N_MNEM_vtrn;
15568       do_neon_trn ();
15569       return;
15570     }
15571   neon_two_same (neon_quad (rs), 1, et.size);
15572 }
15573
15574 static void
15575 do_neon_sat_abs_neg (void)
15576 {
15577   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15578   struct neon_type_el et = neon_check_type (2, rs,
15579     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15580   neon_two_same (neon_quad (rs), 1, et.size);
15581 }
15582
15583 static void
15584 do_neon_pair_long (void)
15585 {
15586   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15587   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
15588   /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
15589   inst.instruction |= (et.type == NT_unsigned) << 7;
15590   neon_two_same (neon_quad (rs), 1, et.size);
15591 }
15592
15593 static void
15594 do_neon_recip_est (void)
15595 {
15596   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15597   struct neon_type_el et = neon_check_type (2, rs,
15598     N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
15599   inst.instruction |= (et.type == NT_float) << 8;
15600   neon_two_same (neon_quad (rs), 1, et.size);
15601 }
15602
15603 static void
15604 do_neon_cls (void)
15605 {
15606   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15607   struct neon_type_el et = neon_check_type (2, rs,
15608     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15609   neon_two_same (neon_quad (rs), 1, et.size);
15610 }
15611
15612 static void
15613 do_neon_clz (void)
15614 {
15615   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15616   struct neon_type_el et = neon_check_type (2, rs,
15617     N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
15618   neon_two_same (neon_quad (rs), 1, et.size);
15619 }
15620
15621 static void
15622 do_neon_cnt (void)
15623 {
15624   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15625   struct neon_type_el et = neon_check_type (2, rs,
15626     N_EQK | N_INT, N_8 | N_KEY);
15627   neon_two_same (neon_quad (rs), 1, et.size);
15628 }
15629
15630 static void
15631 do_neon_swp (void)
15632 {
15633   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15634   neon_two_same (neon_quad (rs), 1, -1);
15635 }
15636
15637 static void
15638 do_neon_tbl_tbx (void)
15639 {
15640   unsigned listlenbits;
15641   neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
15642
15643   if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
15644     {
15645       first_error (_("bad list length for table lookup"));
15646       return;
15647     }
15648
15649   listlenbits = inst.operands[1].imm - 1;
15650   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15651   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15652   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15653   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15654   inst.instruction |= LOW4 (inst.operands[2].reg);
15655   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15656   inst.instruction |= listlenbits << 8;
15657
15658   neon_dp_fixup (&inst);
15659 }
15660
15661 static void
15662 do_neon_ldm_stm (void)
15663 {
15664   /* P, U and L bits are part of bitmask.  */
15665   int is_dbmode = (inst.instruction & (1 << 24)) != 0;
15666   unsigned offsetbits = inst.operands[1].imm * 2;
15667
15668   if (inst.operands[1].issingle)
15669     {
15670       do_vfp_nsyn_ldm_stm (is_dbmode);
15671       return;
15672     }
15673
15674   constraint (is_dbmode && !inst.operands[0].writeback,
15675               _("writeback (!) must be used for VLDMDB and VSTMDB"));
15676
15677   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
15678               _("register list must contain at least 1 and at most 16 "
15679                 "registers"));
15680
15681   inst.instruction |= inst.operands[0].reg << 16;
15682   inst.instruction |= inst.operands[0].writeback << 21;
15683   inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15684   inst.instruction |= HI1 (inst.operands[1].reg) << 22;
15685
15686   inst.instruction |= offsetbits;
15687
15688   do_vfp_cond_or_thumb ();
15689 }
15690
15691 static void
15692 do_neon_ldr_str (void)
15693 {
15694   int is_ldr = (inst.instruction & (1 << 20)) != 0;
15695
15696   /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
15697      And is UNPREDICTABLE in thumb mode.  */
15698   if (!is_ldr
15699       && inst.operands[1].reg == REG_PC
15700       && (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7) || thumb_mode))
15701     {
15702       if (thumb_mode)
15703         inst.error = _("Use of PC here is UNPREDICTABLE");
15704       else if (warn_on_deprecated)
15705         as_warn (_("Use of PC here is deprecated"));
15706     }
15707
15708   if (inst.operands[0].issingle)
15709     {
15710       if (is_ldr)
15711         do_vfp_nsyn_opcode ("flds");
15712       else
15713         do_vfp_nsyn_opcode ("fsts");
15714     }
15715   else
15716     {
15717       if (is_ldr)
15718         do_vfp_nsyn_opcode ("fldd");
15719       else
15720         do_vfp_nsyn_opcode ("fstd");
15721     }
15722 }
15723
15724 /* "interleave" version also handles non-interleaving register VLD1/VST1
15725    instructions.  */
15726
15727 static void
15728 do_neon_ld_st_interleave (void)
15729 {
15730   struct neon_type_el et = neon_check_type (1, NS_NULL,
15731                                             N_8 | N_16 | N_32 | N_64);
15732   unsigned alignbits = 0;
15733   unsigned idx;
15734   /* The bits in this table go:
15735      0: register stride of one (0) or two (1)
15736      1,2: register list length, minus one (1, 2, 3, 4).
15737      3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
15738      We use -1 for invalid entries.  */
15739   const int typetable[] =
15740     {
15741       0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
15742        -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
15743        -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
15744        -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
15745     };
15746   int typebits;
15747
15748   if (et.type == NT_invtype)
15749     return;
15750
15751   if (inst.operands[1].immisalign)
15752     switch (inst.operands[1].imm >> 8)
15753       {
15754       case 64: alignbits = 1; break;
15755       case 128:
15756         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
15757             && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15758           goto bad_alignment;
15759         alignbits = 2;
15760         break;
15761       case 256:
15762         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15763           goto bad_alignment;
15764         alignbits = 3;
15765         break;
15766       default:
15767       bad_alignment:
15768         first_error (_("bad alignment"));
15769         return;
15770       }
15771
15772   inst.instruction |= alignbits << 4;
15773   inst.instruction |= neon_logbits (et.size) << 6;
15774
15775   /* Bits [4:6] of the immediate in a list specifier encode register stride
15776      (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
15777      VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
15778      up the right value for "type" in a table based on this value and the given
15779      list style, then stick it back.  */
15780   idx = ((inst.operands[0].imm >> 4) & 7)
15781         | (((inst.instruction >> 8) & 3) << 3);
15782
15783   typebits = typetable[idx];
15784
15785   constraint (typebits == -1, _("bad list type for instruction"));
15786   constraint (((inst.instruction >> 8) & 3) && et.size == 64,
15787               _("bad element type for instruction"));
15788
15789   inst.instruction &= ~0xf00;
15790   inst.instruction |= typebits << 8;
15791 }
15792
15793 /* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
15794    *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
15795    otherwise. The variable arguments are a list of pairs of legal (size, align)
15796    values, terminated with -1.  */
15797
15798 static int
15799 neon_alignment_bit (int size, int align, int *do_align, ...)
15800 {
15801   va_list ap;
15802   int result = FAIL, thissize, thisalign;
15803
15804   if (!inst.operands[1].immisalign)
15805     {
15806       *do_align = 0;
15807       return SUCCESS;
15808     }
15809
15810   va_start (ap, do_align);
15811
15812   do
15813     {
15814       thissize = va_arg (ap, int);
15815       if (thissize == -1)
15816         break;
15817       thisalign = va_arg (ap, int);
15818
15819       if (size == thissize && align == thisalign)
15820         result = SUCCESS;
15821     }
15822   while (result != SUCCESS);
15823
15824   va_end (ap);
15825
15826   if (result == SUCCESS)
15827     *do_align = 1;
15828   else
15829     first_error (_("unsupported alignment for instruction"));
15830
15831   return result;
15832 }
15833
15834 static void
15835 do_neon_ld_st_lane (void)
15836 {
15837   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15838   int align_good, do_align = 0;
15839   int logsize = neon_logbits (et.size);
15840   int align = inst.operands[1].imm >> 8;
15841   int n = (inst.instruction >> 8) & 3;
15842   int max_el = 64 / et.size;
15843
15844   if (et.type == NT_invtype)
15845     return;
15846
15847   constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
15848               _("bad list length"));
15849   constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
15850               _("scalar index out of range"));
15851   constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
15852               && et.size == 8,
15853               _("stride of 2 unavailable when element size is 8"));
15854
15855   switch (n)
15856     {
15857     case 0:  /* VLD1 / VST1.  */
15858       align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
15859                                        32, 32, -1);
15860       if (align_good == FAIL)
15861         return;
15862       if (do_align)
15863         {
15864           unsigned alignbits = 0;
15865           switch (et.size)
15866             {
15867             case 16: alignbits = 0x1; break;
15868             case 32: alignbits = 0x3; break;
15869             default: ;
15870             }
15871           inst.instruction |= alignbits << 4;
15872         }
15873       break;
15874
15875     case 1:  /* VLD2 / VST2.  */
15876       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
15877                                        32, 64, -1);
15878       if (align_good == FAIL)
15879         return;
15880       if (do_align)
15881         inst.instruction |= 1 << 4;
15882       break;
15883
15884     case 2:  /* VLD3 / VST3.  */
15885       constraint (inst.operands[1].immisalign,
15886                   _("can't use alignment with this instruction"));
15887       break;
15888
15889     case 3:  /* VLD4 / VST4.  */
15890       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15891                                        16, 64, 32, 64, 32, 128, -1);
15892       if (align_good == FAIL)
15893         return;
15894       if (do_align)
15895         {
15896           unsigned alignbits = 0;
15897           switch (et.size)
15898             {
15899             case 8:  alignbits = 0x1; break;
15900             case 16: alignbits = 0x1; break;
15901             case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
15902             default: ;
15903             }
15904           inst.instruction |= alignbits << 4;
15905         }
15906       break;
15907
15908     default: ;
15909     }
15910
15911   /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
15912   if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15913     inst.instruction |= 1 << (4 + logsize);
15914
15915   inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
15916   inst.instruction |= logsize << 10;
15917 }
15918
15919 /* Encode single n-element structure to all lanes VLD<n> instructions.  */
15920
15921 static void
15922 do_neon_ld_dup (void)
15923 {
15924   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15925   int align_good, do_align = 0;
15926
15927   if (et.type == NT_invtype)
15928     return;
15929
15930   switch ((inst.instruction >> 8) & 3)
15931     {
15932     case 0:  /* VLD1.  */
15933       gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
15934       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15935                                        &do_align, 16, 16, 32, 32, -1);
15936       if (align_good == FAIL)
15937         return;
15938       switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
15939         {
15940         case 1: break;
15941         case 2: inst.instruction |= 1 << 5; break;
15942         default: first_error (_("bad list length")); return;
15943         }
15944       inst.instruction |= neon_logbits (et.size) << 6;
15945       break;
15946
15947     case 1:  /* VLD2.  */
15948       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15949                                        &do_align, 8, 16, 16, 32, 32, 64, -1);
15950       if (align_good == FAIL)
15951         return;
15952       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
15953                   _("bad list length"));
15954       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15955         inst.instruction |= 1 << 5;
15956       inst.instruction |= neon_logbits (et.size) << 6;
15957       break;
15958
15959     case 2:  /* VLD3.  */
15960       constraint (inst.operands[1].immisalign,
15961                   _("can't use alignment with this instruction"));
15962       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
15963                   _("bad list length"));
15964       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15965         inst.instruction |= 1 << 5;
15966       inst.instruction |= neon_logbits (et.size) << 6;
15967       break;
15968
15969     case 3:  /* VLD4.  */
15970       {
15971         int align = inst.operands[1].imm >> 8;
15972         align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15973                                          16, 64, 32, 64, 32, 128, -1);
15974         if (align_good == FAIL)
15975           return;
15976         constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
15977                     _("bad list length"));
15978         if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15979           inst.instruction |= 1 << 5;
15980         if (et.size == 32 && align == 128)
15981           inst.instruction |= 0x3 << 6;
15982         else
15983           inst.instruction |= neon_logbits (et.size) << 6;
15984       }
15985       break;
15986
15987     default: ;
15988     }
15989
15990   inst.instruction |= do_align << 4;
15991 }
15992
15993 /* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
15994    apart from bits [11:4].  */
15995
15996 static void
15997 do_neon_ldx_stx (void)
15998 {
15999   if (inst.operands[1].isreg)
16000     constraint (inst.operands[1].reg == REG_PC, BAD_PC);
16001
16002   switch (NEON_LANE (inst.operands[0].imm))
16003     {
16004     case NEON_INTERLEAVE_LANES:
16005       NEON_ENCODE (INTERLV, inst);
16006       do_neon_ld_st_interleave ();
16007       break;
16008
16009     case NEON_ALL_LANES:
16010       NEON_ENCODE (DUP, inst);
16011       if (inst.instruction == N_INV)
16012         {
16013           first_error ("only loads support such operands");
16014           break;
16015         }
16016       do_neon_ld_dup ();
16017       break;
16018
16019     default:
16020       NEON_ENCODE (LANE, inst);
16021       do_neon_ld_st_lane ();
16022     }
16023
16024   /* L bit comes from bit mask.  */
16025   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16026   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16027   inst.instruction |= inst.operands[1].reg << 16;
16028
16029   if (inst.operands[1].postind)
16030     {
16031       int postreg = inst.operands[1].imm & 0xf;
16032       constraint (!inst.operands[1].immisreg,
16033                   _("post-index must be a register"));
16034       constraint (postreg == 0xd || postreg == 0xf,
16035                   _("bad register for post-index"));
16036       inst.instruction |= postreg;
16037     }
16038   else
16039     {
16040       constraint (inst.operands[1].immisreg, BAD_ADDR_MODE);
16041       constraint (inst.reloc.exp.X_op != O_constant
16042                   || inst.reloc.exp.X_add_number != 0,
16043                   BAD_ADDR_MODE);
16044
16045       if (inst.operands[1].writeback)
16046         {
16047           inst.instruction |= 0xd;
16048         }
16049       else
16050         inst.instruction |= 0xf;
16051     }
16052
16053   if (thumb_mode)
16054     inst.instruction |= 0xf9000000;
16055   else
16056     inst.instruction |= 0xf4000000;
16057 }
16058
16059 /* FP v8.  */
16060 static void
16061 do_vfp_nsyn_fpv8 (enum neon_shape rs)
16062 {
16063   NEON_ENCODE (FPV8, inst);
16064
16065   if (rs == NS_FFF)
16066     do_vfp_sp_dyadic ();
16067   else
16068     do_vfp_dp_rd_rn_rm ();
16069
16070   if (rs == NS_DDD)
16071     inst.instruction |= 0x100;
16072
16073   inst.instruction |= 0xf0000000;
16074 }
16075
16076 static void
16077 do_vsel (void)
16078 {
16079   set_it_insn_type (OUTSIDE_IT_INSN);
16080
16081   if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) != SUCCESS)
16082     first_error (_("invalid instruction shape"));
16083 }
16084
16085 static void
16086 do_vmaxnm (void)
16087 {
16088   set_it_insn_type (OUTSIDE_IT_INSN);
16089
16090   if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) == SUCCESS)
16091     return;
16092
16093   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
16094     return;
16095
16096   neon_dyadic_misc (NT_untyped, N_F32, 0);
16097 }
16098
16099 static void
16100 do_vrint_1 (enum neon_cvt_mode mode)
16101 {
16102   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_QQ, NS_NULL);
16103   struct neon_type_el et;
16104
16105   if (rs == NS_NULL)
16106     return;
16107
16108   et = neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
16109   if (et.type != NT_invtype)
16110     {
16111       /* VFP encodings.  */
16112       if (mode == neon_cvt_mode_a || mode == neon_cvt_mode_n
16113           || mode == neon_cvt_mode_p || mode == neon_cvt_mode_m)
16114         set_it_insn_type (OUTSIDE_IT_INSN);
16115
16116       NEON_ENCODE (FPV8, inst);
16117       if (rs == NS_FF)
16118         do_vfp_sp_monadic ();
16119       else
16120         do_vfp_dp_rd_rm ();
16121
16122       switch (mode)
16123         {
16124         case neon_cvt_mode_r: inst.instruction |= 0x00000000; break;
16125         case neon_cvt_mode_z: inst.instruction |= 0x00000080; break;
16126         case neon_cvt_mode_x: inst.instruction |= 0x00010000; break;
16127         case neon_cvt_mode_a: inst.instruction |= 0xf0000000; break;
16128         case neon_cvt_mode_n: inst.instruction |= 0xf0010000; break;
16129         case neon_cvt_mode_p: inst.instruction |= 0xf0020000; break;
16130         case neon_cvt_mode_m: inst.instruction |= 0xf0030000; break;
16131         default: abort ();
16132         }
16133
16134       inst.instruction |= (rs == NS_DD) << 8;
16135       do_vfp_cond_or_thumb ();
16136     }
16137   else
16138     {
16139       /* Neon encodings (or something broken...).  */
16140       inst.error = NULL;
16141       et = neon_check_type (2, rs, N_EQK, N_F32 | N_KEY);
16142
16143       if (et.type == NT_invtype)
16144         return;
16145
16146       set_it_insn_type (OUTSIDE_IT_INSN);
16147       NEON_ENCODE (FLOAT, inst);
16148
16149       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
16150         return;
16151
16152       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16153       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16154       inst.instruction |= LOW4 (inst.operands[1].reg);
16155       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16156       inst.instruction |= neon_quad (rs) << 6;
16157       switch (mode)
16158         {
16159         case neon_cvt_mode_z: inst.instruction |= 3 << 7; break;
16160         case neon_cvt_mode_x: inst.instruction |= 1 << 7; break;
16161         case neon_cvt_mode_a: inst.instruction |= 2 << 7; break;
16162         case neon_cvt_mode_n: inst.instruction |= 0 << 7; break;
16163         case neon_cvt_mode_p: inst.instruction |= 7 << 7; break;
16164         case neon_cvt_mode_m: inst.instruction |= 5 << 7; break;
16165         case neon_cvt_mode_r: inst.error = _("invalid rounding mode"); break;
16166         default: abort ();
16167         }
16168
16169       if (thumb_mode)
16170         inst.instruction |= 0xfc000000;
16171       else
16172         inst.instruction |= 0xf0000000;
16173     }
16174 }
16175
16176 static void
16177 do_vrintx (void)
16178 {
16179   do_vrint_1 (neon_cvt_mode_x);
16180 }
16181
16182 static void
16183 do_vrintz (void)
16184 {
16185   do_vrint_1 (neon_cvt_mode_z);
16186 }
16187
16188 static void
16189 do_vrintr (void)
16190 {
16191   do_vrint_1 (neon_cvt_mode_r);
16192 }
16193
16194 static void
16195 do_vrinta (void)
16196 {
16197   do_vrint_1 (neon_cvt_mode_a);
16198 }
16199
16200 static void
16201 do_vrintn (void)
16202 {
16203   do_vrint_1 (neon_cvt_mode_n);
16204 }
16205
16206 static void
16207 do_vrintp (void)
16208 {
16209   do_vrint_1 (neon_cvt_mode_p);
16210 }
16211
16212 static void
16213 do_vrintm (void)
16214 {
16215   do_vrint_1 (neon_cvt_mode_m);
16216 }
16217
16218 /* Crypto v1 instructions.  */
16219 static void
16220 do_crypto_2op_1 (unsigned elttype, int op)
16221 {
16222   set_it_insn_type (OUTSIDE_IT_INSN);
16223
16224   if (neon_check_type (2, NS_QQ, N_EQK | N_UNT, elttype | N_UNT | N_KEY).type
16225       == NT_invtype)
16226     return;
16227
16228   inst.error = NULL;
16229
16230   NEON_ENCODE (INTEGER, inst);
16231   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16232   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16233   inst.instruction |= LOW4 (inst.operands[1].reg);
16234   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16235   if (op != -1)
16236     inst.instruction |= op << 6;
16237
16238   if (thumb_mode)
16239     inst.instruction |= 0xfc000000;
16240   else
16241     inst.instruction |= 0xf0000000;
16242 }
16243
16244 static void
16245 do_crypto_3op_1 (int u, int op)
16246 {
16247   set_it_insn_type (OUTSIDE_IT_INSN);
16248
16249   if (neon_check_type (3, NS_QQQ, N_EQK | N_UNT, N_EQK | N_UNT,
16250                        N_32 | N_UNT | N_KEY).type == NT_invtype)
16251     return;
16252
16253   inst.error = NULL;
16254
16255   NEON_ENCODE (INTEGER, inst);
16256   neon_three_same (1, u, 8 << op);
16257 }
16258
16259 static void
16260 do_aese (void)
16261 {
16262   do_crypto_2op_1 (N_8, 0);
16263 }
16264
16265 static void
16266 do_aesd (void)
16267 {
16268   do_crypto_2op_1 (N_8, 1);
16269 }
16270
16271 static void
16272 do_aesmc (void)
16273 {
16274   do_crypto_2op_1 (N_8, 2);
16275 }
16276
16277 static void
16278 do_aesimc (void)
16279 {
16280   do_crypto_2op_1 (N_8, 3);
16281 }
16282
16283 static void
16284 do_sha1c (void)
16285 {
16286   do_crypto_3op_1 (0, 0);
16287 }
16288
16289 static void
16290 do_sha1p (void)
16291 {
16292   do_crypto_3op_1 (0, 1);
16293 }
16294
16295 static void
16296 do_sha1m (void)
16297 {
16298   do_crypto_3op_1 (0, 2);
16299 }
16300
16301 static void
16302 do_sha1su0 (void)
16303 {
16304   do_crypto_3op_1 (0, 3);
16305 }
16306
16307 static void
16308 do_sha256h (void)
16309 {
16310   do_crypto_3op_1 (1, 0);
16311 }
16312
16313 static void
16314 do_sha256h2 (void)
16315 {
16316   do_crypto_3op_1 (1, 1);
16317 }
16318
16319 static void
16320 do_sha256su1 (void)
16321 {
16322   do_crypto_3op_1 (1, 2);
16323 }
16324
16325 static void
16326 do_sha1h (void)
16327 {
16328   do_crypto_2op_1 (N_32, -1);
16329 }
16330
16331 static void
16332 do_sha1su1 (void)
16333 {
16334   do_crypto_2op_1 (N_32, 0);
16335 }
16336
16337 static void
16338 do_sha256su0 (void)
16339 {
16340   do_crypto_2op_1 (N_32, 1);
16341 }
16342
16343 static void
16344 do_crc32_1 (unsigned int poly, unsigned int sz)
16345 {
16346   unsigned int Rd = inst.operands[0].reg;
16347   unsigned int Rn = inst.operands[1].reg;
16348   unsigned int Rm = inst.operands[2].reg;
16349
16350   set_it_insn_type (OUTSIDE_IT_INSN);
16351   inst.instruction |= LOW4 (Rd) << (thumb_mode ? 8 : 12);
16352   inst.instruction |= LOW4 (Rn) << 16;
16353   inst.instruction |= LOW4 (Rm);
16354   inst.instruction |= sz << (thumb_mode ? 4 : 21);
16355   inst.instruction |= poly << (thumb_mode ? 20 : 9);
16356
16357   if (Rd == REG_PC || Rn == REG_PC || Rm == REG_PC)
16358     as_warn (UNPRED_REG ("r15"));
16359   if (thumb_mode && (Rd == REG_SP || Rn == REG_SP || Rm == REG_SP))
16360     as_warn (UNPRED_REG ("r13"));
16361 }
16362
16363 static void
16364 do_crc32b (void)
16365 {
16366   do_crc32_1 (0, 0);
16367 }
16368
16369 static void
16370 do_crc32h (void)
16371 {
16372   do_crc32_1 (0, 1);
16373 }
16374
16375 static void
16376 do_crc32w (void)
16377 {
16378   do_crc32_1 (0, 2);
16379 }
16380
16381 static void
16382 do_crc32cb (void)
16383 {
16384   do_crc32_1 (1, 0);
16385 }
16386
16387 static void
16388 do_crc32ch (void)
16389 {
16390   do_crc32_1 (1, 1);
16391 }
16392
16393 static void
16394 do_crc32cw (void)
16395 {
16396   do_crc32_1 (1, 2);
16397 }
16398
16399 \f
16400 /* Overall per-instruction processing.  */
16401
16402 /* We need to be able to fix up arbitrary expressions in some statements.
16403    This is so that we can handle symbols that are an arbitrary distance from
16404    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
16405    which returns part of an address in a form which will be valid for
16406    a data instruction.  We do this by pushing the expression into a symbol
16407    in the expr_section, and creating a fix for that.  */
16408
16409 static void
16410 fix_new_arm (fragS *       frag,
16411              int           where,
16412              short int     size,
16413              expressionS * exp,
16414              int           pc_rel,
16415              int           reloc)
16416 {
16417   fixS *           new_fix;
16418
16419   switch (exp->X_op)
16420     {
16421     case O_constant:
16422       if (pc_rel)
16423         {
16424           /* Create an absolute valued symbol, so we have something to
16425              refer to in the object file.  Unfortunately for us, gas's
16426              generic expression parsing will already have folded out
16427              any use of .set foo/.type foo %function that may have
16428              been used to set type information of the target location,
16429              that's being specified symbolically.  We have to presume
16430              the user knows what they are doing.  */
16431           char name[16 + 8];
16432           symbolS *symbol;
16433
16434           sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
16435
16436           symbol = symbol_find_or_make (name);
16437           S_SET_SEGMENT (symbol, absolute_section);
16438           symbol_set_frag (symbol, &zero_address_frag);
16439           S_SET_VALUE (symbol, exp->X_add_number);
16440           exp->X_op = O_symbol;
16441           exp->X_add_symbol = symbol;
16442           exp->X_add_number = 0;
16443         }
16444       /* FALLTHROUGH */
16445     case O_symbol:
16446     case O_add:
16447     case O_subtract:
16448       new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
16449                              (enum bfd_reloc_code_real) reloc);
16450       break;
16451
16452     default:
16453       new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
16454                                   pc_rel, (enum bfd_reloc_code_real) reloc);
16455       break;
16456     }
16457
16458   /* Mark whether the fix is to a THUMB instruction, or an ARM
16459      instruction.  */
16460   new_fix->tc_fix_data = thumb_mode;
16461 }
16462
16463 /* Create a frg for an instruction requiring relaxation.  */
16464 static void
16465 output_relax_insn (void)
16466 {
16467   char * to;
16468   symbolS *sym;
16469   int offset;
16470
16471   /* The size of the instruction is unknown, so tie the debug info to the
16472      start of the instruction.  */
16473   dwarf2_emit_insn (0);
16474
16475   switch (inst.reloc.exp.X_op)
16476     {
16477     case O_symbol:
16478       sym = inst.reloc.exp.X_add_symbol;
16479       offset = inst.reloc.exp.X_add_number;
16480       break;
16481     case O_constant:
16482       sym = NULL;
16483       offset = inst.reloc.exp.X_add_number;
16484       break;
16485     default:
16486       sym = make_expr_symbol (&inst.reloc.exp);
16487       offset = 0;
16488       break;
16489   }
16490   to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
16491                  inst.relax, sym, offset, NULL/*offset, opcode*/);
16492   md_number_to_chars (to, inst.instruction, THUMB_SIZE);
16493 }
16494
16495 /* Write a 32-bit thumb instruction to buf.  */
16496 static void
16497 put_thumb32_insn (char * buf, unsigned long insn)
16498 {
16499   md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
16500   md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
16501 }
16502
16503 static void
16504 output_inst (const char * str)
16505 {
16506   char * to = NULL;
16507
16508   if (inst.error)
16509     {
16510       as_bad ("%s -- `%s'", inst.error, str);
16511       return;
16512     }
16513   if (inst.relax)
16514     {
16515       output_relax_insn ();
16516       return;
16517     }
16518   if (inst.size == 0)
16519     return;
16520
16521   to = frag_more (inst.size);
16522   /* PR 9814: Record the thumb mode into the current frag so that we know
16523      what type of NOP padding to use, if necessary.  We override any previous
16524      setting so that if the mode has changed then the NOPS that we use will
16525      match the encoding of the last instruction in the frag.  */
16526   frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
16527
16528   if (thumb_mode && (inst.size > THUMB_SIZE))
16529     {
16530       gas_assert (inst.size == (2 * THUMB_SIZE));
16531       put_thumb32_insn (to, inst.instruction);
16532     }
16533   else if (inst.size > INSN_SIZE)
16534     {
16535       gas_assert (inst.size == (2 * INSN_SIZE));
16536       md_number_to_chars (to, inst.instruction, INSN_SIZE);
16537       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
16538     }
16539   else
16540     md_number_to_chars (to, inst.instruction, inst.size);
16541
16542   if (inst.reloc.type != BFD_RELOC_UNUSED)
16543     fix_new_arm (frag_now, to - frag_now->fr_literal,
16544                  inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
16545                  inst.reloc.type);
16546
16547   dwarf2_emit_insn (inst.size);
16548 }
16549
16550 static char *
16551 output_it_inst (int cond, int mask, char * to)
16552 {
16553   unsigned long instruction = 0xbf00;
16554
16555   mask &= 0xf;
16556   instruction |= mask;
16557   instruction |= cond << 4;
16558
16559   if (to == NULL)
16560     {
16561       to = frag_more (2);
16562 #ifdef OBJ_ELF
16563       dwarf2_emit_insn (2);
16564 #endif
16565     }
16566
16567   md_number_to_chars (to, instruction, 2);
16568
16569   return to;
16570 }
16571
16572 /* Tag values used in struct asm_opcode's tag field.  */
16573 enum opcode_tag
16574 {
16575   OT_unconditional,     /* Instruction cannot be conditionalized.
16576                            The ARM condition field is still 0xE.  */
16577   OT_unconditionalF,    /* Instruction cannot be conditionalized
16578                            and carries 0xF in its ARM condition field.  */
16579   OT_csuffix,           /* Instruction takes a conditional suffix.  */
16580   OT_csuffixF,          /* Some forms of the instruction take a conditional
16581                            suffix, others place 0xF where the condition field
16582                            would be.  */
16583   OT_cinfix3,           /* Instruction takes a conditional infix,
16584                            beginning at character index 3.  (In
16585                            unified mode, it becomes a suffix.)  */
16586   OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
16587                             tsts, cmps, cmns, and teqs. */
16588   OT_cinfix3_legacy,    /* Legacy instruction takes a conditional infix at
16589                            character index 3, even in unified mode.  Used for
16590                            legacy instructions where suffix and infix forms
16591                            may be ambiguous.  */
16592   OT_csuf_or_in3,       /* Instruction takes either a conditional
16593                            suffix or an infix at character index 3.  */
16594   OT_odd_infix_unc,     /* This is the unconditional variant of an
16595                            instruction that takes a conditional infix
16596                            at an unusual position.  In unified mode,
16597                            this variant will accept a suffix.  */
16598   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
16599                            are the conditional variants of instructions that
16600                            take conditional infixes in unusual positions.
16601                            The infix appears at character index
16602                            (tag - OT_odd_infix_0).  These are not accepted
16603                            in unified mode.  */
16604 };
16605
16606 /* Subroutine of md_assemble, responsible for looking up the primary
16607    opcode from the mnemonic the user wrote.  STR points to the
16608    beginning of the mnemonic.
16609
16610    This is not simply a hash table lookup, because of conditional
16611    variants.  Most instructions have conditional variants, which are
16612    expressed with a _conditional affix_ to the mnemonic.  If we were
16613    to encode each conditional variant as a literal string in the opcode
16614    table, it would have approximately 20,000 entries.
16615
16616    Most mnemonics take this affix as a suffix, and in unified syntax,
16617    'most' is upgraded to 'all'.  However, in the divided syntax, some
16618    instructions take the affix as an infix, notably the s-variants of
16619    the arithmetic instructions.  Of those instructions, all but six
16620    have the infix appear after the third character of the mnemonic.
16621
16622    Accordingly, the algorithm for looking up primary opcodes given
16623    an identifier is:
16624
16625    1. Look up the identifier in the opcode table.
16626       If we find a match, go to step U.
16627
16628    2. Look up the last two characters of the identifier in the
16629       conditions table.  If we find a match, look up the first N-2
16630       characters of the identifier in the opcode table.  If we
16631       find a match, go to step CE.
16632
16633    3. Look up the fourth and fifth characters of the identifier in
16634       the conditions table.  If we find a match, extract those
16635       characters from the identifier, and look up the remaining
16636       characters in the opcode table.  If we find a match, go
16637       to step CM.
16638
16639    4. Fail.
16640
16641    U. Examine the tag field of the opcode structure, in case this is
16642       one of the six instructions with its conditional infix in an
16643       unusual place.  If it is, the tag tells us where to find the
16644       infix; look it up in the conditions table and set inst.cond
16645       accordingly.  Otherwise, this is an unconditional instruction.
16646       Again set inst.cond accordingly.  Return the opcode structure.
16647
16648   CE. Examine the tag field to make sure this is an instruction that
16649       should receive a conditional suffix.  If it is not, fail.
16650       Otherwise, set inst.cond from the suffix we already looked up,
16651       and return the opcode structure.
16652
16653   CM. Examine the tag field to make sure this is an instruction that
16654       should receive a conditional infix after the third character.
16655       If it is not, fail.  Otherwise, undo the edits to the current
16656       line of input and proceed as for case CE.  */
16657
16658 static const struct asm_opcode *
16659 opcode_lookup (char **str)
16660 {
16661   char *end, *base;
16662   char *affix;
16663   const struct asm_opcode *opcode;
16664   const struct asm_cond *cond;
16665   char save[2];
16666
16667   /* Scan up to the end of the mnemonic, which must end in white space,
16668      '.' (in unified mode, or for Neon/VFP instructions), or end of string.  */
16669   for (base = end = *str; *end != '\0'; end++)
16670     if (*end == ' ' || *end == '.')
16671       break;
16672
16673   if (end == base)
16674     return NULL;
16675
16676   /* Handle a possible width suffix and/or Neon type suffix.  */
16677   if (end[0] == '.')
16678     {
16679       int offset = 2;
16680
16681       /* The .w and .n suffixes are only valid if the unified syntax is in
16682          use.  */
16683       if (unified_syntax && end[1] == 'w')
16684         inst.size_req = 4;
16685       else if (unified_syntax && end[1] == 'n')
16686         inst.size_req = 2;
16687       else
16688         offset = 0;
16689
16690       inst.vectype.elems = 0;
16691
16692       *str = end + offset;
16693
16694       if (end[offset] == '.')
16695         {
16696           /* See if we have a Neon type suffix (possible in either unified or
16697              non-unified ARM syntax mode).  */
16698           if (parse_neon_type (&inst.vectype, str) == FAIL)
16699             return NULL;
16700         }
16701       else if (end[offset] != '\0' && end[offset] != ' ')
16702         return NULL;
16703     }
16704   else
16705     *str = end;
16706
16707   /* Look for unaffixed or special-case affixed mnemonic.  */
16708   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16709                                                     end - base);
16710   if (opcode)
16711     {
16712       /* step U */
16713       if (opcode->tag < OT_odd_infix_0)
16714         {
16715           inst.cond = COND_ALWAYS;
16716           return opcode;
16717         }
16718
16719       if (warn_on_deprecated && unified_syntax)
16720         as_warn (_("conditional infixes are deprecated in unified syntax"));
16721       affix = base + (opcode->tag - OT_odd_infix_0);
16722       cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16723       gas_assert (cond);
16724
16725       inst.cond = cond->value;
16726       return opcode;
16727     }
16728
16729   /* Cannot have a conditional suffix on a mnemonic of less than two
16730      characters.  */
16731   if (end - base < 3)
16732     return NULL;
16733
16734   /* Look for suffixed mnemonic.  */
16735   affix = end - 2;
16736   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16737   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16738                                                     affix - base);
16739   if (opcode && cond)
16740     {
16741       /* step CE */
16742       switch (opcode->tag)
16743         {
16744         case OT_cinfix3_legacy:
16745           /* Ignore conditional suffixes matched on infix only mnemonics.  */
16746           break;
16747
16748         case OT_cinfix3:
16749         case OT_cinfix3_deprecated:
16750         case OT_odd_infix_unc:
16751           if (!unified_syntax)
16752             return 0;
16753           /* else fall through */
16754
16755         case OT_csuffix:
16756         case OT_csuffixF:
16757         case OT_csuf_or_in3:
16758           inst.cond = cond->value;
16759           return opcode;
16760
16761         case OT_unconditional:
16762         case OT_unconditionalF:
16763           if (thumb_mode)
16764             inst.cond = cond->value;
16765           else
16766             {
16767               /* Delayed diagnostic.  */
16768               inst.error = BAD_COND;
16769               inst.cond = COND_ALWAYS;
16770             }
16771           return opcode;
16772
16773         default:
16774           return NULL;
16775         }
16776     }
16777
16778   /* Cannot have a usual-position infix on a mnemonic of less than
16779      six characters (five would be a suffix).  */
16780   if (end - base < 6)
16781     return NULL;
16782
16783   /* Look for infixed mnemonic in the usual position.  */
16784   affix = base + 3;
16785   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16786   if (!cond)
16787     return NULL;
16788
16789   memcpy (save, affix, 2);
16790   memmove (affix, affix + 2, (end - affix) - 2);
16791   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16792                                                     (end - base) - 2);
16793   memmove (affix + 2, affix, (end - affix) - 2);
16794   memcpy (affix, save, 2);
16795
16796   if (opcode
16797       && (opcode->tag == OT_cinfix3
16798           || opcode->tag == OT_cinfix3_deprecated
16799           || opcode->tag == OT_csuf_or_in3
16800           || opcode->tag == OT_cinfix3_legacy))
16801     {
16802       /* Step CM.  */
16803       if (warn_on_deprecated && unified_syntax
16804           && (opcode->tag == OT_cinfix3
16805               || opcode->tag == OT_cinfix3_deprecated))
16806         as_warn (_("conditional infixes are deprecated in unified syntax"));
16807
16808       inst.cond = cond->value;
16809       return opcode;
16810     }
16811
16812   return NULL;
16813 }
16814
16815 /* This function generates an initial IT instruction, leaving its block
16816    virtually open for the new instructions. Eventually,
16817    the mask will be updated by now_it_add_mask () each time
16818    a new instruction needs to be included in the IT block.
16819    Finally, the block is closed with close_automatic_it_block ().
16820    The block closure can be requested either from md_assemble (),
16821    a tencode (), or due to a label hook.  */
16822
16823 static void
16824 new_automatic_it_block (int cond)
16825 {
16826   now_it.state = AUTOMATIC_IT_BLOCK;
16827   now_it.mask = 0x18;
16828   now_it.cc = cond;
16829   now_it.block_length = 1;
16830   mapping_state (MAP_THUMB);
16831   now_it.insn = output_it_inst (cond, now_it.mask, NULL);
16832   now_it.warn_deprecated = FALSE;
16833   now_it.insn_cond = TRUE;
16834 }
16835
16836 /* Close an automatic IT block.
16837    See comments in new_automatic_it_block ().  */
16838
16839 static void
16840 close_automatic_it_block (void)
16841 {
16842   now_it.mask = 0x10;
16843   now_it.block_length = 0;
16844 }
16845
16846 /* Update the mask of the current automatically-generated IT
16847    instruction. See comments in new_automatic_it_block ().  */
16848
16849 static void
16850 now_it_add_mask (int cond)
16851 {
16852 #define CLEAR_BIT(value, nbit)  ((value) & ~(1 << (nbit)))
16853 #define SET_BIT_VALUE(value, bitvalue, nbit)  (CLEAR_BIT (value, nbit) \
16854                                               | ((bitvalue) << (nbit)))
16855   const int resulting_bit = (cond & 1);
16856
16857   now_it.mask &= 0xf;
16858   now_it.mask = SET_BIT_VALUE (now_it.mask,
16859                                    resulting_bit,
16860                                   (5 - now_it.block_length));
16861   now_it.mask = SET_BIT_VALUE (now_it.mask,
16862                                    1,
16863                                    ((5 - now_it.block_length) - 1) );
16864   output_it_inst (now_it.cc, now_it.mask, now_it.insn);
16865
16866 #undef CLEAR_BIT
16867 #undef SET_BIT_VALUE
16868 }
16869
16870 /* The IT blocks handling machinery is accessed through the these functions:
16871      it_fsm_pre_encode ()               from md_assemble ()
16872      set_it_insn_type ()                optional, from the tencode functions
16873      set_it_insn_type_last ()           ditto
16874      in_it_block ()                     ditto
16875      it_fsm_post_encode ()              from md_assemble ()
16876      force_automatic_it_block_close ()  from label habdling functions
16877
16878    Rationale:
16879      1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
16880         initializing the IT insn type with a generic initial value depending
16881         on the inst.condition.
16882      2) During the tencode function, two things may happen:
16883         a) The tencode function overrides the IT insn type by
16884            calling either set_it_insn_type (type) or set_it_insn_type_last ().
16885         b) The tencode function queries the IT block state by
16886            calling in_it_block () (i.e. to determine narrow/not narrow mode).
16887
16888         Both set_it_insn_type and in_it_block run the internal FSM state
16889         handling function (handle_it_state), because: a) setting the IT insn
16890         type may incur in an invalid state (exiting the function),
16891         and b) querying the state requires the FSM to be updated.
16892         Specifically we want to avoid creating an IT block for conditional
16893         branches, so it_fsm_pre_encode is actually a guess and we can't
16894         determine whether an IT block is required until the tencode () routine
16895         has decided what type of instruction this actually it.
16896         Because of this, if set_it_insn_type and in_it_block have to be used,
16897         set_it_insn_type has to be called first.
16898
16899         set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
16900         determines the insn IT type depending on the inst.cond code.
16901         When a tencode () routine encodes an instruction that can be
16902         either outside an IT block, or, in the case of being inside, has to be
16903         the last one, set_it_insn_type_last () will determine the proper
16904         IT instruction type based on the inst.cond code. Otherwise,
16905         set_it_insn_type can be called for overriding that logic or
16906         for covering other cases.
16907
16908         Calling handle_it_state () may not transition the IT block state to
16909         OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
16910         still queried. Instead, if the FSM determines that the state should
16911         be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
16912         after the tencode () function: that's what it_fsm_post_encode () does.
16913
16914         Since in_it_block () calls the state handling function to get an
16915         updated state, an error may occur (due to invalid insns combination).
16916         In that case, inst.error is set.
16917         Therefore, inst.error has to be checked after the execution of
16918         the tencode () routine.
16919
16920      3) Back in md_assemble(), it_fsm_post_encode () is called to commit
16921         any pending state change (if any) that didn't take place in
16922         handle_it_state () as explained above.  */
16923
16924 static void
16925 it_fsm_pre_encode (void)
16926 {
16927   if (inst.cond != COND_ALWAYS)
16928     inst.it_insn_type = INSIDE_IT_INSN;
16929   else
16930     inst.it_insn_type = OUTSIDE_IT_INSN;
16931
16932   now_it.state_handled = 0;
16933 }
16934
16935 /* IT state FSM handling function.  */
16936
16937 static int
16938 handle_it_state (void)
16939 {
16940   now_it.state_handled = 1;
16941   now_it.insn_cond = FALSE;
16942
16943   switch (now_it.state)
16944     {
16945     case OUTSIDE_IT_BLOCK:
16946       switch (inst.it_insn_type)
16947         {
16948         case OUTSIDE_IT_INSN:
16949           break;
16950
16951         case INSIDE_IT_INSN:
16952         case INSIDE_IT_LAST_INSN:
16953           if (thumb_mode == 0)
16954             {
16955               if (unified_syntax
16956                   && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
16957                 as_tsktsk (_("Warning: conditional outside an IT block"\
16958                              " for Thumb."));
16959             }
16960           else
16961             {
16962               if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
16963                   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
16964                 {
16965                   /* Automatically generate the IT instruction.  */
16966                   new_automatic_it_block (inst.cond);
16967                   if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
16968                     close_automatic_it_block ();
16969                 }
16970               else
16971                 {
16972                   inst.error = BAD_OUT_IT;
16973                   return FAIL;
16974                 }
16975             }
16976           break;
16977
16978         case IF_INSIDE_IT_LAST_INSN:
16979         case NEUTRAL_IT_INSN:
16980           break;
16981
16982         case IT_INSN:
16983           now_it.state = MANUAL_IT_BLOCK;
16984           now_it.block_length = 0;
16985           break;
16986         }
16987       break;
16988
16989     case AUTOMATIC_IT_BLOCK:
16990       /* Three things may happen now:
16991          a) We should increment current it block size;
16992          b) We should close current it block (closing insn or 4 insns);
16993          c) We should close current it block and start a new one (due
16994          to incompatible conditions or
16995          4 insns-length block reached).  */
16996
16997       switch (inst.it_insn_type)
16998         {
16999         case OUTSIDE_IT_INSN:
17000           /* The closure of the block shall happen immediatelly,
17001              so any in_it_block () call reports the block as closed.  */
17002           force_automatic_it_block_close ();
17003           break;
17004
17005         case INSIDE_IT_INSN:
17006         case INSIDE_IT_LAST_INSN:
17007         case IF_INSIDE_IT_LAST_INSN:
17008           now_it.block_length++;
17009
17010           if (now_it.block_length > 4
17011               || !now_it_compatible (inst.cond))
17012             {
17013               force_automatic_it_block_close ();
17014               if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
17015                 new_automatic_it_block (inst.cond);
17016             }
17017           else
17018             {
17019               now_it.insn_cond = TRUE;
17020               now_it_add_mask (inst.cond);
17021             }
17022
17023           if (now_it.state == AUTOMATIC_IT_BLOCK
17024               && (inst.it_insn_type == INSIDE_IT_LAST_INSN
17025                   || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
17026             close_automatic_it_block ();
17027           break;
17028
17029         case NEUTRAL_IT_INSN:
17030           now_it.block_length++;
17031           now_it.insn_cond = TRUE;
17032
17033           if (now_it.block_length > 4)
17034             force_automatic_it_block_close ();
17035           else
17036             now_it_add_mask (now_it.cc & 1);
17037           break;
17038
17039         case IT_INSN:
17040           close_automatic_it_block ();
17041           now_it.state = MANUAL_IT_BLOCK;
17042           break;
17043         }
17044       break;
17045
17046     case MANUAL_IT_BLOCK:
17047       {
17048         /* Check conditional suffixes.  */
17049         const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
17050         int is_last;
17051         now_it.mask <<= 1;
17052         now_it.mask &= 0x1f;
17053         is_last = (now_it.mask == 0x10);
17054         now_it.insn_cond = TRUE;
17055
17056         switch (inst.it_insn_type)
17057           {
17058           case OUTSIDE_IT_INSN:
17059             inst.error = BAD_NOT_IT;
17060             return FAIL;
17061
17062           case INSIDE_IT_INSN:
17063             if (cond != inst.cond)
17064               {
17065                 inst.error = BAD_IT_COND;
17066                 return FAIL;
17067               }
17068             break;
17069
17070           case INSIDE_IT_LAST_INSN:
17071           case IF_INSIDE_IT_LAST_INSN:
17072             if (cond != inst.cond)
17073               {
17074                 inst.error = BAD_IT_COND;
17075                 return FAIL;
17076               }
17077             if (!is_last)
17078               {
17079                 inst.error = BAD_BRANCH;
17080                 return FAIL;
17081               }
17082             break;
17083
17084           case NEUTRAL_IT_INSN:
17085             /* The BKPT instruction is unconditional even in an IT block.  */
17086             break;
17087
17088           case IT_INSN:
17089             inst.error = BAD_IT_IT;
17090             return FAIL;
17091           }
17092       }
17093       break;
17094     }
17095
17096   return SUCCESS;
17097 }
17098
17099 struct depr_insn_mask
17100 {
17101   unsigned long pattern;
17102   unsigned long mask;
17103   const char* description;
17104 };
17105
17106 /* List of 16-bit instruction patterns deprecated in an IT block in
17107    ARMv8.  */
17108 static const struct depr_insn_mask depr_it_insns[] = {
17109   { 0xc000, 0xc000, N_("Short branches, Undefined, SVC, LDM/STM") },
17110   { 0xb000, 0xb000, N_("Miscellaneous 16-bit instructions") },
17111   { 0xa000, 0xb800, N_("ADR") },
17112   { 0x4800, 0xf800, N_("Literal loads") },
17113   { 0x4478, 0xf478, N_("Hi-register ADD, MOV, CMP, BX, BLX using pc") },
17114   { 0x4487, 0xfc87, N_("Hi-register ADD, MOV, CMP using pc") },
17115   { 0, 0, NULL }
17116 };
17117
17118 static void
17119 it_fsm_post_encode (void)
17120 {
17121   int is_last;
17122
17123   if (!now_it.state_handled)
17124     handle_it_state ();
17125
17126   if (now_it.insn_cond
17127       && !now_it.warn_deprecated
17128       && warn_on_deprecated
17129       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
17130     {
17131       if (inst.instruction >= 0x10000)
17132         {
17133           as_warn (_("IT blocks containing 32-bit Thumb instructions are "
17134                      "deprecated in ARMv8"));
17135           now_it.warn_deprecated = TRUE;
17136         }
17137       else
17138         {
17139           const struct depr_insn_mask *p = depr_it_insns;
17140
17141           while (p->mask != 0)
17142             {
17143               if ((inst.instruction & p->mask) == p->pattern)
17144                 {
17145                   as_warn (_("IT blocks containing 16-bit Thumb instructions "
17146                              "of the following class are deprecated in ARMv8: "
17147                              "%s"), p->description);
17148                   now_it.warn_deprecated = TRUE;
17149                   break;
17150                 }
17151
17152               ++p;
17153             }
17154         }
17155
17156       if (now_it.block_length > 1)
17157         {
17158           as_warn (_("IT blocks containing more than one conditional "
17159                      "instruction are deprecated in ARMv8"));
17160           now_it.warn_deprecated = TRUE;
17161         }
17162     }
17163
17164   is_last = (now_it.mask == 0x10);
17165   if (is_last)
17166     {
17167       now_it.state = OUTSIDE_IT_BLOCK;
17168       now_it.mask = 0;
17169     }
17170 }
17171
17172 static void
17173 force_automatic_it_block_close (void)
17174 {
17175   if (now_it.state == AUTOMATIC_IT_BLOCK)
17176     {
17177       close_automatic_it_block ();
17178       now_it.state = OUTSIDE_IT_BLOCK;
17179       now_it.mask = 0;
17180     }
17181 }
17182
17183 static int
17184 in_it_block (void)
17185 {
17186   if (!now_it.state_handled)
17187     handle_it_state ();
17188
17189   return now_it.state != OUTSIDE_IT_BLOCK;
17190 }
17191
17192 void
17193 md_assemble (char *str)
17194 {
17195   char *p = str;
17196   const struct asm_opcode * opcode;
17197
17198   /* Align the previous label if needed.  */
17199   if (last_label_seen != NULL)
17200     {
17201       symbol_set_frag (last_label_seen, frag_now);
17202       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
17203       S_SET_SEGMENT (last_label_seen, now_seg);
17204     }
17205
17206   memset (&inst, '\0', sizeof (inst));
17207   inst.reloc.type = BFD_RELOC_UNUSED;
17208
17209   opcode = opcode_lookup (&p);
17210   if (!opcode)
17211     {
17212       /* It wasn't an instruction, but it might be a register alias of
17213          the form alias .req reg, or a Neon .dn/.qn directive.  */
17214       if (! create_register_alias (str, p)
17215           && ! create_neon_reg_alias (str, p))
17216         as_bad (_("bad instruction `%s'"), str);
17217
17218       return;
17219     }
17220
17221   if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
17222     as_warn (_("s suffix on comparison instruction is deprecated"));
17223
17224   /* The value which unconditional instructions should have in place of the
17225      condition field.  */
17226   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
17227
17228   if (thumb_mode)
17229     {
17230       arm_feature_set variant;
17231
17232       variant = cpu_variant;
17233       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
17234       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
17235         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
17236       /* Check that this instruction is supported for this CPU.  */
17237       if (!opcode->tvariant
17238           || (thumb_mode == 1
17239               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
17240         {
17241           as_bad (_("selected processor does not support Thumb mode `%s'"), str);
17242           return;
17243         }
17244       if (inst.cond != COND_ALWAYS && !unified_syntax
17245           && opcode->tencode != do_t_branch)
17246         {
17247           as_bad (_("Thumb does not support conditional execution"));
17248           return;
17249         }
17250
17251       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
17252         {
17253           if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
17254               && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
17255                    || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
17256             {
17257               /* Two things are addressed here.
17258                  1) Implicit require narrow instructions on Thumb-1.
17259                     This avoids relaxation accidentally introducing Thumb-2
17260                      instructions.
17261                  2) Reject wide instructions in non Thumb-2 cores.  */
17262               if (inst.size_req == 0)
17263                 inst.size_req = 2;
17264               else if (inst.size_req == 4)
17265                 {
17266                   as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
17267                   return;
17268                 }
17269             }
17270         }
17271
17272       inst.instruction = opcode->tvalue;
17273
17274       if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
17275         {
17276           /* Prepare the it_insn_type for those encodings that don't set
17277              it.  */
17278           it_fsm_pre_encode ();
17279
17280           opcode->tencode ();
17281
17282           it_fsm_post_encode ();
17283         }
17284
17285       if (!(inst.error || inst.relax))
17286         {
17287           gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
17288           inst.size = (inst.instruction > 0xffff ? 4 : 2);
17289           if (inst.size_req && inst.size_req != inst.size)
17290             {
17291               as_bad (_("cannot honor width suffix -- `%s'"), str);
17292               return;
17293             }
17294         }
17295
17296       /* Something has gone badly wrong if we try to relax a fixed size
17297          instruction.  */
17298       gas_assert (inst.size_req == 0 || !inst.relax);
17299
17300       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17301                               *opcode->tvariant);
17302       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
17303          set those bits when Thumb-2 32-bit instructions are seen.  ie.
17304          anything other than bl/blx and v6-M instructions.
17305          This is overly pessimistic for relaxable instructions.  */
17306       if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
17307            || inst.relax)
17308           && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
17309                || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
17310         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17311                                 arm_ext_v6t2);
17312
17313       check_neon_suffixes;
17314
17315       if (!inst.error)
17316         {
17317           mapping_state (MAP_THUMB);
17318         }
17319     }
17320   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
17321     {
17322       bfd_boolean is_bx;
17323
17324       /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
17325       is_bx = (opcode->aencode == do_bx);
17326
17327       /* Check that this instruction is supported for this CPU.  */
17328       if (!(is_bx && fix_v4bx)
17329           && !(opcode->avariant &&
17330                ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
17331         {
17332           as_bad (_("selected processor does not support ARM mode `%s'"), str);
17333           return;
17334         }
17335       if (inst.size_req)
17336         {
17337           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
17338           return;
17339         }
17340
17341       inst.instruction = opcode->avalue;
17342       if (opcode->tag == OT_unconditionalF)
17343         inst.instruction |= 0xF << 28;
17344       else
17345         inst.instruction |= inst.cond << 28;
17346       inst.size = INSN_SIZE;
17347       if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
17348         {
17349           it_fsm_pre_encode ();
17350           opcode->aencode ();
17351           it_fsm_post_encode ();
17352         }
17353       /* Arm mode bx is marked as both v4T and v5 because it's still required
17354          on a hypothetical non-thumb v5 core.  */
17355       if (is_bx)
17356         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
17357       else
17358         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
17359                                 *opcode->avariant);
17360
17361       check_neon_suffixes;
17362
17363       if (!inst.error)
17364         {
17365           mapping_state (MAP_ARM);
17366         }
17367     }
17368   else
17369     {
17370       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
17371                 "-- `%s'"), str);
17372       return;
17373     }
17374   output_inst (str);
17375 }
17376
17377 static void
17378 check_it_blocks_finished (void)
17379 {
17380 #ifdef OBJ_ELF
17381   asection *sect;
17382
17383   for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
17384     if (seg_info (sect)->tc_segment_info_data.current_it.state
17385         == MANUAL_IT_BLOCK)
17386       {
17387         as_warn (_("section '%s' finished with an open IT block."),
17388                  sect->name);
17389       }
17390 #else
17391   if (now_it.state == MANUAL_IT_BLOCK)
17392     as_warn (_("file finished with an open IT block."));
17393 #endif
17394 }
17395
17396 /* Various frobbings of labels and their addresses.  */
17397
17398 void
17399 arm_start_line_hook (void)
17400 {
17401   last_label_seen = NULL;
17402 }
17403
17404 void
17405 arm_frob_label (symbolS * sym)
17406 {
17407   last_label_seen = sym;
17408
17409   ARM_SET_THUMB (sym, thumb_mode);
17410
17411 #if defined OBJ_COFF || defined OBJ_ELF
17412   ARM_SET_INTERWORK (sym, support_interwork);
17413 #endif
17414
17415   force_automatic_it_block_close ();
17416
17417   /* Note - do not allow local symbols (.Lxxx) to be labelled
17418      as Thumb functions.  This is because these labels, whilst
17419      they exist inside Thumb code, are not the entry points for
17420      possible ARM->Thumb calls.  Also, these labels can be used
17421      as part of a computed goto or switch statement.  eg gcc
17422      can generate code that looks like this:
17423
17424                 ldr  r2, [pc, .Laaa]
17425                 lsl  r3, r3, #2
17426                 ldr  r2, [r3, r2]
17427                 mov  pc, r2
17428
17429        .Lbbb:  .word .Lxxx
17430        .Lccc:  .word .Lyyy
17431        ..etc...
17432        .Laaa:   .word Lbbb
17433
17434      The first instruction loads the address of the jump table.
17435      The second instruction converts a table index into a byte offset.
17436      The third instruction gets the jump address out of the table.
17437      The fourth instruction performs the jump.
17438
17439      If the address stored at .Laaa is that of a symbol which has the
17440      Thumb_Func bit set, then the linker will arrange for this address
17441      to have the bottom bit set, which in turn would mean that the
17442      address computation performed by the third instruction would end
17443      up with the bottom bit set.  Since the ARM is capable of unaligned
17444      word loads, the instruction would then load the incorrect address
17445      out of the jump table, and chaos would ensue.  */
17446   if (label_is_thumb_function_name
17447       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
17448       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
17449     {
17450       /* When the address of a Thumb function is taken the bottom
17451          bit of that address should be set.  This will allow
17452          interworking between Arm and Thumb functions to work
17453          correctly.  */
17454
17455       THUMB_SET_FUNC (sym, 1);
17456
17457       label_is_thumb_function_name = FALSE;
17458     }
17459
17460   dwarf2_emit_label (sym);
17461 }
17462
17463 bfd_boolean
17464 arm_data_in_code (void)
17465 {
17466   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
17467     {
17468       *input_line_pointer = '/';
17469       input_line_pointer += 5;
17470       *input_line_pointer = 0;
17471       return TRUE;
17472     }
17473
17474   return FALSE;
17475 }
17476
17477 char *
17478 arm_canonicalize_symbol_name (char * name)
17479 {
17480   int len;
17481
17482   if (thumb_mode && (len = strlen (name)) > 5
17483       && streq (name + len - 5, "/data"))
17484     *(name + len - 5) = 0;
17485
17486   return name;
17487 }
17488 \f
17489 /* Table of all register names defined by default.  The user can
17490    define additional names with .req.  Note that all register names
17491    should appear in both upper and lowercase variants.  Some registers
17492    also have mixed-case names.  */
17493
17494 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
17495 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
17496 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
17497 #define REGSET(p,t) \
17498   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
17499   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
17500   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
17501   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
17502 #define REGSETH(p,t) \
17503   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
17504   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
17505   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
17506   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
17507 #define REGSET2(p,t) \
17508   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
17509   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
17510   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
17511   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
17512 #define SPLRBANK(base,bank,t) \
17513   REGDEF(lr_##bank, 768|((base+0)<<16), t), \
17514   REGDEF(sp_##bank, 768|((base+1)<<16), t), \
17515   REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
17516   REGDEF(LR_##bank, 768|((base+0)<<16), t), \
17517   REGDEF(SP_##bank, 768|((base+1)<<16), t), \
17518   REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
17519
17520 static const struct reg_entry reg_names[] =
17521 {
17522   /* ARM integer registers.  */
17523   REGSET(r, RN), REGSET(R, RN),
17524
17525   /* ATPCS synonyms.  */
17526   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
17527   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
17528   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
17529
17530   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
17531   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
17532   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
17533
17534   /* Well-known aliases.  */
17535   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
17536   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
17537
17538   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
17539   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
17540
17541   /* Coprocessor numbers.  */
17542   REGSET(p, CP), REGSET(P, CP),
17543
17544   /* Coprocessor register numbers.  The "cr" variants are for backward
17545      compatibility.  */
17546   REGSET(c,  CN), REGSET(C, CN),
17547   REGSET(cr, CN), REGSET(CR, CN),
17548
17549   /* ARM banked registers.  */
17550   REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
17551   REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
17552   REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
17553   REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
17554   REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
17555   REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
17556   REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
17557
17558   REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
17559   REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
17560   REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
17561   REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
17562   REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
17563   REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(sp_fiq,512|(13<<16),RNB),
17564   REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
17565   REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
17566
17567   SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
17568   SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
17569   SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
17570   SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
17571   SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
17572   REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
17573   REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
17574   REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
17575   REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
17576
17577   /* FPA registers.  */
17578   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
17579   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
17580
17581   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
17582   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
17583
17584   /* VFP SP registers.  */
17585   REGSET(s,VFS),  REGSET(S,VFS),
17586   REGSETH(s,VFS), REGSETH(S,VFS),
17587
17588   /* VFP DP Registers.  */
17589   REGSET(d,VFD),  REGSET(D,VFD),
17590   /* Extra Neon DP registers.  */
17591   REGSETH(d,VFD), REGSETH(D,VFD),
17592
17593   /* Neon QP registers.  */
17594   REGSET2(q,NQ),  REGSET2(Q,NQ),
17595
17596   /* VFP control registers.  */
17597   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
17598   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
17599   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
17600   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
17601   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
17602   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
17603
17604   /* Maverick DSP coprocessor registers.  */
17605   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
17606   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
17607
17608   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
17609   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
17610   REGDEF(dspsc,0,DSPSC),
17611
17612   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
17613   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
17614   REGDEF(DSPSC,0,DSPSC),
17615
17616   /* iWMMXt data registers - p0, c0-15.  */
17617   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
17618
17619   /* iWMMXt control registers - p1, c0-3.  */
17620   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
17621   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
17622   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
17623   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
17624
17625   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
17626   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
17627   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
17628   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
17629   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
17630
17631   /* XScale accumulator registers.  */
17632   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
17633 };
17634 #undef REGDEF
17635 #undef REGNUM
17636 #undef REGSET
17637
17638 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
17639    within psr_required_here.  */
17640 static const struct asm_psr psrs[] =
17641 {
17642   /* Backward compatibility notation.  Note that "all" is no longer
17643      truly all possible PSR bits.  */
17644   {"all",  PSR_c | PSR_f},
17645   {"flg",  PSR_f},
17646   {"ctl",  PSR_c},
17647
17648   /* Individual flags.  */
17649   {"f",    PSR_f},
17650   {"c",    PSR_c},
17651   {"x",    PSR_x},
17652   {"s",    PSR_s},
17653
17654   /* Combinations of flags.  */
17655   {"fs",   PSR_f | PSR_s},
17656   {"fx",   PSR_f | PSR_x},
17657   {"fc",   PSR_f | PSR_c},
17658   {"sf",   PSR_s | PSR_f},
17659   {"sx",   PSR_s | PSR_x},
17660   {"sc",   PSR_s | PSR_c},
17661   {"xf",   PSR_x | PSR_f},
17662   {"xs",   PSR_x | PSR_s},
17663   {"xc",   PSR_x | PSR_c},
17664   {"cf",   PSR_c | PSR_f},
17665   {"cs",   PSR_c | PSR_s},
17666   {"cx",   PSR_c | PSR_x},
17667   {"fsx",  PSR_f | PSR_s | PSR_x},
17668   {"fsc",  PSR_f | PSR_s | PSR_c},
17669   {"fxs",  PSR_f | PSR_x | PSR_s},
17670   {"fxc",  PSR_f | PSR_x | PSR_c},
17671   {"fcs",  PSR_f | PSR_c | PSR_s},
17672   {"fcx",  PSR_f | PSR_c | PSR_x},
17673   {"sfx",  PSR_s | PSR_f | PSR_x},
17674   {"sfc",  PSR_s | PSR_f | PSR_c},
17675   {"sxf",  PSR_s | PSR_x | PSR_f},
17676   {"sxc",  PSR_s | PSR_x | PSR_c},
17677   {"scf",  PSR_s | PSR_c | PSR_f},
17678   {"scx",  PSR_s | PSR_c | PSR_x},
17679   {"xfs",  PSR_x | PSR_f | PSR_s},
17680   {"xfc",  PSR_x | PSR_f | PSR_c},
17681   {"xsf",  PSR_x | PSR_s | PSR_f},
17682   {"xsc",  PSR_x | PSR_s | PSR_c},
17683   {"xcf",  PSR_x | PSR_c | PSR_f},
17684   {"xcs",  PSR_x | PSR_c | PSR_s},
17685   {"cfs",  PSR_c | PSR_f | PSR_s},
17686   {"cfx",  PSR_c | PSR_f | PSR_x},
17687   {"csf",  PSR_c | PSR_s | PSR_f},
17688   {"csx",  PSR_c | PSR_s | PSR_x},
17689   {"cxf",  PSR_c | PSR_x | PSR_f},
17690   {"cxs",  PSR_c | PSR_x | PSR_s},
17691   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
17692   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
17693   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
17694   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
17695   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
17696   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
17697   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
17698   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
17699   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
17700   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
17701   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
17702   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
17703   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
17704   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
17705   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
17706   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
17707   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
17708   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
17709   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
17710   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
17711   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
17712   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
17713   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
17714   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
17715 };
17716
17717 /* Table of V7M psr names.  */
17718 static const struct asm_psr v7m_psrs[] =
17719 {
17720   {"apsr",        0 }, {"APSR",         0 },
17721   {"iapsr",       1 }, {"IAPSR",        1 },
17722   {"eapsr",       2 }, {"EAPSR",        2 },
17723   {"psr",         3 }, {"PSR",          3 },
17724   {"xpsr",        3 }, {"XPSR",         3 }, {"xPSR",     3 },
17725   {"ipsr",        5 }, {"IPSR",         5 },
17726   {"epsr",        6 }, {"EPSR",         6 },
17727   {"iepsr",       7 }, {"IEPSR",        7 },
17728   {"msp",         8 }, {"MSP",          8 },
17729   {"psp",         9 }, {"PSP",          9 },
17730   {"primask",     16}, {"PRIMASK",      16},
17731   {"basepri",     17}, {"BASEPRI",      17},
17732   {"basepri_max", 18}, {"BASEPRI_MAX",  18},
17733   {"basepri_max", 18}, {"BASEPRI_MASK", 18}, /* Typo, preserved for backwards compatibility.  */
17734   {"faultmask",   19}, {"FAULTMASK",    19},
17735   {"control",     20}, {"CONTROL",      20}
17736 };
17737
17738 /* Table of all shift-in-operand names.  */
17739 static const struct asm_shift_name shift_names [] =
17740 {
17741   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
17742   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
17743   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
17744   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
17745   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
17746   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
17747 };
17748
17749 /* Table of all explicit relocation names.  */
17750 #ifdef OBJ_ELF
17751 static struct reloc_entry reloc_names[] =
17752 {
17753   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
17754   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
17755   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
17756   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
17757   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
17758   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
17759   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
17760   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
17761   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
17762   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
17763   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32},
17764   { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
17765   { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
17766         { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
17767   { "tlscall", BFD_RELOC_ARM_TLS_CALL},
17768         { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
17769   { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
17770         { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
17771 };
17772 #endif
17773
17774 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
17775 static const struct asm_cond conds[] =
17776 {
17777   {"eq", 0x0},
17778   {"ne", 0x1},
17779   {"cs", 0x2}, {"hs", 0x2},
17780   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
17781   {"mi", 0x4},
17782   {"pl", 0x5},
17783   {"vs", 0x6},
17784   {"vc", 0x7},
17785   {"hi", 0x8},
17786   {"ls", 0x9},
17787   {"ge", 0xa},
17788   {"lt", 0xb},
17789   {"gt", 0xc},
17790   {"le", 0xd},
17791   {"al", 0xe}
17792 };
17793
17794 #define UL_BARRIER(L,U,CODE,FEAT) \
17795   { L, CODE, ARM_FEATURE (FEAT, 0) }, \
17796   { U, CODE, ARM_FEATURE (FEAT, 0) }
17797
17798 static struct asm_barrier_opt barrier_opt_names[] =
17799 {
17800   UL_BARRIER ("sy",     "SY",    0xf, ARM_EXT_BARRIER),
17801   UL_BARRIER ("st",     "ST",    0xe, ARM_EXT_BARRIER),
17802   UL_BARRIER ("ld",     "LD",    0xd, ARM_EXT_V8),
17803   UL_BARRIER ("ish",    "ISH",   0xb, ARM_EXT_BARRIER),
17804   UL_BARRIER ("sh",     "SH",    0xb, ARM_EXT_BARRIER),
17805   UL_BARRIER ("ishst",  "ISHST", 0xa, ARM_EXT_BARRIER),
17806   UL_BARRIER ("shst",   "SHST",  0xa, ARM_EXT_BARRIER),
17807   UL_BARRIER ("ishld",  "ISHLD", 0x9, ARM_EXT_V8),
17808   UL_BARRIER ("un",     "UN",    0x7, ARM_EXT_BARRIER),
17809   UL_BARRIER ("nsh",    "NSH",   0x7, ARM_EXT_BARRIER),
17810   UL_BARRIER ("unst",   "UNST",  0x6, ARM_EXT_BARRIER),
17811   UL_BARRIER ("nshst",  "NSHST", 0x6, ARM_EXT_BARRIER),
17812   UL_BARRIER ("nshld",  "NSHLD", 0x5, ARM_EXT_V8),
17813   UL_BARRIER ("osh",    "OSH",   0x3, ARM_EXT_BARRIER),
17814   UL_BARRIER ("oshst",  "OSHST", 0x2, ARM_EXT_BARRIER),
17815   UL_BARRIER ("oshld",  "OSHLD", 0x1, ARM_EXT_V8)
17816 };
17817
17818 #undef UL_BARRIER
17819
17820 /* Table of ARM-format instructions.    */
17821
17822 /* Macros for gluing together operand strings.  N.B. In all cases
17823    other than OPS0, the trailing OP_stop comes from default
17824    zero-initialization of the unspecified elements of the array.  */
17825 #define OPS0()            { OP_stop, }
17826 #define OPS1(a)           { OP_##a, }
17827 #define OPS2(a,b)         { OP_##a,OP_##b, }
17828 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
17829 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
17830 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
17831 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
17832
17833 /* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
17834    This is useful when mixing operands for ARM and THUMB, i.e. using the
17835    MIX_ARM_THUMB_OPERANDS macro.
17836    In order to use these macros, prefix the number of operands with _
17837    e.g. _3.  */
17838 #define OPS_1(a)           { a, }
17839 #define OPS_2(a,b)         { a,b, }
17840 #define OPS_3(a,b,c)       { a,b,c, }
17841 #define OPS_4(a,b,c,d)     { a,b,c,d, }
17842 #define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
17843 #define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
17844
17845 /* These macros abstract out the exact format of the mnemonic table and
17846    save some repeated characters.  */
17847
17848 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
17849 #define TxCE(mnem, op, top, nops, ops, ae, te) \
17850   { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
17851     THUMB_VARIANT, do_##ae, do_##te }
17852
17853 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
17854    a T_MNEM_xyz enumerator.  */
17855 #define TCE(mnem, aop, top, nops, ops, ae, te) \
17856       TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
17857 #define tCE(mnem, aop, top, nops, ops, ae, te) \
17858       TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
17859
17860 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
17861    infix after the third character.  */
17862 #define TxC3(mnem, op, top, nops, ops, ae, te) \
17863   { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
17864     THUMB_VARIANT, do_##ae, do_##te }
17865 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
17866   { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
17867     THUMB_VARIANT, do_##ae, do_##te }
17868 #define TC3(mnem, aop, top, nops, ops, ae, te) \
17869       TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
17870 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
17871       TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
17872 #define tC3(mnem, aop, top, nops, ops, ae, te) \
17873       TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
17874 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
17875       TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
17876
17877 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
17878    field is still 0xE.  Many of the Thumb variants can be executed
17879    conditionally, so this is checked separately.  */
17880 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
17881   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
17882     THUMB_VARIANT, do_##ae, do_##te }
17883
17884 /* Same as TUE but the encoding function for ARM and Thumb modes is the same.
17885    Used by mnemonics that have very minimal differences in the encoding for
17886    ARM and Thumb variants and can be handled in a common function.  */
17887 #define TUEc(mnem, op, top, nops, ops, en) \
17888   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
17889     THUMB_VARIANT, do_##en, do_##en }
17890
17891 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
17892    condition code field.  */
17893 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
17894   { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
17895     THUMB_VARIANT, do_##ae, do_##te }
17896
17897 /* ARM-only variants of all the above.  */
17898 #define CE(mnem,  op, nops, ops, ae)    \
17899   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17900
17901 #define C3(mnem, op, nops, ops, ae)     \
17902   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17903
17904 /* Legacy mnemonics that always have conditional infix after the third
17905    character.  */
17906 #define CL(mnem, op, nops, ops, ae)     \
17907   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
17908     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17909
17910 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
17911 #define cCE(mnem,  op, nops, ops, ae)   \
17912   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
17913
17914 /* Legacy coprocessor instructions where conditional infix and conditional
17915    suffix are ambiguous.  For consistency this includes all FPA instructions,
17916    not just the potentially ambiguous ones.  */
17917 #define cCL(mnem, op, nops, ops, ae)    \
17918   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
17919     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
17920
17921 /* Coprocessor, takes either a suffix or a position-3 infix
17922    (for an FPA corner case). */
17923 #define C3E(mnem, op, nops, ops, ae) \
17924   { mnem, OPS##nops ops, OT_csuf_or_in3, \
17925     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
17926
17927 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
17928   { m1 #m2 m3, OPS##nops ops, \
17929     sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
17930     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17931
17932 #define CM(m1, m2, op, nops, ops, ae)   \
17933   xCM_ (m1,   , m2, op, nops, ops, ae), \
17934   xCM_ (m1, eq, m2, op, nops, ops, ae), \
17935   xCM_ (m1, ne, m2, op, nops, ops, ae), \
17936   xCM_ (m1, cs, m2, op, nops, ops, ae), \
17937   xCM_ (m1, hs, m2, op, nops, ops, ae), \
17938   xCM_ (m1, cc, m2, op, nops, ops, ae), \
17939   xCM_ (m1, ul, m2, op, nops, ops, ae), \
17940   xCM_ (m1, lo, m2, op, nops, ops, ae), \
17941   xCM_ (m1, mi, m2, op, nops, ops, ae), \
17942   xCM_ (m1, pl, m2, op, nops, ops, ae), \
17943   xCM_ (m1, vs, m2, op, nops, ops, ae), \
17944   xCM_ (m1, vc, m2, op, nops, ops, ae), \
17945   xCM_ (m1, hi, m2, op, nops, ops, ae), \
17946   xCM_ (m1, ls, m2, op, nops, ops, ae), \
17947   xCM_ (m1, ge, m2, op, nops, ops, ae), \
17948   xCM_ (m1, lt, m2, op, nops, ops, ae), \
17949   xCM_ (m1, gt, m2, op, nops, ops, ae), \
17950   xCM_ (m1, le, m2, op, nops, ops, ae), \
17951   xCM_ (m1, al, m2, op, nops, ops, ae)
17952
17953 #define UE(mnem, op, nops, ops, ae)     \
17954   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
17955
17956 #define UF(mnem, op, nops, ops, ae)     \
17957   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
17958
17959 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
17960    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
17961    use the same encoding function for each.  */
17962 #define NUF(mnem, op, nops, ops, enc)                                   \
17963   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
17964     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17965
17966 /* Neon data processing, version which indirects through neon_enc_tab for
17967    the various overloaded versions of opcodes.  */
17968 #define nUF(mnem, op, nops, ops, enc)                                   \
17969   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
17970     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17971
17972 /* Neon insn with conditional suffix for the ARM version, non-overloaded
17973    version.  */
17974 #define NCE_tag(mnem, op, nops, ops, enc, tag)                          \
17975   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
17976     THUMB_VARIANT, do_##enc, do_##enc }
17977
17978 #define NCE(mnem, op, nops, ops, enc)                                   \
17979    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
17980
17981 #define NCEF(mnem, op, nops, ops, enc)                                  \
17982     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
17983
17984 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
17985 #define nCE_tag(mnem, op, nops, ops, enc, tag)                          \
17986   { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,          \
17987     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17988
17989 #define nCE(mnem, op, nops, ops, enc)                                   \
17990    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
17991
17992 #define nCEF(mnem, op, nops, ops, enc)                                  \
17993     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
17994
17995 #define do_0 0
17996
17997 static const struct asm_opcode insns[] =
17998 {
17999 #define ARM_VARIANT    & arm_ext_v1 /* Core ARM Instructions.  */
18000 #define THUMB_VARIANT  & arm_ext_v4t
18001  tCE("and",     0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
18002  tC3("ands",    0100000, _ands,    3, (RR, oRR, SH), arit, t_arit3c),
18003  tCE("eor",     0200000, _eor,     3, (RR, oRR, SH), arit, t_arit3c),
18004  tC3("eors",    0300000, _eors,    3, (RR, oRR, SH), arit, t_arit3c),
18005  tCE("sub",     0400000, _sub,     3, (RR, oRR, SH), arit, t_add_sub),
18006  tC3("subs",    0500000, _subs,    3, (RR, oRR, SH), arit, t_add_sub),
18007  tCE("add",     0800000, _add,     3, (RR, oRR, SHG), arit, t_add_sub),
18008  tC3("adds",    0900000, _adds,    3, (RR, oRR, SHG), arit, t_add_sub),
18009  tCE("adc",     0a00000, _adc,     3, (RR, oRR, SH), arit, t_arit3c),
18010  tC3("adcs",    0b00000, _adcs,    3, (RR, oRR, SH), arit, t_arit3c),
18011  tCE("sbc",     0c00000, _sbc,     3, (RR, oRR, SH), arit, t_arit3),
18012  tC3("sbcs",    0d00000, _sbcs,    3, (RR, oRR, SH), arit, t_arit3),
18013  tCE("orr",     1800000, _orr,     3, (RR, oRR, SH), arit, t_arit3c),
18014  tC3("orrs",    1900000, _orrs,    3, (RR, oRR, SH), arit, t_arit3c),
18015  tCE("bic",     1c00000, _bic,     3, (RR, oRR, SH), arit, t_arit3),
18016  tC3("bics",    1d00000, _bics,    3, (RR, oRR, SH), arit, t_arit3),
18017
18018  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
18019     for setting PSR flag bits.  They are obsolete in V6 and do not
18020     have Thumb equivalents. */
18021  tCE("tst",     1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
18022  tC3w("tsts",   1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
18023   CL("tstp",    110f000,           2, (RR, SH),      cmp),
18024  tCE("cmp",     1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
18025  tC3w("cmps",   1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
18026   CL("cmpp",    150f000,           2, (RR, SH),      cmp),
18027  tCE("cmn",     1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
18028  tC3w("cmns",   1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
18029   CL("cmnp",    170f000,           2, (RR, SH),      cmp),
18030
18031  tCE("mov",     1a00000, _mov,     2, (RR, SH),      mov,  t_mov_cmp),
18032  tC3("movs",    1b00000, _movs,    2, (RR, SH),      mov,  t_mov_cmp),
18033  tCE("mvn",     1e00000, _mvn,     2, (RR, SH),      mov,  t_mvn_tst),
18034  tC3("mvns",    1f00000, _mvns,    2, (RR, SH),      mov,  t_mvn_tst),
18035
18036  tCE("ldr",     4100000, _ldr,     2, (RR, ADDRGLDR),ldst, t_ldst),
18037  tC3("ldrb",    4500000, _ldrb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
18038  tCE("str",     4000000, _str,     _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
18039                                                                 OP_RRnpc),
18040                                         OP_ADDRGLDR),ldst, t_ldst),
18041  tC3("strb",    4400000, _strb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
18042
18043  tCE("stm",     8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18044  tC3("stmia",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18045  tC3("stmea",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18046  tCE("ldm",     8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18047  tC3("ldmia",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18048  tC3("ldmfd",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18049
18050  TCE("swi",     f000000, df00,     1, (EXPi),        swi, t_swi),
18051  TCE("svc",     f000000, df00,     1, (EXPi),        swi, t_swi),
18052  tCE("b",       a000000, _b,       1, (EXPr),        branch, t_branch),
18053  TCE("bl",      b000000, f000f800, 1, (EXPr),        bl, t_branch23),
18054
18055   /* Pseudo ops.  */
18056  tCE("adr",     28f0000, _adr,     2, (RR, EXP),     adr,  t_adr),
18057   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
18058  tCE("nop",     1a00000, _nop,     1, (oI255c),      nop,  t_nop),
18059  tCE("udf",     7f000f0, _udf,     1, (oIffffb),     bkpt, t_udf),
18060
18061   /* Thumb-compatibility pseudo ops.  */
18062  tCE("lsl",     1a00000, _lsl,     3, (RR, oRR, SH), shift, t_shift),
18063  tC3("lsls",    1b00000, _lsls,    3, (RR, oRR, SH), shift, t_shift),
18064  tCE("lsr",     1a00020, _lsr,     3, (RR, oRR, SH), shift, t_shift),
18065  tC3("lsrs",    1b00020, _lsrs,    3, (RR, oRR, SH), shift, t_shift),
18066  tCE("asr",     1a00040, _asr,     3, (RR, oRR, SH), shift, t_shift),
18067  tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
18068  tCE("ror",     1a00060, _ror,     3, (RR, oRR, SH), shift, t_shift),
18069  tC3("rors",    1b00060, _rors,    3, (RR, oRR, SH), shift, t_shift),
18070  tCE("neg",     2600000, _neg,     2, (RR, RR),      rd_rn, t_neg),
18071  tC3("negs",    2700000, _negs,    2, (RR, RR),      rd_rn, t_neg),
18072  tCE("push",    92d0000, _push,     1, (REGLST),             push_pop, t_push_pop),
18073  tCE("pop",     8bd0000, _pop,     1, (REGLST),      push_pop, t_push_pop),
18074
18075  /* These may simplify to neg.  */
18076  TCE("rsb",     0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
18077  TC3("rsbs",    0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
18078
18079 #undef  THUMB_VARIANT
18080 #define THUMB_VARIANT  & arm_ext_v6
18081
18082  TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
18083
18084  /* V1 instructions with no Thumb analogue prior to V6T2.  */
18085 #undef  THUMB_VARIANT
18086 #define THUMB_VARIANT  & arm_ext_v6t2
18087
18088  TCE("teq",     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
18089  TC3w("teqs",   1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
18090   CL("teqp",    130f000,           2, (RR, SH),      cmp),
18091
18092  TC3("ldrt",    4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18093  TC3("ldrbt",   4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18094  TC3("strt",    4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
18095  TC3("strbt",   4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18096
18097  TC3("stmdb",   9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18098  TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18099
18100  TC3("ldmdb",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18101  TC3("ldmea",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18102
18103  /* V1 instructions with no Thumb analogue at all.  */
18104   CE("rsc",     0e00000,           3, (RR, oRR, SH), arit),
18105   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
18106
18107   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
18108   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
18109   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
18110   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
18111   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
18112   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
18113   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
18114   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
18115
18116 #undef  ARM_VARIANT
18117 #define ARM_VARIANT    & arm_ext_v2     /* ARM 2 - multiplies.  */
18118 #undef  THUMB_VARIANT
18119 #define THUMB_VARIANT  & arm_ext_v4t
18120
18121  tCE("mul",     0000090, _mul,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
18122  tC3("muls",    0100090, _muls,    3, (RRnpc, RRnpc, oRR), mul, t_mul),
18123
18124 #undef  THUMB_VARIANT
18125 #define THUMB_VARIANT  & arm_ext_v6t2
18126
18127  TCE("mla",     0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
18128   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
18129
18130   /* Generic coprocessor instructions.  */
18131  TCE("cdp",     e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
18132  TCE("ldc",     c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18133  TC3("ldcl",    c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18134  TCE("stc",     c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18135  TC3("stcl",    c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18136  TCE("mcr",     e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18137  TCE("mrc",     e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b),   co_reg, co_reg),
18138
18139 #undef  ARM_VARIANT
18140 #define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
18141
18142   CE("swp",     1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
18143   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
18144
18145 #undef  ARM_VARIANT
18146 #define ARM_VARIANT    & arm_ext_v3     /* ARM 6 Status register instructions.  */
18147 #undef  THUMB_VARIANT
18148 #define THUMB_VARIANT  & arm_ext_msr
18149
18150  TCE("mrs",     1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
18151  TCE("msr",     120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
18152
18153 #undef  ARM_VARIANT
18154 #define ARM_VARIANT    & arm_ext_v3m     /* ARM 7M long multiplies.  */
18155 #undef  THUMB_VARIANT
18156 #define THUMB_VARIANT  & arm_ext_v6t2
18157
18158  TCE("smull",   0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18159   CM("smull","s",       0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18160  TCE("umull",   0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18161   CM("umull","s",       0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18162  TCE("smlal",   0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18163   CM("smlal","s",       0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18164  TCE("umlal",   0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18165   CM("umlal","s",       0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18166
18167 #undef  ARM_VARIANT
18168 #define ARM_VARIANT    & arm_ext_v4     /* ARM Architecture 4.  */
18169 #undef  THUMB_VARIANT
18170 #define THUMB_VARIANT  & arm_ext_v4t
18171
18172  tC3("ldrh",    01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18173  tC3("strh",    00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18174  tC3("ldrsh",   01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18175  tC3("ldrsb",   01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18176  tC3("ldsh",    01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18177  tC3("ldsb",    01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18178
18179 #undef  ARM_VARIANT
18180 #define ARM_VARIANT  & arm_ext_v4t_5
18181
18182   /* ARM Architecture 4T.  */
18183   /* Note: bx (and blx) are required on V5, even if the processor does
18184      not support Thumb.  */
18185  TCE("bx",      12fff10, 4700, 1, (RR), bx, t_bx),
18186
18187 #undef  ARM_VARIANT
18188 #define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.     */
18189 #undef  THUMB_VARIANT
18190 #define THUMB_VARIANT  & arm_ext_v5t
18191
18192   /* Note: blx has 2 variants; the .value coded here is for
18193      BLX(2).  Only this variant has conditional execution.  */
18194  TCE("blx",     12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
18195  TUE("bkpt",    1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
18196
18197 #undef  THUMB_VARIANT
18198 #define THUMB_VARIANT  & arm_ext_v6t2
18199
18200  TCE("clz",     16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
18201  TUF("ldc2",    c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18202  TUF("ldc2l",   c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
18203  TUF("stc2",    c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18204  TUF("stc2l",   c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
18205  TUF("cdp2",    e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
18206  TUF("mcr2",    e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18207  TUF("mrc2",    e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18208
18209 #undef  ARM_VARIANT
18210 #define ARM_VARIANT    & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
18211 #undef  THUMB_VARIANT
18212 #define THUMB_VARIANT  & arm_ext_v5exp
18213
18214  TCE("smlabb",  1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18215  TCE("smlatb",  10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18216  TCE("smlabt",  10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18217  TCE("smlatt",  10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18218
18219  TCE("smlawb",  1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18220  TCE("smlawt",  12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18221
18222  TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18223  TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18224  TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18225  TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18226
18227  TCE("smulbb",  1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18228  TCE("smultb",  16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18229  TCE("smulbt",  16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18230  TCE("smultt",  16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18231
18232  TCE("smulwb",  12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18233  TCE("smulwt",  12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18234
18235  TCE("qadd",    1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18236  TCE("qdadd",   1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18237  TCE("qsub",    1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18238  TCE("qdsub",   1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18239
18240 #undef  ARM_VARIANT
18241 #define ARM_VARIANT    & arm_ext_v5e /*  ARM Architecture 5TE.  */
18242 #undef  THUMB_VARIANT
18243 #define THUMB_VARIANT  & arm_ext_v6t2
18244
18245  TUF("pld",     450f000, f810f000, 1, (ADDR),                pld,  t_pld),
18246  TC3("ldrd",    00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
18247      ldrd, t_ldstd),
18248  TC3("strd",    00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
18249                                        ADDRGLDRS), ldrd, t_ldstd),
18250
18251  TCE("mcrr",    c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18252  TCE("mrrc",    c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18253
18254 #undef  ARM_VARIANT
18255 #define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
18256
18257  TCE("bxj",     12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
18258
18259 #undef  ARM_VARIANT
18260 #define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
18261 #undef  THUMB_VARIANT
18262 #define THUMB_VARIANT  & arm_ext_v6
18263
18264  TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
18265  TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
18266  tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18267  tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18268  tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18269  tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18270  tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18271  tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18272  tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18273  TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
18274
18275 #undef  THUMB_VARIANT
18276 #define THUMB_VARIANT  & arm_ext_v6t2
18277
18278  TCE("ldrex",   1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),        ldrex, t_ldrex),
18279  TCE("strex",   1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18280                                       strex,  t_strex),
18281  TUF("mcrr2",   c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18282  TUF("mrrc2",   c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18283
18284  TCE("ssat",    6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
18285  TCE("usat",    6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
18286
18287 /*  ARM V6 not included in V7M.  */
18288 #undef  THUMB_VARIANT
18289 #define THUMB_VARIANT  & arm_ext_v6_notm
18290  TUF("rfeia",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18291  TUF("rfe",     8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18292   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
18293   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
18294  TUF("rfedb",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
18295  TUF("rfefd",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18296   UF(rfefa,     8100a00,           1, (RRw),                       rfe),
18297  TUF("rfeea",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
18298   UF(rfeed,     9900a00,           1, (RRw),                       rfe),
18299  TUF("srsia",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18300  TUF("srs",     8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18301  TUF("srsea",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18302   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
18303   UF(srsfa,     9c00500,           2, (oRRw, I31w),                srs),
18304   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
18305   UF(srsed,     8400500,           2, (oRRw, I31w),                srs),
18306  TUF("srsdb",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
18307  TUF("srsfd",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
18308
18309 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
18310 #undef  THUMB_VARIANT
18311 #define THUMB_VARIANT  & arm_ext_v6_dsp
18312  TUF("cps",     1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
18313  TCE("pkhbt",   6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
18314  TCE("pkhtb",   6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
18315  TCE("qadd16",  6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18316  TCE("qadd8",   6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18317  TCE("qasx",    6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18318  /* Old name for QASX.  */
18319  TCE("qaddsubx",6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18320  TCE("qsax",    6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18321  /* Old name for QSAX.  */
18322  TCE("qsubaddx",6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18323  TCE("qsub16",  6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18324  TCE("qsub8",   6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18325  TCE("sadd16",  6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18326  TCE("sadd8",   6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18327  TCE("sasx",    6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18328  /* Old name for SASX.  */
18329  TCE("saddsubx",6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18330  TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18331  TCE("shadd8",  6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18332  TCE("shasx",   6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18333  /* Old name for SHASX.  */
18334  TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18335  TCE("shsax",     6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18336  /* Old name for SHSAX.  */
18337  TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18338  TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18339  TCE("shsub8",  6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18340  TCE("ssax",    6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18341  /* Old name for SSAX.  */
18342  TCE("ssubaddx",6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18343  TCE("ssub16",  6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18344  TCE("ssub8",   6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18345  TCE("uadd16",  6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18346  TCE("uadd8",   6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18347  TCE("uasx",    6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18348  /* Old name for UASX.  */
18349  TCE("uaddsubx",6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18350  TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18351  TCE("uhadd8",  6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18352  TCE("uhasx",   6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18353  /* Old name for UHASX.  */
18354  TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18355  TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18356  /* Old name for UHSAX.  */
18357  TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18358  TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18359  TCE("uhsub8",  6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18360  TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18361  TCE("uqadd8",  6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18362  TCE("uqasx",   6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18363  /* Old name for UQASX.  */
18364  TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18365  TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18366  /* Old name for UQSAX.  */
18367  TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18368  TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18369  TCE("uqsub8",  6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18370  TCE("usub16",  6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18371  TCE("usax",    6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18372  /* Old name for USAX.  */
18373  TCE("usubaddx",6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18374  TCE("usub8",   6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18375  TCE("sxtah",   6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18376  TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18377  TCE("sxtab",   6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18378  TCE("sxtb16",  68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
18379  TCE("uxtah",   6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18380  TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18381  TCE("uxtab",   6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18382  TCE("uxtb16",  6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
18383  TCE("sel",     6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18384  TCE("smlad",   7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18385  TCE("smladx",  7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18386  TCE("smlald",  7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18387  TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18388  TCE("smlsd",   7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18389  TCE("smlsdx",  7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18390  TCE("smlsld",  7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18391  TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18392  TCE("smmla",   7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18393  TCE("smmlar",  7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18394  TCE("smmls",   75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18395  TCE("smmlsr",  75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18396  TCE("smmul",   750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18397  TCE("smmulr",  750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18398  TCE("smuad",   700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18399  TCE("smuadx",  700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18400  TCE("smusd",   700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18401  TCE("smusdx",  700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18402  TCE("ssat16",  6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
18403  TCE("umaal",   0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
18404  TCE("usad8",   780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
18405  TCE("usada8",  7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
18406  TCE("usat16",  6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
18407
18408 #undef  ARM_VARIANT
18409 #define ARM_VARIANT   & arm_ext_v6k
18410 #undef  THUMB_VARIANT
18411 #define THUMB_VARIANT & arm_ext_v6k
18412
18413  tCE("yield",   320f001, _yield,    0, (), noargs, t_hint),
18414  tCE("wfe",     320f002, _wfe,      0, (), noargs, t_hint),
18415  tCE("wfi",     320f003, _wfi,      0, (), noargs, t_hint),
18416  tCE("sev",     320f004, _sev,      0, (), noargs, t_hint),
18417
18418 #undef  THUMB_VARIANT
18419 #define THUMB_VARIANT  & arm_ext_v6_notm
18420  TCE("ldrexd",  1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
18421                                       ldrexd, t_ldrexd),
18422  TCE("strexd",  1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
18423                                        RRnpcb), strexd, t_strexd),
18424
18425 #undef  THUMB_VARIANT
18426 #define THUMB_VARIANT  & arm_ext_v6t2
18427  TCE("ldrexb",  1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
18428      rd_rn,  rd_rn),
18429  TCE("ldrexh",  1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
18430      rd_rn,  rd_rn),
18431  TCE("strexb",  1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18432      strex, t_strexbh),
18433  TCE("strexh",  1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18434      strex, t_strexbh),
18435  TUF("clrex",   57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
18436
18437 #undef  ARM_VARIANT
18438 #define ARM_VARIANT    & arm_ext_sec
18439 #undef  THUMB_VARIANT
18440 #define THUMB_VARIANT  & arm_ext_sec
18441
18442  TCE("smc",     1600070, f7f08000, 1, (EXPi), smc, t_smc),
18443
18444 #undef  ARM_VARIANT
18445 #define ARM_VARIANT    & arm_ext_virt
18446 #undef  THUMB_VARIANT
18447 #define THUMB_VARIANT    & arm_ext_virt
18448
18449  TCE("hvc",     1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
18450  TCE("eret",    160006e, f3de8f00, 0, (), noargs, noargs),
18451
18452 #undef  ARM_VARIANT
18453 #define ARM_VARIANT    & arm_ext_v6t2
18454 #undef  THUMB_VARIANT
18455 #define THUMB_VARIANT  & arm_ext_v6t2
18456
18457  TCE("bfc",     7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
18458  TCE("bfi",     7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
18459  TCE("sbfx",    7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
18460  TCE("ubfx",    7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
18461
18462  TCE("mls",     0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
18463  TCE("movw",    3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
18464  TCE("movt",    3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
18465  TCE("rbit",    6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
18466
18467  TC3("ldrht",   03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18468  TC3("ldrsht",  03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18469  TC3("ldrsbt",  03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18470  TC3("strht",   02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18471
18472  /* Thumb-only instructions.  */
18473 #undef  ARM_VARIANT
18474 #define ARM_VARIANT NULL
18475   TUE("cbnz",     0,           b900,     2, (RR, EXP), 0, t_cbz),
18476   TUE("cbz",      0,           b100,     2, (RR, EXP), 0, t_cbz),
18477
18478  /* ARM does not really have an IT instruction, so always allow it.
18479     The opcode is copied from Thumb in order to allow warnings in
18480     -mimplicit-it=[never | arm] modes.  */
18481 #undef  ARM_VARIANT
18482 #define ARM_VARIANT  & arm_ext_v1
18483
18484  TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
18485  TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
18486  TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
18487  TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
18488  TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
18489  TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
18490  TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
18491  TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
18492  TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
18493  TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
18494  TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
18495  TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
18496  TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
18497  TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
18498  TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
18499  /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
18500  TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
18501  TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
18502
18503  /* Thumb2 only instructions.  */
18504 #undef  ARM_VARIANT
18505 #define ARM_VARIANT  NULL
18506
18507  TCE("addw",    0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18508  TCE("subw",    0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18509  TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
18510  TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
18511  TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
18512  TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
18513
18514  /* Hardware division instructions.  */
18515 #undef  ARM_VARIANT
18516 #define ARM_VARIANT    & arm_ext_adiv
18517 #undef  THUMB_VARIANT
18518 #define THUMB_VARIANT  & arm_ext_div
18519
18520  TCE("sdiv",    710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
18521  TCE("udiv",    730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
18522
18523  /* ARM V6M/V7 instructions.  */
18524 #undef  ARM_VARIANT
18525 #define ARM_VARIANT    & arm_ext_barrier
18526 #undef  THUMB_VARIANT
18527 #define THUMB_VARIANT  & arm_ext_barrier
18528
18529  TUF("dmb",     57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, barrier),
18530  TUF("dsb",     57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, barrier),
18531  TUF("isb",     57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, barrier),
18532
18533  /* ARM V7 instructions.  */
18534 #undef  ARM_VARIANT
18535 #define ARM_VARIANT    & arm_ext_v7
18536 #undef  THUMB_VARIANT
18537 #define THUMB_VARIANT  & arm_ext_v7
18538
18539  TUF("pli",     450f000, f910f000, 1, (ADDR),     pli,      t_pld),
18540  TCE("dbg",     320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
18541
18542 #undef  ARM_VARIANT
18543 #define ARM_VARIANT    & arm_ext_mp
18544 #undef  THUMB_VARIANT
18545 #define THUMB_VARIANT  & arm_ext_mp
18546
18547  TUF("pldw",    410f000, f830f000, 1, (ADDR),   pld,    t_pld),
18548
18549  /* AArchv8 instructions.  */
18550 #undef  ARM_VARIANT
18551 #define ARM_VARIANT   & arm_ext_v8
18552 #undef  THUMB_VARIANT
18553 #define THUMB_VARIANT & arm_ext_v8
18554
18555  tCE("sevl",    320f005, _sevl,    0, (),               noargs, t_hint),
18556  TUE("hlt",     1000070, ba80,     1, (oIffffb),        bkpt,   t_hlt),
18557  TCE("ldaex",   1900e9f, e8d00fef, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18558  TCE("ldaexd",  1b00e9f, e8d000ff, 3, (RRnpc, oRRnpc, RRnpcb),
18559                                                         ldrexd, t_ldrexd),
18560  TCE("ldaexb",  1d00e9f, e8d00fcf, 2, (RRnpc,RRnpcb),   rd_rn,  rd_rn),
18561  TCE("ldaexh",  1f00e9f, e8d00fdf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18562  TCE("stlex",   1800e90, e8c00fe0, 3, (RRnpc, RRnpc, RRnpcb),
18563                                                         stlex,  t_stlex),
18564  TCE("stlexd",  1a00e90, e8c000f0, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb),
18565                                                         strexd, t_strexd),
18566  TCE("stlexb",  1c00e90, e8c00fc0, 3, (RRnpc, RRnpc, RRnpcb),
18567                                                         stlex, t_stlex),
18568  TCE("stlexh",  1e00e90, e8c00fd0, 3, (RRnpc, RRnpc, RRnpcb),
18569                                                         stlex, t_stlex),
18570  TCE("lda",     1900c9f, e8d00faf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18571  TCE("ldab",    1d00c9f, e8d00f8f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18572  TCE("ldah",    1f00c9f, e8d00f9f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18573  TCE("stl",     180fc90, e8c00faf, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18574  TCE("stlb",    1c0fc90, e8c00f8f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18575  TCE("stlh",    1e0fc90, e8c00f9f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18576
18577  /* ARMv8 T32 only.  */
18578 #undef  ARM_VARIANT
18579 #define ARM_VARIANT  NULL
18580  TUF("dcps1",   0,       f78f8001, 0, (),       noargs, noargs),
18581  TUF("dcps2",   0,       f78f8002, 0, (),       noargs, noargs),
18582  TUF("dcps3",   0,       f78f8003, 0, (),       noargs, noargs),
18583
18584   /* FP for ARMv8.  */
18585 #undef  ARM_VARIANT
18586 #define ARM_VARIANT   & fpu_vfp_ext_armv8
18587 #undef  THUMB_VARIANT
18588 #define THUMB_VARIANT & fpu_vfp_ext_armv8
18589
18590   nUF(vseleq, _vseleq, 3, (RVSD, RVSD, RVSD),           vsel),
18591   nUF(vselvs, _vselvs, 3, (RVSD, RVSD, RVSD),           vsel),
18592   nUF(vselge, _vselge, 3, (RVSD, RVSD, RVSD),           vsel),
18593   nUF(vselgt, _vselgt, 3, (RVSD, RVSD, RVSD),           vsel),
18594   nUF(vmaxnm, _vmaxnm, 3, (RNSDQ, oRNSDQ, RNSDQ),       vmaxnm),
18595   nUF(vminnm, _vminnm, 3, (RNSDQ, oRNSDQ, RNSDQ),       vmaxnm),
18596   nUF(vcvta,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvta),
18597   nUF(vcvtn,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtn),
18598   nUF(vcvtp,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtp),
18599   nUF(vcvtm,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtm),
18600   nCE(vrintr, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintr),
18601   nCE(vrintz, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintz),
18602   nCE(vrintx, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintx),
18603   nUF(vrinta, _vrinta, 2, (RNSDQ, oRNSDQ),              vrinta),
18604   nUF(vrintn, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintn),
18605   nUF(vrintp, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintp),
18606   nUF(vrintm, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintm),
18607
18608   /* Crypto v1 extensions.  */
18609 #undef  ARM_VARIANT
18610 #define ARM_VARIANT & fpu_crypto_ext_armv8
18611 #undef  THUMB_VARIANT
18612 #define THUMB_VARIANT & fpu_crypto_ext_armv8
18613
18614   nUF(aese, _aes, 2, (RNQ, RNQ), aese),
18615   nUF(aesd, _aes, 2, (RNQ, RNQ), aesd),
18616   nUF(aesmc, _aes, 2, (RNQ, RNQ), aesmc),
18617   nUF(aesimc, _aes, 2, (RNQ, RNQ), aesimc),
18618   nUF(sha1c, _sha3op, 3, (RNQ, RNQ, RNQ), sha1c),
18619   nUF(sha1p, _sha3op, 3, (RNQ, RNQ, RNQ), sha1p),
18620   nUF(sha1m, _sha3op, 3, (RNQ, RNQ, RNQ), sha1m),
18621   nUF(sha1su0, _sha3op, 3, (RNQ, RNQ, RNQ), sha1su0),
18622   nUF(sha256h, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h),
18623   nUF(sha256h2, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h2),
18624   nUF(sha256su1, _sha3op, 3, (RNQ, RNQ, RNQ), sha256su1),
18625   nUF(sha1h, _sha1h, 2, (RNQ, RNQ), sha1h),
18626   nUF(sha1su1, _sha2op, 2, (RNQ, RNQ), sha1su1),
18627   nUF(sha256su0, _sha2op, 2, (RNQ, RNQ), sha256su0),
18628
18629 #undef  ARM_VARIANT
18630 #define ARM_VARIANT   & crc_ext_armv8
18631 #undef  THUMB_VARIANT
18632 #define THUMB_VARIANT & crc_ext_armv8
18633   TUEc("crc32b", 1000040, fac0f080, 3, (RR, oRR, RR), crc32b),
18634   TUEc("crc32h", 1200040, fac0f090, 3, (RR, oRR, RR), crc32h),
18635   TUEc("crc32w", 1400040, fac0f0a0, 3, (RR, oRR, RR), crc32w),
18636   TUEc("crc32cb",1000240, fad0f080, 3, (RR, oRR, RR), crc32cb),
18637   TUEc("crc32ch",1200240, fad0f090, 3, (RR, oRR, RR), crc32ch),
18638   TUEc("crc32cw",1400240, fad0f0a0, 3, (RR, oRR, RR), crc32cw),
18639
18640 #undef  ARM_VARIANT
18641 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
18642 #undef  THUMB_VARIANT
18643 #define THUMB_VARIANT NULL
18644
18645  cCE("wfs",     e200110, 1, (RR),            rd),
18646  cCE("rfs",     e300110, 1, (RR),            rd),
18647  cCE("wfc",     e400110, 1, (RR),            rd),
18648  cCE("rfc",     e500110, 1, (RR),            rd),
18649
18650  cCL("ldfs",    c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18651  cCL("ldfd",    c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18652  cCL("ldfe",    c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18653  cCL("ldfp",    c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18654
18655  cCL("stfs",    c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18656  cCL("stfd",    c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18657  cCL("stfe",    c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18658  cCL("stfp",    c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18659
18660  cCL("mvfs",    e008100, 2, (RF, RF_IF),     rd_rm),
18661  cCL("mvfsp",   e008120, 2, (RF, RF_IF),     rd_rm),
18662  cCL("mvfsm",   e008140, 2, (RF, RF_IF),     rd_rm),
18663  cCL("mvfsz",   e008160, 2, (RF, RF_IF),     rd_rm),
18664  cCL("mvfd",    e008180, 2, (RF, RF_IF),     rd_rm),
18665  cCL("mvfdp",   e0081a0, 2, (RF, RF_IF),     rd_rm),
18666  cCL("mvfdm",   e0081c0, 2, (RF, RF_IF),     rd_rm),
18667  cCL("mvfdz",   e0081e0, 2, (RF, RF_IF),     rd_rm),
18668  cCL("mvfe",    e088100, 2, (RF, RF_IF),     rd_rm),
18669  cCL("mvfep",   e088120, 2, (RF, RF_IF),     rd_rm),
18670  cCL("mvfem",   e088140, 2, (RF, RF_IF),     rd_rm),
18671  cCL("mvfez",   e088160, 2, (RF, RF_IF),     rd_rm),
18672
18673  cCL("mnfs",    e108100, 2, (RF, RF_IF),     rd_rm),
18674  cCL("mnfsp",   e108120, 2, (RF, RF_IF),     rd_rm),
18675  cCL("mnfsm",   e108140, 2, (RF, RF_IF),     rd_rm),
18676  cCL("mnfsz",   e108160, 2, (RF, RF_IF),     rd_rm),
18677  cCL("mnfd",    e108180, 2, (RF, RF_IF),     rd_rm),
18678  cCL("mnfdp",   e1081a0, 2, (RF, RF_IF),     rd_rm),
18679  cCL("mnfdm",   e1081c0, 2, (RF, RF_IF),     rd_rm),
18680  cCL("mnfdz",   e1081e0, 2, (RF, RF_IF),     rd_rm),
18681  cCL("mnfe",    e188100, 2, (RF, RF_IF),     rd_rm),
18682  cCL("mnfep",   e188120, 2, (RF, RF_IF),     rd_rm),
18683  cCL("mnfem",   e188140, 2, (RF, RF_IF),     rd_rm),
18684  cCL("mnfez",   e188160, 2, (RF, RF_IF),     rd_rm),
18685
18686  cCL("abss",    e208100, 2, (RF, RF_IF),     rd_rm),
18687  cCL("abssp",   e208120, 2, (RF, RF_IF),     rd_rm),
18688  cCL("abssm",   e208140, 2, (RF, RF_IF),     rd_rm),
18689  cCL("abssz",   e208160, 2, (RF, RF_IF),     rd_rm),
18690  cCL("absd",    e208180, 2, (RF, RF_IF),     rd_rm),
18691  cCL("absdp",   e2081a0, 2, (RF, RF_IF),     rd_rm),
18692  cCL("absdm",   e2081c0, 2, (RF, RF_IF),     rd_rm),
18693  cCL("absdz",   e2081e0, 2, (RF, RF_IF),     rd_rm),
18694  cCL("abse",    e288100, 2, (RF, RF_IF),     rd_rm),
18695  cCL("absep",   e288120, 2, (RF, RF_IF),     rd_rm),
18696  cCL("absem",   e288140, 2, (RF, RF_IF),     rd_rm),
18697  cCL("absez",   e288160, 2, (RF, RF_IF),     rd_rm),
18698
18699  cCL("rnds",    e308100, 2, (RF, RF_IF),     rd_rm),
18700  cCL("rndsp",   e308120, 2, (RF, RF_IF),     rd_rm),
18701  cCL("rndsm",   e308140, 2, (RF, RF_IF),     rd_rm),
18702  cCL("rndsz",   e308160, 2, (RF, RF_IF),     rd_rm),
18703  cCL("rndd",    e308180, 2, (RF, RF_IF),     rd_rm),
18704  cCL("rnddp",   e3081a0, 2, (RF, RF_IF),     rd_rm),
18705  cCL("rnddm",   e3081c0, 2, (RF, RF_IF),     rd_rm),
18706  cCL("rnddz",   e3081e0, 2, (RF, RF_IF),     rd_rm),
18707  cCL("rnde",    e388100, 2, (RF, RF_IF),     rd_rm),
18708  cCL("rndep",   e388120, 2, (RF, RF_IF),     rd_rm),
18709  cCL("rndem",   e388140, 2, (RF, RF_IF),     rd_rm),
18710  cCL("rndez",   e388160, 2, (RF, RF_IF),     rd_rm),
18711
18712  cCL("sqts",    e408100, 2, (RF, RF_IF),     rd_rm),
18713  cCL("sqtsp",   e408120, 2, (RF, RF_IF),     rd_rm),
18714  cCL("sqtsm",   e408140, 2, (RF, RF_IF),     rd_rm),
18715  cCL("sqtsz",   e408160, 2, (RF, RF_IF),     rd_rm),
18716  cCL("sqtd",    e408180, 2, (RF, RF_IF),     rd_rm),
18717  cCL("sqtdp",   e4081a0, 2, (RF, RF_IF),     rd_rm),
18718  cCL("sqtdm",   e4081c0, 2, (RF, RF_IF),     rd_rm),
18719  cCL("sqtdz",   e4081e0, 2, (RF, RF_IF),     rd_rm),
18720  cCL("sqte",    e488100, 2, (RF, RF_IF),     rd_rm),
18721  cCL("sqtep",   e488120, 2, (RF, RF_IF),     rd_rm),
18722  cCL("sqtem",   e488140, 2, (RF, RF_IF),     rd_rm),
18723  cCL("sqtez",   e488160, 2, (RF, RF_IF),     rd_rm),
18724
18725  cCL("logs",    e508100, 2, (RF, RF_IF),     rd_rm),
18726  cCL("logsp",   e508120, 2, (RF, RF_IF),     rd_rm),
18727  cCL("logsm",   e508140, 2, (RF, RF_IF),     rd_rm),
18728  cCL("logsz",   e508160, 2, (RF, RF_IF),     rd_rm),
18729  cCL("logd",    e508180, 2, (RF, RF_IF),     rd_rm),
18730  cCL("logdp",   e5081a0, 2, (RF, RF_IF),     rd_rm),
18731  cCL("logdm",   e5081c0, 2, (RF, RF_IF),     rd_rm),
18732  cCL("logdz",   e5081e0, 2, (RF, RF_IF),     rd_rm),
18733  cCL("loge",    e588100, 2, (RF, RF_IF),     rd_rm),
18734  cCL("logep",   e588120, 2, (RF, RF_IF),     rd_rm),
18735  cCL("logem",   e588140, 2, (RF, RF_IF),     rd_rm),
18736  cCL("logez",   e588160, 2, (RF, RF_IF),     rd_rm),
18737
18738  cCL("lgns",    e608100, 2, (RF, RF_IF),     rd_rm),
18739  cCL("lgnsp",   e608120, 2, (RF, RF_IF),     rd_rm),
18740  cCL("lgnsm",   e608140, 2, (RF, RF_IF),     rd_rm),
18741  cCL("lgnsz",   e608160, 2, (RF, RF_IF),     rd_rm),
18742  cCL("lgnd",    e608180, 2, (RF, RF_IF),     rd_rm),
18743  cCL("lgndp",   e6081a0, 2, (RF, RF_IF),     rd_rm),
18744  cCL("lgndm",   e6081c0, 2, (RF, RF_IF),     rd_rm),
18745  cCL("lgndz",   e6081e0, 2, (RF, RF_IF),     rd_rm),
18746  cCL("lgne",    e688100, 2, (RF, RF_IF),     rd_rm),
18747  cCL("lgnep",   e688120, 2, (RF, RF_IF),     rd_rm),
18748  cCL("lgnem",   e688140, 2, (RF, RF_IF),     rd_rm),
18749  cCL("lgnez",   e688160, 2, (RF, RF_IF),     rd_rm),
18750
18751  cCL("exps",    e708100, 2, (RF, RF_IF),     rd_rm),
18752  cCL("expsp",   e708120, 2, (RF, RF_IF),     rd_rm),
18753  cCL("expsm",   e708140, 2, (RF, RF_IF),     rd_rm),
18754  cCL("expsz",   e708160, 2, (RF, RF_IF),     rd_rm),
18755  cCL("expd",    e708180, 2, (RF, RF_IF),     rd_rm),
18756  cCL("expdp",   e7081a0, 2, (RF, RF_IF),     rd_rm),
18757  cCL("expdm",   e7081c0, 2, (RF, RF_IF),     rd_rm),
18758  cCL("expdz",   e7081e0, 2, (RF, RF_IF),     rd_rm),
18759  cCL("expe",    e788100, 2, (RF, RF_IF),     rd_rm),
18760  cCL("expep",   e788120, 2, (RF, RF_IF),     rd_rm),
18761  cCL("expem",   e788140, 2, (RF, RF_IF),     rd_rm),
18762  cCL("expdz",   e788160, 2, (RF, RF_IF),     rd_rm),
18763
18764  cCL("sins",    e808100, 2, (RF, RF_IF),     rd_rm),
18765  cCL("sinsp",   e808120, 2, (RF, RF_IF),     rd_rm),
18766  cCL("sinsm",   e808140, 2, (RF, RF_IF),     rd_rm),
18767  cCL("sinsz",   e808160, 2, (RF, RF_IF),     rd_rm),
18768  cCL("sind",    e808180, 2, (RF, RF_IF),     rd_rm),
18769  cCL("sindp",   e8081a0, 2, (RF, RF_IF),     rd_rm),
18770  cCL("sindm",   e8081c0, 2, (RF, RF_IF),     rd_rm),
18771  cCL("sindz",   e8081e0, 2, (RF, RF_IF),     rd_rm),
18772  cCL("sine",    e888100, 2, (RF, RF_IF),     rd_rm),
18773  cCL("sinep",   e888120, 2, (RF, RF_IF),     rd_rm),
18774  cCL("sinem",   e888140, 2, (RF, RF_IF),     rd_rm),
18775  cCL("sinez",   e888160, 2, (RF, RF_IF),     rd_rm),
18776
18777  cCL("coss",    e908100, 2, (RF, RF_IF),     rd_rm),
18778  cCL("cossp",   e908120, 2, (RF, RF_IF),     rd_rm),
18779  cCL("cossm",   e908140, 2, (RF, RF_IF),     rd_rm),
18780  cCL("cossz",   e908160, 2, (RF, RF_IF),     rd_rm),
18781  cCL("cosd",    e908180, 2, (RF, RF_IF),     rd_rm),
18782  cCL("cosdp",   e9081a0, 2, (RF, RF_IF),     rd_rm),
18783  cCL("cosdm",   e9081c0, 2, (RF, RF_IF),     rd_rm),
18784  cCL("cosdz",   e9081e0, 2, (RF, RF_IF),     rd_rm),
18785  cCL("cose",    e988100, 2, (RF, RF_IF),     rd_rm),
18786  cCL("cosep",   e988120, 2, (RF, RF_IF),     rd_rm),
18787  cCL("cosem",   e988140, 2, (RF, RF_IF),     rd_rm),
18788  cCL("cosez",   e988160, 2, (RF, RF_IF),     rd_rm),
18789
18790  cCL("tans",    ea08100, 2, (RF, RF_IF),     rd_rm),
18791  cCL("tansp",   ea08120, 2, (RF, RF_IF),     rd_rm),
18792  cCL("tansm",   ea08140, 2, (RF, RF_IF),     rd_rm),
18793  cCL("tansz",   ea08160, 2, (RF, RF_IF),     rd_rm),
18794  cCL("tand",    ea08180, 2, (RF, RF_IF),     rd_rm),
18795  cCL("tandp",   ea081a0, 2, (RF, RF_IF),     rd_rm),
18796  cCL("tandm",   ea081c0, 2, (RF, RF_IF),     rd_rm),
18797  cCL("tandz",   ea081e0, 2, (RF, RF_IF),     rd_rm),
18798  cCL("tane",    ea88100, 2, (RF, RF_IF),     rd_rm),
18799  cCL("tanep",   ea88120, 2, (RF, RF_IF),     rd_rm),
18800  cCL("tanem",   ea88140, 2, (RF, RF_IF),     rd_rm),
18801  cCL("tanez",   ea88160, 2, (RF, RF_IF),     rd_rm),
18802
18803  cCL("asns",    eb08100, 2, (RF, RF_IF),     rd_rm),
18804  cCL("asnsp",   eb08120, 2, (RF, RF_IF),     rd_rm),
18805  cCL("asnsm",   eb08140, 2, (RF, RF_IF),     rd_rm),
18806  cCL("asnsz",   eb08160, 2, (RF, RF_IF),     rd_rm),
18807  cCL("asnd",    eb08180, 2, (RF, RF_IF),     rd_rm),
18808  cCL("asndp",   eb081a0, 2, (RF, RF_IF),     rd_rm),
18809  cCL("asndm",   eb081c0, 2, (RF, RF_IF),     rd_rm),
18810  cCL("asndz",   eb081e0, 2, (RF, RF_IF),     rd_rm),
18811  cCL("asne",    eb88100, 2, (RF, RF_IF),     rd_rm),
18812  cCL("asnep",   eb88120, 2, (RF, RF_IF),     rd_rm),
18813  cCL("asnem",   eb88140, 2, (RF, RF_IF),     rd_rm),
18814  cCL("asnez",   eb88160, 2, (RF, RF_IF),     rd_rm),
18815
18816  cCL("acss",    ec08100, 2, (RF, RF_IF),     rd_rm),
18817  cCL("acssp",   ec08120, 2, (RF, RF_IF),     rd_rm),
18818  cCL("acssm",   ec08140, 2, (RF, RF_IF),     rd_rm),
18819  cCL("acssz",   ec08160, 2, (RF, RF_IF),     rd_rm),
18820  cCL("acsd",    ec08180, 2, (RF, RF_IF),     rd_rm),
18821  cCL("acsdp",   ec081a0, 2, (RF, RF_IF),     rd_rm),
18822  cCL("acsdm",   ec081c0, 2, (RF, RF_IF),     rd_rm),
18823  cCL("acsdz",   ec081e0, 2, (RF, RF_IF),     rd_rm),
18824  cCL("acse",    ec88100, 2, (RF, RF_IF),     rd_rm),
18825  cCL("acsep",   ec88120, 2, (RF, RF_IF),     rd_rm),
18826  cCL("acsem",   ec88140, 2, (RF, RF_IF),     rd_rm),
18827  cCL("acsez",   ec88160, 2, (RF, RF_IF),     rd_rm),
18828
18829  cCL("atns",    ed08100, 2, (RF, RF_IF),     rd_rm),
18830  cCL("atnsp",   ed08120, 2, (RF, RF_IF),     rd_rm),
18831  cCL("atnsm",   ed08140, 2, (RF, RF_IF),     rd_rm),
18832  cCL("atnsz",   ed08160, 2, (RF, RF_IF),     rd_rm),
18833  cCL("atnd",    ed08180, 2, (RF, RF_IF),     rd_rm),
18834  cCL("atndp",   ed081a0, 2, (RF, RF_IF),     rd_rm),
18835  cCL("atndm",   ed081c0, 2, (RF, RF_IF),     rd_rm),
18836  cCL("atndz",   ed081e0, 2, (RF, RF_IF),     rd_rm),
18837  cCL("atne",    ed88100, 2, (RF, RF_IF),     rd_rm),
18838  cCL("atnep",   ed88120, 2, (RF, RF_IF),     rd_rm),
18839  cCL("atnem",   ed88140, 2, (RF, RF_IF),     rd_rm),
18840  cCL("atnez",   ed88160, 2, (RF, RF_IF),     rd_rm),
18841
18842  cCL("urds",    ee08100, 2, (RF, RF_IF),     rd_rm),
18843  cCL("urdsp",   ee08120, 2, (RF, RF_IF),     rd_rm),
18844  cCL("urdsm",   ee08140, 2, (RF, RF_IF),     rd_rm),
18845  cCL("urdsz",   ee08160, 2, (RF, RF_IF),     rd_rm),
18846  cCL("urdd",    ee08180, 2, (RF, RF_IF),     rd_rm),
18847  cCL("urddp",   ee081a0, 2, (RF, RF_IF),     rd_rm),
18848  cCL("urddm",   ee081c0, 2, (RF, RF_IF),     rd_rm),
18849  cCL("urddz",   ee081e0, 2, (RF, RF_IF),     rd_rm),
18850  cCL("urde",    ee88100, 2, (RF, RF_IF),     rd_rm),
18851  cCL("urdep",   ee88120, 2, (RF, RF_IF),     rd_rm),
18852  cCL("urdem",   ee88140, 2, (RF, RF_IF),     rd_rm),
18853  cCL("urdez",   ee88160, 2, (RF, RF_IF),     rd_rm),
18854
18855  cCL("nrms",    ef08100, 2, (RF, RF_IF),     rd_rm),
18856  cCL("nrmsp",   ef08120, 2, (RF, RF_IF),     rd_rm),
18857  cCL("nrmsm",   ef08140, 2, (RF, RF_IF),     rd_rm),
18858  cCL("nrmsz",   ef08160, 2, (RF, RF_IF),     rd_rm),
18859  cCL("nrmd",    ef08180, 2, (RF, RF_IF),     rd_rm),
18860  cCL("nrmdp",   ef081a0, 2, (RF, RF_IF),     rd_rm),
18861  cCL("nrmdm",   ef081c0, 2, (RF, RF_IF),     rd_rm),
18862  cCL("nrmdz",   ef081e0, 2, (RF, RF_IF),     rd_rm),
18863  cCL("nrme",    ef88100, 2, (RF, RF_IF),     rd_rm),
18864  cCL("nrmep",   ef88120, 2, (RF, RF_IF),     rd_rm),
18865  cCL("nrmem",   ef88140, 2, (RF, RF_IF),     rd_rm),
18866  cCL("nrmez",   ef88160, 2, (RF, RF_IF),     rd_rm),
18867
18868  cCL("adfs",    e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
18869  cCL("adfsp",   e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
18870  cCL("adfsm",   e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
18871  cCL("adfsz",   e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
18872  cCL("adfd",    e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
18873  cCL("adfdp",   e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18874  cCL("adfdm",   e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18875  cCL("adfdz",   e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18876  cCL("adfe",    e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
18877  cCL("adfep",   e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
18878  cCL("adfem",   e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
18879  cCL("adfez",   e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
18880
18881  cCL("sufs",    e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
18882  cCL("sufsp",   e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
18883  cCL("sufsm",   e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
18884  cCL("sufsz",   e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
18885  cCL("sufd",    e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
18886  cCL("sufdp",   e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18887  cCL("sufdm",   e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18888  cCL("sufdz",   e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18889  cCL("sufe",    e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
18890  cCL("sufep",   e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
18891  cCL("sufem",   e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
18892  cCL("sufez",   e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
18893
18894  cCL("rsfs",    e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
18895  cCL("rsfsp",   e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
18896  cCL("rsfsm",   e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
18897  cCL("rsfsz",   e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
18898  cCL("rsfd",    e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
18899  cCL("rsfdp",   e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18900  cCL("rsfdm",   e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18901  cCL("rsfdz",   e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18902  cCL("rsfe",    e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
18903  cCL("rsfep",   e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
18904  cCL("rsfem",   e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
18905  cCL("rsfez",   e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
18906
18907  cCL("mufs",    e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
18908  cCL("mufsp",   e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
18909  cCL("mufsm",   e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
18910  cCL("mufsz",   e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
18911  cCL("mufd",    e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
18912  cCL("mufdp",   e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18913  cCL("mufdm",   e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18914  cCL("mufdz",   e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18915  cCL("mufe",    e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
18916  cCL("mufep",   e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
18917  cCL("mufem",   e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
18918  cCL("mufez",   e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
18919
18920  cCL("dvfs",    e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
18921  cCL("dvfsp",   e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
18922  cCL("dvfsm",   e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
18923  cCL("dvfsz",   e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
18924  cCL("dvfd",    e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
18925  cCL("dvfdp",   e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18926  cCL("dvfdm",   e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18927  cCL("dvfdz",   e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18928  cCL("dvfe",    e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
18929  cCL("dvfep",   e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
18930  cCL("dvfem",   e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
18931  cCL("dvfez",   e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
18932
18933  cCL("rdfs",    e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
18934  cCL("rdfsp",   e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
18935  cCL("rdfsm",   e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
18936  cCL("rdfsz",   e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
18937  cCL("rdfd",    e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
18938  cCL("rdfdp",   e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18939  cCL("rdfdm",   e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18940  cCL("rdfdz",   e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18941  cCL("rdfe",    e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
18942  cCL("rdfep",   e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
18943  cCL("rdfem",   e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
18944  cCL("rdfez",   e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
18945
18946  cCL("pows",    e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
18947  cCL("powsp",   e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
18948  cCL("powsm",   e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
18949  cCL("powsz",   e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
18950  cCL("powd",    e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
18951  cCL("powdp",   e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18952  cCL("powdm",   e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18953  cCL("powdz",   e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18954  cCL("powe",    e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
18955  cCL("powep",   e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
18956  cCL("powem",   e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
18957  cCL("powez",   e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
18958
18959  cCL("rpws",    e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
18960  cCL("rpwsp",   e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
18961  cCL("rpwsm",   e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
18962  cCL("rpwsz",   e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
18963  cCL("rpwd",    e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
18964  cCL("rpwdp",   e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18965  cCL("rpwdm",   e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18966  cCL("rpwdz",   e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18967  cCL("rpwe",    e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
18968  cCL("rpwep",   e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
18969  cCL("rpwem",   e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
18970  cCL("rpwez",   e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
18971
18972  cCL("rmfs",    e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
18973  cCL("rmfsp",   e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
18974  cCL("rmfsm",   e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
18975  cCL("rmfsz",   e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
18976  cCL("rmfd",    e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
18977  cCL("rmfdp",   e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18978  cCL("rmfdm",   e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18979  cCL("rmfdz",   e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18980  cCL("rmfe",    e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
18981  cCL("rmfep",   e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
18982  cCL("rmfem",   e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
18983  cCL("rmfez",   e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
18984
18985  cCL("fmls",    e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
18986  cCL("fmlsp",   e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
18987  cCL("fmlsm",   e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
18988  cCL("fmlsz",   e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
18989  cCL("fmld",    e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
18990  cCL("fmldp",   e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18991  cCL("fmldm",   e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18992  cCL("fmldz",   e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18993  cCL("fmle",    e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
18994  cCL("fmlep",   e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
18995  cCL("fmlem",   e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
18996  cCL("fmlez",   e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
18997
18998  cCL("fdvs",    ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18999  cCL("fdvsp",   ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19000  cCL("fdvsm",   ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19001  cCL("fdvsz",   ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19002  cCL("fdvd",    ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19003  cCL("fdvdp",   ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19004  cCL("fdvdm",   ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19005  cCL("fdvdz",   ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19006  cCL("fdve",    ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19007  cCL("fdvep",   ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19008  cCL("fdvem",   ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19009  cCL("fdvez",   ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19010
19011  cCL("frds",    eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19012  cCL("frdsp",   eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19013  cCL("frdsm",   eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19014  cCL("frdsz",   eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19015  cCL("frdd",    eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19016  cCL("frddp",   eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19017  cCL("frddm",   eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19018  cCL("frddz",   eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19019  cCL("frde",    eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19020  cCL("frdep",   eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19021  cCL("frdem",   eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19022  cCL("frdez",   eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19023
19024  cCL("pols",    ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19025  cCL("polsp",   ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19026  cCL("polsm",   ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19027  cCL("polsz",   ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19028  cCL("pold",    ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19029  cCL("poldp",   ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19030  cCL("poldm",   ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19031  cCL("poldz",   ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19032  cCL("pole",    ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19033  cCL("polep",   ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19034  cCL("polem",   ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19035  cCL("polez",   ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19036
19037  cCE("cmf",     e90f110, 2, (RF, RF_IF),     fpa_cmp),
19038  C3E("cmfe",    ed0f110, 2, (RF, RF_IF),     fpa_cmp),
19039  cCE("cnf",     eb0f110, 2, (RF, RF_IF),     fpa_cmp),
19040  C3E("cnfe",    ef0f110, 2, (RF, RF_IF),     fpa_cmp),
19041
19042  cCL("flts",    e000110, 2, (RF, RR),        rn_rd),
19043  cCL("fltsp",   e000130, 2, (RF, RR),        rn_rd),
19044  cCL("fltsm",   e000150, 2, (RF, RR),        rn_rd),
19045  cCL("fltsz",   e000170, 2, (RF, RR),        rn_rd),
19046  cCL("fltd",    e000190, 2, (RF, RR),        rn_rd),
19047  cCL("fltdp",   e0001b0, 2, (RF, RR),        rn_rd),
19048  cCL("fltdm",   e0001d0, 2, (RF, RR),        rn_rd),
19049  cCL("fltdz",   e0001f0, 2, (RF, RR),        rn_rd),
19050  cCL("flte",    e080110, 2, (RF, RR),        rn_rd),
19051  cCL("fltep",   e080130, 2, (RF, RR),        rn_rd),
19052  cCL("fltem",   e080150, 2, (RF, RR),        rn_rd),
19053  cCL("fltez",   e080170, 2, (RF, RR),        rn_rd),
19054
19055   /* The implementation of the FIX instruction is broken on some
19056      assemblers, in that it accepts a precision specifier as well as a
19057      rounding specifier, despite the fact that this is meaningless.
19058      To be more compatible, we accept it as well, though of course it
19059      does not set any bits.  */
19060  cCE("fix",     e100110, 2, (RR, RF),        rd_rm),
19061  cCL("fixp",    e100130, 2, (RR, RF),        rd_rm),
19062  cCL("fixm",    e100150, 2, (RR, RF),        rd_rm),
19063  cCL("fixz",    e100170, 2, (RR, RF),        rd_rm),
19064  cCL("fixsp",   e100130, 2, (RR, RF),        rd_rm),
19065  cCL("fixsm",   e100150, 2, (RR, RF),        rd_rm),
19066  cCL("fixsz",   e100170, 2, (RR, RF),        rd_rm),
19067  cCL("fixdp",   e100130, 2, (RR, RF),        rd_rm),
19068  cCL("fixdm",   e100150, 2, (RR, RF),        rd_rm),
19069  cCL("fixdz",   e100170, 2, (RR, RF),        rd_rm),
19070  cCL("fixep",   e100130, 2, (RR, RF),        rd_rm),
19071  cCL("fixem",   e100150, 2, (RR, RF),        rd_rm),
19072  cCL("fixez",   e100170, 2, (RR, RF),        rd_rm),
19073
19074   /* Instructions that were new with the real FPA, call them V2.  */
19075 #undef  ARM_VARIANT
19076 #define ARM_VARIANT  & fpu_fpa_ext_v2
19077
19078  cCE("lfm",     c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19079  cCL("lfmfd",   c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19080  cCL("lfmea",   d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19081  cCE("sfm",     c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19082  cCL("sfmfd",   d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19083  cCL("sfmea",   c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19084
19085 #undef  ARM_VARIANT
19086 #define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
19087
19088   /* Moves and type conversions.  */
19089  cCE("fcpys",   eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
19090  cCE("fmrs",    e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
19091  cCE("fmsr",    e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
19092  cCE("fmstat",  ef1fa10, 0, (),               noargs),
19093  cCE("vmrs",    ef00a10, 2, (APSR_RR, RVC),   vmrs),
19094  cCE("vmsr",    ee00a10, 2, (RVC, RR),        vmsr),
19095  cCE("fsitos",  eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19096  cCE("fuitos",  eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
19097  cCE("ftosis",  ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
19098  cCE("ftosizs", ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19099  cCE("ftouis",  ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
19100  cCE("ftouizs", ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19101  cCE("fmrx",    ef00a10, 2, (RR, RVC),        rd_rn),
19102  cCE("fmxr",    ee00a10, 2, (RVC, RR),        rn_rd),
19103
19104   /* Memory operations.  */
19105  cCE("flds",    d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
19106  cCE("fsts",    d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
19107  cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19108  cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19109  cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19110  cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19111  cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19112  cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19113  cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19114  cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19115  cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19116  cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19117  cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19118  cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19119  cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19120  cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19121  cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19122  cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19123
19124   /* Monadic operations.  */
19125  cCE("fabss",   eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19126  cCE("fnegs",   eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
19127  cCE("fsqrts",  eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19128
19129   /* Dyadic operations.  */
19130  cCE("fadds",   e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19131  cCE("fsubs",   e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19132  cCE("fmuls",   e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19133  cCE("fdivs",   e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19134  cCE("fmacs",   e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19135  cCE("fmscs",   e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19136  cCE("fnmuls",  e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19137  cCE("fnmacs",  e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19138  cCE("fnmscs",  e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19139
19140   /* Comparisons.  */
19141  cCE("fcmps",   eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
19142  cCE("fcmpzs",  eb50a40, 1, (RVS),            vfp_sp_compare_z),
19143  cCE("fcmpes",  eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19144  cCE("fcmpezs", eb50ac0, 1, (RVS),            vfp_sp_compare_z),
19145
19146  /* Double precision load/store are still present on single precision
19147     implementations.  */
19148  cCE("fldd",    d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
19149  cCE("fstd",    d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
19150  cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19151  cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19152  cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19153  cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19154  cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19155  cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19156  cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19157  cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19158
19159 #undef  ARM_VARIANT
19160 #define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
19161
19162   /* Moves and type conversions.  */
19163  cCE("fcpyd",   eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19164  cCE("fcvtds",  eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19165  cCE("fcvtsd",  eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19166  cCE("fmdhr",   e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
19167  cCE("fmdlr",   e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
19168  cCE("fmrdh",   e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
19169  cCE("fmrdl",   e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
19170  cCE("fsitod",  eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19171  cCE("fuitod",  eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19172  cCE("ftosid",  ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19173  cCE("ftosizd", ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19174  cCE("ftouid",  ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19175  cCE("ftouizd", ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19176
19177   /* Monadic operations.  */
19178  cCE("fabsd",   eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19179  cCE("fnegd",   eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19180  cCE("fsqrtd",  eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19181
19182   /* Dyadic operations.  */
19183  cCE("faddd",   e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19184  cCE("fsubd",   e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19185  cCE("fmuld",   e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19186  cCE("fdivd",   e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19187  cCE("fmacd",   e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19188  cCE("fmscd",   e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19189  cCE("fnmuld",  e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19190  cCE("fnmacd",  e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19191  cCE("fnmscd",  e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19192
19193   /* Comparisons.  */
19194  cCE("fcmpd",   eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19195  cCE("fcmpzd",  eb50b40, 1, (RVD),            vfp_dp_rd),
19196  cCE("fcmped",  eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19197  cCE("fcmpezd", eb50bc0, 1, (RVD),            vfp_dp_rd),
19198
19199 #undef  ARM_VARIANT
19200 #define ARM_VARIANT  & fpu_vfp_ext_v2
19201
19202  cCE("fmsrr",   c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
19203  cCE("fmrrs",   c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
19204  cCE("fmdrr",   c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
19205  cCE("fmrrd",   c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
19206
19207 /* Instructions which may belong to either the Neon or VFP instruction sets.
19208    Individual encoder functions perform additional architecture checks.  */
19209 #undef  ARM_VARIANT
19210 #define ARM_VARIANT    & fpu_vfp_ext_v1xd
19211 #undef  THUMB_VARIANT
19212 #define THUMB_VARIANT  & fpu_vfp_ext_v1xd
19213
19214   /* These mnemonics are unique to VFP.  */
19215  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
19216  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
19217  nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19218  nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19219  nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19220  nCE(vcmp,      _vcmp,    2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
19221  nCE(vcmpe,     _vcmpe,   2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
19222  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
19223  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
19224  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
19225
19226   /* Mnemonics shared by Neon and VFP.  */
19227  nCEF(vmul,     _vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
19228  nCEF(vmla,     _vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
19229  nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
19230
19231  nCEF(vadd,     _vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
19232  nCEF(vsub,     _vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
19233
19234  NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19235  NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19236
19237  NCE(vldm,      c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19238  NCE(vldmia,    c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19239  NCE(vldmdb,    d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19240  NCE(vstm,      c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19241  NCE(vstmia,    c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19242  NCE(vstmdb,    d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19243  NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
19244  NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
19245
19246  nCEF(vcvt,     _vcvt,   3, (RNSDQ, RNSDQ, oI32z), neon_cvt),
19247  nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
19248  NCEF(vcvtb,    eb20a40, 2, (RVSD, RVSD), neon_cvtb),
19249  NCEF(vcvtt,    eb20a40, 2, (RVSD, RVSD), neon_cvtt),
19250
19251
19252   /* NOTE: All VMOV encoding is special-cased!  */
19253  NCE(vmov,      0,       1, (VMOV), neon_mov),
19254  NCE(vmovq,     0,       1, (VMOV), neon_mov),
19255
19256 #undef  THUMB_VARIANT
19257 #define THUMB_VARIANT  & fpu_neon_ext_v1
19258 #undef  ARM_VARIANT
19259 #define ARM_VARIANT    & fpu_neon_ext_v1
19260
19261   /* Data processing with three registers of the same length.  */
19262   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
19263  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
19264  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
19265  NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19266  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19267  NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19268  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19269  NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19270  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19271   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
19272  NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19273  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
19274  NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19275  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
19276  NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19277  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
19278  NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19279  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
19280   /* If not immediate, fall back to neon_dyadic_i64_su.
19281      shl_imm should accept I8 I16 I32 I64,
19282      qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
19283  nUF(vshl,      _vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
19284  nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
19285  nUF(vqshl,     _vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
19286  nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
19287   /* Logic ops, types optional & ignored.  */
19288  nUF(vand,      _vand,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19289  nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19290  nUF(vbic,      _vbic,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19291  nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19292  nUF(vorr,      _vorr,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19293  nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19294  nUF(vorn,      _vorn,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19295  nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19296  nUF(veor,      _veor,    3, (RNDQ, oRNDQ, RNDQ),      neon_logic),
19297  nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
19298   /* Bitfield ops, untyped.  */
19299  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19300  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19301  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19302  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19303  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19304  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19305   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32.  */
19306  nUF(vabd,      _vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19307  nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19308  nUF(vmax,      _vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19309  nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19310  nUF(vmin,      _vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19311  nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19312   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
19313      back to neon_dyadic_if_su.  */
19314  nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19315  nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
19316  nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19317  nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
19318  nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19319  nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
19320  nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19321  nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
19322   /* Comparison. Type I8 I16 I32 F32.  */
19323  nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
19324  nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
19325   /* As above, D registers only.  */
19326  nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
19327  nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
19328   /* Int and float variants, signedness unimportant.  */
19329  nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
19330  nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
19331  nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
19332   /* Add/sub take types I8 I16 I32 I64 F32.  */
19333  nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
19334  nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
19335   /* vtst takes sizes 8, 16, 32.  */
19336  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
19337  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
19338   /* VMUL takes I8 I16 I32 F32 P8.  */
19339  nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
19340   /* VQD{R}MULH takes S16 S32.  */
19341  nUF(vqdmulh,   _vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19342  nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
19343  nUF(vqrdmulh,  _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19344  nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
19345  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19346  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
19347  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19348  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
19349  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19350  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
19351  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19352  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
19353  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
19354  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
19355  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
19356  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
19357
19358   /* Two address, int/float. Types S8 S16 S32 F32.  */
19359  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
19360  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
19361
19362   /* Data processing with two registers and a shift amount.  */
19363   /* Right shifts, and variants with rounding.
19364      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
19365  NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19366  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
19367  NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19368  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
19369  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
19370  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
19371  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
19372  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
19373   /* Shift and insert. Sizes accepted 8 16 32 64.  */
19374  NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
19375  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
19376  NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
19377  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
19378   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
19379  NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
19380  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
19381   /* Right shift immediate, saturating & narrowing, with rounding variants.
19382      Types accepted S16 S32 S64 U16 U32 U64.  */
19383  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19384  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19385   /* As above, unsigned. Types accepted S16 S32 S64.  */
19386  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19387  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19388   /* Right shift narrowing. Types accepted I16 I32 I64.  */
19389  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19390  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19391   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
19392  nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
19393   /* CVT with optional immediate for fixed-point variant.  */
19394  nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
19395
19396  nUF(vmvn,      _vmvn,    2, (RNDQ, RNDQ_Ibig), neon_mvn),
19397  nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
19398
19399   /* Data processing, three registers of different lengths.  */
19400   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
19401  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
19402  NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
19403  NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
19404  NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
19405   /* If not scalar, fall back to neon_dyadic_long.
19406      Vector types as above, scalar types S16 S32 U16 U32.  */
19407  nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
19408  nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
19409   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
19410  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19411  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19412   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
19413  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19414  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19415  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19416  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19417   /* Saturating doubling multiplies. Types S16 S32.  */
19418  nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19419  nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19420  nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19421   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
19422      S16 S32 U16 U32.  */
19423  nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
19424
19425   /* Extract. Size 8.  */
19426  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
19427  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
19428
19429   /* Two registers, miscellaneous.  */
19430   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
19431  NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
19432  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
19433  NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
19434  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
19435  NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
19436  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
19437   /* Vector replicate. Sizes 8 16 32.  */
19438  nCE(vdup,      _vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
19439  nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
19440   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
19441  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
19442   /* VMOVN. Types I16 I32 I64.  */
19443  nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
19444   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
19445  nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
19446   /* VQMOVUN. Types S16 S32 S64.  */
19447  nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
19448   /* VZIP / VUZP. Sizes 8 16 32.  */
19449  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
19450  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
19451  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
19452  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
19453   /* VQABS / VQNEG. Types S8 S16 S32.  */
19454  NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
19455  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
19456  NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
19457  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
19458   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
19459  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
19460  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
19461  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
19462  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
19463   /* Reciprocal estimates. Types U32 F32.  */
19464  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
19465  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
19466  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
19467  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
19468   /* VCLS. Types S8 S16 S32.  */
19469  NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
19470  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
19471   /* VCLZ. Types I8 I16 I32.  */
19472  NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
19473  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
19474   /* VCNT. Size 8.  */
19475  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
19476  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
19477   /* Two address, untyped.  */
19478  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
19479  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
19480   /* VTRN. Sizes 8 16 32.  */
19481  nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
19482  nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
19483
19484   /* Table lookup. Size 8.  */
19485  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19486  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19487
19488 #undef  THUMB_VARIANT
19489 #define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
19490 #undef  ARM_VARIANT
19491 #define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
19492
19493   /* Neon element/structure load/store.  */
19494  nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19495  nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19496  nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19497  nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19498  nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19499  nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19500  nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19501  nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19502
19503 #undef  THUMB_VARIANT
19504 #define THUMB_VARIANT & fpu_vfp_ext_v3xd
19505 #undef  ARM_VARIANT
19506 #define ARM_VARIANT   & fpu_vfp_ext_v3xd
19507  cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
19508  cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19509  cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19510  cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19511  cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19512  cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19513  cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19514  cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19515  cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19516
19517 #undef  THUMB_VARIANT
19518 #define THUMB_VARIANT  & fpu_vfp_ext_v3
19519 #undef  ARM_VARIANT
19520 #define ARM_VARIANT    & fpu_vfp_ext_v3
19521
19522  cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
19523  cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19524  cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19525  cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19526  cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19527  cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19528  cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19529  cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19530  cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19531
19532 #undef  ARM_VARIANT
19533 #define ARM_VARIANT    & fpu_vfp_ext_fma
19534 #undef  THUMB_VARIANT
19535 #define THUMB_VARIANT  & fpu_vfp_ext_fma
19536  /* Mnemonics shared by Neon and VFP.  These are included in the
19537     VFP FMA variant; NEON and VFP FMA always includes the NEON
19538     FMA instructions.  */
19539  nCEF(vfma,     _vfma,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19540  nCEF(vfms,     _vfms,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19541  /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
19542     the v form should always be used.  */
19543  cCE("ffmas",   ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19544  cCE("ffnmas",  ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19545  cCE("ffmad",   ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19546  cCE("ffnmad",  ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19547  nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19548  nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19549
19550 #undef THUMB_VARIANT
19551 #undef  ARM_VARIANT
19552 #define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
19553
19554  cCE("mia",     e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19555  cCE("miaph",   e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19556  cCE("miabb",   e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19557  cCE("miabt",   e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19558  cCE("miatb",   e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19559  cCE("miatt",   e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19560  cCE("mar",     c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
19561  cCE("mra",     c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
19562
19563 #undef  ARM_VARIANT
19564 #define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
19565
19566  cCE("tandcb",  e13f130, 1, (RR),                   iwmmxt_tandorc),
19567  cCE("tandch",  e53f130, 1, (RR),                   iwmmxt_tandorc),
19568  cCE("tandcw",  e93f130, 1, (RR),                   iwmmxt_tandorc),
19569  cCE("tbcstb",  e400010, 2, (RIWR, RR),             rn_rd),
19570  cCE("tbcsth",  e400050, 2, (RIWR, RR),             rn_rd),
19571  cCE("tbcstw",  e400090, 2, (RIWR, RR),             rn_rd),
19572  cCE("textrcb", e130170, 2, (RR, I7),               iwmmxt_textrc),
19573  cCE("textrch", e530170, 2, (RR, I7),               iwmmxt_textrc),
19574  cCE("textrcw", e930170, 2, (RR, I7),               iwmmxt_textrc),
19575  cCE("textrmub",e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19576  cCE("textrmuh",e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19577  cCE("textrmuw",e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19578  cCE("textrmsb",e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19579  cCE("textrmsh",e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19580  cCE("textrmsw",e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19581  cCE("tinsrb",  e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19582  cCE("tinsrh",  e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19583  cCE("tinsrw",  e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19584  cCE("tmcr",    e000110, 2, (RIWC_RIWG, RR),        rn_rd),
19585  cCE("tmcrr",   c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
19586  cCE("tmia",    e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19587  cCE("tmiaph",  e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19588  cCE("tmiabb",  e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19589  cCE("tmiabt",  e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19590  cCE("tmiatb",  e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19591  cCE("tmiatt",  e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19592  cCE("tmovmskb",e100030, 2, (RR, RIWR),             rd_rn),
19593  cCE("tmovmskh",e500030, 2, (RR, RIWR),             rd_rn),
19594  cCE("tmovmskw",e900030, 2, (RR, RIWR),             rd_rn),
19595  cCE("tmrc",    e100110, 2, (RR, RIWC_RIWG),        rd_rn),
19596  cCE("tmrrc",   c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
19597  cCE("torcb",   e13f150, 1, (RR),                   iwmmxt_tandorc),
19598  cCE("torch",   e53f150, 1, (RR),                   iwmmxt_tandorc),
19599  cCE("torcw",   e93f150, 1, (RR),                   iwmmxt_tandorc),
19600  cCE("waccb",   e0001c0, 2, (RIWR, RIWR),           rd_rn),
19601  cCE("wacch",   e4001c0, 2, (RIWR, RIWR),           rd_rn),
19602  cCE("waccw",   e8001c0, 2, (RIWR, RIWR),           rd_rn),
19603  cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19604  cCE("waddb",   e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19605  cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19606  cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19607  cCE("waddh",   e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19608  cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19609  cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19610  cCE("waddw",   e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19611  cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19612  cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
19613  cCE("walignr0",e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19614  cCE("walignr1",e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19615  cCE("walignr2",ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19616  cCE("walignr3",eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19617  cCE("wand",    e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19618  cCE("wandn",   e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19619  cCE("wavg2b",  e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19620  cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19621  cCE("wavg2h",  ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19622  cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19623  cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19624  cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19625  cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19626  cCE("wcmpgtub",e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19627  cCE("wcmpgtuh",e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19628  cCE("wcmpgtuw",e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19629  cCE("wcmpgtsb",e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19630  cCE("wcmpgtsh",e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19631  cCE("wcmpgtsw",eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19632  cCE("wldrb",   c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19633  cCE("wldrh",   c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19634  cCE("wldrw",   c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
19635  cCE("wldrd",   c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
19636  cCE("wmacs",   e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19637  cCE("wmacsz",  e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19638  cCE("wmacu",   e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19639  cCE("wmacuz",  e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19640  cCE("wmadds",  ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19641  cCE("wmaddu",  e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19642  cCE("wmaxsb",  e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19643  cCE("wmaxsh",  e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19644  cCE("wmaxsw",  ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19645  cCE("wmaxub",  e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19646  cCE("wmaxuh",  e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19647  cCE("wmaxuw",  e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19648  cCE("wminsb",  e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19649  cCE("wminsh",  e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19650  cCE("wminsw",  eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19651  cCE("wminub",  e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19652  cCE("wminuh",  e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19653  cCE("wminuw",  e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19654  cCE("wmov",    e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
19655  cCE("wmulsm",  e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19656  cCE("wmulsl",  e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19657  cCE("wmulum",  e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19658  cCE("wmulul",  e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19659  cCE("wor",     e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19660  cCE("wpackhss",e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19661  cCE("wpackhus",e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19662  cCE("wpackwss",eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19663  cCE("wpackwus",e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19664  cCE("wpackdss",ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19665  cCE("wpackdus",ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19666  cCE("wrorh",   e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19667  cCE("wrorhg",  e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19668  cCE("wrorw",   eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19669  cCE("wrorwg",  eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19670  cCE("wrord",   ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19671  cCE("wrordg",  ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19672  cCE("wsadb",   e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19673  cCE("wsadbz",  e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19674  cCE("wsadh",   e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19675  cCE("wsadhz",  e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19676  cCE("wshufh",  e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
19677  cCE("wsllh",   e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19678  cCE("wsllhg",  e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19679  cCE("wsllw",   e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19680  cCE("wsllwg",  e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19681  cCE("wslld",   ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19682  cCE("wslldg",  ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19683  cCE("wsrah",   e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19684  cCE("wsrahg",  e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19685  cCE("wsraw",   e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19686  cCE("wsrawg",  e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19687  cCE("wsrad",   ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19688  cCE("wsradg",  ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19689  cCE("wsrlh",   e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19690  cCE("wsrlhg",  e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19691  cCE("wsrlw",   ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19692  cCE("wsrlwg",  ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19693  cCE("wsrld",   ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19694  cCE("wsrldg",  ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19695  cCE("wstrb",   c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19696  cCE("wstrh",   c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19697  cCE("wstrw",   c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
19698  cCE("wstrd",   c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
19699  cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19700  cCE("wsubb",   e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19701  cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19702  cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19703  cCE("wsubh",   e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19704  cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19705  cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19706  cCE("wsubw",   e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19707  cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19708  cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),         rd_rn),
19709  cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),         rd_rn),
19710  cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),         rd_rn),
19711  cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),         rd_rn),
19712  cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),         rd_rn),
19713  cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),         rd_rn),
19714  cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19715  cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19716  cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19717  cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),         rd_rn),
19718  cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),         rd_rn),
19719  cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),         rd_rn),
19720  cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),         rd_rn),
19721  cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),         rd_rn),
19722  cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),         rd_rn),
19723  cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19724  cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19725  cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19726  cCE("wxor",    e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19727  cCE("wzero",   e300000, 1, (RIWR),                 iwmmxt_wzero),
19728
19729 #undef  ARM_VARIANT
19730 #define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
19731
19732  cCE("torvscb",   e12f190, 1, (RR),                 iwmmxt_tandorc),
19733  cCE("torvsch",   e52f190, 1, (RR),                 iwmmxt_tandorc),
19734  cCE("torvscw",   e92f190, 1, (RR),                 iwmmxt_tandorc),
19735  cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
19736  cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
19737  cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
19738  cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19739  cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19740  cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19741  cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19742  cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19743  cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19744  cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19745  cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19746  cCE("wavg4",   e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19747  cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19748  cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19749  cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19750  cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19751  cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19752  cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
19753  cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19754  cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19755  cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19756  cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19757  cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19758  cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19759  cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19760  cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19761  cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19762  cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19763  cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19764  cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19765  cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19766  cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19767  cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19768  cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19769  cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19770  cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19771  cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19772  cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19773  cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19774  cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19775  cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19776  cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19777  cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19778  cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19779  cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19780  cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19781  cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19782  cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19783  cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19784  cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19785  cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19786  cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19787  cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19788  cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19789
19790 #undef  ARM_VARIANT
19791 #define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
19792
19793  cCE("cfldrs",  c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
19794  cCE("cfldrd",  c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
19795  cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
19796  cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
19797  cCE("cfstrs",  c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
19798  cCE("cfstrd",  c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
19799  cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
19800  cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
19801  cCE("cfmvsr",  e000450, 2, (RMF, RR),                rn_rd),
19802  cCE("cfmvrs",  e100450, 2, (RR, RMF),                rd_rn),
19803  cCE("cfmvdlr", e000410, 2, (RMD, RR),                rn_rd),
19804  cCE("cfmvrdl", e100410, 2, (RR, RMD),                rd_rn),
19805  cCE("cfmvdhr", e000430, 2, (RMD, RR),                rn_rd),
19806  cCE("cfmvrdh", e100430, 2, (RR, RMD),                rd_rn),
19807  cCE("cfmv64lr",e000510, 2, (RMDX, RR),               rn_rd),
19808  cCE("cfmvr64l",e100510, 2, (RR, RMDX),               rd_rn),
19809  cCE("cfmv64hr",e000530, 2, (RMDX, RR),               rn_rd),
19810  cCE("cfmvr64h",e100530, 2, (RR, RMDX),               rd_rn),
19811  cCE("cfmval32",e200440, 2, (RMAX, RMFX),             rd_rn),
19812  cCE("cfmv32al",e100440, 2, (RMFX, RMAX),             rd_rn),
19813  cCE("cfmvam32",e200460, 2, (RMAX, RMFX),             rd_rn),
19814  cCE("cfmv32am",e100460, 2, (RMFX, RMAX),             rd_rn),
19815  cCE("cfmvah32",e200480, 2, (RMAX, RMFX),             rd_rn),
19816  cCE("cfmv32ah",e100480, 2, (RMFX, RMAX),             rd_rn),
19817  cCE("cfmva32", e2004a0, 2, (RMAX, RMFX),             rd_rn),
19818  cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX),             rd_rn),
19819  cCE("cfmva64", e2004c0, 2, (RMAX, RMDX),             rd_rn),
19820  cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX),             rd_rn),
19821  cCE("cfmvsc32",e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
19822  cCE("cfmv32sc",e1004e0, 2, (RMDX, RMDS),             rd),
19823  cCE("cfcpys",  e000400, 2, (RMF, RMF),               rd_rn),
19824  cCE("cfcpyd",  e000420, 2, (RMD, RMD),               rd_rn),
19825  cCE("cfcvtsd", e000460, 2, (RMD, RMF),               rd_rn),
19826  cCE("cfcvtds", e000440, 2, (RMF, RMD),               rd_rn),
19827  cCE("cfcvt32s",e000480, 2, (RMF, RMFX),              rd_rn),
19828  cCE("cfcvt32d",e0004a0, 2, (RMD, RMFX),              rd_rn),
19829  cCE("cfcvt64s",e0004c0, 2, (RMF, RMDX),              rd_rn),
19830  cCE("cfcvt64d",e0004e0, 2, (RMD, RMDX),              rd_rn),
19831  cCE("cfcvts32",e100580, 2, (RMFX, RMF),              rd_rn),
19832  cCE("cfcvtd32",e1005a0, 2, (RMFX, RMD),              rd_rn),
19833  cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),            rd_rn),
19834  cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),            rd_rn),
19835  cCE("cfrshl32",e000550, 3, (RMFX, RMFX, RR),         mav_triple),
19836  cCE("cfrshl64",e000570, 3, (RMDX, RMDX, RR),         mav_triple),
19837  cCE("cfsh32",  e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
19838  cCE("cfsh64",  e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
19839  cCE("cfcmps",  e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
19840  cCE("cfcmpd",  e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
19841  cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
19842  cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
19843  cCE("cfabss",  e300400, 2, (RMF, RMF),               rd_rn),
19844  cCE("cfabsd",  e300420, 2, (RMD, RMD),               rd_rn),
19845  cCE("cfnegs",  e300440, 2, (RMF, RMF),               rd_rn),
19846  cCE("cfnegd",  e300460, 2, (RMD, RMD),               rd_rn),
19847  cCE("cfadds",  e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
19848  cCE("cfaddd",  e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
19849  cCE("cfsubs",  e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
19850  cCE("cfsubd",  e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
19851  cCE("cfmuls",  e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
19852  cCE("cfmuld",  e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
19853  cCE("cfabs32", e300500, 2, (RMFX, RMFX),             rd_rn),
19854  cCE("cfabs64", e300520, 2, (RMDX, RMDX),             rd_rn),
19855  cCE("cfneg32", e300540, 2, (RMFX, RMFX),             rd_rn),
19856  cCE("cfneg64", e300560, 2, (RMDX, RMDX),             rd_rn),
19857  cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
19858  cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
19859  cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
19860  cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
19861  cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
19862  cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
19863  cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
19864  cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
19865  cCE("cfmadd32",e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
19866  cCE("cfmsub32",e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
19867  cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
19868  cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
19869 };
19870 #undef ARM_VARIANT
19871 #undef THUMB_VARIANT
19872 #undef TCE
19873 #undef TUE
19874 #undef TUF
19875 #undef TCC
19876 #undef cCE
19877 #undef cCL
19878 #undef C3E
19879 #undef CE
19880 #undef CM
19881 #undef UE
19882 #undef UF
19883 #undef UT
19884 #undef NUF
19885 #undef nUF
19886 #undef NCE
19887 #undef nCE
19888 #undef OPS0
19889 #undef OPS1
19890 #undef OPS2
19891 #undef OPS3
19892 #undef OPS4
19893 #undef OPS5
19894 #undef OPS6
19895 #undef do_0
19896 \f
19897 /* MD interface: bits in the object file.  */
19898
19899 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
19900    for use in the a.out file, and stores them in the array pointed to by buf.
19901    This knows about the endian-ness of the target machine and does
19902    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
19903    2 (short) and 4 (long)  Floating numbers are put out as a series of
19904    LITTLENUMS (shorts, here at least).  */
19905
19906 void
19907 md_number_to_chars (char * buf, valueT val, int n)
19908 {
19909   if (target_big_endian)
19910     number_to_chars_bigendian (buf, val, n);
19911   else
19912     number_to_chars_littleendian (buf, val, n);
19913 }
19914
19915 static valueT
19916 md_chars_to_number (char * buf, int n)
19917 {
19918   valueT result = 0;
19919   unsigned char * where = (unsigned char *) buf;
19920
19921   if (target_big_endian)
19922     {
19923       while (n--)
19924         {
19925           result <<= 8;
19926           result |= (*where++ & 255);
19927         }
19928     }
19929   else
19930     {
19931       while (n--)
19932         {
19933           result <<= 8;
19934           result |= (where[n] & 255);
19935         }
19936     }
19937
19938   return result;
19939 }
19940
19941 /* MD interface: Sections.  */
19942
19943 /* Calculate the maximum variable size (i.e., excluding fr_fix)
19944    that an rs_machine_dependent frag may reach.  */
19945
19946 unsigned int
19947 arm_frag_max_var (fragS *fragp)
19948 {
19949   /* We only use rs_machine_dependent for variable-size Thumb instructions,
19950      which are either THUMB_SIZE (2) or INSN_SIZE (4).
19951
19952      Note that we generate relaxable instructions even for cases that don't
19953      really need it, like an immediate that's a trivial constant.  So we're
19954      overestimating the instruction size for some of those cases.  Rather
19955      than putting more intelligence here, it would probably be better to
19956      avoid generating a relaxation frag in the first place when it can be
19957      determined up front that a short instruction will suffice.  */
19958
19959   gas_assert (fragp->fr_type == rs_machine_dependent);
19960   return INSN_SIZE;
19961 }
19962
19963 /* Estimate the size of a frag before relaxing.  Assume everything fits in
19964    2 bytes.  */
19965
19966 int
19967 md_estimate_size_before_relax (fragS * fragp,
19968                                segT    segtype ATTRIBUTE_UNUSED)
19969 {
19970   fragp->fr_var = 2;
19971   return 2;
19972 }
19973
19974 /* Convert a machine dependent frag.  */
19975
19976 void
19977 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
19978 {
19979   unsigned long insn;
19980   unsigned long old_op;
19981   char *buf;
19982   expressionS exp;
19983   fixS *fixp;
19984   int reloc_type;
19985   int pc_rel;
19986   int opcode;
19987
19988   buf = fragp->fr_literal + fragp->fr_fix;
19989
19990   old_op = bfd_get_16(abfd, buf);
19991   if (fragp->fr_symbol)
19992     {
19993       exp.X_op = O_symbol;
19994       exp.X_add_symbol = fragp->fr_symbol;
19995     }
19996   else
19997     {
19998       exp.X_op = O_constant;
19999     }
20000   exp.X_add_number = fragp->fr_offset;
20001   opcode = fragp->fr_subtype;
20002   switch (opcode)
20003     {
20004     case T_MNEM_ldr_pc:
20005     case T_MNEM_ldr_pc2:
20006     case T_MNEM_ldr_sp:
20007     case T_MNEM_str_sp:
20008     case T_MNEM_ldr:
20009     case T_MNEM_ldrb:
20010     case T_MNEM_ldrh:
20011     case T_MNEM_str:
20012     case T_MNEM_strb:
20013     case T_MNEM_strh:
20014       if (fragp->fr_var == 4)
20015         {
20016           insn = THUMB_OP32 (opcode);
20017           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
20018             {
20019               insn |= (old_op & 0x700) << 4;
20020             }
20021           else
20022             {
20023               insn |= (old_op & 7) << 12;
20024               insn |= (old_op & 0x38) << 13;
20025             }
20026           insn |= 0x00000c00;
20027           put_thumb32_insn (buf, insn);
20028           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
20029         }
20030       else
20031         {
20032           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
20033         }
20034       pc_rel = (opcode == T_MNEM_ldr_pc2);
20035       break;
20036     case T_MNEM_adr:
20037       if (fragp->fr_var == 4)
20038         {
20039           insn = THUMB_OP32 (opcode);
20040           insn |= (old_op & 0xf0) << 4;
20041           put_thumb32_insn (buf, insn);
20042           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
20043         }
20044       else
20045         {
20046           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20047           exp.X_add_number -= 4;
20048         }
20049       pc_rel = 1;
20050       break;
20051     case T_MNEM_mov:
20052     case T_MNEM_movs:
20053     case T_MNEM_cmp:
20054     case T_MNEM_cmn:
20055       if (fragp->fr_var == 4)
20056         {
20057           int r0off = (opcode == T_MNEM_mov
20058                        || opcode == T_MNEM_movs) ? 0 : 8;
20059           insn = THUMB_OP32 (opcode);
20060           insn = (insn & 0xe1ffffff) | 0x10000000;
20061           insn |= (old_op & 0x700) << r0off;
20062           put_thumb32_insn (buf, insn);
20063           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
20064         }
20065       else
20066         {
20067           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
20068         }
20069       pc_rel = 0;
20070       break;
20071     case T_MNEM_b:
20072       if (fragp->fr_var == 4)
20073         {
20074           insn = THUMB_OP32(opcode);
20075           put_thumb32_insn (buf, insn);
20076           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
20077         }
20078       else
20079         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
20080       pc_rel = 1;
20081       break;
20082     case T_MNEM_bcond:
20083       if (fragp->fr_var == 4)
20084         {
20085           insn = THUMB_OP32(opcode);
20086           insn |= (old_op & 0xf00) << 14;
20087           put_thumb32_insn (buf, insn);
20088           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
20089         }
20090       else
20091         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
20092       pc_rel = 1;
20093       break;
20094     case T_MNEM_add_sp:
20095     case T_MNEM_add_pc:
20096     case T_MNEM_inc_sp:
20097     case T_MNEM_dec_sp:
20098       if (fragp->fr_var == 4)
20099         {
20100           /* ??? Choose between add and addw.  */
20101           insn = THUMB_OP32 (opcode);
20102           insn |= (old_op & 0xf0) << 4;
20103           put_thumb32_insn (buf, insn);
20104           if (opcode == T_MNEM_add_pc)
20105             reloc_type = BFD_RELOC_ARM_T32_IMM12;
20106           else
20107             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
20108         }
20109       else
20110         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20111       pc_rel = 0;
20112       break;
20113
20114     case T_MNEM_addi:
20115     case T_MNEM_addis:
20116     case T_MNEM_subi:
20117     case T_MNEM_subis:
20118       if (fragp->fr_var == 4)
20119         {
20120           insn = THUMB_OP32 (opcode);
20121           insn |= (old_op & 0xf0) << 4;
20122           insn |= (old_op & 0xf) << 16;
20123           put_thumb32_insn (buf, insn);
20124           if (insn & (1 << 20))
20125             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
20126           else
20127             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
20128         }
20129       else
20130         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20131       pc_rel = 0;
20132       break;
20133     default:
20134       abort ();
20135     }
20136   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
20137                       (enum bfd_reloc_code_real) reloc_type);
20138   fixp->fx_file = fragp->fr_file;
20139   fixp->fx_line = fragp->fr_line;
20140   fragp->fr_fix += fragp->fr_var;
20141 }
20142
20143 /* Return the size of a relaxable immediate operand instruction.
20144    SHIFT and SIZE specify the form of the allowable immediate.  */
20145 static int
20146 relax_immediate (fragS *fragp, int size, int shift)
20147 {
20148   offsetT offset;
20149   offsetT mask;
20150   offsetT low;
20151
20152   /* ??? Should be able to do better than this.  */
20153   if (fragp->fr_symbol)
20154     return 4;
20155
20156   low = (1 << shift) - 1;
20157   mask = (1 << (shift + size)) - (1 << shift);
20158   offset = fragp->fr_offset;
20159   /* Force misaligned offsets to 32-bit variant.  */
20160   if (offset & low)
20161     return 4;
20162   if (offset & ~mask)
20163     return 4;
20164   return 2;
20165 }
20166
20167 /* Get the address of a symbol during relaxation.  */
20168 static addressT
20169 relaxed_symbol_addr (fragS *fragp, long stretch)
20170 {
20171   fragS *sym_frag;
20172   addressT addr;
20173   symbolS *sym;
20174
20175   sym = fragp->fr_symbol;
20176   sym_frag = symbol_get_frag (sym);
20177   know (S_GET_SEGMENT (sym) != absolute_section
20178         || sym_frag == &zero_address_frag);
20179   addr = S_GET_VALUE (sym) + fragp->fr_offset;
20180
20181   /* If frag has yet to be reached on this pass, assume it will
20182      move by STRETCH just as we did.  If this is not so, it will
20183      be because some frag between grows, and that will force
20184      another pass.  */
20185
20186   if (stretch != 0
20187       && sym_frag->relax_marker != fragp->relax_marker)
20188     {
20189       fragS *f;
20190
20191       /* Adjust stretch for any alignment frag.  Note that if have
20192          been expanding the earlier code, the symbol may be
20193          defined in what appears to be an earlier frag.  FIXME:
20194          This doesn't handle the fr_subtype field, which specifies
20195          a maximum number of bytes to skip when doing an
20196          alignment.  */
20197       for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
20198         {
20199           if (f->fr_type == rs_align || f->fr_type == rs_align_code)
20200             {
20201               if (stretch < 0)
20202                 stretch = - ((- stretch)
20203                              & ~ ((1 << (int) f->fr_offset) - 1));
20204               else
20205                 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
20206               if (stretch == 0)
20207                 break;
20208             }
20209         }
20210       if (f != NULL)
20211         addr += stretch;
20212     }
20213
20214   return addr;
20215 }
20216
20217 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
20218    load.  */
20219 static int
20220 relax_adr (fragS *fragp, asection *sec, long stretch)
20221 {
20222   addressT addr;
20223   offsetT val;
20224
20225   /* Assume worst case for symbols not known to be in the same section.  */
20226   if (fragp->fr_symbol == NULL
20227       || !S_IS_DEFINED (fragp->fr_symbol)
20228       || sec != S_GET_SEGMENT (fragp->fr_symbol)
20229       || S_IS_WEAK (fragp->fr_symbol))
20230     return 4;
20231
20232   val = relaxed_symbol_addr (fragp, stretch);
20233   addr = fragp->fr_address + fragp->fr_fix;
20234   addr = (addr + 4) & ~3;
20235   /* Force misaligned targets to 32-bit variant.  */
20236   if (val & 3)
20237     return 4;
20238   val -= addr;
20239   if (val < 0 || val > 1020)
20240     return 4;
20241   return 2;
20242 }
20243
20244 /* Return the size of a relaxable add/sub immediate instruction.  */
20245 static int
20246 relax_addsub (fragS *fragp, asection *sec)
20247 {
20248   char *buf;
20249   int op;
20250
20251   buf = fragp->fr_literal + fragp->fr_fix;
20252   op = bfd_get_16(sec->owner, buf);
20253   if ((op & 0xf) == ((op >> 4) & 0xf))
20254     return relax_immediate (fragp, 8, 0);
20255   else
20256     return relax_immediate (fragp, 3, 0);
20257 }
20258
20259 /* Return TRUE iff the definition of symbol S could be pre-empted
20260    (overridden) at link or load time.  */
20261 static bfd_boolean
20262 symbol_preemptible (symbolS *s)
20263 {
20264   /* Weak symbols can always be pre-empted.  */
20265   if (S_IS_WEAK (s))
20266     return TRUE;
20267
20268   /* Non-global symbols cannot be pre-empted. */
20269   if (! S_IS_EXTERNAL (s))
20270     return FALSE;
20271
20272 #ifdef OBJ_ELF
20273   /* In ELF, a global symbol can be marked protected, or private.  In that
20274      case it can't be pre-empted (other definitions in the same link unit
20275      would violate the ODR).  */
20276   if (ELF_ST_VISIBILITY (S_GET_OTHER (s)) > STV_DEFAULT)
20277     return FALSE;
20278 #endif
20279
20280   /* Other global symbols might be pre-empted.  */
20281   return TRUE;
20282 }
20283
20284 /* Return the size of a relaxable branch instruction.  BITS is the
20285    size of the offset field in the narrow instruction.  */
20286
20287 static int
20288 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
20289 {
20290   addressT addr;
20291   offsetT val;
20292   offsetT limit;
20293
20294   /* Assume worst case for symbols not known to be in the same section.  */
20295   if (!S_IS_DEFINED (fragp->fr_symbol)
20296       || sec != S_GET_SEGMENT (fragp->fr_symbol)
20297       || S_IS_WEAK (fragp->fr_symbol))
20298     return 4;
20299
20300 #ifdef OBJ_ELF
20301   /* A branch to a function in ARM state will require interworking.  */
20302   if (S_IS_DEFINED (fragp->fr_symbol)
20303       && ARM_IS_FUNC (fragp->fr_symbol))
20304       return 4;
20305 #endif
20306
20307   if (symbol_preemptible (fragp->fr_symbol))
20308     return 4;
20309
20310   val = relaxed_symbol_addr (fragp, stretch);
20311   addr = fragp->fr_address + fragp->fr_fix + 4;
20312   val -= addr;
20313
20314   /* Offset is a signed value *2 */
20315   limit = 1 << bits;
20316   if (val >= limit || val < -limit)
20317     return 4;
20318   return 2;
20319 }
20320
20321
20322 /* Relax a machine dependent frag.  This returns the amount by which
20323    the current size of the frag should change.  */
20324
20325 int
20326 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
20327 {
20328   int oldsize;
20329   int newsize;
20330
20331   oldsize = fragp->fr_var;
20332   switch (fragp->fr_subtype)
20333     {
20334     case T_MNEM_ldr_pc2:
20335       newsize = relax_adr (fragp, sec, stretch);
20336       break;
20337     case T_MNEM_ldr_pc:
20338     case T_MNEM_ldr_sp:
20339     case T_MNEM_str_sp:
20340       newsize = relax_immediate (fragp, 8, 2);
20341       break;
20342     case T_MNEM_ldr:
20343     case T_MNEM_str:
20344       newsize = relax_immediate (fragp, 5, 2);
20345       break;
20346     case T_MNEM_ldrh:
20347     case T_MNEM_strh:
20348       newsize = relax_immediate (fragp, 5, 1);
20349       break;
20350     case T_MNEM_ldrb:
20351     case T_MNEM_strb:
20352       newsize = relax_immediate (fragp, 5, 0);
20353       break;
20354     case T_MNEM_adr:
20355       newsize = relax_adr (fragp, sec, stretch);
20356       break;
20357     case T_MNEM_mov:
20358     case T_MNEM_movs:
20359     case T_MNEM_cmp:
20360     case T_MNEM_cmn:
20361       newsize = relax_immediate (fragp, 8, 0);
20362       break;
20363     case T_MNEM_b:
20364       newsize = relax_branch (fragp, sec, 11, stretch);
20365       break;
20366     case T_MNEM_bcond:
20367       newsize = relax_branch (fragp, sec, 8, stretch);
20368       break;
20369     case T_MNEM_add_sp:
20370     case T_MNEM_add_pc:
20371       newsize = relax_immediate (fragp, 8, 2);
20372       break;
20373     case T_MNEM_inc_sp:
20374     case T_MNEM_dec_sp:
20375       newsize = relax_immediate (fragp, 7, 2);
20376       break;
20377     case T_MNEM_addi:
20378     case T_MNEM_addis:
20379     case T_MNEM_subi:
20380     case T_MNEM_subis:
20381       newsize = relax_addsub (fragp, sec);
20382       break;
20383     default:
20384       abort ();
20385     }
20386
20387   fragp->fr_var = newsize;
20388   /* Freeze wide instructions that are at or before the same location as
20389      in the previous pass.  This avoids infinite loops.
20390      Don't freeze them unconditionally because targets may be artificially
20391      misaligned by the expansion of preceding frags.  */
20392   if (stretch <= 0 && newsize > 2)
20393     {
20394       md_convert_frag (sec->owner, sec, fragp);
20395       frag_wane (fragp);
20396     }
20397
20398   return newsize - oldsize;
20399 }
20400
20401 /* Round up a section size to the appropriate boundary.  */
20402
20403 valueT
20404 md_section_align (segT   segment ATTRIBUTE_UNUSED,
20405                   valueT size)
20406 {
20407 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
20408   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
20409     {
20410       /* For a.out, force the section size to be aligned.  If we don't do
20411          this, BFD will align it for us, but it will not write out the
20412          final bytes of the section.  This may be a bug in BFD, but it is
20413          easier to fix it here since that is how the other a.out targets
20414          work.  */
20415       int align;
20416
20417       align = bfd_get_section_alignment (stdoutput, segment);
20418       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
20419     }
20420 #endif
20421
20422   return size;
20423 }
20424
20425 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
20426    of an rs_align_code fragment.  */
20427
20428 void
20429 arm_handle_align (fragS * fragP)
20430 {
20431   static char const arm_noop[2][2][4] =
20432     {
20433       {  /* ARMv1 */
20434         {0x00, 0x00, 0xa0, 0xe1},  /* LE */
20435         {0xe1, 0xa0, 0x00, 0x00},  /* BE */
20436       },
20437       {  /* ARMv6k */
20438         {0x00, 0xf0, 0x20, 0xe3},  /* LE */
20439         {0xe3, 0x20, 0xf0, 0x00},  /* BE */
20440       },
20441     };
20442   static char const thumb_noop[2][2][2] =
20443     {
20444       {  /* Thumb-1 */
20445         {0xc0, 0x46},  /* LE */
20446         {0x46, 0xc0},  /* BE */
20447       },
20448       {  /* Thumb-2 */
20449         {0x00, 0xbf},  /* LE */
20450         {0xbf, 0x00}   /* BE */
20451       }
20452     };
20453   static char const wide_thumb_noop[2][4] =
20454     {  /* Wide Thumb-2 */
20455       {0xaf, 0xf3, 0x00, 0x80},  /* LE */
20456       {0xf3, 0xaf, 0x80, 0x00},  /* BE */
20457     };
20458
20459   unsigned bytes, fix, noop_size;
20460   char * p;
20461   const char * noop;
20462   const char *narrow_noop = NULL;
20463 #ifdef OBJ_ELF
20464   enum mstate state;
20465 #endif
20466
20467   if (fragP->fr_type != rs_align_code)
20468     return;
20469
20470   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
20471   p = fragP->fr_literal + fragP->fr_fix;
20472   fix = 0;
20473
20474   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
20475     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
20476
20477   gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
20478
20479   if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
20480     {
20481       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
20482         {
20483           narrow_noop = thumb_noop[1][target_big_endian];
20484           noop = wide_thumb_noop[target_big_endian];
20485         }
20486       else
20487         noop = thumb_noop[0][target_big_endian];
20488       noop_size = 2;
20489 #ifdef OBJ_ELF
20490       state = MAP_THUMB;
20491 #endif
20492     }
20493   else
20494     {
20495       noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
20496                      [target_big_endian];
20497       noop_size = 4;
20498 #ifdef OBJ_ELF
20499       state = MAP_ARM;
20500 #endif
20501     }
20502
20503   fragP->fr_var = noop_size;
20504
20505   if (bytes & (noop_size - 1))
20506     {
20507       fix = bytes & (noop_size - 1);
20508 #ifdef OBJ_ELF
20509       insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
20510 #endif
20511       memset (p, 0, fix);
20512       p += fix;
20513       bytes -= fix;
20514     }
20515
20516   if (narrow_noop)
20517     {
20518       if (bytes & noop_size)
20519         {
20520           /* Insert a narrow noop.  */
20521           memcpy (p, narrow_noop, noop_size);
20522           p += noop_size;
20523           bytes -= noop_size;
20524           fix += noop_size;
20525         }
20526
20527       /* Use wide noops for the remainder */
20528       noop_size = 4;
20529     }
20530
20531   while (bytes >= noop_size)
20532     {
20533       memcpy (p, noop, noop_size);
20534       p += noop_size;
20535       bytes -= noop_size;
20536       fix += noop_size;
20537     }
20538
20539   fragP->fr_fix += fix;
20540 }
20541
20542 /* Called from md_do_align.  Used to create an alignment
20543    frag in a code section.  */
20544
20545 void
20546 arm_frag_align_code (int n, int max)
20547 {
20548   char * p;
20549
20550   /* We assume that there will never be a requirement
20551      to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
20552   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
20553     {
20554       char err_msg[128];
20555
20556       sprintf (err_msg,
20557         _("alignments greater than %d bytes not supported in .text sections."),
20558         MAX_MEM_FOR_RS_ALIGN_CODE + 1);
20559       as_fatal ("%s", err_msg);
20560     }
20561
20562   p = frag_var (rs_align_code,
20563                 MAX_MEM_FOR_RS_ALIGN_CODE,
20564                 1,
20565                 (relax_substateT) max,
20566                 (symbolS *) NULL,
20567                 (offsetT) n,
20568                 (char *) NULL);
20569   *p = 0;
20570 }
20571
20572 /* Perform target specific initialisation of a frag.
20573    Note - despite the name this initialisation is not done when the frag
20574    is created, but only when its type is assigned.  A frag can be created
20575    and used a long time before its type is set, so beware of assuming that
20576    this initialisationis performed first.  */
20577
20578 #ifndef OBJ_ELF
20579 void
20580 arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
20581 {
20582   /* Record whether this frag is in an ARM or a THUMB area.  */
20583   fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
20584 }
20585
20586 #else /* OBJ_ELF is defined.  */
20587 void
20588 arm_init_frag (fragS * fragP, int max_chars)
20589 {
20590   /* If the current ARM vs THUMB mode has not already
20591      been recorded into this frag then do so now.  */
20592   if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
20593     {
20594       fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
20595
20596       /* Record a mapping symbol for alignment frags.  We will delete this
20597          later if the alignment ends up empty.  */
20598       switch (fragP->fr_type)
20599         {
20600           case rs_align:
20601           case rs_align_test:
20602           case rs_fill:
20603             mapping_state_2 (MAP_DATA, max_chars);
20604             break;
20605           case rs_align_code:
20606             mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
20607             break;
20608           default:
20609             break;
20610         }
20611     }
20612 }
20613
20614 /* When we change sections we need to issue a new mapping symbol.  */
20615
20616 void
20617 arm_elf_change_section (void)
20618 {
20619   /* Link an unlinked unwind index table section to the .text section.  */
20620   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
20621       && elf_linked_to_section (now_seg) == NULL)
20622     elf_linked_to_section (now_seg) = text_section;
20623 }
20624
20625 int
20626 arm_elf_section_type (const char * str, size_t len)
20627 {
20628   if (len == 5 && strncmp (str, "exidx", 5) == 0)
20629     return SHT_ARM_EXIDX;
20630
20631   return -1;
20632 }
20633 \f
20634 /* Code to deal with unwinding tables.  */
20635
20636 static void add_unwind_adjustsp (offsetT);
20637
20638 /* Generate any deferred unwind frame offset.  */
20639
20640 static void
20641 flush_pending_unwind (void)
20642 {
20643   offsetT offset;
20644
20645   offset = unwind.pending_offset;
20646   unwind.pending_offset = 0;
20647   if (offset != 0)
20648     add_unwind_adjustsp (offset);
20649 }
20650
20651 /* Add an opcode to this list for this function.  Two-byte opcodes should
20652    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
20653    order.  */
20654
20655 static void
20656 add_unwind_opcode (valueT op, int length)
20657 {
20658   /* Add any deferred stack adjustment.  */
20659   if (unwind.pending_offset)
20660     flush_pending_unwind ();
20661
20662   unwind.sp_restored = 0;
20663
20664   if (unwind.opcode_count + length > unwind.opcode_alloc)
20665     {
20666       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
20667       if (unwind.opcodes)
20668         unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
20669                                                      unwind.opcode_alloc);
20670       else
20671         unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
20672     }
20673   while (length > 0)
20674     {
20675       length--;
20676       unwind.opcodes[unwind.opcode_count] = op & 0xff;
20677       op >>= 8;
20678       unwind.opcode_count++;
20679     }
20680 }
20681
20682 /* Add unwind opcodes to adjust the stack pointer.  */
20683
20684 static void
20685 add_unwind_adjustsp (offsetT offset)
20686 {
20687   valueT op;
20688
20689   if (offset > 0x200)
20690     {
20691       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
20692       char bytes[5];
20693       int n;
20694       valueT o;
20695
20696       /* Long form: 0xb2, uleb128.  */
20697       /* This might not fit in a word so add the individual bytes,
20698          remembering the list is built in reverse order.  */
20699       o = (valueT) ((offset - 0x204) >> 2);
20700       if (o == 0)
20701         add_unwind_opcode (0, 1);
20702
20703       /* Calculate the uleb128 encoding of the offset.  */
20704       n = 0;
20705       while (o)
20706         {
20707           bytes[n] = o & 0x7f;
20708           o >>= 7;
20709           if (o)
20710             bytes[n] |= 0x80;
20711           n++;
20712         }
20713       /* Add the insn.  */
20714       for (; n; n--)
20715         add_unwind_opcode (bytes[n - 1], 1);
20716       add_unwind_opcode (0xb2, 1);
20717     }
20718   else if (offset > 0x100)
20719     {
20720       /* Two short opcodes.  */
20721       add_unwind_opcode (0x3f, 1);
20722       op = (offset - 0x104) >> 2;
20723       add_unwind_opcode (op, 1);
20724     }
20725   else if (offset > 0)
20726     {
20727       /* Short opcode.  */
20728       op = (offset - 4) >> 2;
20729       add_unwind_opcode (op, 1);
20730     }
20731   else if (offset < 0)
20732     {
20733       offset = -offset;
20734       while (offset > 0x100)
20735         {
20736           add_unwind_opcode (0x7f, 1);
20737           offset -= 0x100;
20738         }
20739       op = ((offset - 4) >> 2) | 0x40;
20740       add_unwind_opcode (op, 1);
20741     }
20742 }
20743
20744 /* Finish the list of unwind opcodes for this function.  */
20745 static void
20746 finish_unwind_opcodes (void)
20747 {
20748   valueT op;
20749
20750   if (unwind.fp_used)
20751     {
20752       /* Adjust sp as necessary.  */
20753       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
20754       flush_pending_unwind ();
20755
20756       /* After restoring sp from the frame pointer.  */
20757       op = 0x90 | unwind.fp_reg;
20758       add_unwind_opcode (op, 1);
20759     }
20760   else
20761     flush_pending_unwind ();
20762 }
20763
20764
20765 /* Start an exception table entry.  If idx is nonzero this is an index table
20766    entry.  */
20767
20768 static void
20769 start_unwind_section (const segT text_seg, int idx)
20770 {
20771   const char * text_name;
20772   const char * prefix;
20773   const char * prefix_once;
20774   const char * group_name;
20775   size_t prefix_len;
20776   size_t text_len;
20777   char * sec_name;
20778   size_t sec_name_len;
20779   int type;
20780   int flags;
20781   int linkonce;
20782
20783   if (idx)
20784     {
20785       prefix = ELF_STRING_ARM_unwind;
20786       prefix_once = ELF_STRING_ARM_unwind_once;
20787       type = SHT_ARM_EXIDX;
20788     }
20789   else
20790     {
20791       prefix = ELF_STRING_ARM_unwind_info;
20792       prefix_once = ELF_STRING_ARM_unwind_info_once;
20793       type = SHT_PROGBITS;
20794     }
20795
20796   text_name = segment_name (text_seg);
20797   if (streq (text_name, ".text"))
20798     text_name = "";
20799
20800   if (strncmp (text_name, ".gnu.linkonce.t.",
20801                strlen (".gnu.linkonce.t.")) == 0)
20802     {
20803       prefix = prefix_once;
20804       text_name += strlen (".gnu.linkonce.t.");
20805     }
20806
20807   prefix_len = strlen (prefix);
20808   text_len = strlen (text_name);
20809   sec_name_len = prefix_len + text_len;
20810   sec_name = (char *) xmalloc (sec_name_len + 1);
20811   memcpy (sec_name, prefix, prefix_len);
20812   memcpy (sec_name + prefix_len, text_name, text_len);
20813   sec_name[prefix_len + text_len] = '\0';
20814
20815   flags = SHF_ALLOC;
20816   linkonce = 0;
20817   group_name = 0;
20818
20819   /* Handle COMDAT group.  */
20820   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
20821     {
20822       group_name = elf_group_name (text_seg);
20823       if (group_name == NULL)
20824         {
20825           as_bad (_("Group section `%s' has no group signature"),
20826                   segment_name (text_seg));
20827           ignore_rest_of_line ();
20828           return;
20829         }
20830       flags |= SHF_GROUP;
20831       linkonce = 1;
20832     }
20833
20834   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
20835
20836   /* Set the section link for index tables.  */
20837   if (idx)
20838     elf_linked_to_section (now_seg) = text_seg;
20839 }
20840
20841
20842 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
20843    personality routine data.  Returns zero, or the index table value for
20844    and inline entry.  */
20845
20846 static valueT
20847 create_unwind_entry (int have_data)
20848 {
20849   int size;
20850   addressT where;
20851   char *ptr;
20852   /* The current word of data.  */
20853   valueT data;
20854   /* The number of bytes left in this word.  */
20855   int n;
20856
20857   finish_unwind_opcodes ();
20858
20859   /* Remember the current text section.  */
20860   unwind.saved_seg = now_seg;
20861   unwind.saved_subseg = now_subseg;
20862
20863   start_unwind_section (now_seg, 0);
20864
20865   if (unwind.personality_routine == NULL)
20866     {
20867       if (unwind.personality_index == -2)
20868         {
20869           if (have_data)
20870             as_bad (_("handlerdata in cantunwind frame"));
20871           return 1; /* EXIDX_CANTUNWIND.  */
20872         }
20873
20874       /* Use a default personality routine if none is specified.  */
20875       if (unwind.personality_index == -1)
20876         {
20877           if (unwind.opcode_count > 3)
20878             unwind.personality_index = 1;
20879           else
20880             unwind.personality_index = 0;
20881         }
20882
20883       /* Space for the personality routine entry.  */
20884       if (unwind.personality_index == 0)
20885         {
20886           if (unwind.opcode_count > 3)
20887             as_bad (_("too many unwind opcodes for personality routine 0"));
20888
20889           if (!have_data)
20890             {
20891               /* All the data is inline in the index table.  */
20892               data = 0x80;
20893               n = 3;
20894               while (unwind.opcode_count > 0)
20895                 {
20896                   unwind.opcode_count--;
20897                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
20898                   n--;
20899                 }
20900
20901               /* Pad with "finish" opcodes.  */
20902               while (n--)
20903                 data = (data << 8) | 0xb0;
20904
20905               return data;
20906             }
20907           size = 0;
20908         }
20909       else
20910         /* We get two opcodes "free" in the first word.  */
20911         size = unwind.opcode_count - 2;
20912     }
20913   else
20914     {
20915       gas_assert (unwind.personality_index == -1);
20916
20917       /* An extra byte is required for the opcode count.        */
20918       size = unwind.opcode_count + 1;
20919     }
20920
20921   size = (size + 3) >> 2;
20922   if (size > 0xff)
20923     as_bad (_("too many unwind opcodes"));
20924
20925   frag_align (2, 0, 0);
20926   record_alignment (now_seg, 2);
20927   unwind.table_entry = expr_build_dot ();
20928
20929   /* Allocate the table entry.  */
20930   ptr = frag_more ((size << 2) + 4);
20931   /* PR 13449: Zero the table entries in case some of them are not used.  */
20932   memset (ptr, 0, (size << 2) + 4);
20933   where = frag_now_fix () - ((size << 2) + 4);
20934
20935   switch (unwind.personality_index)
20936     {
20937     case -1:
20938       /* ??? Should this be a PLT generating relocation?  */
20939       /* Custom personality routine.  */
20940       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
20941                BFD_RELOC_ARM_PREL31);
20942
20943       where += 4;
20944       ptr += 4;
20945
20946       /* Set the first byte to the number of additional words.  */
20947       data = size > 0 ? size - 1 : 0;
20948       n = 3;
20949       break;
20950
20951     /* ABI defined personality routines.  */
20952     case 0:
20953       /* Three opcodes bytes are packed into the first word.  */
20954       data = 0x80;
20955       n = 3;
20956       break;
20957
20958     case 1:
20959     case 2:
20960       /* The size and first two opcode bytes go in the first word.  */
20961       data = ((0x80 + unwind.personality_index) << 8) | size;
20962       n = 2;
20963       break;
20964
20965     default:
20966       /* Should never happen.  */
20967       abort ();
20968     }
20969
20970   /* Pack the opcodes into words (MSB first), reversing the list at the same
20971      time.  */
20972   while (unwind.opcode_count > 0)
20973     {
20974       if (n == 0)
20975         {
20976           md_number_to_chars (ptr, data, 4);
20977           ptr += 4;
20978           n = 4;
20979           data = 0;
20980         }
20981       unwind.opcode_count--;
20982       n--;
20983       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
20984     }
20985
20986   /* Finish off the last word.  */
20987   if (n < 4)
20988     {
20989       /* Pad with "finish" opcodes.  */
20990       while (n--)
20991         data = (data << 8) | 0xb0;
20992
20993       md_number_to_chars (ptr, data, 4);
20994     }
20995
20996   if (!have_data)
20997     {
20998       /* Add an empty descriptor if there is no user-specified data.   */
20999       ptr = frag_more (4);
21000       md_number_to_chars (ptr, 0, 4);
21001     }
21002
21003   return 0;
21004 }
21005
21006
21007 /* Initialize the DWARF-2 unwind information for this procedure.  */
21008
21009 void
21010 tc_arm_frame_initial_instructions (void)
21011 {
21012   cfi_add_CFA_def_cfa (REG_SP, 0);
21013 }
21014 #endif /* OBJ_ELF */
21015
21016 /* Convert REGNAME to a DWARF-2 register number.  */
21017
21018 int
21019 tc_arm_regname_to_dw2regnum (char *regname)
21020 {
21021   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
21022
21023   if (reg == FAIL)
21024     return -1;
21025
21026   return reg;
21027 }
21028
21029 #ifdef TE_PE
21030 void
21031 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
21032 {
21033   expressionS exp;
21034
21035   exp.X_op = O_secrel;
21036   exp.X_add_symbol = symbol;
21037   exp.X_add_number = 0;
21038   emit_expr (&exp, size);
21039 }
21040 #endif
21041
21042 /* MD interface: Symbol and relocation handling.  */
21043
21044 /* Return the address within the segment that a PC-relative fixup is
21045    relative to.  For ARM, PC-relative fixups applied to instructions
21046    are generally relative to the location of the fixup plus 8 bytes.
21047    Thumb branches are offset by 4, and Thumb loads relative to PC
21048    require special handling.  */
21049
21050 long
21051 md_pcrel_from_section (fixS * fixP, segT seg)
21052 {
21053   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
21054
21055   /* If this is pc-relative and we are going to emit a relocation
21056      then we just want to put out any pipeline compensation that the linker
21057      will need.  Otherwise we want to use the calculated base.
21058      For WinCE we skip the bias for externals as well, since this
21059      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
21060   if (fixP->fx_pcrel
21061       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
21062           || (arm_force_relocation (fixP)
21063 #ifdef TE_WINCE
21064               && !S_IS_EXTERNAL (fixP->fx_addsy)
21065 #endif
21066               )))
21067     base = 0;
21068
21069
21070   switch (fixP->fx_r_type)
21071     {
21072       /* PC relative addressing on the Thumb is slightly odd as the
21073          bottom two bits of the PC are forced to zero for the
21074          calculation.  This happens *after* application of the
21075          pipeline offset.  However, Thumb adrl already adjusts for
21076          this, so we need not do it again.  */
21077     case BFD_RELOC_ARM_THUMB_ADD:
21078       return base & ~3;
21079
21080     case BFD_RELOC_ARM_THUMB_OFFSET:
21081     case BFD_RELOC_ARM_T32_OFFSET_IMM:
21082     case BFD_RELOC_ARM_T32_ADD_PC12:
21083     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
21084       return (base + 4) & ~3;
21085
21086       /* Thumb branches are simply offset by +4.  */
21087     case BFD_RELOC_THUMB_PCREL_BRANCH7:
21088     case BFD_RELOC_THUMB_PCREL_BRANCH9:
21089     case BFD_RELOC_THUMB_PCREL_BRANCH12:
21090     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21091     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21092       return base + 4;
21093
21094     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21095       if (fixP->fx_addsy
21096           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21097           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21098           && ARM_IS_FUNC (fixP->fx_addsy)
21099           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21100         base = fixP->fx_where + fixP->fx_frag->fr_address;
21101        return base + 4;
21102
21103       /* BLX is like branches above, but forces the low two bits of PC to
21104          zero.  */
21105     case BFD_RELOC_THUMB_PCREL_BLX:
21106       if (fixP->fx_addsy
21107           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21108           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21109           && THUMB_IS_FUNC (fixP->fx_addsy)
21110           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21111         base = fixP->fx_where + fixP->fx_frag->fr_address;
21112       return (base + 4) & ~3;
21113
21114       /* ARM mode branches are offset by +8.  However, the Windows CE
21115          loader expects the relocation not to take this into account.  */
21116     case BFD_RELOC_ARM_PCREL_BLX:
21117       if (fixP->fx_addsy
21118           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21119           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21120           && ARM_IS_FUNC (fixP->fx_addsy)
21121           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21122         base = fixP->fx_where + fixP->fx_frag->fr_address;
21123       return base + 8;
21124
21125     case BFD_RELOC_ARM_PCREL_CALL:
21126       if (fixP->fx_addsy
21127           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21128           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21129           && THUMB_IS_FUNC (fixP->fx_addsy)
21130           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21131         base = fixP->fx_where + fixP->fx_frag->fr_address;
21132       return base + 8;
21133
21134     case BFD_RELOC_ARM_PCREL_BRANCH:
21135     case BFD_RELOC_ARM_PCREL_JUMP:
21136     case BFD_RELOC_ARM_PLT32:
21137 #ifdef TE_WINCE
21138       /* When handling fixups immediately, because we have already
21139          discovered the value of a symbol, or the address of the frag involved
21140          we must account for the offset by +8, as the OS loader will never see the reloc.
21141          see fixup_segment() in write.c
21142          The S_IS_EXTERNAL test handles the case of global symbols.
21143          Those need the calculated base, not just the pipe compensation the linker will need.  */
21144       if (fixP->fx_pcrel
21145           && fixP->fx_addsy != NULL
21146           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21147           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
21148         return base + 8;
21149       return base;
21150 #else
21151       return base + 8;
21152 #endif
21153
21154
21155       /* ARM mode loads relative to PC are also offset by +8.  Unlike
21156          branches, the Windows CE loader *does* expect the relocation
21157          to take this into account.  */
21158     case BFD_RELOC_ARM_OFFSET_IMM:
21159     case BFD_RELOC_ARM_OFFSET_IMM8:
21160     case BFD_RELOC_ARM_HWLITERAL:
21161     case BFD_RELOC_ARM_LITERAL:
21162     case BFD_RELOC_ARM_CP_OFF_IMM:
21163       return base + 8;
21164
21165
21166       /* Other PC-relative relocations are un-offset.  */
21167     default:
21168       return base;
21169     }
21170 }
21171
21172 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
21173    Otherwise we have no need to default values of symbols.  */
21174
21175 symbolS *
21176 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
21177 {
21178 #ifdef OBJ_ELF
21179   if (name[0] == '_' && name[1] == 'G'
21180       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
21181     {
21182       if (!GOT_symbol)
21183         {
21184           if (symbol_find (name))
21185             as_bad (_("GOT already in the symbol table"));
21186
21187           GOT_symbol = symbol_new (name, undefined_section,
21188                                    (valueT) 0, & zero_address_frag);
21189         }
21190
21191       return GOT_symbol;
21192     }
21193 #endif
21194
21195   return NULL;
21196 }
21197
21198 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
21199    computed as two separate immediate values, added together.  We
21200    already know that this value cannot be computed by just one ARM
21201    instruction.  */
21202
21203 static unsigned int
21204 validate_immediate_twopart (unsigned int   val,
21205                             unsigned int * highpart)
21206 {
21207   unsigned int a;
21208   unsigned int i;
21209
21210   for (i = 0; i < 32; i += 2)
21211     if (((a = rotate_left (val, i)) & 0xff) != 0)
21212       {
21213         if (a & 0xff00)
21214           {
21215             if (a & ~ 0xffff)
21216               continue;
21217             * highpart = (a  >> 8) | ((i + 24) << 7);
21218           }
21219         else if (a & 0xff0000)
21220           {
21221             if (a & 0xff000000)
21222               continue;
21223             * highpart = (a >> 16) | ((i + 16) << 7);
21224           }
21225         else
21226           {
21227             gas_assert (a & 0xff000000);
21228             * highpart = (a >> 24) | ((i + 8) << 7);
21229           }
21230
21231         return (a & 0xff) | (i << 7);
21232       }
21233
21234   return FAIL;
21235 }
21236
21237 static int
21238 validate_offset_imm (unsigned int val, int hwse)
21239 {
21240   if ((hwse && val > 255) || val > 4095)
21241     return FAIL;
21242   return val;
21243 }
21244
21245 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
21246    negative immediate constant by altering the instruction.  A bit of
21247    a hack really.
21248         MOV <-> MVN
21249         AND <-> BIC
21250         ADC <-> SBC
21251         by inverting the second operand, and
21252         ADD <-> SUB
21253         CMP <-> CMN
21254         by negating the second operand.  */
21255
21256 static int
21257 negate_data_op (unsigned long * instruction,
21258                 unsigned long   value)
21259 {
21260   int op, new_inst;
21261   unsigned long negated, inverted;
21262
21263   negated = encode_arm_immediate (-value);
21264   inverted = encode_arm_immediate (~value);
21265
21266   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
21267   switch (op)
21268     {
21269       /* First negates.  */
21270     case OPCODE_SUB:             /* ADD <-> SUB  */
21271       new_inst = OPCODE_ADD;
21272       value = negated;
21273       break;
21274
21275     case OPCODE_ADD:
21276       new_inst = OPCODE_SUB;
21277       value = negated;
21278       break;
21279
21280     case OPCODE_CMP:             /* CMP <-> CMN  */
21281       new_inst = OPCODE_CMN;
21282       value = negated;
21283       break;
21284
21285     case OPCODE_CMN:
21286       new_inst = OPCODE_CMP;
21287       value = negated;
21288       break;
21289
21290       /* Now Inverted ops.  */
21291     case OPCODE_MOV:             /* MOV <-> MVN  */
21292       new_inst = OPCODE_MVN;
21293       value = inverted;
21294       break;
21295
21296     case OPCODE_MVN:
21297       new_inst = OPCODE_MOV;
21298       value = inverted;
21299       break;
21300
21301     case OPCODE_AND:             /* AND <-> BIC  */
21302       new_inst = OPCODE_BIC;
21303       value = inverted;
21304       break;
21305
21306     case OPCODE_BIC:
21307       new_inst = OPCODE_AND;
21308       value = inverted;
21309       break;
21310
21311     case OPCODE_ADC:              /* ADC <-> SBC  */
21312       new_inst = OPCODE_SBC;
21313       value = inverted;
21314       break;
21315
21316     case OPCODE_SBC:
21317       new_inst = OPCODE_ADC;
21318       value = inverted;
21319       break;
21320
21321       /* We cannot do anything.  */
21322     default:
21323       return FAIL;
21324     }
21325
21326   if (value == (unsigned) FAIL)
21327     return FAIL;
21328
21329   *instruction &= OPCODE_MASK;
21330   *instruction |= new_inst << DATA_OP_SHIFT;
21331   return value;
21332 }
21333
21334 /* Like negate_data_op, but for Thumb-2.   */
21335
21336 static unsigned int
21337 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
21338 {
21339   int op, new_inst;
21340   int rd;
21341   unsigned int negated, inverted;
21342
21343   negated = encode_thumb32_immediate (-value);
21344   inverted = encode_thumb32_immediate (~value);
21345
21346   rd = (*instruction >> 8) & 0xf;
21347   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
21348   switch (op)
21349     {
21350       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
21351     case T2_OPCODE_SUB:
21352       new_inst = T2_OPCODE_ADD;
21353       value = negated;
21354       break;
21355
21356     case T2_OPCODE_ADD:
21357       new_inst = T2_OPCODE_SUB;
21358       value = negated;
21359       break;
21360
21361       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
21362     case T2_OPCODE_ORR:
21363       new_inst = T2_OPCODE_ORN;
21364       value = inverted;
21365       break;
21366
21367     case T2_OPCODE_ORN:
21368       new_inst = T2_OPCODE_ORR;
21369       value = inverted;
21370       break;
21371
21372       /* AND <-> BIC.  TST has no inverted equivalent.  */
21373     case T2_OPCODE_AND:
21374       new_inst = T2_OPCODE_BIC;
21375       if (rd == 15)
21376         value = FAIL;
21377       else
21378         value = inverted;
21379       break;
21380
21381     case T2_OPCODE_BIC:
21382       new_inst = T2_OPCODE_AND;
21383       value = inverted;
21384       break;
21385
21386       /* ADC <-> SBC  */
21387     case T2_OPCODE_ADC:
21388       new_inst = T2_OPCODE_SBC;
21389       value = inverted;
21390       break;
21391
21392     case T2_OPCODE_SBC:
21393       new_inst = T2_OPCODE_ADC;
21394       value = inverted;
21395       break;
21396
21397       /* We cannot do anything.  */
21398     default:
21399       return FAIL;
21400     }
21401
21402   if (value == (unsigned int)FAIL)
21403     return FAIL;
21404
21405   *instruction &= T2_OPCODE_MASK;
21406   *instruction |= new_inst << T2_DATA_OP_SHIFT;
21407   return value;
21408 }
21409
21410 /* Read a 32-bit thumb instruction from buf.  */
21411 static unsigned long
21412 get_thumb32_insn (char * buf)
21413 {
21414   unsigned long insn;
21415   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
21416   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21417
21418   return insn;
21419 }
21420
21421
21422 /* We usually want to set the low bit on the address of thumb function
21423    symbols.  In particular .word foo - . should have the low bit set.
21424    Generic code tries to fold the difference of two symbols to
21425    a constant.  Prevent this and force a relocation when the first symbols
21426    is a thumb function.  */
21427
21428 bfd_boolean
21429 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
21430 {
21431   if (op == O_subtract
21432       && l->X_op == O_symbol
21433       && r->X_op == O_symbol
21434       && THUMB_IS_FUNC (l->X_add_symbol))
21435     {
21436       l->X_op = O_subtract;
21437       l->X_op_symbol = r->X_add_symbol;
21438       l->X_add_number -= r->X_add_number;
21439       return TRUE;
21440     }
21441
21442   /* Process as normal.  */
21443   return FALSE;
21444 }
21445
21446 /* Encode Thumb2 unconditional branches and calls. The encoding
21447    for the 2 are identical for the immediate values.  */
21448
21449 static void
21450 encode_thumb2_b_bl_offset (char * buf, offsetT value)
21451 {
21452 #define T2I1I2MASK  ((1 << 13) | (1 << 11))
21453   offsetT newval;
21454   offsetT newval2;
21455   addressT S, I1, I2, lo, hi;
21456
21457   S = (value >> 24) & 0x01;
21458   I1 = (value >> 23) & 0x01;
21459   I2 = (value >> 22) & 0x01;
21460   hi = (value >> 12) & 0x3ff;
21461   lo = (value >> 1) & 0x7ff;
21462   newval   = md_chars_to_number (buf, THUMB_SIZE);
21463   newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21464   newval  |= (S << 10) | hi;
21465   newval2 &=  ~T2I1I2MASK;
21466   newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
21467   md_number_to_chars (buf, newval, THUMB_SIZE);
21468   md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
21469 }
21470
21471 void
21472 md_apply_fix (fixS *    fixP,
21473                valueT * valP,
21474                segT     seg)
21475 {
21476   offsetT        value = * valP;
21477   offsetT        newval;
21478   unsigned int   newimm;
21479   unsigned long  temp;
21480   int            sign;
21481   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
21482
21483   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
21484
21485   /* Note whether this will delete the relocation.  */
21486
21487   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
21488     fixP->fx_done = 1;
21489
21490   /* On a 64-bit host, silently truncate 'value' to 32 bits for
21491      consistency with the behaviour on 32-bit hosts.  Remember value
21492      for emit_reloc.  */
21493   value &= 0xffffffff;
21494   value ^= 0x80000000;
21495   value -= 0x80000000;
21496
21497   *valP = value;
21498   fixP->fx_addnumber = value;
21499
21500   /* Same treatment for fixP->fx_offset.  */
21501   fixP->fx_offset &= 0xffffffff;
21502   fixP->fx_offset ^= 0x80000000;
21503   fixP->fx_offset -= 0x80000000;
21504
21505   switch (fixP->fx_r_type)
21506     {
21507     case BFD_RELOC_NONE:
21508       /* This will need to go in the object file.  */
21509       fixP->fx_done = 0;
21510       break;
21511
21512     case BFD_RELOC_ARM_IMMEDIATE:
21513       /* We claim that this fixup has been processed here,
21514          even if in fact we generate an error because we do
21515          not have a reloc for it, so tc_gen_reloc will reject it.  */
21516       fixP->fx_done = 1;
21517
21518       if (fixP->fx_addsy)
21519         {
21520           const char *msg = 0;
21521
21522           if (! S_IS_DEFINED (fixP->fx_addsy))
21523             msg = _("undefined symbol %s used as an immediate value");
21524           else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21525             msg = _("symbol %s is in a different section");
21526           else if (S_IS_WEAK (fixP->fx_addsy))
21527             msg = _("symbol %s is weak and may be overridden later");
21528
21529           if (msg)
21530             {
21531               as_bad_where (fixP->fx_file, fixP->fx_line,
21532                             msg, S_GET_NAME (fixP->fx_addsy));
21533               break;
21534             }
21535         }
21536
21537       temp = md_chars_to_number (buf, INSN_SIZE);
21538
21539       /* If the offset is negative, we should use encoding A2 for ADR.  */
21540       if ((temp & 0xfff0000) == 0x28f0000 && value < 0)
21541         newimm = negate_data_op (&temp, value);
21542       else
21543         {
21544           newimm = encode_arm_immediate (value);
21545
21546           /* If the instruction will fail, see if we can fix things up by
21547              changing the opcode.  */
21548           if (newimm == (unsigned int) FAIL)
21549             newimm = negate_data_op (&temp, value);
21550         }
21551
21552       if (newimm == (unsigned int) FAIL)
21553         {
21554           as_bad_where (fixP->fx_file, fixP->fx_line,
21555                         _("invalid constant (%lx) after fixup"),
21556                         (unsigned long) value);
21557           break;
21558         }
21559
21560       newimm |= (temp & 0xfffff000);
21561       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
21562       break;
21563
21564     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21565       {
21566         unsigned int highpart = 0;
21567         unsigned int newinsn  = 0xe1a00000; /* nop.  */
21568
21569         if (fixP->fx_addsy)
21570           {
21571             const char *msg = 0;
21572
21573             if (! S_IS_DEFINED (fixP->fx_addsy))
21574               msg = _("undefined symbol %s used as an immediate value");
21575             else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21576               msg = _("symbol %s is in a different section");
21577             else if (S_IS_WEAK (fixP->fx_addsy))
21578               msg = _("symbol %s is weak and may be overridden later");
21579
21580             if (msg)
21581               {
21582                 as_bad_where (fixP->fx_file, fixP->fx_line,
21583                               msg, S_GET_NAME (fixP->fx_addsy));
21584                 break;
21585               }
21586           }
21587
21588         newimm = encode_arm_immediate (value);
21589         temp = md_chars_to_number (buf, INSN_SIZE);
21590
21591         /* If the instruction will fail, see if we can fix things up by
21592            changing the opcode.  */
21593         if (newimm == (unsigned int) FAIL
21594             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
21595           {
21596             /* No ?  OK - try using two ADD instructions to generate
21597                the value.  */
21598             newimm = validate_immediate_twopart (value, & highpart);
21599
21600             /* Yes - then make sure that the second instruction is
21601                also an add.  */
21602             if (newimm != (unsigned int) FAIL)
21603               newinsn = temp;
21604             /* Still No ?  Try using a negated value.  */
21605             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
21606               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
21607             /* Otherwise - give up.  */
21608             else
21609               {
21610                 as_bad_where (fixP->fx_file, fixP->fx_line,
21611                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
21612                               (long) value);
21613                 break;
21614               }
21615
21616             /* Replace the first operand in the 2nd instruction (which
21617                is the PC) with the destination register.  We have
21618                already added in the PC in the first instruction and we
21619                do not want to do it again.  */
21620             newinsn &= ~ 0xf0000;
21621             newinsn |= ((newinsn & 0x0f000) << 4);
21622           }
21623
21624         newimm |= (temp & 0xfffff000);
21625         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
21626
21627         highpart |= (newinsn & 0xfffff000);
21628         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
21629       }
21630       break;
21631
21632     case BFD_RELOC_ARM_OFFSET_IMM:
21633       if (!fixP->fx_done && seg->use_rela_p)
21634         value = 0;
21635
21636     case BFD_RELOC_ARM_LITERAL:
21637       sign = value > 0;
21638
21639       if (value < 0)
21640         value = - value;
21641
21642       if (validate_offset_imm (value, 0) == FAIL)
21643         {
21644           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
21645             as_bad_where (fixP->fx_file, fixP->fx_line,
21646                           _("invalid literal constant: pool needs to be closer"));
21647           else
21648             as_bad_where (fixP->fx_file, fixP->fx_line,
21649                           _("bad immediate value for offset (%ld)"),
21650                           (long) value);
21651           break;
21652         }
21653
21654       newval = md_chars_to_number (buf, INSN_SIZE);
21655       if (value == 0)
21656         newval &= 0xfffff000;
21657       else
21658         {
21659           newval &= 0xff7ff000;
21660           newval |= value | (sign ? INDEX_UP : 0);
21661         }
21662       md_number_to_chars (buf, newval, INSN_SIZE);
21663       break;
21664
21665     case BFD_RELOC_ARM_OFFSET_IMM8:
21666     case BFD_RELOC_ARM_HWLITERAL:
21667       sign = value > 0;
21668
21669       if (value < 0)
21670         value = - value;
21671
21672       if (validate_offset_imm (value, 1) == FAIL)
21673         {
21674           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
21675             as_bad_where (fixP->fx_file, fixP->fx_line,
21676                           _("invalid literal constant: pool needs to be closer"));
21677           else
21678             as_bad_where (fixP->fx_file, fixP->fx_line,
21679                           _("bad immediate value for 8-bit offset (%ld)"),
21680                           (long) value);
21681           break;
21682         }
21683
21684       newval = md_chars_to_number (buf, INSN_SIZE);
21685       if (value == 0)
21686         newval &= 0xfffff0f0;
21687       else
21688         {
21689           newval &= 0xff7ff0f0;
21690           newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
21691         }
21692       md_number_to_chars (buf, newval, INSN_SIZE);
21693       break;
21694
21695     case BFD_RELOC_ARM_T32_OFFSET_U8:
21696       if (value < 0 || value > 1020 || value % 4 != 0)
21697         as_bad_where (fixP->fx_file, fixP->fx_line,
21698                       _("bad immediate value for offset (%ld)"), (long) value);
21699       value /= 4;
21700
21701       newval = md_chars_to_number (buf+2, THUMB_SIZE);
21702       newval |= value;
21703       md_number_to_chars (buf+2, newval, THUMB_SIZE);
21704       break;
21705
21706     case BFD_RELOC_ARM_T32_OFFSET_IMM:
21707       /* This is a complicated relocation used for all varieties of Thumb32
21708          load/store instruction with immediate offset:
21709
21710          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
21711                                                    *4, optional writeback(W)
21712                                                    (doubleword load/store)
21713
21714          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
21715          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
21716          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
21717          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
21718          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
21719
21720          Uppercase letters indicate bits that are already encoded at
21721          this point.  Lowercase letters are our problem.  For the
21722          second block of instructions, the secondary opcode nybble
21723          (bits 8..11) is present, and bit 23 is zero, even if this is
21724          a PC-relative operation.  */
21725       newval = md_chars_to_number (buf, THUMB_SIZE);
21726       newval <<= 16;
21727       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
21728
21729       if ((newval & 0xf0000000) == 0xe0000000)
21730         {
21731           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
21732           if (value >= 0)
21733             newval |= (1 << 23);
21734           else
21735             value = -value;
21736           if (value % 4 != 0)
21737             {
21738               as_bad_where (fixP->fx_file, fixP->fx_line,
21739                             _("offset not a multiple of 4"));
21740               break;
21741             }
21742           value /= 4;
21743           if (value > 0xff)
21744             {
21745               as_bad_where (fixP->fx_file, fixP->fx_line,
21746                             _("offset out of range"));
21747               break;
21748             }
21749           newval &= ~0xff;
21750         }
21751       else if ((newval & 0x000f0000) == 0x000f0000)
21752         {
21753           /* PC-relative, 12-bit offset.  */
21754           if (value >= 0)
21755             newval |= (1 << 23);
21756           else
21757             value = -value;
21758           if (value > 0xfff)
21759             {
21760               as_bad_where (fixP->fx_file, fixP->fx_line,
21761                             _("offset out of range"));
21762               break;
21763             }
21764           newval &= ~0xfff;
21765         }
21766       else if ((newval & 0x00000100) == 0x00000100)
21767         {
21768           /* Writeback: 8-bit, +/- offset.  */
21769           if (value >= 0)
21770             newval |= (1 << 9);
21771           else
21772             value = -value;
21773           if (value > 0xff)
21774             {
21775               as_bad_where (fixP->fx_file, fixP->fx_line,
21776                             _("offset out of range"));
21777               break;
21778             }
21779           newval &= ~0xff;
21780         }
21781       else if ((newval & 0x00000f00) == 0x00000e00)
21782         {
21783           /* T-instruction: positive 8-bit offset.  */
21784           if (value < 0 || value > 0xff)
21785             {
21786               as_bad_where (fixP->fx_file, fixP->fx_line,
21787                             _("offset out of range"));
21788               break;
21789             }
21790           newval &= ~0xff;
21791           newval |= value;
21792         }
21793       else
21794         {
21795           /* Positive 12-bit or negative 8-bit offset.  */
21796           int limit;
21797           if (value >= 0)
21798             {
21799               newval |= (1 << 23);
21800               limit = 0xfff;
21801             }
21802           else
21803             {
21804               value = -value;
21805               limit = 0xff;
21806             }
21807           if (value > limit)
21808             {
21809               as_bad_where (fixP->fx_file, fixP->fx_line,
21810                             _("offset out of range"));
21811               break;
21812             }
21813           newval &= ~limit;
21814         }
21815
21816       newval |= value;
21817       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
21818       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
21819       break;
21820
21821     case BFD_RELOC_ARM_SHIFT_IMM:
21822       newval = md_chars_to_number (buf, INSN_SIZE);
21823       if (((unsigned long) value) > 32
21824           || (value == 32
21825               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
21826         {
21827           as_bad_where (fixP->fx_file, fixP->fx_line,
21828                         _("shift expression is too large"));
21829           break;
21830         }
21831
21832       if (value == 0)
21833         /* Shifts of zero must be done as lsl.  */
21834         newval &= ~0x60;
21835       else if (value == 32)
21836         value = 0;
21837       newval &= 0xfffff07f;
21838       newval |= (value & 0x1f) << 7;
21839       md_number_to_chars (buf, newval, INSN_SIZE);
21840       break;
21841
21842     case BFD_RELOC_ARM_T32_IMMEDIATE:
21843     case BFD_RELOC_ARM_T32_ADD_IMM:
21844     case BFD_RELOC_ARM_T32_IMM12:
21845     case BFD_RELOC_ARM_T32_ADD_PC12:
21846       /* We claim that this fixup has been processed here,
21847          even if in fact we generate an error because we do
21848          not have a reloc for it, so tc_gen_reloc will reject it.  */
21849       fixP->fx_done = 1;
21850
21851       if (fixP->fx_addsy
21852           && ! S_IS_DEFINED (fixP->fx_addsy))
21853         {
21854           as_bad_where (fixP->fx_file, fixP->fx_line,
21855                         _("undefined symbol %s used as an immediate value"),
21856                         S_GET_NAME (fixP->fx_addsy));
21857           break;
21858         }
21859
21860       newval = md_chars_to_number (buf, THUMB_SIZE);
21861       newval <<= 16;
21862       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
21863
21864       newimm = FAIL;
21865       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
21866           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
21867         {
21868           newimm = encode_thumb32_immediate (value);
21869           if (newimm == (unsigned int) FAIL)
21870             newimm = thumb32_negate_data_op (&newval, value);
21871         }
21872       if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
21873           && newimm == (unsigned int) FAIL)
21874         {
21875           /* Turn add/sum into addw/subw.  */
21876           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
21877             newval = (newval & 0xfeffffff) | 0x02000000;
21878           /* No flat 12-bit imm encoding for addsw/subsw.  */
21879           if ((newval & 0x00100000) == 0)
21880             {
21881               /* 12 bit immediate for addw/subw.  */
21882               if (value < 0)
21883                 {
21884                   value = -value;
21885                   newval ^= 0x00a00000;
21886                 }
21887               if (value > 0xfff)
21888                 newimm = (unsigned int) FAIL;
21889               else
21890                 newimm = value;
21891             }
21892         }
21893
21894       if (newimm == (unsigned int)FAIL)
21895         {
21896           as_bad_where (fixP->fx_file, fixP->fx_line,
21897                         _("invalid constant (%lx) after fixup"),
21898                         (unsigned long) value);
21899           break;
21900         }
21901
21902       newval |= (newimm & 0x800) << 15;
21903       newval |= (newimm & 0x700) << 4;
21904       newval |= (newimm & 0x0ff);
21905
21906       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
21907       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
21908       break;
21909
21910     case BFD_RELOC_ARM_SMC:
21911       if (((unsigned long) value) > 0xffff)
21912         as_bad_where (fixP->fx_file, fixP->fx_line,
21913                       _("invalid smc expression"));
21914       newval = md_chars_to_number (buf, INSN_SIZE);
21915       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
21916       md_number_to_chars (buf, newval, INSN_SIZE);
21917       break;
21918
21919     case BFD_RELOC_ARM_HVC:
21920       if (((unsigned long) value) > 0xffff)
21921         as_bad_where (fixP->fx_file, fixP->fx_line,
21922                       _("invalid hvc expression"));
21923       newval = md_chars_to_number (buf, INSN_SIZE);
21924       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
21925       md_number_to_chars (buf, newval, INSN_SIZE);
21926       break;
21927
21928     case BFD_RELOC_ARM_SWI:
21929       if (fixP->tc_fix_data != 0)
21930         {
21931           if (((unsigned long) value) > 0xff)
21932             as_bad_where (fixP->fx_file, fixP->fx_line,
21933                           _("invalid swi expression"));
21934           newval = md_chars_to_number (buf, THUMB_SIZE);
21935           newval |= value;
21936           md_number_to_chars (buf, newval, THUMB_SIZE);
21937         }
21938       else
21939         {
21940           if (((unsigned long) value) > 0x00ffffff)
21941             as_bad_where (fixP->fx_file, fixP->fx_line,
21942                           _("invalid swi expression"));
21943           newval = md_chars_to_number (buf, INSN_SIZE);
21944           newval |= value;
21945           md_number_to_chars (buf, newval, INSN_SIZE);
21946         }
21947       break;
21948
21949     case BFD_RELOC_ARM_MULTI:
21950       if (((unsigned long) value) > 0xffff)
21951         as_bad_where (fixP->fx_file, fixP->fx_line,
21952                       _("invalid expression in load/store multiple"));
21953       newval = value | md_chars_to_number (buf, INSN_SIZE);
21954       md_number_to_chars (buf, newval, INSN_SIZE);
21955       break;
21956
21957 #ifdef OBJ_ELF
21958     case BFD_RELOC_ARM_PCREL_CALL:
21959
21960       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21961           && fixP->fx_addsy
21962           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21963           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21964           && THUMB_IS_FUNC (fixP->fx_addsy))
21965         /* Flip the bl to blx. This is a simple flip
21966            bit here because we generate PCREL_CALL for
21967            unconditional bls.  */
21968         {
21969           newval = md_chars_to_number (buf, INSN_SIZE);
21970           newval = newval | 0x10000000;
21971           md_number_to_chars (buf, newval, INSN_SIZE);
21972           temp = 1;
21973           fixP->fx_done = 1;
21974         }
21975       else
21976         temp = 3;
21977       goto arm_branch_common;
21978
21979     case BFD_RELOC_ARM_PCREL_JUMP:
21980       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21981           && fixP->fx_addsy
21982           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21983           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21984           && THUMB_IS_FUNC (fixP->fx_addsy))
21985         {
21986           /* This would map to a bl<cond>, b<cond>,
21987              b<always> to a Thumb function. We
21988              need to force a relocation for this particular
21989              case.  */
21990           newval = md_chars_to_number (buf, INSN_SIZE);
21991           fixP->fx_done = 0;
21992         }
21993
21994     case BFD_RELOC_ARM_PLT32:
21995 #endif
21996     case BFD_RELOC_ARM_PCREL_BRANCH:
21997       temp = 3;
21998       goto arm_branch_common;
21999
22000     case BFD_RELOC_ARM_PCREL_BLX:
22001
22002       temp = 1;
22003       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22004           && fixP->fx_addsy
22005           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22006           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22007           && ARM_IS_FUNC (fixP->fx_addsy))
22008         {
22009           /* Flip the blx to a bl and warn.  */
22010           const char *name = S_GET_NAME (fixP->fx_addsy);
22011           newval = 0xeb000000;
22012           as_warn_where (fixP->fx_file, fixP->fx_line,
22013                          _("blx to '%s' an ARM ISA state function changed to bl"),
22014                           name);
22015           md_number_to_chars (buf, newval, INSN_SIZE);
22016           temp = 3;
22017           fixP->fx_done = 1;
22018         }
22019
22020 #ifdef OBJ_ELF
22021        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22022          fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
22023 #endif
22024
22025     arm_branch_common:
22026       /* We are going to store value (shifted right by two) in the
22027          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
22028          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
22029          also be be clear.  */
22030       if (value & temp)
22031         as_bad_where (fixP->fx_file, fixP->fx_line,
22032                       _("misaligned branch destination"));
22033       if ((value & (offsetT)0xfe000000) != (offsetT)0
22034           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
22035         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22036
22037       if (fixP->fx_done || !seg->use_rela_p)
22038         {
22039           newval = md_chars_to_number (buf, INSN_SIZE);
22040           newval |= (value >> 2) & 0x00ffffff;
22041           /* Set the H bit on BLX instructions.  */
22042           if (temp == 1)
22043             {
22044               if (value & 2)
22045                 newval |= 0x01000000;
22046               else
22047                 newval &= ~0x01000000;
22048             }
22049           md_number_to_chars (buf, newval, INSN_SIZE);
22050         }
22051       break;
22052
22053     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
22054       /* CBZ can only branch forward.  */
22055
22056       /* Attempts to use CBZ to branch to the next instruction
22057          (which, strictly speaking, are prohibited) will be turned into
22058          no-ops.
22059
22060          FIXME: It may be better to remove the instruction completely and
22061          perform relaxation.  */
22062       if (value == -2)
22063         {
22064           newval = md_chars_to_number (buf, THUMB_SIZE);
22065           newval = 0xbf00; /* NOP encoding T1 */
22066           md_number_to_chars (buf, newval, THUMB_SIZE);
22067         }
22068       else
22069         {
22070           if (value & ~0x7e)
22071             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22072
22073           if (fixP->fx_done || !seg->use_rela_p)
22074             {
22075               newval = md_chars_to_number (buf, THUMB_SIZE);
22076               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
22077               md_number_to_chars (buf, newval, THUMB_SIZE);
22078             }
22079         }
22080       break;
22081
22082     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
22083       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
22084         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22085
22086       if (fixP->fx_done || !seg->use_rela_p)
22087         {
22088           newval = md_chars_to_number (buf, THUMB_SIZE);
22089           newval |= (value & 0x1ff) >> 1;
22090           md_number_to_chars (buf, newval, THUMB_SIZE);
22091         }
22092       break;
22093
22094     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
22095       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
22096         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22097
22098       if (fixP->fx_done || !seg->use_rela_p)
22099         {
22100           newval = md_chars_to_number (buf, THUMB_SIZE);
22101           newval |= (value & 0xfff) >> 1;
22102           md_number_to_chars (buf, newval, THUMB_SIZE);
22103         }
22104       break;
22105
22106     case BFD_RELOC_THUMB_PCREL_BRANCH20:
22107       if (fixP->fx_addsy
22108           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22109           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22110           && ARM_IS_FUNC (fixP->fx_addsy)
22111           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22112         {
22113           /* Force a relocation for a branch 20 bits wide.  */
22114           fixP->fx_done = 0;
22115         }
22116       if ((value & ~0x1fffff) && ((value & ~0x0fffff) != ~0x0fffff))
22117         as_bad_where (fixP->fx_file, fixP->fx_line,
22118                       _("conditional branch out of range"));
22119
22120       if (fixP->fx_done || !seg->use_rela_p)
22121         {
22122           offsetT newval2;
22123           addressT S, J1, J2, lo, hi;
22124
22125           S  = (value & 0x00100000) >> 20;
22126           J2 = (value & 0x00080000) >> 19;
22127           J1 = (value & 0x00040000) >> 18;
22128           hi = (value & 0x0003f000) >> 12;
22129           lo = (value & 0x00000ffe) >> 1;
22130
22131           newval   = md_chars_to_number (buf, THUMB_SIZE);
22132           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22133           newval  |= (S << 10) | hi;
22134           newval2 |= (J1 << 13) | (J2 << 11) | lo;
22135           md_number_to_chars (buf, newval, THUMB_SIZE);
22136           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
22137         }
22138       break;
22139
22140     case BFD_RELOC_THUMB_PCREL_BLX:
22141       /* If there is a blx from a thumb state function to
22142          another thumb function flip this to a bl and warn
22143          about it.  */
22144
22145       if (fixP->fx_addsy
22146           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22147           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22148           && THUMB_IS_FUNC (fixP->fx_addsy))
22149         {
22150           const char *name = S_GET_NAME (fixP->fx_addsy);
22151           as_warn_where (fixP->fx_file, fixP->fx_line,
22152                          _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
22153                          name);
22154           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22155           newval = newval | 0x1000;
22156           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22157           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22158           fixP->fx_done = 1;
22159         }
22160
22161
22162       goto thumb_bl_common;
22163
22164     case BFD_RELOC_THUMB_PCREL_BRANCH23:
22165       /* A bl from Thumb state ISA to an internal ARM state function
22166          is converted to a blx.  */
22167       if (fixP->fx_addsy
22168           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22169           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22170           && ARM_IS_FUNC (fixP->fx_addsy)
22171           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22172         {
22173           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22174           newval = newval & ~0x1000;
22175           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22176           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
22177           fixP->fx_done = 1;
22178         }
22179
22180     thumb_bl_common:
22181
22182       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22183         /* For a BLX instruction, make sure that the relocation is rounded up
22184            to a word boundary.  This follows the semantics of the instruction
22185            which specifies that bit 1 of the target address will come from bit
22186            1 of the base address.  */
22187         value = (value + 3) & ~ 3;
22188
22189 #ifdef OBJ_ELF
22190        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4
22191            && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22192          fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22193 #endif
22194
22195       if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
22196         {
22197           if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
22198             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22199           else if ((value & ~0x1ffffff)
22200                    && ((value & ~0x1ffffff) != ~0x1ffffff))
22201             as_bad_where (fixP->fx_file, fixP->fx_line,
22202                           _("Thumb2 branch out of range"));
22203         }
22204
22205       if (fixP->fx_done || !seg->use_rela_p)
22206         encode_thumb2_b_bl_offset (buf, value);
22207
22208       break;
22209
22210     case BFD_RELOC_THUMB_PCREL_BRANCH25:
22211       if ((value & ~0x0ffffff) && ((value & ~0x0ffffff) != ~0x0ffffff))
22212         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22213
22214       if (fixP->fx_done || !seg->use_rela_p)
22215           encode_thumb2_b_bl_offset (buf, value);
22216
22217       break;
22218
22219     case BFD_RELOC_8:
22220       if (fixP->fx_done || !seg->use_rela_p)
22221         md_number_to_chars (buf, value, 1);
22222       break;
22223
22224     case BFD_RELOC_16:
22225       if (fixP->fx_done || !seg->use_rela_p)
22226         md_number_to_chars (buf, value, 2);
22227       break;
22228
22229 #ifdef OBJ_ELF
22230     case BFD_RELOC_ARM_TLS_CALL:
22231     case BFD_RELOC_ARM_THM_TLS_CALL:
22232     case BFD_RELOC_ARM_TLS_DESCSEQ:
22233     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
22234       S_SET_THREAD_LOCAL (fixP->fx_addsy);
22235       break;
22236
22237     case BFD_RELOC_ARM_TLS_GOTDESC:
22238     case BFD_RELOC_ARM_TLS_GD32:
22239     case BFD_RELOC_ARM_TLS_LE32:
22240     case BFD_RELOC_ARM_TLS_IE32:
22241     case BFD_RELOC_ARM_TLS_LDM32:
22242     case BFD_RELOC_ARM_TLS_LDO32:
22243       S_SET_THREAD_LOCAL (fixP->fx_addsy);
22244       /* fall through */
22245
22246     case BFD_RELOC_ARM_GOT32:
22247     case BFD_RELOC_ARM_GOTOFF:
22248       if (fixP->fx_done || !seg->use_rela_p)
22249         md_number_to_chars (buf, 0, 4);
22250       break;
22251
22252     case BFD_RELOC_ARM_GOT_PREL:
22253       if (fixP->fx_done || !seg->use_rela_p)
22254         md_number_to_chars (buf, value, 4);
22255       break;
22256
22257     case BFD_RELOC_ARM_TARGET2:
22258       /* TARGET2 is not partial-inplace, so we need to write the
22259          addend here for REL targets, because it won't be written out
22260          during reloc processing later.  */
22261       if (fixP->fx_done || !seg->use_rela_p)
22262         md_number_to_chars (buf, fixP->fx_offset, 4);
22263       break;
22264 #endif
22265
22266     case BFD_RELOC_RVA:
22267     case BFD_RELOC_32:
22268     case BFD_RELOC_ARM_TARGET1:
22269     case BFD_RELOC_ARM_ROSEGREL32:
22270     case BFD_RELOC_ARM_SBREL32:
22271     case BFD_RELOC_32_PCREL:
22272 #ifdef TE_PE
22273     case BFD_RELOC_32_SECREL:
22274 #endif
22275       if (fixP->fx_done || !seg->use_rela_p)
22276 #ifdef TE_WINCE
22277         /* For WinCE we only do this for pcrel fixups.  */
22278         if (fixP->fx_done || fixP->fx_pcrel)
22279 #endif
22280           md_number_to_chars (buf, value, 4);
22281       break;
22282
22283 #ifdef OBJ_ELF
22284     case BFD_RELOC_ARM_PREL31:
22285       if (fixP->fx_done || !seg->use_rela_p)
22286         {
22287           newval = md_chars_to_number (buf, 4) & 0x80000000;
22288           if ((value ^ (value >> 1)) & 0x40000000)
22289             {
22290               as_bad_where (fixP->fx_file, fixP->fx_line,
22291                             _("rel31 relocation overflow"));
22292             }
22293           newval |= value & 0x7fffffff;
22294           md_number_to_chars (buf, newval, 4);
22295         }
22296       break;
22297 #endif
22298
22299     case BFD_RELOC_ARM_CP_OFF_IMM:
22300     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
22301       if (value < -1023 || value > 1023 || (value & 3))
22302         as_bad_where (fixP->fx_file, fixP->fx_line,
22303                       _("co-processor offset out of range"));
22304     cp_off_common:
22305       sign = value > 0;
22306       if (value < 0)
22307         value = -value;
22308       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22309           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22310         newval = md_chars_to_number (buf, INSN_SIZE);
22311       else
22312         newval = get_thumb32_insn (buf);
22313       if (value == 0)
22314         newval &= 0xffffff00;
22315       else
22316         {
22317           newval &= 0xff7fff00;
22318           newval |= (value >> 2) | (sign ? INDEX_UP : 0);
22319         }
22320       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22321           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22322         md_number_to_chars (buf, newval, INSN_SIZE);
22323       else
22324         put_thumb32_insn (buf, newval);
22325       break;
22326
22327     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
22328     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
22329       if (value < -255 || value > 255)
22330         as_bad_where (fixP->fx_file, fixP->fx_line,
22331                       _("co-processor offset out of range"));
22332       value *= 4;
22333       goto cp_off_common;
22334
22335     case BFD_RELOC_ARM_THUMB_OFFSET:
22336       newval = md_chars_to_number (buf, THUMB_SIZE);
22337       /* Exactly what ranges, and where the offset is inserted depends
22338          on the type of instruction, we can establish this from the
22339          top 4 bits.  */
22340       switch (newval >> 12)
22341         {
22342         case 4: /* PC load.  */
22343           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
22344              forced to zero for these loads; md_pcrel_from has already
22345              compensated for this.  */
22346           if (value & 3)
22347             as_bad_where (fixP->fx_file, fixP->fx_line,
22348                           _("invalid offset, target not word aligned (0x%08lX)"),
22349                           (((unsigned long) fixP->fx_frag->fr_address
22350                             + (unsigned long) fixP->fx_where) & ~3)
22351                           + (unsigned long) value);
22352
22353           if (value & ~0x3fc)
22354             as_bad_where (fixP->fx_file, fixP->fx_line,
22355                           _("invalid offset, value too big (0x%08lX)"),
22356                           (long) value);
22357
22358           newval |= value >> 2;
22359           break;
22360
22361         case 9: /* SP load/store.  */
22362           if (value & ~0x3fc)
22363             as_bad_where (fixP->fx_file, fixP->fx_line,
22364                           _("invalid offset, value too big (0x%08lX)"),
22365                           (long) value);
22366           newval |= value >> 2;
22367           break;
22368
22369         case 6: /* Word load/store.  */
22370           if (value & ~0x7c)
22371             as_bad_where (fixP->fx_file, fixP->fx_line,
22372                           _("invalid offset, value too big (0x%08lX)"),
22373                           (long) value);
22374           newval |= value << 4; /* 6 - 2.  */
22375           break;
22376
22377         case 7: /* Byte load/store.  */
22378           if (value & ~0x1f)
22379             as_bad_where (fixP->fx_file, fixP->fx_line,
22380                           _("invalid offset, value too big (0x%08lX)"),
22381                           (long) value);
22382           newval |= value << 6;
22383           break;
22384
22385         case 8: /* Halfword load/store.  */
22386           if (value & ~0x3e)
22387             as_bad_where (fixP->fx_file, fixP->fx_line,
22388                           _("invalid offset, value too big (0x%08lX)"),
22389                           (long) value);
22390           newval |= value << 5; /* 6 - 1.  */
22391           break;
22392
22393         default:
22394           as_bad_where (fixP->fx_file, fixP->fx_line,
22395                         "Unable to process relocation for thumb opcode: %lx",
22396                         (unsigned long) newval);
22397           break;
22398         }
22399       md_number_to_chars (buf, newval, THUMB_SIZE);
22400       break;
22401
22402     case BFD_RELOC_ARM_THUMB_ADD:
22403       /* This is a complicated relocation, since we use it for all of
22404          the following immediate relocations:
22405
22406             3bit ADD/SUB
22407             8bit ADD/SUB
22408             9bit ADD/SUB SP word-aligned
22409            10bit ADD PC/SP word-aligned
22410
22411          The type of instruction being processed is encoded in the
22412          instruction field:
22413
22414            0x8000  SUB
22415            0x00F0  Rd
22416            0x000F  Rs
22417       */
22418       newval = md_chars_to_number (buf, THUMB_SIZE);
22419       {
22420         int rd = (newval >> 4) & 0xf;
22421         int rs = newval & 0xf;
22422         int subtract = !!(newval & 0x8000);
22423
22424         /* Check for HI regs, only very restricted cases allowed:
22425            Adjusting SP, and using PC or SP to get an address.  */
22426         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
22427             || (rs > 7 && rs != REG_SP && rs != REG_PC))
22428           as_bad_where (fixP->fx_file, fixP->fx_line,
22429                         _("invalid Hi register with immediate"));
22430
22431         /* If value is negative, choose the opposite instruction.  */
22432         if (value < 0)
22433           {
22434             value = -value;
22435             subtract = !subtract;
22436             if (value < 0)
22437               as_bad_where (fixP->fx_file, fixP->fx_line,
22438                             _("immediate value out of range"));
22439           }
22440
22441         if (rd == REG_SP)
22442           {
22443             if (value & ~0x1fc)
22444               as_bad_where (fixP->fx_file, fixP->fx_line,
22445                             _("invalid immediate for stack address calculation"));
22446             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
22447             newval |= value >> 2;
22448           }
22449         else if (rs == REG_PC || rs == REG_SP)
22450           {
22451             if (subtract || value & ~0x3fc)
22452               as_bad_where (fixP->fx_file, fixP->fx_line,
22453                             _("invalid immediate for address calculation (value = 0x%08lX)"),
22454                             (unsigned long) value);
22455             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
22456             newval |= rd << 8;
22457             newval |= value >> 2;
22458           }
22459         else if (rs == rd)
22460           {
22461             if (value & ~0xff)
22462               as_bad_where (fixP->fx_file, fixP->fx_line,
22463                             _("immediate value out of range"));
22464             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
22465             newval |= (rd << 8) | value;
22466           }
22467         else
22468           {
22469             if (value & ~0x7)
22470               as_bad_where (fixP->fx_file, fixP->fx_line,
22471                             _("immediate value out of range"));
22472             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
22473             newval |= rd | (rs << 3) | (value << 6);
22474           }
22475       }
22476       md_number_to_chars (buf, newval, THUMB_SIZE);
22477       break;
22478
22479     case BFD_RELOC_ARM_THUMB_IMM:
22480       newval = md_chars_to_number (buf, THUMB_SIZE);
22481       if (value < 0 || value > 255)
22482         as_bad_where (fixP->fx_file, fixP->fx_line,
22483                       _("invalid immediate: %ld is out of range"),
22484                       (long) value);
22485       newval |= value;
22486       md_number_to_chars (buf, newval, THUMB_SIZE);
22487       break;
22488
22489     case BFD_RELOC_ARM_THUMB_SHIFT:
22490       /* 5bit shift value (0..32).  LSL cannot take 32.  */
22491       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
22492       temp = newval & 0xf800;
22493       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
22494         as_bad_where (fixP->fx_file, fixP->fx_line,
22495                       _("invalid shift value: %ld"), (long) value);
22496       /* Shifts of zero must be encoded as LSL.  */
22497       if (value == 0)
22498         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
22499       /* Shifts of 32 are encoded as zero.  */
22500       else if (value == 32)
22501         value = 0;
22502       newval |= value << 6;
22503       md_number_to_chars (buf, newval, THUMB_SIZE);
22504       break;
22505
22506     case BFD_RELOC_VTABLE_INHERIT:
22507     case BFD_RELOC_VTABLE_ENTRY:
22508       fixP->fx_done = 0;
22509       return;
22510
22511     case BFD_RELOC_ARM_MOVW:
22512     case BFD_RELOC_ARM_MOVT:
22513     case BFD_RELOC_ARM_THUMB_MOVW:
22514     case BFD_RELOC_ARM_THUMB_MOVT:
22515       if (fixP->fx_done || !seg->use_rela_p)
22516         {
22517           /* REL format relocations are limited to a 16-bit addend.  */
22518           if (!fixP->fx_done)
22519             {
22520               if (value < -0x8000 || value > 0x7fff)
22521                   as_bad_where (fixP->fx_file, fixP->fx_line,
22522                                 _("offset out of range"));
22523             }
22524           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
22525                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22526             {
22527               value >>= 16;
22528             }
22529
22530           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
22531               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22532             {
22533               newval = get_thumb32_insn (buf);
22534               newval &= 0xfbf08f00;
22535               newval |= (value & 0xf000) << 4;
22536               newval |= (value & 0x0800) << 15;
22537               newval |= (value & 0x0700) << 4;
22538               newval |= (value & 0x00ff);
22539               put_thumb32_insn (buf, newval);
22540             }
22541           else
22542             {
22543               newval = md_chars_to_number (buf, 4);
22544               newval &= 0xfff0f000;
22545               newval |= value & 0x0fff;
22546               newval |= (value & 0xf000) << 4;
22547               md_number_to_chars (buf, newval, 4);
22548             }
22549         }
22550       return;
22551
22552    case BFD_RELOC_ARM_ALU_PC_G0_NC:
22553    case BFD_RELOC_ARM_ALU_PC_G0:
22554    case BFD_RELOC_ARM_ALU_PC_G1_NC:
22555    case BFD_RELOC_ARM_ALU_PC_G1:
22556    case BFD_RELOC_ARM_ALU_PC_G2:
22557    case BFD_RELOC_ARM_ALU_SB_G0_NC:
22558    case BFD_RELOC_ARM_ALU_SB_G0:
22559    case BFD_RELOC_ARM_ALU_SB_G1_NC:
22560    case BFD_RELOC_ARM_ALU_SB_G1:
22561    case BFD_RELOC_ARM_ALU_SB_G2:
22562      gas_assert (!fixP->fx_done);
22563      if (!seg->use_rela_p)
22564        {
22565          bfd_vma insn;
22566          bfd_vma encoded_addend;
22567          bfd_vma addend_abs = abs (value);
22568
22569          /* Check that the absolute value of the addend can be
22570             expressed as an 8-bit constant plus a rotation.  */
22571          encoded_addend = encode_arm_immediate (addend_abs);
22572          if (encoded_addend == (unsigned int) FAIL)
22573            as_bad_where (fixP->fx_file, fixP->fx_line,
22574                          _("the offset 0x%08lX is not representable"),
22575                          (unsigned long) addend_abs);
22576
22577          /* Extract the instruction.  */
22578          insn = md_chars_to_number (buf, INSN_SIZE);
22579
22580          /* If the addend is positive, use an ADD instruction.
22581             Otherwise use a SUB.  Take care not to destroy the S bit.  */
22582          insn &= 0xff1fffff;
22583          if (value < 0)
22584            insn |= 1 << 22;
22585          else
22586            insn |= 1 << 23;
22587
22588          /* Place the encoded addend into the first 12 bits of the
22589             instruction.  */
22590          insn &= 0xfffff000;
22591          insn |= encoded_addend;
22592
22593          /* Update the instruction.  */
22594          md_number_to_chars (buf, insn, INSN_SIZE);
22595        }
22596      break;
22597
22598     case BFD_RELOC_ARM_LDR_PC_G0:
22599     case BFD_RELOC_ARM_LDR_PC_G1:
22600     case BFD_RELOC_ARM_LDR_PC_G2:
22601     case BFD_RELOC_ARM_LDR_SB_G0:
22602     case BFD_RELOC_ARM_LDR_SB_G1:
22603     case BFD_RELOC_ARM_LDR_SB_G2:
22604       gas_assert (!fixP->fx_done);
22605       if (!seg->use_rela_p)
22606         {
22607           bfd_vma insn;
22608           bfd_vma addend_abs = abs (value);
22609
22610           /* Check that the absolute value of the addend can be
22611              encoded in 12 bits.  */
22612           if (addend_abs >= 0x1000)
22613             as_bad_where (fixP->fx_file, fixP->fx_line,
22614                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
22615                           (unsigned long) addend_abs);
22616
22617           /* Extract the instruction.  */
22618           insn = md_chars_to_number (buf, INSN_SIZE);
22619
22620           /* If the addend is negative, clear bit 23 of the instruction.
22621              Otherwise set it.  */
22622           if (value < 0)
22623             insn &= ~(1 << 23);
22624           else
22625             insn |= 1 << 23;
22626
22627           /* Place the absolute value of the addend into the first 12 bits
22628              of the instruction.  */
22629           insn &= 0xfffff000;
22630           insn |= addend_abs;
22631
22632           /* Update the instruction.  */
22633           md_number_to_chars (buf, insn, INSN_SIZE);
22634         }
22635       break;
22636
22637     case BFD_RELOC_ARM_LDRS_PC_G0:
22638     case BFD_RELOC_ARM_LDRS_PC_G1:
22639     case BFD_RELOC_ARM_LDRS_PC_G2:
22640     case BFD_RELOC_ARM_LDRS_SB_G0:
22641     case BFD_RELOC_ARM_LDRS_SB_G1:
22642     case BFD_RELOC_ARM_LDRS_SB_G2:
22643       gas_assert (!fixP->fx_done);
22644       if (!seg->use_rela_p)
22645         {
22646           bfd_vma insn;
22647           bfd_vma addend_abs = abs (value);
22648
22649           /* Check that the absolute value of the addend can be
22650              encoded in 8 bits.  */
22651           if (addend_abs >= 0x100)
22652             as_bad_where (fixP->fx_file, fixP->fx_line,
22653                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
22654                           (unsigned long) addend_abs);
22655
22656           /* Extract the instruction.  */
22657           insn = md_chars_to_number (buf, INSN_SIZE);
22658
22659           /* If the addend is negative, clear bit 23 of the instruction.
22660              Otherwise set it.  */
22661           if (value < 0)
22662             insn &= ~(1 << 23);
22663           else
22664             insn |= 1 << 23;
22665
22666           /* Place the first four bits of the absolute value of the addend
22667              into the first 4 bits of the instruction, and the remaining
22668              four into bits 8 .. 11.  */
22669           insn &= 0xfffff0f0;
22670           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
22671
22672           /* Update the instruction.  */
22673           md_number_to_chars (buf, insn, INSN_SIZE);
22674         }
22675       break;
22676
22677     case BFD_RELOC_ARM_LDC_PC_G0:
22678     case BFD_RELOC_ARM_LDC_PC_G1:
22679     case BFD_RELOC_ARM_LDC_PC_G2:
22680     case BFD_RELOC_ARM_LDC_SB_G0:
22681     case BFD_RELOC_ARM_LDC_SB_G1:
22682     case BFD_RELOC_ARM_LDC_SB_G2:
22683       gas_assert (!fixP->fx_done);
22684       if (!seg->use_rela_p)
22685         {
22686           bfd_vma insn;
22687           bfd_vma addend_abs = abs (value);
22688
22689           /* Check that the absolute value of the addend is a multiple of
22690              four and, when divided by four, fits in 8 bits.  */
22691           if (addend_abs & 0x3)
22692             as_bad_where (fixP->fx_file, fixP->fx_line,
22693                           _("bad offset 0x%08lX (must be word-aligned)"),
22694                           (unsigned long) addend_abs);
22695
22696           if ((addend_abs >> 2) > 0xff)
22697             as_bad_where (fixP->fx_file, fixP->fx_line,
22698                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
22699                           (unsigned long) addend_abs);
22700
22701           /* Extract the instruction.  */
22702           insn = md_chars_to_number (buf, INSN_SIZE);
22703
22704           /* If the addend is negative, clear bit 23 of the instruction.
22705              Otherwise set it.  */
22706           if (value < 0)
22707             insn &= ~(1 << 23);
22708           else
22709             insn |= 1 << 23;
22710
22711           /* Place the addend (divided by four) into the first eight
22712              bits of the instruction.  */
22713           insn &= 0xfffffff0;
22714           insn |= addend_abs >> 2;
22715
22716           /* Update the instruction.  */
22717           md_number_to_chars (buf, insn, INSN_SIZE);
22718         }
22719       break;
22720
22721     case BFD_RELOC_ARM_V4BX:
22722       /* This will need to go in the object file.  */
22723       fixP->fx_done = 0;
22724       break;
22725
22726     case BFD_RELOC_UNUSED:
22727     default:
22728       as_bad_where (fixP->fx_file, fixP->fx_line,
22729                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
22730     }
22731 }
22732
22733 /* Translate internal representation of relocation info to BFD target
22734    format.  */
22735
22736 arelent *
22737 tc_gen_reloc (asection *section, fixS *fixp)
22738 {
22739   arelent * reloc;
22740   bfd_reloc_code_real_type code;
22741
22742   reloc = (arelent *) xmalloc (sizeof (arelent));
22743
22744   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
22745   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
22746   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
22747
22748   if (fixp->fx_pcrel)
22749     {
22750       if (section->use_rela_p)
22751         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
22752       else
22753         fixp->fx_offset = reloc->address;
22754     }
22755   reloc->addend = fixp->fx_offset;
22756
22757   switch (fixp->fx_r_type)
22758     {
22759     case BFD_RELOC_8:
22760       if (fixp->fx_pcrel)
22761         {
22762           code = BFD_RELOC_8_PCREL;
22763           break;
22764         }
22765
22766     case BFD_RELOC_16:
22767       if (fixp->fx_pcrel)
22768         {
22769           code = BFD_RELOC_16_PCREL;
22770           break;
22771         }
22772
22773     case BFD_RELOC_32:
22774       if (fixp->fx_pcrel)
22775         {
22776           code = BFD_RELOC_32_PCREL;
22777           break;
22778         }
22779
22780     case BFD_RELOC_ARM_MOVW:
22781       if (fixp->fx_pcrel)
22782         {
22783           code = BFD_RELOC_ARM_MOVW_PCREL;
22784           break;
22785         }
22786
22787     case BFD_RELOC_ARM_MOVT:
22788       if (fixp->fx_pcrel)
22789         {
22790           code = BFD_RELOC_ARM_MOVT_PCREL;
22791           break;
22792         }
22793
22794     case BFD_RELOC_ARM_THUMB_MOVW:
22795       if (fixp->fx_pcrel)
22796         {
22797           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
22798           break;
22799         }
22800
22801     case BFD_RELOC_ARM_THUMB_MOVT:
22802       if (fixp->fx_pcrel)
22803         {
22804           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
22805           break;
22806         }
22807
22808     case BFD_RELOC_NONE:
22809     case BFD_RELOC_ARM_PCREL_BRANCH:
22810     case BFD_RELOC_ARM_PCREL_BLX:
22811     case BFD_RELOC_RVA:
22812     case BFD_RELOC_THUMB_PCREL_BRANCH7:
22813     case BFD_RELOC_THUMB_PCREL_BRANCH9:
22814     case BFD_RELOC_THUMB_PCREL_BRANCH12:
22815     case BFD_RELOC_THUMB_PCREL_BRANCH20:
22816     case BFD_RELOC_THUMB_PCREL_BRANCH23:
22817     case BFD_RELOC_THUMB_PCREL_BRANCH25:
22818     case BFD_RELOC_VTABLE_ENTRY:
22819     case BFD_RELOC_VTABLE_INHERIT:
22820 #ifdef TE_PE
22821     case BFD_RELOC_32_SECREL:
22822 #endif
22823       code = fixp->fx_r_type;
22824       break;
22825
22826     case BFD_RELOC_THUMB_PCREL_BLX:
22827 #ifdef OBJ_ELF
22828       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22829         code = BFD_RELOC_THUMB_PCREL_BRANCH23;
22830       else
22831 #endif
22832         code = BFD_RELOC_THUMB_PCREL_BLX;
22833       break;
22834
22835     case BFD_RELOC_ARM_LITERAL:
22836     case BFD_RELOC_ARM_HWLITERAL:
22837       /* If this is called then the a literal has
22838          been referenced across a section boundary.  */
22839       as_bad_where (fixp->fx_file, fixp->fx_line,
22840                     _("literal referenced across section boundary"));
22841       return NULL;
22842
22843 #ifdef OBJ_ELF
22844     case BFD_RELOC_ARM_TLS_CALL:
22845     case BFD_RELOC_ARM_THM_TLS_CALL:
22846     case BFD_RELOC_ARM_TLS_DESCSEQ:
22847     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
22848     case BFD_RELOC_ARM_GOT32:
22849     case BFD_RELOC_ARM_GOTOFF:
22850     case BFD_RELOC_ARM_GOT_PREL:
22851     case BFD_RELOC_ARM_PLT32:
22852     case BFD_RELOC_ARM_TARGET1:
22853     case BFD_RELOC_ARM_ROSEGREL32:
22854     case BFD_RELOC_ARM_SBREL32:
22855     case BFD_RELOC_ARM_PREL31:
22856     case BFD_RELOC_ARM_TARGET2:
22857     case BFD_RELOC_ARM_TLS_LE32:
22858     case BFD_RELOC_ARM_TLS_LDO32:
22859     case BFD_RELOC_ARM_PCREL_CALL:
22860     case BFD_RELOC_ARM_PCREL_JUMP:
22861     case BFD_RELOC_ARM_ALU_PC_G0_NC:
22862     case BFD_RELOC_ARM_ALU_PC_G0:
22863     case BFD_RELOC_ARM_ALU_PC_G1_NC:
22864     case BFD_RELOC_ARM_ALU_PC_G1:
22865     case BFD_RELOC_ARM_ALU_PC_G2:
22866     case BFD_RELOC_ARM_LDR_PC_G0:
22867     case BFD_RELOC_ARM_LDR_PC_G1:
22868     case BFD_RELOC_ARM_LDR_PC_G2:
22869     case BFD_RELOC_ARM_LDRS_PC_G0:
22870     case BFD_RELOC_ARM_LDRS_PC_G1:
22871     case BFD_RELOC_ARM_LDRS_PC_G2:
22872     case BFD_RELOC_ARM_LDC_PC_G0:
22873     case BFD_RELOC_ARM_LDC_PC_G1:
22874     case BFD_RELOC_ARM_LDC_PC_G2:
22875     case BFD_RELOC_ARM_ALU_SB_G0_NC:
22876     case BFD_RELOC_ARM_ALU_SB_G0:
22877     case BFD_RELOC_ARM_ALU_SB_G1_NC:
22878     case BFD_RELOC_ARM_ALU_SB_G1:
22879     case BFD_RELOC_ARM_ALU_SB_G2:
22880     case BFD_RELOC_ARM_LDR_SB_G0:
22881     case BFD_RELOC_ARM_LDR_SB_G1:
22882     case BFD_RELOC_ARM_LDR_SB_G2:
22883     case BFD_RELOC_ARM_LDRS_SB_G0:
22884     case BFD_RELOC_ARM_LDRS_SB_G1:
22885     case BFD_RELOC_ARM_LDRS_SB_G2:
22886     case BFD_RELOC_ARM_LDC_SB_G0:
22887     case BFD_RELOC_ARM_LDC_SB_G1:
22888     case BFD_RELOC_ARM_LDC_SB_G2:
22889     case BFD_RELOC_ARM_V4BX:
22890       code = fixp->fx_r_type;
22891       break;
22892
22893     case BFD_RELOC_ARM_TLS_GOTDESC:
22894     case BFD_RELOC_ARM_TLS_GD32:
22895     case BFD_RELOC_ARM_TLS_IE32:
22896     case BFD_RELOC_ARM_TLS_LDM32:
22897       /* BFD will include the symbol's address in the addend.
22898          But we don't want that, so subtract it out again here.  */
22899       if (!S_IS_COMMON (fixp->fx_addsy))
22900         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
22901       code = fixp->fx_r_type;
22902       break;
22903 #endif
22904
22905     case BFD_RELOC_ARM_IMMEDIATE:
22906       as_bad_where (fixp->fx_file, fixp->fx_line,
22907                     _("internal relocation (type: IMMEDIATE) not fixed up"));
22908       return NULL;
22909
22910     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
22911       as_bad_where (fixp->fx_file, fixp->fx_line,
22912                     _("ADRL used for a symbol not defined in the same file"));
22913       return NULL;
22914
22915     case BFD_RELOC_ARM_OFFSET_IMM:
22916       if (section->use_rela_p)
22917         {
22918           code = fixp->fx_r_type;
22919           break;
22920         }
22921
22922       if (fixp->fx_addsy != NULL
22923           && !S_IS_DEFINED (fixp->fx_addsy)
22924           && S_IS_LOCAL (fixp->fx_addsy))
22925         {
22926           as_bad_where (fixp->fx_file, fixp->fx_line,
22927                         _("undefined local label `%s'"),
22928                         S_GET_NAME (fixp->fx_addsy));
22929           return NULL;
22930         }
22931
22932       as_bad_where (fixp->fx_file, fixp->fx_line,
22933                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
22934       return NULL;
22935
22936     default:
22937       {
22938         char * type;
22939
22940         switch (fixp->fx_r_type)
22941           {
22942           case BFD_RELOC_NONE:             type = "NONE";         break;
22943           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
22944           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
22945           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
22946           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
22947           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
22948           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
22949           case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
22950           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
22951           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
22952           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
22953           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
22954           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
22955           default:                         type = _("<unknown>"); break;
22956           }
22957         as_bad_where (fixp->fx_file, fixp->fx_line,
22958                       _("cannot represent %s relocation in this object file format"),
22959                       type);
22960         return NULL;
22961       }
22962     }
22963
22964 #ifdef OBJ_ELF
22965   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
22966       && GOT_symbol
22967       && fixp->fx_addsy == GOT_symbol)
22968     {
22969       code = BFD_RELOC_ARM_GOTPC;
22970       reloc->addend = fixp->fx_offset = reloc->address;
22971     }
22972 #endif
22973
22974   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
22975
22976   if (reloc->howto == NULL)
22977     {
22978       as_bad_where (fixp->fx_file, fixp->fx_line,
22979                     _("cannot represent %s relocation in this object file format"),
22980                     bfd_get_reloc_code_name (code));
22981       return NULL;
22982     }
22983
22984   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
22985      vtable entry to be used in the relocation's section offset.  */
22986   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
22987     reloc->address = fixp->fx_offset;
22988
22989   return reloc;
22990 }
22991
22992 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
22993
22994 void
22995 cons_fix_new_arm (fragS *       frag,
22996                   int           where,
22997                   int           size,
22998                   expressionS * exp)
22999 {
23000   bfd_reloc_code_real_type type;
23001   int pcrel = 0;
23002
23003   /* Pick a reloc.
23004      FIXME: @@ Should look at CPU word size.  */
23005   switch (size)
23006     {
23007     case 1:
23008       type = BFD_RELOC_8;
23009       break;
23010     case 2:
23011       type = BFD_RELOC_16;
23012       break;
23013     case 4:
23014     default:
23015       type = BFD_RELOC_32;
23016       break;
23017     case 8:
23018       type = BFD_RELOC_64;
23019       break;
23020     }
23021
23022 #ifdef TE_PE
23023   if (exp->X_op == O_secrel)
23024   {
23025     exp->X_op = O_symbol;
23026     type = BFD_RELOC_32_SECREL;
23027   }
23028 #endif
23029
23030   fix_new_exp (frag, where, (int) size, exp, pcrel, type);
23031 }
23032
23033 #if defined (OBJ_COFF)
23034 void
23035 arm_validate_fix (fixS * fixP)
23036 {
23037   /* If the destination of the branch is a defined symbol which does not have
23038      the THUMB_FUNC attribute, then we must be calling a function which has
23039      the (interfacearm) attribute.  We look for the Thumb entry point to that
23040      function and change the branch to refer to that function instead.  */
23041   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
23042       && fixP->fx_addsy != NULL
23043       && S_IS_DEFINED (fixP->fx_addsy)
23044       && ! THUMB_IS_FUNC (fixP->fx_addsy))
23045     {
23046       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
23047     }
23048 }
23049 #endif
23050
23051
23052 int
23053 arm_force_relocation (struct fix * fixp)
23054 {
23055 #if defined (OBJ_COFF) && defined (TE_PE)
23056   if (fixp->fx_r_type == BFD_RELOC_RVA)
23057     return 1;
23058 #endif
23059
23060   /* In case we have a call or a branch to a function in ARM ISA mode from
23061      a thumb function or vice-versa force the relocation. These relocations
23062      are cleared off for some cores that might have blx and simple transformations
23063      are possible.  */
23064
23065 #ifdef OBJ_ELF
23066   switch (fixp->fx_r_type)
23067     {
23068     case BFD_RELOC_ARM_PCREL_JUMP:
23069     case BFD_RELOC_ARM_PCREL_CALL:
23070     case BFD_RELOC_THUMB_PCREL_BLX:
23071       if (THUMB_IS_FUNC (fixp->fx_addsy))
23072         return 1;
23073       break;
23074
23075     case BFD_RELOC_ARM_PCREL_BLX:
23076     case BFD_RELOC_THUMB_PCREL_BRANCH25:
23077     case BFD_RELOC_THUMB_PCREL_BRANCH20:
23078     case BFD_RELOC_THUMB_PCREL_BRANCH23:
23079       if (ARM_IS_FUNC (fixp->fx_addsy))
23080         return 1;
23081       break;
23082
23083     default:
23084       break;
23085     }
23086 #endif
23087
23088   /* Resolve these relocations even if the symbol is extern or weak.
23089      Technically this is probably wrong due to symbol preemption.
23090      In practice these relocations do not have enough range to be useful
23091      at dynamic link time, and some code (e.g. in the Linux kernel)
23092      expects these references to be resolved.  */
23093   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
23094       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
23095       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
23096       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
23097       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
23098       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
23099       || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
23100       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
23101       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
23102       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
23103       || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
23104       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
23105       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
23106       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
23107     return 0;
23108
23109   /* Always leave these relocations for the linker.  */
23110   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23111        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23112       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
23113     return 1;
23114
23115   /* Always generate relocations against function symbols.  */
23116   if (fixp->fx_r_type == BFD_RELOC_32
23117       && fixp->fx_addsy
23118       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
23119     return 1;
23120
23121   return generic_force_reloc (fixp);
23122 }
23123
23124 #if defined (OBJ_ELF) || defined (OBJ_COFF)
23125 /* Relocations against function names must be left unadjusted,
23126    so that the linker can use this information to generate interworking
23127    stubs.  The MIPS version of this function
23128    also prevents relocations that are mips-16 specific, but I do not
23129    know why it does this.
23130
23131    FIXME:
23132    There is one other problem that ought to be addressed here, but
23133    which currently is not:  Taking the address of a label (rather
23134    than a function) and then later jumping to that address.  Such
23135    addresses also ought to have their bottom bit set (assuming that
23136    they reside in Thumb code), but at the moment they will not.  */
23137
23138 bfd_boolean
23139 arm_fix_adjustable (fixS * fixP)
23140 {
23141   if (fixP->fx_addsy == NULL)
23142     return 1;
23143
23144   /* Preserve relocations against symbols with function type.  */
23145   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
23146     return FALSE;
23147
23148   if (THUMB_IS_FUNC (fixP->fx_addsy)
23149       && fixP->fx_subsy == NULL)
23150     return FALSE;
23151
23152   /* We need the symbol name for the VTABLE entries.  */
23153   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
23154       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
23155     return FALSE;
23156
23157   /* Don't allow symbols to be discarded on GOT related relocs.  */
23158   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
23159       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
23160       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
23161       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
23162       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
23163       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
23164       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
23165       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
23166       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
23167       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
23168       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
23169       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
23170       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
23171       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
23172     return FALSE;
23173
23174   /* Similarly for group relocations.  */
23175   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23176        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23177       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
23178     return FALSE;
23179
23180   /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
23181   if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
23182       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
23183       || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
23184       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
23185       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
23186       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
23187       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
23188       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
23189     return FALSE;
23190
23191   return TRUE;
23192 }
23193 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
23194
23195 #ifdef OBJ_ELF
23196
23197 const char *
23198 elf32_arm_target_format (void)
23199 {
23200 #ifdef TE_SYMBIAN
23201   return (target_big_endian
23202           ? "elf32-bigarm-symbian"
23203           : "elf32-littlearm-symbian");
23204 #elif defined (TE_VXWORKS)
23205   return (target_big_endian
23206           ? "elf32-bigarm-vxworks"
23207           : "elf32-littlearm-vxworks");
23208 #elif defined (TE_NACL)
23209   return (target_big_endian
23210           ? "elf32-bigarm-nacl"
23211           : "elf32-littlearm-nacl");
23212 #else
23213   if (target_big_endian)
23214     return "elf32-bigarm";
23215   else
23216     return "elf32-littlearm";
23217 #endif
23218 }
23219
23220 void
23221 armelf_frob_symbol (symbolS * symp,
23222                     int *     puntp)
23223 {
23224   elf_frob_symbol (symp, puntp);
23225 }
23226 #endif
23227
23228 /* MD interface: Finalization.  */
23229
23230 void
23231 arm_cleanup (void)
23232 {
23233   literal_pool * pool;
23234
23235   /* Ensure that all the IT blocks are properly closed.  */
23236   check_it_blocks_finished ();
23237
23238   for (pool = list_of_pools; pool; pool = pool->next)
23239     {
23240       /* Put it at the end of the relevant section.  */
23241       subseg_set (pool->section, pool->sub_section);
23242 #ifdef OBJ_ELF
23243       arm_elf_change_section ();
23244 #endif
23245       s_ltorg (0);
23246     }
23247 }
23248
23249 #ifdef OBJ_ELF
23250 /* Remove any excess mapping symbols generated for alignment frags in
23251    SEC.  We may have created a mapping symbol before a zero byte
23252    alignment; remove it if there's a mapping symbol after the
23253    alignment.  */
23254 static void
23255 check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
23256                        void *dummy ATTRIBUTE_UNUSED)
23257 {
23258   segment_info_type *seginfo = seg_info (sec);
23259   fragS *fragp;
23260
23261   if (seginfo == NULL || seginfo->frchainP == NULL)
23262     return;
23263
23264   for (fragp = seginfo->frchainP->frch_root;
23265        fragp != NULL;
23266        fragp = fragp->fr_next)
23267     {
23268       symbolS *sym = fragp->tc_frag_data.last_map;
23269       fragS *next = fragp->fr_next;
23270
23271       /* Variable-sized frags have been converted to fixed size by
23272          this point.  But if this was variable-sized to start with,
23273          there will be a fixed-size frag after it.  So don't handle
23274          next == NULL.  */
23275       if (sym == NULL || next == NULL)
23276         continue;
23277
23278       if (S_GET_VALUE (sym) < next->fr_address)
23279         /* Not at the end of this frag.  */
23280         continue;
23281       know (S_GET_VALUE (sym) == next->fr_address);
23282
23283       do
23284         {
23285           if (next->tc_frag_data.first_map != NULL)
23286             {
23287               /* Next frag starts with a mapping symbol.  Discard this
23288                  one.  */
23289               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23290               break;
23291             }
23292
23293           if (next->fr_next == NULL)
23294             {
23295               /* This mapping symbol is at the end of the section.  Discard
23296                  it.  */
23297               know (next->fr_fix == 0 && next->fr_var == 0);
23298               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23299               break;
23300             }
23301
23302           /* As long as we have empty frags without any mapping symbols,
23303              keep looking.  */
23304           /* If the next frag is non-empty and does not start with a
23305              mapping symbol, then this mapping symbol is required.  */
23306           if (next->fr_address != next->fr_next->fr_address)
23307             break;
23308
23309           next = next->fr_next;
23310         }
23311       while (next != NULL);
23312     }
23313 }
23314 #endif
23315
23316 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
23317    ARM ones.  */
23318
23319 void
23320 arm_adjust_symtab (void)
23321 {
23322 #ifdef OBJ_COFF
23323   symbolS * sym;
23324
23325   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
23326     {
23327       if (ARM_IS_THUMB (sym))
23328         {
23329           if (THUMB_IS_FUNC (sym))
23330             {
23331               /* Mark the symbol as a Thumb function.  */
23332               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
23333                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
23334                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
23335
23336               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
23337                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
23338               else
23339                 as_bad (_("%s: unexpected function type: %d"),
23340                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
23341             }
23342           else switch (S_GET_STORAGE_CLASS (sym))
23343             {
23344             case C_EXT:
23345               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
23346               break;
23347             case C_STAT:
23348               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
23349               break;
23350             case C_LABEL:
23351               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
23352               break;
23353             default:
23354               /* Do nothing.  */
23355               break;
23356             }
23357         }
23358
23359       if (ARM_IS_INTERWORK (sym))
23360         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
23361     }
23362 #endif
23363 #ifdef OBJ_ELF
23364   symbolS * sym;
23365   char      bind;
23366
23367   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
23368     {
23369       if (ARM_IS_THUMB (sym))
23370         {
23371           elf_symbol_type * elf_sym;
23372
23373           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
23374           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
23375
23376           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
23377                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
23378             {
23379               /* If it's a .thumb_func, declare it as so,
23380                  otherwise tag label as .code 16.  */
23381               if (THUMB_IS_FUNC (sym))
23382                 elf_sym->internal_elf_sym.st_target_internal
23383                   = ST_BRANCH_TO_THUMB;
23384               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
23385                 elf_sym->internal_elf_sym.st_info =
23386                   ELF_ST_INFO (bind, STT_ARM_16BIT);
23387             }
23388         }
23389     }
23390
23391   /* Remove any overlapping mapping symbols generated by alignment frags.  */
23392   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
23393   /* Now do generic ELF adjustments.  */
23394   elf_adjust_symtab ();
23395 #endif
23396 }
23397
23398 /* MD interface: Initialization.  */
23399
23400 static void
23401 set_constant_flonums (void)
23402 {
23403   int i;
23404
23405   for (i = 0; i < NUM_FLOAT_VALS; i++)
23406     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
23407       abort ();
23408 }
23409
23410 /* Auto-select Thumb mode if it's the only available instruction set for the
23411    given architecture.  */
23412
23413 static void
23414 autoselect_thumb_from_cpu_variant (void)
23415 {
23416   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
23417     opcode_select (16);
23418 }
23419
23420 void
23421 md_begin (void)
23422 {
23423   unsigned mach;
23424   unsigned int i;
23425
23426   if (   (arm_ops_hsh = hash_new ()) == NULL
23427       || (arm_cond_hsh = hash_new ()) == NULL
23428       || (arm_shift_hsh = hash_new ()) == NULL
23429       || (arm_psr_hsh = hash_new ()) == NULL
23430       || (arm_v7m_psr_hsh = hash_new ()) == NULL
23431       || (arm_reg_hsh = hash_new ()) == NULL
23432       || (arm_reloc_hsh = hash_new ()) == NULL
23433       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
23434     as_fatal (_("virtual memory exhausted"));
23435
23436   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
23437     hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
23438   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
23439     hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
23440   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
23441     hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
23442   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
23443     hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
23444   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
23445     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
23446                  (void *) (v7m_psrs + i));
23447   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
23448     hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
23449   for (i = 0;
23450        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
23451        i++)
23452     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
23453                  (void *) (barrier_opt_names + i));
23454 #ifdef OBJ_ELF
23455   for (i = 0; i < ARRAY_SIZE (reloc_names); i++)
23456     {
23457       struct reloc_entry * entry = reloc_names + i;
23458
23459       if (arm_is_eabi() && entry->reloc == BFD_RELOC_ARM_PLT32)
23460         /* This makes encode_branch() use the EABI versions of this relocation.  */
23461         entry->reloc = BFD_RELOC_UNUSED;
23462
23463       hash_insert (arm_reloc_hsh, entry->name, (void *) entry);
23464     }
23465 #endif
23466
23467   set_constant_flonums ();
23468
23469   /* Set the cpu variant based on the command-line options.  We prefer
23470      -mcpu= over -march= if both are set (as for GCC); and we prefer
23471      -mfpu= over any other way of setting the floating point unit.
23472      Use of legacy options with new options are faulted.  */
23473   if (legacy_cpu)
23474     {
23475       if (mcpu_cpu_opt || march_cpu_opt)
23476         as_bad (_("use of old and new-style options to set CPU type"));
23477
23478       mcpu_cpu_opt = legacy_cpu;
23479     }
23480   else if (!mcpu_cpu_opt)
23481     mcpu_cpu_opt = march_cpu_opt;
23482
23483   if (legacy_fpu)
23484     {
23485       if (mfpu_opt)
23486         as_bad (_("use of old and new-style options to set FPU type"));
23487
23488       mfpu_opt = legacy_fpu;
23489     }
23490   else if (!mfpu_opt)
23491     {
23492 #if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
23493         || defined (TE_NetBSD) || defined (TE_VXWORKS))
23494       /* Some environments specify a default FPU.  If they don't, infer it
23495          from the processor.  */
23496       if (mcpu_fpu_opt)
23497         mfpu_opt = mcpu_fpu_opt;
23498       else
23499         mfpu_opt = march_fpu_opt;
23500 #else
23501       mfpu_opt = &fpu_default;
23502 #endif
23503     }
23504
23505   if (!mfpu_opt)
23506     {
23507       if (mcpu_cpu_opt != NULL)
23508         mfpu_opt = &fpu_default;
23509       else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
23510         mfpu_opt = &fpu_arch_vfp_v2;
23511       else
23512         mfpu_opt = &fpu_arch_fpa;
23513     }
23514
23515 #ifdef CPU_DEFAULT
23516   if (!mcpu_cpu_opt)
23517     {
23518       mcpu_cpu_opt = &cpu_default;
23519       selected_cpu = cpu_default;
23520     }
23521 #else
23522   if (mcpu_cpu_opt)
23523     selected_cpu = *mcpu_cpu_opt;
23524   else
23525     mcpu_cpu_opt = &arm_arch_any;
23526 #endif
23527
23528   ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23529
23530   autoselect_thumb_from_cpu_variant ();
23531
23532   arm_arch_used = thumb_arch_used = arm_arch_none;
23533
23534 #if defined OBJ_COFF || defined OBJ_ELF
23535   {
23536     unsigned int flags = 0;
23537
23538 #if defined OBJ_ELF
23539     flags = meabi_flags;
23540
23541     switch (meabi_flags)
23542       {
23543       case EF_ARM_EABI_UNKNOWN:
23544 #endif
23545         /* Set the flags in the private structure.  */
23546         if (uses_apcs_26)      flags |= F_APCS26;
23547         if (support_interwork) flags |= F_INTERWORK;
23548         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
23549         if (pic_code)          flags |= F_PIC;
23550         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
23551           flags |= F_SOFT_FLOAT;
23552
23553         switch (mfloat_abi_opt)
23554           {
23555           case ARM_FLOAT_ABI_SOFT:
23556           case ARM_FLOAT_ABI_SOFTFP:
23557             flags |= F_SOFT_FLOAT;
23558             break;
23559
23560           case ARM_FLOAT_ABI_HARD:
23561             if (flags & F_SOFT_FLOAT)
23562               as_bad (_("hard-float conflicts with specified fpu"));
23563             break;
23564           }
23565
23566         /* Using pure-endian doubles (even if soft-float).      */
23567         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
23568           flags |= F_VFP_FLOAT;
23569
23570 #if defined OBJ_ELF
23571         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
23572             flags |= EF_ARM_MAVERICK_FLOAT;
23573         break;
23574
23575       case EF_ARM_EABI_VER4:
23576       case EF_ARM_EABI_VER5:
23577         /* No additional flags to set.  */
23578         break;
23579
23580       default:
23581         abort ();
23582       }
23583 #endif
23584     bfd_set_private_flags (stdoutput, flags);
23585
23586     /* We have run out flags in the COFF header to encode the
23587        status of ATPCS support, so instead we create a dummy,
23588        empty, debug section called .arm.atpcs.  */
23589     if (atpcs)
23590       {
23591         asection * sec;
23592
23593         sec = bfd_make_section (stdoutput, ".arm.atpcs");
23594
23595         if (sec != NULL)
23596           {
23597             bfd_set_section_flags
23598               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
23599             bfd_set_section_size (stdoutput, sec, 0);
23600             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
23601           }
23602       }
23603   }
23604 #endif
23605
23606   /* Record the CPU type as well.  */
23607   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
23608     mach = bfd_mach_arm_iWMMXt2;
23609   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
23610     mach = bfd_mach_arm_iWMMXt;
23611   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
23612     mach = bfd_mach_arm_XScale;
23613   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
23614     mach = bfd_mach_arm_ep9312;
23615   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
23616     mach = bfd_mach_arm_5TE;
23617   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
23618     {
23619       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
23620         mach = bfd_mach_arm_5T;
23621       else
23622         mach = bfd_mach_arm_5;
23623     }
23624   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
23625     {
23626       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
23627         mach = bfd_mach_arm_4T;
23628       else
23629         mach = bfd_mach_arm_4;
23630     }
23631   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
23632     mach = bfd_mach_arm_3M;
23633   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
23634     mach = bfd_mach_arm_3;
23635   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
23636     mach = bfd_mach_arm_2a;
23637   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
23638     mach = bfd_mach_arm_2;
23639   else
23640     mach = bfd_mach_arm_unknown;
23641
23642   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
23643 }
23644
23645 /* Command line processing.  */
23646
23647 /* md_parse_option
23648       Invocation line includes a switch not recognized by the base assembler.
23649       See if it's a processor-specific option.
23650
23651       This routine is somewhat complicated by the need for backwards
23652       compatibility (since older releases of gcc can't be changed).
23653       The new options try to make the interface as compatible as
23654       possible with GCC.
23655
23656       New options (supported) are:
23657
23658               -mcpu=<cpu name>           Assemble for selected processor
23659               -march=<architecture name> Assemble for selected architecture
23660               -mfpu=<fpu architecture>   Assemble for selected FPU.
23661               -EB/-mbig-endian           Big-endian
23662               -EL/-mlittle-endian        Little-endian
23663               -k                         Generate PIC code
23664               -mthumb                    Start in Thumb mode
23665               -mthumb-interwork          Code supports ARM/Thumb interworking
23666
23667               -m[no-]warn-deprecated     Warn about deprecated features
23668
23669       For now we will also provide support for:
23670
23671               -mapcs-32                  32-bit Program counter
23672               -mapcs-26                  26-bit Program counter
23673               -macps-float               Floats passed in FP registers
23674               -mapcs-reentrant           Reentrant code
23675               -matpcs
23676       (sometime these will probably be replaced with -mapcs=<list of options>
23677       and -matpcs=<list of options>)
23678
23679       The remaining options are only supported for back-wards compatibility.
23680       Cpu variants, the arm part is optional:
23681               -m[arm]1                Currently not supported.
23682               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
23683               -m[arm]3                Arm 3 processor
23684               -m[arm]6[xx],           Arm 6 processors
23685               -m[arm]7[xx][t][[d]m]   Arm 7 processors
23686               -m[arm]8[10]            Arm 8 processors
23687               -m[arm]9[20][tdmi]      Arm 9 processors
23688               -mstrongarm[110[0]]     StrongARM processors
23689               -mxscale                XScale processors
23690               -m[arm]v[2345[t[e]]]    Arm architectures
23691               -mall                   All (except the ARM1)
23692       FP variants:
23693               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
23694               -mfpe-old               (No float load/store multiples)
23695               -mvfpxd                 VFP Single precision
23696               -mvfp                   All VFP
23697               -mno-fpu                Disable all floating point instructions
23698
23699       The following CPU names are recognized:
23700               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
23701               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
23702               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
23703               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
23704               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
23705               arm10t arm10e, arm1020t, arm1020e, arm10200e,
23706               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
23707
23708       */
23709
23710 const char * md_shortopts = "m:k";
23711
23712 #ifdef ARM_BI_ENDIAN
23713 #define OPTION_EB (OPTION_MD_BASE + 0)
23714 #define OPTION_EL (OPTION_MD_BASE + 1)
23715 #else
23716 #if TARGET_BYTES_BIG_ENDIAN
23717 #define OPTION_EB (OPTION_MD_BASE + 0)
23718 #else
23719 #define OPTION_EL (OPTION_MD_BASE + 1)
23720 #endif
23721 #endif
23722 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
23723
23724 struct option md_longopts[] =
23725 {
23726 #ifdef OPTION_EB
23727   {"EB", no_argument, NULL, OPTION_EB},
23728 #endif
23729 #ifdef OPTION_EL
23730   {"EL", no_argument, NULL, OPTION_EL},
23731 #endif
23732   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
23733   {NULL, no_argument, NULL, 0}
23734 };
23735
23736 size_t md_longopts_size = sizeof (md_longopts);
23737
23738 struct arm_option_table
23739 {
23740   char *option;         /* Option name to match.  */
23741   char *help;           /* Help information.  */
23742   int  *var;            /* Variable to change.  */
23743   int   value;          /* What to change it to.  */
23744   char *deprecated;     /* If non-null, print this message.  */
23745 };
23746
23747 struct arm_option_table arm_opts[] =
23748 {
23749   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
23750   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
23751   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
23752    &support_interwork, 1, NULL},
23753   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
23754   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
23755   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
23756    1, NULL},
23757   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
23758   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
23759   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
23760   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
23761    NULL},
23762
23763   /* These are recognized by the assembler, but have no affect on code.  */
23764   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
23765   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
23766
23767   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
23768   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
23769    &warn_on_deprecated, 0, NULL},
23770   {NULL, NULL, NULL, 0, NULL}
23771 };
23772
23773 struct arm_legacy_option_table
23774 {
23775   char *option;                         /* Option name to match.  */
23776   const arm_feature_set **var;          /* Variable to change.  */
23777   const arm_feature_set value;          /* What to change it to.  */
23778   char *deprecated;                     /* If non-null, print this message.  */
23779 };
23780
23781 const struct arm_legacy_option_table arm_legacy_opts[] =
23782 {
23783   /* DON'T add any new processors to this list -- we want the whole list
23784      to go away...  Add them to the processors table instead.  */
23785   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
23786   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
23787   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
23788   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
23789   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23790   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23791   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23792   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23793   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
23794   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
23795   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
23796   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
23797   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
23798   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
23799   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
23800   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
23801   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
23802   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
23803   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
23804   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
23805   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
23806   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
23807   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
23808   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
23809   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
23810   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
23811   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
23812   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
23813   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
23814   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
23815   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
23816   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
23817   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
23818   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
23819   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23820   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23821   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23822   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23823   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23824   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23825   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
23826   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
23827   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
23828   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
23829   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
23830   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
23831   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23832   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23833   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23834   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23835   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
23836   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
23837   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
23838   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
23839   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
23840   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
23841   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
23842   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
23843   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
23844   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
23845   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
23846   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
23847   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
23848   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
23849   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
23850   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
23851   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
23852   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
23853   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
23854   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
23855    N_("use -mcpu=strongarm110")},
23856   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
23857    N_("use -mcpu=strongarm1100")},
23858   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
23859    N_("use -mcpu=strongarm1110")},
23860   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
23861   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
23862   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
23863
23864   /* Architecture variants -- don't add any more to this list either.  */
23865   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
23866   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
23867   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
23868   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
23869   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
23870   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
23871   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
23872   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
23873   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
23874   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
23875   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
23876   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
23877   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
23878   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
23879   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
23880   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
23881   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
23882   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
23883
23884   /* Floating point variants -- don't add any more to this list either.  */
23885   {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
23886   {"mfpa10",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
23887   {"mfpa11",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
23888   {"mno-fpu",  &legacy_fpu, ARM_ARCH_NONE,
23889    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
23890
23891   {NULL, NULL, ARM_ARCH_NONE, NULL}
23892 };
23893
23894 struct arm_cpu_option_table
23895 {
23896   char *name;
23897   size_t name_len;
23898   const arm_feature_set value;
23899   /* For some CPUs we assume an FPU unless the user explicitly sets
23900      -mfpu=...  */
23901   const arm_feature_set default_fpu;
23902   /* The canonical name of the CPU, or NULL to use NAME converted to upper
23903      case.  */
23904   const char *canonical_name;
23905 };
23906
23907 /* This list should, at a minimum, contain all the cpu names
23908    recognized by GCC.  */
23909 #define ARM_CPU_OPT(N, V, DF, CN) { N, sizeof (N) - 1, V, DF, CN }
23910 static const struct arm_cpu_option_table arm_cpus[] =
23911 {
23912   ARM_CPU_OPT ("all",           ARM_ANY,         FPU_ARCH_FPA,    NULL),
23913   ARM_CPU_OPT ("arm1",          ARM_ARCH_V1,     FPU_ARCH_FPA,    NULL),
23914   ARM_CPU_OPT ("arm2",          ARM_ARCH_V2,     FPU_ARCH_FPA,    NULL),
23915   ARM_CPU_OPT ("arm250",        ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
23916   ARM_CPU_OPT ("arm3",          ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
23917   ARM_CPU_OPT ("arm6",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23918   ARM_CPU_OPT ("arm60",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23919   ARM_CPU_OPT ("arm600",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23920   ARM_CPU_OPT ("arm610",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23921   ARM_CPU_OPT ("arm620",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23922   ARM_CPU_OPT ("arm7",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23923   ARM_CPU_OPT ("arm7m",         ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
23924   ARM_CPU_OPT ("arm7d",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23925   ARM_CPU_OPT ("arm7dm",        ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
23926   ARM_CPU_OPT ("arm7di",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23927   ARM_CPU_OPT ("arm7dmi",       ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
23928   ARM_CPU_OPT ("arm70",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23929   ARM_CPU_OPT ("arm700",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23930   ARM_CPU_OPT ("arm700i",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23931   ARM_CPU_OPT ("arm710",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23932   ARM_CPU_OPT ("arm710t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23933   ARM_CPU_OPT ("arm720",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23934   ARM_CPU_OPT ("arm720t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23935   ARM_CPU_OPT ("arm740t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23936   ARM_CPU_OPT ("arm710c",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23937   ARM_CPU_OPT ("arm7100",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23938   ARM_CPU_OPT ("arm7500",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23939   ARM_CPU_OPT ("arm7500fe",     ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
23940   ARM_CPU_OPT ("arm7t",         ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23941   ARM_CPU_OPT ("arm7tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23942   ARM_CPU_OPT ("arm7tdmi-s",    ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23943   ARM_CPU_OPT ("arm8",          ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
23944   ARM_CPU_OPT ("arm810",        ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
23945   ARM_CPU_OPT ("strongarm",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
23946   ARM_CPU_OPT ("strongarm1",    ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
23947   ARM_CPU_OPT ("strongarm110",  ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
23948   ARM_CPU_OPT ("strongarm1100", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
23949   ARM_CPU_OPT ("strongarm1110", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
23950   ARM_CPU_OPT ("arm9",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23951   ARM_CPU_OPT ("arm920",        ARM_ARCH_V4T,    FPU_ARCH_FPA,    "ARM920T"),
23952   ARM_CPU_OPT ("arm920t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23953   ARM_CPU_OPT ("arm922t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23954   ARM_CPU_OPT ("arm940t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23955   ARM_CPU_OPT ("arm9tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
23956   ARM_CPU_OPT ("fa526",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
23957   ARM_CPU_OPT ("fa626",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
23958   /* For V5 or later processors we default to using VFP; but the user
23959      should really set the FPU type explicitly.  */
23960   ARM_CPU_OPT ("arm9e-r0",      ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23961   ARM_CPU_OPT ("arm9e",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23962   ARM_CPU_OPT ("arm926ej",      ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
23963   ARM_CPU_OPT ("arm926ejs",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
23964   ARM_CPU_OPT ("arm926ej-s",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
23965   ARM_CPU_OPT ("arm946e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23966   ARM_CPU_OPT ("arm946e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM946E-S"),
23967   ARM_CPU_OPT ("arm946e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23968   ARM_CPU_OPT ("arm966e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23969   ARM_CPU_OPT ("arm966e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM966E-S"),
23970   ARM_CPU_OPT ("arm966e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23971   ARM_CPU_OPT ("arm968e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23972   ARM_CPU_OPT ("arm10t",        ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
23973   ARM_CPU_OPT ("arm10tdmi",     ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
23974   ARM_CPU_OPT ("arm10e",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23975   ARM_CPU_OPT ("arm1020",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM1020E"),
23976   ARM_CPU_OPT ("arm1020t",      ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
23977   ARM_CPU_OPT ("arm1020e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23978   ARM_CPU_OPT ("arm1022e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23979   ARM_CPU_OPT ("arm1026ejs",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2,
23980                                                                  "ARM1026EJ-S"),
23981   ARM_CPU_OPT ("arm1026ej-s",   ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
23982   ARM_CPU_OPT ("fa606te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23983   ARM_CPU_OPT ("fa616te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23984   ARM_CPU_OPT ("fa626te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23985   ARM_CPU_OPT ("fmp626",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23986   ARM_CPU_OPT ("fa726te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23987   ARM_CPU_OPT ("arm1136js",     ARM_ARCH_V6,     FPU_NONE,        "ARM1136J-S"),
23988   ARM_CPU_OPT ("arm1136j-s",    ARM_ARCH_V6,     FPU_NONE,        NULL),
23989   ARM_CPU_OPT ("arm1136jfs",    ARM_ARCH_V6,     FPU_ARCH_VFP_V2,
23990                                                                  "ARM1136JF-S"),
23991   ARM_CPU_OPT ("arm1136jf-s",   ARM_ARCH_V6,     FPU_ARCH_VFP_V2, NULL),
23992   ARM_CPU_OPT ("mpcore",        ARM_ARCH_V6K,    FPU_ARCH_VFP_V2, "MPCore"),
23993   ARM_CPU_OPT ("mpcorenovfp",   ARM_ARCH_V6K,    FPU_NONE,        "MPCore"),
23994   ARM_CPU_OPT ("arm1156t2-s",   ARM_ARCH_V6T2,   FPU_NONE,        NULL),
23995   ARM_CPU_OPT ("arm1156t2f-s",  ARM_ARCH_V6T2,   FPU_ARCH_VFP_V2, NULL),
23996   ARM_CPU_OPT ("arm1176jz-s",   ARM_ARCH_V6ZK,   FPU_NONE,        NULL),
23997   ARM_CPU_OPT ("arm1176jzf-s",  ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2, NULL),
23998   ARM_CPU_OPT ("cortex-a5",     ARM_ARCH_V7A_MP_SEC,
23999                                                  FPU_NONE,        "Cortex-A5"),
24000   ARM_CPU_OPT ("cortex-a7",     ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24001                                                                   "Cortex-A7"),
24002   ARM_CPU_OPT ("cortex-a8",     ARM_ARCH_V7A_SEC,
24003                                                  ARM_FEATURE (0, FPU_VFP_V3
24004                                                         | FPU_NEON_EXT_V1),
24005                                                                   "Cortex-A8"),
24006   ARM_CPU_OPT ("cortex-a9",     ARM_ARCH_V7A_MP_SEC,
24007                                                  ARM_FEATURE (0, FPU_VFP_V3
24008                                                         | FPU_NEON_EXT_V1),
24009                                                                   "Cortex-A9"),
24010   ARM_CPU_OPT ("cortex-a12",    ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24011                                                                   "Cortex-A12"),
24012   ARM_CPU_OPT ("cortex-a15",    ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24013                                                                   "Cortex-A15"),
24014   ARM_CPU_OPT ("cortex-a53",    ARM_ARCH_V8A,    FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24015                                                                   "Cortex-A53"),
24016   ARM_CPU_OPT ("cortex-a57",    ARM_ARCH_V8A,    FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24017                                                                   "Cortex-A57"),
24018   ARM_CPU_OPT ("cortex-r4",     ARM_ARCH_V7R,    FPU_NONE,        "Cortex-R4"),
24019   ARM_CPU_OPT ("cortex-r4f",    ARM_ARCH_V7R,    FPU_ARCH_VFP_V3D16,
24020                                                                   "Cortex-R4F"),
24021   ARM_CPU_OPT ("cortex-r5",     ARM_ARCH_V7R_IDIV,
24022                                                  FPU_NONE,        "Cortex-R5"),
24023   ARM_CPU_OPT ("cortex-r7",     ARM_ARCH_V7R_IDIV,
24024                                                  FPU_ARCH_VFP_V3D16,
24025                                                                   "Cortex-R7"),
24026   ARM_CPU_OPT ("cortex-m4",     ARM_ARCH_V7EM,   FPU_NONE,        "Cortex-M4"),
24027   ARM_CPU_OPT ("cortex-m3",     ARM_ARCH_V7M,    FPU_NONE,        "Cortex-M3"),
24028   ARM_CPU_OPT ("cortex-m1",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M1"),
24029   ARM_CPU_OPT ("cortex-m0",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0"),
24030   ARM_CPU_OPT ("cortex-m0plus", ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0+"),
24031   /* ??? XSCALE is really an architecture.  */
24032   ARM_CPU_OPT ("xscale",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
24033   /* ??? iwmmxt is not a processor.  */
24034   ARM_CPU_OPT ("iwmmxt",        ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL),
24035   ARM_CPU_OPT ("iwmmxt2",       ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL),
24036   ARM_CPU_OPT ("i80200",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
24037   /* Maverick */
24038   ARM_CPU_OPT ("ep9312",        ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK),
24039                                                  FPU_ARCH_MAVERICK, "ARM920T"),
24040   /* Marvell processors.  */
24041   ARM_CPU_OPT ("marvell-pj4",   ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC, 0),
24042                                                 FPU_ARCH_VFP_V3D16, NULL),
24043
24044   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
24045 };
24046 #undef ARM_CPU_OPT
24047
24048 struct arm_arch_option_table
24049 {
24050   char *name;
24051   size_t name_len;
24052   const arm_feature_set value;
24053   const arm_feature_set default_fpu;
24054 };
24055
24056 /* This list should, at a minimum, contain all the architecture names
24057    recognized by GCC.  */
24058 #define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF }
24059 static const struct arm_arch_option_table arm_archs[] =
24060 {
24061   ARM_ARCH_OPT ("all",          ARM_ANY,         FPU_ARCH_FPA),
24062   ARM_ARCH_OPT ("armv1",        ARM_ARCH_V1,     FPU_ARCH_FPA),
24063   ARM_ARCH_OPT ("armv2",        ARM_ARCH_V2,     FPU_ARCH_FPA),
24064   ARM_ARCH_OPT ("armv2a",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
24065   ARM_ARCH_OPT ("armv2s",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
24066   ARM_ARCH_OPT ("armv3",        ARM_ARCH_V3,     FPU_ARCH_FPA),
24067   ARM_ARCH_OPT ("armv3m",       ARM_ARCH_V3M,    FPU_ARCH_FPA),
24068   ARM_ARCH_OPT ("armv4",        ARM_ARCH_V4,     FPU_ARCH_FPA),
24069   ARM_ARCH_OPT ("armv4xm",      ARM_ARCH_V4xM,   FPU_ARCH_FPA),
24070   ARM_ARCH_OPT ("armv4t",       ARM_ARCH_V4T,    FPU_ARCH_FPA),
24071   ARM_ARCH_OPT ("armv4txm",     ARM_ARCH_V4TxM,  FPU_ARCH_FPA),
24072   ARM_ARCH_OPT ("armv5",        ARM_ARCH_V5,     FPU_ARCH_VFP),
24073   ARM_ARCH_OPT ("armv5t",       ARM_ARCH_V5T,    FPU_ARCH_VFP),
24074   ARM_ARCH_OPT ("armv5txm",     ARM_ARCH_V5TxM,  FPU_ARCH_VFP),
24075   ARM_ARCH_OPT ("armv5te",      ARM_ARCH_V5TE,   FPU_ARCH_VFP),
24076   ARM_ARCH_OPT ("armv5texp",    ARM_ARCH_V5TExP, FPU_ARCH_VFP),
24077   ARM_ARCH_OPT ("armv5tej",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP),
24078   ARM_ARCH_OPT ("armv6",        ARM_ARCH_V6,     FPU_ARCH_VFP),
24079   ARM_ARCH_OPT ("armv6j",       ARM_ARCH_V6,     FPU_ARCH_VFP),
24080   ARM_ARCH_OPT ("armv6k",       ARM_ARCH_V6K,    FPU_ARCH_VFP),
24081   ARM_ARCH_OPT ("armv6z",       ARM_ARCH_V6Z,    FPU_ARCH_VFP),
24082   ARM_ARCH_OPT ("armv6zk",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP),
24083   ARM_ARCH_OPT ("armv6t2",      ARM_ARCH_V6T2,   FPU_ARCH_VFP),
24084   ARM_ARCH_OPT ("armv6kt2",     ARM_ARCH_V6KT2,  FPU_ARCH_VFP),
24085   ARM_ARCH_OPT ("armv6zt2",     ARM_ARCH_V6ZT2,  FPU_ARCH_VFP),
24086   ARM_ARCH_OPT ("armv6zkt2",    ARM_ARCH_V6ZKT2, FPU_ARCH_VFP),
24087   ARM_ARCH_OPT ("armv6-m",      ARM_ARCH_V6M,    FPU_ARCH_VFP),
24088   ARM_ARCH_OPT ("armv6s-m",     ARM_ARCH_V6SM,   FPU_ARCH_VFP),
24089   ARM_ARCH_OPT ("armv7",        ARM_ARCH_V7,     FPU_ARCH_VFP),
24090   /* The official spelling of the ARMv7 profile variants is the dashed form.
24091      Accept the non-dashed form for compatibility with old toolchains.  */
24092   ARM_ARCH_OPT ("armv7a",       ARM_ARCH_V7A,    FPU_ARCH_VFP),
24093   ARM_ARCH_OPT ("armv7ve",      ARM_ARCH_V7VE,   FPU_ARCH_VFP),
24094   ARM_ARCH_OPT ("armv7r",       ARM_ARCH_V7R,    FPU_ARCH_VFP),
24095   ARM_ARCH_OPT ("armv7m",       ARM_ARCH_V7M,    FPU_ARCH_VFP),
24096   ARM_ARCH_OPT ("armv7-a",      ARM_ARCH_V7A,    FPU_ARCH_VFP),
24097   ARM_ARCH_OPT ("armv7-r",      ARM_ARCH_V7R,    FPU_ARCH_VFP),
24098   ARM_ARCH_OPT ("armv7-m",      ARM_ARCH_V7M,    FPU_ARCH_VFP),
24099   ARM_ARCH_OPT ("armv7e-m",     ARM_ARCH_V7EM,   FPU_ARCH_VFP),
24100   ARM_ARCH_OPT ("armv8-a",      ARM_ARCH_V8A,    FPU_ARCH_VFP),
24101   ARM_ARCH_OPT ("xscale",       ARM_ARCH_XSCALE, FPU_ARCH_VFP),
24102   ARM_ARCH_OPT ("iwmmxt",       ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
24103   ARM_ARCH_OPT ("iwmmxt2",      ARM_ARCH_IWMMXT2,FPU_ARCH_VFP),
24104   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
24105 };
24106 #undef ARM_ARCH_OPT
24107
24108 /* ISA extensions in the co-processor and main instruction set space.  */
24109 struct arm_option_extension_value_table
24110 {
24111   char *name;
24112   size_t name_len;
24113   const arm_feature_set value;
24114   const arm_feature_set allowed_archs;
24115 };
24116
24117 /* The following table must be in alphabetical order with a NULL last entry.
24118    */
24119 #define ARM_EXT_OPT(N, V, AA) { N, sizeof (N) - 1, V, AA }
24120 static const struct arm_option_extension_value_table arm_extensions[] =
24121 {
24122   ARM_EXT_OPT ("crc",  ARCH_CRC_ARMV8, ARM_FEATURE (ARM_EXT_V8, 0)),
24123   ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24124                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24125   ARM_EXT_OPT ("fp",     FPU_ARCH_VFP_ARMV8,
24126                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24127   ARM_EXT_OPT ("idiv",  ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
24128                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
24129   ARM_EXT_OPT ("iwmmxt",ARM_FEATURE (0, ARM_CEXT_IWMMXT),       ARM_ANY),
24130   ARM_EXT_OPT ("iwmmxt2",
24131                         ARM_FEATURE (0, ARM_CEXT_IWMMXT2),      ARM_ANY),
24132   ARM_EXT_OPT ("maverick",
24133                         ARM_FEATURE (0, ARM_CEXT_MAVERICK),     ARM_ANY),
24134   ARM_EXT_OPT ("mp",    ARM_FEATURE (ARM_EXT_MP, 0),
24135                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
24136   ARM_EXT_OPT ("simd",   FPU_ARCH_NEON_VFP_ARMV8,
24137                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24138   ARM_EXT_OPT ("os",    ARM_FEATURE (ARM_EXT_OS, 0),
24139                                    ARM_FEATURE (ARM_EXT_V6M, 0)),
24140   ARM_EXT_OPT ("sec",   ARM_FEATURE (ARM_EXT_SEC, 0),
24141                                    ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)),
24142   ARM_EXT_OPT ("virt",  ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV
24143                                      | ARM_EXT_DIV, 0),
24144                                    ARM_FEATURE (ARM_EXT_V7A, 0)),
24145   ARM_EXT_OPT ("xscale",ARM_FEATURE (0, ARM_CEXT_XSCALE),       ARM_ANY),
24146   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
24147 };
24148 #undef ARM_EXT_OPT
24149
24150 /* ISA floating-point and Advanced SIMD extensions.  */
24151 struct arm_option_fpu_value_table
24152 {
24153   char *name;
24154   const arm_feature_set value;
24155 };
24156
24157 /* This list should, at a minimum, contain all the fpu names
24158    recognized by GCC.  */
24159 static const struct arm_option_fpu_value_table arm_fpus[] =
24160 {
24161   {"softfpa",           FPU_NONE},
24162   {"fpe",               FPU_ARCH_FPE},
24163   {"fpe2",              FPU_ARCH_FPE},
24164   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
24165   {"fpa",               FPU_ARCH_FPA},
24166   {"fpa10",             FPU_ARCH_FPA},
24167   {"fpa11",             FPU_ARCH_FPA},
24168   {"arm7500fe",         FPU_ARCH_FPA},
24169   {"softvfp",           FPU_ARCH_VFP},
24170   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
24171   {"vfp",               FPU_ARCH_VFP_V2},
24172   {"vfp9",              FPU_ARCH_VFP_V2},
24173   {"vfp3",              FPU_ARCH_VFP_V3}, /* For backwards compatbility.  */
24174   {"vfp10",             FPU_ARCH_VFP_V2},
24175   {"vfp10-r0",          FPU_ARCH_VFP_V1},
24176   {"vfpxd",             FPU_ARCH_VFP_V1xD},
24177   {"vfpv2",             FPU_ARCH_VFP_V2},
24178   {"vfpv3",             FPU_ARCH_VFP_V3},
24179   {"vfpv3-fp16",        FPU_ARCH_VFP_V3_FP16},
24180   {"vfpv3-d16",         FPU_ARCH_VFP_V3D16},
24181   {"vfpv3-d16-fp16",    FPU_ARCH_VFP_V3D16_FP16},
24182   {"vfpv3xd",           FPU_ARCH_VFP_V3xD},
24183   {"vfpv3xd-fp16",      FPU_ARCH_VFP_V3xD_FP16},
24184   {"arm1020t",          FPU_ARCH_VFP_V1},
24185   {"arm1020e",          FPU_ARCH_VFP_V2},
24186   {"arm1136jfs",        FPU_ARCH_VFP_V2},
24187   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
24188   {"maverick",          FPU_ARCH_MAVERICK},
24189   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
24190   {"neon-fp16",         FPU_ARCH_NEON_FP16},
24191   {"vfpv4",             FPU_ARCH_VFP_V4},
24192   {"vfpv4-d16",         FPU_ARCH_VFP_V4D16},
24193   {"fpv4-sp-d16",       FPU_ARCH_VFP_V4_SP_D16},
24194   {"neon-vfpv4",        FPU_ARCH_NEON_VFP_V4},
24195   {"fp-armv8",          FPU_ARCH_VFP_ARMV8},
24196   {"neon-fp-armv8",     FPU_ARCH_NEON_VFP_ARMV8},
24197   {"crypto-neon-fp-armv8",
24198                         FPU_ARCH_CRYPTO_NEON_VFP_ARMV8},
24199   {NULL,                ARM_ARCH_NONE}
24200 };
24201
24202 struct arm_option_value_table
24203 {
24204   char *name;
24205   long value;
24206 };
24207
24208 static const struct arm_option_value_table arm_float_abis[] =
24209 {
24210   {"hard",      ARM_FLOAT_ABI_HARD},
24211   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
24212   {"soft",      ARM_FLOAT_ABI_SOFT},
24213   {NULL,        0}
24214 };
24215
24216 #ifdef OBJ_ELF
24217 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
24218 static const struct arm_option_value_table arm_eabis[] =
24219 {
24220   {"gnu",       EF_ARM_EABI_UNKNOWN},
24221   {"4",         EF_ARM_EABI_VER4},
24222   {"5",         EF_ARM_EABI_VER5},
24223   {NULL,        0}
24224 };
24225 #endif
24226
24227 struct arm_long_option_table
24228 {
24229   char * option;                /* Substring to match.  */
24230   char * help;                  /* Help information.  */
24231   int (* func) (char * subopt); /* Function to decode sub-option.  */
24232   char * deprecated;            /* If non-null, print this message.  */
24233 };
24234
24235 static bfd_boolean
24236 arm_parse_extension (char *str, const arm_feature_set **opt_p)
24237 {
24238   arm_feature_set *ext_set = (arm_feature_set *)
24239       xmalloc (sizeof (arm_feature_set));
24240
24241   /* We insist on extensions being specified in alphabetical order, and with
24242      extensions being added before being removed.  We achieve this by having
24243      the global ARM_EXTENSIONS table in alphabetical order, and using the
24244      ADDING_VALUE variable to indicate whether we are adding an extension (1)
24245      or removing it (0) and only allowing it to change in the order
24246      -1 -> 1 -> 0.  */
24247   const struct arm_option_extension_value_table * opt = NULL;
24248   int adding_value = -1;
24249
24250   /* Copy the feature set, so that we can modify it.  */
24251   *ext_set = **opt_p;
24252   *opt_p = ext_set;
24253
24254   while (str != NULL && *str != 0)
24255     {
24256       char *ext;
24257       size_t len;
24258
24259       if (*str != '+')
24260         {
24261           as_bad (_("invalid architectural extension"));
24262           return FALSE;
24263         }
24264
24265       str++;
24266       ext = strchr (str, '+');
24267
24268       if (ext != NULL)
24269         len = ext - str;
24270       else
24271         len = strlen (str);
24272
24273       if (len >= 2 && strncmp (str, "no", 2) == 0)
24274         {
24275           if (adding_value != 0)
24276             {
24277               adding_value = 0;
24278               opt = arm_extensions;
24279             }
24280
24281           len -= 2;
24282           str += 2;
24283         }
24284       else if (len > 0)
24285         {
24286           if (adding_value == -1)
24287             {
24288               adding_value = 1;
24289               opt = arm_extensions;
24290             }
24291           else if (adding_value != 1)
24292             {
24293               as_bad (_("must specify extensions to add before specifying "
24294                         "those to remove"));
24295               return FALSE;
24296             }
24297         }
24298
24299       if (len == 0)
24300         {
24301           as_bad (_("missing architectural extension"));
24302           return FALSE;
24303         }
24304
24305       gas_assert (adding_value != -1);
24306       gas_assert (opt != NULL);
24307
24308       /* Scan over the options table trying to find an exact match. */
24309       for (; opt->name != NULL; opt++)
24310         if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24311           {
24312             /* Check we can apply the extension to this architecture.  */
24313             if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
24314               {
24315                 as_bad (_("extension does not apply to the base architecture"));
24316                 return FALSE;
24317               }
24318
24319             /* Add or remove the extension.  */
24320             if (adding_value)
24321               ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
24322             else
24323               ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
24324
24325             break;
24326           }
24327
24328       if (opt->name == NULL)
24329         {
24330           /* Did we fail to find an extension because it wasn't specified in
24331              alphabetical order, or because it does not exist?  */
24332
24333           for (opt = arm_extensions; opt->name != NULL; opt++)
24334             if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24335               break;
24336
24337           if (opt->name == NULL)
24338             as_bad (_("unknown architectural extension `%s'"), str);
24339           else
24340             as_bad (_("architectural extensions must be specified in "
24341                       "alphabetical order"));
24342
24343           return FALSE;
24344         }
24345       else
24346         {
24347           /* We should skip the extension we've just matched the next time
24348              round.  */
24349           opt++;
24350         }
24351
24352       str = ext;
24353     };
24354
24355   return TRUE;
24356 }
24357
24358 static bfd_boolean
24359 arm_parse_cpu (char *str)
24360 {
24361   const struct arm_cpu_option_table *opt;
24362   char *ext = strchr (str, '+');
24363   size_t len;
24364
24365   if (ext != NULL)
24366     len = ext - str;
24367   else
24368     len = strlen (str);
24369
24370   if (len == 0)
24371     {
24372       as_bad (_("missing cpu name `%s'"), str);
24373       return FALSE;
24374     }
24375
24376   for (opt = arm_cpus; opt->name != NULL; opt++)
24377     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24378       {
24379         mcpu_cpu_opt = &opt->value;
24380         mcpu_fpu_opt = &opt->default_fpu;
24381         if (opt->canonical_name)
24382           strcpy (selected_cpu_name, opt->canonical_name);
24383         else
24384           {
24385             size_t i;
24386
24387             for (i = 0; i < len; i++)
24388               selected_cpu_name[i] = TOUPPER (opt->name[i]);
24389             selected_cpu_name[i] = 0;
24390           }
24391
24392         if (ext != NULL)
24393           return arm_parse_extension (ext, &mcpu_cpu_opt);
24394
24395         return TRUE;
24396       }
24397
24398   as_bad (_("unknown cpu `%s'"), str);
24399   return FALSE;
24400 }
24401
24402 static bfd_boolean
24403 arm_parse_arch (char *str)
24404 {
24405   const struct arm_arch_option_table *opt;
24406   char *ext = strchr (str, '+');
24407   size_t len;
24408
24409   if (ext != NULL)
24410     len = ext - str;
24411   else
24412     len = strlen (str);
24413
24414   if (len == 0)
24415     {
24416       as_bad (_("missing architecture name `%s'"), str);
24417       return FALSE;
24418     }
24419
24420   for (opt = arm_archs; opt->name != NULL; opt++)
24421     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24422       {
24423         march_cpu_opt = &opt->value;
24424         march_fpu_opt = &opt->default_fpu;
24425         strcpy (selected_cpu_name, opt->name);
24426
24427         if (ext != NULL)
24428           return arm_parse_extension (ext, &march_cpu_opt);
24429
24430         return TRUE;
24431       }
24432
24433   as_bad (_("unknown architecture `%s'\n"), str);
24434   return FALSE;
24435 }
24436
24437 static bfd_boolean
24438 arm_parse_fpu (char * str)
24439 {
24440   const struct arm_option_fpu_value_table * opt;
24441
24442   for (opt = arm_fpus; opt->name != NULL; opt++)
24443     if (streq (opt->name, str))
24444       {
24445         mfpu_opt = &opt->value;
24446         return TRUE;
24447       }
24448
24449   as_bad (_("unknown floating point format `%s'\n"), str);
24450   return FALSE;
24451 }
24452
24453 static bfd_boolean
24454 arm_parse_float_abi (char * str)
24455 {
24456   const struct arm_option_value_table * opt;
24457
24458   for (opt = arm_float_abis; opt->name != NULL; opt++)
24459     if (streq (opt->name, str))
24460       {
24461         mfloat_abi_opt = opt->value;
24462         return TRUE;
24463       }
24464
24465   as_bad (_("unknown floating point abi `%s'\n"), str);
24466   return FALSE;
24467 }
24468
24469 #ifdef OBJ_ELF
24470 static bfd_boolean
24471 arm_parse_eabi (char * str)
24472 {
24473   const struct arm_option_value_table *opt;
24474
24475   for (opt = arm_eabis; opt->name != NULL; opt++)
24476     if (streq (opt->name, str))
24477       {
24478         meabi_flags = opt->value;
24479         return TRUE;
24480       }
24481   as_bad (_("unknown EABI `%s'\n"), str);
24482   return FALSE;
24483 }
24484 #endif
24485
24486 static bfd_boolean
24487 arm_parse_it_mode (char * str)
24488 {
24489   bfd_boolean ret = TRUE;
24490
24491   if (streq ("arm", str))
24492     implicit_it_mode = IMPLICIT_IT_MODE_ARM;
24493   else if (streq ("thumb", str))
24494     implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
24495   else if (streq ("always", str))
24496     implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
24497   else if (streq ("never", str))
24498     implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
24499   else
24500     {
24501       as_bad (_("unknown implicit IT mode `%s', should be "\
24502                 "arm, thumb, always, or never."), str);
24503       ret = FALSE;
24504     }
24505
24506   return ret;
24507 }
24508
24509 struct arm_long_option_table arm_long_opts[] =
24510 {
24511   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
24512    arm_parse_cpu, NULL},
24513   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
24514    arm_parse_arch, NULL},
24515   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
24516    arm_parse_fpu, NULL},
24517   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
24518    arm_parse_float_abi, NULL},
24519 #ifdef OBJ_ELF
24520   {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
24521    arm_parse_eabi, NULL},
24522 #endif
24523   {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
24524    arm_parse_it_mode, NULL},
24525   {NULL, NULL, 0, NULL}
24526 };
24527
24528 int
24529 md_parse_option (int c, char * arg)
24530 {
24531   struct arm_option_table *opt;
24532   const struct arm_legacy_option_table *fopt;
24533   struct arm_long_option_table *lopt;
24534
24535   switch (c)
24536     {
24537 #ifdef OPTION_EB
24538     case OPTION_EB:
24539       target_big_endian = 1;
24540       break;
24541 #endif
24542
24543 #ifdef OPTION_EL
24544     case OPTION_EL:
24545       target_big_endian = 0;
24546       break;
24547 #endif
24548
24549     case OPTION_FIX_V4BX:
24550       fix_v4bx = TRUE;
24551       break;
24552
24553     case 'a':
24554       /* Listing option.  Just ignore these, we don't support additional
24555          ones.  */
24556       return 0;
24557
24558     default:
24559       for (opt = arm_opts; opt->option != NULL; opt++)
24560         {
24561           if (c == opt->option[0]
24562               && ((arg == NULL && opt->option[1] == 0)
24563                   || streq (arg, opt->option + 1)))
24564             {
24565               /* If the option is deprecated, tell the user.  */
24566               if (warn_on_deprecated && opt->deprecated != NULL)
24567                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24568                            arg ? arg : "", _(opt->deprecated));
24569
24570               if (opt->var != NULL)
24571                 *opt->var = opt->value;
24572
24573               return 1;
24574             }
24575         }
24576
24577       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
24578         {
24579           if (c == fopt->option[0]
24580               && ((arg == NULL && fopt->option[1] == 0)
24581                   || streq (arg, fopt->option + 1)))
24582             {
24583               /* If the option is deprecated, tell the user.  */
24584               if (warn_on_deprecated && fopt->deprecated != NULL)
24585                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24586                            arg ? arg : "", _(fopt->deprecated));
24587
24588               if (fopt->var != NULL)
24589                 *fopt->var = &fopt->value;
24590
24591               return 1;
24592             }
24593         }
24594
24595       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24596         {
24597           /* These options are expected to have an argument.  */
24598           if (c == lopt->option[0]
24599               && arg != NULL
24600               && strncmp (arg, lopt->option + 1,
24601                           strlen (lopt->option + 1)) == 0)
24602             {
24603               /* If the option is deprecated, tell the user.  */
24604               if (warn_on_deprecated && lopt->deprecated != NULL)
24605                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
24606                            _(lopt->deprecated));
24607
24608               /* Call the sup-option parser.  */
24609               return lopt->func (arg + strlen (lopt->option) - 1);
24610             }
24611         }
24612
24613       return 0;
24614     }
24615
24616   return 1;
24617 }
24618
24619 void
24620 md_show_usage (FILE * fp)
24621 {
24622   struct arm_option_table *opt;
24623   struct arm_long_option_table *lopt;
24624
24625   fprintf (fp, _(" ARM-specific assembler options:\n"));
24626
24627   for (opt = arm_opts; opt->option != NULL; opt++)
24628     if (opt->help != NULL)
24629       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
24630
24631   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24632     if (lopt->help != NULL)
24633       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
24634
24635 #ifdef OPTION_EB
24636   fprintf (fp, _("\
24637   -EB                     assemble code for a big-endian cpu\n"));
24638 #endif
24639
24640 #ifdef OPTION_EL
24641   fprintf (fp, _("\
24642   -EL                     assemble code for a little-endian cpu\n"));
24643 #endif
24644
24645   fprintf (fp, _("\
24646   --fix-v4bx              Allow BX in ARMv4 code\n"));
24647 }
24648
24649
24650 #ifdef OBJ_ELF
24651 typedef struct
24652 {
24653   int val;
24654   arm_feature_set flags;
24655 } cpu_arch_ver_table;
24656
24657 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
24658    least features first.  */
24659 static const cpu_arch_ver_table cpu_arch_ver[] =
24660 {
24661     {1, ARM_ARCH_V4},
24662     {2, ARM_ARCH_V4T},
24663     {3, ARM_ARCH_V5},
24664     {3, ARM_ARCH_V5T},
24665     {4, ARM_ARCH_V5TE},
24666     {5, ARM_ARCH_V5TEJ},
24667     {6, ARM_ARCH_V6},
24668     {9, ARM_ARCH_V6K},
24669     {7, ARM_ARCH_V6Z},
24670     {11, ARM_ARCH_V6M},
24671     {12, ARM_ARCH_V6SM},
24672     {8, ARM_ARCH_V6T2},
24673     {10, ARM_ARCH_V7VE},
24674     {10, ARM_ARCH_V7R},
24675     {10, ARM_ARCH_V7M},
24676     {14, ARM_ARCH_V8A},
24677     {0, ARM_ARCH_NONE}
24678 };
24679
24680 /* Set an attribute if it has not already been set by the user.  */
24681 static void
24682 aeabi_set_attribute_int (int tag, int value)
24683 {
24684   if (tag < 1
24685       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24686       || !attributes_set_explicitly[tag])
24687     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
24688 }
24689
24690 static void
24691 aeabi_set_attribute_string (int tag, const char *value)
24692 {
24693   if (tag < 1
24694       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24695       || !attributes_set_explicitly[tag])
24696     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
24697 }
24698
24699 /* Set the public EABI object attributes.  */
24700 static void
24701 aeabi_set_public_attributes (void)
24702 {
24703   int arch;
24704   char profile;
24705   int virt_sec = 0;
24706   int fp16_optional = 0;
24707   arm_feature_set flags;
24708   arm_feature_set tmp;
24709   const cpu_arch_ver_table *p;
24710
24711   /* Choose the architecture based on the capabilities of the requested cpu
24712      (if any) and/or the instructions actually used.  */
24713   ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
24714   ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
24715   ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
24716
24717   if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
24718     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
24719
24720   if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
24721     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
24722
24723   /* Allow the user to override the reported architecture.  */
24724   if (object_arch)
24725     {
24726       ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
24727       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
24728     }
24729
24730   /* We need to make sure that the attributes do not identify us as v6S-M
24731      when the only v6S-M feature in use is the Operating System Extensions.  */
24732   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
24733       if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
24734         ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
24735
24736   tmp = flags;
24737   arch = 0;
24738   for (p = cpu_arch_ver; p->val; p++)
24739     {
24740       if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
24741         {
24742           arch = p->val;
24743           ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
24744         }
24745     }
24746
24747   /* The table lookup above finds the last architecture to contribute
24748      a new feature.  Unfortunately, Tag13 is a subset of the union of
24749      v6T2 and v7-M, so it is never seen as contributing a new feature.
24750      We can not search for the last entry which is entirely used,
24751      because if no CPU is specified we build up only those flags
24752      actually used.  Perhaps we should separate out the specified
24753      and implicit cases.  Avoid taking this path for -march=all by
24754      checking for contradictory v7-A / v7-M features.  */
24755   if (arch == 10
24756       && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
24757       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
24758       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
24759     arch = 13;
24760
24761   /* Tag_CPU_name.  */
24762   if (selected_cpu_name[0])
24763     {
24764       char *q;
24765
24766       q = selected_cpu_name;
24767       if (strncmp (q, "armv", 4) == 0)
24768         {
24769           int i;
24770
24771           q += 4;
24772           for (i = 0; q[i]; i++)
24773             q[i] = TOUPPER (q[i]);
24774         }
24775       aeabi_set_attribute_string (Tag_CPU_name, q);
24776     }
24777
24778   /* Tag_CPU_arch.  */
24779   aeabi_set_attribute_int (Tag_CPU_arch, arch);
24780
24781   /* Tag_CPU_arch_profile.  */
24782   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
24783     profile = 'A';
24784   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
24785     profile = 'R';
24786   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
24787     profile = 'M';
24788   else
24789     profile = '\0';
24790
24791   if (profile != '\0')
24792     aeabi_set_attribute_int (Tag_CPU_arch_profile, profile);
24793
24794   /* Tag_ARM_ISA_use.  */
24795   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
24796       || arch == 0)
24797     aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
24798
24799   /* Tag_THUMB_ISA_use.  */
24800   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
24801       || arch == 0)
24802     aeabi_set_attribute_int (Tag_THUMB_ISA_use,
24803         ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
24804
24805   /* Tag_VFP_arch.  */
24806   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_armv8))
24807     aeabi_set_attribute_int (Tag_VFP_arch, 7);
24808   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
24809     aeabi_set_attribute_int (Tag_VFP_arch,
24810                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
24811                              ? 5 : 6);
24812   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
24813     {
24814       fp16_optional = 1;
24815       aeabi_set_attribute_int (Tag_VFP_arch, 3);
24816     }
24817   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
24818     {
24819       aeabi_set_attribute_int (Tag_VFP_arch, 4);
24820       fp16_optional = 1;
24821     }
24822   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
24823     aeabi_set_attribute_int (Tag_VFP_arch, 2);
24824   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
24825            || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
24826     aeabi_set_attribute_int (Tag_VFP_arch, 1);
24827
24828   /* Tag_ABI_HardFP_use.  */
24829   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
24830       && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
24831     aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
24832
24833   /* Tag_WMMX_arch.  */
24834   if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
24835     aeabi_set_attribute_int (Tag_WMMX_arch, 2);
24836   else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
24837     aeabi_set_attribute_int (Tag_WMMX_arch, 1);
24838
24839   /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
24840   if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_armv8))
24841     aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 3);
24842   else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
24843     {
24844       if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma))
24845         {
24846           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 2);
24847         }
24848       else
24849         {
24850           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 1);
24851           fp16_optional = 1;
24852         }
24853     }
24854
24855   /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
24856   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16) && fp16_optional)
24857     aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
24858
24859   /* Tag_DIV_use.
24860
24861      We set Tag_DIV_use to two when integer divide instructions have been used
24862      in ARM state, or when Thumb integer divide instructions have been used,
24863      but we have no architecture profile set, nor have we any ARM instructions.
24864
24865      For ARMv8 we set the tag to 0 as integer divide is implied by the base
24866      architecture.
24867
24868      For new architectures we will have to check these tests.  */
24869   gas_assert (arch <= TAG_CPU_ARCH_V8);
24870   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v8))
24871     aeabi_set_attribute_int (Tag_DIV_use, 0);
24872   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv)
24873            || (profile == '\0'
24874                && ARM_CPU_HAS_FEATURE (flags, arm_ext_div)
24875                && !ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any)))
24876     aeabi_set_attribute_int (Tag_DIV_use, 2);
24877
24878   /* Tag_MP_extension_use.  */
24879   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
24880     aeabi_set_attribute_int (Tag_MPextension_use, 1);
24881
24882   /* Tag Virtualization_use.  */
24883   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
24884     virt_sec |= 1;
24885   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
24886     virt_sec |= 2;
24887   if (virt_sec != 0)
24888     aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
24889 }
24890
24891 /* Add the default contents for the .ARM.attributes section.  */
24892 void
24893 arm_md_end (void)
24894 {
24895   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
24896     return;
24897
24898   aeabi_set_public_attributes ();
24899 }
24900 #endif /* OBJ_ELF */
24901
24902
24903 /* Parse a .cpu directive.  */
24904
24905 static void
24906 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
24907 {
24908   const struct arm_cpu_option_table *opt;
24909   char *name;
24910   char saved_char;
24911
24912   name = input_line_pointer;
24913   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
24914     input_line_pointer++;
24915   saved_char = *input_line_pointer;
24916   *input_line_pointer = 0;
24917
24918   /* Skip the first "all" entry.  */
24919   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
24920     if (streq (opt->name, name))
24921       {
24922         mcpu_cpu_opt = &opt->value;
24923         selected_cpu = opt->value;
24924         if (opt->canonical_name)
24925           strcpy (selected_cpu_name, opt->canonical_name);
24926         else
24927           {
24928             int i;
24929             for (i = 0; opt->name[i]; i++)
24930               selected_cpu_name[i] = TOUPPER (opt->name[i]);
24931
24932             selected_cpu_name[i] = 0;
24933           }
24934         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
24935         *input_line_pointer = saved_char;
24936         demand_empty_rest_of_line ();
24937         return;
24938       }
24939   as_bad (_("unknown cpu `%s'"), name);
24940   *input_line_pointer = saved_char;
24941   ignore_rest_of_line ();
24942 }
24943
24944
24945 /* Parse a .arch directive.  */
24946
24947 static void
24948 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
24949 {
24950   const struct arm_arch_option_table *opt;
24951   char saved_char;
24952   char *name;
24953
24954   name = input_line_pointer;
24955   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
24956     input_line_pointer++;
24957   saved_char = *input_line_pointer;
24958   *input_line_pointer = 0;
24959
24960   /* Skip the first "all" entry.  */
24961   for (opt = arm_archs + 1; opt->name != NULL; opt++)
24962     if (streq (opt->name, name))
24963       {
24964         mcpu_cpu_opt = &opt->value;
24965         selected_cpu = opt->value;
24966         strcpy (selected_cpu_name, opt->name);
24967         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
24968         *input_line_pointer = saved_char;
24969         demand_empty_rest_of_line ();
24970         return;
24971       }
24972
24973   as_bad (_("unknown architecture `%s'\n"), name);
24974   *input_line_pointer = saved_char;
24975   ignore_rest_of_line ();
24976 }
24977
24978
24979 /* Parse a .object_arch directive.  */
24980
24981 static void
24982 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
24983 {
24984   const struct arm_arch_option_table *opt;
24985   char saved_char;
24986   char *name;
24987
24988   name = input_line_pointer;
24989   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
24990     input_line_pointer++;
24991   saved_char = *input_line_pointer;
24992   *input_line_pointer = 0;
24993
24994   /* Skip the first "all" entry.  */
24995   for (opt = arm_archs + 1; opt->name != NULL; opt++)
24996     if (streq (opt->name, name))
24997       {
24998         object_arch = &opt->value;
24999         *input_line_pointer = saved_char;
25000         demand_empty_rest_of_line ();
25001         return;
25002       }
25003
25004   as_bad (_("unknown architecture `%s'\n"), name);
25005   *input_line_pointer = saved_char;
25006   ignore_rest_of_line ();
25007 }
25008
25009 /* Parse a .arch_extension directive.  */
25010
25011 static void
25012 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
25013 {
25014   const struct arm_option_extension_value_table *opt;
25015   char saved_char;
25016   char *name;
25017   int adding_value = 1;
25018
25019   name = input_line_pointer;
25020   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25021     input_line_pointer++;
25022   saved_char = *input_line_pointer;
25023   *input_line_pointer = 0;
25024
25025   if (strlen (name) >= 2
25026       && strncmp (name, "no", 2) == 0)
25027     {
25028       adding_value = 0;
25029       name += 2;
25030     }
25031
25032   for (opt = arm_extensions; opt->name != NULL; opt++)
25033     if (streq (opt->name, name))
25034       {
25035         if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
25036           {
25037             as_bad (_("architectural extension `%s' is not allowed for the "
25038                       "current base architecture"), name);
25039             break;
25040           }
25041
25042         if (adding_value)
25043           ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
25044         else
25045           ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
25046
25047         mcpu_cpu_opt = &selected_cpu;
25048         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25049         *input_line_pointer = saved_char;
25050         demand_empty_rest_of_line ();
25051         return;
25052       }
25053
25054   if (opt->name == NULL)
25055     as_bad (_("unknown architecture extension `%s'\n"), name);
25056
25057   *input_line_pointer = saved_char;
25058   ignore_rest_of_line ();
25059 }
25060
25061 /* Parse a .fpu directive.  */
25062
25063 static void
25064 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
25065 {
25066   const struct arm_option_fpu_value_table *opt;
25067   char saved_char;
25068   char *name;
25069
25070   name = input_line_pointer;
25071   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25072     input_line_pointer++;
25073   saved_char = *input_line_pointer;
25074   *input_line_pointer = 0;
25075
25076   for (opt = arm_fpus; opt->name != NULL; opt++)
25077     if (streq (opt->name, name))
25078       {
25079         mfpu_opt = &opt->value;
25080         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25081         *input_line_pointer = saved_char;
25082         demand_empty_rest_of_line ();
25083         return;
25084       }
25085
25086   as_bad (_("unknown floating point format `%s'\n"), name);
25087   *input_line_pointer = saved_char;
25088   ignore_rest_of_line ();
25089 }
25090
25091 /* Copy symbol information.  */
25092
25093 void
25094 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
25095 {
25096   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
25097 }
25098
25099 #ifdef OBJ_ELF
25100 /* Given a symbolic attribute NAME, return the proper integer value.
25101    Returns -1 if the attribute is not known.  */
25102
25103 int
25104 arm_convert_symbolic_attribute (const char *name)
25105 {
25106   static const struct
25107   {
25108     const char * name;
25109     const int    tag;
25110   }
25111   attribute_table[] =
25112     {
25113       /* When you modify this table you should
25114          also modify the list in doc/c-arm.texi.  */
25115 #define T(tag) {#tag, tag}
25116       T (Tag_CPU_raw_name),
25117       T (Tag_CPU_name),
25118       T (Tag_CPU_arch),
25119       T (Tag_CPU_arch_profile),
25120       T (Tag_ARM_ISA_use),
25121       T (Tag_THUMB_ISA_use),
25122       T (Tag_FP_arch),
25123       T (Tag_VFP_arch),
25124       T (Tag_WMMX_arch),
25125       T (Tag_Advanced_SIMD_arch),
25126       T (Tag_PCS_config),
25127       T (Tag_ABI_PCS_R9_use),
25128       T (Tag_ABI_PCS_RW_data),
25129       T (Tag_ABI_PCS_RO_data),
25130       T (Tag_ABI_PCS_GOT_use),
25131       T (Tag_ABI_PCS_wchar_t),
25132       T (Tag_ABI_FP_rounding),
25133       T (Tag_ABI_FP_denormal),
25134       T (Tag_ABI_FP_exceptions),
25135       T (Tag_ABI_FP_user_exceptions),
25136       T (Tag_ABI_FP_number_model),
25137       T (Tag_ABI_align_needed),
25138       T (Tag_ABI_align8_needed),
25139       T (Tag_ABI_align_preserved),
25140       T (Tag_ABI_align8_preserved),
25141       T (Tag_ABI_enum_size),
25142       T (Tag_ABI_HardFP_use),
25143       T (Tag_ABI_VFP_args),
25144       T (Tag_ABI_WMMX_args),
25145       T (Tag_ABI_optimization_goals),
25146       T (Tag_ABI_FP_optimization_goals),
25147       T (Tag_compatibility),
25148       T (Tag_CPU_unaligned_access),
25149       T (Tag_FP_HP_extension),
25150       T (Tag_VFP_HP_extension),
25151       T (Tag_ABI_FP_16bit_format),
25152       T (Tag_MPextension_use),
25153       T (Tag_DIV_use),
25154       T (Tag_nodefaults),
25155       T (Tag_also_compatible_with),
25156       T (Tag_conformance),
25157       T (Tag_T2EE_use),
25158       T (Tag_Virtualization_use),
25159       /* We deliberately do not include Tag_MPextension_use_legacy.  */
25160 #undef T
25161     };
25162   unsigned int i;
25163
25164   if (name == NULL)
25165     return -1;
25166
25167   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
25168     if (streq (name, attribute_table[i].name))
25169       return attribute_table[i].tag;
25170
25171   return -1;
25172 }
25173
25174
25175 /* Apply sym value for relocations only in the case that
25176    they are for local symbols and you have the respective
25177    architectural feature for blx and simple switches.  */
25178 int
25179 arm_apply_sym_value (struct fix * fixP)
25180 {
25181   if (fixP->fx_addsy
25182       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
25183       && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
25184     {
25185       switch (fixP->fx_r_type)
25186         {
25187         case BFD_RELOC_ARM_PCREL_BLX:
25188         case BFD_RELOC_THUMB_PCREL_BRANCH23:
25189           if (ARM_IS_FUNC (fixP->fx_addsy))
25190             return 1;
25191           break;
25192
25193         case BFD_RELOC_ARM_PCREL_CALL:
25194         case BFD_RELOC_THUMB_PCREL_BLX:
25195           if (THUMB_IS_FUNC (fixP->fx_addsy))
25196               return 1;
25197           break;
25198
25199         default:
25200           break;
25201         }
25202
25203     }
25204   return 0;
25205 }
25206 #endif /* OBJ_ELF */