Fix a problem building the ARM assembler for non-ELF based toolchains.
[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 /* Understand CodeComposer Studio assembly syntax.  */
141 bfd_boolean codecomposer_syntax = FALSE;
142
143 /* Variables that we set while parsing command-line options.  Once all
144    options have been read we re-process these values to set the real
145    assembly flags.  */
146 static const arm_feature_set *legacy_cpu = NULL;
147 static const arm_feature_set *legacy_fpu = NULL;
148
149 static const arm_feature_set *mcpu_cpu_opt = NULL;
150 static const arm_feature_set *mcpu_fpu_opt = NULL;
151 static const arm_feature_set *march_cpu_opt = NULL;
152 static const arm_feature_set *march_fpu_opt = NULL;
153 static const arm_feature_set *mfpu_opt = NULL;
154 static const arm_feature_set *object_arch = NULL;
155
156 /* Constants for known architecture features.  */
157 static const arm_feature_set fpu_default = FPU_DEFAULT;
158 static const arm_feature_set fpu_arch_vfp_v1 = FPU_ARCH_VFP_V1;
159 static const arm_feature_set fpu_arch_vfp_v2 = FPU_ARCH_VFP_V2;
160 static const arm_feature_set fpu_arch_vfp_v3 = FPU_ARCH_VFP_V3;
161 static const arm_feature_set fpu_arch_neon_v1 = FPU_ARCH_NEON_V1;
162 static const arm_feature_set fpu_arch_fpa = FPU_ARCH_FPA;
163 static const arm_feature_set fpu_any_hard = FPU_ANY_HARD;
164 static const arm_feature_set fpu_arch_maverick = FPU_ARCH_MAVERICK;
165 static const arm_feature_set fpu_endian_pure = FPU_ARCH_ENDIAN_PURE;
166
167 #ifdef CPU_DEFAULT
168 static const arm_feature_set cpu_default = CPU_DEFAULT;
169 #endif
170
171 static const arm_feature_set arm_ext_v1 = ARM_FEATURE (ARM_EXT_V1, 0);
172 static const arm_feature_set arm_ext_v2 = ARM_FEATURE (ARM_EXT_V1, 0);
173 static const arm_feature_set arm_ext_v2s = ARM_FEATURE (ARM_EXT_V2S, 0);
174 static const arm_feature_set arm_ext_v3 = ARM_FEATURE (ARM_EXT_V3, 0);
175 static const arm_feature_set arm_ext_v3m = ARM_FEATURE (ARM_EXT_V3M, 0);
176 static const arm_feature_set arm_ext_v4 = ARM_FEATURE (ARM_EXT_V4, 0);
177 static const arm_feature_set arm_ext_v4t = ARM_FEATURE (ARM_EXT_V4T, 0);
178 static const arm_feature_set arm_ext_v5 = ARM_FEATURE (ARM_EXT_V5, 0);
179 static const arm_feature_set arm_ext_v4t_5 =
180   ARM_FEATURE (ARM_EXT_V4T | ARM_EXT_V5, 0);
181 static const arm_feature_set arm_ext_v5t = ARM_FEATURE (ARM_EXT_V5T, 0);
182 static const arm_feature_set arm_ext_v5e = ARM_FEATURE (ARM_EXT_V5E, 0);
183 static const arm_feature_set arm_ext_v5exp = ARM_FEATURE (ARM_EXT_V5ExP, 0);
184 static const arm_feature_set arm_ext_v5j = ARM_FEATURE (ARM_EXT_V5J, 0);
185 static const arm_feature_set arm_ext_v6 = ARM_FEATURE (ARM_EXT_V6, 0);
186 static const arm_feature_set arm_ext_v6k = ARM_FEATURE (ARM_EXT_V6K, 0);
187 static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE (ARM_EXT_V6T2, 0);
188 static const arm_feature_set arm_ext_v6m = ARM_FEATURE (ARM_EXT_V6M, 0);
189 static const arm_feature_set arm_ext_v6_notm = ARM_FEATURE (ARM_EXT_V6_NOTM, 0);
190 static const arm_feature_set arm_ext_v6_dsp = ARM_FEATURE (ARM_EXT_V6_DSP, 0);
191 static const arm_feature_set arm_ext_barrier = ARM_FEATURE (ARM_EXT_BARRIER, 0);
192 static const arm_feature_set arm_ext_msr = ARM_FEATURE (ARM_EXT_THUMB_MSR, 0);
193 static const arm_feature_set arm_ext_div = ARM_FEATURE (ARM_EXT_DIV, 0);
194 static const arm_feature_set arm_ext_v7 = ARM_FEATURE (ARM_EXT_V7, 0);
195 static const arm_feature_set arm_ext_v7a = ARM_FEATURE (ARM_EXT_V7A, 0);
196 static const arm_feature_set arm_ext_v7r = ARM_FEATURE (ARM_EXT_V7R, 0);
197 static const arm_feature_set arm_ext_v7m = ARM_FEATURE (ARM_EXT_V7M, 0);
198 static const arm_feature_set arm_ext_v8 = ARM_FEATURE (ARM_EXT_V8, 0);
199 static const arm_feature_set arm_ext_m =
200   ARM_FEATURE (ARM_EXT_V6M | ARM_EXT_OS | ARM_EXT_V7M, 0);
201 static const arm_feature_set arm_ext_mp = ARM_FEATURE (ARM_EXT_MP, 0);
202 static const arm_feature_set arm_ext_sec = ARM_FEATURE (ARM_EXT_SEC, 0);
203 static const arm_feature_set arm_ext_os = ARM_FEATURE (ARM_EXT_OS, 0);
204 static const arm_feature_set arm_ext_adiv = ARM_FEATURE (ARM_EXT_ADIV, 0);
205 static const arm_feature_set arm_ext_virt = ARM_FEATURE (ARM_EXT_VIRT, 0);
206
207 static const arm_feature_set arm_arch_any = ARM_ANY;
208 static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1);
209 static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
210 static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
211 static const arm_feature_set arm_arch_v6m_only = ARM_ARCH_V6M_ONLY;
212
213 static const arm_feature_set arm_cext_iwmmxt2 =
214   ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
215 static const arm_feature_set arm_cext_iwmmxt =
216   ARM_FEATURE (0, ARM_CEXT_IWMMXT);
217 static const arm_feature_set arm_cext_xscale =
218   ARM_FEATURE (0, ARM_CEXT_XSCALE);
219 static const arm_feature_set arm_cext_maverick =
220   ARM_FEATURE (0, ARM_CEXT_MAVERICK);
221 static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
222 static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
223 static const arm_feature_set fpu_vfp_ext_v1xd =
224   ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
225 static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
226 static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
227 static const arm_feature_set fpu_vfp_ext_v3xd = ARM_FEATURE (0, FPU_VFP_EXT_V3xD);
228 static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
229 static const arm_feature_set fpu_vfp_ext_d32 =
230   ARM_FEATURE (0, FPU_VFP_EXT_D32);
231 static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
232 static const arm_feature_set fpu_vfp_v3_or_neon_ext =
233   ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
234 static const arm_feature_set fpu_vfp_fp16 = ARM_FEATURE (0, FPU_VFP_EXT_FP16);
235 static const arm_feature_set fpu_neon_ext_fma = ARM_FEATURE (0, FPU_NEON_EXT_FMA);
236 static const arm_feature_set fpu_vfp_ext_fma = ARM_FEATURE (0, FPU_VFP_EXT_FMA);
237 static const arm_feature_set fpu_vfp_ext_armv8 =
238   ARM_FEATURE (0, FPU_VFP_EXT_ARMV8);
239 static const arm_feature_set fpu_neon_ext_armv8 =
240   ARM_FEATURE (0, FPU_NEON_EXT_ARMV8);
241 static const arm_feature_set fpu_crypto_ext_armv8 =
242   ARM_FEATURE (0, FPU_CRYPTO_EXT_ARMV8);
243 static const arm_feature_set crc_ext_armv8 =
244   ARM_FEATURE (0, CRC_EXT_ARMV8);
245
246 static int mfloat_abi_opt = -1;
247 /* Record user cpu selection for object attributes.  */
248 static arm_feature_set selected_cpu = ARM_ARCH_NONE;
249 /* Must be long enough to hold any of the names in arm_cpus.  */
250 static char selected_cpu_name[16];
251
252 /* Return if no cpu was selected on command-line.  */
253 static bfd_boolean
254 no_cpu_selected (void)
255 {
256   return selected_cpu.core == arm_arch_none.core
257     && selected_cpu.coproc == arm_arch_none.coproc;
258 }
259
260 #ifdef OBJ_ELF
261 # ifdef EABI_DEFAULT
262 static int meabi_flags = EABI_DEFAULT;
263 # else
264 static int meabi_flags = EF_ARM_EABI_UNKNOWN;
265 # endif
266
267 static int attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
268
269 bfd_boolean
270 arm_is_eabi (void)
271 {
272   return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
273 }
274 #endif
275
276 #ifdef OBJ_ELF
277 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
278 symbolS * GOT_symbol;
279 #endif
280
281 /* 0: assemble for ARM,
282    1: assemble for Thumb,
283    2: assemble for Thumb even though target CPU does not support thumb
284       instructions.  */
285 static int thumb_mode = 0;
286 /* A value distinct from the possible values for thumb_mode that we
287    can use to record whether thumb_mode has been copied into the
288    tc_frag_data field of a frag.  */
289 #define MODE_RECORDED (1 << 4)
290
291 /* Specifies the intrinsic IT insn behavior mode.  */
292 enum implicit_it_mode
293 {
294   IMPLICIT_IT_MODE_NEVER  = 0x00,
295   IMPLICIT_IT_MODE_ARM    = 0x01,
296   IMPLICIT_IT_MODE_THUMB  = 0x02,
297   IMPLICIT_IT_MODE_ALWAYS = (IMPLICIT_IT_MODE_ARM | IMPLICIT_IT_MODE_THUMB)
298 };
299 static int implicit_it_mode = IMPLICIT_IT_MODE_ARM;
300
301 /* If unified_syntax is true, we are processing the new unified
302    ARM/Thumb syntax.  Important differences from the old ARM mode:
303
304      - Immediate operands do not require a # prefix.
305      - Conditional affixes always appear at the end of the
306        instruction.  (For backward compatibility, those instructions
307        that formerly had them in the middle, continue to accept them
308        there.)
309      - The IT instruction may appear, and if it does is validated
310        against subsequent conditional affixes.  It does not generate
311        machine code.
312
313    Important differences from the old Thumb mode:
314
315      - Immediate operands do not require a # prefix.
316      - Most of the V6T2 instructions are only available in unified mode.
317      - The .N and .W suffixes are recognized and honored (it is an error
318        if they cannot be honored).
319      - All instructions set the flags if and only if they have an 's' affix.
320      - Conditional affixes may be used.  They are validated against
321        preceding IT instructions.  Unlike ARM mode, you cannot use a
322        conditional affix except in the scope of an IT instruction.  */
323
324 static bfd_boolean unified_syntax = FALSE;
325
326 /* An immediate operand can start with #, and ld*, st*, pld operands
327    can contain [ and ].  We need to tell APP not to elide whitespace
328    before a [, which can appear as the first operand for pld.
329    Likewise, a { can appear as the first operand for push, pop, vld*, etc.  */
330 const char arm_symbol_chars[] = "#[]{}";
331
332 enum neon_el_type
333 {
334   NT_invtype,
335   NT_untyped,
336   NT_integer,
337   NT_float,
338   NT_poly,
339   NT_signed,
340   NT_unsigned
341 };
342
343 struct neon_type_el
344 {
345   enum neon_el_type type;
346   unsigned size;
347 };
348
349 #define NEON_MAX_TYPE_ELS 4
350
351 struct neon_type
352 {
353   struct neon_type_el el[NEON_MAX_TYPE_ELS];
354   unsigned elems;
355 };
356
357 enum it_instruction_type
358 {
359    OUTSIDE_IT_INSN,
360    INSIDE_IT_INSN,
361    INSIDE_IT_LAST_INSN,
362    IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
363                               if inside, should be the last one.  */
364    NEUTRAL_IT_INSN,        /* This could be either inside or outside,
365                               i.e. BKPT and NOP.  */
366    IT_INSN                 /* The IT insn has been parsed.  */
367 };
368
369 /* The maximum number of operands we need.  */
370 #define ARM_IT_MAX_OPERANDS 6
371
372 struct arm_it
373 {
374   const char *  error;
375   unsigned long instruction;
376   int           size;
377   int           size_req;
378   int           cond;
379   /* "uncond_value" is set to the value in place of the conditional field in
380      unconditional versions of the instruction, or -1 if nothing is
381      appropriate.  */
382   int           uncond_value;
383   struct neon_type vectype;
384   /* This does not indicate an actual NEON instruction, only that
385      the mnemonic accepts neon-style type suffixes.  */
386   int           is_neon;
387   /* Set to the opcode if the instruction needs relaxation.
388      Zero if the instruction is not relaxed.  */
389   unsigned long relax;
390   struct
391   {
392     bfd_reloc_code_real_type type;
393     expressionS              exp;
394     int                      pc_rel;
395   } reloc;
396
397   enum it_instruction_type it_insn_type;
398
399   struct
400   {
401     unsigned reg;
402     signed int imm;
403     struct neon_type_el vectype;
404     unsigned present    : 1;  /* Operand present.  */
405     unsigned isreg      : 1;  /* Operand was a register.  */
406     unsigned immisreg   : 1;  /* .imm field is a second register.  */
407     unsigned isscalar   : 1;  /* Operand is a (Neon) scalar.  */
408     unsigned immisalign : 1;  /* Immediate is an alignment specifier.  */
409     unsigned immisfloat : 1;  /* Immediate was parsed as a float.  */
410     /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
411        instructions. This allows us to disambiguate ARM <-> vector insns.  */
412     unsigned regisimm   : 1;  /* 64-bit immediate, reg forms high 32 bits.  */
413     unsigned isvec      : 1;  /* Is a single, double or quad VFP/Neon reg.  */
414     unsigned isquad     : 1;  /* Operand is Neon quad-precision register.  */
415     unsigned issingle   : 1;  /* Operand is VFP single-precision register.  */
416     unsigned hasreloc   : 1;  /* Operand has relocation suffix.  */
417     unsigned writeback  : 1;  /* Operand has trailing !  */
418     unsigned preind     : 1;  /* Preindexed address.  */
419     unsigned postind    : 1;  /* Postindexed address.  */
420     unsigned negative   : 1;  /* Index register was negated.  */
421     unsigned shifted    : 1;  /* Shift applied to operation.  */
422     unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
423   } operands[ARM_IT_MAX_OPERANDS];
424 };
425
426 static struct arm_it inst;
427
428 #define NUM_FLOAT_VALS 8
429
430 const char * fp_const[] =
431 {
432   "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
433 };
434
435 /* Number of littlenums required to hold an extended precision number.  */
436 #define MAX_LITTLENUMS 6
437
438 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
439
440 #define FAIL    (-1)
441 #define SUCCESS (0)
442
443 #define SUFF_S 1
444 #define SUFF_D 2
445 #define SUFF_E 3
446 #define SUFF_P 4
447
448 #define CP_T_X   0x00008000
449 #define CP_T_Y   0x00400000
450
451 #define CONDS_BIT        0x00100000
452 #define LOAD_BIT         0x00100000
453
454 #define DOUBLE_LOAD_FLAG 0x00000001
455
456 struct asm_cond
457 {
458   const char *   template_name;
459   unsigned long  value;
460 };
461
462 #define COND_ALWAYS 0xE
463
464 struct asm_psr
465 {
466   const char *   template_name;
467   unsigned long  field;
468 };
469
470 struct asm_barrier_opt
471 {
472   const char *    template_name;
473   unsigned long   value;
474   const arm_feature_set arch;
475 };
476
477 /* The bit that distinguishes CPSR and SPSR.  */
478 #define SPSR_BIT   (1 << 22)
479
480 /* The individual PSR flag bits.  */
481 #define PSR_c   (1 << 16)
482 #define PSR_x   (1 << 17)
483 #define PSR_s   (1 << 18)
484 #define PSR_f   (1 << 19)
485
486 struct reloc_entry
487 {
488   char *                    name;
489   bfd_reloc_code_real_type  reloc;
490 };
491
492 enum vfp_reg_pos
493 {
494   VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
495   VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
496 };
497
498 enum vfp_ldstm_type
499 {
500   VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
501 };
502
503 /* Bits for DEFINED field in neon_typed_alias.  */
504 #define NTA_HASTYPE  1
505 #define NTA_HASINDEX 2
506
507 struct neon_typed_alias
508 {
509   unsigned char        defined;
510   unsigned char        index;
511   struct neon_type_el  eltype;
512 };
513
514 /* ARM register categories.  This includes coprocessor numbers and various
515    architecture extensions' registers.  */
516 enum arm_reg_type
517 {
518   REG_TYPE_RN,
519   REG_TYPE_CP,
520   REG_TYPE_CN,
521   REG_TYPE_FN,
522   REG_TYPE_VFS,
523   REG_TYPE_VFD,
524   REG_TYPE_NQ,
525   REG_TYPE_VFSD,
526   REG_TYPE_NDQ,
527   REG_TYPE_NSDQ,
528   REG_TYPE_VFC,
529   REG_TYPE_MVF,
530   REG_TYPE_MVD,
531   REG_TYPE_MVFX,
532   REG_TYPE_MVDX,
533   REG_TYPE_MVAX,
534   REG_TYPE_DSPSC,
535   REG_TYPE_MMXWR,
536   REG_TYPE_MMXWC,
537   REG_TYPE_MMXWCG,
538   REG_TYPE_XSCALE,
539   REG_TYPE_RNB
540 };
541
542 /* Structure for a hash table entry for a register.
543    If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
544    information which states whether a vector type or index is specified (for a
545    register alias created with .dn or .qn). Otherwise NEON should be NULL.  */
546 struct reg_entry
547 {
548   const char *               name;
549   unsigned int               number;
550   unsigned char              type;
551   unsigned char              builtin;
552   struct neon_typed_alias *  neon;
553 };
554
555 /* Diagnostics used when we don't get a register of the expected type.  */
556 const char * const reg_expected_msgs[] =
557 {
558   N_("ARM register expected"),
559   N_("bad or missing co-processor number"),
560   N_("co-processor register expected"),
561   N_("FPA register expected"),
562   N_("VFP single precision register expected"),
563   N_("VFP/Neon double precision register expected"),
564   N_("Neon quad precision register expected"),
565   N_("VFP single or double precision register expected"),
566   N_("Neon double or quad precision register expected"),
567   N_("VFP single, double or Neon quad precision register expected"),
568   N_("VFP system register expected"),
569   N_("Maverick MVF register expected"),
570   N_("Maverick MVD register expected"),
571   N_("Maverick MVFX register expected"),
572   N_("Maverick MVDX register expected"),
573   N_("Maverick MVAX register expected"),
574   N_("Maverick DSPSC register expected"),
575   N_("iWMMXt data register expected"),
576   N_("iWMMXt control register expected"),
577   N_("iWMMXt scalar register expected"),
578   N_("XScale accumulator register expected"),
579 };
580
581 /* Some well known registers that we refer to directly elsewhere.  */
582 #define REG_R12 12
583 #define REG_SP  13
584 #define REG_LR  14
585 #define REG_PC  15
586
587 /* ARM instructions take 4bytes in the object file, Thumb instructions
588    take 2:  */
589 #define INSN_SIZE       4
590
591 struct asm_opcode
592 {
593   /* Basic string to match.  */
594   const char * template_name;
595
596   /* Parameters to instruction.  */
597   unsigned int operands[8];
598
599   /* Conditional tag - see opcode_lookup.  */
600   unsigned int tag : 4;
601
602   /* Basic instruction code.  */
603   unsigned int avalue : 28;
604
605   /* Thumb-format instruction code.  */
606   unsigned int tvalue;
607
608   /* Which architecture variant provides this instruction.  */
609   const arm_feature_set * avariant;
610   const arm_feature_set * tvariant;
611
612   /* Function to call to encode instruction in ARM format.  */
613   void (* aencode) (void);
614
615   /* Function to call to encode instruction in Thumb format.  */
616   void (* tencode) (void);
617 };
618
619 /* Defines for various bits that we will want to toggle.  */
620 #define INST_IMMEDIATE  0x02000000
621 #define OFFSET_REG      0x02000000
622 #define HWOFFSET_IMM    0x00400000
623 #define SHIFT_BY_REG    0x00000010
624 #define PRE_INDEX       0x01000000
625 #define INDEX_UP        0x00800000
626 #define WRITE_BACK      0x00200000
627 #define LDM_TYPE_2_OR_3 0x00400000
628 #define CPSI_MMOD       0x00020000
629
630 #define LITERAL_MASK    0xf000f000
631 #define OPCODE_MASK     0xfe1fffff
632 #define V4_STR_BIT      0x00000020
633
634 #define T2_SUBS_PC_LR   0xf3de8f00
635
636 #define DATA_OP_SHIFT   21
637
638 #define T2_OPCODE_MASK  0xfe1fffff
639 #define T2_DATA_OP_SHIFT 21
640
641 #define A_COND_MASK         0xf0000000
642 #define A_PUSH_POP_OP_MASK  0x0fff0000
643
644 /* Opcodes for pushing/poping registers to/from the stack.  */
645 #define A1_OPCODE_PUSH    0x092d0000
646 #define A2_OPCODE_PUSH    0x052d0004
647 #define A2_OPCODE_POP     0x049d0004
648
649 /* Codes to distinguish the arithmetic instructions.  */
650 #define OPCODE_AND      0
651 #define OPCODE_EOR      1
652 #define OPCODE_SUB      2
653 #define OPCODE_RSB      3
654 #define OPCODE_ADD      4
655 #define OPCODE_ADC      5
656 #define OPCODE_SBC      6
657 #define OPCODE_RSC      7
658 #define OPCODE_TST      8
659 #define OPCODE_TEQ      9
660 #define OPCODE_CMP      10
661 #define OPCODE_CMN      11
662 #define OPCODE_ORR      12
663 #define OPCODE_MOV      13
664 #define OPCODE_BIC      14
665 #define OPCODE_MVN      15
666
667 #define T2_OPCODE_AND   0
668 #define T2_OPCODE_BIC   1
669 #define T2_OPCODE_ORR   2
670 #define T2_OPCODE_ORN   3
671 #define T2_OPCODE_EOR   4
672 #define T2_OPCODE_ADD   8
673 #define T2_OPCODE_ADC   10
674 #define T2_OPCODE_SBC   11
675 #define T2_OPCODE_SUB   13
676 #define T2_OPCODE_RSB   14
677
678 #define T_OPCODE_MUL 0x4340
679 #define T_OPCODE_TST 0x4200
680 #define T_OPCODE_CMN 0x42c0
681 #define T_OPCODE_NEG 0x4240
682 #define T_OPCODE_MVN 0x43c0
683
684 #define T_OPCODE_ADD_R3 0x1800
685 #define T_OPCODE_SUB_R3 0x1a00
686 #define T_OPCODE_ADD_HI 0x4400
687 #define T_OPCODE_ADD_ST 0xb000
688 #define T_OPCODE_SUB_ST 0xb080
689 #define T_OPCODE_ADD_SP 0xa800
690 #define T_OPCODE_ADD_PC 0xa000
691 #define T_OPCODE_ADD_I8 0x3000
692 #define T_OPCODE_SUB_I8 0x3800
693 #define T_OPCODE_ADD_I3 0x1c00
694 #define T_OPCODE_SUB_I3 0x1e00
695
696 #define T_OPCODE_ASR_R  0x4100
697 #define T_OPCODE_LSL_R  0x4080
698 #define T_OPCODE_LSR_R  0x40c0
699 #define T_OPCODE_ROR_R  0x41c0
700 #define T_OPCODE_ASR_I  0x1000
701 #define T_OPCODE_LSL_I  0x0000
702 #define T_OPCODE_LSR_I  0x0800
703
704 #define T_OPCODE_MOV_I8 0x2000
705 #define T_OPCODE_CMP_I8 0x2800
706 #define T_OPCODE_CMP_LR 0x4280
707 #define T_OPCODE_MOV_HR 0x4600
708 #define T_OPCODE_CMP_HR 0x4500
709
710 #define T_OPCODE_LDR_PC 0x4800
711 #define T_OPCODE_LDR_SP 0x9800
712 #define T_OPCODE_STR_SP 0x9000
713 #define T_OPCODE_LDR_IW 0x6800
714 #define T_OPCODE_STR_IW 0x6000
715 #define T_OPCODE_LDR_IH 0x8800
716 #define T_OPCODE_STR_IH 0x8000
717 #define T_OPCODE_LDR_IB 0x7800
718 #define T_OPCODE_STR_IB 0x7000
719 #define T_OPCODE_LDR_RW 0x5800
720 #define T_OPCODE_STR_RW 0x5000
721 #define T_OPCODE_LDR_RH 0x5a00
722 #define T_OPCODE_STR_RH 0x5200
723 #define T_OPCODE_LDR_RB 0x5c00
724 #define T_OPCODE_STR_RB 0x5400
725
726 #define T_OPCODE_PUSH   0xb400
727 #define T_OPCODE_POP    0xbc00
728
729 #define T_OPCODE_BRANCH 0xe000
730
731 #define THUMB_SIZE      2       /* Size of thumb instruction.  */
732 #define THUMB_PP_PC_LR 0x0100
733 #define THUMB_LOAD_BIT 0x0800
734 #define THUMB2_LOAD_BIT 0x00100000
735
736 #define BAD_ARGS        _("bad arguments to instruction")
737 #define BAD_SP          _("r13 not allowed here")
738 #define BAD_PC          _("r15 not allowed here")
739 #define BAD_COND        _("instruction cannot be conditional")
740 #define BAD_OVERLAP     _("registers may not be the same")
741 #define BAD_HIREG       _("lo register required")
742 #define BAD_THUMB32     _("instruction not supported in Thumb16 mode")
743 #define BAD_ADDR_MODE   _("instruction does not accept this addressing mode");
744 #define BAD_BRANCH      _("branch must be last instruction in IT block")
745 #define BAD_NOT_IT      _("instruction not allowed in IT block")
746 #define BAD_FPU         _("selected FPU does not support instruction")
747 #define BAD_OUT_IT      _("thumb conditional instruction should be in IT block")
748 #define BAD_IT_COND     _("incorrect condition in IT block")
749 #define BAD_IT_IT       _("IT falling in the range of a previous IT block")
750 #define MISSING_FNSTART _("missing .fnstart before unwinding directive")
751 #define BAD_PC_ADDRESSING \
752         _("cannot use register index with PC-relative addressing")
753 #define BAD_PC_WRITEBACK \
754         _("cannot use writeback with PC-relative addressing")
755 #define BAD_RANGE     _("branch out of range")
756 #define UNPRED_REG(R)   _("using " R " results in unpredictable behaviour")
757
758 static struct hash_control * arm_ops_hsh;
759 static struct hash_control * arm_cond_hsh;
760 static struct hash_control * arm_shift_hsh;
761 static struct hash_control * arm_psr_hsh;
762 static struct hash_control * arm_v7m_psr_hsh;
763 static struct hash_control * arm_reg_hsh;
764 static struct hash_control * arm_reloc_hsh;
765 static struct hash_control * arm_barrier_opt_hsh;
766
767 /* Stuff needed to resolve the label ambiguity
768    As:
769      ...
770      label:   <insn>
771    may differ from:
772      ...
773      label:
774               <insn>  */
775
776 symbolS *  last_label_seen;
777 static int label_is_thumb_function_name = FALSE;
778
779 /* Literal pool structure.  Held on a per-section
780    and per-sub-section basis.  */
781
782 #define MAX_LITERAL_POOL_SIZE 1024
783 typedef struct literal_pool
784 {
785   expressionS            literals [MAX_LITERAL_POOL_SIZE];
786   unsigned int           next_free_entry;
787   unsigned int           id;
788   symbolS *              symbol;
789   segT                   section;
790   subsegT                sub_section;
791 #ifdef OBJ_ELF
792   struct dwarf2_line_info locs [MAX_LITERAL_POOL_SIZE];
793 #endif
794   struct literal_pool *  next;
795 } literal_pool;
796
797 /* Pointer to a linked list of literal pools.  */
798 literal_pool * list_of_pools = NULL;
799
800 typedef enum asmfunc_states
801 {
802   OUTSIDE_ASMFUNC,
803   WAITING_ASMFUNC_NAME,
804   WAITING_ENDASMFUNC
805 } asmfunc_states;
806
807 static asmfunc_states asmfunc_state = OUTSIDE_ASMFUNC;
808
809 #ifdef OBJ_ELF
810 #  define now_it seg_info (now_seg)->tc_segment_info_data.current_it
811 #else
812 static struct current_it now_it;
813 #endif
814
815 static inline int
816 now_it_compatible (int cond)
817 {
818   return (cond & ~1) == (now_it.cc & ~1);
819 }
820
821 static inline int
822 conditional_insn (void)
823 {
824   return inst.cond != COND_ALWAYS;
825 }
826
827 static int in_it_block (void);
828
829 static int handle_it_state (void);
830
831 static void force_automatic_it_block_close (void);
832
833 static void it_fsm_post_encode (void);
834
835 #define set_it_insn_type(type)                  \
836   do                                            \
837     {                                           \
838       inst.it_insn_type = type;                 \
839       if (handle_it_state () == FAIL)           \
840         return;                                 \
841     }                                           \
842   while (0)
843
844 #define set_it_insn_type_nonvoid(type, failret) \
845   do                                            \
846     {                                           \
847       inst.it_insn_type = type;                 \
848       if (handle_it_state () == FAIL)           \
849         return failret;                         \
850     }                                           \
851   while(0)
852
853 #define set_it_insn_type_last()                         \
854   do                                                    \
855     {                                                   \
856       if (inst.cond == COND_ALWAYS)                     \
857         set_it_insn_type (IF_INSIDE_IT_LAST_INSN);      \
858       else                                              \
859         set_it_insn_type (INSIDE_IT_LAST_INSN);         \
860     }                                                   \
861   while (0)
862
863 /* Pure syntax.  */
864
865 /* This array holds the chars that always start a comment.  If the
866    pre-processor is disabled, these aren't very useful.  */
867 char arm_comment_chars[] = "@";
868
869 /* This array holds the chars that only start a comment at the beginning of
870    a line.  If the line seems to have the form '# 123 filename'
871    .line and .file directives will appear in the pre-processed output.  */
872 /* Note that input_file.c hand checks for '#' at the beginning of the
873    first line of the input file.  This is because the compiler outputs
874    #NO_APP at the beginning of its output.  */
875 /* Also note that comments like this one will always work.  */
876 const char line_comment_chars[] = "#";
877
878 char arm_line_separator_chars[] = ";";
879
880 /* Chars that can be used to separate mant
881    from exp in floating point numbers.  */
882 const char EXP_CHARS[] = "eE";
883
884 /* Chars that mean this number is a floating point constant.  */
885 /* As in 0f12.456  */
886 /* or    0d1.2345e12  */
887
888 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
889
890 /* Prefix characters that indicate the start of an immediate
891    value.  */
892 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
893
894 /* Separator character handling.  */
895
896 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
897
898 static inline int
899 skip_past_char (char ** str, char c)
900 {
901   /* PR gas/14987: Allow for whitespace before the expected character.  */
902   skip_whitespace (*str);
903
904   if (**str == c)
905     {
906       (*str)++;
907       return SUCCESS;
908     }
909   else
910     return FAIL;
911 }
912
913 #define skip_past_comma(str) skip_past_char (str, ',')
914
915 /* Arithmetic expressions (possibly involving symbols).  */
916
917 /* Return TRUE if anything in the expression is a bignum.  */
918
919 static int
920 walk_no_bignums (symbolS * sp)
921 {
922   if (symbol_get_value_expression (sp)->X_op == O_big)
923     return 1;
924
925   if (symbol_get_value_expression (sp)->X_add_symbol)
926     {
927       return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
928               || (symbol_get_value_expression (sp)->X_op_symbol
929                   && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
930     }
931
932   return 0;
933 }
934
935 static int in_my_get_expression = 0;
936
937 /* Third argument to my_get_expression.  */
938 #define GE_NO_PREFIX 0
939 #define GE_IMM_PREFIX 1
940 #define GE_OPT_PREFIX 2
941 /* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
942    immediates, as can be used in Neon VMVN and VMOV immediate instructions.  */
943 #define GE_OPT_PREFIX_BIG 3
944
945 static int
946 my_get_expression (expressionS * ep, char ** str, int prefix_mode)
947 {
948   char * save_in;
949   segT   seg;
950
951   /* In unified syntax, all prefixes are optional.  */
952   if (unified_syntax)
953     prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
954                   : GE_OPT_PREFIX;
955
956   switch (prefix_mode)
957     {
958     case GE_NO_PREFIX: break;
959     case GE_IMM_PREFIX:
960       if (!is_immediate_prefix (**str))
961         {
962           inst.error = _("immediate expression requires a # prefix");
963           return FAIL;
964         }
965       (*str)++;
966       break;
967     case GE_OPT_PREFIX:
968     case GE_OPT_PREFIX_BIG:
969       if (is_immediate_prefix (**str))
970         (*str)++;
971       break;
972     default: abort ();
973     }
974
975   memset (ep, 0, sizeof (expressionS));
976
977   save_in = input_line_pointer;
978   input_line_pointer = *str;
979   in_my_get_expression = 1;
980   seg = expression (ep);
981   in_my_get_expression = 0;
982
983   if (ep->X_op == O_illegal || ep->X_op == O_absent)
984     {
985       /* We found a bad or missing expression in md_operand().  */
986       *str = input_line_pointer;
987       input_line_pointer = save_in;
988       if (inst.error == NULL)
989         inst.error = (ep->X_op == O_absent
990                       ? _("missing expression") :_("bad expression"));
991       return 1;
992     }
993
994 #ifdef OBJ_AOUT
995   if (seg != absolute_section
996       && seg != text_section
997       && seg != data_section
998       && seg != bss_section
999       && seg != undefined_section)
1000     {
1001       inst.error = _("bad segment");
1002       *str = input_line_pointer;
1003       input_line_pointer = save_in;
1004       return 1;
1005     }
1006 #else
1007   (void) seg;
1008 #endif
1009
1010   /* Get rid of any bignums now, so that we don't generate an error for which
1011      we can't establish a line number later on.  Big numbers are never valid
1012      in instructions, which is where this routine is always called.  */
1013   if (prefix_mode != GE_OPT_PREFIX_BIG
1014       && (ep->X_op == O_big
1015           || (ep->X_add_symbol
1016               && (walk_no_bignums (ep->X_add_symbol)
1017                   || (ep->X_op_symbol
1018                       && walk_no_bignums (ep->X_op_symbol))))))
1019     {
1020       inst.error = _("invalid constant");
1021       *str = input_line_pointer;
1022       input_line_pointer = save_in;
1023       return 1;
1024     }
1025
1026   *str = input_line_pointer;
1027   input_line_pointer = save_in;
1028   return 0;
1029 }
1030
1031 /* Turn a string in input_line_pointer into a floating point constant
1032    of type TYPE, and store the appropriate bytes in *LITP.  The number
1033    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
1034    returned, or NULL on OK.
1035
1036    Note that fp constants aren't represent in the normal way on the ARM.
1037    In big endian mode, things are as expected.  However, in little endian
1038    mode fp constants are big-endian word-wise, and little-endian byte-wise
1039    within the words.  For example, (double) 1.1 in big endian mode is
1040    the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
1041    the byte sequence 99 99 f1 3f 9a 99 99 99.
1042
1043    ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
1044
1045 char *
1046 md_atof (int type, char * litP, int * sizeP)
1047 {
1048   int prec;
1049   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1050   char *t;
1051   int i;
1052
1053   switch (type)
1054     {
1055     case 'f':
1056     case 'F':
1057     case 's':
1058     case 'S':
1059       prec = 2;
1060       break;
1061
1062     case 'd':
1063     case 'D':
1064     case 'r':
1065     case 'R':
1066       prec = 4;
1067       break;
1068
1069     case 'x':
1070     case 'X':
1071       prec = 5;
1072       break;
1073
1074     case 'p':
1075     case 'P':
1076       prec = 5;
1077       break;
1078
1079     default:
1080       *sizeP = 0;
1081       return _("Unrecognized or unsupported floating point constant");
1082     }
1083
1084   t = atof_ieee (input_line_pointer, type, words);
1085   if (t)
1086     input_line_pointer = t;
1087   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1088
1089   if (target_big_endian)
1090     {
1091       for (i = 0; i < prec; i++)
1092         {
1093           md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1094           litP += sizeof (LITTLENUM_TYPE);
1095         }
1096     }
1097   else
1098     {
1099       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
1100         for (i = prec - 1; i >= 0; i--)
1101           {
1102             md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1103             litP += sizeof (LITTLENUM_TYPE);
1104           }
1105       else
1106         /* For a 4 byte float the order of elements in `words' is 1 0.
1107            For an 8 byte float the order is 1 0 3 2.  */
1108         for (i = 0; i < prec; i += 2)
1109           {
1110             md_number_to_chars (litP, (valueT) words[i + 1],
1111                                 sizeof (LITTLENUM_TYPE));
1112             md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1113                                 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1114             litP += 2 * sizeof (LITTLENUM_TYPE);
1115           }
1116     }
1117
1118   return NULL;
1119 }
1120
1121 /* We handle all bad expressions here, so that we can report the faulty
1122    instruction in the error message.  */
1123 void
1124 md_operand (expressionS * exp)
1125 {
1126   if (in_my_get_expression)
1127     exp->X_op = O_illegal;
1128 }
1129
1130 /* Immediate values.  */
1131
1132 /* Generic immediate-value read function for use in directives.
1133    Accepts anything that 'expression' can fold to a constant.
1134    *val receives the number.  */
1135 #ifdef OBJ_ELF
1136 static int
1137 immediate_for_directive (int *val)
1138 {
1139   expressionS exp;
1140   exp.X_op = O_illegal;
1141
1142   if (is_immediate_prefix (*input_line_pointer))
1143     {
1144       input_line_pointer++;
1145       expression (&exp);
1146     }
1147
1148   if (exp.X_op != O_constant)
1149     {
1150       as_bad (_("expected #constant"));
1151       ignore_rest_of_line ();
1152       return FAIL;
1153     }
1154   *val = exp.X_add_number;
1155   return SUCCESS;
1156 }
1157 #endif
1158
1159 /* Register parsing.  */
1160
1161 /* Generic register parser.  CCP points to what should be the
1162    beginning of a register name.  If it is indeed a valid register
1163    name, advance CCP over it and return the reg_entry structure;
1164    otherwise return NULL.  Does not issue diagnostics.  */
1165
1166 static struct reg_entry *
1167 arm_reg_parse_multi (char **ccp)
1168 {
1169   char *start = *ccp;
1170   char *p;
1171   struct reg_entry *reg;
1172
1173   skip_whitespace (start);
1174
1175 #ifdef REGISTER_PREFIX
1176   if (*start != REGISTER_PREFIX)
1177     return NULL;
1178   start++;
1179 #endif
1180 #ifdef OPTIONAL_REGISTER_PREFIX
1181   if (*start == OPTIONAL_REGISTER_PREFIX)
1182     start++;
1183 #endif
1184
1185   p = start;
1186   if (!ISALPHA (*p) || !is_name_beginner (*p))
1187     return NULL;
1188
1189   do
1190     p++;
1191   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1192
1193   reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1194
1195   if (!reg)
1196     return NULL;
1197
1198   *ccp = p;
1199   return reg;
1200 }
1201
1202 static int
1203 arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1204                     enum arm_reg_type type)
1205 {
1206   /* Alternative syntaxes are accepted for a few register classes.  */
1207   switch (type)
1208     {
1209     case REG_TYPE_MVF:
1210     case REG_TYPE_MVD:
1211     case REG_TYPE_MVFX:
1212     case REG_TYPE_MVDX:
1213       /* Generic coprocessor register names are allowed for these.  */
1214       if (reg && reg->type == REG_TYPE_CN)
1215         return reg->number;
1216       break;
1217
1218     case REG_TYPE_CP:
1219       /* For backward compatibility, a bare number is valid here.  */
1220       {
1221         unsigned long processor = strtoul (start, ccp, 10);
1222         if (*ccp != start && processor <= 15)
1223           return processor;
1224       }
1225
1226     case REG_TYPE_MMXWC:
1227       /* WC includes WCG.  ??? I'm not sure this is true for all
1228          instructions that take WC registers.  */
1229       if (reg && reg->type == REG_TYPE_MMXWCG)
1230         return reg->number;
1231       break;
1232
1233     default:
1234       break;
1235     }
1236
1237   return FAIL;
1238 }
1239
1240 /* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1241    return value is the register number or FAIL.  */
1242
1243 static int
1244 arm_reg_parse (char **ccp, enum arm_reg_type type)
1245 {
1246   char *start = *ccp;
1247   struct reg_entry *reg = arm_reg_parse_multi (ccp);
1248   int ret;
1249
1250   /* Do not allow a scalar (reg+index) to parse as a register.  */
1251   if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1252     return FAIL;
1253
1254   if (reg && reg->type == type)
1255     return reg->number;
1256
1257   if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1258     return ret;
1259
1260   *ccp = start;
1261   return FAIL;
1262 }
1263
1264 /* Parse a Neon type specifier. *STR should point at the leading '.'
1265    character. Does no verification at this stage that the type fits the opcode
1266    properly. E.g.,
1267
1268      .i32.i32.s16
1269      .s32.f32
1270      .u16
1271
1272    Can all be legally parsed by this function.
1273
1274    Fills in neon_type struct pointer with parsed information, and updates STR
1275    to point after the parsed type specifier. Returns SUCCESS if this was a legal
1276    type, FAIL if not.  */
1277
1278 static int
1279 parse_neon_type (struct neon_type *type, char **str)
1280 {
1281   char *ptr = *str;
1282
1283   if (type)
1284     type->elems = 0;
1285
1286   while (type->elems < NEON_MAX_TYPE_ELS)
1287     {
1288       enum neon_el_type thistype = NT_untyped;
1289       unsigned thissize = -1u;
1290
1291       if (*ptr != '.')
1292         break;
1293
1294       ptr++;
1295
1296       /* Just a size without an explicit type.  */
1297       if (ISDIGIT (*ptr))
1298         goto parsesize;
1299
1300       switch (TOLOWER (*ptr))
1301         {
1302         case 'i': thistype = NT_integer; break;
1303         case 'f': thistype = NT_float; break;
1304         case 'p': thistype = NT_poly; break;
1305         case 's': thistype = NT_signed; break;
1306         case 'u': thistype = NT_unsigned; break;
1307         case 'd':
1308           thistype = NT_float;
1309           thissize = 64;
1310           ptr++;
1311           goto done;
1312         default:
1313           as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1314           return FAIL;
1315         }
1316
1317       ptr++;
1318
1319       /* .f is an abbreviation for .f32.  */
1320       if (thistype == NT_float && !ISDIGIT (*ptr))
1321         thissize = 32;
1322       else
1323         {
1324         parsesize:
1325           thissize = strtoul (ptr, &ptr, 10);
1326
1327           if (thissize != 8 && thissize != 16 && thissize != 32
1328               && thissize != 64)
1329             {
1330               as_bad (_("bad size %d in type specifier"), thissize);
1331               return FAIL;
1332             }
1333         }
1334
1335       done:
1336       if (type)
1337         {
1338           type->el[type->elems].type = thistype;
1339           type->el[type->elems].size = thissize;
1340           type->elems++;
1341         }
1342     }
1343
1344   /* Empty/missing type is not a successful parse.  */
1345   if (type->elems == 0)
1346     return FAIL;
1347
1348   *str = ptr;
1349
1350   return SUCCESS;
1351 }
1352
1353 /* Errors may be set multiple times during parsing or bit encoding
1354    (particularly in the Neon bits), but usually the earliest error which is set
1355    will be the most meaningful. Avoid overwriting it with later (cascading)
1356    errors by calling this function.  */
1357
1358 static void
1359 first_error (const char *err)
1360 {
1361   if (!inst.error)
1362     inst.error = err;
1363 }
1364
1365 /* Parse a single type, e.g. ".s32", leading period included.  */
1366 static int
1367 parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1368 {
1369   char *str = *ccp;
1370   struct neon_type optype;
1371
1372   if (*str == '.')
1373     {
1374       if (parse_neon_type (&optype, &str) == SUCCESS)
1375         {
1376           if (optype.elems == 1)
1377             *vectype = optype.el[0];
1378           else
1379             {
1380               first_error (_("only one type should be specified for operand"));
1381               return FAIL;
1382             }
1383         }
1384       else
1385         {
1386           first_error (_("vector type expected"));
1387           return FAIL;
1388         }
1389     }
1390   else
1391     return FAIL;
1392
1393   *ccp = str;
1394
1395   return SUCCESS;
1396 }
1397
1398 /* Special meanings for indices (which have a range of 0-7), which will fit into
1399    a 4-bit integer.  */
1400
1401 #define NEON_ALL_LANES          15
1402 #define NEON_INTERLEAVE_LANES   14
1403
1404 /* Parse either a register or a scalar, with an optional type. Return the
1405    register number, and optionally fill in the actual type of the register
1406    when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1407    type/index information in *TYPEINFO.  */
1408
1409 static int
1410 parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1411                            enum arm_reg_type *rtype,
1412                            struct neon_typed_alias *typeinfo)
1413 {
1414   char *str = *ccp;
1415   struct reg_entry *reg = arm_reg_parse_multi (&str);
1416   struct neon_typed_alias atype;
1417   struct neon_type_el parsetype;
1418
1419   atype.defined = 0;
1420   atype.index = -1;
1421   atype.eltype.type = NT_invtype;
1422   atype.eltype.size = -1;
1423
1424   /* Try alternate syntax for some types of register. Note these are mutually
1425      exclusive with the Neon syntax extensions.  */
1426   if (reg == NULL)
1427     {
1428       int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1429       if (altreg != FAIL)
1430         *ccp = str;
1431       if (typeinfo)
1432         *typeinfo = atype;
1433       return altreg;
1434     }
1435
1436   /* Undo polymorphism when a set of register types may be accepted.  */
1437   if ((type == REG_TYPE_NDQ
1438        && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1439       || (type == REG_TYPE_VFSD
1440           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1441       || (type == REG_TYPE_NSDQ
1442           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1443               || reg->type == REG_TYPE_NQ))
1444       || (type == REG_TYPE_MMXWC
1445           && (reg->type == REG_TYPE_MMXWCG)))
1446     type = (enum arm_reg_type) reg->type;
1447
1448   if (type != reg->type)
1449     return FAIL;
1450
1451   if (reg->neon)
1452     atype = *reg->neon;
1453
1454   if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1455     {
1456       if ((atype.defined & NTA_HASTYPE) != 0)
1457         {
1458           first_error (_("can't redefine type for operand"));
1459           return FAIL;
1460         }
1461       atype.defined |= NTA_HASTYPE;
1462       atype.eltype = parsetype;
1463     }
1464
1465   if (skip_past_char (&str, '[') == SUCCESS)
1466     {
1467       if (type != REG_TYPE_VFD)
1468         {
1469           first_error (_("only D registers may be indexed"));
1470           return FAIL;
1471         }
1472
1473       if ((atype.defined & NTA_HASINDEX) != 0)
1474         {
1475           first_error (_("can't change index for operand"));
1476           return FAIL;
1477         }
1478
1479       atype.defined |= NTA_HASINDEX;
1480
1481       if (skip_past_char (&str, ']') == SUCCESS)
1482         atype.index = NEON_ALL_LANES;
1483       else
1484         {
1485           expressionS exp;
1486
1487           my_get_expression (&exp, &str, GE_NO_PREFIX);
1488
1489           if (exp.X_op != O_constant)
1490             {
1491               first_error (_("constant expression required"));
1492               return FAIL;
1493             }
1494
1495           if (skip_past_char (&str, ']') == FAIL)
1496             return FAIL;
1497
1498           atype.index = exp.X_add_number;
1499         }
1500     }
1501
1502   if (typeinfo)
1503     *typeinfo = atype;
1504
1505   if (rtype)
1506     *rtype = type;
1507
1508   *ccp = str;
1509
1510   return reg->number;
1511 }
1512
1513 /* Like arm_reg_parse, but allow allow the following extra features:
1514     - If RTYPE is non-zero, return the (possibly restricted) type of the
1515       register (e.g. Neon double or quad reg when either has been requested).
1516     - If this is a Neon vector type with additional type information, fill
1517       in the struct pointed to by VECTYPE (if non-NULL).
1518    This function will fault on encountering a scalar.  */
1519
1520 static int
1521 arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1522                      enum arm_reg_type *rtype, struct neon_type_el *vectype)
1523 {
1524   struct neon_typed_alias atype;
1525   char *str = *ccp;
1526   int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1527
1528   if (reg == FAIL)
1529     return FAIL;
1530
1531   /* Do not allow regname(... to parse as a register.  */
1532   if (*str == '(')
1533     return FAIL;
1534
1535   /* Do not allow a scalar (reg+index) to parse as a register.  */
1536   if ((atype.defined & NTA_HASINDEX) != 0)
1537     {
1538       first_error (_("register operand expected, but got scalar"));
1539       return FAIL;
1540     }
1541
1542   if (vectype)
1543     *vectype = atype.eltype;
1544
1545   *ccp = str;
1546
1547   return reg;
1548 }
1549
1550 #define NEON_SCALAR_REG(X)      ((X) >> 4)
1551 #define NEON_SCALAR_INDEX(X)    ((X) & 15)
1552
1553 /* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1554    have enough information to be able to do a good job bounds-checking. So, we
1555    just do easy checks here, and do further checks later.  */
1556
1557 static int
1558 parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
1559 {
1560   int reg;
1561   char *str = *ccp;
1562   struct neon_typed_alias atype;
1563
1564   reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
1565
1566   if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
1567     return FAIL;
1568
1569   if (atype.index == NEON_ALL_LANES)
1570     {
1571       first_error (_("scalar must have an index"));
1572       return FAIL;
1573     }
1574   else if (atype.index >= 64 / elsize)
1575     {
1576       first_error (_("scalar index out of range"));
1577       return FAIL;
1578     }
1579
1580   if (type)
1581     *type = atype.eltype;
1582
1583   *ccp = str;
1584
1585   return reg * 16 + atype.index;
1586 }
1587
1588 /* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
1589
1590 static long
1591 parse_reg_list (char ** strp)
1592 {
1593   char * str = * strp;
1594   long   range = 0;
1595   int    another_range;
1596
1597   /* We come back here if we get ranges concatenated by '+' or '|'.  */
1598   do
1599     {
1600       skip_whitespace (str);
1601
1602       another_range = 0;
1603
1604       if (*str == '{')
1605         {
1606           int in_range = 0;
1607           int cur_reg = -1;
1608
1609           str++;
1610           do
1611             {
1612               int reg;
1613
1614               if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
1615                 {
1616                   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
1617                   return FAIL;
1618                 }
1619
1620               if (in_range)
1621                 {
1622                   int i;
1623
1624                   if (reg <= cur_reg)
1625                     {
1626                       first_error (_("bad range in register list"));
1627                       return FAIL;
1628                     }
1629
1630                   for (i = cur_reg + 1; i < reg; i++)
1631                     {
1632                       if (range & (1 << i))
1633                         as_tsktsk
1634                           (_("Warning: duplicated register (r%d) in register list"),
1635                            i);
1636                       else
1637                         range |= 1 << i;
1638                     }
1639                   in_range = 0;
1640                 }
1641
1642               if (range & (1 << reg))
1643                 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1644                            reg);
1645               else if (reg <= cur_reg)
1646                 as_tsktsk (_("Warning: register range not in ascending order"));
1647
1648               range |= 1 << reg;
1649               cur_reg = reg;
1650             }
1651           while (skip_past_comma (&str) != FAIL
1652                  || (in_range = 1, *str++ == '-'));
1653           str--;
1654
1655           if (skip_past_char (&str, '}') == FAIL)
1656             {
1657               first_error (_("missing `}'"));
1658               return FAIL;
1659             }
1660         }
1661       else
1662         {
1663           expressionS exp;
1664
1665           if (my_get_expression (&exp, &str, GE_NO_PREFIX))
1666             return FAIL;
1667
1668           if (exp.X_op == O_constant)
1669             {
1670               if (exp.X_add_number
1671                   != (exp.X_add_number & 0x0000ffff))
1672                 {
1673                   inst.error = _("invalid register mask");
1674                   return FAIL;
1675                 }
1676
1677               if ((range & exp.X_add_number) != 0)
1678                 {
1679                   int regno = range & exp.X_add_number;
1680
1681                   regno &= -regno;
1682                   regno = (1 << regno) - 1;
1683                   as_tsktsk
1684                     (_("Warning: duplicated register (r%d) in register list"),
1685                      regno);
1686                 }
1687
1688               range |= exp.X_add_number;
1689             }
1690           else
1691             {
1692               if (inst.reloc.type != 0)
1693                 {
1694                   inst.error = _("expression too complex");
1695                   return FAIL;
1696                 }
1697
1698               memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
1699               inst.reloc.type = BFD_RELOC_ARM_MULTI;
1700               inst.reloc.pc_rel = 0;
1701             }
1702         }
1703
1704       if (*str == '|' || *str == '+')
1705         {
1706           str++;
1707           another_range = 1;
1708         }
1709     }
1710   while (another_range);
1711
1712   *strp = str;
1713   return range;
1714 }
1715
1716 /* Types of registers in a list.  */
1717
1718 enum reg_list_els
1719 {
1720   REGLIST_VFP_S,
1721   REGLIST_VFP_D,
1722   REGLIST_NEON_D
1723 };
1724
1725 /* Parse a VFP register list.  If the string is invalid return FAIL.
1726    Otherwise return the number of registers, and set PBASE to the first
1727    register.  Parses registers of type ETYPE.
1728    If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1729      - Q registers can be used to specify pairs of D registers
1730      - { } can be omitted from around a singleton register list
1731          FIXME: This is not implemented, as it would require backtracking in
1732          some cases, e.g.:
1733            vtbl.8 d3,d4,d5
1734          This could be done (the meaning isn't really ambiguous), but doesn't
1735          fit in well with the current parsing framework.
1736      - 32 D registers may be used (also true for VFPv3).
1737    FIXME: Types are ignored in these register lists, which is probably a
1738    bug.  */
1739
1740 static int
1741 parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
1742 {
1743   char *str = *ccp;
1744   int base_reg;
1745   int new_base;
1746   enum arm_reg_type regtype = (enum arm_reg_type) 0;
1747   int max_regs = 0;
1748   int count = 0;
1749   int warned = 0;
1750   unsigned long mask = 0;
1751   int i;
1752
1753   if (skip_past_char (&str, '{') == FAIL)
1754     {
1755       inst.error = _("expecting {");
1756       return FAIL;
1757     }
1758
1759   switch (etype)
1760     {
1761     case REGLIST_VFP_S:
1762       regtype = REG_TYPE_VFS;
1763       max_regs = 32;
1764       break;
1765
1766     case REGLIST_VFP_D:
1767       regtype = REG_TYPE_VFD;
1768       break;
1769
1770     case REGLIST_NEON_D:
1771       regtype = REG_TYPE_NDQ;
1772       break;
1773     }
1774
1775   if (etype != REGLIST_VFP_S)
1776     {
1777       /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant.  */
1778       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
1779         {
1780           max_regs = 32;
1781           if (thumb_mode)
1782             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1783                                     fpu_vfp_ext_d32);
1784           else
1785             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1786                                     fpu_vfp_ext_d32);
1787         }
1788       else
1789         max_regs = 16;
1790     }
1791
1792   base_reg = max_regs;
1793
1794   do
1795     {
1796       int setmask = 1, addregs = 1;
1797
1798       new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
1799
1800       if (new_base == FAIL)
1801         {
1802           first_error (_(reg_expected_msgs[regtype]));
1803           return FAIL;
1804         }
1805
1806       if (new_base >= max_regs)
1807         {
1808           first_error (_("register out of range in list"));
1809           return FAIL;
1810         }
1811
1812       /* Note: a value of 2 * n is returned for the register Q<n>.  */
1813       if (regtype == REG_TYPE_NQ)
1814         {
1815           setmask = 3;
1816           addregs = 2;
1817         }
1818
1819       if (new_base < base_reg)
1820         base_reg = new_base;
1821
1822       if (mask & (setmask << new_base))
1823         {
1824           first_error (_("invalid register list"));
1825           return FAIL;
1826         }
1827
1828       if ((mask >> new_base) != 0 && ! warned)
1829         {
1830           as_tsktsk (_("register list not in ascending order"));
1831           warned = 1;
1832         }
1833
1834       mask |= setmask << new_base;
1835       count += addregs;
1836
1837       if (*str == '-') /* We have the start of a range expression */
1838         {
1839           int high_range;
1840
1841           str++;
1842
1843           if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
1844               == FAIL)
1845             {
1846               inst.error = gettext (reg_expected_msgs[regtype]);
1847               return FAIL;
1848             }
1849
1850           if (high_range >= max_regs)
1851             {
1852               first_error (_("register out of range in list"));
1853               return FAIL;
1854             }
1855
1856           if (regtype == REG_TYPE_NQ)
1857             high_range = high_range + 1;
1858
1859           if (high_range <= new_base)
1860             {
1861               inst.error = _("register range not in ascending order");
1862               return FAIL;
1863             }
1864
1865           for (new_base += addregs; new_base <= high_range; new_base += addregs)
1866             {
1867               if (mask & (setmask << new_base))
1868                 {
1869                   inst.error = _("invalid register list");
1870                   return FAIL;
1871                 }
1872
1873               mask |= setmask << new_base;
1874               count += addregs;
1875             }
1876         }
1877     }
1878   while (skip_past_comma (&str) != FAIL);
1879
1880   str++;
1881
1882   /* Sanity check -- should have raised a parse error above.  */
1883   if (count == 0 || count > max_regs)
1884     abort ();
1885
1886   *pbase = base_reg;
1887
1888   /* Final test -- the registers must be consecutive.  */
1889   mask >>= base_reg;
1890   for (i = 0; i < count; i++)
1891     {
1892       if ((mask & (1u << i)) == 0)
1893         {
1894           inst.error = _("non-contiguous register range");
1895           return FAIL;
1896         }
1897     }
1898
1899   *ccp = str;
1900
1901   return count;
1902 }
1903
1904 /* True if two alias types are the same.  */
1905
1906 static bfd_boolean
1907 neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1908 {
1909   if (!a && !b)
1910     return TRUE;
1911
1912   if (!a || !b)
1913     return FALSE;
1914
1915   if (a->defined != b->defined)
1916     return FALSE;
1917
1918   if ((a->defined & NTA_HASTYPE) != 0
1919       && (a->eltype.type != b->eltype.type
1920           || a->eltype.size != b->eltype.size))
1921     return FALSE;
1922
1923   if ((a->defined & NTA_HASINDEX) != 0
1924       && (a->index != b->index))
1925     return FALSE;
1926
1927   return TRUE;
1928 }
1929
1930 /* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1931    The base register is put in *PBASE.
1932    The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
1933    the return value.
1934    The register stride (minus one) is put in bit 4 of the return value.
1935    Bits [6:5] encode the list length (minus one).
1936    The type of the list elements is put in *ELTYPE, if non-NULL.  */
1937
1938 #define NEON_LANE(X)            ((X) & 0xf)
1939 #define NEON_REG_STRIDE(X)      ((((X) >> 4) & 1) + 1)
1940 #define NEON_REGLIST_LENGTH(X)  ((((X) >> 5) & 3) + 1)
1941
1942 static int
1943 parse_neon_el_struct_list (char **str, unsigned *pbase,
1944                            struct neon_type_el *eltype)
1945 {
1946   char *ptr = *str;
1947   int base_reg = -1;
1948   int reg_incr = -1;
1949   int count = 0;
1950   int lane = -1;
1951   int leading_brace = 0;
1952   enum arm_reg_type rtype = REG_TYPE_NDQ;
1953   const char *const incr_error = _("register stride must be 1 or 2");
1954   const char *const type_error = _("mismatched element/structure types in list");
1955   struct neon_typed_alias firsttype;
1956
1957   if (skip_past_char (&ptr, '{') == SUCCESS)
1958     leading_brace = 1;
1959
1960   do
1961     {
1962       struct neon_typed_alias atype;
1963       int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1964
1965       if (getreg == FAIL)
1966         {
1967           first_error (_(reg_expected_msgs[rtype]));
1968           return FAIL;
1969         }
1970
1971       if (base_reg == -1)
1972         {
1973           base_reg = getreg;
1974           if (rtype == REG_TYPE_NQ)
1975             {
1976               reg_incr = 1;
1977             }
1978           firsttype = atype;
1979         }
1980       else if (reg_incr == -1)
1981         {
1982           reg_incr = getreg - base_reg;
1983           if (reg_incr < 1 || reg_incr > 2)
1984             {
1985               first_error (_(incr_error));
1986               return FAIL;
1987             }
1988         }
1989       else if (getreg != base_reg + reg_incr * count)
1990         {
1991           first_error (_(incr_error));
1992           return FAIL;
1993         }
1994
1995       if (! neon_alias_types_same (&atype, &firsttype))
1996         {
1997           first_error (_(type_error));
1998           return FAIL;
1999         }
2000
2001       /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
2002          modes.  */
2003       if (ptr[0] == '-')
2004         {
2005           struct neon_typed_alias htype;
2006           int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
2007           if (lane == -1)
2008             lane = NEON_INTERLEAVE_LANES;
2009           else if (lane != NEON_INTERLEAVE_LANES)
2010             {
2011               first_error (_(type_error));
2012               return FAIL;
2013             }
2014           if (reg_incr == -1)
2015             reg_incr = 1;
2016           else if (reg_incr != 1)
2017             {
2018               first_error (_("don't use Rn-Rm syntax with non-unit stride"));
2019               return FAIL;
2020             }
2021           ptr++;
2022           hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
2023           if (hireg == FAIL)
2024             {
2025               first_error (_(reg_expected_msgs[rtype]));
2026               return FAIL;
2027             }
2028           if (! neon_alias_types_same (&htype, &firsttype))
2029             {
2030               first_error (_(type_error));
2031               return FAIL;
2032             }
2033           count += hireg + dregs - getreg;
2034           continue;
2035         }
2036
2037       /* If we're using Q registers, we can't use [] or [n] syntax.  */
2038       if (rtype == REG_TYPE_NQ)
2039         {
2040           count += 2;
2041           continue;
2042         }
2043
2044       if ((atype.defined & NTA_HASINDEX) != 0)
2045         {
2046           if (lane == -1)
2047             lane = atype.index;
2048           else if (lane != atype.index)
2049             {
2050               first_error (_(type_error));
2051               return FAIL;
2052             }
2053         }
2054       else if (lane == -1)
2055         lane = NEON_INTERLEAVE_LANES;
2056       else if (lane != NEON_INTERLEAVE_LANES)
2057         {
2058           first_error (_(type_error));
2059           return FAIL;
2060         }
2061       count++;
2062     }
2063   while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
2064
2065   /* No lane set by [x]. We must be interleaving structures.  */
2066   if (lane == -1)
2067     lane = NEON_INTERLEAVE_LANES;
2068
2069   /* Sanity check.  */
2070   if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2071       || (count > 1 && reg_incr == -1))
2072     {
2073       first_error (_("error parsing element/structure list"));
2074       return FAIL;
2075     }
2076
2077   if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2078     {
2079       first_error (_("expected }"));
2080       return FAIL;
2081     }
2082
2083   if (reg_incr == -1)
2084     reg_incr = 1;
2085
2086   if (eltype)
2087     *eltype = firsttype.eltype;
2088
2089   *pbase = base_reg;
2090   *str = ptr;
2091
2092   return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2093 }
2094
2095 /* Parse an explicit relocation suffix on an expression.  This is
2096    either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
2097    arm_reloc_hsh contains no entries, so this function can only
2098    succeed if there is no () after the word.  Returns -1 on error,
2099    BFD_RELOC_UNUSED if there wasn't any suffix.  */
2100
2101 static int
2102 parse_reloc (char **str)
2103 {
2104   struct reloc_entry *r;
2105   char *p, *q;
2106
2107   if (**str != '(')
2108     return BFD_RELOC_UNUSED;
2109
2110   p = *str + 1;
2111   q = p;
2112
2113   while (*q && *q != ')' && *q != ',')
2114     q++;
2115   if (*q != ')')
2116     return -1;
2117
2118   if ((r = (struct reloc_entry *)
2119        hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
2120     return -1;
2121
2122   *str = q + 1;
2123   return r->reloc;
2124 }
2125
2126 /* Directives: register aliases.  */
2127
2128 static struct reg_entry *
2129 insert_reg_alias (char *str, unsigned number, int type)
2130 {
2131   struct reg_entry *new_reg;
2132   const char *name;
2133
2134   if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
2135     {
2136       if (new_reg->builtin)
2137         as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
2138
2139       /* Only warn about a redefinition if it's not defined as the
2140          same register.  */
2141       else if (new_reg->number != number || new_reg->type != type)
2142         as_warn (_("ignoring redefinition of register alias '%s'"), str);
2143
2144       return NULL;
2145     }
2146
2147   name = xstrdup (str);
2148   new_reg = (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
2149
2150   new_reg->name = name;
2151   new_reg->number = number;
2152   new_reg->type = type;
2153   new_reg->builtin = FALSE;
2154   new_reg->neon = NULL;
2155
2156   if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
2157     abort ();
2158
2159   return new_reg;
2160 }
2161
2162 static void
2163 insert_neon_reg_alias (char *str, int number, int type,
2164                        struct neon_typed_alias *atype)
2165 {
2166   struct reg_entry *reg = insert_reg_alias (str, number, type);
2167
2168   if (!reg)
2169     {
2170       first_error (_("attempt to redefine typed alias"));
2171       return;
2172     }
2173
2174   if (atype)
2175     {
2176       reg->neon = (struct neon_typed_alias *)
2177           xmalloc (sizeof (struct neon_typed_alias));
2178       *reg->neon = *atype;
2179     }
2180 }
2181
2182 /* Look for the .req directive.  This is of the form:
2183
2184         new_register_name .req existing_register_name
2185
2186    If we find one, or if it looks sufficiently like one that we want to
2187    handle any error here, return TRUE.  Otherwise return FALSE.  */
2188
2189 static bfd_boolean
2190 create_register_alias (char * newname, char *p)
2191 {
2192   struct reg_entry *old;
2193   char *oldname, *nbuf;
2194   size_t nlen;
2195
2196   /* The input scrubber ensures that whitespace after the mnemonic is
2197      collapsed to single spaces.  */
2198   oldname = p;
2199   if (strncmp (oldname, " .req ", 6) != 0)
2200     return FALSE;
2201
2202   oldname += 6;
2203   if (*oldname == '\0')
2204     return FALSE;
2205
2206   old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
2207   if (!old)
2208     {
2209       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2210       return TRUE;
2211     }
2212
2213   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2214      the desired alias name, and p points to its end.  If not, then
2215      the desired alias name is in the global original_case_string.  */
2216 #ifdef TC_CASE_SENSITIVE
2217   nlen = p - newname;
2218 #else
2219   newname = original_case_string;
2220   nlen = strlen (newname);
2221 #endif
2222
2223   nbuf = (char *) alloca (nlen + 1);
2224   memcpy (nbuf, newname, nlen);
2225   nbuf[nlen] = '\0';
2226
2227   /* Create aliases under the new name as stated; an all-lowercase
2228      version of the new name; and an all-uppercase version of the new
2229      name.  */
2230   if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2231     {
2232       for (p = nbuf; *p; p++)
2233         *p = TOUPPER (*p);
2234
2235       if (strncmp (nbuf, newname, nlen))
2236         {
2237           /* If this attempt to create an additional alias fails, do not bother
2238              trying to create the all-lower case alias.  We will fail and issue
2239              a second, duplicate error message.  This situation arises when the
2240              programmer does something like:
2241                foo .req r0
2242                Foo .req r1
2243              The second .req creates the "Foo" alias but then fails to create
2244              the artificial FOO alias because it has already been created by the
2245              first .req.  */
2246           if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2247             return TRUE;
2248         }
2249
2250       for (p = nbuf; *p; p++)
2251         *p = TOLOWER (*p);
2252
2253       if (strncmp (nbuf, newname, nlen))
2254         insert_reg_alias (nbuf, old->number, old->type);
2255     }
2256
2257   return TRUE;
2258 }
2259
2260 /* Create a Neon typed/indexed register alias using directives, e.g.:
2261      X .dn d5.s32[1]
2262      Y .qn 6.s16
2263      Z .dn d7
2264      T .dn Z[0]
2265    These typed registers can be used instead of the types specified after the
2266    Neon mnemonic, so long as all operands given have types. Types can also be
2267    specified directly, e.g.:
2268      vadd d0.s32, d1.s32, d2.s32  */
2269
2270 static bfd_boolean
2271 create_neon_reg_alias (char *newname, char *p)
2272 {
2273   enum arm_reg_type basetype;
2274   struct reg_entry *basereg;
2275   struct reg_entry mybasereg;
2276   struct neon_type ntype;
2277   struct neon_typed_alias typeinfo;
2278   char *namebuf, *nameend ATTRIBUTE_UNUSED;
2279   int namelen;
2280
2281   typeinfo.defined = 0;
2282   typeinfo.eltype.type = NT_invtype;
2283   typeinfo.eltype.size = -1;
2284   typeinfo.index = -1;
2285
2286   nameend = p;
2287
2288   if (strncmp (p, " .dn ", 5) == 0)
2289     basetype = REG_TYPE_VFD;
2290   else if (strncmp (p, " .qn ", 5) == 0)
2291     basetype = REG_TYPE_NQ;
2292   else
2293     return FALSE;
2294
2295   p += 5;
2296
2297   if (*p == '\0')
2298     return FALSE;
2299
2300   basereg = arm_reg_parse_multi (&p);
2301
2302   if (basereg && basereg->type != basetype)
2303     {
2304       as_bad (_("bad type for register"));
2305       return FALSE;
2306     }
2307
2308   if (basereg == NULL)
2309     {
2310       expressionS exp;
2311       /* Try parsing as an integer.  */
2312       my_get_expression (&exp, &p, GE_NO_PREFIX);
2313       if (exp.X_op != O_constant)
2314         {
2315           as_bad (_("expression must be constant"));
2316           return FALSE;
2317         }
2318       basereg = &mybasereg;
2319       basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2320                                                   : exp.X_add_number;
2321       basereg->neon = 0;
2322     }
2323
2324   if (basereg->neon)
2325     typeinfo = *basereg->neon;
2326
2327   if (parse_neon_type (&ntype, &p) == SUCCESS)
2328     {
2329       /* We got a type.  */
2330       if (typeinfo.defined & NTA_HASTYPE)
2331         {
2332           as_bad (_("can't redefine the type of a register alias"));
2333           return FALSE;
2334         }
2335
2336       typeinfo.defined |= NTA_HASTYPE;
2337       if (ntype.elems != 1)
2338         {
2339           as_bad (_("you must specify a single type only"));
2340           return FALSE;
2341         }
2342       typeinfo.eltype = ntype.el[0];
2343     }
2344
2345   if (skip_past_char (&p, '[') == SUCCESS)
2346     {
2347       expressionS exp;
2348       /* We got a scalar index.  */
2349
2350       if (typeinfo.defined & NTA_HASINDEX)
2351         {
2352           as_bad (_("can't redefine the index of a scalar alias"));
2353           return FALSE;
2354         }
2355
2356       my_get_expression (&exp, &p, GE_NO_PREFIX);
2357
2358       if (exp.X_op != O_constant)
2359         {
2360           as_bad (_("scalar index must be constant"));
2361           return FALSE;
2362         }
2363
2364       typeinfo.defined |= NTA_HASINDEX;
2365       typeinfo.index = exp.X_add_number;
2366
2367       if (skip_past_char (&p, ']') == FAIL)
2368         {
2369           as_bad (_("expecting ]"));
2370           return FALSE;
2371         }
2372     }
2373
2374   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2375      the desired alias name, and p points to its end.  If not, then
2376      the desired alias name is in the global original_case_string.  */
2377 #ifdef TC_CASE_SENSITIVE
2378   namelen = nameend - newname;
2379 #else
2380   newname = original_case_string;
2381   namelen = strlen (newname);
2382 #endif
2383
2384   namebuf = (char *) alloca (namelen + 1);
2385   strncpy (namebuf, newname, namelen);
2386   namebuf[namelen] = '\0';
2387
2388   insert_neon_reg_alias (namebuf, basereg->number, basetype,
2389                          typeinfo.defined != 0 ? &typeinfo : NULL);
2390
2391   /* Insert name in all uppercase.  */
2392   for (p = namebuf; *p; p++)
2393     *p = TOUPPER (*p);
2394
2395   if (strncmp (namebuf, newname, namelen))
2396     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2397                            typeinfo.defined != 0 ? &typeinfo : NULL);
2398
2399   /* Insert name in all lowercase.  */
2400   for (p = namebuf; *p; p++)
2401     *p = TOLOWER (*p);
2402
2403   if (strncmp (namebuf, newname, namelen))
2404     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2405                            typeinfo.defined != 0 ? &typeinfo : NULL);
2406
2407   return TRUE;
2408 }
2409
2410 /* Should never be called, as .req goes between the alias and the
2411    register name, not at the beginning of the line.  */
2412
2413 static void
2414 s_req (int a ATTRIBUTE_UNUSED)
2415 {
2416   as_bad (_("invalid syntax for .req directive"));
2417 }
2418
2419 static void
2420 s_dn (int a ATTRIBUTE_UNUSED)
2421 {
2422   as_bad (_("invalid syntax for .dn directive"));
2423 }
2424
2425 static void
2426 s_qn (int a ATTRIBUTE_UNUSED)
2427 {
2428   as_bad (_("invalid syntax for .qn directive"));
2429 }
2430
2431 /* The .unreq directive deletes an alias which was previously defined
2432    by .req.  For example:
2433
2434        my_alias .req r11
2435        .unreq my_alias    */
2436
2437 static void
2438 s_unreq (int a ATTRIBUTE_UNUSED)
2439 {
2440   char * name;
2441   char saved_char;
2442
2443   name = input_line_pointer;
2444
2445   while (*input_line_pointer != 0
2446          && *input_line_pointer != ' '
2447          && *input_line_pointer != '\n')
2448     ++input_line_pointer;
2449
2450   saved_char = *input_line_pointer;
2451   *input_line_pointer = 0;
2452
2453   if (!*name)
2454     as_bad (_("invalid syntax for .unreq directive"));
2455   else
2456     {
2457       struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2458                                                               name);
2459
2460       if (!reg)
2461         as_bad (_("unknown register alias '%s'"), name);
2462       else if (reg->builtin)
2463         as_warn (_("ignoring attempt to use .unreq on fixed register name: '%s'"),
2464                  name);
2465       else
2466         {
2467           char * p;
2468           char * nbuf;
2469
2470           hash_delete (arm_reg_hsh, name, FALSE);
2471           free ((char *) reg->name);
2472           if (reg->neon)
2473             free (reg->neon);
2474           free (reg);
2475
2476           /* Also locate the all upper case and all lower case versions.
2477              Do not complain if we cannot find one or the other as it
2478              was probably deleted above.  */
2479
2480           nbuf = strdup (name);
2481           for (p = nbuf; *p; p++)
2482             *p = TOUPPER (*p);
2483           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2484           if (reg)
2485             {
2486               hash_delete (arm_reg_hsh, nbuf, FALSE);
2487               free ((char *) reg->name);
2488               if (reg->neon)
2489                 free (reg->neon);
2490               free (reg);
2491             }
2492
2493           for (p = nbuf; *p; p++)
2494             *p = TOLOWER (*p);
2495           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2496           if (reg)
2497             {
2498               hash_delete (arm_reg_hsh, nbuf, FALSE);
2499               free ((char *) reg->name);
2500               if (reg->neon)
2501                 free (reg->neon);
2502               free (reg);
2503             }
2504
2505           free (nbuf);
2506         }
2507     }
2508
2509   *input_line_pointer = saved_char;
2510   demand_empty_rest_of_line ();
2511 }
2512
2513 /* Directives: Instruction set selection.  */
2514
2515 #ifdef OBJ_ELF
2516 /* This code is to handle mapping symbols as defined in the ARM ELF spec.
2517    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2518    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2519    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
2520
2521 /* Create a new mapping symbol for the transition to STATE.  */
2522
2523 static void
2524 make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
2525 {
2526   symbolS * symbolP;
2527   const char * symname;
2528   int type;
2529
2530   switch (state)
2531     {
2532     case MAP_DATA:
2533       symname = "$d";
2534       type = BSF_NO_FLAGS;
2535       break;
2536     case MAP_ARM:
2537       symname = "$a";
2538       type = BSF_NO_FLAGS;
2539       break;
2540     case MAP_THUMB:
2541       symname = "$t";
2542       type = BSF_NO_FLAGS;
2543       break;
2544     default:
2545       abort ();
2546     }
2547
2548   symbolP = symbol_new (symname, now_seg, value, frag);
2549   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2550
2551   switch (state)
2552     {
2553     case MAP_ARM:
2554       THUMB_SET_FUNC (symbolP, 0);
2555       ARM_SET_THUMB (symbolP, 0);
2556       ARM_SET_INTERWORK (symbolP, support_interwork);
2557       break;
2558
2559     case MAP_THUMB:
2560       THUMB_SET_FUNC (symbolP, 1);
2561       ARM_SET_THUMB (symbolP, 1);
2562       ARM_SET_INTERWORK (symbolP, support_interwork);
2563       break;
2564
2565     case MAP_DATA:
2566     default:
2567       break;
2568     }
2569
2570   /* Save the mapping symbols for future reference.  Also check that
2571      we do not place two mapping symbols at the same offset within a
2572      frag.  We'll handle overlap between frags in
2573      check_mapping_symbols.
2574
2575      If .fill or other data filling directive generates zero sized data,
2576      the mapping symbol for the following code will have the same value
2577      as the one generated for the data filling directive.  In this case,
2578      we replace the old symbol with the new one at the same address.  */
2579   if (value == 0)
2580     {
2581       if (frag->tc_frag_data.first_map != NULL)
2582         {
2583           know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2584           symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2585         }
2586       frag->tc_frag_data.first_map = symbolP;
2587     }
2588   if (frag->tc_frag_data.last_map != NULL)
2589     {
2590       know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
2591       if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2592         symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2593     }
2594   frag->tc_frag_data.last_map = symbolP;
2595 }
2596
2597 /* We must sometimes convert a region marked as code to data during
2598    code alignment, if an odd number of bytes have to be padded.  The
2599    code mapping symbol is pushed to an aligned address.  */
2600
2601 static void
2602 insert_data_mapping_symbol (enum mstate state,
2603                             valueT value, fragS *frag, offsetT bytes)
2604 {
2605   /* If there was already a mapping symbol, remove it.  */
2606   if (frag->tc_frag_data.last_map != NULL
2607       && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2608     {
2609       symbolS *symp = frag->tc_frag_data.last_map;
2610
2611       if (value == 0)
2612         {
2613           know (frag->tc_frag_data.first_map == symp);
2614           frag->tc_frag_data.first_map = NULL;
2615         }
2616       frag->tc_frag_data.last_map = NULL;
2617       symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2618     }
2619
2620   make_mapping_symbol (MAP_DATA, value, frag);
2621   make_mapping_symbol (state, value + bytes, frag);
2622 }
2623
2624 static void mapping_state_2 (enum mstate state, int max_chars);
2625
2626 /* Set the mapping state to STATE.  Only call this when about to
2627    emit some STATE bytes to the file.  */
2628
2629 void
2630 mapping_state (enum mstate state)
2631 {
2632   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2633
2634 #define TRANSITION(from, to) (mapstate == (from) && state == (to))
2635
2636   if (mapstate == state)
2637     /* The mapping symbol has already been emitted.
2638        There is nothing else to do.  */
2639     return;
2640
2641   if (state == MAP_ARM || state == MAP_THUMB)
2642     /*  PR gas/12931
2643         All ARM instructions require 4-byte alignment.
2644         (Almost) all Thumb instructions require 2-byte alignment.
2645
2646         When emitting instructions into any section, mark the section
2647         appropriately.
2648
2649         Some Thumb instructions are alignment-sensitive modulo 4 bytes,
2650         but themselves require 2-byte alignment; this applies to some
2651         PC- relative forms.  However, these cases will invovle implicit
2652         literal pool generation or an explicit .align >=2, both of
2653         which will cause the section to me marked with sufficient
2654         alignment.  Thus, we don't handle those cases here.  */
2655     record_alignment (now_seg, state == MAP_ARM ? 2 : 1);
2656
2657   if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
2658     /* This case will be evaluated later in the next else.  */
2659     return;
2660   else if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2661           || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2662     {
2663       /* Only add the symbol if the offset is > 0:
2664          if we're at the first frag, check it's size > 0;
2665          if we're not at the first frag, then for sure
2666             the offset is > 0.  */
2667       struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2668       const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2669
2670       if (add_symbol)
2671         make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2672     }
2673
2674   mapping_state_2 (state, 0);
2675 #undef TRANSITION
2676 }
2677
2678 /* Same as mapping_state, but MAX_CHARS bytes have already been
2679    allocated.  Put the mapping symbol that far back.  */
2680
2681 static void
2682 mapping_state_2 (enum mstate state, int max_chars)
2683 {
2684   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2685
2686   if (!SEG_NORMAL (now_seg))
2687     return;
2688
2689   if (mapstate == state)
2690     /* The mapping symbol has already been emitted.
2691        There is nothing else to do.  */
2692     return;
2693
2694   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2695   make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
2696 }
2697 #else
2698 #define mapping_state(x) ((void)0)
2699 #define mapping_state_2(x, y) ((void)0)
2700 #endif
2701
2702 /* Find the real, Thumb encoded start of a Thumb function.  */
2703
2704 #ifdef OBJ_COFF
2705 static symbolS *
2706 find_real_start (symbolS * symbolP)
2707 {
2708   char *       real_start;
2709   const char * name = S_GET_NAME (symbolP);
2710   symbolS *    new_target;
2711
2712   /* This definition must agree with the one in gcc/config/arm/thumb.c.  */
2713 #define STUB_NAME ".real_start_of"
2714
2715   if (name == NULL)
2716     abort ();
2717
2718   /* The compiler may generate BL instructions to local labels because
2719      it needs to perform a branch to a far away location. These labels
2720      do not have a corresponding ".real_start_of" label.  We check
2721      both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2722      the ".real_start_of" convention for nonlocal branches.  */
2723   if (S_IS_LOCAL (symbolP) || name[0] == '.')
2724     return symbolP;
2725
2726   real_start = ACONCAT ((STUB_NAME, name, NULL));
2727   new_target = symbol_find (real_start);
2728
2729   if (new_target == NULL)
2730     {
2731       as_warn (_("Failed to find real start of function: %s\n"), name);
2732       new_target = symbolP;
2733     }
2734
2735   return new_target;
2736 }
2737 #endif
2738
2739 static void
2740 opcode_select (int width)
2741 {
2742   switch (width)
2743     {
2744     case 16:
2745       if (! thumb_mode)
2746         {
2747           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
2748             as_bad (_("selected processor does not support THUMB opcodes"));
2749
2750           thumb_mode = 1;
2751           /* No need to force the alignment, since we will have been
2752              coming from ARM mode, which is word-aligned.  */
2753           record_alignment (now_seg, 1);
2754         }
2755       break;
2756
2757     case 32:
2758       if (thumb_mode)
2759         {
2760           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
2761             as_bad (_("selected processor does not support ARM opcodes"));
2762
2763           thumb_mode = 0;
2764
2765           if (!need_pass_2)
2766             frag_align (2, 0, 0);
2767
2768           record_alignment (now_seg, 1);
2769         }
2770       break;
2771
2772     default:
2773       as_bad (_("invalid instruction size selected (%d)"), width);
2774     }
2775 }
2776
2777 static void
2778 s_arm (int ignore ATTRIBUTE_UNUSED)
2779 {
2780   opcode_select (32);
2781   demand_empty_rest_of_line ();
2782 }
2783
2784 static void
2785 s_thumb (int ignore ATTRIBUTE_UNUSED)
2786 {
2787   opcode_select (16);
2788   demand_empty_rest_of_line ();
2789 }
2790
2791 static void
2792 s_code (int unused ATTRIBUTE_UNUSED)
2793 {
2794   int temp;
2795
2796   temp = get_absolute_expression ();
2797   switch (temp)
2798     {
2799     case 16:
2800     case 32:
2801       opcode_select (temp);
2802       break;
2803
2804     default:
2805       as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2806     }
2807 }
2808
2809 static void
2810 s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2811 {
2812   /* If we are not already in thumb mode go into it, EVEN if
2813      the target processor does not support thumb instructions.
2814      This is used by gcc/config/arm/lib1funcs.asm for example
2815      to compile interworking support functions even if the
2816      target processor should not support interworking.  */
2817   if (! thumb_mode)
2818     {
2819       thumb_mode = 2;
2820       record_alignment (now_seg, 1);
2821     }
2822
2823   demand_empty_rest_of_line ();
2824 }
2825
2826 static void
2827 s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2828 {
2829   s_thumb (0);
2830
2831   /* The following label is the name/address of the start of a Thumb function.
2832      We need to know this for the interworking support.  */
2833   label_is_thumb_function_name = TRUE;
2834 }
2835
2836 /* Perform a .set directive, but also mark the alias as
2837    being a thumb function.  */
2838
2839 static void
2840 s_thumb_set (int equiv)
2841 {
2842   /* XXX the following is a duplicate of the code for s_set() in read.c
2843      We cannot just call that code as we need to get at the symbol that
2844      is created.  */
2845   char *    name;
2846   char      delim;
2847   char *    end_name;
2848   symbolS * symbolP;
2849
2850   /* Especial apologies for the random logic:
2851      This just grew, and could be parsed much more simply!
2852      Dean - in haste.  */
2853   name      = input_line_pointer;
2854   delim     = get_symbol_end ();
2855   end_name  = input_line_pointer;
2856   *end_name = delim;
2857
2858   if (*input_line_pointer != ',')
2859     {
2860       *end_name = 0;
2861       as_bad (_("expected comma after name \"%s\""), name);
2862       *end_name = delim;
2863       ignore_rest_of_line ();
2864       return;
2865     }
2866
2867   input_line_pointer++;
2868   *end_name = 0;
2869
2870   if (name[0] == '.' && name[1] == '\0')
2871     {
2872       /* XXX - this should not happen to .thumb_set.  */
2873       abort ();
2874     }
2875
2876   if ((symbolP = symbol_find (name)) == NULL
2877       && (symbolP = md_undefined_symbol (name)) == NULL)
2878     {
2879 #ifndef NO_LISTING
2880       /* When doing symbol listings, play games with dummy fragments living
2881          outside the normal fragment chain to record the file and line info
2882          for this symbol.  */
2883       if (listing & LISTING_SYMBOLS)
2884         {
2885           extern struct list_info_struct * listing_tail;
2886           fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
2887
2888           memset (dummy_frag, 0, sizeof (fragS));
2889           dummy_frag->fr_type = rs_fill;
2890           dummy_frag->line = listing_tail;
2891           symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2892           dummy_frag->fr_symbol = symbolP;
2893         }
2894       else
2895 #endif
2896         symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2897
2898 #ifdef OBJ_COFF
2899       /* "set" symbols are local unless otherwise specified.  */
2900       SF_SET_LOCAL (symbolP);
2901 #endif /* OBJ_COFF  */
2902     }                           /* Make a new symbol.  */
2903
2904   symbol_table_insert (symbolP);
2905
2906   * end_name = delim;
2907
2908   if (equiv
2909       && S_IS_DEFINED (symbolP)
2910       && S_GET_SEGMENT (symbolP) != reg_section)
2911     as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2912
2913   pseudo_set (symbolP);
2914
2915   demand_empty_rest_of_line ();
2916
2917   /* XXX Now we come to the Thumb specific bit of code.  */
2918
2919   THUMB_SET_FUNC (symbolP, 1);
2920   ARM_SET_THUMB (symbolP, 1);
2921 #if defined OBJ_ELF || defined OBJ_COFF
2922   ARM_SET_INTERWORK (symbolP, support_interwork);
2923 #endif
2924 }
2925
2926 /* Directives: Mode selection.  */
2927
2928 /* .syntax [unified|divided] - choose the new unified syntax
2929    (same for Arm and Thumb encoding, modulo slight differences in what
2930    can be represented) or the old divergent syntax for each mode.  */
2931 static void
2932 s_syntax (int unused ATTRIBUTE_UNUSED)
2933 {
2934   char *name, delim;
2935
2936   name = input_line_pointer;
2937   delim = get_symbol_end ();
2938
2939   if (!strcasecmp (name, "unified"))
2940     unified_syntax = TRUE;
2941   else if (!strcasecmp (name, "divided"))
2942     unified_syntax = FALSE;
2943   else
2944     {
2945       as_bad (_("unrecognized syntax mode \"%s\""), name);
2946       return;
2947     }
2948   *input_line_pointer = delim;
2949   demand_empty_rest_of_line ();
2950 }
2951
2952 /* Directives: sectioning and alignment.  */
2953
2954 /* Same as s_align_ptwo but align 0 => align 2.  */
2955
2956 static void
2957 s_align (int unused ATTRIBUTE_UNUSED)
2958 {
2959   int temp;
2960   bfd_boolean fill_p;
2961   long temp_fill;
2962   long max_alignment = 15;
2963
2964   temp = get_absolute_expression ();
2965   if (temp > max_alignment)
2966     as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2967   else if (temp < 0)
2968     {
2969       as_bad (_("alignment negative. 0 assumed."));
2970       temp = 0;
2971     }
2972
2973   if (*input_line_pointer == ',')
2974     {
2975       input_line_pointer++;
2976       temp_fill = get_absolute_expression ();
2977       fill_p = TRUE;
2978     }
2979   else
2980     {
2981       fill_p = FALSE;
2982       temp_fill = 0;
2983     }
2984
2985   if (!temp)
2986     temp = 2;
2987
2988   /* Only make a frag if we HAVE to.  */
2989   if (temp && !need_pass_2)
2990     {
2991       if (!fill_p && subseg_text_p (now_seg))
2992         frag_align_code (temp, 0);
2993       else
2994         frag_align (temp, (int) temp_fill, 0);
2995     }
2996   demand_empty_rest_of_line ();
2997
2998   record_alignment (now_seg, temp);
2999 }
3000
3001 static void
3002 s_bss (int ignore ATTRIBUTE_UNUSED)
3003 {
3004   /* We don't support putting frags in the BSS segment, we fake it by
3005      marking in_bss, then looking at s_skip for clues.  */
3006   subseg_set (bss_section, 0);
3007   demand_empty_rest_of_line ();
3008
3009 #ifdef md_elf_section_change_hook
3010   md_elf_section_change_hook ();
3011 #endif
3012 }
3013
3014 static void
3015 s_even (int ignore ATTRIBUTE_UNUSED)
3016 {
3017   /* Never make frag if expect extra pass.  */
3018   if (!need_pass_2)
3019     frag_align (1, 0, 0);
3020
3021   record_alignment (now_seg, 1);
3022
3023   demand_empty_rest_of_line ();
3024 }
3025
3026 /* Directives: CodeComposer Studio.  */
3027
3028 /*  .ref  (for CodeComposer Studio syntax only).  */
3029 static void
3030 s_ccs_ref (int unused ATTRIBUTE_UNUSED)
3031 {
3032   if (codecomposer_syntax)
3033     ignore_rest_of_line ();
3034   else
3035     as_bad (_(".ref pseudo-op only available with -mccs flag."));
3036 }
3037
3038 /*  If name is not NULL, then it is used for marking the beginning of a
3039     function, wherease if it is NULL then it means the function end.  */
3040 static void
3041 asmfunc_debug (const char * name)
3042 {
3043   static const char * last_name = NULL;
3044
3045   if (name != NULL)
3046     {
3047       gas_assert (last_name == NULL);
3048       last_name = name;
3049
3050       if (debug_type == DEBUG_STABS)
3051          stabs_generate_asm_func (name, name);
3052     }
3053   else
3054     {
3055       gas_assert (last_name != NULL);
3056
3057       if (debug_type == DEBUG_STABS)
3058         stabs_generate_asm_endfunc (last_name, last_name);
3059
3060       last_name = NULL;
3061     }
3062 }
3063
3064 static void
3065 s_ccs_asmfunc (int unused ATTRIBUTE_UNUSED)
3066 {
3067   if (codecomposer_syntax)
3068     {
3069       switch (asmfunc_state)
3070         {
3071         case OUTSIDE_ASMFUNC:
3072           asmfunc_state = WAITING_ASMFUNC_NAME;
3073           break;
3074
3075         case WAITING_ASMFUNC_NAME:
3076           as_bad (_(".asmfunc repeated."));
3077           break;
3078
3079         case WAITING_ENDASMFUNC:
3080           as_bad (_(".asmfunc without function."));
3081           break;
3082         }
3083       demand_empty_rest_of_line ();
3084     }
3085   else
3086     as_bad (_(".asmfunc pseudo-op only available with -mccs flag."));
3087 }
3088
3089 static void
3090 s_ccs_endasmfunc (int unused ATTRIBUTE_UNUSED)
3091 {
3092   if (codecomposer_syntax)
3093     {
3094       switch (asmfunc_state)
3095         {
3096         case OUTSIDE_ASMFUNC:
3097           as_bad (_(".endasmfunc without a .asmfunc."));
3098           break;
3099
3100         case WAITING_ASMFUNC_NAME:
3101           as_bad (_(".endasmfunc without function."));
3102           break;
3103
3104         case WAITING_ENDASMFUNC:
3105           asmfunc_state = OUTSIDE_ASMFUNC;
3106           asmfunc_debug (NULL);
3107           break;
3108         }
3109       demand_empty_rest_of_line ();
3110     }
3111   else
3112     as_bad (_(".endasmfunc pseudo-op only available with -mccs flag."));
3113 }
3114
3115 static void
3116 s_ccs_def (int name)
3117 {
3118   if (codecomposer_syntax)
3119     s_globl (name);
3120   else
3121     as_bad (_(".def pseudo-op only available with -mccs flag."));
3122 }
3123
3124 /* Directives: Literal pools.  */
3125
3126 static literal_pool *
3127 find_literal_pool (void)
3128 {
3129   literal_pool * pool;
3130
3131   for (pool = list_of_pools; pool != NULL; pool = pool->next)
3132     {
3133       if (pool->section == now_seg
3134           && pool->sub_section == now_subseg)
3135         break;
3136     }
3137
3138   return pool;
3139 }
3140
3141 static literal_pool *
3142 find_or_make_literal_pool (void)
3143 {
3144   /* Next literal pool ID number.  */
3145   static unsigned int latest_pool_num = 1;
3146   literal_pool *      pool;
3147
3148   pool = find_literal_pool ();
3149
3150   if (pool == NULL)
3151     {
3152       /* Create a new pool.  */
3153       pool = (literal_pool *) xmalloc (sizeof (* pool));
3154       if (! pool)
3155         return NULL;
3156
3157       pool->next_free_entry = 0;
3158       pool->section         = now_seg;
3159       pool->sub_section     = now_subseg;
3160       pool->next            = list_of_pools;
3161       pool->symbol          = NULL;
3162
3163       /* Add it to the list.  */
3164       list_of_pools = pool;
3165     }
3166
3167   /* New pools, and emptied pools, will have a NULL symbol.  */
3168   if (pool->symbol == NULL)
3169     {
3170       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
3171                                     (valueT) 0, &zero_address_frag);
3172       pool->id = latest_pool_num ++;
3173     }
3174
3175   /* Done.  */
3176   return pool;
3177 }
3178
3179 /* Add the literal in the global 'inst'
3180    structure to the relevant literal pool.  */
3181
3182 static int
3183 add_to_lit_pool (void)
3184 {
3185   literal_pool * pool;
3186   unsigned int entry;
3187
3188   pool = find_or_make_literal_pool ();
3189
3190   /* Check if this literal value is already in the pool.  */
3191   for (entry = 0; entry < pool->next_free_entry; entry ++)
3192     {
3193       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3194           && (inst.reloc.exp.X_op == O_constant)
3195           && (pool->literals[entry].X_add_number
3196               == inst.reloc.exp.X_add_number)
3197           && (pool->literals[entry].X_unsigned
3198               == inst.reloc.exp.X_unsigned))
3199         break;
3200
3201       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3202           && (inst.reloc.exp.X_op == O_symbol)
3203           && (pool->literals[entry].X_add_number
3204               == inst.reloc.exp.X_add_number)
3205           && (pool->literals[entry].X_add_symbol
3206               == inst.reloc.exp.X_add_symbol)
3207           && (pool->literals[entry].X_op_symbol
3208               == inst.reloc.exp.X_op_symbol))
3209         break;
3210     }
3211
3212   /* Do we need to create a new entry?  */
3213   if (entry == pool->next_free_entry)
3214     {
3215       if (entry >= MAX_LITERAL_POOL_SIZE)
3216         {
3217           inst.error = _("literal pool overflow");
3218           return FAIL;
3219         }
3220
3221       pool->literals[entry] = inst.reloc.exp;
3222 #ifdef OBJ_ELF
3223       /* PR ld/12974: Record the location of the first source line to reference
3224          this entry in the literal pool.  If it turns out during linking that the
3225          symbol does not exist we will be able to give an accurate line number for
3226          the (first use of the) missing reference.  */
3227       if (debug_type == DEBUG_DWARF2)
3228         dwarf2_where (pool->locs + entry);
3229 #endif
3230       pool->next_free_entry += 1;
3231     }
3232
3233   inst.reloc.exp.X_op         = O_symbol;
3234   inst.reloc.exp.X_add_number = ((int) entry) * 4;
3235   inst.reloc.exp.X_add_symbol = pool->symbol;
3236
3237   return SUCCESS;
3238 }
3239
3240 bfd_boolean
3241 tc_start_label_without_colon (char unused1 ATTRIBUTE_UNUSED, const char * rest)
3242 {
3243   bfd_boolean ret = TRUE;
3244
3245   if (codecomposer_syntax && asmfunc_state == WAITING_ASMFUNC_NAME)
3246     {
3247       const char *label = rest;
3248
3249       while (!is_end_of_line[(int) label[-1]])
3250         --label;
3251
3252       if (*label == '.')
3253         {
3254           as_bad (_("Invalid label '%s'"), label);
3255           ret = FALSE;
3256         }
3257
3258       asmfunc_debug (label);
3259
3260       asmfunc_state = WAITING_ENDASMFUNC;
3261     }
3262
3263   return ret;
3264 }
3265
3266 /* Can't use symbol_new here, so have to create a symbol and then at
3267    a later date assign it a value. Thats what these functions do.  */
3268
3269 static void
3270 symbol_locate (symbolS *    symbolP,
3271                const char * name,       /* It is copied, the caller can modify.  */
3272                segT         segment,    /* Segment identifier (SEG_<something>).  */
3273                valueT       valu,       /* Symbol value.  */
3274                fragS *      frag)       /* Associated fragment.  */
3275 {
3276   unsigned int name_length;
3277   char * preserved_copy_of_name;
3278
3279   name_length = strlen (name) + 1;   /* +1 for \0.  */
3280   obstack_grow (&notes, name, name_length);
3281   preserved_copy_of_name = (char *) obstack_finish (&notes);
3282
3283 #ifdef tc_canonicalize_symbol_name
3284   preserved_copy_of_name =
3285     tc_canonicalize_symbol_name (preserved_copy_of_name);
3286 #endif
3287
3288   S_SET_NAME (symbolP, preserved_copy_of_name);
3289
3290   S_SET_SEGMENT (symbolP, segment);
3291   S_SET_VALUE (symbolP, valu);
3292   symbol_clear_list_pointers (symbolP);
3293
3294   symbol_set_frag (symbolP, frag);
3295
3296   /* Link to end of symbol chain.  */
3297   {
3298     extern int symbol_table_frozen;
3299
3300     if (symbol_table_frozen)
3301       abort ();
3302   }
3303
3304   symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
3305
3306   obj_symbol_new_hook (symbolP);
3307
3308 #ifdef tc_symbol_new_hook
3309   tc_symbol_new_hook (symbolP);
3310 #endif
3311
3312 #ifdef DEBUG_SYMS
3313   verify_symbol_chain (symbol_rootP, symbol_lastP);
3314 #endif /* DEBUG_SYMS  */
3315 }
3316
3317
3318 static void
3319 s_ltorg (int ignored ATTRIBUTE_UNUSED)
3320 {
3321   unsigned int entry;
3322   literal_pool * pool;
3323   char sym_name[20];
3324
3325   pool = find_literal_pool ();
3326   if (pool == NULL
3327       || pool->symbol == NULL
3328       || pool->next_free_entry == 0)
3329     return;
3330
3331   /* Align pool as you have word accesses.
3332      Only make a frag if we have to.  */
3333   if (!need_pass_2)
3334     frag_align (2, 0, 0);
3335
3336   record_alignment (now_seg, 2);
3337
3338 #ifdef OBJ_ELF
3339   seg_info (now_seg)->tc_segment_info_data.mapstate = MAP_DATA;
3340   make_mapping_symbol (MAP_DATA, (valueT) frag_now_fix (), frag_now);
3341 #endif
3342   sprintf (sym_name, "$$lit_\002%x", pool->id);
3343
3344   symbol_locate (pool->symbol, sym_name, now_seg,
3345                  (valueT) frag_now_fix (), frag_now);
3346   symbol_table_insert (pool->symbol);
3347
3348   ARM_SET_THUMB (pool->symbol, thumb_mode);
3349
3350 #if defined OBJ_COFF || defined OBJ_ELF
3351   ARM_SET_INTERWORK (pool->symbol, support_interwork);
3352 #endif
3353
3354   for (entry = 0; entry < pool->next_free_entry; entry ++)
3355     {
3356 #ifdef OBJ_ELF
3357       if (debug_type == DEBUG_DWARF2)
3358         dwarf2_gen_line_info (frag_now_fix (), pool->locs + entry);
3359 #endif
3360       /* First output the expression in the instruction to the pool.  */
3361       emit_expr (&(pool->literals[entry]), 4); /* .word  */
3362     }
3363
3364   /* Mark the pool as empty.  */
3365   pool->next_free_entry = 0;
3366   pool->symbol = NULL;
3367 }
3368
3369 #ifdef OBJ_ELF
3370 /* Forward declarations for functions below, in the MD interface
3371    section.  */
3372 static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3373 static valueT create_unwind_entry (int);
3374 static void start_unwind_section (const segT, int);
3375 static void add_unwind_opcode (valueT, int);
3376 static void flush_pending_unwind (void);
3377
3378 /* Directives: Data.  */
3379
3380 static void
3381 s_arm_elf_cons (int nbytes)
3382 {
3383   expressionS exp;
3384
3385 #ifdef md_flush_pending_output
3386   md_flush_pending_output ();
3387 #endif
3388
3389   if (is_it_end_of_statement ())
3390     {
3391       demand_empty_rest_of_line ();
3392       return;
3393     }
3394
3395 #ifdef md_cons_align
3396   md_cons_align (nbytes);
3397 #endif
3398
3399   mapping_state (MAP_DATA);
3400   do
3401     {
3402       int reloc;
3403       char *base = input_line_pointer;
3404
3405       expression (& exp);
3406
3407       if (exp.X_op != O_symbol)
3408         emit_expr (&exp, (unsigned int) nbytes);
3409       else
3410         {
3411           char *before_reloc = input_line_pointer;
3412           reloc = parse_reloc (&input_line_pointer);
3413           if (reloc == -1)
3414             {
3415               as_bad (_("unrecognized relocation suffix"));
3416               ignore_rest_of_line ();
3417               return;
3418             }
3419           else if (reloc == BFD_RELOC_UNUSED)
3420             emit_expr (&exp, (unsigned int) nbytes);
3421           else
3422             {
3423               reloc_howto_type *howto = (reloc_howto_type *)
3424                   bfd_reloc_type_lookup (stdoutput,
3425                                          (bfd_reloc_code_real_type) reloc);
3426               int size = bfd_get_reloc_size (howto);
3427
3428               if (reloc == BFD_RELOC_ARM_PLT32)
3429                 {
3430                   as_bad (_("(plt) is only valid on branch targets"));
3431                   reloc = BFD_RELOC_UNUSED;
3432                   size = 0;
3433                 }
3434
3435               if (size > nbytes)
3436                 as_bad (_("%s relocations do not fit in %d bytes"),
3437                         howto->name, nbytes);
3438               else
3439                 {
3440                   /* We've parsed an expression stopping at O_symbol.
3441                      But there may be more expression left now that we
3442                      have parsed the relocation marker.  Parse it again.
3443                      XXX Surely there is a cleaner way to do this.  */
3444                   char *p = input_line_pointer;
3445                   int offset;
3446                   char *save_buf = (char *) alloca (input_line_pointer - base);
3447                   memcpy (save_buf, base, input_line_pointer - base);
3448                   memmove (base + (input_line_pointer - before_reloc),
3449                            base, before_reloc - base);
3450
3451                   input_line_pointer = base + (input_line_pointer-before_reloc);
3452                   expression (&exp);
3453                   memcpy (base, save_buf, p - base);
3454
3455                   offset = nbytes - size;
3456                   p = frag_more ((int) nbytes);
3457                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
3458                                size, &exp, 0, (enum bfd_reloc_code_real) reloc);
3459                 }
3460             }
3461         }
3462     }
3463   while (*input_line_pointer++ == ',');
3464
3465   /* Put terminator back into stream.  */
3466   input_line_pointer --;
3467   demand_empty_rest_of_line ();
3468 }
3469
3470 /* Emit an expression containing a 32-bit thumb instruction.
3471    Implementation based on put_thumb32_insn.  */
3472
3473 static void
3474 emit_thumb32_expr (expressionS * exp)
3475 {
3476   expressionS exp_high = *exp;
3477
3478   exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3479   emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3480   exp->X_add_number &= 0xffff;
3481   emit_expr (exp, (unsigned int) THUMB_SIZE);
3482 }
3483
3484 /*  Guess the instruction size based on the opcode.  */
3485
3486 static int
3487 thumb_insn_size (int opcode)
3488 {
3489   if ((unsigned int) opcode < 0xe800u)
3490     return 2;
3491   else if ((unsigned int) opcode >= 0xe8000000u)
3492     return 4;
3493   else
3494     return 0;
3495 }
3496
3497 static bfd_boolean
3498 emit_insn (expressionS *exp, int nbytes)
3499 {
3500   int size = 0;
3501
3502   if (exp->X_op == O_constant)
3503     {
3504       size = nbytes;
3505
3506       if (size == 0)
3507         size = thumb_insn_size (exp->X_add_number);
3508
3509       if (size != 0)
3510         {
3511           if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3512             {
3513               as_bad (_(".inst.n operand too big. "\
3514                         "Use .inst.w instead"));
3515               size = 0;
3516             }
3517           else
3518             {
3519               if (now_it.state == AUTOMATIC_IT_BLOCK)
3520                 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3521               else
3522                 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3523
3524               if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3525                 emit_thumb32_expr (exp);
3526               else
3527                 emit_expr (exp, (unsigned int) size);
3528
3529               it_fsm_post_encode ();
3530             }
3531         }
3532       else
3533         as_bad (_("cannot determine Thumb instruction size. "   \
3534                   "Use .inst.n/.inst.w instead"));
3535     }
3536   else
3537     as_bad (_("constant expression required"));
3538
3539   return (size != 0);
3540 }
3541
3542 /* Like s_arm_elf_cons but do not use md_cons_align and
3543    set the mapping state to MAP_ARM/MAP_THUMB.  */
3544
3545 static void
3546 s_arm_elf_inst (int nbytes)
3547 {
3548   if (is_it_end_of_statement ())
3549     {
3550       demand_empty_rest_of_line ();
3551       return;
3552     }
3553
3554   /* Calling mapping_state () here will not change ARM/THUMB,
3555      but will ensure not to be in DATA state.  */
3556
3557   if (thumb_mode)
3558     mapping_state (MAP_THUMB);
3559   else
3560     {
3561       if (nbytes != 0)
3562         {
3563           as_bad (_("width suffixes are invalid in ARM mode"));
3564           ignore_rest_of_line ();
3565           return;
3566         }
3567
3568       nbytes = 4;
3569
3570       mapping_state (MAP_ARM);
3571     }
3572
3573   do
3574     {
3575       expressionS exp;
3576
3577       expression (& exp);
3578
3579       if (! emit_insn (& exp, nbytes))
3580         {
3581           ignore_rest_of_line ();
3582           return;
3583         }
3584     }
3585   while (*input_line_pointer++ == ',');
3586
3587   /* Put terminator back into stream.  */
3588   input_line_pointer --;
3589   demand_empty_rest_of_line ();
3590 }
3591
3592 /* Parse a .rel31 directive.  */
3593
3594 static void
3595 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3596 {
3597   expressionS exp;
3598   char *p;
3599   valueT highbit;
3600
3601   highbit = 0;
3602   if (*input_line_pointer == '1')
3603     highbit = 0x80000000;
3604   else if (*input_line_pointer != '0')
3605     as_bad (_("expected 0 or 1"));
3606
3607   input_line_pointer++;
3608   if (*input_line_pointer != ',')
3609     as_bad (_("missing comma"));
3610   input_line_pointer++;
3611
3612 #ifdef md_flush_pending_output
3613   md_flush_pending_output ();
3614 #endif
3615
3616 #ifdef md_cons_align
3617   md_cons_align (4);
3618 #endif
3619
3620   mapping_state (MAP_DATA);
3621
3622   expression (&exp);
3623
3624   p = frag_more (4);
3625   md_number_to_chars (p, highbit, 4);
3626   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3627                BFD_RELOC_ARM_PREL31);
3628
3629   demand_empty_rest_of_line ();
3630 }
3631
3632 /* Directives: AEABI stack-unwind tables.  */
3633
3634 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
3635
3636 static void
3637 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3638 {
3639   demand_empty_rest_of_line ();
3640   if (unwind.proc_start)
3641     {
3642       as_bad (_("duplicate .fnstart directive"));
3643       return;
3644     }
3645
3646   /* Mark the start of the function.  */
3647   unwind.proc_start = expr_build_dot ();
3648
3649   /* Reset the rest of the unwind info.  */
3650   unwind.opcode_count = 0;
3651   unwind.table_entry = NULL;
3652   unwind.personality_routine = NULL;
3653   unwind.personality_index = -1;
3654   unwind.frame_size = 0;
3655   unwind.fp_offset = 0;
3656   unwind.fp_reg = REG_SP;
3657   unwind.fp_used = 0;
3658   unwind.sp_restored = 0;
3659 }
3660
3661
3662 /* Parse a handlerdata directive.  Creates the exception handling table entry
3663    for the function.  */
3664
3665 static void
3666 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3667 {
3668   demand_empty_rest_of_line ();
3669   if (!unwind.proc_start)
3670     as_bad (MISSING_FNSTART);
3671
3672   if (unwind.table_entry)
3673     as_bad (_("duplicate .handlerdata directive"));
3674
3675   create_unwind_entry (1);
3676 }
3677
3678 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
3679
3680 static void
3681 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3682 {
3683   long where;
3684   char *ptr;
3685   valueT val;
3686   unsigned int marked_pr_dependency;
3687
3688   demand_empty_rest_of_line ();
3689
3690   if (!unwind.proc_start)
3691     {
3692       as_bad (_(".fnend directive without .fnstart"));
3693       return;
3694     }
3695
3696   /* Add eh table entry.  */
3697   if (unwind.table_entry == NULL)
3698     val = create_unwind_entry (0);
3699   else
3700     val = 0;
3701
3702   /* Add index table entry.  This is two words.  */
3703   start_unwind_section (unwind.saved_seg, 1);
3704   frag_align (2, 0, 0);
3705   record_alignment (now_seg, 2);
3706
3707   ptr = frag_more (8);
3708   memset (ptr, 0, 8);
3709   where = frag_now_fix () - 8;
3710
3711   /* Self relative offset of the function start.  */
3712   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3713            BFD_RELOC_ARM_PREL31);
3714
3715   /* Indicate dependency on EHABI-defined personality routines to the
3716      linker, if it hasn't been done already.  */
3717   marked_pr_dependency
3718     = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
3719   if (unwind.personality_index >= 0 && unwind.personality_index < 3
3720       && !(marked_pr_dependency & (1 << unwind.personality_index)))
3721     {
3722       static const char *const name[] =
3723         {
3724           "__aeabi_unwind_cpp_pr0",
3725           "__aeabi_unwind_cpp_pr1",
3726           "__aeabi_unwind_cpp_pr2"
3727         };
3728       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3729       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3730       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3731         |= 1 << unwind.personality_index;
3732     }
3733
3734   if (val)
3735     /* Inline exception table entry.  */
3736     md_number_to_chars (ptr + 4, val, 4);
3737   else
3738     /* Self relative offset of the table entry.  */
3739     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3740              BFD_RELOC_ARM_PREL31);
3741
3742   /* Restore the original section.  */
3743   subseg_set (unwind.saved_seg, unwind.saved_subseg);
3744
3745   unwind.proc_start = NULL;
3746 }
3747
3748
3749 /* Parse an unwind_cantunwind directive.  */
3750
3751 static void
3752 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3753 {
3754   demand_empty_rest_of_line ();
3755   if (!unwind.proc_start)
3756     as_bad (MISSING_FNSTART);
3757
3758   if (unwind.personality_routine || unwind.personality_index != -1)
3759     as_bad (_("personality routine specified for cantunwind frame"));
3760
3761   unwind.personality_index = -2;
3762 }
3763
3764
3765 /* Parse a personalityindex directive.  */
3766
3767 static void
3768 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3769 {
3770   expressionS exp;
3771
3772   if (!unwind.proc_start)
3773     as_bad (MISSING_FNSTART);
3774
3775   if (unwind.personality_routine || unwind.personality_index != -1)
3776     as_bad (_("duplicate .personalityindex directive"));
3777
3778   expression (&exp);
3779
3780   if (exp.X_op != O_constant
3781       || exp.X_add_number < 0 || exp.X_add_number > 15)
3782     {
3783       as_bad (_("bad personality routine number"));
3784       ignore_rest_of_line ();
3785       return;
3786     }
3787
3788   unwind.personality_index = exp.X_add_number;
3789
3790   demand_empty_rest_of_line ();
3791 }
3792
3793
3794 /* Parse a personality directive.  */
3795
3796 static void
3797 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3798 {
3799   char *name, *p, c;
3800
3801   if (!unwind.proc_start)
3802     as_bad (MISSING_FNSTART);
3803
3804   if (unwind.personality_routine || unwind.personality_index != -1)
3805     as_bad (_("duplicate .personality directive"));
3806
3807   name = input_line_pointer;
3808   c = get_symbol_end ();
3809   p = input_line_pointer;
3810   unwind.personality_routine = symbol_find_or_make (name);
3811   *p = c;
3812   demand_empty_rest_of_line ();
3813 }
3814
3815
3816 /* Parse a directive saving core registers.  */
3817
3818 static void
3819 s_arm_unwind_save_core (void)
3820 {
3821   valueT op;
3822   long range;
3823   int n;
3824
3825   range = parse_reg_list (&input_line_pointer);
3826   if (range == FAIL)
3827     {
3828       as_bad (_("expected register list"));
3829       ignore_rest_of_line ();
3830       return;
3831     }
3832
3833   demand_empty_rest_of_line ();
3834
3835   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3836      into .unwind_save {..., sp...}.  We aren't bothered about the value of
3837      ip because it is clobbered by calls.  */
3838   if (unwind.sp_restored && unwind.fp_reg == 12
3839       && (range & 0x3000) == 0x1000)
3840     {
3841       unwind.opcode_count--;
3842       unwind.sp_restored = 0;
3843       range = (range | 0x2000) & ~0x1000;
3844       unwind.pending_offset = 0;
3845     }
3846
3847   /* Pop r4-r15.  */
3848   if (range & 0xfff0)
3849     {
3850       /* See if we can use the short opcodes.  These pop a block of up to 8
3851          registers starting with r4, plus maybe r14.  */
3852       for (n = 0; n < 8; n++)
3853         {
3854           /* Break at the first non-saved register.      */
3855           if ((range & (1 << (n + 4))) == 0)
3856             break;
3857         }
3858       /* See if there are any other bits set.  */
3859       if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3860         {
3861           /* Use the long form.  */
3862           op = 0x8000 | ((range >> 4) & 0xfff);
3863           add_unwind_opcode (op, 2);
3864         }
3865       else
3866         {
3867           /* Use the short form.  */
3868           if (range & 0x4000)
3869             op = 0xa8; /* Pop r14.      */
3870           else
3871             op = 0xa0; /* Do not pop r14.  */
3872           op |= (n - 1);
3873           add_unwind_opcode (op, 1);
3874         }
3875     }
3876
3877   /* Pop r0-r3.  */
3878   if (range & 0xf)
3879     {
3880       op = 0xb100 | (range & 0xf);
3881       add_unwind_opcode (op, 2);
3882     }
3883
3884   /* Record the number of bytes pushed.  */
3885   for (n = 0; n < 16; n++)
3886     {
3887       if (range & (1 << n))
3888         unwind.frame_size += 4;
3889     }
3890 }
3891
3892
3893 /* Parse a directive saving FPA registers.  */
3894
3895 static void
3896 s_arm_unwind_save_fpa (int reg)
3897 {
3898   expressionS exp;
3899   int num_regs;
3900   valueT op;
3901
3902   /* Get Number of registers to transfer.  */
3903   if (skip_past_comma (&input_line_pointer) != FAIL)
3904     expression (&exp);
3905   else
3906     exp.X_op = O_illegal;
3907
3908   if (exp.X_op != O_constant)
3909     {
3910       as_bad (_("expected , <constant>"));
3911       ignore_rest_of_line ();
3912       return;
3913     }
3914
3915   num_regs = exp.X_add_number;
3916
3917   if (num_regs < 1 || num_regs > 4)
3918     {
3919       as_bad (_("number of registers must be in the range [1:4]"));
3920       ignore_rest_of_line ();
3921       return;
3922     }
3923
3924   demand_empty_rest_of_line ();
3925
3926   if (reg == 4)
3927     {
3928       /* Short form.  */
3929       op = 0xb4 | (num_regs - 1);
3930       add_unwind_opcode (op, 1);
3931     }
3932   else
3933     {
3934       /* Long form.  */
3935       op = 0xc800 | (reg << 4) | (num_regs - 1);
3936       add_unwind_opcode (op, 2);
3937     }
3938   unwind.frame_size += num_regs * 12;
3939 }
3940
3941
3942 /* Parse a directive saving VFP registers for ARMv6 and above.  */
3943
3944 static void
3945 s_arm_unwind_save_vfp_armv6 (void)
3946 {
3947   int count;
3948   unsigned int start;
3949   valueT op;
3950   int num_vfpv3_regs = 0;
3951   int num_regs_below_16;
3952
3953   count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3954   if (count == FAIL)
3955     {
3956       as_bad (_("expected register list"));
3957       ignore_rest_of_line ();
3958       return;
3959     }
3960
3961   demand_empty_rest_of_line ();
3962
3963   /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3964      than FSTMX/FLDMX-style ones).  */
3965
3966   /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
3967   if (start >= 16)
3968     num_vfpv3_regs = count;
3969   else if (start + count > 16)
3970     num_vfpv3_regs = start + count - 16;
3971
3972   if (num_vfpv3_regs > 0)
3973     {
3974       int start_offset = start > 16 ? start - 16 : 0;
3975       op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3976       add_unwind_opcode (op, 2);
3977     }
3978
3979   /* Generate opcode for registers numbered in the range 0 .. 15.  */
3980   num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
3981   gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
3982   if (num_regs_below_16 > 0)
3983     {
3984       op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3985       add_unwind_opcode (op, 2);
3986     }
3987
3988   unwind.frame_size += count * 8;
3989 }
3990
3991
3992 /* Parse a directive saving VFP registers for pre-ARMv6.  */
3993
3994 static void
3995 s_arm_unwind_save_vfp (void)
3996 {
3997   int count;
3998   unsigned int reg;
3999   valueT op;
4000
4001   count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
4002   if (count == FAIL)
4003     {
4004       as_bad (_("expected register list"));
4005       ignore_rest_of_line ();
4006       return;
4007     }
4008
4009   demand_empty_rest_of_line ();
4010
4011   if (reg == 8)
4012     {
4013       /* Short form.  */
4014       op = 0xb8 | (count - 1);
4015       add_unwind_opcode (op, 1);
4016     }
4017   else
4018     {
4019       /* Long form.  */
4020       op = 0xb300 | (reg << 4) | (count - 1);
4021       add_unwind_opcode (op, 2);
4022     }
4023   unwind.frame_size += count * 8 + 4;
4024 }
4025
4026
4027 /* Parse a directive saving iWMMXt data registers.  */
4028
4029 static void
4030 s_arm_unwind_save_mmxwr (void)
4031 {
4032   int reg;
4033   int hi_reg;
4034   int i;
4035   unsigned mask = 0;
4036   valueT op;
4037
4038   if (*input_line_pointer == '{')
4039     input_line_pointer++;
4040
4041   do
4042     {
4043       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
4044
4045       if (reg == FAIL)
4046         {
4047           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
4048           goto error;
4049         }
4050
4051       if (mask >> reg)
4052         as_tsktsk (_("register list not in ascending order"));
4053       mask |= 1 << reg;
4054
4055       if (*input_line_pointer == '-')
4056         {
4057           input_line_pointer++;
4058           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
4059           if (hi_reg == FAIL)
4060             {
4061               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
4062               goto error;
4063             }
4064           else if (reg >= hi_reg)
4065             {
4066               as_bad (_("bad register range"));
4067               goto error;
4068             }
4069           for (; reg < hi_reg; reg++)
4070             mask |= 1 << reg;
4071         }
4072     }
4073   while (skip_past_comma (&input_line_pointer) != FAIL);
4074
4075   skip_past_char (&input_line_pointer, '}');
4076
4077   demand_empty_rest_of_line ();
4078
4079   /* Generate any deferred opcodes because we're going to be looking at
4080      the list.  */
4081   flush_pending_unwind ();
4082
4083   for (i = 0; i < 16; i++)
4084     {
4085       if (mask & (1 << i))
4086         unwind.frame_size += 8;
4087     }
4088
4089   /* Attempt to combine with a previous opcode.  We do this because gcc
4090      likes to output separate unwind directives for a single block of
4091      registers.  */
4092   if (unwind.opcode_count > 0)
4093     {
4094       i = unwind.opcodes[unwind.opcode_count - 1];
4095       if ((i & 0xf8) == 0xc0)
4096         {
4097           i &= 7;
4098           /* Only merge if the blocks are contiguous.  */
4099           if (i < 6)
4100             {
4101               if ((mask & 0xfe00) == (1 << 9))
4102                 {
4103                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
4104                   unwind.opcode_count--;
4105                 }
4106             }
4107           else if (i == 6 && unwind.opcode_count >= 2)
4108             {
4109               i = unwind.opcodes[unwind.opcode_count - 2];
4110               reg = i >> 4;
4111               i &= 0xf;
4112
4113               op = 0xffff << (reg - 1);
4114               if (reg > 0
4115                   && ((mask & op) == (1u << (reg - 1))))
4116                 {
4117                   op = (1 << (reg + i + 1)) - 1;
4118                   op &= ~((1 << reg) - 1);
4119                   mask |= op;
4120                   unwind.opcode_count -= 2;
4121                 }
4122             }
4123         }
4124     }
4125
4126   hi_reg = 15;
4127   /* We want to generate opcodes in the order the registers have been
4128      saved, ie. descending order.  */
4129   for (reg = 15; reg >= -1; reg--)
4130     {
4131       /* Save registers in blocks.  */
4132       if (reg < 0
4133           || !(mask & (1 << reg)))
4134         {
4135           /* We found an unsaved reg.  Generate opcodes to save the
4136              preceding block.   */
4137           if (reg != hi_reg)
4138             {
4139               if (reg == 9)
4140                 {
4141                   /* Short form.  */
4142                   op = 0xc0 | (hi_reg - 10);
4143                   add_unwind_opcode (op, 1);
4144                 }
4145               else
4146                 {
4147                   /* Long form.  */
4148                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
4149                   add_unwind_opcode (op, 2);
4150                 }
4151             }
4152           hi_reg = reg - 1;
4153         }
4154     }
4155
4156   return;
4157 error:
4158   ignore_rest_of_line ();
4159 }
4160
4161 static void
4162 s_arm_unwind_save_mmxwcg (void)
4163 {
4164   int reg;
4165   int hi_reg;
4166   unsigned mask = 0;
4167   valueT op;
4168
4169   if (*input_line_pointer == '{')
4170     input_line_pointer++;
4171
4172   skip_whitespace (input_line_pointer);
4173
4174   do
4175     {
4176       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4177
4178       if (reg == FAIL)
4179         {
4180           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4181           goto error;
4182         }
4183
4184       reg -= 8;
4185       if (mask >> reg)
4186         as_tsktsk (_("register list not in ascending order"));
4187       mask |= 1 << reg;
4188
4189       if (*input_line_pointer == '-')
4190         {
4191           input_line_pointer++;
4192           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4193           if (hi_reg == FAIL)
4194             {
4195               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4196               goto error;
4197             }
4198           else if (reg >= hi_reg)
4199             {
4200               as_bad (_("bad register range"));
4201               goto error;
4202             }
4203           for (; reg < hi_reg; reg++)
4204             mask |= 1 << reg;
4205         }
4206     }
4207   while (skip_past_comma (&input_line_pointer) != FAIL);
4208
4209   skip_past_char (&input_line_pointer, '}');
4210
4211   demand_empty_rest_of_line ();
4212
4213   /* Generate any deferred opcodes because we're going to be looking at
4214      the list.  */
4215   flush_pending_unwind ();
4216
4217   for (reg = 0; reg < 16; reg++)
4218     {
4219       if (mask & (1 << reg))
4220         unwind.frame_size += 4;
4221     }
4222   op = 0xc700 | mask;
4223   add_unwind_opcode (op, 2);
4224   return;
4225 error:
4226   ignore_rest_of_line ();
4227 }
4228
4229
4230 /* Parse an unwind_save directive.
4231    If the argument is non-zero, this is a .vsave directive.  */
4232
4233 static void
4234 s_arm_unwind_save (int arch_v6)
4235 {
4236   char *peek;
4237   struct reg_entry *reg;
4238   bfd_boolean had_brace = FALSE;
4239
4240   if (!unwind.proc_start)
4241     as_bad (MISSING_FNSTART);
4242
4243   /* Figure out what sort of save we have.  */
4244   peek = input_line_pointer;
4245
4246   if (*peek == '{')
4247     {
4248       had_brace = TRUE;
4249       peek++;
4250     }
4251
4252   reg = arm_reg_parse_multi (&peek);
4253
4254   if (!reg)
4255     {
4256       as_bad (_("register expected"));
4257       ignore_rest_of_line ();
4258       return;
4259     }
4260
4261   switch (reg->type)
4262     {
4263     case REG_TYPE_FN:
4264       if (had_brace)
4265         {
4266           as_bad (_("FPA .unwind_save does not take a register list"));
4267           ignore_rest_of_line ();
4268           return;
4269         }
4270       input_line_pointer = peek;
4271       s_arm_unwind_save_fpa (reg->number);
4272       return;
4273
4274     case REG_TYPE_RN:
4275       s_arm_unwind_save_core ();
4276       return;
4277
4278     case REG_TYPE_VFD:
4279       if (arch_v6)
4280         s_arm_unwind_save_vfp_armv6 ();
4281       else
4282         s_arm_unwind_save_vfp ();
4283       return;
4284
4285     case REG_TYPE_MMXWR:
4286       s_arm_unwind_save_mmxwr ();
4287       return;
4288
4289     case REG_TYPE_MMXWCG:
4290       s_arm_unwind_save_mmxwcg ();
4291       return;
4292
4293     default:
4294       as_bad (_(".unwind_save does not support this kind of register"));
4295       ignore_rest_of_line ();
4296     }
4297 }
4298
4299
4300 /* Parse an unwind_movsp directive.  */
4301
4302 static void
4303 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4304 {
4305   int reg;
4306   valueT op;
4307   int offset;
4308
4309   if (!unwind.proc_start)
4310     as_bad (MISSING_FNSTART);
4311
4312   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4313   if (reg == FAIL)
4314     {
4315       as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
4316       ignore_rest_of_line ();
4317       return;
4318     }
4319
4320   /* Optional constant.  */
4321   if (skip_past_comma (&input_line_pointer) != FAIL)
4322     {
4323       if (immediate_for_directive (&offset) == FAIL)
4324         return;
4325     }
4326   else
4327     offset = 0;
4328
4329   demand_empty_rest_of_line ();
4330
4331   if (reg == REG_SP || reg == REG_PC)
4332     {
4333       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
4334       return;
4335     }
4336
4337   if (unwind.fp_reg != REG_SP)
4338     as_bad (_("unexpected .unwind_movsp directive"));
4339
4340   /* Generate opcode to restore the value.  */
4341   op = 0x90 | reg;
4342   add_unwind_opcode (op, 1);
4343
4344   /* Record the information for later.  */
4345   unwind.fp_reg = reg;
4346   unwind.fp_offset = unwind.frame_size - offset;
4347   unwind.sp_restored = 1;
4348 }
4349
4350 /* Parse an unwind_pad directive.  */
4351
4352 static void
4353 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
4354 {
4355   int offset;
4356
4357   if (!unwind.proc_start)
4358     as_bad (MISSING_FNSTART);
4359
4360   if (immediate_for_directive (&offset) == FAIL)
4361     return;
4362
4363   if (offset & 3)
4364     {
4365       as_bad (_("stack increment must be multiple of 4"));
4366       ignore_rest_of_line ();
4367       return;
4368     }
4369
4370   /* Don't generate any opcodes, just record the details for later.  */
4371   unwind.frame_size += offset;
4372   unwind.pending_offset += offset;
4373
4374   demand_empty_rest_of_line ();
4375 }
4376
4377 /* Parse an unwind_setfp directive.  */
4378
4379 static void
4380 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
4381 {
4382   int sp_reg;
4383   int fp_reg;
4384   int offset;
4385
4386   if (!unwind.proc_start)
4387     as_bad (MISSING_FNSTART);
4388
4389   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4390   if (skip_past_comma (&input_line_pointer) == FAIL)
4391     sp_reg = FAIL;
4392   else
4393     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4394
4395   if (fp_reg == FAIL || sp_reg == FAIL)
4396     {
4397       as_bad (_("expected <reg>, <reg>"));
4398       ignore_rest_of_line ();
4399       return;
4400     }
4401
4402   /* Optional constant.  */
4403   if (skip_past_comma (&input_line_pointer) != FAIL)
4404     {
4405       if (immediate_for_directive (&offset) == FAIL)
4406         return;
4407     }
4408   else
4409     offset = 0;
4410
4411   demand_empty_rest_of_line ();
4412
4413   if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4414     {
4415       as_bad (_("register must be either sp or set by a previous"
4416                 "unwind_movsp directive"));
4417       return;
4418     }
4419
4420   /* Don't generate any opcodes, just record the information for later.  */
4421   unwind.fp_reg = fp_reg;
4422   unwind.fp_used = 1;
4423   if (sp_reg == REG_SP)
4424     unwind.fp_offset = unwind.frame_size - offset;
4425   else
4426     unwind.fp_offset -= offset;
4427 }
4428
4429 /* Parse an unwind_raw directive.  */
4430
4431 static void
4432 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
4433 {
4434   expressionS exp;
4435   /* This is an arbitrary limit.         */
4436   unsigned char op[16];
4437   int count;
4438
4439   if (!unwind.proc_start)
4440     as_bad (MISSING_FNSTART);
4441
4442   expression (&exp);
4443   if (exp.X_op == O_constant
4444       && skip_past_comma (&input_line_pointer) != FAIL)
4445     {
4446       unwind.frame_size += exp.X_add_number;
4447       expression (&exp);
4448     }
4449   else
4450     exp.X_op = O_illegal;
4451
4452   if (exp.X_op != O_constant)
4453     {
4454       as_bad (_("expected <offset>, <opcode>"));
4455       ignore_rest_of_line ();
4456       return;
4457     }
4458
4459   count = 0;
4460
4461   /* Parse the opcode.  */
4462   for (;;)
4463     {
4464       if (count >= 16)
4465         {
4466           as_bad (_("unwind opcode too long"));
4467           ignore_rest_of_line ();
4468         }
4469       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
4470         {
4471           as_bad (_("invalid unwind opcode"));
4472           ignore_rest_of_line ();
4473           return;
4474         }
4475       op[count++] = exp.X_add_number;
4476
4477       /* Parse the next byte.  */
4478       if (skip_past_comma (&input_line_pointer) == FAIL)
4479         break;
4480
4481       expression (&exp);
4482     }
4483
4484   /* Add the opcode bytes in reverse order.  */
4485   while (count--)
4486     add_unwind_opcode (op[count], 1);
4487
4488   demand_empty_rest_of_line ();
4489 }
4490
4491
4492 /* Parse a .eabi_attribute directive.  */
4493
4494 static void
4495 s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4496 {
4497   int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
4498
4499   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4500     attributes_set_explicitly[tag] = 1;
4501 }
4502
4503 /* Emit a tls fix for the symbol.  */
4504
4505 static void
4506 s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4507 {
4508   char *p;
4509   expressionS exp;
4510 #ifdef md_flush_pending_output
4511   md_flush_pending_output ();
4512 #endif
4513
4514 #ifdef md_cons_align
4515   md_cons_align (4);
4516 #endif
4517
4518   /* Since we're just labelling the code, there's no need to define a
4519      mapping symbol.  */
4520   expression (&exp);
4521   p = obstack_next_free (&frchain_now->frch_obstack);
4522   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4523                thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4524                : BFD_RELOC_ARM_TLS_DESCSEQ);
4525 }
4526 #endif /* OBJ_ELF */
4527
4528 static void s_arm_arch (int);
4529 static void s_arm_object_arch (int);
4530 static void s_arm_cpu (int);
4531 static void s_arm_fpu (int);
4532 static void s_arm_arch_extension (int);
4533
4534 #ifdef TE_PE
4535
4536 static void
4537 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
4538 {
4539   expressionS exp;
4540
4541   do
4542     {
4543       expression (&exp);
4544       if (exp.X_op == O_symbol)
4545         exp.X_op = O_secrel;
4546
4547       emit_expr (&exp, 4);
4548     }
4549   while (*input_line_pointer++ == ',');
4550
4551   input_line_pointer--;
4552   demand_empty_rest_of_line ();
4553 }
4554 #endif /* TE_PE */
4555
4556 /* This table describes all the machine specific pseudo-ops the assembler
4557    has to support.  The fields are:
4558      pseudo-op name without dot
4559      function to call to execute this pseudo-op
4560      Integer arg to pass to the function.  */
4561
4562 const pseudo_typeS md_pseudo_table[] =
4563 {
4564   /* Never called because '.req' does not start a line.  */
4565   { "req",         s_req,         0 },
4566   /* Following two are likewise never called.  */
4567   { "dn",          s_dn,          0 },
4568   { "qn",          s_qn,          0 },
4569   { "unreq",       s_unreq,       0 },
4570   { "bss",         s_bss,         0 },
4571   { "align",       s_align,       0 },
4572   { "arm",         s_arm,         0 },
4573   { "thumb",       s_thumb,       0 },
4574   { "code",        s_code,        0 },
4575   { "force_thumb", s_force_thumb, 0 },
4576   { "thumb_func",  s_thumb_func,  0 },
4577   { "thumb_set",   s_thumb_set,   0 },
4578   { "even",        s_even,        0 },
4579   { "ltorg",       s_ltorg,       0 },
4580   { "pool",        s_ltorg,       0 },
4581   { "syntax",      s_syntax,      0 },
4582   { "cpu",         s_arm_cpu,     0 },
4583   { "arch",        s_arm_arch,    0 },
4584   { "object_arch", s_arm_object_arch,   0 },
4585   { "fpu",         s_arm_fpu,     0 },
4586   { "arch_extension", s_arm_arch_extension, 0 },
4587 #ifdef OBJ_ELF
4588   { "word",             s_arm_elf_cons, 4 },
4589   { "long",             s_arm_elf_cons, 4 },
4590   { "inst.n",           s_arm_elf_inst, 2 },
4591   { "inst.w",           s_arm_elf_inst, 4 },
4592   { "inst",             s_arm_elf_inst, 0 },
4593   { "rel31",            s_arm_rel31,      0 },
4594   { "fnstart",          s_arm_unwind_fnstart,   0 },
4595   { "fnend",            s_arm_unwind_fnend,     0 },
4596   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
4597   { "personality",      s_arm_unwind_personality, 0 },
4598   { "personalityindex", s_arm_unwind_personalityindex, 0 },
4599   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
4600   { "save",             s_arm_unwind_save,      0 },
4601   { "vsave",            s_arm_unwind_save,      1 },
4602   { "movsp",            s_arm_unwind_movsp,     0 },
4603   { "pad",              s_arm_unwind_pad,       0 },
4604   { "setfp",            s_arm_unwind_setfp,     0 },
4605   { "unwind_raw",       s_arm_unwind_raw,       0 },
4606   { "eabi_attribute",   s_arm_eabi_attribute,   0 },
4607   { "tlsdescseq",       s_arm_tls_descseq,      0 },
4608 #else
4609   { "word",        cons, 4},
4610
4611   /* These are used for dwarf.  */
4612   {"2byte", cons, 2},
4613   {"4byte", cons, 4},
4614   {"8byte", cons, 8},
4615   /* These are used for dwarf2.  */
4616   { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4617   { "loc",  dwarf2_directive_loc,  0 },
4618   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
4619 #endif
4620   { "extend",      float_cons, 'x' },
4621   { "ldouble",     float_cons, 'x' },
4622   { "packed",      float_cons, 'p' },
4623 #ifdef TE_PE
4624   {"secrel32", pe_directive_secrel, 0},
4625 #endif
4626
4627   /* These are for compatibility with CodeComposer Studio.  */
4628   {"ref",          s_ccs_ref,        0},
4629   {"def",          s_ccs_def,        0},
4630   {"asmfunc",      s_ccs_asmfunc,    0},
4631   {"endasmfunc",   s_ccs_endasmfunc, 0},
4632
4633   { 0, 0, 0 }
4634 };
4635 \f
4636 /* Parser functions used exclusively in instruction operands.  */
4637
4638 /* Generic immediate-value read function for use in insn parsing.
4639    STR points to the beginning of the immediate (the leading #);
4640    VAL receives the value; if the value is outside [MIN, MAX]
4641    issue an error.  PREFIX_OPT is true if the immediate prefix is
4642    optional.  */
4643
4644 static int
4645 parse_immediate (char **str, int *val, int min, int max,
4646                  bfd_boolean prefix_opt)
4647 {
4648   expressionS exp;
4649   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4650   if (exp.X_op != O_constant)
4651     {
4652       inst.error = _("constant expression required");
4653       return FAIL;
4654     }
4655
4656   if (exp.X_add_number < min || exp.X_add_number > max)
4657     {
4658       inst.error = _("immediate value out of range");
4659       return FAIL;
4660     }
4661
4662   *val = exp.X_add_number;
4663   return SUCCESS;
4664 }
4665
4666 /* Less-generic immediate-value read function with the possibility of loading a
4667    big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
4668    instructions. Puts the result directly in inst.operands[i].  */
4669
4670 static int
4671 parse_big_immediate (char **str, int i)
4672 {
4673   expressionS exp;
4674   char *ptr = *str;
4675
4676   my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4677
4678   if (exp.X_op == O_constant)
4679     {
4680       inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4681       /* If we're on a 64-bit host, then a 64-bit number can be returned using
4682          O_constant.  We have to be careful not to break compilation for
4683          32-bit X_add_number, though.  */
4684       if ((exp.X_add_number & ~(offsetT)(0xffffffffU)) != 0)
4685         {
4686           /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4.  */
4687           inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4688           inst.operands[i].regisimm = 1;
4689         }
4690     }
4691   else if (exp.X_op == O_big
4692            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
4693     {
4694       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
4695
4696       /* Bignums have their least significant bits in
4697          generic_bignum[0]. Make sure we put 32 bits in imm and
4698          32 bits in reg,  in a (hopefully) portable way.  */
4699       gas_assert (parts != 0);
4700
4701       /* Make sure that the number is not too big.
4702          PR 11972: Bignums can now be sign-extended to the
4703          size of a .octa so check that the out of range bits
4704          are all zero or all one.  */
4705       if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
4706         {
4707           LITTLENUM_TYPE m = -1;
4708
4709           if (generic_bignum[parts * 2] != 0
4710               && generic_bignum[parts * 2] != m)
4711             return FAIL;
4712
4713           for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
4714             if (generic_bignum[j] != generic_bignum[j-1])
4715               return FAIL;
4716         }
4717
4718       inst.operands[i].imm = 0;
4719       for (j = 0; j < parts; j++, idx++)
4720         inst.operands[i].imm |= generic_bignum[idx]
4721                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4722       inst.operands[i].reg = 0;
4723       for (j = 0; j < parts; j++, idx++)
4724         inst.operands[i].reg |= generic_bignum[idx]
4725                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4726       inst.operands[i].regisimm = 1;
4727     }
4728   else
4729     return FAIL;
4730
4731   *str = ptr;
4732
4733   return SUCCESS;
4734 }
4735
4736 /* Returns the pseudo-register number of an FPA immediate constant,
4737    or FAIL if there isn't a valid constant here.  */
4738
4739 static int
4740 parse_fpa_immediate (char ** str)
4741 {
4742   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4743   char *         save_in;
4744   expressionS    exp;
4745   int            i;
4746   int            j;
4747
4748   /* First try and match exact strings, this is to guarantee
4749      that some formats will work even for cross assembly.  */
4750
4751   for (i = 0; fp_const[i]; i++)
4752     {
4753       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
4754         {
4755           char *start = *str;
4756
4757           *str += strlen (fp_const[i]);
4758           if (is_end_of_line[(unsigned char) **str])
4759             return i + 8;
4760           *str = start;
4761         }
4762     }
4763
4764   /* Just because we didn't get a match doesn't mean that the constant
4765      isn't valid, just that it is in a format that we don't
4766      automatically recognize.  Try parsing it with the standard
4767      expression routines.  */
4768
4769   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
4770
4771   /* Look for a raw floating point number.  */
4772   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4773       && is_end_of_line[(unsigned char) *save_in])
4774     {
4775       for (i = 0; i < NUM_FLOAT_VALS; i++)
4776         {
4777           for (j = 0; j < MAX_LITTLENUMS; j++)
4778             {
4779               if (words[j] != fp_values[i][j])
4780                 break;
4781             }
4782
4783           if (j == MAX_LITTLENUMS)
4784             {
4785               *str = save_in;
4786               return i + 8;
4787             }
4788         }
4789     }
4790
4791   /* Try and parse a more complex expression, this will probably fail
4792      unless the code uses a floating point prefix (eg "0f").  */
4793   save_in = input_line_pointer;
4794   input_line_pointer = *str;
4795   if (expression (&exp) == absolute_section
4796       && exp.X_op == O_big
4797       && exp.X_add_number < 0)
4798     {
4799       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4800          Ditto for 15.  */
4801       if (gen_to_words (words, 5, (long) 15) == 0)
4802         {
4803           for (i = 0; i < NUM_FLOAT_VALS; i++)
4804             {
4805               for (j = 0; j < MAX_LITTLENUMS; j++)
4806                 {
4807                   if (words[j] != fp_values[i][j])
4808                     break;
4809                 }
4810
4811               if (j == MAX_LITTLENUMS)
4812                 {
4813                   *str = input_line_pointer;
4814                   input_line_pointer = save_in;
4815                   return i + 8;
4816                 }
4817             }
4818         }
4819     }
4820
4821   *str = input_line_pointer;
4822   input_line_pointer = save_in;
4823   inst.error = _("invalid FPA immediate expression");
4824   return FAIL;
4825 }
4826
4827 /* Returns 1 if a number has "quarter-precision" float format
4828    0baBbbbbbc defgh000 00000000 00000000.  */
4829
4830 static int
4831 is_quarter_float (unsigned imm)
4832 {
4833   int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4834   return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4835 }
4836
4837 /* Parse an 8-bit "quarter-precision" floating point number of the form:
4838    0baBbbbbbc defgh000 00000000 00000000.
4839    The zero and minus-zero cases need special handling, since they can't be
4840    encoded in the "quarter-precision" float format, but can nonetheless be
4841    loaded as integer constants.  */
4842
4843 static unsigned
4844 parse_qfloat_immediate (char **ccp, int *immed)
4845 {
4846   char *str = *ccp;
4847   char *fpnum;
4848   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4849   int found_fpchar = 0;
4850
4851   skip_past_char (&str, '#');
4852
4853   /* We must not accidentally parse an integer as a floating-point number. Make
4854      sure that the value we parse is not an integer by checking for special
4855      characters '.' or 'e'.
4856      FIXME: This is a horrible hack, but doing better is tricky because type
4857      information isn't in a very usable state at parse time.  */
4858   fpnum = str;
4859   skip_whitespace (fpnum);
4860
4861   if (strncmp (fpnum, "0x", 2) == 0)
4862     return FAIL;
4863   else
4864     {
4865       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4866         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4867           {
4868             found_fpchar = 1;
4869             break;
4870           }
4871
4872       if (!found_fpchar)
4873         return FAIL;
4874     }
4875
4876   if ((str = atof_ieee (str, 's', words)) != NULL)
4877     {
4878       unsigned fpword = 0;
4879       int i;
4880
4881       /* Our FP word must be 32 bits (single-precision FP).  */
4882       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4883         {
4884           fpword <<= LITTLENUM_NUMBER_OF_BITS;
4885           fpword |= words[i];
4886         }
4887
4888       if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
4889         *immed = fpword;
4890       else
4891         return FAIL;
4892
4893       *ccp = str;
4894
4895       return SUCCESS;
4896     }
4897
4898   return FAIL;
4899 }
4900
4901 /* Shift operands.  */
4902 enum shift_kind
4903 {
4904   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4905 };
4906
4907 struct asm_shift_name
4908 {
4909   const char      *name;
4910   enum shift_kind  kind;
4911 };
4912
4913 /* Third argument to parse_shift.  */
4914 enum parse_shift_mode
4915 {
4916   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
4917   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
4918   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
4919   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
4920   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
4921 };
4922
4923 /* Parse a <shift> specifier on an ARM data processing instruction.
4924    This has three forms:
4925
4926      (LSL|LSR|ASL|ASR|ROR) Rs
4927      (LSL|LSR|ASL|ASR|ROR) #imm
4928      RRX
4929
4930    Note that ASL is assimilated to LSL in the instruction encoding, and
4931    RRX to ROR #0 (which cannot be written as such).  */
4932
4933 static int
4934 parse_shift (char **str, int i, enum parse_shift_mode mode)
4935 {
4936   const struct asm_shift_name *shift_name;
4937   enum shift_kind shift;
4938   char *s = *str;
4939   char *p = s;
4940   int reg;
4941
4942   for (p = *str; ISALPHA (*p); p++)
4943     ;
4944
4945   if (p == *str)
4946     {
4947       inst.error = _("shift expression expected");
4948       return FAIL;
4949     }
4950
4951   shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
4952                                                             p - *str);
4953
4954   if (shift_name == NULL)
4955     {
4956       inst.error = _("shift expression expected");
4957       return FAIL;
4958     }
4959
4960   shift = shift_name->kind;
4961
4962   switch (mode)
4963     {
4964     case NO_SHIFT_RESTRICT:
4965     case SHIFT_IMMEDIATE:   break;
4966
4967     case SHIFT_LSL_OR_ASR_IMMEDIATE:
4968       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4969         {
4970           inst.error = _("'LSL' or 'ASR' required");
4971           return FAIL;
4972         }
4973       break;
4974
4975     case SHIFT_LSL_IMMEDIATE:
4976       if (shift != SHIFT_LSL)
4977         {
4978           inst.error = _("'LSL' required");
4979           return FAIL;
4980         }
4981       break;
4982
4983     case SHIFT_ASR_IMMEDIATE:
4984       if (shift != SHIFT_ASR)
4985         {
4986           inst.error = _("'ASR' required");
4987           return FAIL;
4988         }
4989       break;
4990
4991     default: abort ();
4992     }
4993
4994   if (shift != SHIFT_RRX)
4995     {
4996       /* Whitespace can appear here if the next thing is a bare digit.  */
4997       skip_whitespace (p);
4998
4999       if (mode == NO_SHIFT_RESTRICT
5000           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5001         {
5002           inst.operands[i].imm = reg;
5003           inst.operands[i].immisreg = 1;
5004         }
5005       else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5006         return FAIL;
5007     }
5008   inst.operands[i].shift_kind = shift;
5009   inst.operands[i].shifted = 1;
5010   *str = p;
5011   return SUCCESS;
5012 }
5013
5014 /* Parse a <shifter_operand> for an ARM data processing instruction:
5015
5016       #<immediate>
5017       #<immediate>, <rotate>
5018       <Rm>
5019       <Rm>, <shift>
5020
5021    where <shift> is defined by parse_shift above, and <rotate> is a
5022    multiple of 2 between 0 and 30.  Validation of immediate operands
5023    is deferred to md_apply_fix.  */
5024
5025 static int
5026 parse_shifter_operand (char **str, int i)
5027 {
5028   int value;
5029   expressionS exp;
5030
5031   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
5032     {
5033       inst.operands[i].reg = value;
5034       inst.operands[i].isreg = 1;
5035
5036       /* parse_shift will override this if appropriate */
5037       inst.reloc.exp.X_op = O_constant;
5038       inst.reloc.exp.X_add_number = 0;
5039
5040       if (skip_past_comma (str) == FAIL)
5041         return SUCCESS;
5042
5043       /* Shift operation on register.  */
5044       return parse_shift (str, i, NO_SHIFT_RESTRICT);
5045     }
5046
5047   if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
5048     return FAIL;
5049
5050   if (skip_past_comma (str) == SUCCESS)
5051     {
5052       /* #x, y -- ie explicit rotation by Y.  */
5053       if (my_get_expression (&exp, str, GE_NO_PREFIX))
5054         return FAIL;
5055
5056       if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
5057         {
5058           inst.error = _("constant expression expected");
5059           return FAIL;
5060         }
5061
5062       value = exp.X_add_number;
5063       if (value < 0 || value > 30 || value % 2 != 0)
5064         {
5065           inst.error = _("invalid rotation");
5066           return FAIL;
5067         }
5068       if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
5069         {
5070           inst.error = _("invalid constant");
5071           return FAIL;
5072         }
5073
5074       /* Encode as specified.  */
5075       inst.operands[i].imm = inst.reloc.exp.X_add_number | value << 7;
5076       return SUCCESS;
5077     }
5078
5079   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
5080   inst.reloc.pc_rel = 0;
5081   return SUCCESS;
5082 }
5083
5084 /* Group relocation information.  Each entry in the table contains the
5085    textual name of the relocation as may appear in assembler source
5086    and must end with a colon.
5087    Along with this textual name are the relocation codes to be used if
5088    the corresponding instruction is an ALU instruction (ADD or SUB only),
5089    an LDR, an LDRS, or an LDC.  */
5090
5091 struct group_reloc_table_entry
5092 {
5093   const char *name;
5094   int alu_code;
5095   int ldr_code;
5096   int ldrs_code;
5097   int ldc_code;
5098 };
5099
5100 typedef enum
5101 {
5102   /* Varieties of non-ALU group relocation.  */
5103
5104   GROUP_LDR,
5105   GROUP_LDRS,
5106   GROUP_LDC
5107 } group_reloc_type;
5108
5109 static struct group_reloc_table_entry group_reloc_table[] =
5110   { /* Program counter relative: */
5111     { "pc_g0_nc",
5112       BFD_RELOC_ARM_ALU_PC_G0_NC,       /* ALU */
5113       0,                                /* LDR */
5114       0,                                /* LDRS */
5115       0 },                              /* LDC */
5116     { "pc_g0",
5117       BFD_RELOC_ARM_ALU_PC_G0,          /* ALU */
5118       BFD_RELOC_ARM_LDR_PC_G0,          /* LDR */
5119       BFD_RELOC_ARM_LDRS_PC_G0,         /* LDRS */
5120       BFD_RELOC_ARM_LDC_PC_G0 },        /* LDC */
5121     { "pc_g1_nc",
5122       BFD_RELOC_ARM_ALU_PC_G1_NC,       /* ALU */
5123       0,                                /* LDR */
5124       0,                                /* LDRS */
5125       0 },                              /* LDC */
5126     { "pc_g1",
5127       BFD_RELOC_ARM_ALU_PC_G1,          /* ALU */
5128       BFD_RELOC_ARM_LDR_PC_G1,          /* LDR */
5129       BFD_RELOC_ARM_LDRS_PC_G1,         /* LDRS */
5130       BFD_RELOC_ARM_LDC_PC_G1 },        /* LDC */
5131     { "pc_g2",
5132       BFD_RELOC_ARM_ALU_PC_G2,          /* ALU */
5133       BFD_RELOC_ARM_LDR_PC_G2,          /* LDR */
5134       BFD_RELOC_ARM_LDRS_PC_G2,         /* LDRS */
5135       BFD_RELOC_ARM_LDC_PC_G2 },        /* LDC */
5136     /* Section base relative */
5137     { "sb_g0_nc",
5138       BFD_RELOC_ARM_ALU_SB_G0_NC,       /* ALU */
5139       0,                                /* LDR */
5140       0,                                /* LDRS */
5141       0 },                              /* LDC */
5142     { "sb_g0",
5143       BFD_RELOC_ARM_ALU_SB_G0,          /* ALU */
5144       BFD_RELOC_ARM_LDR_SB_G0,          /* LDR */
5145       BFD_RELOC_ARM_LDRS_SB_G0,         /* LDRS */
5146       BFD_RELOC_ARM_LDC_SB_G0 },        /* LDC */
5147     { "sb_g1_nc",
5148       BFD_RELOC_ARM_ALU_SB_G1_NC,       /* ALU */
5149       0,                                /* LDR */
5150       0,                                /* LDRS */
5151       0 },                              /* LDC */
5152     { "sb_g1",
5153       BFD_RELOC_ARM_ALU_SB_G1,          /* ALU */
5154       BFD_RELOC_ARM_LDR_SB_G1,          /* LDR */
5155       BFD_RELOC_ARM_LDRS_SB_G1,         /* LDRS */
5156       BFD_RELOC_ARM_LDC_SB_G1 },        /* LDC */
5157     { "sb_g2",
5158       BFD_RELOC_ARM_ALU_SB_G2,          /* ALU */
5159       BFD_RELOC_ARM_LDR_SB_G2,          /* LDR */
5160       BFD_RELOC_ARM_LDRS_SB_G2,         /* LDRS */
5161       BFD_RELOC_ARM_LDC_SB_G2 } };      /* LDC */
5162
5163 /* Given the address of a pointer pointing to the textual name of a group
5164    relocation as may appear in assembler source, attempt to find its details
5165    in group_reloc_table.  The pointer will be updated to the character after
5166    the trailing colon.  On failure, FAIL will be returned; SUCCESS
5167    otherwise.  On success, *entry will be updated to point at the relevant
5168    group_reloc_table entry. */
5169
5170 static int
5171 find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
5172 {
5173   unsigned int i;
5174   for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
5175     {
5176       int length = strlen (group_reloc_table[i].name);
5177
5178       if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
5179           && (*str)[length] == ':')
5180         {
5181           *out = &group_reloc_table[i];
5182           *str += (length + 1);
5183           return SUCCESS;
5184         }
5185     }
5186
5187   return FAIL;
5188 }
5189
5190 /* Parse a <shifter_operand> for an ARM data processing instruction
5191    (as for parse_shifter_operand) where group relocations are allowed:
5192
5193       #<immediate>
5194       #<immediate>, <rotate>
5195       #:<group_reloc>:<expression>
5196       <Rm>
5197       <Rm>, <shift>
5198
5199    where <group_reloc> is one of the strings defined in group_reloc_table.
5200    The hashes are optional.
5201
5202    Everything else is as for parse_shifter_operand.  */
5203
5204 static parse_operand_result
5205 parse_shifter_operand_group_reloc (char **str, int i)
5206 {
5207   /* Determine if we have the sequence of characters #: or just :
5208      coming next.  If we do, then we check for a group relocation.
5209      If we don't, punt the whole lot to parse_shifter_operand.  */
5210
5211   if (((*str)[0] == '#' && (*str)[1] == ':')
5212       || (*str)[0] == ':')
5213     {
5214       struct group_reloc_table_entry *entry;
5215
5216       if ((*str)[0] == '#')
5217         (*str) += 2;
5218       else
5219         (*str)++;
5220
5221       /* Try to parse a group relocation.  Anything else is an error.  */
5222       if (find_group_reloc_table_entry (str, &entry) == FAIL)
5223         {
5224           inst.error = _("unknown group relocation");
5225           return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5226         }
5227
5228       /* We now have the group relocation table entry corresponding to
5229          the name in the assembler source.  Next, we parse the expression.  */
5230       if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
5231         return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5232
5233       /* Record the relocation type (always the ALU variant here).  */
5234       inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
5235       gas_assert (inst.reloc.type != 0);
5236
5237       return PARSE_OPERAND_SUCCESS;
5238     }
5239   else
5240     return parse_shifter_operand (str, i) == SUCCESS
5241            ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
5242
5243   /* Never reached.  */
5244 }
5245
5246 /* Parse a Neon alignment expression.  Information is written to
5247    inst.operands[i].  We assume the initial ':' has been skipped.
5248
5249    align        .imm = align << 8, .immisalign=1, .preind=0  */
5250 static parse_operand_result
5251 parse_neon_alignment (char **str, int i)
5252 {
5253   char *p = *str;
5254   expressionS exp;
5255
5256   my_get_expression (&exp, &p, GE_NO_PREFIX);
5257
5258   if (exp.X_op != O_constant)
5259     {
5260       inst.error = _("alignment must be constant");
5261       return PARSE_OPERAND_FAIL;
5262     }
5263
5264   inst.operands[i].imm = exp.X_add_number << 8;
5265   inst.operands[i].immisalign = 1;
5266   /* Alignments are not pre-indexes.  */
5267   inst.operands[i].preind = 0;
5268
5269   *str = p;
5270   return PARSE_OPERAND_SUCCESS;
5271 }
5272
5273 /* Parse all forms of an ARM address expression.  Information is written
5274    to inst.operands[i] and/or inst.reloc.
5275
5276    Preindexed addressing (.preind=1):
5277
5278    [Rn, #offset]       .reg=Rn .reloc.exp=offset
5279    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5280    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5281                        .shift_kind=shift .reloc.exp=shift_imm
5282
5283    These three may have a trailing ! which causes .writeback to be set also.
5284
5285    Postindexed addressing (.postind=1, .writeback=1):
5286
5287    [Rn], #offset       .reg=Rn .reloc.exp=offset
5288    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5289    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5290                        .shift_kind=shift .reloc.exp=shift_imm
5291
5292    Unindexed addressing (.preind=0, .postind=0):
5293
5294    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
5295
5296    Other:
5297
5298    [Rn]{!}             shorthand for [Rn,#0]{!}
5299    =immediate          .isreg=0 .reloc.exp=immediate
5300    label               .reg=PC .reloc.pc_rel=1 .reloc.exp=label
5301
5302   It is the caller's responsibility to check for addressing modes not
5303   supported by the instruction, and to set inst.reloc.type.  */
5304
5305 static parse_operand_result
5306 parse_address_main (char **str, int i, int group_relocations,
5307                     group_reloc_type group_type)
5308 {
5309   char *p = *str;
5310   int reg;
5311
5312   if (skip_past_char (&p, '[') == FAIL)
5313     {
5314       if (skip_past_char (&p, '=') == FAIL)
5315         {
5316           /* Bare address - translate to PC-relative offset.  */
5317           inst.reloc.pc_rel = 1;
5318           inst.operands[i].reg = REG_PC;
5319           inst.operands[i].isreg = 1;
5320           inst.operands[i].preind = 1;
5321         }
5322       /* Otherwise a load-constant pseudo op, no special treatment needed here.  */
5323
5324       if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5325         return PARSE_OPERAND_FAIL;
5326
5327       *str = p;
5328       return PARSE_OPERAND_SUCCESS;
5329     }
5330
5331   /* PR gas/14887: Allow for whitespace after the opening bracket.  */
5332   skip_whitespace (p);
5333
5334   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5335     {
5336       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5337       return PARSE_OPERAND_FAIL;
5338     }
5339   inst.operands[i].reg = reg;
5340   inst.operands[i].isreg = 1;
5341
5342   if (skip_past_comma (&p) == SUCCESS)
5343     {
5344       inst.operands[i].preind = 1;
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           inst.operands[i].imm = reg;
5352           inst.operands[i].immisreg = 1;
5353
5354           if (skip_past_comma (&p) == SUCCESS)
5355             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5356               return PARSE_OPERAND_FAIL;
5357         }
5358       else if (skip_past_char (&p, ':') == SUCCESS)
5359         {
5360           /* FIXME: '@' should be used here, but it's filtered out by generic
5361              code before we get to see it here. This may be subject to
5362              change.  */
5363           parse_operand_result result = parse_neon_alignment (&p, i);
5364
5365           if (result != PARSE_OPERAND_SUCCESS)
5366             return result;
5367         }
5368       else
5369         {
5370           if (inst.operands[i].negative)
5371             {
5372               inst.operands[i].negative = 0;
5373               p--;
5374             }
5375
5376           if (group_relocations
5377               && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
5378             {
5379               struct group_reloc_table_entry *entry;
5380
5381               /* Skip over the #: or : sequence.  */
5382               if (*p == '#')
5383                 p += 2;
5384               else
5385                 p++;
5386
5387               /* Try to parse a group relocation.  Anything else is an
5388                  error.  */
5389               if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5390                 {
5391                   inst.error = _("unknown group relocation");
5392                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5393                 }
5394
5395               /* We now have the group relocation table entry corresponding to
5396                  the name in the assembler source.  Next, we parse the
5397                  expression.  */
5398               if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5399                 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5400
5401               /* Record the relocation type.  */
5402               switch (group_type)
5403                 {
5404                   case GROUP_LDR:
5405                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
5406                     break;
5407
5408                   case GROUP_LDRS:
5409                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
5410                     break;
5411
5412                   case GROUP_LDC:
5413                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
5414                     break;
5415
5416                   default:
5417                     gas_assert (0);
5418                 }
5419
5420               if (inst.reloc.type == 0)
5421                 {
5422                   inst.error = _("this group relocation is not allowed on this instruction");
5423                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5424                 }
5425             }
5426           else
5427             {
5428               char *q = p;
5429               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5430                 return PARSE_OPERAND_FAIL;
5431               /* If the offset is 0, find out if it's a +0 or -0.  */
5432               if (inst.reloc.exp.X_op == O_constant
5433                   && inst.reloc.exp.X_add_number == 0)
5434                 {
5435                   skip_whitespace (q);
5436                   if (*q == '#')
5437                     {
5438                       q++;
5439                       skip_whitespace (q);
5440                     }
5441                   if (*q == '-')
5442                     inst.operands[i].negative = 1;
5443                 }
5444             }
5445         }
5446     }
5447   else if (skip_past_char (&p, ':') == SUCCESS)
5448     {
5449       /* FIXME: '@' should be used here, but it's filtered out by generic code
5450          before we get to see it here. This may be subject to change.  */
5451       parse_operand_result result = parse_neon_alignment (&p, i);
5452
5453       if (result != PARSE_OPERAND_SUCCESS)
5454         return result;
5455     }
5456
5457   if (skip_past_char (&p, ']') == FAIL)
5458     {
5459       inst.error = _("']' expected");
5460       return PARSE_OPERAND_FAIL;
5461     }
5462
5463   if (skip_past_char (&p, '!') == SUCCESS)
5464     inst.operands[i].writeback = 1;
5465
5466   else if (skip_past_comma (&p) == SUCCESS)
5467     {
5468       if (skip_past_char (&p, '{') == SUCCESS)
5469         {
5470           /* [Rn], {expr} - unindexed, with option */
5471           if (parse_immediate (&p, &inst.operands[i].imm,
5472                                0, 255, TRUE) == FAIL)
5473             return PARSE_OPERAND_FAIL;
5474
5475           if (skip_past_char (&p, '}') == FAIL)
5476             {
5477               inst.error = _("'}' expected at end of 'option' field");
5478               return PARSE_OPERAND_FAIL;
5479             }
5480           if (inst.operands[i].preind)
5481             {
5482               inst.error = _("cannot combine index with option");
5483               return PARSE_OPERAND_FAIL;
5484             }
5485           *str = p;
5486           return PARSE_OPERAND_SUCCESS;
5487         }
5488       else
5489         {
5490           inst.operands[i].postind = 1;
5491           inst.operands[i].writeback = 1;
5492
5493           if (inst.operands[i].preind)
5494             {
5495               inst.error = _("cannot combine pre- and post-indexing");
5496               return PARSE_OPERAND_FAIL;
5497             }
5498
5499           if (*p == '+') p++;
5500           else if (*p == '-') p++, inst.operands[i].negative = 1;
5501
5502           if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5503             {
5504               /* We might be using the immediate for alignment already. If we
5505                  are, OR the register number into the low-order bits.  */
5506               if (inst.operands[i].immisalign)
5507                 inst.operands[i].imm |= reg;
5508               else
5509                 inst.operands[i].imm = reg;
5510               inst.operands[i].immisreg = 1;
5511
5512               if (skip_past_comma (&p) == SUCCESS)
5513                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5514                   return PARSE_OPERAND_FAIL;
5515             }
5516           else
5517             {
5518               char *q = p;
5519               if (inst.operands[i].negative)
5520                 {
5521                   inst.operands[i].negative = 0;
5522                   p--;
5523                 }
5524               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5525                 return PARSE_OPERAND_FAIL;
5526               /* If the offset is 0, find out if it's a +0 or -0.  */
5527               if (inst.reloc.exp.X_op == O_constant
5528                   && inst.reloc.exp.X_add_number == 0)
5529                 {
5530                   skip_whitespace (q);
5531                   if (*q == '#')
5532                     {
5533                       q++;
5534                       skip_whitespace (q);
5535                     }
5536                   if (*q == '-')
5537                     inst.operands[i].negative = 1;
5538                 }
5539             }
5540         }
5541     }
5542
5543   /* If at this point neither .preind nor .postind is set, we have a
5544      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
5545   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5546     {
5547       inst.operands[i].preind = 1;
5548       inst.reloc.exp.X_op = O_constant;
5549       inst.reloc.exp.X_add_number = 0;
5550     }
5551   *str = p;
5552   return PARSE_OPERAND_SUCCESS;
5553 }
5554
5555 static int
5556 parse_address (char **str, int i)
5557 {
5558   return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
5559          ? SUCCESS : FAIL;
5560 }
5561
5562 static parse_operand_result
5563 parse_address_group_reloc (char **str, int i, group_reloc_type type)
5564 {
5565   return parse_address_main (str, i, 1, type);
5566 }
5567
5568 /* Parse an operand for a MOVW or MOVT instruction.  */
5569 static int
5570 parse_half (char **str)
5571 {
5572   char * p;
5573
5574   p = *str;
5575   skip_past_char (&p, '#');
5576   if (strncasecmp (p, ":lower16:", 9) == 0)
5577     inst.reloc.type = BFD_RELOC_ARM_MOVW;
5578   else if (strncasecmp (p, ":upper16:", 9) == 0)
5579     inst.reloc.type = BFD_RELOC_ARM_MOVT;
5580
5581   if (inst.reloc.type != BFD_RELOC_UNUSED)
5582     {
5583       p += 9;
5584       skip_whitespace (p);
5585     }
5586
5587   if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5588     return FAIL;
5589
5590   if (inst.reloc.type == BFD_RELOC_UNUSED)
5591     {
5592       if (inst.reloc.exp.X_op != O_constant)
5593         {
5594           inst.error = _("constant expression expected");
5595           return FAIL;
5596         }
5597       if (inst.reloc.exp.X_add_number < 0
5598           || inst.reloc.exp.X_add_number > 0xffff)
5599         {
5600           inst.error = _("immediate value out of range");
5601           return FAIL;
5602         }
5603     }
5604   *str = p;
5605   return SUCCESS;
5606 }
5607
5608 /* Miscellaneous. */
5609
5610 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
5611    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
5612 static int
5613 parse_psr (char **str, bfd_boolean lhs)
5614 {
5615   char *p;
5616   unsigned long psr_field;
5617   const struct asm_psr *psr;
5618   char *start;
5619   bfd_boolean is_apsr = FALSE;
5620   bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
5621
5622   /* PR gas/12698:  If the user has specified -march=all then m_profile will
5623      be TRUE, but we want to ignore it in this case as we are building for any
5624      CPU type, including non-m variants.  */
5625   if (selected_cpu.core == arm_arch_any.core)
5626     m_profile = FALSE;
5627
5628   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
5629      feature for ease of use and backwards compatibility.  */
5630   p = *str;
5631   if (strncasecmp (p, "SPSR", 4) == 0)
5632     {
5633       if (m_profile)
5634         goto unsupported_psr;
5635
5636       psr_field = SPSR_BIT;
5637     }
5638   else if (strncasecmp (p, "CPSR", 4) == 0)
5639     {
5640       if (m_profile)
5641         goto unsupported_psr;
5642
5643       psr_field = 0;
5644     }
5645   else if (strncasecmp (p, "APSR", 4) == 0)
5646     {
5647       /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
5648          and ARMv7-R architecture CPUs.  */
5649       is_apsr = TRUE;
5650       psr_field = 0;
5651     }
5652   else if (m_profile)
5653     {
5654       start = p;
5655       do
5656         p++;
5657       while (ISALNUM (*p) || *p == '_');
5658
5659       if (strncasecmp (start, "iapsr", 5) == 0
5660           || strncasecmp (start, "eapsr", 5) == 0
5661           || strncasecmp (start, "xpsr", 4) == 0
5662           || strncasecmp (start, "psr", 3) == 0)
5663         p = start + strcspn (start, "rR") + 1;
5664
5665       psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5666                                                   p - start);
5667
5668       if (!psr)
5669         return FAIL;
5670
5671       /* If APSR is being written, a bitfield may be specified.  Note that
5672          APSR itself is handled above.  */
5673       if (psr->field <= 3)
5674         {
5675           psr_field = psr->field;
5676           is_apsr = TRUE;
5677           goto check_suffix;
5678         }
5679
5680       *str = p;
5681       /* M-profile MSR instructions have the mask field set to "10", except
5682          *PSR variants which modify APSR, which may use a different mask (and
5683          have been handled already).  Do that by setting the PSR_f field
5684          here.  */
5685       return psr->field | (lhs ? PSR_f : 0);
5686     }
5687   else
5688     goto unsupported_psr;
5689
5690   p += 4;
5691 check_suffix:
5692   if (*p == '_')
5693     {
5694       /* A suffix follows.  */
5695       p++;
5696       start = p;
5697
5698       do
5699         p++;
5700       while (ISALNUM (*p) || *p == '_');
5701
5702       if (is_apsr)
5703         {
5704           /* APSR uses a notation for bits, rather than fields.  */
5705           unsigned int nzcvq_bits = 0;
5706           unsigned int g_bit = 0;
5707           char *bit;
5708
5709           for (bit = start; bit != p; bit++)
5710             {
5711               switch (TOLOWER (*bit))
5712                 {
5713                 case 'n':
5714                   nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
5715                   break;
5716
5717                 case 'z':
5718                   nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
5719                   break;
5720
5721                 case 'c':
5722                   nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
5723                   break;
5724
5725                 case 'v':
5726                   nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
5727                   break;
5728
5729                 case 'q':
5730                   nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
5731                   break;
5732
5733                 case 'g':
5734                   g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
5735                   break;
5736
5737                 default:
5738                   inst.error = _("unexpected bit specified after APSR");
5739                   return FAIL;
5740                 }
5741             }
5742
5743           if (nzcvq_bits == 0x1f)
5744             psr_field |= PSR_f;
5745
5746           if (g_bit == 0x1)
5747             {
5748               if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
5749                 {
5750                   inst.error = _("selected processor does not "
5751                                  "support DSP extension");
5752                   return FAIL;
5753                 }
5754
5755               psr_field |= PSR_s;
5756             }
5757
5758           if ((nzcvq_bits & 0x20) != 0
5759               || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
5760               || (g_bit & 0x2) != 0)
5761             {
5762               inst.error = _("bad bitmask specified after APSR");
5763               return FAIL;
5764             }
5765         }
5766       else
5767         {
5768           psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5769                                                       p - start);
5770           if (!psr)
5771             goto error;
5772
5773           psr_field |= psr->field;
5774         }
5775     }
5776   else
5777     {
5778       if (ISALNUM (*p))
5779         goto error;    /* Garbage after "[CS]PSR".  */
5780
5781       /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes).  This
5782          is deprecated, but allow it anyway.  */
5783       if (is_apsr && lhs)
5784         {
5785           psr_field |= PSR_f;
5786           as_tsktsk (_("writing to APSR without specifying a bitmask is "
5787                        "deprecated"));
5788         }
5789       else if (!m_profile)
5790         /* These bits are never right for M-profile devices: don't set them
5791            (only code paths which read/write APSR reach here).  */
5792         psr_field |= (PSR_c | PSR_f);
5793     }
5794   *str = p;
5795   return psr_field;
5796
5797  unsupported_psr:
5798   inst.error = _("selected processor does not support requested special "
5799                  "purpose register");
5800   return FAIL;
5801
5802  error:
5803   inst.error = _("flag for {c}psr instruction expected");
5804   return FAIL;
5805 }
5806
5807 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
5808    value suitable for splatting into the AIF field of the instruction.  */
5809
5810 static int
5811 parse_cps_flags (char **str)
5812 {
5813   int val = 0;
5814   int saw_a_flag = 0;
5815   char *s = *str;
5816
5817   for (;;)
5818     switch (*s++)
5819       {
5820       case '\0': case ',':
5821         goto done;
5822
5823       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5824       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5825       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
5826
5827       default:
5828         inst.error = _("unrecognized CPS flag");
5829         return FAIL;
5830       }
5831
5832  done:
5833   if (saw_a_flag == 0)
5834     {
5835       inst.error = _("missing CPS flags");
5836       return FAIL;
5837     }
5838
5839   *str = s - 1;
5840   return val;
5841 }
5842
5843 /* Parse an endian specifier ("BE" or "LE", case insensitive);
5844    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
5845
5846 static int
5847 parse_endian_specifier (char **str)
5848 {
5849   int little_endian;
5850   char *s = *str;
5851
5852   if (strncasecmp (s, "BE", 2))
5853     little_endian = 0;
5854   else if (strncasecmp (s, "LE", 2))
5855     little_endian = 1;
5856   else
5857     {
5858       inst.error = _("valid endian specifiers are be or le");
5859       return FAIL;
5860     }
5861
5862   if (ISALNUM (s[2]) || s[2] == '_')
5863     {
5864       inst.error = _("valid endian specifiers are be or le");
5865       return FAIL;
5866     }
5867
5868   *str = s + 2;
5869   return little_endian;
5870 }
5871
5872 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
5873    value suitable for poking into the rotate field of an sxt or sxta
5874    instruction, or FAIL on error.  */
5875
5876 static int
5877 parse_ror (char **str)
5878 {
5879   int rot;
5880   char *s = *str;
5881
5882   if (strncasecmp (s, "ROR", 3) == 0)
5883     s += 3;
5884   else
5885     {
5886       inst.error = _("missing rotation field after comma");
5887       return FAIL;
5888     }
5889
5890   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5891     return FAIL;
5892
5893   switch (rot)
5894     {
5895     case  0: *str = s; return 0x0;
5896     case  8: *str = s; return 0x1;
5897     case 16: *str = s; return 0x2;
5898     case 24: *str = s; return 0x3;
5899
5900     default:
5901       inst.error = _("rotation can only be 0, 8, 16, or 24");
5902       return FAIL;
5903     }
5904 }
5905
5906 /* Parse a conditional code (from conds[] below).  The value returned is in the
5907    range 0 .. 14, or FAIL.  */
5908 static int
5909 parse_cond (char **str)
5910 {
5911   char *q;
5912   const struct asm_cond *c;
5913   int n;
5914   /* Condition codes are always 2 characters, so matching up to
5915      3 characters is sufficient.  */
5916   char cond[3];
5917
5918   q = *str;
5919   n = 0;
5920   while (ISALPHA (*q) && n < 3)
5921     {
5922       cond[n] = TOLOWER (*q);
5923       q++;
5924       n++;
5925     }
5926
5927   c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
5928   if (!c)
5929     {
5930       inst.error = _("condition required");
5931       return FAIL;
5932     }
5933
5934   *str = q;
5935   return c->value;
5936 }
5937
5938 /* If the given feature available in the selected CPU, mark it as used.
5939    Returns TRUE iff feature is available.  */
5940 static bfd_boolean
5941 mark_feature_used (const arm_feature_set *feature)
5942 {
5943   /* Ensure the option is valid on the current architecture.  */
5944   if (!ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
5945     return FALSE;
5946
5947   /* Add the appropriate architecture feature for the barrier option used.
5948      */
5949   if (thumb_mode)
5950     ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, *feature);
5951   else
5952     ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, *feature);
5953
5954   return TRUE;
5955 }
5956
5957 /* Parse an option for a barrier instruction.  Returns the encoding for the
5958    option, or FAIL.  */
5959 static int
5960 parse_barrier (char **str)
5961 {
5962   char *p, *q;
5963   const struct asm_barrier_opt *o;
5964
5965   p = q = *str;
5966   while (ISALPHA (*q))
5967     q++;
5968
5969   o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
5970                                                     q - p);
5971   if (!o)
5972     return FAIL;
5973
5974   if (!mark_feature_used (&o->arch))
5975     return FAIL;
5976
5977   *str = q;
5978   return o->value;
5979 }
5980
5981 /* Parse the operands of a table branch instruction.  Similar to a memory
5982    operand.  */
5983 static int
5984 parse_tb (char **str)
5985 {
5986   char * p = *str;
5987   int reg;
5988
5989   if (skip_past_char (&p, '[') == FAIL)
5990     {
5991       inst.error = _("'[' expected");
5992       return FAIL;
5993     }
5994
5995   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5996     {
5997       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5998       return FAIL;
5999     }
6000   inst.operands[0].reg = reg;
6001
6002   if (skip_past_comma (&p) == FAIL)
6003     {
6004       inst.error = _("',' expected");
6005       return FAIL;
6006     }
6007
6008   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
6009     {
6010       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
6011       return FAIL;
6012     }
6013   inst.operands[0].imm = reg;
6014
6015   if (skip_past_comma (&p) == SUCCESS)
6016     {
6017       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
6018         return FAIL;
6019       if (inst.reloc.exp.X_add_number != 1)
6020         {
6021           inst.error = _("invalid shift");
6022           return FAIL;
6023         }
6024       inst.operands[0].shifted = 1;
6025     }
6026
6027   if (skip_past_char (&p, ']') == FAIL)
6028     {
6029       inst.error = _("']' expected");
6030       return FAIL;
6031     }
6032   *str = p;
6033   return SUCCESS;
6034 }
6035
6036 /* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
6037    information on the types the operands can take and how they are encoded.
6038    Up to four operands may be read; this function handles setting the
6039    ".present" field for each read operand itself.
6040    Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
6041    else returns FAIL.  */
6042
6043 static int
6044 parse_neon_mov (char **str, int *which_operand)
6045 {
6046   int i = *which_operand, val;
6047   enum arm_reg_type rtype;
6048   char *ptr = *str;
6049   struct neon_type_el optype;
6050
6051   if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
6052     {
6053       /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
6054       inst.operands[i].reg = val;
6055       inst.operands[i].isscalar = 1;
6056       inst.operands[i].vectype = optype;
6057       inst.operands[i++].present = 1;
6058
6059       if (skip_past_comma (&ptr) == FAIL)
6060         goto wanted_comma;
6061
6062       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6063         goto wanted_arm;
6064
6065       inst.operands[i].reg = val;
6066       inst.operands[i].isreg = 1;
6067       inst.operands[i].present = 1;
6068     }
6069   else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
6070            != FAIL)
6071     {
6072       /* Cases 0, 1, 2, 3, 5 (D only).  */
6073       if (skip_past_comma (&ptr) == FAIL)
6074         goto wanted_comma;
6075
6076       inst.operands[i].reg = val;
6077       inst.operands[i].isreg = 1;
6078       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
6079       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6080       inst.operands[i].isvec = 1;
6081       inst.operands[i].vectype = optype;
6082       inst.operands[i++].present = 1;
6083
6084       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6085         {
6086           /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
6087              Case 13: VMOV <Sd>, <Rm>  */
6088           inst.operands[i].reg = val;
6089           inst.operands[i].isreg = 1;
6090           inst.operands[i].present = 1;
6091
6092           if (rtype == REG_TYPE_NQ)
6093             {
6094               first_error (_("can't use Neon quad register here"));
6095               return FAIL;
6096             }
6097           else if (rtype != REG_TYPE_VFS)
6098             {
6099               i++;
6100               if (skip_past_comma (&ptr) == FAIL)
6101                 goto wanted_comma;
6102               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6103                 goto wanted_arm;
6104               inst.operands[i].reg = val;
6105               inst.operands[i].isreg = 1;
6106               inst.operands[i].present = 1;
6107             }
6108         }
6109       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
6110                                            &optype)) != FAIL)
6111         {
6112           /* Case 0: VMOV<c><q> <Qd>, <Qm>
6113              Case 1: VMOV<c><q> <Dd>, <Dm>
6114              Case 8: VMOV.F32 <Sd>, <Sm>
6115              Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
6116
6117           inst.operands[i].reg = val;
6118           inst.operands[i].isreg = 1;
6119           inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
6120           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6121           inst.operands[i].isvec = 1;
6122           inst.operands[i].vectype = optype;
6123           inst.operands[i].present = 1;
6124
6125           if (skip_past_comma (&ptr) == SUCCESS)
6126             {
6127               /* Case 15.  */
6128               i++;
6129
6130               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6131                 goto wanted_arm;
6132
6133               inst.operands[i].reg = val;
6134               inst.operands[i].isreg = 1;
6135               inst.operands[i++].present = 1;
6136
6137               if (skip_past_comma (&ptr) == FAIL)
6138                 goto wanted_comma;
6139
6140               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6141                 goto wanted_arm;
6142
6143               inst.operands[i].reg = val;
6144               inst.operands[i].isreg = 1;
6145               inst.operands[i].present = 1;
6146             }
6147         }
6148       else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
6149           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
6150              Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
6151              Case 10: VMOV.F32 <Sd>, #<imm>
6152              Case 11: VMOV.F64 <Dd>, #<imm>  */
6153         inst.operands[i].immisfloat = 1;
6154       else if (parse_big_immediate (&ptr, i) == SUCCESS)
6155           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
6156              Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
6157         ;
6158       else
6159         {
6160           first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
6161           return FAIL;
6162         }
6163     }
6164   else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6165     {
6166       /* Cases 6, 7.  */
6167       inst.operands[i].reg = val;
6168       inst.operands[i].isreg = 1;
6169       inst.operands[i++].present = 1;
6170
6171       if (skip_past_comma (&ptr) == FAIL)
6172         goto wanted_comma;
6173
6174       if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
6175         {
6176           /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
6177           inst.operands[i].reg = val;
6178           inst.operands[i].isscalar = 1;
6179           inst.operands[i].present = 1;
6180           inst.operands[i].vectype = optype;
6181         }
6182       else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6183         {
6184           /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
6185           inst.operands[i].reg = val;
6186           inst.operands[i].isreg = 1;
6187           inst.operands[i++].present = 1;
6188
6189           if (skip_past_comma (&ptr) == FAIL)
6190             goto wanted_comma;
6191
6192           if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
6193               == FAIL)
6194             {
6195               first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
6196               return FAIL;
6197             }
6198
6199           inst.operands[i].reg = val;
6200           inst.operands[i].isreg = 1;
6201           inst.operands[i].isvec = 1;
6202           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6203           inst.operands[i].vectype = optype;
6204           inst.operands[i].present = 1;
6205
6206           if (rtype == REG_TYPE_VFS)
6207             {
6208               /* Case 14.  */
6209               i++;
6210               if (skip_past_comma (&ptr) == FAIL)
6211                 goto wanted_comma;
6212               if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
6213                                               &optype)) == FAIL)
6214                 {
6215                   first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
6216                   return FAIL;
6217                 }
6218               inst.operands[i].reg = val;
6219               inst.operands[i].isreg = 1;
6220               inst.operands[i].isvec = 1;
6221               inst.operands[i].issingle = 1;
6222               inst.operands[i].vectype = optype;
6223               inst.operands[i].present = 1;
6224             }
6225         }
6226       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
6227                != FAIL)
6228         {
6229           /* Case 13.  */
6230           inst.operands[i].reg = val;
6231           inst.operands[i].isreg = 1;
6232           inst.operands[i].isvec = 1;
6233           inst.operands[i].issingle = 1;
6234           inst.operands[i].vectype = optype;
6235           inst.operands[i].present = 1;
6236         }
6237     }
6238   else
6239     {
6240       first_error (_("parse error"));
6241       return FAIL;
6242     }
6243
6244   /* Successfully parsed the operands. Update args.  */
6245   *which_operand = i;
6246   *str = ptr;
6247   return SUCCESS;
6248
6249  wanted_comma:
6250   first_error (_("expected comma"));
6251   return FAIL;
6252
6253  wanted_arm:
6254   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
6255   return FAIL;
6256 }
6257
6258 /* Use this macro when the operand constraints are different
6259    for ARM and THUMB (e.g. ldrd).  */
6260 #define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6261         ((arm_operand) | ((thumb_operand) << 16))
6262
6263 /* Matcher codes for parse_operands.  */
6264 enum operand_parse_code
6265 {
6266   OP_stop,      /* end of line */
6267
6268   OP_RR,        /* ARM register */
6269   OP_RRnpc,     /* ARM register, not r15 */
6270   OP_RRnpcsp,   /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
6271   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
6272   OP_RRnpctw,   /* ARM register, not r15 in Thumb-state or with writeback,
6273                    optional trailing ! */
6274   OP_RRw,       /* ARM register, not r15, optional trailing ! */
6275   OP_RCP,       /* Coprocessor number */
6276   OP_RCN,       /* Coprocessor register */
6277   OP_RF,        /* FPA register */
6278   OP_RVS,       /* VFP single precision register */
6279   OP_RVD,       /* VFP double precision register (0..15) */
6280   OP_RND,       /* Neon double precision register (0..31) */
6281   OP_RNQ,       /* Neon quad precision register */
6282   OP_RVSD,      /* VFP single or double precision register */
6283   OP_RNDQ,      /* Neon double or quad precision register */
6284   OP_RNSDQ,     /* Neon single, double or quad precision register */
6285   OP_RNSC,      /* Neon scalar D[X] */
6286   OP_RVC,       /* VFP control register */
6287   OP_RMF,       /* Maverick F register */
6288   OP_RMD,       /* Maverick D register */
6289   OP_RMFX,      /* Maverick FX register */
6290   OP_RMDX,      /* Maverick DX register */
6291   OP_RMAX,      /* Maverick AX register */
6292   OP_RMDS,      /* Maverick DSPSC register */
6293   OP_RIWR,      /* iWMMXt wR register */
6294   OP_RIWC,      /* iWMMXt wC register */
6295   OP_RIWG,      /* iWMMXt wCG register */
6296   OP_RXA,       /* XScale accumulator register */
6297
6298   OP_REGLST,    /* ARM register list */
6299   OP_VRSLST,    /* VFP single-precision register list */
6300   OP_VRDLST,    /* VFP double-precision register list */
6301   OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
6302   OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
6303   OP_NSTRLST,   /* Neon element/structure list */
6304
6305   OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
6306   OP_RVSD_I0,   /* VFP S or D reg, or immediate zero.  */
6307   OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
6308   OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
6309   OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
6310   OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
6311   OP_VMOV,      /* Neon VMOV operands.  */
6312   OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN.  */
6313   OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
6314   OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
6315
6316   OP_I0,        /* immediate zero */
6317   OP_I7,        /* immediate value 0 .. 7 */
6318   OP_I15,       /*                 0 .. 15 */
6319   OP_I16,       /*                 1 .. 16 */
6320   OP_I16z,      /*                 0 .. 16 */
6321   OP_I31,       /*                 0 .. 31 */
6322   OP_I31w,      /*                 0 .. 31, optional trailing ! */
6323   OP_I32,       /*                 1 .. 32 */
6324   OP_I32z,      /*                 0 .. 32 */
6325   OP_I63,       /*                 0 .. 63 */
6326   OP_I63s,      /*               -64 .. 63 */
6327   OP_I64,       /*                 1 .. 64 */
6328   OP_I64z,      /*                 0 .. 64 */
6329   OP_I255,      /*                 0 .. 255 */
6330
6331   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
6332   OP_I7b,       /*                             0 .. 7 */
6333   OP_I15b,      /*                             0 .. 15 */
6334   OP_I31b,      /*                             0 .. 31 */
6335
6336   OP_SH,        /* shifter operand */
6337   OP_SHG,       /* shifter operand with possible group relocation */
6338   OP_ADDR,      /* Memory address expression (any mode) */
6339   OP_ADDRGLDR,  /* Mem addr expr (any mode) with possible LDR group reloc */
6340   OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6341   OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
6342   OP_EXP,       /* arbitrary expression */
6343   OP_EXPi,      /* same, with optional immediate prefix */
6344   OP_EXPr,      /* same, with optional relocation suffix */
6345   OP_HALF,      /* 0 .. 65535 or low/high reloc.  */
6346
6347   OP_CPSF,      /* CPS flags */
6348   OP_ENDI,      /* Endianness specifier */
6349   OP_wPSR,      /* CPSR/SPSR/APSR mask for msr (writing).  */
6350   OP_rPSR,      /* CPSR/SPSR/APSR mask for msr (reading).  */
6351   OP_COND,      /* conditional code */
6352   OP_TB,        /* Table branch.  */
6353
6354   OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
6355
6356   OP_RRnpc_I0,  /* ARM register or literal 0 */
6357   OP_RR_EXr,    /* ARM register or expression with opt. reloc suff. */
6358   OP_RR_EXi,    /* ARM register or expression with imm prefix */
6359   OP_RF_IF,     /* FPA register or immediate */
6360   OP_RIWR_RIWC, /* iWMMXt R or C reg */
6361   OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
6362
6363   /* Optional operands.  */
6364   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
6365   OP_oI31b,      /*                             0 .. 31 */
6366   OP_oI32b,      /*                             1 .. 32 */
6367   OP_oI32z,      /*                             0 .. 32 */
6368   OP_oIffffb,    /*                             0 .. 65535 */
6369   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
6370
6371   OP_oRR,        /* ARM register */
6372   OP_oRRnpc,     /* ARM register, not the PC */
6373   OP_oRRnpcsp,   /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
6374   OP_oRRw,       /* ARM register, not r15, optional trailing ! */
6375   OP_oRND,       /* Optional Neon double precision register */
6376   OP_oRNQ,       /* Optional Neon quad precision register */
6377   OP_oRNDQ,      /* Optional Neon double or quad precision register */
6378   OP_oRNSDQ,     /* Optional single, double or quad precision vector register */
6379   OP_oSHll,      /* LSL immediate */
6380   OP_oSHar,      /* ASR immediate */
6381   OP_oSHllar,    /* LSL or ASR immediate */
6382   OP_oROR,       /* ROR 0/8/16/24 */
6383   OP_oBARRIER_I15, /* Option argument for a barrier instruction.  */
6384
6385   /* Some pre-defined mixed (ARM/THUMB) operands.  */
6386   OP_RR_npcsp           = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
6387   OP_RRnpc_npcsp        = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
6388   OP_oRRnpc_npcsp       = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
6389
6390   OP_FIRST_OPTIONAL = OP_oI7b
6391 };
6392
6393 /* Generic instruction operand parser.  This does no encoding and no
6394    semantic validation; it merely squirrels values away in the inst
6395    structure.  Returns SUCCESS or FAIL depending on whether the
6396    specified grammar matched.  */
6397 static int
6398 parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
6399 {
6400   unsigned const int *upat = pattern;
6401   char *backtrack_pos = 0;
6402   const char *backtrack_error = 0;
6403   int i, val = 0, backtrack_index = 0;
6404   enum arm_reg_type rtype;
6405   parse_operand_result result;
6406   unsigned int op_parse_code;
6407
6408 #define po_char_or_fail(chr)                    \
6409   do                                            \
6410     {                                           \
6411       if (skip_past_char (&str, chr) == FAIL)   \
6412         goto bad_args;                          \
6413     }                                           \
6414   while (0)
6415
6416 #define po_reg_or_fail(regtype)                                 \
6417   do                                                            \
6418     {                                                           \
6419       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6420                                  & inst.operands[i].vectype);   \
6421       if (val == FAIL)                                          \
6422         {                                                       \
6423           first_error (_(reg_expected_msgs[regtype]));          \
6424           goto failure;                                         \
6425         }                                                       \
6426       inst.operands[i].reg = val;                               \
6427       inst.operands[i].isreg = 1;                               \
6428       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6429       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6430       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6431                              || rtype == REG_TYPE_VFD           \
6432                              || rtype == REG_TYPE_NQ);          \
6433     }                                                           \
6434   while (0)
6435
6436 #define po_reg_or_goto(regtype, label)                          \
6437   do                                                            \
6438     {                                                           \
6439       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6440                                  & inst.operands[i].vectype);   \
6441       if (val == FAIL)                                          \
6442         goto label;                                             \
6443                                                                 \
6444       inst.operands[i].reg = val;                               \
6445       inst.operands[i].isreg = 1;                               \
6446       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6447       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6448       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6449                              || rtype == REG_TYPE_VFD           \
6450                              || rtype == REG_TYPE_NQ);          \
6451     }                                                           \
6452   while (0)
6453
6454 #define po_imm_or_fail(min, max, popt)                          \
6455   do                                                            \
6456     {                                                           \
6457       if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
6458         goto failure;                                           \
6459       inst.operands[i].imm = val;                               \
6460     }                                                           \
6461   while (0)
6462
6463 #define po_scalar_or_goto(elsz, label)                                  \
6464   do                                                                    \
6465     {                                                                   \
6466       val = parse_scalar (& str, elsz, & inst.operands[i].vectype);     \
6467       if (val == FAIL)                                                  \
6468         goto label;                                                     \
6469       inst.operands[i].reg = val;                                       \
6470       inst.operands[i].isscalar = 1;                                    \
6471     }                                                                   \
6472   while (0)
6473
6474 #define po_misc_or_fail(expr)                   \
6475   do                                            \
6476     {                                           \
6477       if (expr)                                 \
6478         goto failure;                           \
6479     }                                           \
6480   while (0)
6481
6482 #define po_misc_or_fail_no_backtrack(expr)              \
6483   do                                                    \
6484     {                                                   \
6485       result = expr;                                    \
6486       if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)    \
6487         backtrack_pos = 0;                              \
6488       if (result != PARSE_OPERAND_SUCCESS)              \
6489         goto failure;                                   \
6490     }                                                   \
6491   while (0)
6492
6493 #define po_barrier_or_imm(str)                             \
6494   do                                                       \
6495     {                                                      \
6496       val = parse_barrier (&str);                          \
6497       if (val == FAIL && ! ISALPHA (*str))                 \
6498         goto immediate;                                    \
6499       if (val == FAIL                                      \
6500           /* ISB can only take SY as an option.  */        \
6501           || ((inst.instruction & 0xf0) == 0x60            \
6502                && val != 0xf))                             \
6503         {                                                  \
6504            inst.error = _("invalid barrier type");         \
6505            backtrack_pos = 0;                              \
6506            goto failure;                                   \
6507         }                                                  \
6508     }                                                      \
6509   while (0)
6510
6511   skip_whitespace (str);
6512
6513   for (i = 0; upat[i] != OP_stop; i++)
6514     {
6515       op_parse_code = upat[i];
6516       if (op_parse_code >= 1<<16)
6517         op_parse_code = thumb ? (op_parse_code >> 16)
6518                                 : (op_parse_code & ((1<<16)-1));
6519
6520       if (op_parse_code >= OP_FIRST_OPTIONAL)
6521         {
6522           /* Remember where we are in case we need to backtrack.  */
6523           gas_assert (!backtrack_pos);
6524           backtrack_pos = str;
6525           backtrack_error = inst.error;
6526           backtrack_index = i;
6527         }
6528
6529       if (i > 0 && (i > 1 || inst.operands[0].present))
6530         po_char_or_fail (',');
6531
6532       switch (op_parse_code)
6533         {
6534           /* Registers */
6535         case OP_oRRnpc:
6536         case OP_oRRnpcsp:
6537         case OP_RRnpc:
6538         case OP_RRnpcsp:
6539         case OP_oRR:
6540         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
6541         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
6542         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
6543         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
6544         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
6545         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
6546         case OP_oRND:
6547         case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);     break;
6548         case OP_RVC:
6549           po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6550           break;
6551           /* Also accept generic coprocessor regs for unknown registers.  */
6552           coproc_reg:
6553           po_reg_or_fail (REG_TYPE_CN);
6554           break;
6555         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
6556         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
6557         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
6558         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
6559         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
6560         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
6561         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
6562         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
6563         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
6564         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
6565         case OP_oRNQ:
6566         case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
6567         case OP_oRNDQ:
6568         case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
6569         case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
6570         case OP_oRNSDQ:
6571         case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
6572
6573         /* Neon scalar. Using an element size of 8 means that some invalid
6574            scalars are accepted here, so deal with those in later code.  */
6575         case OP_RNSC:  po_scalar_or_goto (8, failure);    break;
6576
6577         case OP_RNDQ_I0:
6578           {
6579             po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6580             break;
6581             try_imm0:
6582             po_imm_or_fail (0, 0, TRUE);
6583           }
6584           break;
6585
6586         case OP_RVSD_I0:
6587           po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6588           break;
6589
6590         case OP_RR_RNSC:
6591           {
6592             po_scalar_or_goto (8, try_rr);
6593             break;
6594             try_rr:
6595             po_reg_or_fail (REG_TYPE_RN);
6596           }
6597           break;
6598
6599         case OP_RNSDQ_RNSC:
6600           {
6601             po_scalar_or_goto (8, try_nsdq);
6602             break;
6603             try_nsdq:
6604             po_reg_or_fail (REG_TYPE_NSDQ);
6605           }
6606           break;
6607
6608         case OP_RNDQ_RNSC:
6609           {
6610             po_scalar_or_goto (8, try_ndq);
6611             break;
6612             try_ndq:
6613             po_reg_or_fail (REG_TYPE_NDQ);
6614           }
6615           break;
6616
6617         case OP_RND_RNSC:
6618           {
6619             po_scalar_or_goto (8, try_vfd);
6620             break;
6621             try_vfd:
6622             po_reg_or_fail (REG_TYPE_VFD);
6623           }
6624           break;
6625
6626         case OP_VMOV:
6627           /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6628              not careful then bad things might happen.  */
6629           po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6630           break;
6631
6632         case OP_RNDQ_Ibig:
6633           {
6634             po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
6635             break;
6636             try_immbig:
6637             /* There's a possibility of getting a 64-bit immediate here, so
6638                we need special handling.  */
6639             if (parse_big_immediate (&str, i) == FAIL)
6640               {
6641                 inst.error = _("immediate value is out of range");
6642                 goto failure;
6643               }
6644           }
6645           break;
6646
6647         case OP_RNDQ_I63b:
6648           {
6649             po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6650             break;
6651             try_shimm:
6652             po_imm_or_fail (0, 63, TRUE);
6653           }
6654           break;
6655
6656         case OP_RRnpcb:
6657           po_char_or_fail ('[');
6658           po_reg_or_fail  (REG_TYPE_RN);
6659           po_char_or_fail (']');
6660           break;
6661
6662         case OP_RRnpctw:
6663         case OP_RRw:
6664         case OP_oRRw:
6665           po_reg_or_fail (REG_TYPE_RN);
6666           if (skip_past_char (&str, '!') == SUCCESS)
6667             inst.operands[i].writeback = 1;
6668           break;
6669
6670           /* Immediates */
6671         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
6672         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
6673         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
6674         case OP_I16z:    po_imm_or_fail (  0,     16, FALSE);   break;
6675         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
6676         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
6677         case OP_I32z:    po_imm_or_fail (  0,     32, FALSE);   break;
6678         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
6679         case OP_I63:     po_imm_or_fail (  0,     63, FALSE);   break;
6680         case OP_I64:     po_imm_or_fail (  1,     64, FALSE);   break;
6681         case OP_I64z:    po_imm_or_fail (  0,     64, FALSE);   break;
6682         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
6683
6684         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
6685         case OP_oI7b:
6686         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
6687         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
6688         case OP_oI31b:
6689         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
6690         case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
6691         case OP_oI32z:   po_imm_or_fail (  0,     32, TRUE);    break;
6692         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
6693
6694           /* Immediate variants */
6695         case OP_oI255c:
6696           po_char_or_fail ('{');
6697           po_imm_or_fail (0, 255, TRUE);
6698           po_char_or_fail ('}');
6699           break;
6700
6701         case OP_I31w:
6702           /* The expression parser chokes on a trailing !, so we have
6703              to find it first and zap it.  */
6704           {
6705             char *s = str;
6706             while (*s && *s != ',')
6707               s++;
6708             if (s[-1] == '!')
6709               {
6710                 s[-1] = '\0';
6711                 inst.operands[i].writeback = 1;
6712               }
6713             po_imm_or_fail (0, 31, TRUE);
6714             if (str == s - 1)
6715               str = s;
6716           }
6717           break;
6718
6719           /* Expressions */
6720         case OP_EXPi:   EXPi:
6721           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6722                                               GE_OPT_PREFIX));
6723           break;
6724
6725         case OP_EXP:
6726           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6727                                               GE_NO_PREFIX));
6728           break;
6729
6730         case OP_EXPr:   EXPr:
6731           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6732                                               GE_NO_PREFIX));
6733           if (inst.reloc.exp.X_op == O_symbol)
6734             {
6735               val = parse_reloc (&str);
6736               if (val == -1)
6737                 {
6738                   inst.error = _("unrecognized relocation suffix");
6739                   goto failure;
6740                 }
6741               else if (val != BFD_RELOC_UNUSED)
6742                 {
6743                   inst.operands[i].imm = val;
6744                   inst.operands[i].hasreloc = 1;
6745                 }
6746             }
6747           break;
6748
6749           /* Operand for MOVW or MOVT.  */
6750         case OP_HALF:
6751           po_misc_or_fail (parse_half (&str));
6752           break;
6753
6754           /* Register or expression.  */
6755         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6756         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
6757
6758           /* Register or immediate.  */
6759         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
6760         I0:               po_imm_or_fail (0, 0, FALSE);       break;
6761
6762         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
6763         IF:
6764           if (!is_immediate_prefix (*str))
6765             goto bad_args;
6766           str++;
6767           val = parse_fpa_immediate (&str);
6768           if (val == FAIL)
6769             goto failure;
6770           /* FPA immediates are encoded as registers 8-15.
6771              parse_fpa_immediate has already applied the offset.  */
6772           inst.operands[i].reg = val;
6773           inst.operands[i].isreg = 1;
6774           break;
6775
6776         case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6777         I32z:             po_imm_or_fail (0, 32, FALSE);          break;
6778
6779           /* Two kinds of register.  */
6780         case OP_RIWR_RIWC:
6781           {
6782             struct reg_entry *rege = arm_reg_parse_multi (&str);
6783             if (!rege
6784                 || (rege->type != REG_TYPE_MMXWR
6785                     && rege->type != REG_TYPE_MMXWC
6786                     && rege->type != REG_TYPE_MMXWCG))
6787               {
6788                 inst.error = _("iWMMXt data or control register expected");
6789                 goto failure;
6790               }
6791             inst.operands[i].reg = rege->number;
6792             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6793           }
6794           break;
6795
6796         case OP_RIWC_RIWG:
6797           {
6798             struct reg_entry *rege = arm_reg_parse_multi (&str);
6799             if (!rege
6800                 || (rege->type != REG_TYPE_MMXWC
6801                     && rege->type != REG_TYPE_MMXWCG))
6802               {
6803                 inst.error = _("iWMMXt control register expected");
6804                 goto failure;
6805               }
6806             inst.operands[i].reg = rege->number;
6807             inst.operands[i].isreg = 1;
6808           }
6809           break;
6810
6811           /* Misc */
6812         case OP_CPSF:    val = parse_cps_flags (&str);          break;
6813         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
6814         case OP_oROR:    val = parse_ror (&str);                break;
6815         case OP_COND:    val = parse_cond (&str);               break;
6816         case OP_oBARRIER_I15:
6817           po_barrier_or_imm (str); break;
6818           immediate:
6819           if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
6820             goto failure;
6821           break;
6822
6823         case OP_wPSR:
6824         case OP_rPSR:
6825           po_reg_or_goto (REG_TYPE_RNB, try_psr);
6826           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
6827             {
6828               inst.error = _("Banked registers are not available with this "
6829                              "architecture.");
6830               goto failure;
6831             }
6832           break;
6833           try_psr:
6834           val = parse_psr (&str, op_parse_code == OP_wPSR);
6835           break;
6836
6837         case OP_APSR_RR:
6838           po_reg_or_goto (REG_TYPE_RN, try_apsr);
6839           break;
6840           try_apsr:
6841           /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6842              instruction).  */
6843           if (strncasecmp (str, "APSR_", 5) == 0)
6844             {
6845               unsigned found = 0;
6846               str += 5;
6847               while (found < 15)
6848                 switch (*str++)
6849                   {
6850                   case 'c': found = (found & 1) ? 16 : found | 1; break;
6851                   case 'n': found = (found & 2) ? 16 : found | 2; break;
6852                   case 'z': found = (found & 4) ? 16 : found | 4; break;
6853                   case 'v': found = (found & 8) ? 16 : found | 8; break;
6854                   default: found = 16;
6855                   }
6856               if (found != 15)
6857                 goto failure;
6858               inst.operands[i].isvec = 1;
6859               /* APSR_nzcv is encoded in instructions as if it were the REG_PC.  */
6860               inst.operands[i].reg = REG_PC;
6861             }
6862           else
6863             goto failure;
6864           break;
6865
6866         case OP_TB:
6867           po_misc_or_fail (parse_tb (&str));
6868           break;
6869
6870           /* Register lists.  */
6871         case OP_REGLST:
6872           val = parse_reg_list (&str);
6873           if (*str == '^')
6874             {
6875               inst.operands[1].writeback = 1;
6876               str++;
6877             }
6878           break;
6879
6880         case OP_VRSLST:
6881           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
6882           break;
6883
6884         case OP_VRDLST:
6885           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
6886           break;
6887
6888         case OP_VRSDLST:
6889           /* Allow Q registers too.  */
6890           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6891                                     REGLIST_NEON_D);
6892           if (val == FAIL)
6893             {
6894               inst.error = NULL;
6895               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6896                                         REGLIST_VFP_S);
6897               inst.operands[i].issingle = 1;
6898             }
6899           break;
6900
6901         case OP_NRDLST:
6902           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6903                                     REGLIST_NEON_D);
6904           break;
6905
6906         case OP_NSTRLST:
6907           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6908                                            &inst.operands[i].vectype);
6909           break;
6910
6911           /* Addressing modes */
6912         case OP_ADDR:
6913           po_misc_or_fail (parse_address (&str, i));
6914           break;
6915
6916         case OP_ADDRGLDR:
6917           po_misc_or_fail_no_backtrack (
6918             parse_address_group_reloc (&str, i, GROUP_LDR));
6919           break;
6920
6921         case OP_ADDRGLDRS:
6922           po_misc_or_fail_no_backtrack (
6923             parse_address_group_reloc (&str, i, GROUP_LDRS));
6924           break;
6925
6926         case OP_ADDRGLDC:
6927           po_misc_or_fail_no_backtrack (
6928             parse_address_group_reloc (&str, i, GROUP_LDC));
6929           break;
6930
6931         case OP_SH:
6932           po_misc_or_fail (parse_shifter_operand (&str, i));
6933           break;
6934
6935         case OP_SHG:
6936           po_misc_or_fail_no_backtrack (
6937             parse_shifter_operand_group_reloc (&str, i));
6938           break;
6939
6940         case OP_oSHll:
6941           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6942           break;
6943
6944         case OP_oSHar:
6945           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6946           break;
6947
6948         case OP_oSHllar:
6949           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6950           break;
6951
6952         default:
6953           as_fatal (_("unhandled operand code %d"), op_parse_code);
6954         }
6955
6956       /* Various value-based sanity checks and shared operations.  We
6957          do not signal immediate failures for the register constraints;
6958          this allows a syntax error to take precedence.  */
6959       switch (op_parse_code)
6960         {
6961         case OP_oRRnpc:
6962         case OP_RRnpc:
6963         case OP_RRnpcb:
6964         case OP_RRw:
6965         case OP_oRRw:
6966         case OP_RRnpc_I0:
6967           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6968             inst.error = BAD_PC;
6969           break;
6970
6971         case OP_oRRnpcsp:
6972         case OP_RRnpcsp:
6973           if (inst.operands[i].isreg)
6974             {
6975               if (inst.operands[i].reg == REG_PC)
6976                 inst.error = BAD_PC;
6977               else if (inst.operands[i].reg == REG_SP)
6978                 inst.error = BAD_SP;
6979             }
6980           break;
6981
6982         case OP_RRnpctw:
6983           if (inst.operands[i].isreg
6984               && inst.operands[i].reg == REG_PC
6985               && (inst.operands[i].writeback || thumb))
6986             inst.error = BAD_PC;
6987           break;
6988
6989         case OP_CPSF:
6990         case OP_ENDI:
6991         case OP_oROR:
6992         case OP_wPSR:
6993         case OP_rPSR:
6994         case OP_COND:
6995         case OP_oBARRIER_I15:
6996         case OP_REGLST:
6997         case OP_VRSLST:
6998         case OP_VRDLST:
6999         case OP_VRSDLST:
7000         case OP_NRDLST:
7001         case OP_NSTRLST:
7002           if (val == FAIL)
7003             goto failure;
7004           inst.operands[i].imm = val;
7005           break;
7006
7007         default:
7008           break;
7009         }
7010
7011       /* If we get here, this operand was successfully parsed.  */
7012       inst.operands[i].present = 1;
7013       continue;
7014
7015     bad_args:
7016       inst.error = BAD_ARGS;
7017
7018     failure:
7019       if (!backtrack_pos)
7020         {
7021           /* The parse routine should already have set inst.error, but set a
7022              default here just in case.  */
7023           if (!inst.error)
7024             inst.error = _("syntax error");
7025           return FAIL;
7026         }
7027
7028       /* Do not backtrack over a trailing optional argument that
7029          absorbed some text.  We will only fail again, with the
7030          'garbage following instruction' error message, which is
7031          probably less helpful than the current one.  */
7032       if (backtrack_index == i && backtrack_pos != str
7033           && upat[i+1] == OP_stop)
7034         {
7035           if (!inst.error)
7036             inst.error = _("syntax error");
7037           return FAIL;
7038         }
7039
7040       /* Try again, skipping the optional argument at backtrack_pos.  */
7041       str = backtrack_pos;
7042       inst.error = backtrack_error;
7043       inst.operands[backtrack_index].present = 0;
7044       i = backtrack_index;
7045       backtrack_pos = 0;
7046     }
7047
7048   /* Check that we have parsed all the arguments.  */
7049   if (*str != '\0' && !inst.error)
7050     inst.error = _("garbage following instruction");
7051
7052   return inst.error ? FAIL : SUCCESS;
7053 }
7054
7055 #undef po_char_or_fail
7056 #undef po_reg_or_fail
7057 #undef po_reg_or_goto
7058 #undef po_imm_or_fail
7059 #undef po_scalar_or_fail
7060 #undef po_barrier_or_imm
7061
7062 /* Shorthand macro for instruction encoding functions issuing errors.  */
7063 #define constraint(expr, err)                   \
7064   do                                            \
7065     {                                           \
7066       if (expr)                                 \
7067         {                                       \
7068           inst.error = err;                     \
7069           return;                               \
7070         }                                       \
7071     }                                           \
7072   while (0)
7073
7074 /* Reject "bad registers" for Thumb-2 instructions.  Many Thumb-2
7075    instructions are unpredictable if these registers are used.  This
7076    is the BadReg predicate in ARM's Thumb-2 documentation.  */
7077 #define reject_bad_reg(reg)                             \
7078   do                                                    \
7079    if (reg == REG_SP || reg == REG_PC)                  \
7080      {                                                  \
7081        inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC;  \
7082        return;                                          \
7083      }                                                  \
7084   while (0)
7085
7086 /* If REG is R13 (the stack pointer), warn that its use is
7087    deprecated.  */
7088 #define warn_deprecated_sp(reg)                 \
7089   do                                            \
7090     if (warn_on_deprecated && reg == REG_SP)    \
7091        as_warn (_("use of r13 is deprecated")); \
7092   while (0)
7093
7094 /* Functions for operand encoding.  ARM, then Thumb.  */
7095
7096 #define rotate_left(v, n) (v << n | v >> (32 - n))
7097
7098 /* If VAL can be encoded in the immediate field of an ARM instruction,
7099    return the encoded form.  Otherwise, return FAIL.  */
7100
7101 static unsigned int
7102 encode_arm_immediate (unsigned int val)
7103 {
7104   unsigned int a, i;
7105
7106   for (i = 0; i < 32; i += 2)
7107     if ((a = rotate_left (val, i)) <= 0xff)
7108       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
7109
7110   return FAIL;
7111 }
7112
7113 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
7114    return the encoded form.  Otherwise, return FAIL.  */
7115 static unsigned int
7116 encode_thumb32_immediate (unsigned int val)
7117 {
7118   unsigned int a, i;
7119
7120   if (val <= 0xff)
7121     return val;
7122
7123   for (i = 1; i <= 24; i++)
7124     {
7125       a = val >> i;
7126       if ((val & ~(0xff << i)) == 0)
7127         return ((val >> i) & 0x7f) | ((32 - i) << 7);
7128     }
7129
7130   a = val & 0xff;
7131   if (val == ((a << 16) | a))
7132     return 0x100 | a;
7133   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
7134     return 0x300 | a;
7135
7136   a = val & 0xff00;
7137   if (val == ((a << 16) | a))
7138     return 0x200 | (a >> 8);
7139
7140   return FAIL;
7141 }
7142 /* Encode a VFP SP or DP register number into inst.instruction.  */
7143
7144 static void
7145 encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
7146 {
7147   if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
7148       && reg > 15)
7149     {
7150       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
7151         {
7152           if (thumb_mode)
7153             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
7154                                     fpu_vfp_ext_d32);
7155           else
7156             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
7157                                     fpu_vfp_ext_d32);
7158         }
7159       else
7160         {
7161           first_error (_("D register out of range for selected VFP version"));
7162           return;
7163         }
7164     }
7165
7166   switch (pos)
7167     {
7168     case VFP_REG_Sd:
7169       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
7170       break;
7171
7172     case VFP_REG_Sn:
7173       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
7174       break;
7175
7176     case VFP_REG_Sm:
7177       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
7178       break;
7179
7180     case VFP_REG_Dd:
7181       inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
7182       break;
7183
7184     case VFP_REG_Dn:
7185       inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
7186       break;
7187
7188     case VFP_REG_Dm:
7189       inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
7190       break;
7191
7192     default:
7193       abort ();
7194     }
7195 }
7196
7197 /* Encode a <shift> in an ARM-format instruction.  The immediate,
7198    if any, is handled by md_apply_fix.   */
7199 static void
7200 encode_arm_shift (int i)
7201 {
7202   if (inst.operands[i].shift_kind == SHIFT_RRX)
7203     inst.instruction |= SHIFT_ROR << 5;
7204   else
7205     {
7206       inst.instruction |= inst.operands[i].shift_kind << 5;
7207       if (inst.operands[i].immisreg)
7208         {
7209           inst.instruction |= SHIFT_BY_REG;
7210           inst.instruction |= inst.operands[i].imm << 8;
7211         }
7212       else
7213         inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7214     }
7215 }
7216
7217 static void
7218 encode_arm_shifter_operand (int i)
7219 {
7220   if (inst.operands[i].isreg)
7221     {
7222       inst.instruction |= inst.operands[i].reg;
7223       encode_arm_shift (i);
7224     }
7225   else
7226     {
7227       inst.instruction |= INST_IMMEDIATE;
7228       if (inst.reloc.type != BFD_RELOC_ARM_IMMEDIATE)
7229         inst.instruction |= inst.operands[i].imm;
7230     }
7231 }
7232
7233 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
7234 static void
7235 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
7236 {
7237   /* PR 14260:
7238      Generate an error if the operand is not a register.  */
7239   constraint (!inst.operands[i].isreg,
7240               _("Instruction does not support =N addresses"));
7241
7242   inst.instruction |= inst.operands[i].reg << 16;
7243
7244   if (inst.operands[i].preind)
7245     {
7246       if (is_t)
7247         {
7248           inst.error = _("instruction does not accept preindexed addressing");
7249           return;
7250         }
7251       inst.instruction |= PRE_INDEX;
7252       if (inst.operands[i].writeback)
7253         inst.instruction |= WRITE_BACK;
7254
7255     }
7256   else if (inst.operands[i].postind)
7257     {
7258       gas_assert (inst.operands[i].writeback);
7259       if (is_t)
7260         inst.instruction |= WRITE_BACK;
7261     }
7262   else /* unindexed - only for coprocessor */
7263     {
7264       inst.error = _("instruction does not accept unindexed addressing");
7265       return;
7266     }
7267
7268   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
7269       && (((inst.instruction & 0x000f0000) >> 16)
7270           == ((inst.instruction & 0x0000f000) >> 12)))
7271     as_warn ((inst.instruction & LOAD_BIT)
7272              ? _("destination register same as write-back base")
7273              : _("source register same as write-back base"));
7274 }
7275
7276 /* inst.operands[i] was set up by parse_address.  Encode it into an
7277    ARM-format mode 2 load or store instruction.  If is_t is true,
7278    reject forms that cannot be used with a T instruction (i.e. not
7279    post-indexed).  */
7280 static void
7281 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
7282 {
7283   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
7284
7285   encode_arm_addr_mode_common (i, is_t);
7286
7287   if (inst.operands[i].immisreg)
7288     {
7289       constraint ((inst.operands[i].imm == REG_PC
7290                    || (is_pc && inst.operands[i].writeback)),
7291                   BAD_PC_ADDRESSING);
7292       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
7293       inst.instruction |= inst.operands[i].imm;
7294       if (!inst.operands[i].negative)
7295         inst.instruction |= INDEX_UP;
7296       if (inst.operands[i].shifted)
7297         {
7298           if (inst.operands[i].shift_kind == SHIFT_RRX)
7299             inst.instruction |= SHIFT_ROR << 5;
7300           else
7301             {
7302               inst.instruction |= inst.operands[i].shift_kind << 5;
7303               inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7304             }
7305         }
7306     }
7307   else /* immediate offset in inst.reloc */
7308     {
7309       if (is_pc && !inst.reloc.pc_rel)
7310         {
7311           const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
7312
7313           /* If is_t is TRUE, it's called from do_ldstt.  ldrt/strt
7314              cannot use PC in addressing.
7315              PC cannot be used in writeback addressing, either.  */
7316           constraint ((is_t || inst.operands[i].writeback),
7317                       BAD_PC_ADDRESSING);
7318
7319           /* Use of PC in str is deprecated for ARMv7.  */
7320           if (warn_on_deprecated
7321               && !is_load
7322               && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
7323             as_warn (_("use of PC in this instruction is deprecated"));
7324         }
7325
7326       if (inst.reloc.type == BFD_RELOC_UNUSED)
7327         {
7328           /* Prefer + for zero encoded value.  */
7329           if (!inst.operands[i].negative)
7330             inst.instruction |= INDEX_UP;
7331           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
7332         }
7333     }
7334 }
7335
7336 /* inst.operands[i] was set up by parse_address.  Encode it into an
7337    ARM-format mode 3 load or store instruction.  Reject forms that
7338    cannot be used with such instructions.  If is_t is true, reject
7339    forms that cannot be used with a T instruction (i.e. not
7340    post-indexed).  */
7341 static void
7342 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
7343 {
7344   if (inst.operands[i].immisreg && inst.operands[i].shifted)
7345     {
7346       inst.error = _("instruction does not accept scaled register index");
7347       return;
7348     }
7349
7350   encode_arm_addr_mode_common (i, is_t);
7351
7352   if (inst.operands[i].immisreg)
7353     {
7354       constraint ((inst.operands[i].imm == REG_PC
7355                    || (is_t && inst.operands[i].reg == REG_PC)),
7356                   BAD_PC_ADDRESSING);
7357       constraint (inst.operands[i].reg == REG_PC && inst.operands[i].writeback,
7358                   BAD_PC_WRITEBACK);
7359       inst.instruction |= inst.operands[i].imm;
7360       if (!inst.operands[i].negative)
7361         inst.instruction |= INDEX_UP;
7362     }
7363   else /* immediate offset in inst.reloc */
7364     {
7365       constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
7366                    && inst.operands[i].writeback),
7367                   BAD_PC_WRITEBACK);
7368       inst.instruction |= HWOFFSET_IMM;
7369       if (inst.reloc.type == BFD_RELOC_UNUSED)
7370         {
7371           /* Prefer + for zero encoded value.  */
7372           if (!inst.operands[i].negative)
7373             inst.instruction |= INDEX_UP;
7374
7375           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
7376         }
7377     }
7378 }
7379
7380 /* inst.operands[i] was set up by parse_address.  Encode it into an
7381    ARM-format instruction.  Reject all forms which cannot be encoded
7382    into a coprocessor load/store instruction.  If wb_ok is false,
7383    reject use of writeback; if unind_ok is false, reject use of
7384    unindexed addressing.  If reloc_override is not 0, use it instead
7385    of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
7386    (in which case it is preserved).  */
7387
7388 static int
7389 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
7390 {
7391   inst.instruction |= inst.operands[i].reg << 16;
7392
7393   gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
7394
7395   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
7396     {
7397       gas_assert (!inst.operands[i].writeback);
7398       if (!unind_ok)
7399         {
7400           inst.error = _("instruction does not support unindexed addressing");
7401           return FAIL;
7402         }
7403       inst.instruction |= inst.operands[i].imm;
7404       inst.instruction |= INDEX_UP;
7405       return SUCCESS;
7406     }
7407
7408   if (inst.operands[i].preind)
7409     inst.instruction |= PRE_INDEX;
7410
7411   if (inst.operands[i].writeback)
7412     {
7413       if (inst.operands[i].reg == REG_PC)
7414         {
7415           inst.error = _("pc may not be used with write-back");
7416           return FAIL;
7417         }
7418       if (!wb_ok)
7419         {
7420           inst.error = _("instruction does not support writeback");
7421           return FAIL;
7422         }
7423       inst.instruction |= WRITE_BACK;
7424     }
7425
7426   if (reloc_override)
7427     inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
7428   else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
7429             || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
7430            && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
7431     {
7432       if (thumb_mode)
7433         inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
7434       else
7435         inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
7436     }
7437
7438   /* Prefer + for zero encoded value.  */
7439   if (!inst.operands[i].negative)
7440     inst.instruction |= INDEX_UP;
7441
7442   return SUCCESS;
7443 }
7444
7445 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
7446    Determine whether it can be performed with a move instruction; if
7447    it can, convert inst.instruction to that move instruction and
7448    return TRUE; if it can't, convert inst.instruction to a literal-pool
7449    load and return FALSE.  If this is not a valid thing to do in the
7450    current context, set inst.error and return TRUE.
7451
7452    inst.operands[i] describes the destination register.  */
7453
7454 static bfd_boolean
7455 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
7456 {
7457   unsigned long tbit;
7458
7459   if (thumb_p)
7460     tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7461   else
7462     tbit = LOAD_BIT;
7463
7464   if ((inst.instruction & tbit) == 0)
7465     {
7466       inst.error = _("invalid pseudo operation");
7467       return TRUE;
7468     }
7469   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
7470     {
7471       inst.error = _("constant expression expected");
7472       return TRUE;
7473     }
7474   if (inst.reloc.exp.X_op == O_constant)
7475     {
7476       if (thumb_p)
7477         {
7478           if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
7479             {
7480               /* This can be done with a mov(1) instruction.  */
7481               inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
7482               inst.instruction |= inst.reloc.exp.X_add_number;
7483               return TRUE;
7484             }
7485         }
7486       else
7487         {
7488           int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
7489           if (value != FAIL)
7490             {
7491               /* This can be done with a mov instruction.  */
7492               inst.instruction &= LITERAL_MASK;
7493               inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
7494               inst.instruction |= value & 0xfff;
7495               return TRUE;
7496             }
7497
7498           value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
7499           if (value != FAIL)
7500             {
7501               /* This can be done with a mvn instruction.  */
7502               inst.instruction &= LITERAL_MASK;
7503               inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
7504               inst.instruction |= value & 0xfff;
7505               return TRUE;
7506             }
7507         }
7508     }
7509
7510   if (add_to_lit_pool () == FAIL)
7511     {
7512       inst.error = _("literal pool insertion failed");
7513       return TRUE;
7514     }
7515   inst.operands[1].reg = REG_PC;
7516   inst.operands[1].isreg = 1;
7517   inst.operands[1].preind = 1;
7518   inst.reloc.pc_rel = 1;
7519   inst.reloc.type = (thumb_p
7520                      ? BFD_RELOC_ARM_THUMB_OFFSET
7521                      : (mode_3
7522                         ? BFD_RELOC_ARM_HWLITERAL
7523                         : BFD_RELOC_ARM_LITERAL));
7524   return FALSE;
7525 }
7526
7527 /* Functions for instruction encoding, sorted by sub-architecture.
7528    First some generics; their names are taken from the conventional
7529    bit positions for register arguments in ARM format instructions.  */
7530
7531 static void
7532 do_noargs (void)
7533 {
7534 }
7535
7536 static void
7537 do_rd (void)
7538 {
7539   inst.instruction |= inst.operands[0].reg << 12;
7540 }
7541
7542 static void
7543 do_rd_rm (void)
7544 {
7545   inst.instruction |= inst.operands[0].reg << 12;
7546   inst.instruction |= inst.operands[1].reg;
7547 }
7548
7549 static void
7550 do_rm_rn (void)
7551 {
7552   inst.instruction |= inst.operands[0].reg;
7553   inst.instruction |= inst.operands[1].reg << 16;
7554 }
7555
7556 static void
7557 do_rd_rn (void)
7558 {
7559   inst.instruction |= inst.operands[0].reg << 12;
7560   inst.instruction |= inst.operands[1].reg << 16;
7561 }
7562
7563 static void
7564 do_rn_rd (void)
7565 {
7566   inst.instruction |= inst.operands[0].reg << 16;
7567   inst.instruction |= inst.operands[1].reg << 12;
7568 }
7569
7570 static bfd_boolean
7571 check_obsolete (const arm_feature_set *feature, const char *msg)
7572 {
7573   if (ARM_CPU_IS_ANY (cpu_variant))
7574     {
7575       as_warn ("%s", msg);
7576       return TRUE;
7577     }
7578   else if (ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
7579     {
7580       as_bad ("%s", msg);
7581       return TRUE;
7582     }
7583
7584   return FALSE;
7585 }
7586
7587 static void
7588 do_rd_rm_rn (void)
7589 {
7590   unsigned Rn = inst.operands[2].reg;
7591   /* Enforce restrictions on SWP instruction.  */
7592   if ((inst.instruction & 0x0fbfffff) == 0x01000090)
7593     {
7594       constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
7595                   _("Rn must not overlap other operands"));
7596
7597       /* SWP{b} is obsolete for ARMv8-A, and deprecated for ARMv6* and ARMv7.
7598        */
7599       if (!check_obsolete (&arm_ext_v8,
7600                            _("swp{b} use is obsoleted for ARMv8 and later"))
7601           && warn_on_deprecated
7602           && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6))
7603         as_warn (_("swp{b} use is deprecated for ARMv6 and ARMv7"));
7604     }
7605
7606   inst.instruction |= inst.operands[0].reg << 12;
7607   inst.instruction |= inst.operands[1].reg;
7608   inst.instruction |= Rn << 16;
7609 }
7610
7611 static void
7612 do_rd_rn_rm (void)
7613 {
7614   inst.instruction |= inst.operands[0].reg << 12;
7615   inst.instruction |= inst.operands[1].reg << 16;
7616   inst.instruction |= inst.operands[2].reg;
7617 }
7618
7619 static void
7620 do_rm_rd_rn (void)
7621 {
7622   constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7623   constraint (((inst.reloc.exp.X_op != O_constant
7624                 && inst.reloc.exp.X_op != O_illegal)
7625                || inst.reloc.exp.X_add_number != 0),
7626               BAD_ADDR_MODE);
7627   inst.instruction |= inst.operands[0].reg;
7628   inst.instruction |= inst.operands[1].reg << 12;
7629   inst.instruction |= inst.operands[2].reg << 16;
7630 }
7631
7632 static void
7633 do_imm0 (void)
7634 {
7635   inst.instruction |= inst.operands[0].imm;
7636 }
7637
7638 static void
7639 do_rd_cpaddr (void)
7640 {
7641   inst.instruction |= inst.operands[0].reg << 12;
7642   encode_arm_cp_address (1, TRUE, TRUE, 0);
7643 }
7644
7645 /* ARM instructions, in alphabetical order by function name (except
7646    that wrapper functions appear immediately after the function they
7647    wrap).  */
7648
7649 /* This is a pseudo-op of the form "adr rd, label" to be converted
7650    into a relative address of the form "add rd, pc, #label-.-8".  */
7651
7652 static void
7653 do_adr (void)
7654 {
7655   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7656
7657   /* Frag hacking will turn this into a sub instruction if the offset turns
7658      out to be negative.  */
7659   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7660   inst.reloc.pc_rel = 1;
7661   inst.reloc.exp.X_add_number -= 8;
7662 }
7663
7664 /* This is a pseudo-op of the form "adrl rd, label" to be converted
7665    into a relative address of the form:
7666    add rd, pc, #low(label-.-8)"
7667    add rd, rd, #high(label-.-8)"  */
7668
7669 static void
7670 do_adrl (void)
7671 {
7672   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7673
7674   /* Frag hacking will turn this into a sub instruction if the offset turns
7675      out to be negative.  */
7676   inst.reloc.type              = BFD_RELOC_ARM_ADRL_IMMEDIATE;
7677   inst.reloc.pc_rel            = 1;
7678   inst.size                    = INSN_SIZE * 2;
7679   inst.reloc.exp.X_add_number -= 8;
7680 }
7681
7682 static void
7683 do_arit (void)
7684 {
7685   if (!inst.operands[1].present)
7686     inst.operands[1].reg = inst.operands[0].reg;
7687   inst.instruction |= inst.operands[0].reg << 12;
7688   inst.instruction |= inst.operands[1].reg << 16;
7689   encode_arm_shifter_operand (2);
7690 }
7691
7692 static void
7693 do_barrier (void)
7694 {
7695   if (inst.operands[0].present)
7696     inst.instruction |= inst.operands[0].imm;
7697   else
7698     inst.instruction |= 0xf;
7699 }
7700
7701 static void
7702 do_bfc (void)
7703 {
7704   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7705   constraint (msb > 32, _("bit-field extends past end of register"));
7706   /* The instruction encoding stores the LSB and MSB,
7707      not the LSB and width.  */
7708   inst.instruction |= inst.operands[0].reg << 12;
7709   inst.instruction |= inst.operands[1].imm << 7;
7710   inst.instruction |= (msb - 1) << 16;
7711 }
7712
7713 static void
7714 do_bfi (void)
7715 {
7716   unsigned int msb;
7717
7718   /* #0 in second position is alternative syntax for bfc, which is
7719      the same instruction but with REG_PC in the Rm field.  */
7720   if (!inst.operands[1].isreg)
7721     inst.operands[1].reg = REG_PC;
7722
7723   msb = inst.operands[2].imm + inst.operands[3].imm;
7724   constraint (msb > 32, _("bit-field extends past end of register"));
7725   /* The instruction encoding stores the LSB and MSB,
7726      not the LSB and width.  */
7727   inst.instruction |= inst.operands[0].reg << 12;
7728   inst.instruction |= inst.operands[1].reg;
7729   inst.instruction |= inst.operands[2].imm << 7;
7730   inst.instruction |= (msb - 1) << 16;
7731 }
7732
7733 static void
7734 do_bfx (void)
7735 {
7736   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7737               _("bit-field extends past end of register"));
7738   inst.instruction |= inst.operands[0].reg << 12;
7739   inst.instruction |= inst.operands[1].reg;
7740   inst.instruction |= inst.operands[2].imm << 7;
7741   inst.instruction |= (inst.operands[3].imm - 1) << 16;
7742 }
7743
7744 /* ARM V5 breakpoint instruction (argument parse)
7745      BKPT <16 bit unsigned immediate>
7746      Instruction is not conditional.
7747         The bit pattern given in insns[] has the COND_ALWAYS condition,
7748         and it is an error if the caller tried to override that.  */
7749
7750 static void
7751 do_bkpt (void)
7752 {
7753   /* Top 12 of 16 bits to bits 19:8.  */
7754   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
7755
7756   /* Bottom 4 of 16 bits to bits 3:0.  */
7757   inst.instruction |= inst.operands[0].imm & 0xf;
7758 }
7759
7760 static void
7761 encode_branch (int default_reloc)
7762 {
7763   if (inst.operands[0].hasreloc)
7764     {
7765       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
7766                   && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
7767                   _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
7768       inst.reloc.type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
7769         ? BFD_RELOC_ARM_PLT32
7770         : thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
7771     }
7772   else
7773     inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
7774   inst.reloc.pc_rel = 1;
7775 }
7776
7777 static void
7778 do_branch (void)
7779 {
7780 #ifdef OBJ_ELF
7781   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7782     encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7783   else
7784 #endif
7785     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7786 }
7787
7788 static void
7789 do_bl (void)
7790 {
7791 #ifdef OBJ_ELF
7792   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7793     {
7794       if (inst.cond == COND_ALWAYS)
7795         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7796       else
7797         encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7798     }
7799   else
7800 #endif
7801     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7802 }
7803
7804 /* ARM V5 branch-link-exchange instruction (argument parse)
7805      BLX <target_addr>          ie BLX(1)
7806      BLX{<condition>} <Rm>      ie BLX(2)
7807    Unfortunately, there are two different opcodes for this mnemonic.
7808    So, the insns[].value is not used, and the code here zaps values
7809         into inst.instruction.
7810    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
7811
7812 static void
7813 do_blx (void)
7814 {
7815   if (inst.operands[0].isreg)
7816     {
7817       /* Arg is a register; the opcode provided by insns[] is correct.
7818          It is not illegal to do "blx pc", just useless.  */
7819       if (inst.operands[0].reg == REG_PC)
7820         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
7821
7822       inst.instruction |= inst.operands[0].reg;
7823     }
7824   else
7825     {
7826       /* Arg is an address; this instruction cannot be executed
7827          conditionally, and the opcode must be adjusted.
7828          We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7829          where we generate out a BFD_RELOC_ARM_PCREL_CALL instead.  */
7830       constraint (inst.cond != COND_ALWAYS, BAD_COND);
7831       inst.instruction = 0xfa000000;
7832       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
7833     }
7834 }
7835
7836 static void
7837 do_bx (void)
7838 {
7839   bfd_boolean want_reloc;
7840
7841   if (inst.operands[0].reg == REG_PC)
7842     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
7843
7844   inst.instruction |= inst.operands[0].reg;
7845   /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7846      it is for ARMv4t or earlier.  */
7847   want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7848   if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7849       want_reloc = TRUE;
7850
7851 #ifdef OBJ_ELF
7852   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
7853 #endif
7854     want_reloc = FALSE;
7855
7856   if (want_reloc)
7857     inst.reloc.type = BFD_RELOC_ARM_V4BX;
7858 }
7859
7860
7861 /* ARM v5TEJ.  Jump to Jazelle code.  */
7862
7863 static void
7864 do_bxj (void)
7865 {
7866   if (inst.operands[0].reg == REG_PC)
7867     as_tsktsk (_("use of r15 in bxj is not really useful"));
7868
7869   inst.instruction |= inst.operands[0].reg;
7870 }
7871
7872 /* Co-processor data operation:
7873       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7874       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
7875 static void
7876 do_cdp (void)
7877 {
7878   inst.instruction |= inst.operands[0].reg << 8;
7879   inst.instruction |= inst.operands[1].imm << 20;
7880   inst.instruction |= inst.operands[2].reg << 12;
7881   inst.instruction |= inst.operands[3].reg << 16;
7882   inst.instruction |= inst.operands[4].reg;
7883   inst.instruction |= inst.operands[5].imm << 5;
7884 }
7885
7886 static void
7887 do_cmp (void)
7888 {
7889   inst.instruction |= inst.operands[0].reg << 16;
7890   encode_arm_shifter_operand (1);
7891 }
7892
7893 /* Transfer between coprocessor and ARM registers.
7894    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7895    MRC2
7896    MCR{cond}
7897    MCR2
7898
7899    No special properties.  */
7900
7901 struct deprecated_coproc_regs_s
7902 {
7903   unsigned cp;
7904   int opc1;
7905   unsigned crn;
7906   unsigned crm;
7907   int opc2;
7908   arm_feature_set deprecated;
7909   arm_feature_set obsoleted;
7910   const char *dep_msg;
7911   const char *obs_msg;
7912 };
7913
7914 #define DEPR_ACCESS_V8 \
7915   N_("This coprocessor register access is deprecated in ARMv8")
7916
7917 /* Table of all deprecated coprocessor registers.  */
7918 static struct deprecated_coproc_regs_s deprecated_coproc_regs[] =
7919 {
7920     {15, 0, 7, 10, 5,                                   /* CP15DMB.  */
7921      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7922      DEPR_ACCESS_V8, NULL},
7923     {15, 0, 7, 10, 4,                                   /* CP15DSB.  */
7924      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7925      DEPR_ACCESS_V8, NULL},
7926     {15, 0, 7,  5, 4,                                   /* CP15ISB.  */
7927      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7928      DEPR_ACCESS_V8, NULL},
7929     {14, 6, 1,  0, 0,                                   /* TEEHBR.  */
7930      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7931      DEPR_ACCESS_V8, NULL},
7932     {14, 6, 0,  0, 0,                                   /* TEECR.  */
7933      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7934      DEPR_ACCESS_V8, NULL},
7935 };
7936
7937 #undef DEPR_ACCESS_V8
7938
7939 static const size_t deprecated_coproc_reg_count =
7940   sizeof (deprecated_coproc_regs) / sizeof (deprecated_coproc_regs[0]);
7941
7942 static void
7943 do_co_reg (void)
7944 {
7945   unsigned Rd;
7946   size_t i;
7947
7948   Rd = inst.operands[2].reg;
7949   if (thumb_mode)
7950     {
7951       if (inst.instruction == 0xee000010
7952           || inst.instruction == 0xfe000010)
7953         /* MCR, MCR2  */
7954         reject_bad_reg (Rd);
7955       else
7956         /* MRC, MRC2  */
7957         constraint (Rd == REG_SP, BAD_SP);
7958     }
7959   else
7960     {
7961       /* MCR */
7962       if (inst.instruction == 0xe000010)
7963         constraint (Rd == REG_PC, BAD_PC);
7964     }
7965
7966     for (i = 0; i < deprecated_coproc_reg_count; ++i)
7967       {
7968         const struct deprecated_coproc_regs_s *r =
7969           deprecated_coproc_regs + i;
7970
7971         if (inst.operands[0].reg == r->cp
7972             && inst.operands[1].imm == r->opc1
7973             && inst.operands[3].reg == r->crn
7974             && inst.operands[4].reg == r->crm
7975             && inst.operands[5].imm == r->opc2)
7976           {
7977             if (! ARM_CPU_IS_ANY (cpu_variant)
7978                 && warn_on_deprecated
7979                 && ARM_CPU_HAS_FEATURE (cpu_variant, r->deprecated))
7980               as_warn ("%s", r->dep_msg);
7981           }
7982       }
7983
7984   inst.instruction |= inst.operands[0].reg << 8;
7985   inst.instruction |= inst.operands[1].imm << 21;
7986   inst.instruction |= Rd << 12;
7987   inst.instruction |= inst.operands[3].reg << 16;
7988   inst.instruction |= inst.operands[4].reg;
7989   inst.instruction |= inst.operands[5].imm << 5;
7990 }
7991
7992 /* Transfer between coprocessor register and pair of ARM registers.
7993    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7994    MCRR2
7995    MRRC{cond}
7996    MRRC2
7997
7998    Two XScale instructions are special cases of these:
7999
8000      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
8001      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
8002
8003    Result unpredictable if Rd or Rn is R15.  */
8004
8005 static void
8006 do_co_reg2c (void)
8007 {
8008   unsigned Rd, Rn;
8009
8010   Rd = inst.operands[2].reg;
8011   Rn = inst.operands[3].reg;
8012
8013   if (thumb_mode)
8014     {
8015       reject_bad_reg (Rd);
8016       reject_bad_reg (Rn);
8017     }
8018   else
8019     {
8020       constraint (Rd == REG_PC, BAD_PC);
8021       constraint (Rn == REG_PC, BAD_PC);
8022     }
8023
8024   inst.instruction |= inst.operands[0].reg << 8;
8025   inst.instruction |= inst.operands[1].imm << 4;
8026   inst.instruction |= Rd << 12;
8027   inst.instruction |= Rn << 16;
8028   inst.instruction |= inst.operands[4].reg;
8029 }
8030
8031 static void
8032 do_cpsi (void)
8033 {
8034   inst.instruction |= inst.operands[0].imm << 6;
8035   if (inst.operands[1].present)
8036     {
8037       inst.instruction |= CPSI_MMOD;
8038       inst.instruction |= inst.operands[1].imm;
8039     }
8040 }
8041
8042 static void
8043 do_dbg (void)
8044 {
8045   inst.instruction |= inst.operands[0].imm;
8046 }
8047
8048 static void
8049 do_div (void)
8050 {
8051   unsigned Rd, Rn, Rm;
8052
8053   Rd = inst.operands[0].reg;
8054   Rn = (inst.operands[1].present
8055         ? inst.operands[1].reg : Rd);
8056   Rm = inst.operands[2].reg;
8057
8058   constraint ((Rd == REG_PC), BAD_PC);
8059   constraint ((Rn == REG_PC), BAD_PC);
8060   constraint ((Rm == REG_PC), BAD_PC);
8061
8062   inst.instruction |= Rd << 16;
8063   inst.instruction |= Rn << 0;
8064   inst.instruction |= Rm << 8;
8065 }
8066
8067 static void
8068 do_it (void)
8069 {
8070   /* There is no IT instruction in ARM mode.  We
8071      process it to do the validation as if in
8072      thumb mode, just in case the code gets
8073      assembled for thumb using the unified syntax.  */
8074
8075   inst.size = 0;
8076   if (unified_syntax)
8077     {
8078       set_it_insn_type (IT_INSN);
8079       now_it.mask = (inst.instruction & 0xf) | 0x10;
8080       now_it.cc = inst.operands[0].imm;
8081     }
8082 }
8083
8084 /* If there is only one register in the register list,
8085    then return its register number.  Otherwise return -1.  */
8086 static int
8087 only_one_reg_in_list (int range)
8088 {
8089   int i = ffs (range) - 1;
8090   return (i > 15 || range != (1 << i)) ? -1 : i;
8091 }
8092
8093 static void
8094 encode_ldmstm(int from_push_pop_mnem)
8095 {
8096   int base_reg = inst.operands[0].reg;
8097   int range = inst.operands[1].imm;
8098   int one_reg;
8099
8100   inst.instruction |= base_reg << 16;
8101   inst.instruction |= range;
8102
8103   if (inst.operands[1].writeback)
8104     inst.instruction |= LDM_TYPE_2_OR_3;
8105
8106   if (inst.operands[0].writeback)
8107     {
8108       inst.instruction |= WRITE_BACK;
8109       /* Check for unpredictable uses of writeback.  */
8110       if (inst.instruction & LOAD_BIT)
8111         {
8112           /* Not allowed in LDM type 2.  */
8113           if ((inst.instruction & LDM_TYPE_2_OR_3)
8114               && ((range & (1 << REG_PC)) == 0))
8115             as_warn (_("writeback of base register is UNPREDICTABLE"));
8116           /* Only allowed if base reg not in list for other types.  */
8117           else if (range & (1 << base_reg))
8118             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
8119         }
8120       else /* STM.  */
8121         {
8122           /* Not allowed for type 2.  */
8123           if (inst.instruction & LDM_TYPE_2_OR_3)
8124             as_warn (_("writeback of base register is UNPREDICTABLE"));
8125           /* Only allowed if base reg not in list, or first in list.  */
8126           else if ((range & (1 << base_reg))
8127                    && (range & ((1 << base_reg) - 1)))
8128             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
8129         }
8130     }
8131
8132   /* If PUSH/POP has only one register, then use the A2 encoding.  */
8133   one_reg = only_one_reg_in_list (range);
8134   if (from_push_pop_mnem && one_reg >= 0)
8135     {
8136       int is_push = (inst.instruction & A_PUSH_POP_OP_MASK) == A1_OPCODE_PUSH;
8137
8138       inst.instruction &= A_COND_MASK;
8139       inst.instruction |= is_push ? A2_OPCODE_PUSH : A2_OPCODE_POP;
8140       inst.instruction |= one_reg << 12;
8141     }
8142 }
8143
8144 static void
8145 do_ldmstm (void)
8146 {
8147   encode_ldmstm (/*from_push_pop_mnem=*/FALSE);
8148 }
8149
8150 /* ARMv5TE load-consecutive (argument parse)
8151    Mode is like LDRH.
8152
8153      LDRccD R, mode
8154      STRccD R, mode.  */
8155
8156 static void
8157 do_ldrd (void)
8158 {
8159   constraint (inst.operands[0].reg % 2 != 0,
8160               _("first transfer register must be even"));
8161   constraint (inst.operands[1].present
8162               && inst.operands[1].reg != inst.operands[0].reg + 1,
8163               _("can only transfer two consecutive registers"));
8164   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
8165   constraint (!inst.operands[2].isreg, _("'[' expected"));
8166
8167   if (!inst.operands[1].present)
8168     inst.operands[1].reg = inst.operands[0].reg + 1;
8169
8170   /* encode_arm_addr_mode_3 will diagnose overlap between the base
8171      register and the first register written; we have to diagnose
8172      overlap between the base and the second register written here.  */
8173
8174   if (inst.operands[2].reg == inst.operands[1].reg
8175       && (inst.operands[2].writeback || inst.operands[2].postind))
8176     as_warn (_("base register written back, and overlaps "
8177                "second transfer register"));
8178
8179   if (!(inst.instruction & V4_STR_BIT))
8180     {
8181       /* For an index-register load, the index register must not overlap the
8182         destination (even if not write-back).  */
8183       if (inst.operands[2].immisreg
8184               && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
8185               || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
8186         as_warn (_("index register overlaps transfer register"));
8187     }
8188   inst.instruction |= inst.operands[0].reg << 12;
8189   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
8190 }
8191
8192 static void
8193 do_ldrex (void)
8194 {
8195   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
8196               || inst.operands[1].postind || inst.operands[1].writeback
8197               || inst.operands[1].immisreg || inst.operands[1].shifted
8198               || inst.operands[1].negative
8199               /* This can arise if the programmer has written
8200                    strex rN, rM, foo
8201                  or if they have mistakenly used a register name as the last
8202                  operand,  eg:
8203                    strex rN, rM, rX
8204                  It is very difficult to distinguish between these two cases
8205                  because "rX" might actually be a label. ie the register
8206                  name has been occluded by a symbol of the same name. So we
8207                  just generate a general 'bad addressing mode' type error
8208                  message and leave it up to the programmer to discover the
8209                  true cause and fix their mistake.  */
8210               || (inst.operands[1].reg == REG_PC),
8211               BAD_ADDR_MODE);
8212
8213   constraint (inst.reloc.exp.X_op != O_constant
8214               || inst.reloc.exp.X_add_number != 0,
8215               _("offset must be zero in ARM encoding"));
8216
8217   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
8218
8219   inst.instruction |= inst.operands[0].reg << 12;
8220   inst.instruction |= inst.operands[1].reg << 16;
8221   inst.reloc.type = BFD_RELOC_UNUSED;
8222 }
8223
8224 static void
8225 do_ldrexd (void)
8226 {
8227   constraint (inst.operands[0].reg % 2 != 0,
8228               _("even register required"));
8229   constraint (inst.operands[1].present
8230               && inst.operands[1].reg != inst.operands[0].reg + 1,
8231               _("can only load two consecutive registers"));
8232   /* If op 1 were present and equal to PC, this function wouldn't
8233      have been called in the first place.  */
8234   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
8235
8236   inst.instruction |= inst.operands[0].reg << 12;
8237   inst.instruction |= inst.operands[2].reg << 16;
8238 }
8239
8240 /* In both ARM and thumb state 'ldr pc, #imm'  with an immediate
8241    which is not a multiple of four is UNPREDICTABLE.  */
8242 static void
8243 check_ldr_r15_aligned (void)
8244 {
8245   constraint (!(inst.operands[1].immisreg)
8246               && (inst.operands[0].reg == REG_PC
8247               && inst.operands[1].reg == REG_PC
8248               && (inst.reloc.exp.X_add_number & 0x3)),
8249               _("ldr to register 15 must be 4-byte alligned"));
8250 }
8251
8252 static void
8253 do_ldst (void)
8254 {
8255   inst.instruction |= inst.operands[0].reg << 12;
8256   if (!inst.operands[1].isreg)
8257     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
8258       return;
8259   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
8260   check_ldr_r15_aligned ();
8261 }
8262
8263 static void
8264 do_ldstt (void)
8265 {
8266   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
8267      reject [Rn,...].  */
8268   if (inst.operands[1].preind)
8269     {
8270       constraint (inst.reloc.exp.X_op != O_constant
8271                   || inst.reloc.exp.X_add_number != 0,
8272                   _("this instruction requires a post-indexed address"));
8273
8274       inst.operands[1].preind = 0;
8275       inst.operands[1].postind = 1;
8276       inst.operands[1].writeback = 1;
8277     }
8278   inst.instruction |= inst.operands[0].reg << 12;
8279   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
8280 }
8281
8282 /* Halfword and signed-byte load/store operations.  */
8283
8284 static void
8285 do_ldstv4 (void)
8286 {
8287   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
8288   inst.instruction |= inst.operands[0].reg << 12;
8289   if (!inst.operands[1].isreg)
8290     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
8291       return;
8292   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
8293 }
8294
8295 static void
8296 do_ldsttv4 (void)
8297 {
8298   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
8299      reject [Rn,...].  */
8300   if (inst.operands[1].preind)
8301     {
8302       constraint (inst.reloc.exp.X_op != O_constant
8303                   || inst.reloc.exp.X_add_number != 0,
8304                   _("this instruction requires a post-indexed address"));
8305
8306       inst.operands[1].preind = 0;
8307       inst.operands[1].postind = 1;
8308       inst.operands[1].writeback = 1;
8309     }
8310   inst.instruction |= inst.operands[0].reg << 12;
8311   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
8312 }
8313
8314 /* Co-processor register load/store.
8315    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
8316 static void
8317 do_lstc (void)
8318 {
8319   inst.instruction |= inst.operands[0].reg << 8;
8320   inst.instruction |= inst.operands[1].reg << 12;
8321   encode_arm_cp_address (2, TRUE, TRUE, 0);
8322 }
8323
8324 static void
8325 do_mlas (void)
8326 {
8327   /* This restriction does not apply to mls (nor to mla in v6 or later).  */
8328   if (inst.operands[0].reg == inst.operands[1].reg
8329       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
8330       && !(inst.instruction & 0x00400000))
8331     as_tsktsk (_("Rd and Rm should be different in mla"));
8332
8333   inst.instruction |= inst.operands[0].reg << 16;
8334   inst.instruction |= inst.operands[1].reg;
8335   inst.instruction |= inst.operands[2].reg << 8;
8336   inst.instruction |= inst.operands[3].reg << 12;
8337 }
8338
8339 static void
8340 do_mov (void)
8341 {
8342   inst.instruction |= inst.operands[0].reg << 12;
8343   encode_arm_shifter_operand (1);
8344 }
8345
8346 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
8347 static void
8348 do_mov16 (void)
8349 {
8350   bfd_vma imm;
8351   bfd_boolean top;
8352
8353   top = (inst.instruction & 0x00400000) != 0;
8354   constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
8355               _(":lower16: not allowed this instruction"));
8356   constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
8357               _(":upper16: not allowed instruction"));
8358   inst.instruction |= inst.operands[0].reg << 12;
8359   if (inst.reloc.type == BFD_RELOC_UNUSED)
8360     {
8361       imm = inst.reloc.exp.X_add_number;
8362       /* The value is in two pieces: 0:11, 16:19.  */
8363       inst.instruction |= (imm & 0x00000fff);
8364       inst.instruction |= (imm & 0x0000f000) << 4;
8365     }
8366 }
8367
8368 static void do_vfp_nsyn_opcode (const char *);
8369
8370 static int
8371 do_vfp_nsyn_mrs (void)
8372 {
8373   if (inst.operands[0].isvec)
8374     {
8375       if (inst.operands[1].reg != 1)
8376         first_error (_("operand 1 must be FPSCR"));
8377       memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
8378       memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
8379       do_vfp_nsyn_opcode ("fmstat");
8380     }
8381   else if (inst.operands[1].isvec)
8382     do_vfp_nsyn_opcode ("fmrx");
8383   else
8384     return FAIL;
8385
8386   return SUCCESS;
8387 }
8388
8389 static int
8390 do_vfp_nsyn_msr (void)
8391 {
8392   if (inst.operands[0].isvec)
8393     do_vfp_nsyn_opcode ("fmxr");
8394   else
8395     return FAIL;
8396
8397   return SUCCESS;
8398 }
8399
8400 static void
8401 do_vmrs (void)
8402 {
8403   unsigned Rt = inst.operands[0].reg;
8404
8405   if (thumb_mode && Rt == REG_SP)
8406     {
8407       inst.error = BAD_SP;
8408       return;
8409     }
8410
8411   /* APSR_ sets isvec. All other refs to PC are illegal.  */
8412   if (!inst.operands[0].isvec && Rt == REG_PC)
8413     {
8414       inst.error = BAD_PC;
8415       return;
8416     }
8417
8418   /* If we get through parsing the register name, we just insert the number
8419      generated into the instruction without further validation.  */
8420   inst.instruction |= (inst.operands[1].reg << 16);
8421   inst.instruction |= (Rt << 12);
8422 }
8423
8424 static void
8425 do_vmsr (void)
8426 {
8427   unsigned Rt = inst.operands[1].reg;
8428
8429   if (thumb_mode)
8430     reject_bad_reg (Rt);
8431   else if (Rt == REG_PC)
8432     {
8433       inst.error = BAD_PC;
8434       return;
8435     }
8436
8437   /* If we get through parsing the register name, we just insert the number
8438      generated into the instruction without further validation.  */
8439   inst.instruction |= (inst.operands[0].reg << 16);
8440   inst.instruction |= (Rt << 12);
8441 }
8442
8443 static void
8444 do_mrs (void)
8445 {
8446   unsigned br;
8447
8448   if (do_vfp_nsyn_mrs () == SUCCESS)
8449     return;
8450
8451   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
8452   inst.instruction |= inst.operands[0].reg << 12;
8453
8454   if (inst.operands[1].isreg)
8455     {
8456       br = inst.operands[1].reg;
8457       if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf000))
8458         as_bad (_("bad register for mrs"));
8459     }
8460   else
8461     {
8462       /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
8463       constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
8464                   != (PSR_c|PSR_f),
8465                   _("'APSR', 'CPSR' or 'SPSR' expected"));
8466       br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
8467     }
8468
8469   inst.instruction |= br;
8470 }
8471
8472 /* Two possible forms:
8473       "{C|S}PSR_<field>, Rm",
8474       "{C|S}PSR_f, #expression".  */
8475
8476 static void
8477 do_msr (void)
8478 {
8479   if (do_vfp_nsyn_msr () == SUCCESS)
8480     return;
8481
8482   inst.instruction |= inst.operands[0].imm;
8483   if (inst.operands[1].isreg)
8484     inst.instruction |= inst.operands[1].reg;
8485   else
8486     {
8487       inst.instruction |= INST_IMMEDIATE;
8488       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
8489       inst.reloc.pc_rel = 0;
8490     }
8491 }
8492
8493 static void
8494 do_mul (void)
8495 {
8496   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
8497
8498   if (!inst.operands[2].present)
8499     inst.operands[2].reg = inst.operands[0].reg;
8500   inst.instruction |= inst.operands[0].reg << 16;
8501   inst.instruction |= inst.operands[1].reg;
8502   inst.instruction |= inst.operands[2].reg << 8;
8503
8504   if (inst.operands[0].reg == inst.operands[1].reg
8505       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8506     as_tsktsk (_("Rd and Rm should be different in mul"));
8507 }
8508
8509 /* Long Multiply Parser
8510    UMULL RdLo, RdHi, Rm, Rs
8511    SMULL RdLo, RdHi, Rm, Rs
8512    UMLAL RdLo, RdHi, Rm, Rs
8513    SMLAL RdLo, RdHi, Rm, Rs.  */
8514
8515 static void
8516 do_mull (void)
8517 {
8518   inst.instruction |= inst.operands[0].reg << 12;
8519   inst.instruction |= inst.operands[1].reg << 16;
8520   inst.instruction |= inst.operands[2].reg;
8521   inst.instruction |= inst.operands[3].reg << 8;
8522
8523   /* rdhi and rdlo must be different.  */
8524   if (inst.operands[0].reg == inst.operands[1].reg)
8525     as_tsktsk (_("rdhi and rdlo must be different"));
8526
8527   /* rdhi, rdlo and rm must all be different before armv6.  */
8528   if ((inst.operands[0].reg == inst.operands[2].reg
8529       || inst.operands[1].reg == inst.operands[2].reg)
8530       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8531     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
8532 }
8533
8534 static void
8535 do_nop (void)
8536 {
8537   if (inst.operands[0].present
8538       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
8539     {
8540       /* Architectural NOP hints are CPSR sets with no bits selected.  */
8541       inst.instruction &= 0xf0000000;
8542       inst.instruction |= 0x0320f000;
8543       if (inst.operands[0].present)
8544         inst.instruction |= inst.operands[0].imm;
8545     }
8546 }
8547
8548 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
8549    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
8550    Condition defaults to COND_ALWAYS.
8551    Error if Rd, Rn or Rm are R15.  */
8552
8553 static void
8554 do_pkhbt (void)
8555 {
8556   inst.instruction |= inst.operands[0].reg << 12;
8557   inst.instruction |= inst.operands[1].reg << 16;
8558   inst.instruction |= inst.operands[2].reg;
8559   if (inst.operands[3].present)
8560     encode_arm_shift (3);
8561 }
8562
8563 /* ARM V6 PKHTB (Argument Parse).  */
8564
8565 static void
8566 do_pkhtb (void)
8567 {
8568   if (!inst.operands[3].present)
8569     {
8570       /* If the shift specifier is omitted, turn the instruction
8571          into pkhbt rd, rm, rn. */
8572       inst.instruction &= 0xfff00010;
8573       inst.instruction |= inst.operands[0].reg << 12;
8574       inst.instruction |= inst.operands[1].reg;
8575       inst.instruction |= inst.operands[2].reg << 16;
8576     }
8577   else
8578     {
8579       inst.instruction |= inst.operands[0].reg << 12;
8580       inst.instruction |= inst.operands[1].reg << 16;
8581       inst.instruction |= inst.operands[2].reg;
8582       encode_arm_shift (3);
8583     }
8584 }
8585
8586 /* ARMv5TE: Preload-Cache
8587    MP Extensions: Preload for write
8588
8589     PLD(W) <addr_mode>
8590
8591   Syntactically, like LDR with B=1, W=0, L=1.  */
8592
8593 static void
8594 do_pld (void)
8595 {
8596   constraint (!inst.operands[0].isreg,
8597               _("'[' expected after PLD mnemonic"));
8598   constraint (inst.operands[0].postind,
8599               _("post-indexed expression used in preload instruction"));
8600   constraint (inst.operands[0].writeback,
8601               _("writeback used in preload instruction"));
8602   constraint (!inst.operands[0].preind,
8603               _("unindexed addressing used in preload instruction"));
8604   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8605 }
8606
8607 /* ARMv7: PLI <addr_mode>  */
8608 static void
8609 do_pli (void)
8610 {
8611   constraint (!inst.operands[0].isreg,
8612               _("'[' expected after PLI mnemonic"));
8613   constraint (inst.operands[0].postind,
8614               _("post-indexed expression used in preload instruction"));
8615   constraint (inst.operands[0].writeback,
8616               _("writeback used in preload instruction"));
8617   constraint (!inst.operands[0].preind,
8618               _("unindexed addressing used in preload instruction"));
8619   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8620   inst.instruction &= ~PRE_INDEX;
8621 }
8622
8623 static void
8624 do_push_pop (void)
8625 {
8626   inst.operands[1] = inst.operands[0];
8627   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
8628   inst.operands[0].isreg = 1;
8629   inst.operands[0].writeback = 1;
8630   inst.operands[0].reg = REG_SP;
8631   encode_ldmstm (/*from_push_pop_mnem=*/TRUE);
8632 }
8633
8634 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
8635    word at the specified address and the following word
8636    respectively.
8637    Unconditionally executed.
8638    Error if Rn is R15.  */
8639
8640 static void
8641 do_rfe (void)
8642 {
8643   inst.instruction |= inst.operands[0].reg << 16;
8644   if (inst.operands[0].writeback)
8645     inst.instruction |= WRITE_BACK;
8646 }
8647
8648 /* ARM V6 ssat (argument parse).  */
8649
8650 static void
8651 do_ssat (void)
8652 {
8653   inst.instruction |= inst.operands[0].reg << 12;
8654   inst.instruction |= (inst.operands[1].imm - 1) << 16;
8655   inst.instruction |= inst.operands[2].reg;
8656
8657   if (inst.operands[3].present)
8658     encode_arm_shift (3);
8659 }
8660
8661 /* ARM V6 usat (argument parse).  */
8662
8663 static void
8664 do_usat (void)
8665 {
8666   inst.instruction |= inst.operands[0].reg << 12;
8667   inst.instruction |= inst.operands[1].imm << 16;
8668   inst.instruction |= inst.operands[2].reg;
8669
8670   if (inst.operands[3].present)
8671     encode_arm_shift (3);
8672 }
8673
8674 /* ARM V6 ssat16 (argument parse).  */
8675
8676 static void
8677 do_ssat16 (void)
8678 {
8679   inst.instruction |= inst.operands[0].reg << 12;
8680   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
8681   inst.instruction |= inst.operands[2].reg;
8682 }
8683
8684 static void
8685 do_usat16 (void)
8686 {
8687   inst.instruction |= inst.operands[0].reg << 12;
8688   inst.instruction |= inst.operands[1].imm << 16;
8689   inst.instruction |= inst.operands[2].reg;
8690 }
8691
8692 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
8693    preserving the other bits.
8694
8695    setend <endian_specifier>, where <endian_specifier> is either
8696    BE or LE.  */
8697
8698 static void
8699 do_setend (void)
8700 {
8701   if (warn_on_deprecated
8702       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
8703       as_warn (_("setend use is deprecated for ARMv8"));
8704
8705   if (inst.operands[0].imm)
8706     inst.instruction |= 0x200;
8707 }
8708
8709 static void
8710 do_shift (void)
8711 {
8712   unsigned int Rm = (inst.operands[1].present
8713                      ? inst.operands[1].reg
8714                      : inst.operands[0].reg);
8715
8716   inst.instruction |= inst.operands[0].reg << 12;
8717   inst.instruction |= Rm;
8718   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
8719     {
8720       inst.instruction |= inst.operands[2].reg << 8;
8721       inst.instruction |= SHIFT_BY_REG;
8722       /* PR 12854: Error on extraneous shifts.  */
8723       constraint (inst.operands[2].shifted,
8724                   _("extraneous shift as part of operand to shift insn"));
8725     }
8726   else
8727     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
8728 }
8729
8730 static void
8731 do_smc (void)
8732 {
8733   inst.reloc.type = BFD_RELOC_ARM_SMC;
8734   inst.reloc.pc_rel = 0;
8735 }
8736
8737 static void
8738 do_hvc (void)
8739 {
8740   inst.reloc.type = BFD_RELOC_ARM_HVC;
8741   inst.reloc.pc_rel = 0;
8742 }
8743
8744 static void
8745 do_swi (void)
8746 {
8747   inst.reloc.type = BFD_RELOC_ARM_SWI;
8748   inst.reloc.pc_rel = 0;
8749 }
8750
8751 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
8752    SMLAxy{cond} Rd,Rm,Rs,Rn
8753    SMLAWy{cond} Rd,Rm,Rs,Rn
8754    Error if any register is R15.  */
8755
8756 static void
8757 do_smla (void)
8758 {
8759   inst.instruction |= inst.operands[0].reg << 16;
8760   inst.instruction |= inst.operands[1].reg;
8761   inst.instruction |= inst.operands[2].reg << 8;
8762   inst.instruction |= inst.operands[3].reg << 12;
8763 }
8764
8765 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8766    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8767    Error if any register is R15.
8768    Warning if Rdlo == Rdhi.  */
8769
8770 static void
8771 do_smlal (void)
8772 {
8773   inst.instruction |= inst.operands[0].reg << 12;
8774   inst.instruction |= inst.operands[1].reg << 16;
8775   inst.instruction |= inst.operands[2].reg;
8776   inst.instruction |= inst.operands[3].reg << 8;
8777
8778   if (inst.operands[0].reg == inst.operands[1].reg)
8779     as_tsktsk (_("rdhi and rdlo must be different"));
8780 }
8781
8782 /* ARM V5E (El Segundo) signed-multiply (argument parse)
8783    SMULxy{cond} Rd,Rm,Rs
8784    Error if any register is R15.  */
8785
8786 static void
8787 do_smul (void)
8788 {
8789   inst.instruction |= inst.operands[0].reg << 16;
8790   inst.instruction |= inst.operands[1].reg;
8791   inst.instruction |= inst.operands[2].reg << 8;
8792 }
8793
8794 /* ARM V6 srs (argument parse).  The variable fields in the encoding are
8795    the same for both ARM and Thumb-2.  */
8796
8797 static void
8798 do_srs (void)
8799 {
8800   int reg;
8801
8802   if (inst.operands[0].present)
8803     {
8804       reg = inst.operands[0].reg;
8805       constraint (reg != REG_SP, _("SRS base register must be r13"));
8806     }
8807   else
8808     reg = REG_SP;
8809
8810   inst.instruction |= reg << 16;
8811   inst.instruction |= inst.operands[1].imm;
8812   if (inst.operands[0].writeback || inst.operands[1].writeback)
8813     inst.instruction |= WRITE_BACK;
8814 }
8815
8816 /* ARM V6 strex (argument parse).  */
8817
8818 static void
8819 do_strex (void)
8820 {
8821   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8822               || inst.operands[2].postind || inst.operands[2].writeback
8823               || inst.operands[2].immisreg || inst.operands[2].shifted
8824               || inst.operands[2].negative
8825               /* See comment in do_ldrex().  */
8826               || (inst.operands[2].reg == REG_PC),
8827               BAD_ADDR_MODE);
8828
8829   constraint (inst.operands[0].reg == inst.operands[1].reg
8830               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8831
8832   constraint (inst.reloc.exp.X_op != O_constant
8833               || inst.reloc.exp.X_add_number != 0,
8834               _("offset must be zero in ARM encoding"));
8835
8836   inst.instruction |= inst.operands[0].reg << 12;
8837   inst.instruction |= inst.operands[1].reg;
8838   inst.instruction |= inst.operands[2].reg << 16;
8839   inst.reloc.type = BFD_RELOC_UNUSED;
8840 }
8841
8842 static void
8843 do_t_strexbh (void)
8844 {
8845   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8846               || inst.operands[2].postind || inst.operands[2].writeback
8847               || inst.operands[2].immisreg || inst.operands[2].shifted
8848               || inst.operands[2].negative,
8849               BAD_ADDR_MODE);
8850
8851   constraint (inst.operands[0].reg == inst.operands[1].reg
8852               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8853
8854   do_rm_rd_rn ();
8855 }
8856
8857 static void
8858 do_strexd (void)
8859 {
8860   constraint (inst.operands[1].reg % 2 != 0,
8861               _("even register required"));
8862   constraint (inst.operands[2].present
8863               && inst.operands[2].reg != inst.operands[1].reg + 1,
8864               _("can only store two consecutive registers"));
8865   /* If op 2 were present and equal to PC, this function wouldn't
8866      have been called in the first place.  */
8867   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
8868
8869   constraint (inst.operands[0].reg == inst.operands[1].reg
8870               || inst.operands[0].reg == inst.operands[1].reg + 1
8871               || inst.operands[0].reg == inst.operands[3].reg,
8872               BAD_OVERLAP);
8873
8874   inst.instruction |= inst.operands[0].reg << 12;
8875   inst.instruction |= inst.operands[1].reg;
8876   inst.instruction |= inst.operands[3].reg << 16;
8877 }
8878
8879 /* ARM V8 STRL.  */
8880 static void
8881 do_stlex (void)
8882 {
8883   constraint (inst.operands[0].reg == inst.operands[1].reg
8884               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8885
8886   do_rd_rm_rn ();
8887 }
8888
8889 static void
8890 do_t_stlex (void)
8891 {
8892   constraint (inst.operands[0].reg == inst.operands[1].reg
8893               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8894
8895   do_rm_rd_rn ();
8896 }
8897
8898 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8899    extends it to 32-bits, and adds the result to a value in another
8900    register.  You can specify a rotation by 0, 8, 16, or 24 bits
8901    before extracting the 16-bit value.
8902    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8903    Condition defaults to COND_ALWAYS.
8904    Error if any register uses R15.  */
8905
8906 static void
8907 do_sxtah (void)
8908 {
8909   inst.instruction |= inst.operands[0].reg << 12;
8910   inst.instruction |= inst.operands[1].reg << 16;
8911   inst.instruction |= inst.operands[2].reg;
8912   inst.instruction |= inst.operands[3].imm << 10;
8913 }
8914
8915 /* ARM V6 SXTH.
8916
8917    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8918    Condition defaults to COND_ALWAYS.
8919    Error if any register uses R15.  */
8920
8921 static void
8922 do_sxth (void)
8923 {
8924   inst.instruction |= inst.operands[0].reg << 12;
8925   inst.instruction |= inst.operands[1].reg;
8926   inst.instruction |= inst.operands[2].imm << 10;
8927 }
8928 \f
8929 /* VFP instructions.  In a logical order: SP variant first, monad
8930    before dyad, arithmetic then move then load/store.  */
8931
8932 static void
8933 do_vfp_sp_monadic (void)
8934 {
8935   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8936   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8937 }
8938
8939 static void
8940 do_vfp_sp_dyadic (void)
8941 {
8942   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8943   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8944   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8945 }
8946
8947 static void
8948 do_vfp_sp_compare_z (void)
8949 {
8950   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8951 }
8952
8953 static void
8954 do_vfp_dp_sp_cvt (void)
8955 {
8956   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8957   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8958 }
8959
8960 static void
8961 do_vfp_sp_dp_cvt (void)
8962 {
8963   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8964   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8965 }
8966
8967 static void
8968 do_vfp_reg_from_sp (void)
8969 {
8970   inst.instruction |= inst.operands[0].reg << 12;
8971   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8972 }
8973
8974 static void
8975 do_vfp_reg2_from_sp2 (void)
8976 {
8977   constraint (inst.operands[2].imm != 2,
8978               _("only two consecutive VFP SP registers allowed here"));
8979   inst.instruction |= inst.operands[0].reg << 12;
8980   inst.instruction |= inst.operands[1].reg << 16;
8981   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8982 }
8983
8984 static void
8985 do_vfp_sp_from_reg (void)
8986 {
8987   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
8988   inst.instruction |= inst.operands[1].reg << 12;
8989 }
8990
8991 static void
8992 do_vfp_sp2_from_reg2 (void)
8993 {
8994   constraint (inst.operands[0].imm != 2,
8995               _("only two consecutive VFP SP registers allowed here"));
8996   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
8997   inst.instruction |= inst.operands[1].reg << 12;
8998   inst.instruction |= inst.operands[2].reg << 16;
8999 }
9000
9001 static void
9002 do_vfp_sp_ldst (void)
9003 {
9004   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9005   encode_arm_cp_address (1, FALSE, TRUE, 0);
9006 }
9007
9008 static void
9009 do_vfp_dp_ldst (void)
9010 {
9011   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9012   encode_arm_cp_address (1, FALSE, TRUE, 0);
9013 }
9014
9015
9016 static void
9017 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
9018 {
9019   if (inst.operands[0].writeback)
9020     inst.instruction |= WRITE_BACK;
9021   else
9022     constraint (ldstm_type != VFP_LDSTMIA,
9023                 _("this addressing mode requires base-register writeback"));
9024   inst.instruction |= inst.operands[0].reg << 16;
9025   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
9026   inst.instruction |= inst.operands[1].imm;
9027 }
9028
9029 static void
9030 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
9031 {
9032   int count;
9033
9034   if (inst.operands[0].writeback)
9035     inst.instruction |= WRITE_BACK;
9036   else
9037     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
9038                 _("this addressing mode requires base-register writeback"));
9039
9040   inst.instruction |= inst.operands[0].reg << 16;
9041   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
9042
9043   count = inst.operands[1].imm << 1;
9044   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
9045     count += 1;
9046
9047   inst.instruction |= count;
9048 }
9049
9050 static void
9051 do_vfp_sp_ldstmia (void)
9052 {
9053   vfp_sp_ldstm (VFP_LDSTMIA);
9054 }
9055
9056 static void
9057 do_vfp_sp_ldstmdb (void)
9058 {
9059   vfp_sp_ldstm (VFP_LDSTMDB);
9060 }
9061
9062 static void
9063 do_vfp_dp_ldstmia (void)
9064 {
9065   vfp_dp_ldstm (VFP_LDSTMIA);
9066 }
9067
9068 static void
9069 do_vfp_dp_ldstmdb (void)
9070 {
9071   vfp_dp_ldstm (VFP_LDSTMDB);
9072 }
9073
9074 static void
9075 do_vfp_xp_ldstmia (void)
9076 {
9077   vfp_dp_ldstm (VFP_LDSTMIAX);
9078 }
9079
9080 static void
9081 do_vfp_xp_ldstmdb (void)
9082 {
9083   vfp_dp_ldstm (VFP_LDSTMDBX);
9084 }
9085
9086 static void
9087 do_vfp_dp_rd_rm (void)
9088 {
9089   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9090   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
9091 }
9092
9093 static void
9094 do_vfp_dp_rn_rd (void)
9095 {
9096   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
9097   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
9098 }
9099
9100 static void
9101 do_vfp_dp_rd_rn (void)
9102 {
9103   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9104   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
9105 }
9106
9107 static void
9108 do_vfp_dp_rd_rn_rm (void)
9109 {
9110   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9111   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
9112   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
9113 }
9114
9115 static void
9116 do_vfp_dp_rd (void)
9117 {
9118   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9119 }
9120
9121 static void
9122 do_vfp_dp_rm_rd_rn (void)
9123 {
9124   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
9125   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
9126   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
9127 }
9128
9129 /* VFPv3 instructions.  */
9130 static void
9131 do_vfp_sp_const (void)
9132 {
9133   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9134   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
9135   inst.instruction |= (inst.operands[1].imm & 0x0f);
9136 }
9137
9138 static void
9139 do_vfp_dp_const (void)
9140 {
9141   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9142   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
9143   inst.instruction |= (inst.operands[1].imm & 0x0f);
9144 }
9145
9146 static void
9147 vfp_conv (int srcsize)
9148 {
9149   int immbits = srcsize - inst.operands[1].imm;
9150
9151   if (srcsize == 16 && !(immbits >= 0 && immbits <= srcsize))
9152     {
9153       /* If srcsize is 16, inst.operands[1].imm must be in the range 0-16.
9154          i.e. immbits must be in range 0 - 16.  */
9155       inst.error = _("immediate value out of range, expected range [0, 16]");
9156       return;
9157     }
9158   else if (srcsize == 32 && !(immbits >= 0 && immbits < srcsize))
9159     {
9160       /* If srcsize is 32, inst.operands[1].imm must be in the range 1-32.
9161          i.e. immbits must be in range 0 - 31.  */
9162       inst.error = _("immediate value out of range, expected range [1, 32]");
9163       return;
9164     }
9165
9166   inst.instruction |= (immbits & 1) << 5;
9167   inst.instruction |= (immbits >> 1);
9168 }
9169
9170 static void
9171 do_vfp_sp_conv_16 (void)
9172 {
9173   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9174   vfp_conv (16);
9175 }
9176
9177 static void
9178 do_vfp_dp_conv_16 (void)
9179 {
9180   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9181   vfp_conv (16);
9182 }
9183
9184 static void
9185 do_vfp_sp_conv_32 (void)
9186 {
9187   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9188   vfp_conv (32);
9189 }
9190
9191 static void
9192 do_vfp_dp_conv_32 (void)
9193 {
9194   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9195   vfp_conv (32);
9196 }
9197 \f
9198 /* FPA instructions.  Also in a logical order.  */
9199
9200 static void
9201 do_fpa_cmp (void)
9202 {
9203   inst.instruction |= inst.operands[0].reg << 16;
9204   inst.instruction |= inst.operands[1].reg;
9205 }
9206
9207 static void
9208 do_fpa_ldmstm (void)
9209 {
9210   inst.instruction |= inst.operands[0].reg << 12;
9211   switch (inst.operands[1].imm)
9212     {
9213     case 1: inst.instruction |= CP_T_X;          break;
9214     case 2: inst.instruction |= CP_T_Y;          break;
9215     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
9216     case 4:                                      break;
9217     default: abort ();
9218     }
9219
9220   if (inst.instruction & (PRE_INDEX | INDEX_UP))
9221     {
9222       /* The instruction specified "ea" or "fd", so we can only accept
9223          [Rn]{!}.  The instruction does not really support stacking or
9224          unstacking, so we have to emulate these by setting appropriate
9225          bits and offsets.  */
9226       constraint (inst.reloc.exp.X_op != O_constant
9227                   || inst.reloc.exp.X_add_number != 0,
9228                   _("this instruction does not support indexing"));
9229
9230       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
9231         inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
9232
9233       if (!(inst.instruction & INDEX_UP))
9234         inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
9235
9236       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
9237         {
9238           inst.operands[2].preind = 0;
9239           inst.operands[2].postind = 1;
9240         }
9241     }
9242
9243   encode_arm_cp_address (2, TRUE, TRUE, 0);
9244 }
9245 \f
9246 /* iWMMXt instructions: strictly in alphabetical order.  */
9247
9248 static void
9249 do_iwmmxt_tandorc (void)
9250 {
9251   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
9252 }
9253
9254 static void
9255 do_iwmmxt_textrc (void)
9256 {
9257   inst.instruction |= inst.operands[0].reg << 12;
9258   inst.instruction |= inst.operands[1].imm;
9259 }
9260
9261 static void
9262 do_iwmmxt_textrm (void)
9263 {
9264   inst.instruction |= inst.operands[0].reg << 12;
9265   inst.instruction |= inst.operands[1].reg << 16;
9266   inst.instruction |= inst.operands[2].imm;
9267 }
9268
9269 static void
9270 do_iwmmxt_tinsr (void)
9271 {
9272   inst.instruction |= inst.operands[0].reg << 16;
9273   inst.instruction |= inst.operands[1].reg << 12;
9274   inst.instruction |= inst.operands[2].imm;
9275 }
9276
9277 static void
9278 do_iwmmxt_tmia (void)
9279 {
9280   inst.instruction |= inst.operands[0].reg << 5;
9281   inst.instruction |= inst.operands[1].reg;
9282   inst.instruction |= inst.operands[2].reg << 12;
9283 }
9284
9285 static void
9286 do_iwmmxt_waligni (void)
9287 {
9288   inst.instruction |= inst.operands[0].reg << 12;
9289   inst.instruction |= inst.operands[1].reg << 16;
9290   inst.instruction |= inst.operands[2].reg;
9291   inst.instruction |= inst.operands[3].imm << 20;
9292 }
9293
9294 static void
9295 do_iwmmxt_wmerge (void)
9296 {
9297   inst.instruction |= inst.operands[0].reg << 12;
9298   inst.instruction |= inst.operands[1].reg << 16;
9299   inst.instruction |= inst.operands[2].reg;
9300   inst.instruction |= inst.operands[3].imm << 21;
9301 }
9302
9303 static void
9304 do_iwmmxt_wmov (void)
9305 {
9306   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
9307   inst.instruction |= inst.operands[0].reg << 12;
9308   inst.instruction |= inst.operands[1].reg << 16;
9309   inst.instruction |= inst.operands[1].reg;
9310 }
9311
9312 static void
9313 do_iwmmxt_wldstbh (void)
9314 {
9315   int reloc;
9316   inst.instruction |= inst.operands[0].reg << 12;
9317   if (thumb_mode)
9318     reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
9319   else
9320     reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
9321   encode_arm_cp_address (1, TRUE, FALSE, reloc);
9322 }
9323
9324 static void
9325 do_iwmmxt_wldstw (void)
9326 {
9327   /* RIWR_RIWC clears .isreg for a control register.  */
9328   if (!inst.operands[0].isreg)
9329     {
9330       constraint (inst.cond != COND_ALWAYS, BAD_COND);
9331       inst.instruction |= 0xf0000000;
9332     }
9333
9334   inst.instruction |= inst.operands[0].reg << 12;
9335   encode_arm_cp_address (1, TRUE, TRUE, 0);
9336 }
9337
9338 static void
9339 do_iwmmxt_wldstd (void)
9340 {
9341   inst.instruction |= inst.operands[0].reg << 12;
9342   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
9343       && inst.operands[1].immisreg)
9344     {
9345       inst.instruction &= ~0x1a000ff;
9346       inst.instruction |= (0xf << 28);
9347       if (inst.operands[1].preind)
9348         inst.instruction |= PRE_INDEX;
9349       if (!inst.operands[1].negative)
9350         inst.instruction |= INDEX_UP;
9351       if (inst.operands[1].writeback)
9352         inst.instruction |= WRITE_BACK;
9353       inst.instruction |= inst.operands[1].reg << 16;
9354       inst.instruction |= inst.reloc.exp.X_add_number << 4;
9355       inst.instruction |= inst.operands[1].imm;
9356     }
9357   else
9358     encode_arm_cp_address (1, TRUE, FALSE, 0);
9359 }
9360
9361 static void
9362 do_iwmmxt_wshufh (void)
9363 {
9364   inst.instruction |= inst.operands[0].reg << 12;
9365   inst.instruction |= inst.operands[1].reg << 16;
9366   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
9367   inst.instruction |= (inst.operands[2].imm & 0x0f);
9368 }
9369
9370 static void
9371 do_iwmmxt_wzero (void)
9372 {
9373   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
9374   inst.instruction |= inst.operands[0].reg;
9375   inst.instruction |= inst.operands[0].reg << 12;
9376   inst.instruction |= inst.operands[0].reg << 16;
9377 }
9378
9379 static void
9380 do_iwmmxt_wrwrwr_or_imm5 (void)
9381 {
9382   if (inst.operands[2].isreg)
9383     do_rd_rn_rm ();
9384   else {
9385     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
9386                 _("immediate operand requires iWMMXt2"));
9387     do_rd_rn ();
9388     if (inst.operands[2].imm == 0)
9389       {
9390         switch ((inst.instruction >> 20) & 0xf)
9391           {
9392           case 4:
9393           case 5:
9394           case 6:
9395           case 7:
9396             /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
9397             inst.operands[2].imm = 16;
9398             inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
9399             break;
9400           case 8:
9401           case 9:
9402           case 10:
9403           case 11:
9404             /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
9405             inst.operands[2].imm = 32;
9406             inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
9407             break;
9408           case 12:
9409           case 13:
9410           case 14:
9411           case 15:
9412             {
9413               /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
9414               unsigned long wrn;
9415               wrn = (inst.instruction >> 16) & 0xf;
9416               inst.instruction &= 0xff0fff0f;
9417               inst.instruction |= wrn;
9418               /* Bail out here; the instruction is now assembled.  */
9419               return;
9420             }
9421           }
9422       }
9423     /* Map 32 -> 0, etc.  */
9424     inst.operands[2].imm &= 0x1f;
9425     inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
9426   }
9427 }
9428 \f
9429 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
9430    operations first, then control, shift, and load/store.  */
9431
9432 /* Insns like "foo X,Y,Z".  */
9433
9434 static void
9435 do_mav_triple (void)
9436 {
9437   inst.instruction |= inst.operands[0].reg << 16;
9438   inst.instruction |= inst.operands[1].reg;
9439   inst.instruction |= inst.operands[2].reg << 12;
9440 }
9441
9442 /* Insns like "foo W,X,Y,Z".
9443     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
9444
9445 static void
9446 do_mav_quad (void)
9447 {
9448   inst.instruction |= inst.operands[0].reg << 5;
9449   inst.instruction |= inst.operands[1].reg << 12;
9450   inst.instruction |= inst.operands[2].reg << 16;
9451   inst.instruction |= inst.operands[3].reg;
9452 }
9453
9454 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
9455 static void
9456 do_mav_dspsc (void)
9457 {
9458   inst.instruction |= inst.operands[1].reg << 12;
9459 }
9460
9461 /* Maverick shift immediate instructions.
9462    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
9463    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
9464
9465 static void
9466 do_mav_shift (void)
9467 {
9468   int imm = inst.operands[2].imm;
9469
9470   inst.instruction |= inst.operands[0].reg << 12;
9471   inst.instruction |= inst.operands[1].reg << 16;
9472
9473   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
9474      Bits 5-7 of the insn should have bits 4-6 of the immediate.
9475      Bit 4 should be 0.  */
9476   imm = (imm & 0xf) | ((imm & 0x70) << 1);
9477
9478   inst.instruction |= imm;
9479 }
9480 \f
9481 /* XScale instructions.  Also sorted arithmetic before move.  */
9482
9483 /* Xscale multiply-accumulate (argument parse)
9484      MIAcc   acc0,Rm,Rs
9485      MIAPHcc acc0,Rm,Rs
9486      MIAxycc acc0,Rm,Rs.  */
9487
9488 static void
9489 do_xsc_mia (void)
9490 {
9491   inst.instruction |= inst.operands[1].reg;
9492   inst.instruction |= inst.operands[2].reg << 12;
9493 }
9494
9495 /* Xscale move-accumulator-register (argument parse)
9496
9497      MARcc   acc0,RdLo,RdHi.  */
9498
9499 static void
9500 do_xsc_mar (void)
9501 {
9502   inst.instruction |= inst.operands[1].reg << 12;
9503   inst.instruction |= inst.operands[2].reg << 16;
9504 }
9505
9506 /* Xscale move-register-accumulator (argument parse)
9507
9508      MRAcc   RdLo,RdHi,acc0.  */
9509
9510 static void
9511 do_xsc_mra (void)
9512 {
9513   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
9514   inst.instruction |= inst.operands[0].reg << 12;
9515   inst.instruction |= inst.operands[1].reg << 16;
9516 }
9517 \f
9518 /* Encoding functions relevant only to Thumb.  */
9519
9520 /* inst.operands[i] is a shifted-register operand; encode
9521    it into inst.instruction in the format used by Thumb32.  */
9522
9523 static void
9524 encode_thumb32_shifted_operand (int i)
9525 {
9526   unsigned int value = inst.reloc.exp.X_add_number;
9527   unsigned int shift = inst.operands[i].shift_kind;
9528
9529   constraint (inst.operands[i].immisreg,
9530               _("shift by register not allowed in thumb mode"));
9531   inst.instruction |= inst.operands[i].reg;
9532   if (shift == SHIFT_RRX)
9533     inst.instruction |= SHIFT_ROR << 4;
9534   else
9535     {
9536       constraint (inst.reloc.exp.X_op != O_constant,
9537                   _("expression too complex"));
9538
9539       constraint (value > 32
9540                   || (value == 32 && (shift == SHIFT_LSL
9541                                       || shift == SHIFT_ROR)),
9542                   _("shift expression is too large"));
9543
9544       if (value == 0)
9545         shift = SHIFT_LSL;
9546       else if (value == 32)
9547         value = 0;
9548
9549       inst.instruction |= shift << 4;
9550       inst.instruction |= (value & 0x1c) << 10;
9551       inst.instruction |= (value & 0x03) << 6;
9552     }
9553 }
9554
9555
9556 /* inst.operands[i] was set up by parse_address.  Encode it into a
9557    Thumb32 format load or store instruction.  Reject forms that cannot
9558    be used with such instructions.  If is_t is true, reject forms that
9559    cannot be used with a T instruction; if is_d is true, reject forms
9560    that cannot be used with a D instruction.  If it is a store insn,
9561    reject PC in Rn.  */
9562
9563 static void
9564 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
9565 {
9566   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
9567
9568   constraint (!inst.operands[i].isreg,
9569               _("Instruction does not support =N addresses"));
9570
9571   inst.instruction |= inst.operands[i].reg << 16;
9572   if (inst.operands[i].immisreg)
9573     {
9574       constraint (is_pc, BAD_PC_ADDRESSING);
9575       constraint (is_t || is_d, _("cannot use register index with this instruction"));
9576       constraint (inst.operands[i].negative,
9577                   _("Thumb does not support negative register indexing"));
9578       constraint (inst.operands[i].postind,
9579                   _("Thumb does not support register post-indexing"));
9580       constraint (inst.operands[i].writeback,
9581                   _("Thumb does not support register indexing with writeback"));
9582       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
9583                   _("Thumb supports only LSL in shifted register indexing"));
9584
9585       inst.instruction |= inst.operands[i].imm;
9586       if (inst.operands[i].shifted)
9587         {
9588           constraint (inst.reloc.exp.X_op != O_constant,
9589                       _("expression too complex"));
9590           constraint (inst.reloc.exp.X_add_number < 0
9591                       || inst.reloc.exp.X_add_number > 3,
9592                       _("shift out of range"));
9593           inst.instruction |= inst.reloc.exp.X_add_number << 4;
9594         }
9595       inst.reloc.type = BFD_RELOC_UNUSED;
9596     }
9597   else if (inst.operands[i].preind)
9598     {
9599       constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
9600       constraint (is_t && inst.operands[i].writeback,
9601                   _("cannot use writeback with this instruction"));
9602       constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0),
9603                   BAD_PC_ADDRESSING);
9604
9605       if (is_d)
9606         {
9607           inst.instruction |= 0x01000000;
9608           if (inst.operands[i].writeback)
9609             inst.instruction |= 0x00200000;
9610         }
9611       else
9612         {
9613           inst.instruction |= 0x00000c00;
9614           if (inst.operands[i].writeback)
9615             inst.instruction |= 0x00000100;
9616         }
9617       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9618     }
9619   else if (inst.operands[i].postind)
9620     {
9621       gas_assert (inst.operands[i].writeback);
9622       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
9623       constraint (is_t, _("cannot use post-indexing with this instruction"));
9624
9625       if (is_d)
9626         inst.instruction |= 0x00200000;
9627       else
9628         inst.instruction |= 0x00000900;
9629       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9630     }
9631   else /* unindexed - only for coprocessor */
9632     inst.error = _("instruction does not accept unindexed addressing");
9633 }
9634
9635 /* Table of Thumb instructions which exist in both 16- and 32-bit
9636    encodings (the latter only in post-V6T2 cores).  The index is the
9637    value used in the insns table below.  When there is more than one
9638    possible 16-bit encoding for the instruction, this table always
9639    holds variant (1).
9640    Also contains several pseudo-instructions used during relaxation.  */
9641 #define T16_32_TAB                              \
9642   X(_adc,   4140, eb400000),                    \
9643   X(_adcs,  4140, eb500000),                    \
9644   X(_add,   1c00, eb000000),                    \
9645   X(_adds,  1c00, eb100000),                    \
9646   X(_addi,  0000, f1000000),                    \
9647   X(_addis, 0000, f1100000),                    \
9648   X(_add_pc,000f, f20f0000),                    \
9649   X(_add_sp,000d, f10d0000),                    \
9650   X(_adr,   000f, f20f0000),                    \
9651   X(_and,   4000, ea000000),                    \
9652   X(_ands,  4000, ea100000),                    \
9653   X(_asr,   1000, fa40f000),                    \
9654   X(_asrs,  1000, fa50f000),                    \
9655   X(_b,     e000, f000b000),                    \
9656   X(_bcond, d000, f0008000),                    \
9657   X(_bic,   4380, ea200000),                    \
9658   X(_bics,  4380, ea300000),                    \
9659   X(_cmn,   42c0, eb100f00),                    \
9660   X(_cmp,   2800, ebb00f00),                    \
9661   X(_cpsie, b660, f3af8400),                    \
9662   X(_cpsid, b670, f3af8600),                    \
9663   X(_cpy,   4600, ea4f0000),                    \
9664   X(_dec_sp,80dd, f1ad0d00),                    \
9665   X(_eor,   4040, ea800000),                    \
9666   X(_eors,  4040, ea900000),                    \
9667   X(_inc_sp,00dd, f10d0d00),                    \
9668   X(_ldmia, c800, e8900000),                    \
9669   X(_ldr,   6800, f8500000),                    \
9670   X(_ldrb,  7800, f8100000),                    \
9671   X(_ldrh,  8800, f8300000),                    \
9672   X(_ldrsb, 5600, f9100000),                    \
9673   X(_ldrsh, 5e00, f9300000),                    \
9674   X(_ldr_pc,4800, f85f0000),                    \
9675   X(_ldr_pc2,4800, f85f0000),                   \
9676   X(_ldr_sp,9800, f85d0000),                    \
9677   X(_lsl,   0000, fa00f000),                    \
9678   X(_lsls,  0000, fa10f000),                    \
9679   X(_lsr,   0800, fa20f000),                    \
9680   X(_lsrs,  0800, fa30f000),                    \
9681   X(_mov,   2000, ea4f0000),                    \
9682   X(_movs,  2000, ea5f0000),                    \
9683   X(_mul,   4340, fb00f000),                     \
9684   X(_muls,  4340, ffffffff), /* no 32b muls */  \
9685   X(_mvn,   43c0, ea6f0000),                    \
9686   X(_mvns,  43c0, ea7f0000),                    \
9687   X(_neg,   4240, f1c00000), /* rsb #0 */       \
9688   X(_negs,  4240, f1d00000), /* rsbs #0 */      \
9689   X(_orr,   4300, ea400000),                    \
9690   X(_orrs,  4300, ea500000),                    \
9691   X(_pop,   bc00, e8bd0000), /* ldmia sp!,... */        \
9692   X(_push,  b400, e92d0000), /* stmdb sp!,... */        \
9693   X(_rev,   ba00, fa90f080),                    \
9694   X(_rev16, ba40, fa90f090),                    \
9695   X(_revsh, bac0, fa90f0b0),                    \
9696   X(_ror,   41c0, fa60f000),                    \
9697   X(_rors,  41c0, fa70f000),                    \
9698   X(_sbc,   4180, eb600000),                    \
9699   X(_sbcs,  4180, eb700000),                    \
9700   X(_stmia, c000, e8800000),                    \
9701   X(_str,   6000, f8400000),                    \
9702   X(_strb,  7000, f8000000),                    \
9703   X(_strh,  8000, f8200000),                    \
9704   X(_str_sp,9000, f84d0000),                    \
9705   X(_sub,   1e00, eba00000),                    \
9706   X(_subs,  1e00, ebb00000),                    \
9707   X(_subi,  8000, f1a00000),                    \
9708   X(_subis, 8000, f1b00000),                    \
9709   X(_sxtb,  b240, fa4ff080),                    \
9710   X(_sxth,  b200, fa0ff080),                    \
9711   X(_tst,   4200, ea100f00),                    \
9712   X(_uxtb,  b2c0, fa5ff080),                    \
9713   X(_uxth,  b280, fa1ff080),                    \
9714   X(_nop,   bf00, f3af8000),                    \
9715   X(_yield, bf10, f3af8001),                    \
9716   X(_wfe,   bf20, f3af8002),                    \
9717   X(_wfi,   bf30, f3af8003),                    \
9718   X(_sev,   bf40, f3af8004),                    \
9719   X(_sevl,  bf50, f3af8005),                    \
9720   X(_udf,   de00, f7f0a000)
9721
9722 /* To catch errors in encoding functions, the codes are all offset by
9723    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
9724    as 16-bit instructions.  */
9725 #define X(a,b,c) T_MNEM##a
9726 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
9727 #undef X
9728
9729 #define X(a,b,c) 0x##b
9730 static const unsigned short thumb_op16[] = { T16_32_TAB };
9731 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
9732 #undef X
9733
9734 #define X(a,b,c) 0x##c
9735 static const unsigned int thumb_op32[] = { T16_32_TAB };
9736 #define THUMB_OP32(n)        (thumb_op32[(n) - (T16_32_OFFSET + 1)])
9737 #define THUMB_SETS_FLAGS(n)  (THUMB_OP32 (n) & 0x00100000)
9738 #undef X
9739 #undef T16_32_TAB
9740
9741 /* Thumb instruction encoders, in alphabetical order.  */
9742
9743 /* ADDW or SUBW.  */
9744
9745 static void
9746 do_t_add_sub_w (void)
9747 {
9748   int Rd, Rn;
9749
9750   Rd = inst.operands[0].reg;
9751   Rn = inst.operands[1].reg;
9752
9753   /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
9754      is the SP-{plus,minus}-immediate form of the instruction.  */
9755   if (Rn == REG_SP)
9756     constraint (Rd == REG_PC, BAD_PC);
9757   else
9758     reject_bad_reg (Rd);
9759
9760   inst.instruction |= (Rn << 16) | (Rd << 8);
9761   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9762 }
9763
9764 /* Parse an add or subtract instruction.  We get here with inst.instruction
9765    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
9766
9767 static void
9768 do_t_add_sub (void)
9769 {
9770   int Rd, Rs, Rn;
9771
9772   Rd = inst.operands[0].reg;
9773   Rs = (inst.operands[1].present
9774         ? inst.operands[1].reg    /* Rd, Rs, foo */
9775         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9776
9777   if (Rd == REG_PC)
9778     set_it_insn_type_last ();
9779
9780   if (unified_syntax)
9781     {
9782       bfd_boolean flags;
9783       bfd_boolean narrow;
9784       int opcode;
9785
9786       flags = (inst.instruction == T_MNEM_adds
9787                || inst.instruction == T_MNEM_subs);
9788       if (flags)
9789         narrow = !in_it_block ();
9790       else
9791         narrow = in_it_block ();
9792       if (!inst.operands[2].isreg)
9793         {
9794           int add;
9795
9796           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9797
9798           add = (inst.instruction == T_MNEM_add
9799                  || inst.instruction == T_MNEM_adds);
9800           opcode = 0;
9801           if (inst.size_req != 4)
9802             {
9803               /* Attempt to use a narrow opcode, with relaxation if
9804                  appropriate.  */
9805               if (Rd == REG_SP && Rs == REG_SP && !flags)
9806                 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
9807               else if (Rd <= 7 && Rs == REG_SP && add && !flags)
9808                 opcode = T_MNEM_add_sp;
9809               else if (Rd <= 7 && Rs == REG_PC && add && !flags)
9810                 opcode = T_MNEM_add_pc;
9811               else if (Rd <= 7 && Rs <= 7 && narrow)
9812                 {
9813                   if (flags)
9814                     opcode = add ? T_MNEM_addis : T_MNEM_subis;
9815                   else
9816                     opcode = add ? T_MNEM_addi : T_MNEM_subi;
9817                 }
9818               if (opcode)
9819                 {
9820                   inst.instruction = THUMB_OP16(opcode);
9821                   inst.instruction |= (Rd << 4) | Rs;
9822                   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9823                   if (inst.size_req != 2)
9824                     inst.relax = opcode;
9825                 }
9826               else
9827                 constraint (inst.size_req == 2, BAD_HIREG);
9828             }
9829           if (inst.size_req == 4
9830               || (inst.size_req != 2 && !opcode))
9831             {
9832               if (Rd == REG_PC)
9833                 {
9834                   constraint (add, BAD_PC);
9835                   constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9836                              _("only SUBS PC, LR, #const allowed"));
9837                   constraint (inst.reloc.exp.X_op != O_constant,
9838                               _("expression too complex"));
9839                   constraint (inst.reloc.exp.X_add_number < 0
9840                               || inst.reloc.exp.X_add_number > 0xff,
9841                              _("immediate value out of range"));
9842                   inst.instruction = T2_SUBS_PC_LR
9843                                      | inst.reloc.exp.X_add_number;
9844                   inst.reloc.type = BFD_RELOC_UNUSED;
9845                   return;
9846                 }
9847               else if (Rs == REG_PC)
9848                 {
9849                   /* Always use addw/subw.  */
9850                   inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9851                   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9852                 }
9853               else
9854                 {
9855                   inst.instruction = THUMB_OP32 (inst.instruction);
9856                   inst.instruction = (inst.instruction & 0xe1ffffff)
9857                                      | 0x10000000;
9858                   if (flags)
9859                     inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9860                   else
9861                     inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9862                 }
9863               inst.instruction |= Rd << 8;
9864               inst.instruction |= Rs << 16;
9865             }
9866         }
9867       else
9868         {
9869           unsigned int value = inst.reloc.exp.X_add_number;
9870           unsigned int shift = inst.operands[2].shift_kind;
9871
9872           Rn = inst.operands[2].reg;
9873           /* See if we can do this with a 16-bit instruction.  */
9874           if (!inst.operands[2].shifted && inst.size_req != 4)
9875             {
9876               if (Rd > 7 || Rs > 7 || Rn > 7)
9877                 narrow = FALSE;
9878
9879               if (narrow)
9880                 {
9881                   inst.instruction = ((inst.instruction == T_MNEM_adds
9882                                        || inst.instruction == T_MNEM_add)
9883                                       ? T_OPCODE_ADD_R3
9884                                       : T_OPCODE_SUB_R3);
9885                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9886                   return;
9887                 }
9888
9889               if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
9890                 {
9891                   /* Thumb-1 cores (except v6-M) require at least one high
9892                      register in a narrow non flag setting add.  */
9893                   if (Rd > 7 || Rn > 7
9894                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9895                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
9896                     {
9897                       if (Rd == Rn)
9898                         {
9899                           Rn = Rs;
9900                           Rs = Rd;
9901                         }
9902                       inst.instruction = T_OPCODE_ADD_HI;
9903                       inst.instruction |= (Rd & 8) << 4;
9904                       inst.instruction |= (Rd & 7);
9905                       inst.instruction |= Rn << 3;
9906                       return;
9907                     }
9908                 }
9909             }
9910
9911           constraint (Rd == REG_PC, BAD_PC);
9912           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9913           constraint (Rs == REG_PC, BAD_PC);
9914           reject_bad_reg (Rn);
9915
9916           /* If we get here, it can't be done in 16 bits.  */
9917           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9918                       _("shift must be constant"));
9919           inst.instruction = THUMB_OP32 (inst.instruction);
9920           inst.instruction |= Rd << 8;
9921           inst.instruction |= Rs << 16;
9922           constraint (Rd == REG_SP && Rs == REG_SP && value > 3,
9923                       _("shift value over 3 not allowed in thumb mode"));
9924           constraint (Rd == REG_SP && Rs == REG_SP && shift != SHIFT_LSL,
9925                       _("only LSL shift allowed in thumb mode"));
9926           encode_thumb32_shifted_operand (2);
9927         }
9928     }
9929   else
9930     {
9931       constraint (inst.instruction == T_MNEM_adds
9932                   || inst.instruction == T_MNEM_subs,
9933                   BAD_THUMB32);
9934
9935       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
9936         {
9937           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9938                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9939                       BAD_HIREG);
9940
9941           inst.instruction = (inst.instruction == T_MNEM_add
9942                               ? 0x0000 : 0x8000);
9943           inst.instruction |= (Rd << 4) | Rs;
9944           inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9945           return;
9946         }
9947
9948       Rn = inst.operands[2].reg;
9949       constraint (inst.operands[2].shifted, _("unshifted register required"));
9950
9951       /* We now have Rd, Rs, and Rn set to registers.  */
9952       if (Rd > 7 || Rs > 7 || Rn > 7)
9953         {
9954           /* Can't do this for SUB.      */
9955           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9956           inst.instruction = T_OPCODE_ADD_HI;
9957           inst.instruction |= (Rd & 8) << 4;
9958           inst.instruction |= (Rd & 7);
9959           if (Rs == Rd)
9960             inst.instruction |= Rn << 3;
9961           else if (Rn == Rd)
9962             inst.instruction |= Rs << 3;
9963           else
9964             constraint (1, _("dest must overlap one source register"));
9965         }
9966       else
9967         {
9968           inst.instruction = (inst.instruction == T_MNEM_add
9969                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9970           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9971         }
9972     }
9973 }
9974
9975 static void
9976 do_t_adr (void)
9977 {
9978   unsigned Rd;
9979
9980   Rd = inst.operands[0].reg;
9981   reject_bad_reg (Rd);
9982
9983   if (unified_syntax && inst.size_req == 0 && Rd <= 7)
9984     {
9985       /* Defer to section relaxation.  */
9986       inst.relax = inst.instruction;
9987       inst.instruction = THUMB_OP16 (inst.instruction);
9988       inst.instruction |= Rd << 4;
9989     }
9990   else if (unified_syntax && inst.size_req != 2)
9991     {
9992       /* Generate a 32-bit opcode.  */
9993       inst.instruction = THUMB_OP32 (inst.instruction);
9994       inst.instruction |= Rd << 8;
9995       inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9996       inst.reloc.pc_rel = 1;
9997     }
9998   else
9999     {
10000       /* Generate a 16-bit opcode.  */
10001       inst.instruction = THUMB_OP16 (inst.instruction);
10002       inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
10003       inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
10004       inst.reloc.pc_rel = 1;
10005
10006       inst.instruction |= Rd << 4;
10007     }
10008 }
10009
10010 /* Arithmetic instructions for which there is just one 16-bit
10011    instruction encoding, and it allows only two low registers.
10012    For maximal compatibility with ARM syntax, we allow three register
10013    operands even when Thumb-32 instructions are not available, as long
10014    as the first two are identical.  For instance, both "sbc r0,r1" and
10015    "sbc r0,r0,r1" are allowed.  */
10016 static void
10017 do_t_arit3 (void)
10018 {
10019   int Rd, Rs, Rn;
10020
10021   Rd = inst.operands[0].reg;
10022   Rs = (inst.operands[1].present
10023         ? inst.operands[1].reg    /* Rd, Rs, foo */
10024         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
10025   Rn = inst.operands[2].reg;
10026
10027   reject_bad_reg (Rd);
10028   reject_bad_reg (Rs);
10029   if (inst.operands[2].isreg)
10030     reject_bad_reg (Rn);
10031
10032   if (unified_syntax)
10033     {
10034       if (!inst.operands[2].isreg)
10035         {
10036           /* For an immediate, we always generate a 32-bit opcode;
10037              section relaxation will shrink it later if possible.  */
10038           inst.instruction = THUMB_OP32 (inst.instruction);
10039           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10040           inst.instruction |= Rd << 8;
10041           inst.instruction |= Rs << 16;
10042           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10043         }
10044       else
10045         {
10046           bfd_boolean narrow;
10047
10048           /* See if we can do this with a 16-bit instruction.  */
10049           if (THUMB_SETS_FLAGS (inst.instruction))
10050             narrow = !in_it_block ();
10051           else
10052             narrow = in_it_block ();
10053
10054           if (Rd > 7 || Rn > 7 || Rs > 7)
10055             narrow = FALSE;
10056           if (inst.operands[2].shifted)
10057             narrow = FALSE;
10058           if (inst.size_req == 4)
10059             narrow = FALSE;
10060
10061           if (narrow
10062               && Rd == Rs)
10063             {
10064               inst.instruction = THUMB_OP16 (inst.instruction);
10065               inst.instruction |= Rd;
10066               inst.instruction |= Rn << 3;
10067               return;
10068             }
10069
10070           /* If we get here, it can't be done in 16 bits.  */
10071           constraint (inst.operands[2].shifted
10072                       && inst.operands[2].immisreg,
10073                       _("shift must be constant"));
10074           inst.instruction = THUMB_OP32 (inst.instruction);
10075           inst.instruction |= Rd << 8;
10076           inst.instruction |= Rs << 16;
10077           encode_thumb32_shifted_operand (2);
10078         }
10079     }
10080   else
10081     {
10082       /* On its face this is a lie - the instruction does set the
10083          flags.  However, the only supported mnemonic in this mode
10084          says it doesn't.  */
10085       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
10086
10087       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
10088                   _("unshifted register required"));
10089       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
10090       constraint (Rd != Rs,
10091                   _("dest and source1 must be the same register"));
10092
10093       inst.instruction = THUMB_OP16 (inst.instruction);
10094       inst.instruction |= Rd;
10095       inst.instruction |= Rn << 3;
10096     }
10097 }
10098
10099 /* Similarly, but for instructions where the arithmetic operation is
10100    commutative, so we can allow either of them to be different from
10101    the destination operand in a 16-bit instruction.  For instance, all
10102    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
10103    accepted.  */
10104 static void
10105 do_t_arit3c (void)
10106 {
10107   int Rd, Rs, Rn;
10108
10109   Rd = inst.operands[0].reg;
10110   Rs = (inst.operands[1].present
10111         ? inst.operands[1].reg    /* Rd, Rs, foo */
10112         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
10113   Rn = inst.operands[2].reg;
10114
10115   reject_bad_reg (Rd);
10116   reject_bad_reg (Rs);
10117   if (inst.operands[2].isreg)
10118     reject_bad_reg (Rn);
10119
10120   if (unified_syntax)
10121     {
10122       if (!inst.operands[2].isreg)
10123         {
10124           /* For an immediate, we always generate a 32-bit opcode;
10125              section relaxation will shrink it later if possible.  */
10126           inst.instruction = THUMB_OP32 (inst.instruction);
10127           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10128           inst.instruction |= Rd << 8;
10129           inst.instruction |= Rs << 16;
10130           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10131         }
10132       else
10133         {
10134           bfd_boolean narrow;
10135
10136           /* See if we can do this with a 16-bit instruction.  */
10137           if (THUMB_SETS_FLAGS (inst.instruction))
10138             narrow = !in_it_block ();
10139           else
10140             narrow = in_it_block ();
10141
10142           if (Rd > 7 || Rn > 7 || Rs > 7)
10143             narrow = FALSE;
10144           if (inst.operands[2].shifted)
10145             narrow = FALSE;
10146           if (inst.size_req == 4)
10147             narrow = FALSE;
10148
10149           if (narrow)
10150             {
10151               if (Rd == Rs)
10152                 {
10153                   inst.instruction = THUMB_OP16 (inst.instruction);
10154                   inst.instruction |= Rd;
10155                   inst.instruction |= Rn << 3;
10156                   return;
10157                 }
10158               if (Rd == Rn)
10159                 {
10160                   inst.instruction = THUMB_OP16 (inst.instruction);
10161                   inst.instruction |= Rd;
10162                   inst.instruction |= Rs << 3;
10163                   return;
10164                 }
10165             }
10166
10167           /* If we get here, it can't be done in 16 bits.  */
10168           constraint (inst.operands[2].shifted
10169                       && inst.operands[2].immisreg,
10170                       _("shift must be constant"));
10171           inst.instruction = THUMB_OP32 (inst.instruction);
10172           inst.instruction |= Rd << 8;
10173           inst.instruction |= Rs << 16;
10174           encode_thumb32_shifted_operand (2);
10175         }
10176     }
10177   else
10178     {
10179       /* On its face this is a lie - the instruction does set the
10180          flags.  However, the only supported mnemonic in this mode
10181          says it doesn't.  */
10182       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
10183
10184       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
10185                   _("unshifted register required"));
10186       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
10187
10188       inst.instruction = THUMB_OP16 (inst.instruction);
10189       inst.instruction |= Rd;
10190
10191       if (Rd == Rs)
10192         inst.instruction |= Rn << 3;
10193       else if (Rd == Rn)
10194         inst.instruction |= Rs << 3;
10195       else
10196         constraint (1, _("dest must overlap one source register"));
10197     }
10198 }
10199
10200 static void
10201 do_t_bfc (void)
10202 {
10203   unsigned Rd;
10204   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
10205   constraint (msb > 32, _("bit-field extends past end of register"));
10206   /* The instruction encoding stores the LSB and MSB,
10207      not the LSB and width.  */
10208   Rd = inst.operands[0].reg;
10209   reject_bad_reg (Rd);
10210   inst.instruction |= Rd << 8;
10211   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
10212   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
10213   inst.instruction |= msb - 1;
10214 }
10215
10216 static void
10217 do_t_bfi (void)
10218 {
10219   int Rd, Rn;
10220   unsigned int msb;
10221
10222   Rd = inst.operands[0].reg;
10223   reject_bad_reg (Rd);
10224
10225   /* #0 in second position is alternative syntax for bfc, which is
10226      the same instruction but with REG_PC in the Rm field.  */
10227   if (!inst.operands[1].isreg)
10228     Rn = REG_PC;
10229   else
10230     {
10231       Rn = inst.operands[1].reg;
10232       reject_bad_reg (Rn);
10233     }
10234
10235   msb = inst.operands[2].imm + inst.operands[3].imm;
10236   constraint (msb > 32, _("bit-field extends past end of register"));
10237   /* The instruction encoding stores the LSB and MSB,
10238      not the LSB and width.  */
10239   inst.instruction |= Rd << 8;
10240   inst.instruction |= Rn << 16;
10241   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10242   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10243   inst.instruction |= msb - 1;
10244 }
10245
10246 static void
10247 do_t_bfx (void)
10248 {
10249   unsigned Rd, Rn;
10250
10251   Rd = inst.operands[0].reg;
10252   Rn = inst.operands[1].reg;
10253
10254   reject_bad_reg (Rd);
10255   reject_bad_reg (Rn);
10256
10257   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
10258               _("bit-field extends past end of register"));
10259   inst.instruction |= Rd << 8;
10260   inst.instruction |= Rn << 16;
10261   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10262   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10263   inst.instruction |= inst.operands[3].imm - 1;
10264 }
10265
10266 /* ARM V5 Thumb BLX (argument parse)
10267         BLX <target_addr>       which is BLX(1)
10268         BLX <Rm>                which is BLX(2)
10269    Unfortunately, there are two different opcodes for this mnemonic.
10270    So, the insns[].value is not used, and the code here zaps values
10271         into inst.instruction.
10272
10273    ??? How to take advantage of the additional two bits of displacement
10274    available in Thumb32 mode?  Need new relocation?  */
10275
10276 static void
10277 do_t_blx (void)
10278 {
10279   set_it_insn_type_last ();
10280
10281   if (inst.operands[0].isreg)
10282     {
10283       constraint (inst.operands[0].reg == REG_PC, BAD_PC);
10284       /* We have a register, so this is BLX(2).  */
10285       inst.instruction |= inst.operands[0].reg << 3;
10286     }
10287   else
10288     {
10289       /* No register.  This must be BLX(1).  */
10290       inst.instruction = 0xf000e800;
10291       encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
10292     }
10293 }
10294
10295 static void
10296 do_t_branch (void)
10297 {
10298   int opcode;
10299   int cond;
10300   int reloc;
10301
10302   cond = inst.cond;
10303   set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
10304
10305   if (in_it_block ())
10306     {
10307       /* Conditional branches inside IT blocks are encoded as unconditional
10308          branches.  */
10309       cond = COND_ALWAYS;
10310     }
10311   else
10312     cond = inst.cond;
10313
10314   if (cond != COND_ALWAYS)
10315     opcode = T_MNEM_bcond;
10316   else
10317     opcode = inst.instruction;
10318
10319   if (unified_syntax
10320       && (inst.size_req == 4
10321           || (inst.size_req != 2
10322               && (inst.operands[0].hasreloc
10323                   || inst.reloc.exp.X_op == O_constant))))
10324     {
10325       inst.instruction = THUMB_OP32(opcode);
10326       if (cond == COND_ALWAYS)
10327         reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
10328       else
10329         {
10330           gas_assert (cond != 0xF);
10331           inst.instruction |= cond << 22;
10332           reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
10333         }
10334     }
10335   else
10336     {
10337       inst.instruction = THUMB_OP16(opcode);
10338       if (cond == COND_ALWAYS)
10339         reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
10340       else
10341         {
10342           inst.instruction |= cond << 8;
10343           reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
10344         }
10345       /* Allow section relaxation.  */
10346       if (unified_syntax && inst.size_req != 2)
10347         inst.relax = opcode;
10348     }
10349   inst.reloc.type = reloc;
10350   inst.reloc.pc_rel = 1;
10351 }
10352
10353 /* Actually do the work for Thumb state bkpt and hlt.  The only difference
10354    between the two is the maximum immediate allowed - which is passed in
10355    RANGE.  */
10356 static void
10357 do_t_bkpt_hlt1 (int range)
10358 {
10359   constraint (inst.cond != COND_ALWAYS,
10360               _("instruction is always unconditional"));
10361   if (inst.operands[0].present)
10362     {
10363       constraint (inst.operands[0].imm > range,
10364                   _("immediate value out of range"));
10365       inst.instruction |= inst.operands[0].imm;
10366     }
10367
10368   set_it_insn_type (NEUTRAL_IT_INSN);
10369 }
10370
10371 static void
10372 do_t_hlt (void)
10373 {
10374   do_t_bkpt_hlt1 (63);
10375 }
10376
10377 static void
10378 do_t_bkpt (void)
10379 {
10380   do_t_bkpt_hlt1 (255);
10381 }
10382
10383 static void
10384 do_t_branch23 (void)
10385 {
10386   set_it_insn_type_last ();
10387   encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
10388
10389   /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
10390      this file.  We used to simply ignore the PLT reloc type here --
10391      the branch encoding is now needed to deal with TLSCALL relocs.
10392      So if we see a PLT reloc now, put it back to how it used to be to
10393      keep the preexisting behaviour.  */
10394   if (inst.reloc.type == BFD_RELOC_ARM_PLT32)
10395     inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
10396
10397 #if defined(OBJ_COFF)
10398   /* If the destination of the branch is a defined symbol which does not have
10399      the THUMB_FUNC attribute, then we must be calling a function which has
10400      the (interfacearm) attribute.  We look for the Thumb entry point to that
10401      function and change the branch to refer to that function instead.  */
10402   if (   inst.reloc.exp.X_op == O_symbol
10403       && inst.reloc.exp.X_add_symbol != NULL
10404       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
10405       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
10406     inst.reloc.exp.X_add_symbol =
10407       find_real_start (inst.reloc.exp.X_add_symbol);
10408 #endif
10409 }
10410
10411 static void
10412 do_t_bx (void)
10413 {
10414   set_it_insn_type_last ();
10415   inst.instruction |= inst.operands[0].reg << 3;
10416   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
10417      should cause the alignment to be checked once it is known.  This is
10418      because BX PC only works if the instruction is word aligned.  */
10419 }
10420
10421 static void
10422 do_t_bxj (void)
10423 {
10424   int Rm;
10425
10426   set_it_insn_type_last ();
10427   Rm = inst.operands[0].reg;
10428   reject_bad_reg (Rm);
10429   inst.instruction |= Rm << 16;
10430 }
10431
10432 static void
10433 do_t_clz (void)
10434 {
10435   unsigned Rd;
10436   unsigned Rm;
10437
10438   Rd = inst.operands[0].reg;
10439   Rm = inst.operands[1].reg;
10440
10441   reject_bad_reg (Rd);
10442   reject_bad_reg (Rm);
10443
10444   inst.instruction |= Rd << 8;
10445   inst.instruction |= Rm << 16;
10446   inst.instruction |= Rm;
10447 }
10448
10449 static void
10450 do_t_cps (void)
10451 {
10452   set_it_insn_type (OUTSIDE_IT_INSN);
10453   inst.instruction |= inst.operands[0].imm;
10454 }
10455
10456 static void
10457 do_t_cpsi (void)
10458 {
10459   set_it_insn_type (OUTSIDE_IT_INSN);
10460   if (unified_syntax
10461       && (inst.operands[1].present || inst.size_req == 4)
10462       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
10463     {
10464       unsigned int imod = (inst.instruction & 0x0030) >> 4;
10465       inst.instruction = 0xf3af8000;
10466       inst.instruction |= imod << 9;
10467       inst.instruction |= inst.operands[0].imm << 5;
10468       if (inst.operands[1].present)
10469         inst.instruction |= 0x100 | inst.operands[1].imm;
10470     }
10471   else
10472     {
10473       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
10474                   && (inst.operands[0].imm & 4),
10475                   _("selected processor does not support 'A' form "
10476                     "of this instruction"));
10477       constraint (inst.operands[1].present || inst.size_req == 4,
10478                   _("Thumb does not support the 2-argument "
10479                     "form of this instruction"));
10480       inst.instruction |= inst.operands[0].imm;
10481     }
10482 }
10483
10484 /* THUMB CPY instruction (argument parse).  */
10485
10486 static void
10487 do_t_cpy (void)
10488 {
10489   if (inst.size_req == 4)
10490     {
10491       inst.instruction = THUMB_OP32 (T_MNEM_mov);
10492       inst.instruction |= inst.operands[0].reg << 8;
10493       inst.instruction |= inst.operands[1].reg;
10494     }
10495   else
10496     {
10497       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
10498       inst.instruction |= (inst.operands[0].reg & 0x7);
10499       inst.instruction |= inst.operands[1].reg << 3;
10500     }
10501 }
10502
10503 static void
10504 do_t_cbz (void)
10505 {
10506   set_it_insn_type (OUTSIDE_IT_INSN);
10507   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10508   inst.instruction |= inst.operands[0].reg;
10509   inst.reloc.pc_rel = 1;
10510   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
10511 }
10512
10513 static void
10514 do_t_dbg (void)
10515 {
10516   inst.instruction |= inst.operands[0].imm;
10517 }
10518
10519 static void
10520 do_t_div (void)
10521 {
10522   unsigned Rd, Rn, Rm;
10523
10524   Rd = inst.operands[0].reg;
10525   Rn = (inst.operands[1].present
10526         ? inst.operands[1].reg : Rd);
10527   Rm = inst.operands[2].reg;
10528
10529   reject_bad_reg (Rd);
10530   reject_bad_reg (Rn);
10531   reject_bad_reg (Rm);
10532
10533   inst.instruction |= Rd << 8;
10534   inst.instruction |= Rn << 16;
10535   inst.instruction |= Rm;
10536 }
10537
10538 static void
10539 do_t_hint (void)
10540 {
10541   if (unified_syntax && inst.size_req == 4)
10542     inst.instruction = THUMB_OP32 (inst.instruction);
10543   else
10544     inst.instruction = THUMB_OP16 (inst.instruction);
10545 }
10546
10547 static void
10548 do_t_it (void)
10549 {
10550   unsigned int cond = inst.operands[0].imm;
10551
10552   set_it_insn_type (IT_INSN);
10553   now_it.mask = (inst.instruction & 0xf) | 0x10;
10554   now_it.cc = cond;
10555   now_it.warn_deprecated = FALSE;
10556
10557   /* If the condition is a negative condition, invert the mask.  */
10558   if ((cond & 0x1) == 0x0)
10559     {
10560       unsigned int mask = inst.instruction & 0x000f;
10561
10562       if ((mask & 0x7) == 0)
10563         {
10564           /* No conversion needed.  */
10565           now_it.block_length = 1;
10566         }
10567       else if ((mask & 0x3) == 0)
10568         {
10569           mask ^= 0x8;
10570           now_it.block_length = 2;
10571         }
10572       else if ((mask & 0x1) == 0)
10573         {
10574           mask ^= 0xC;
10575           now_it.block_length = 3;
10576         }
10577       else
10578         {
10579           mask ^= 0xE;
10580           now_it.block_length = 4;
10581         }
10582
10583       inst.instruction &= 0xfff0;
10584       inst.instruction |= mask;
10585     }
10586
10587   inst.instruction |= cond << 4;
10588 }
10589
10590 /* Helper function used for both push/pop and ldm/stm.  */
10591 static void
10592 encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
10593 {
10594   bfd_boolean load;
10595
10596   load = (inst.instruction & (1 << 20)) != 0;
10597
10598   if (mask & (1 << 13))
10599     inst.error =  _("SP not allowed in register list");
10600
10601   if ((mask & (1 << base)) != 0
10602       && writeback)
10603     inst.error = _("having the base register in the register list when "
10604                    "using write back is UNPREDICTABLE");
10605
10606   if (load)
10607     {
10608       if (mask & (1 << 15))
10609         {
10610           if (mask & (1 << 14))
10611             inst.error = _("LR and PC should not both be in register list");
10612           else
10613             set_it_insn_type_last ();
10614         }
10615     }
10616   else
10617     {
10618       if (mask & (1 << 15))
10619         inst.error = _("PC not allowed in register list");
10620     }
10621
10622   if ((mask & (mask - 1)) == 0)
10623     {
10624       /* Single register transfers implemented as str/ldr.  */
10625       if (writeback)
10626         {
10627           if (inst.instruction & (1 << 23))
10628             inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
10629           else
10630             inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
10631         }
10632       else
10633         {
10634           if (inst.instruction & (1 << 23))
10635             inst.instruction = 0x00800000; /* ia -> [base] */
10636           else
10637             inst.instruction = 0x00000c04; /* db -> [base, #-4] */
10638         }
10639
10640       inst.instruction |= 0xf8400000;
10641       if (load)
10642         inst.instruction |= 0x00100000;
10643
10644       mask = ffs (mask) - 1;
10645       mask <<= 12;
10646     }
10647   else if (writeback)
10648     inst.instruction |= WRITE_BACK;
10649
10650   inst.instruction |= mask;
10651   inst.instruction |= base << 16;
10652 }
10653
10654 static void
10655 do_t_ldmstm (void)
10656 {
10657   /* This really doesn't seem worth it.  */
10658   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10659               _("expression too complex"));
10660   constraint (inst.operands[1].writeback,
10661               _("Thumb load/store multiple does not support {reglist}^"));
10662
10663   if (unified_syntax)
10664     {
10665       bfd_boolean narrow;
10666       unsigned mask;
10667
10668       narrow = FALSE;
10669       /* See if we can use a 16-bit instruction.  */
10670       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
10671           && inst.size_req != 4
10672           && !(inst.operands[1].imm & ~0xff))
10673         {
10674           mask = 1 << inst.operands[0].reg;
10675
10676           if (inst.operands[0].reg <= 7)
10677             {
10678               if (inst.instruction == T_MNEM_stmia
10679                   ? inst.operands[0].writeback
10680                   : (inst.operands[0].writeback
10681                      == !(inst.operands[1].imm & mask)))
10682                 {
10683                   if (inst.instruction == T_MNEM_stmia
10684                       && (inst.operands[1].imm & mask)
10685                       && (inst.operands[1].imm & (mask - 1)))
10686                     as_warn (_("value stored for r%d is UNKNOWN"),
10687                              inst.operands[0].reg);
10688
10689                   inst.instruction = THUMB_OP16 (inst.instruction);
10690                   inst.instruction |= inst.operands[0].reg << 8;
10691                   inst.instruction |= inst.operands[1].imm;
10692                   narrow = TRUE;
10693                 }
10694               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10695                 {
10696                   /* This means 1 register in reg list one of 3 situations:
10697                      1. Instruction is stmia, but without writeback.
10698                      2. lmdia without writeback, but with Rn not in
10699                         reglist.
10700                      3. ldmia with writeback, but with Rn in reglist.
10701                      Case 3 is UNPREDICTABLE behaviour, so we handle
10702                      case 1 and 2 which can be converted into a 16-bit
10703                      str or ldr. The SP cases are handled below.  */
10704                   unsigned long opcode;
10705                   /* First, record an error for Case 3.  */
10706                   if (inst.operands[1].imm & mask
10707                       && inst.operands[0].writeback)
10708                     inst.error =
10709                         _("having the base register in the register list when "
10710                           "using write back is UNPREDICTABLE");
10711
10712                   opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str
10713                                                              : T_MNEM_ldr);
10714                   inst.instruction = THUMB_OP16 (opcode);
10715                   inst.instruction |= inst.operands[0].reg << 3;
10716                   inst.instruction |= (ffs (inst.operands[1].imm)-1);
10717                   narrow = TRUE;
10718                 }
10719             }
10720           else if (inst.operands[0] .reg == REG_SP)
10721             {
10722               if (inst.operands[0].writeback)
10723                 {
10724                   inst.instruction =
10725                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10726                                     ? T_MNEM_push : T_MNEM_pop);
10727                   inst.instruction |= inst.operands[1].imm;
10728                   narrow = TRUE;
10729                 }
10730               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10731                 {
10732                   inst.instruction =
10733                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10734                                     ? T_MNEM_str_sp : T_MNEM_ldr_sp);
10735                   inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
10736                   narrow = TRUE;
10737                 }
10738             }
10739         }
10740
10741       if (!narrow)
10742         {
10743           if (inst.instruction < 0xffff)
10744             inst.instruction = THUMB_OP32 (inst.instruction);
10745
10746           encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
10747                                 inst.operands[0].writeback);
10748         }
10749     }
10750   else
10751     {
10752       constraint (inst.operands[0].reg > 7
10753                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
10754       constraint (inst.instruction != T_MNEM_ldmia
10755                   && inst.instruction != T_MNEM_stmia,
10756                   _("Thumb-2 instruction only valid in unified syntax"));
10757       if (inst.instruction == T_MNEM_stmia)
10758         {
10759           if (!inst.operands[0].writeback)
10760             as_warn (_("this instruction will write back the base register"));
10761           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
10762               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
10763             as_warn (_("value stored for r%d is UNKNOWN"),
10764                      inst.operands[0].reg);
10765         }
10766       else
10767         {
10768           if (!inst.operands[0].writeback
10769               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
10770             as_warn (_("this instruction will write back the base register"));
10771           else if (inst.operands[0].writeback
10772                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
10773             as_warn (_("this instruction will not write back the base register"));
10774         }
10775
10776       inst.instruction = THUMB_OP16 (inst.instruction);
10777       inst.instruction |= inst.operands[0].reg << 8;
10778       inst.instruction |= inst.operands[1].imm;
10779     }
10780 }
10781
10782 static void
10783 do_t_ldrex (void)
10784 {
10785   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
10786               || inst.operands[1].postind || inst.operands[1].writeback
10787               || inst.operands[1].immisreg || inst.operands[1].shifted
10788               || inst.operands[1].negative,
10789               BAD_ADDR_MODE);
10790
10791   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
10792
10793   inst.instruction |= inst.operands[0].reg << 12;
10794   inst.instruction |= inst.operands[1].reg << 16;
10795   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10796 }
10797
10798 static void
10799 do_t_ldrexd (void)
10800 {
10801   if (!inst.operands[1].present)
10802     {
10803       constraint (inst.operands[0].reg == REG_LR,
10804                   _("r14 not allowed as first register "
10805                     "when second register is omitted"));
10806       inst.operands[1].reg = inst.operands[0].reg + 1;
10807     }
10808   constraint (inst.operands[0].reg == inst.operands[1].reg,
10809               BAD_OVERLAP);
10810
10811   inst.instruction |= inst.operands[0].reg << 12;
10812   inst.instruction |= inst.operands[1].reg << 8;
10813   inst.instruction |= inst.operands[2].reg << 16;
10814 }
10815
10816 static void
10817 do_t_ldst (void)
10818 {
10819   unsigned long opcode;
10820   int Rn;
10821
10822   if (inst.operands[0].isreg
10823       && !inst.operands[0].preind
10824       && inst.operands[0].reg == REG_PC)
10825     set_it_insn_type_last ();
10826
10827   opcode = inst.instruction;
10828   if (unified_syntax)
10829     {
10830       if (!inst.operands[1].isreg)
10831         {
10832           if (opcode <= 0xffff)
10833             inst.instruction = THUMB_OP32 (opcode);
10834           if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10835             return;
10836         }
10837       if (inst.operands[1].isreg
10838           && !inst.operands[1].writeback
10839           && !inst.operands[1].shifted && !inst.operands[1].postind
10840           && !inst.operands[1].negative && inst.operands[0].reg <= 7
10841           && opcode <= 0xffff
10842           && inst.size_req != 4)
10843         {
10844           /* Insn may have a 16-bit form.  */
10845           Rn = inst.operands[1].reg;
10846           if (inst.operands[1].immisreg)
10847             {
10848               inst.instruction = THUMB_OP16 (opcode);
10849               /* [Rn, Rik] */
10850               if (Rn <= 7 && inst.operands[1].imm <= 7)
10851                 goto op16;
10852               else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
10853                 reject_bad_reg (inst.operands[1].imm);
10854             }
10855           else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
10856                     && opcode != T_MNEM_ldrsb)
10857                    || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
10858                    || (Rn == REG_SP && opcode == T_MNEM_str))
10859             {
10860               /* [Rn, #const] */
10861               if (Rn > 7)
10862                 {
10863                   if (Rn == REG_PC)
10864                     {
10865                       if (inst.reloc.pc_rel)
10866                         opcode = T_MNEM_ldr_pc2;
10867                       else
10868                         opcode = T_MNEM_ldr_pc;
10869                     }
10870                   else
10871                     {
10872                       if (opcode == T_MNEM_ldr)
10873                         opcode = T_MNEM_ldr_sp;
10874                       else
10875                         opcode = T_MNEM_str_sp;
10876                     }
10877                   inst.instruction = inst.operands[0].reg << 8;
10878                 }
10879               else
10880                 {
10881                   inst.instruction = inst.operands[0].reg;
10882                   inst.instruction |= inst.operands[1].reg << 3;
10883                 }
10884               inst.instruction |= THUMB_OP16 (opcode);
10885               if (inst.size_req == 2)
10886                 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10887               else
10888                 inst.relax = opcode;
10889               return;
10890             }
10891         }
10892       /* Definitely a 32-bit variant.  */
10893
10894       /* Warning for Erratum 752419.  */
10895       if (opcode == T_MNEM_ldr
10896           && inst.operands[0].reg == REG_SP
10897           && inst.operands[1].writeback == 1
10898           && !inst.operands[1].immisreg)
10899         {
10900           if (no_cpu_selected ()
10901               || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
10902                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
10903                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
10904             as_warn (_("This instruction may be unpredictable "
10905                        "if executed on M-profile cores "
10906                        "with interrupts enabled."));
10907         }
10908
10909       /* Do some validations regarding addressing modes.  */
10910       if (inst.operands[1].immisreg)
10911         reject_bad_reg (inst.operands[1].imm);
10912
10913       constraint (inst.operands[1].writeback == 1
10914                   && inst.operands[0].reg == inst.operands[1].reg,
10915                   BAD_OVERLAP);
10916
10917       inst.instruction = THUMB_OP32 (opcode);
10918       inst.instruction |= inst.operands[0].reg << 12;
10919       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
10920       check_ldr_r15_aligned ();
10921       return;
10922     }
10923
10924   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10925
10926   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
10927     {
10928       /* Only [Rn,Rm] is acceptable.  */
10929       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10930       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10931                   || inst.operands[1].postind || inst.operands[1].shifted
10932                   || inst.operands[1].negative,
10933                   _("Thumb does not support this addressing mode"));
10934       inst.instruction = THUMB_OP16 (inst.instruction);
10935       goto op16;
10936     }
10937
10938   inst.instruction = THUMB_OP16 (inst.instruction);
10939   if (!inst.operands[1].isreg)
10940     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10941       return;
10942
10943   constraint (!inst.operands[1].preind
10944               || inst.operands[1].shifted
10945               || inst.operands[1].writeback,
10946               _("Thumb does not support this addressing mode"));
10947   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
10948     {
10949       constraint (inst.instruction & 0x0600,
10950                   _("byte or halfword not valid for base register"));
10951       constraint (inst.operands[1].reg == REG_PC
10952                   && !(inst.instruction & THUMB_LOAD_BIT),
10953                   _("r15 based store not allowed"));
10954       constraint (inst.operands[1].immisreg,
10955                   _("invalid base register for register offset"));
10956
10957       if (inst.operands[1].reg == REG_PC)
10958         inst.instruction = T_OPCODE_LDR_PC;
10959       else if (inst.instruction & THUMB_LOAD_BIT)
10960         inst.instruction = T_OPCODE_LDR_SP;
10961       else
10962         inst.instruction = T_OPCODE_STR_SP;
10963
10964       inst.instruction |= inst.operands[0].reg << 8;
10965       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10966       return;
10967     }
10968
10969   constraint (inst.operands[1].reg > 7, BAD_HIREG);
10970   if (!inst.operands[1].immisreg)
10971     {
10972       /* Immediate offset.  */
10973       inst.instruction |= inst.operands[0].reg;
10974       inst.instruction |= inst.operands[1].reg << 3;
10975       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10976       return;
10977     }
10978
10979   /* Register offset.  */
10980   constraint (inst.operands[1].imm > 7, BAD_HIREG);
10981   constraint (inst.operands[1].negative,
10982               _("Thumb does not support this addressing mode"));
10983
10984  op16:
10985   switch (inst.instruction)
10986     {
10987     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10988     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10989     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10990     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10991     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10992     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10993     case 0x5600 /* ldrsb */:
10994     case 0x5e00 /* ldrsh */: break;
10995     default: abort ();
10996     }
10997
10998   inst.instruction |= inst.operands[0].reg;
10999   inst.instruction |= inst.operands[1].reg << 3;
11000   inst.instruction |= inst.operands[1].imm << 6;
11001 }
11002
11003 static void
11004 do_t_ldstd (void)
11005 {
11006   if (!inst.operands[1].present)
11007     {
11008       inst.operands[1].reg = inst.operands[0].reg + 1;
11009       constraint (inst.operands[0].reg == REG_LR,
11010                   _("r14 not allowed here"));
11011       constraint (inst.operands[0].reg == REG_R12,
11012                   _("r12 not allowed here"));
11013     }
11014
11015   if (inst.operands[2].writeback
11016       && (inst.operands[0].reg == inst.operands[2].reg
11017       || inst.operands[1].reg == inst.operands[2].reg))
11018     as_warn (_("base register written back, and overlaps "
11019                "one of transfer registers"));
11020
11021   inst.instruction |= inst.operands[0].reg << 12;
11022   inst.instruction |= inst.operands[1].reg << 8;
11023   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
11024 }
11025
11026 static void
11027 do_t_ldstt (void)
11028 {
11029   inst.instruction |= inst.operands[0].reg << 12;
11030   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
11031 }
11032
11033 static void
11034 do_t_mla (void)
11035 {
11036   unsigned Rd, Rn, Rm, Ra;
11037
11038   Rd = inst.operands[0].reg;
11039   Rn = inst.operands[1].reg;
11040   Rm = inst.operands[2].reg;
11041   Ra = inst.operands[3].reg;
11042
11043   reject_bad_reg (Rd);
11044   reject_bad_reg (Rn);
11045   reject_bad_reg (Rm);
11046   reject_bad_reg (Ra);
11047
11048   inst.instruction |= Rd << 8;
11049   inst.instruction |= Rn << 16;
11050   inst.instruction |= Rm;
11051   inst.instruction |= Ra << 12;
11052 }
11053
11054 static void
11055 do_t_mlal (void)
11056 {
11057   unsigned RdLo, RdHi, Rn, Rm;
11058
11059   RdLo = inst.operands[0].reg;
11060   RdHi = inst.operands[1].reg;
11061   Rn = inst.operands[2].reg;
11062   Rm = inst.operands[3].reg;
11063
11064   reject_bad_reg (RdLo);
11065   reject_bad_reg (RdHi);
11066   reject_bad_reg (Rn);
11067   reject_bad_reg (Rm);
11068
11069   inst.instruction |= RdLo << 12;
11070   inst.instruction |= RdHi << 8;
11071   inst.instruction |= Rn << 16;
11072   inst.instruction |= Rm;
11073 }
11074
11075 static void
11076 do_t_mov_cmp (void)
11077 {
11078   unsigned Rn, Rm;
11079
11080   Rn = inst.operands[0].reg;
11081   Rm = inst.operands[1].reg;
11082
11083   if (Rn == REG_PC)
11084     set_it_insn_type_last ();
11085
11086   if (unified_syntax)
11087     {
11088       int r0off = (inst.instruction == T_MNEM_mov
11089                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
11090       unsigned long opcode;
11091       bfd_boolean narrow;
11092       bfd_boolean low_regs;
11093
11094       low_regs = (Rn <= 7 && Rm <= 7);
11095       opcode = inst.instruction;
11096       if (in_it_block ())
11097         narrow = opcode != T_MNEM_movs;
11098       else
11099         narrow = opcode != T_MNEM_movs || low_regs;
11100       if (inst.size_req == 4
11101           || inst.operands[1].shifted)
11102         narrow = FALSE;
11103
11104       /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
11105       if (opcode == T_MNEM_movs && inst.operands[1].isreg
11106           && !inst.operands[1].shifted
11107           && Rn == REG_PC
11108           && Rm == REG_LR)
11109         {
11110           inst.instruction = T2_SUBS_PC_LR;
11111           return;
11112         }
11113
11114       if (opcode == T_MNEM_cmp)
11115         {
11116           constraint (Rn == REG_PC, BAD_PC);
11117           if (narrow)
11118             {
11119               /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
11120                  but valid.  */
11121               warn_deprecated_sp (Rm);
11122               /* R15 was documented as a valid choice for Rm in ARMv6,
11123                  but as UNPREDICTABLE in ARMv7.  ARM's proprietary
11124                  tools reject R15, so we do too.  */
11125               constraint (Rm == REG_PC, BAD_PC);
11126             }
11127           else
11128             reject_bad_reg (Rm);
11129         }
11130       else if (opcode == T_MNEM_mov
11131                || opcode == T_MNEM_movs)
11132         {
11133           if (inst.operands[1].isreg)
11134             {
11135               if (opcode == T_MNEM_movs)
11136                 {
11137                   reject_bad_reg (Rn);
11138                   reject_bad_reg (Rm);
11139                 }
11140               else if (narrow)
11141                 {
11142                   /* This is mov.n.  */
11143                   if ((Rn == REG_SP || Rn == REG_PC)
11144                       && (Rm == REG_SP || Rm == REG_PC))
11145                     {
11146                       as_warn (_("Use of r%u as a source register is "
11147                                  "deprecated when r%u is the destination "
11148                                  "register."), Rm, Rn);
11149                     }
11150                 }
11151               else
11152                 {
11153                   /* This is mov.w.  */
11154                   constraint (Rn == REG_PC, BAD_PC);
11155                   constraint (Rm == REG_PC, BAD_PC);
11156                   constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
11157                 }
11158             }
11159           else
11160             reject_bad_reg (Rn);
11161         }
11162
11163       if (!inst.operands[1].isreg)
11164         {
11165           /* Immediate operand.  */
11166           if (!in_it_block () && opcode == T_MNEM_mov)
11167             narrow = 0;
11168           if (low_regs && narrow)
11169             {
11170               inst.instruction = THUMB_OP16 (opcode);
11171               inst.instruction |= Rn << 8;
11172               if (inst.size_req == 2)
11173                 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11174               else
11175                 inst.relax = opcode;
11176             }
11177           else
11178             {
11179               inst.instruction = THUMB_OP32 (inst.instruction);
11180               inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11181               inst.instruction |= Rn << r0off;
11182               inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11183             }
11184         }
11185       else if (inst.operands[1].shifted && inst.operands[1].immisreg
11186                && (inst.instruction == T_MNEM_mov
11187                    || inst.instruction == T_MNEM_movs))
11188         {
11189           /* Register shifts are encoded as separate shift instructions.  */
11190           bfd_boolean flags = (inst.instruction == T_MNEM_movs);
11191
11192           if (in_it_block ())
11193             narrow = !flags;
11194           else
11195             narrow = flags;
11196
11197           if (inst.size_req == 4)
11198             narrow = FALSE;
11199
11200           if (!low_regs || inst.operands[1].imm > 7)
11201             narrow = FALSE;
11202
11203           if (Rn != Rm)
11204             narrow = FALSE;
11205
11206           switch (inst.operands[1].shift_kind)
11207             {
11208             case SHIFT_LSL:
11209               opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
11210               break;
11211             case SHIFT_ASR:
11212               opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
11213               break;
11214             case SHIFT_LSR:
11215               opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
11216               break;
11217             case SHIFT_ROR:
11218               opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
11219               break;
11220             default:
11221               abort ();
11222             }
11223
11224           inst.instruction = opcode;
11225           if (narrow)
11226             {
11227               inst.instruction |= Rn;
11228               inst.instruction |= inst.operands[1].imm << 3;
11229             }
11230           else
11231             {
11232               if (flags)
11233                 inst.instruction |= CONDS_BIT;
11234
11235               inst.instruction |= Rn << 8;
11236               inst.instruction |= Rm << 16;
11237               inst.instruction |= inst.operands[1].imm;
11238             }
11239         }
11240       else if (!narrow)
11241         {
11242           /* Some mov with immediate shift have narrow variants.
11243              Register shifts are handled above.  */
11244           if (low_regs && inst.operands[1].shifted
11245               && (inst.instruction == T_MNEM_mov
11246                   || inst.instruction == T_MNEM_movs))
11247             {
11248               if (in_it_block ())
11249                 narrow = (inst.instruction == T_MNEM_mov);
11250               else
11251                 narrow = (inst.instruction == T_MNEM_movs);
11252             }
11253
11254           if (narrow)
11255             {
11256               switch (inst.operands[1].shift_kind)
11257                 {
11258                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11259                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11260                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11261                 default: narrow = FALSE; break;
11262                 }
11263             }
11264
11265           if (narrow)
11266             {
11267               inst.instruction |= Rn;
11268               inst.instruction |= Rm << 3;
11269               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11270             }
11271           else
11272             {
11273               inst.instruction = THUMB_OP32 (inst.instruction);
11274               inst.instruction |= Rn << r0off;
11275               encode_thumb32_shifted_operand (1);
11276             }
11277         }
11278       else
11279         switch (inst.instruction)
11280           {
11281           case T_MNEM_mov:
11282             /* In v4t or v5t a move of two lowregs produces unpredictable
11283                results. Don't allow this.  */
11284             if (low_regs)
11285               {
11286                 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6),
11287                             "MOV Rd, Rs with two low registers is not "
11288                             "permitted on this architecture");
11289                 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
11290                                         arm_ext_v6);
11291               }
11292
11293             inst.instruction = T_OPCODE_MOV_HR;
11294             inst.instruction |= (Rn & 0x8) << 4;
11295             inst.instruction |= (Rn & 0x7);
11296             inst.instruction |= Rm << 3;
11297             break;
11298
11299           case T_MNEM_movs:
11300             /* We know we have low registers at this point.
11301                Generate LSLS Rd, Rs, #0.  */
11302             inst.instruction = T_OPCODE_LSL_I;
11303             inst.instruction |= Rn;
11304             inst.instruction |= Rm << 3;
11305             break;
11306
11307           case T_MNEM_cmp:
11308             if (low_regs)
11309               {
11310                 inst.instruction = T_OPCODE_CMP_LR;
11311                 inst.instruction |= Rn;
11312                 inst.instruction |= Rm << 3;
11313               }
11314             else
11315               {
11316                 inst.instruction = T_OPCODE_CMP_HR;
11317                 inst.instruction |= (Rn & 0x8) << 4;
11318                 inst.instruction |= (Rn & 0x7);
11319                 inst.instruction |= Rm << 3;
11320               }
11321             break;
11322           }
11323       return;
11324     }
11325
11326   inst.instruction = THUMB_OP16 (inst.instruction);
11327
11328   /* PR 10443: Do not silently ignore shifted operands.  */
11329   constraint (inst.operands[1].shifted,
11330               _("shifts in CMP/MOV instructions are only supported in unified syntax"));
11331
11332   if (inst.operands[1].isreg)
11333     {
11334       if (Rn < 8 && Rm < 8)
11335         {
11336           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
11337              since a MOV instruction produces unpredictable results.  */
11338           if (inst.instruction == T_OPCODE_MOV_I8)
11339             inst.instruction = T_OPCODE_ADD_I3;
11340           else
11341             inst.instruction = T_OPCODE_CMP_LR;
11342
11343           inst.instruction |= Rn;
11344           inst.instruction |= Rm << 3;
11345         }
11346       else
11347         {
11348           if (inst.instruction == T_OPCODE_MOV_I8)
11349             inst.instruction = T_OPCODE_MOV_HR;
11350           else
11351             inst.instruction = T_OPCODE_CMP_HR;
11352           do_t_cpy ();
11353         }
11354     }
11355   else
11356     {
11357       constraint (Rn > 7,
11358                   _("only lo regs allowed with immediate"));
11359       inst.instruction |= Rn << 8;
11360       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11361     }
11362 }
11363
11364 static void
11365 do_t_mov16 (void)
11366 {
11367   unsigned Rd;
11368   bfd_vma imm;
11369   bfd_boolean top;
11370
11371   top = (inst.instruction & 0x00800000) != 0;
11372   if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
11373     {
11374       constraint (top, _(":lower16: not allowed this instruction"));
11375       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
11376     }
11377   else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
11378     {
11379       constraint (!top, _(":upper16: not allowed this instruction"));
11380       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
11381     }
11382
11383   Rd = inst.operands[0].reg;
11384   reject_bad_reg (Rd);
11385
11386   inst.instruction |= Rd << 8;
11387   if (inst.reloc.type == BFD_RELOC_UNUSED)
11388     {
11389       imm = inst.reloc.exp.X_add_number;
11390       inst.instruction |= (imm & 0xf000) << 4;
11391       inst.instruction |= (imm & 0x0800) << 15;
11392       inst.instruction |= (imm & 0x0700) << 4;
11393       inst.instruction |= (imm & 0x00ff);
11394     }
11395 }
11396
11397 static void
11398 do_t_mvn_tst (void)
11399 {
11400   unsigned Rn, Rm;
11401
11402   Rn = inst.operands[0].reg;
11403   Rm = inst.operands[1].reg;
11404
11405   if (inst.instruction == T_MNEM_cmp
11406       || inst.instruction == T_MNEM_cmn)
11407     constraint (Rn == REG_PC, BAD_PC);
11408   else
11409     reject_bad_reg (Rn);
11410   reject_bad_reg (Rm);
11411
11412   if (unified_syntax)
11413     {
11414       int r0off = (inst.instruction == T_MNEM_mvn
11415                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
11416       bfd_boolean narrow;
11417
11418       if (inst.size_req == 4
11419           || inst.instruction > 0xffff
11420           || inst.operands[1].shifted
11421           || Rn > 7 || Rm > 7)
11422         narrow = FALSE;
11423       else if (inst.instruction == T_MNEM_cmn
11424                || inst.instruction == T_MNEM_tst)
11425         narrow = TRUE;
11426       else if (THUMB_SETS_FLAGS (inst.instruction))
11427         narrow = !in_it_block ();
11428       else
11429         narrow = in_it_block ();
11430
11431       if (!inst.operands[1].isreg)
11432         {
11433           /* For an immediate, we always generate a 32-bit opcode;
11434              section relaxation will shrink it later if possible.  */
11435           if (inst.instruction < 0xffff)
11436             inst.instruction = THUMB_OP32 (inst.instruction);
11437           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11438           inst.instruction |= Rn << r0off;
11439           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11440         }
11441       else
11442         {
11443           /* See if we can do this with a 16-bit instruction.  */
11444           if (narrow)
11445             {
11446               inst.instruction = THUMB_OP16 (inst.instruction);
11447               inst.instruction |= Rn;
11448               inst.instruction |= Rm << 3;
11449             }
11450           else
11451             {
11452               constraint (inst.operands[1].shifted
11453                           && inst.operands[1].immisreg,
11454                           _("shift must be constant"));
11455               if (inst.instruction < 0xffff)
11456                 inst.instruction = THUMB_OP32 (inst.instruction);
11457               inst.instruction |= Rn << r0off;
11458               encode_thumb32_shifted_operand (1);
11459             }
11460         }
11461     }
11462   else
11463     {
11464       constraint (inst.instruction > 0xffff
11465                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
11466       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
11467                   _("unshifted register required"));
11468       constraint (Rn > 7 || Rm > 7,
11469                   BAD_HIREG);
11470
11471       inst.instruction = THUMB_OP16 (inst.instruction);
11472       inst.instruction |= Rn;
11473       inst.instruction |= Rm << 3;
11474     }
11475 }
11476
11477 static void
11478 do_t_mrs (void)
11479 {
11480   unsigned Rd;
11481
11482   if (do_vfp_nsyn_mrs () == SUCCESS)
11483     return;
11484
11485   Rd = inst.operands[0].reg;
11486   reject_bad_reg (Rd);
11487   inst.instruction |= Rd << 8;
11488
11489   if (inst.operands[1].isreg)
11490     {
11491       unsigned br = inst.operands[1].reg;
11492       if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
11493         as_bad (_("bad register for mrs"));
11494
11495       inst.instruction |= br & (0xf << 16);
11496       inst.instruction |= (br & 0x300) >> 4;
11497       inst.instruction |= (br & SPSR_BIT) >> 2;
11498     }
11499   else
11500     {
11501       int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11502
11503       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11504         {
11505           /* PR gas/12698:  The constraint is only applied for m_profile.
11506              If the user has specified -march=all, we want to ignore it as
11507              we are building for any CPU type, including non-m variants.  */
11508           bfd_boolean m_profile = selected_cpu.core != arm_arch_any.core;
11509           constraint ((flags != 0) && m_profile, _("selected processor does "
11510                                                    "not support requested special purpose register"));
11511         }
11512       else
11513         /* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
11514            devices).  */
11515         constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
11516                     _("'APSR', 'CPSR' or 'SPSR' expected"));
11517
11518       inst.instruction |= (flags & SPSR_BIT) >> 2;
11519       inst.instruction |= inst.operands[1].imm & 0xff;
11520       inst.instruction |= 0xf0000;
11521     }
11522 }
11523
11524 static void
11525 do_t_msr (void)
11526 {
11527   int flags;
11528   unsigned Rn;
11529
11530   if (do_vfp_nsyn_msr () == SUCCESS)
11531     return;
11532
11533   constraint (!inst.operands[1].isreg,
11534               _("Thumb encoding does not support an immediate here"));
11535
11536   if (inst.operands[0].isreg)
11537     flags = (int)(inst.operands[0].reg);
11538   else
11539     flags = inst.operands[0].imm;
11540
11541   if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11542     {
11543       int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11544
11545       /* PR gas/12698:  The constraint is only applied for m_profile.
11546          If the user has specified -march=all, we want to ignore it as
11547          we are building for any CPU type, including non-m variants.  */
11548       bfd_boolean m_profile = selected_cpu.core != arm_arch_any.core;
11549       constraint (((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11550            && (bits & ~(PSR_s | PSR_f)) != 0)
11551           || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11552               && bits != PSR_f)) && m_profile,
11553           _("selected processor does not support requested special "
11554             "purpose register"));
11555     }
11556   else
11557      constraint ((flags & 0xff) != 0, _("selected processor does not support "
11558                  "requested special purpose register"));
11559
11560   Rn = inst.operands[1].reg;
11561   reject_bad_reg (Rn);
11562
11563   inst.instruction |= (flags & SPSR_BIT) >> 2;
11564   inst.instruction |= (flags & 0xf0000) >> 8;
11565   inst.instruction |= (flags & 0x300) >> 4;
11566   inst.instruction |= (flags & 0xff);
11567   inst.instruction |= Rn << 16;
11568 }
11569
11570 static void
11571 do_t_mul (void)
11572 {
11573   bfd_boolean narrow;
11574   unsigned Rd, Rn, Rm;
11575
11576   if (!inst.operands[2].present)
11577     inst.operands[2].reg = inst.operands[0].reg;
11578
11579   Rd = inst.operands[0].reg;
11580   Rn = inst.operands[1].reg;
11581   Rm = inst.operands[2].reg;
11582
11583   if (unified_syntax)
11584     {
11585       if (inst.size_req == 4
11586           || (Rd != Rn
11587               && Rd != Rm)
11588           || Rn > 7
11589           || Rm > 7)
11590         narrow = FALSE;
11591       else if (inst.instruction == T_MNEM_muls)
11592         narrow = !in_it_block ();
11593       else
11594         narrow = in_it_block ();
11595     }
11596   else
11597     {
11598       constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
11599       constraint (Rn > 7 || Rm > 7,
11600                   BAD_HIREG);
11601       narrow = TRUE;
11602     }
11603
11604   if (narrow)
11605     {
11606       /* 16-bit MULS/Conditional MUL.  */
11607       inst.instruction = THUMB_OP16 (inst.instruction);
11608       inst.instruction |= Rd;
11609
11610       if (Rd == Rn)
11611         inst.instruction |= Rm << 3;
11612       else if (Rd == Rm)
11613         inst.instruction |= Rn << 3;
11614       else
11615         constraint (1, _("dest must overlap one source register"));
11616     }
11617   else
11618     {
11619       constraint (inst.instruction != T_MNEM_mul,
11620                   _("Thumb-2 MUL must not set flags"));
11621       /* 32-bit MUL.  */
11622       inst.instruction = THUMB_OP32 (inst.instruction);
11623       inst.instruction |= Rd << 8;
11624       inst.instruction |= Rn << 16;
11625       inst.instruction |= Rm << 0;
11626
11627       reject_bad_reg (Rd);
11628       reject_bad_reg (Rn);
11629       reject_bad_reg (Rm);
11630     }
11631 }
11632
11633 static void
11634 do_t_mull (void)
11635 {
11636   unsigned RdLo, RdHi, Rn, Rm;
11637
11638   RdLo = inst.operands[0].reg;
11639   RdHi = inst.operands[1].reg;
11640   Rn = inst.operands[2].reg;
11641   Rm = inst.operands[3].reg;
11642
11643   reject_bad_reg (RdLo);
11644   reject_bad_reg (RdHi);
11645   reject_bad_reg (Rn);
11646   reject_bad_reg (Rm);
11647
11648   inst.instruction |= RdLo << 12;
11649   inst.instruction |= RdHi << 8;
11650   inst.instruction |= Rn << 16;
11651   inst.instruction |= Rm;
11652
11653  if (RdLo == RdHi)
11654     as_tsktsk (_("rdhi and rdlo must be different"));
11655 }
11656
11657 static void
11658 do_t_nop (void)
11659 {
11660   set_it_insn_type (NEUTRAL_IT_INSN);
11661
11662   if (unified_syntax)
11663     {
11664       if (inst.size_req == 4 || inst.operands[0].imm > 15)
11665         {
11666           inst.instruction = THUMB_OP32 (inst.instruction);
11667           inst.instruction |= inst.operands[0].imm;
11668         }
11669       else
11670         {
11671           /* PR9722: Check for Thumb2 availability before
11672              generating a thumb2 nop instruction.  */
11673           if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
11674             {
11675               inst.instruction = THUMB_OP16 (inst.instruction);
11676               inst.instruction |= inst.operands[0].imm << 4;
11677             }
11678           else
11679             inst.instruction = 0x46c0;
11680         }
11681     }
11682   else
11683     {
11684       constraint (inst.operands[0].present,
11685                   _("Thumb does not support NOP with hints"));
11686       inst.instruction = 0x46c0;
11687     }
11688 }
11689
11690 static void
11691 do_t_neg (void)
11692 {
11693   if (unified_syntax)
11694     {
11695       bfd_boolean narrow;
11696
11697       if (THUMB_SETS_FLAGS (inst.instruction))
11698         narrow = !in_it_block ();
11699       else
11700         narrow = in_it_block ();
11701       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11702         narrow = FALSE;
11703       if (inst.size_req == 4)
11704         narrow = FALSE;
11705
11706       if (!narrow)
11707         {
11708           inst.instruction = THUMB_OP32 (inst.instruction);
11709           inst.instruction |= inst.operands[0].reg << 8;
11710           inst.instruction |= inst.operands[1].reg << 16;
11711         }
11712       else
11713         {
11714           inst.instruction = THUMB_OP16 (inst.instruction);
11715           inst.instruction |= inst.operands[0].reg;
11716           inst.instruction |= inst.operands[1].reg << 3;
11717         }
11718     }
11719   else
11720     {
11721       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
11722                   BAD_HIREG);
11723       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11724
11725       inst.instruction = THUMB_OP16 (inst.instruction);
11726       inst.instruction |= inst.operands[0].reg;
11727       inst.instruction |= inst.operands[1].reg << 3;
11728     }
11729 }
11730
11731 static void
11732 do_t_orn (void)
11733 {
11734   unsigned Rd, Rn;
11735
11736   Rd = inst.operands[0].reg;
11737   Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
11738
11739   reject_bad_reg (Rd);
11740   /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN.  */
11741   reject_bad_reg (Rn);
11742
11743   inst.instruction |= Rd << 8;
11744   inst.instruction |= Rn << 16;
11745
11746   if (!inst.operands[2].isreg)
11747     {
11748       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11749       inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11750     }
11751   else
11752     {
11753       unsigned Rm;
11754
11755       Rm = inst.operands[2].reg;
11756       reject_bad_reg (Rm);
11757
11758       constraint (inst.operands[2].shifted
11759                   && inst.operands[2].immisreg,
11760                   _("shift must be constant"));
11761       encode_thumb32_shifted_operand (2);
11762     }
11763 }
11764
11765 static void
11766 do_t_pkhbt (void)
11767 {
11768   unsigned Rd, Rn, Rm;
11769
11770   Rd = inst.operands[0].reg;
11771   Rn = inst.operands[1].reg;
11772   Rm = inst.operands[2].reg;
11773
11774   reject_bad_reg (Rd);
11775   reject_bad_reg (Rn);
11776   reject_bad_reg (Rm);
11777
11778   inst.instruction |= Rd << 8;
11779   inst.instruction |= Rn << 16;
11780   inst.instruction |= Rm;
11781   if (inst.operands[3].present)
11782     {
11783       unsigned int val = inst.reloc.exp.X_add_number;
11784       constraint (inst.reloc.exp.X_op != O_constant,
11785                   _("expression too complex"));
11786       inst.instruction |= (val & 0x1c) << 10;
11787       inst.instruction |= (val & 0x03) << 6;
11788     }
11789 }
11790
11791 static void
11792 do_t_pkhtb (void)
11793 {
11794   if (!inst.operands[3].present)
11795     {
11796       unsigned Rtmp;
11797
11798       inst.instruction &= ~0x00000020;
11799
11800       /* PR 10168.  Swap the Rm and Rn registers.  */
11801       Rtmp = inst.operands[1].reg;
11802       inst.operands[1].reg = inst.operands[2].reg;
11803       inst.operands[2].reg = Rtmp;
11804     }
11805   do_t_pkhbt ();
11806 }
11807
11808 static void
11809 do_t_pld (void)
11810 {
11811   if (inst.operands[0].immisreg)
11812     reject_bad_reg (inst.operands[0].imm);
11813
11814   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
11815 }
11816
11817 static void
11818 do_t_push_pop (void)
11819 {
11820   unsigned mask;
11821
11822   constraint (inst.operands[0].writeback,
11823               _("push/pop do not support {reglist}^"));
11824   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11825               _("expression too complex"));
11826
11827   mask = inst.operands[0].imm;
11828   if (inst.size_req != 4 && (mask & ~0xff) == 0)
11829     inst.instruction = THUMB_OP16 (inst.instruction) | mask;
11830   else if (inst.size_req != 4
11831            && (mask & ~0xff) == (1 << (inst.instruction == T_MNEM_push
11832                                        ? REG_LR : REG_PC)))
11833     {
11834       inst.instruction = THUMB_OP16 (inst.instruction);
11835       inst.instruction |= THUMB_PP_PC_LR;
11836       inst.instruction |= mask & 0xff;
11837     }
11838   else if (unified_syntax)
11839     {
11840       inst.instruction = THUMB_OP32 (inst.instruction);
11841       encode_thumb2_ldmstm (13, mask, TRUE);
11842     }
11843   else
11844     {
11845       inst.error = _("invalid register list to push/pop instruction");
11846       return;
11847     }
11848 }
11849
11850 static void
11851 do_t_rbit (void)
11852 {
11853   unsigned Rd, Rm;
11854
11855   Rd = inst.operands[0].reg;
11856   Rm = inst.operands[1].reg;
11857
11858   reject_bad_reg (Rd);
11859   reject_bad_reg (Rm);
11860
11861   inst.instruction |= Rd << 8;
11862   inst.instruction |= Rm << 16;
11863   inst.instruction |= Rm;
11864 }
11865
11866 static void
11867 do_t_rev (void)
11868 {
11869   unsigned Rd, Rm;
11870
11871   Rd = inst.operands[0].reg;
11872   Rm = inst.operands[1].reg;
11873
11874   reject_bad_reg (Rd);
11875   reject_bad_reg (Rm);
11876
11877   if (Rd <= 7 && Rm <= 7
11878       && inst.size_req != 4)
11879     {
11880       inst.instruction = THUMB_OP16 (inst.instruction);
11881       inst.instruction |= Rd;
11882       inst.instruction |= Rm << 3;
11883     }
11884   else if (unified_syntax)
11885     {
11886       inst.instruction = THUMB_OP32 (inst.instruction);
11887       inst.instruction |= Rd << 8;
11888       inst.instruction |= Rm << 16;
11889       inst.instruction |= Rm;
11890     }
11891   else
11892     inst.error = BAD_HIREG;
11893 }
11894
11895 static void
11896 do_t_rrx (void)
11897 {
11898   unsigned Rd, Rm;
11899
11900   Rd = inst.operands[0].reg;
11901   Rm = inst.operands[1].reg;
11902
11903   reject_bad_reg (Rd);
11904   reject_bad_reg (Rm);
11905
11906   inst.instruction |= Rd << 8;
11907   inst.instruction |= Rm;
11908 }
11909
11910 static void
11911 do_t_rsb (void)
11912 {
11913   unsigned Rd, Rs;
11914
11915   Rd = inst.operands[0].reg;
11916   Rs = (inst.operands[1].present
11917         ? inst.operands[1].reg    /* Rd, Rs, foo */
11918         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
11919
11920   reject_bad_reg (Rd);
11921   reject_bad_reg (Rs);
11922   if (inst.operands[2].isreg)
11923     reject_bad_reg (inst.operands[2].reg);
11924
11925   inst.instruction |= Rd << 8;
11926   inst.instruction |= Rs << 16;
11927   if (!inst.operands[2].isreg)
11928     {
11929       bfd_boolean narrow;
11930
11931       if ((inst.instruction & 0x00100000) != 0)
11932         narrow = !in_it_block ();
11933       else
11934         narrow = in_it_block ();
11935
11936       if (Rd > 7 || Rs > 7)
11937         narrow = FALSE;
11938
11939       if (inst.size_req == 4 || !unified_syntax)
11940         narrow = FALSE;
11941
11942       if (inst.reloc.exp.X_op != O_constant
11943           || inst.reloc.exp.X_add_number != 0)
11944         narrow = FALSE;
11945
11946       /* Turn rsb #0 into 16-bit neg.  We should probably do this via
11947          relaxation, but it doesn't seem worth the hassle.  */
11948       if (narrow)
11949         {
11950           inst.reloc.type = BFD_RELOC_UNUSED;
11951           inst.instruction = THUMB_OP16 (T_MNEM_negs);
11952           inst.instruction |= Rs << 3;
11953           inst.instruction |= Rd;
11954         }
11955       else
11956         {
11957           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11958           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11959         }
11960     }
11961   else
11962     encode_thumb32_shifted_operand (2);
11963 }
11964
11965 static void
11966 do_t_setend (void)
11967 {
11968   if (warn_on_deprecated
11969       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
11970       as_warn (_("setend use is deprecated for ARMv8"));
11971
11972   set_it_insn_type (OUTSIDE_IT_INSN);
11973   if (inst.operands[0].imm)
11974     inst.instruction |= 0x8;
11975 }
11976
11977 static void
11978 do_t_shift (void)
11979 {
11980   if (!inst.operands[1].present)
11981     inst.operands[1].reg = inst.operands[0].reg;
11982
11983   if (unified_syntax)
11984     {
11985       bfd_boolean narrow;
11986       int shift_kind;
11987
11988       switch (inst.instruction)
11989         {
11990         case T_MNEM_asr:
11991         case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11992         case T_MNEM_lsl:
11993         case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11994         case T_MNEM_lsr:
11995         case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11996         case T_MNEM_ror:
11997         case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11998         default: abort ();
11999         }
12000
12001       if (THUMB_SETS_FLAGS (inst.instruction))
12002         narrow = !in_it_block ();
12003       else
12004         narrow = in_it_block ();
12005       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
12006         narrow = FALSE;
12007       if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
12008         narrow = FALSE;
12009       if (inst.operands[2].isreg
12010           && (inst.operands[1].reg != inst.operands[0].reg
12011               || inst.operands[2].reg > 7))
12012         narrow = FALSE;
12013       if (inst.size_req == 4)
12014         narrow = FALSE;
12015
12016       reject_bad_reg (inst.operands[0].reg);
12017       reject_bad_reg (inst.operands[1].reg);
12018
12019       if (!narrow)
12020         {
12021           if (inst.operands[2].isreg)
12022             {
12023               reject_bad_reg (inst.operands[2].reg);
12024               inst.instruction = THUMB_OP32 (inst.instruction);
12025               inst.instruction |= inst.operands[0].reg << 8;
12026               inst.instruction |= inst.operands[1].reg << 16;
12027               inst.instruction |= inst.operands[2].reg;
12028
12029               /* PR 12854: Error on extraneous shifts.  */
12030               constraint (inst.operands[2].shifted,
12031                           _("extraneous shift as part of operand to shift insn"));
12032             }
12033           else
12034             {
12035               inst.operands[1].shifted = 1;
12036               inst.operands[1].shift_kind = shift_kind;
12037               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
12038                                              ? T_MNEM_movs : T_MNEM_mov);
12039               inst.instruction |= inst.operands[0].reg << 8;
12040               encode_thumb32_shifted_operand (1);
12041               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
12042               inst.reloc.type = BFD_RELOC_UNUSED;
12043             }
12044         }
12045       else
12046         {
12047           if (inst.operands[2].isreg)
12048             {
12049               switch (shift_kind)
12050                 {
12051                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
12052                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
12053                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
12054                 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
12055                 default: abort ();
12056                 }
12057
12058               inst.instruction |= inst.operands[0].reg;
12059               inst.instruction |= inst.operands[2].reg << 3;
12060
12061               /* PR 12854: Error on extraneous shifts.  */
12062               constraint (inst.operands[2].shifted,
12063                           _("extraneous shift as part of operand to shift insn"));
12064             }
12065           else
12066             {
12067               switch (shift_kind)
12068                 {
12069                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
12070                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
12071                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
12072                 default: abort ();
12073                 }
12074               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
12075               inst.instruction |= inst.operands[0].reg;
12076               inst.instruction |= inst.operands[1].reg << 3;
12077             }
12078         }
12079     }
12080   else
12081     {
12082       constraint (inst.operands[0].reg > 7
12083                   || inst.operands[1].reg > 7, BAD_HIREG);
12084       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
12085
12086       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
12087         {
12088           constraint (inst.operands[2].reg > 7, BAD_HIREG);
12089           constraint (inst.operands[0].reg != inst.operands[1].reg,
12090                       _("source1 and dest must be same register"));
12091
12092           switch (inst.instruction)
12093             {
12094             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
12095             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
12096             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
12097             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
12098             default: abort ();
12099             }
12100
12101           inst.instruction |= inst.operands[0].reg;
12102           inst.instruction |= inst.operands[2].reg << 3;
12103
12104           /* PR 12854: Error on extraneous shifts.  */
12105           constraint (inst.operands[2].shifted,
12106                       _("extraneous shift as part of operand to shift insn"));
12107         }
12108       else
12109         {
12110           switch (inst.instruction)
12111             {
12112             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
12113             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
12114             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
12115             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
12116             default: abort ();
12117             }
12118           inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
12119           inst.instruction |= inst.operands[0].reg;
12120           inst.instruction |= inst.operands[1].reg << 3;
12121         }
12122     }
12123 }
12124
12125 static void
12126 do_t_simd (void)
12127 {
12128   unsigned Rd, Rn, Rm;
12129
12130   Rd = inst.operands[0].reg;
12131   Rn = inst.operands[1].reg;
12132   Rm = inst.operands[2].reg;
12133
12134   reject_bad_reg (Rd);
12135   reject_bad_reg (Rn);
12136   reject_bad_reg (Rm);
12137
12138   inst.instruction |= Rd << 8;
12139   inst.instruction |= Rn << 16;
12140   inst.instruction |= Rm;
12141 }
12142
12143 static void
12144 do_t_simd2 (void)
12145 {
12146   unsigned Rd, Rn, Rm;
12147
12148   Rd = inst.operands[0].reg;
12149   Rm = inst.operands[1].reg;
12150   Rn = inst.operands[2].reg;
12151
12152   reject_bad_reg (Rd);
12153   reject_bad_reg (Rn);
12154   reject_bad_reg (Rm);
12155
12156   inst.instruction |= Rd << 8;
12157   inst.instruction |= Rn << 16;
12158   inst.instruction |= Rm;
12159 }
12160
12161 static void
12162 do_t_smc (void)
12163 {
12164   unsigned int value = inst.reloc.exp.X_add_number;
12165   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
12166               _("SMC is not permitted on this architecture"));
12167   constraint (inst.reloc.exp.X_op != O_constant,
12168               _("expression too complex"));
12169   inst.reloc.type = BFD_RELOC_UNUSED;
12170   inst.instruction |= (value & 0xf000) >> 12;
12171   inst.instruction |= (value & 0x0ff0);
12172   inst.instruction |= (value & 0x000f) << 16;
12173   /* PR gas/15623: SMC instructions must be last in an IT block.  */
12174   set_it_insn_type_last ();
12175 }
12176
12177 static void
12178 do_t_hvc (void)
12179 {
12180   unsigned int value = inst.reloc.exp.X_add_number;
12181
12182   inst.reloc.type = BFD_RELOC_UNUSED;
12183   inst.instruction |= (value & 0x0fff);
12184   inst.instruction |= (value & 0xf000) << 4;
12185 }
12186
12187 static void
12188 do_t_ssat_usat (int bias)
12189 {
12190   unsigned Rd, Rn;
12191
12192   Rd = inst.operands[0].reg;
12193   Rn = inst.operands[2].reg;
12194
12195   reject_bad_reg (Rd);
12196   reject_bad_reg (Rn);
12197
12198   inst.instruction |= Rd << 8;
12199   inst.instruction |= inst.operands[1].imm - bias;
12200   inst.instruction |= Rn << 16;
12201
12202   if (inst.operands[3].present)
12203     {
12204       offsetT shift_amount = inst.reloc.exp.X_add_number;
12205
12206       inst.reloc.type = BFD_RELOC_UNUSED;
12207
12208       constraint (inst.reloc.exp.X_op != O_constant,
12209                   _("expression too complex"));
12210
12211       if (shift_amount != 0)
12212         {
12213           constraint (shift_amount > 31,
12214                       _("shift expression is too large"));
12215
12216           if (inst.operands[3].shift_kind == SHIFT_ASR)
12217             inst.instruction |= 0x00200000;  /* sh bit.  */
12218
12219           inst.instruction |= (shift_amount & 0x1c) << 10;
12220           inst.instruction |= (shift_amount & 0x03) << 6;
12221         }
12222     }
12223 }
12224
12225 static void
12226 do_t_ssat (void)
12227 {
12228   do_t_ssat_usat (1);
12229 }
12230
12231 static void
12232 do_t_ssat16 (void)
12233 {
12234   unsigned Rd, Rn;
12235
12236   Rd = inst.operands[0].reg;
12237   Rn = inst.operands[2].reg;
12238
12239   reject_bad_reg (Rd);
12240   reject_bad_reg (Rn);
12241
12242   inst.instruction |= Rd << 8;
12243   inst.instruction |= inst.operands[1].imm - 1;
12244   inst.instruction |= Rn << 16;
12245 }
12246
12247 static void
12248 do_t_strex (void)
12249 {
12250   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
12251               || inst.operands[2].postind || inst.operands[2].writeback
12252               || inst.operands[2].immisreg || inst.operands[2].shifted
12253               || inst.operands[2].negative,
12254               BAD_ADDR_MODE);
12255
12256   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
12257
12258   inst.instruction |= inst.operands[0].reg << 8;
12259   inst.instruction |= inst.operands[1].reg << 12;
12260   inst.instruction |= inst.operands[2].reg << 16;
12261   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
12262 }
12263
12264 static void
12265 do_t_strexd (void)
12266 {
12267   if (!inst.operands[2].present)
12268     inst.operands[2].reg = inst.operands[1].reg + 1;
12269
12270   constraint (inst.operands[0].reg == inst.operands[1].reg
12271               || inst.operands[0].reg == inst.operands[2].reg
12272               || inst.operands[0].reg == inst.operands[3].reg,
12273               BAD_OVERLAP);
12274
12275   inst.instruction |= inst.operands[0].reg;
12276   inst.instruction |= inst.operands[1].reg << 12;
12277   inst.instruction |= inst.operands[2].reg << 8;
12278   inst.instruction |= inst.operands[3].reg << 16;
12279 }
12280
12281 static void
12282 do_t_sxtah (void)
12283 {
12284   unsigned Rd, Rn, Rm;
12285
12286   Rd = inst.operands[0].reg;
12287   Rn = inst.operands[1].reg;
12288   Rm = inst.operands[2].reg;
12289
12290   reject_bad_reg (Rd);
12291   reject_bad_reg (Rn);
12292   reject_bad_reg (Rm);
12293
12294   inst.instruction |= Rd << 8;
12295   inst.instruction |= Rn << 16;
12296   inst.instruction |= Rm;
12297   inst.instruction |= inst.operands[3].imm << 4;
12298 }
12299
12300 static void
12301 do_t_sxth (void)
12302 {
12303   unsigned Rd, Rm;
12304
12305   Rd = inst.operands[0].reg;
12306   Rm = inst.operands[1].reg;
12307
12308   reject_bad_reg (Rd);
12309   reject_bad_reg (Rm);
12310
12311   if (inst.instruction <= 0xffff
12312       && inst.size_req != 4
12313       && Rd <= 7 && Rm <= 7
12314       && (!inst.operands[2].present || inst.operands[2].imm == 0))
12315     {
12316       inst.instruction = THUMB_OP16 (inst.instruction);
12317       inst.instruction |= Rd;
12318       inst.instruction |= Rm << 3;
12319     }
12320   else if (unified_syntax)
12321     {
12322       if (inst.instruction <= 0xffff)
12323         inst.instruction = THUMB_OP32 (inst.instruction);
12324       inst.instruction |= Rd << 8;
12325       inst.instruction |= Rm;
12326       inst.instruction |= inst.operands[2].imm << 4;
12327     }
12328   else
12329     {
12330       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
12331                   _("Thumb encoding does not support rotation"));
12332       constraint (1, BAD_HIREG);
12333     }
12334 }
12335
12336 static void
12337 do_t_swi (void)
12338 {
12339   /* We have to do the following check manually as ARM_EXT_OS only applies
12340      to ARM_EXT_V6M.  */
12341   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6m))
12342     {
12343       if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_os)
12344           /* This only applies to the v6m howver, not later architectures.  */
12345           && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7))
12346         as_bad (_("SVC is not permitted on this architecture"));
12347       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, arm_ext_os);
12348     }
12349
12350   inst.reloc.type = BFD_RELOC_ARM_SWI;
12351 }
12352
12353 static void
12354 do_t_tb (void)
12355 {
12356   unsigned Rn, Rm;
12357   int half;
12358
12359   half = (inst.instruction & 0x10) != 0;
12360   set_it_insn_type_last ();
12361   constraint (inst.operands[0].immisreg,
12362               _("instruction requires register index"));
12363
12364   Rn = inst.operands[0].reg;
12365   Rm = inst.operands[0].imm;
12366
12367   constraint (Rn == REG_SP, BAD_SP);
12368   reject_bad_reg (Rm);
12369
12370   constraint (!half && inst.operands[0].shifted,
12371               _("instruction does not allow shifted index"));
12372   inst.instruction |= (Rn << 16) | Rm;
12373 }
12374
12375 static void
12376 do_t_udf (void)
12377 {
12378   if (!inst.operands[0].present)
12379     inst.operands[0].imm = 0;
12380
12381   if ((unsigned int) inst.operands[0].imm > 255 || inst.size_req == 4)
12382     {
12383       constraint (inst.size_req == 2,
12384                   _("immediate value out of range"));
12385       inst.instruction = THUMB_OP32 (inst.instruction);
12386       inst.instruction |= (inst.operands[0].imm & 0xf000u) << 4;
12387       inst.instruction |= (inst.operands[0].imm & 0x0fffu) << 0;
12388     }
12389   else
12390     {
12391       inst.instruction = THUMB_OP16 (inst.instruction);
12392       inst.instruction |= inst.operands[0].imm;
12393     }
12394
12395   set_it_insn_type (NEUTRAL_IT_INSN);
12396 }
12397
12398
12399 static void
12400 do_t_usat (void)
12401 {
12402   do_t_ssat_usat (0);
12403 }
12404
12405 static void
12406 do_t_usat16 (void)
12407 {
12408   unsigned Rd, Rn;
12409
12410   Rd = inst.operands[0].reg;
12411   Rn = inst.operands[2].reg;
12412
12413   reject_bad_reg (Rd);
12414   reject_bad_reg (Rn);
12415
12416   inst.instruction |= Rd << 8;
12417   inst.instruction |= inst.operands[1].imm;
12418   inst.instruction |= Rn << 16;
12419 }
12420
12421 /* Neon instruction encoder helpers.  */
12422
12423 /* Encodings for the different types for various Neon opcodes.  */
12424
12425 /* An "invalid" code for the following tables.  */
12426 #define N_INV -1u
12427
12428 struct neon_tab_entry
12429 {
12430   unsigned integer;
12431   unsigned float_or_poly;
12432   unsigned scalar_or_imm;
12433 };
12434
12435 /* Map overloaded Neon opcodes to their respective encodings.  */
12436 #define NEON_ENC_TAB                                    \
12437   X(vabd,       0x0000700, 0x1200d00, N_INV),           \
12438   X(vmax,       0x0000600, 0x0000f00, N_INV),           \
12439   X(vmin,       0x0000610, 0x0200f00, N_INV),           \
12440   X(vpadd,      0x0000b10, 0x1000d00, N_INV),           \
12441   X(vpmax,      0x0000a00, 0x1000f00, N_INV),           \
12442   X(vpmin,      0x0000a10, 0x1200f00, N_INV),           \
12443   X(vadd,       0x0000800, 0x0000d00, N_INV),           \
12444   X(vsub,       0x1000800, 0x0200d00, N_INV),           \
12445   X(vceq,       0x1000810, 0x0000e00, 0x1b10100),       \
12446   X(vcge,       0x0000310, 0x1000e00, 0x1b10080),       \
12447   X(vcgt,       0x0000300, 0x1200e00, 0x1b10000),       \
12448   /* Register variants of the following two instructions are encoded as
12449      vcge / vcgt with the operands reversed.  */        \
12450   X(vclt,       0x0000300, 0x1200e00, 0x1b10200),       \
12451   X(vcle,       0x0000310, 0x1000e00, 0x1b10180),       \
12452   X(vfma,       N_INV, 0x0000c10, N_INV),               \
12453   X(vfms,       N_INV, 0x0200c10, N_INV),               \
12454   X(vmla,       0x0000900, 0x0000d10, 0x0800040),       \
12455   X(vmls,       0x1000900, 0x0200d10, 0x0800440),       \
12456   X(vmul,       0x0000910, 0x1000d10, 0x0800840),       \
12457   X(vmull,      0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
12458   X(vmlal,      0x0800800, N_INV,     0x0800240),       \
12459   X(vmlsl,      0x0800a00, N_INV,     0x0800640),       \
12460   X(vqdmlal,    0x0800900, N_INV,     0x0800340),       \
12461   X(vqdmlsl,    0x0800b00, N_INV,     0x0800740),       \
12462   X(vqdmull,    0x0800d00, N_INV,     0x0800b40),       \
12463   X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),       \
12464   X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),       \
12465   X(vshl,       0x0000400, N_INV,     0x0800510),       \
12466   X(vqshl,      0x0000410, N_INV,     0x0800710),       \
12467   X(vand,       0x0000110, N_INV,     0x0800030),       \
12468   X(vbic,       0x0100110, N_INV,     0x0800030),       \
12469   X(veor,       0x1000110, N_INV,     N_INV),           \
12470   X(vorn,       0x0300110, N_INV,     0x0800010),       \
12471   X(vorr,       0x0200110, N_INV,     0x0800010),       \
12472   X(vmvn,       0x1b00580, N_INV,     0x0800030),       \
12473   X(vshll,      0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
12474   X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
12475   X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
12476   X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
12477   X(vst1,       0x0000000, 0x0800000, N_INV),           \
12478   X(vld2,       0x0200100, 0x0a00100, 0x0a00d00),       \
12479   X(vst2,       0x0000100, 0x0800100, N_INV),           \
12480   X(vld3,       0x0200200, 0x0a00200, 0x0a00e00),       \
12481   X(vst3,       0x0000200, 0x0800200, N_INV),           \
12482   X(vld4,       0x0200300, 0x0a00300, 0x0a00f00),       \
12483   X(vst4,       0x0000300, 0x0800300, N_INV),           \
12484   X(vmovn,      0x1b20200, N_INV,     N_INV),           \
12485   X(vtrn,       0x1b20080, N_INV,     N_INV),           \
12486   X(vqmovn,     0x1b20200, N_INV,     N_INV),           \
12487   X(vqmovun,    0x1b20240, N_INV,     N_INV),           \
12488   X(vnmul,      0xe200a40, 0xe200b40, N_INV),           \
12489   X(vnmla,      0xe100a40, 0xe100b40, N_INV),           \
12490   X(vnmls,      0xe100a00, 0xe100b00, N_INV),           \
12491   X(vfnma,      0xe900a40, 0xe900b40, N_INV),           \
12492   X(vfnms,      0xe900a00, 0xe900b00, N_INV),           \
12493   X(vcmp,       0xeb40a40, 0xeb40b40, N_INV),           \
12494   X(vcmpz,      0xeb50a40, 0xeb50b40, N_INV),           \
12495   X(vcmpe,      0xeb40ac0, 0xeb40bc0, N_INV),           \
12496   X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV),           \
12497   X(vseleq,     0xe000a00, N_INV,     N_INV),           \
12498   X(vselvs,     0xe100a00, N_INV,     N_INV),           \
12499   X(vselge,     0xe200a00, N_INV,     N_INV),           \
12500   X(vselgt,     0xe300a00, N_INV,     N_INV),           \
12501   X(vmaxnm,     0xe800a00, 0x3000f10, N_INV),           \
12502   X(vminnm,     0xe800a40, 0x3200f10, N_INV),           \
12503   X(vcvta,      0xebc0a40, 0x3bb0000, N_INV),           \
12504   X(vrintr,     0xeb60a40, 0x3ba0400, N_INV),           \
12505   X(vrinta,     0xeb80a40, 0x3ba0400, N_INV),           \
12506   X(aes,        0x3b00300, N_INV,     N_INV),           \
12507   X(sha3op,     0x2000c00, N_INV,     N_INV),           \
12508   X(sha1h,      0x3b902c0, N_INV,     N_INV),           \
12509   X(sha2op,     0x3ba0380, N_INV,     N_INV)
12510
12511 enum neon_opc
12512 {
12513 #define X(OPC,I,F,S) N_MNEM_##OPC
12514 NEON_ENC_TAB
12515 #undef X
12516 };
12517
12518 static const struct neon_tab_entry neon_enc_tab[] =
12519 {
12520 #define X(OPC,I,F,S) { (I), (F), (S) }
12521 NEON_ENC_TAB
12522 #undef X
12523 };
12524
12525 /* Do not use these macros; instead, use NEON_ENCODE defined below.  */
12526 #define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12527 #define NEON_ENC_ARMREG_(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
12528 #define NEON_ENC_POLY_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12529 #define NEON_ENC_FLOAT_(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12530 #define NEON_ENC_SCALAR_(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12531 #define NEON_ENC_IMMED_(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12532 #define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12533 #define NEON_ENC_LANE_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12534 #define NEON_ENC_DUP_(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12535 #define NEON_ENC_SINGLE_(X) \
12536   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
12537 #define NEON_ENC_DOUBLE_(X) \
12538   ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
12539 #define NEON_ENC_FPV8_(X) \
12540   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf000000))
12541
12542 #define NEON_ENCODE(type, inst)                                 \
12543   do                                                            \
12544     {                                                           \
12545       inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
12546       inst.is_neon = 1;                                         \
12547     }                                                           \
12548   while (0)
12549
12550 #define check_neon_suffixes                                             \
12551   do                                                                    \
12552     {                                                                   \
12553       if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon)       \
12554         {                                                               \
12555           as_bad (_("invalid neon suffix for non neon instruction"));   \
12556           return;                                                       \
12557         }                                                               \
12558     }                                                                   \
12559   while (0)
12560
12561 /* Define shapes for instruction operands. The following mnemonic characters
12562    are used in this table:
12563
12564      F - VFP S<n> register
12565      D - Neon D<n> register
12566      Q - Neon Q<n> register
12567      I - Immediate
12568      S - Scalar
12569      R - ARM register
12570      L - D<n> register list
12571
12572    This table is used to generate various data:
12573      - enumerations of the form NS_DDR to be used as arguments to
12574        neon_select_shape.
12575      - a table classifying shapes into single, double, quad, mixed.
12576      - a table used to drive neon_select_shape.  */
12577
12578 #define NEON_SHAPE_DEF                  \
12579   X(3, (D, D, D), DOUBLE),              \
12580   X(3, (Q, Q, Q), QUAD),                \
12581   X(3, (D, D, I), DOUBLE),              \
12582   X(3, (Q, Q, I), QUAD),                \
12583   X(3, (D, D, S), DOUBLE),              \
12584   X(3, (Q, Q, S), QUAD),                \
12585   X(2, (D, D), DOUBLE),                 \
12586   X(2, (Q, Q), QUAD),                   \
12587   X(2, (D, S), DOUBLE),                 \
12588   X(2, (Q, S), QUAD),                   \
12589   X(2, (D, R), DOUBLE),                 \
12590   X(2, (Q, R), QUAD),                   \
12591   X(2, (D, I), DOUBLE),                 \
12592   X(2, (Q, I), QUAD),                   \
12593   X(3, (D, L, D), DOUBLE),              \
12594   X(2, (D, Q), MIXED),                  \
12595   X(2, (Q, D), MIXED),                  \
12596   X(3, (D, Q, I), MIXED),               \
12597   X(3, (Q, D, I), MIXED),               \
12598   X(3, (Q, D, D), MIXED),               \
12599   X(3, (D, Q, Q), MIXED),               \
12600   X(3, (Q, Q, D), MIXED),               \
12601   X(3, (Q, D, S), MIXED),               \
12602   X(3, (D, Q, S), MIXED),               \
12603   X(4, (D, D, D, I), DOUBLE),           \
12604   X(4, (Q, Q, Q, I), QUAD),             \
12605   X(2, (F, F), SINGLE),                 \
12606   X(3, (F, F, F), SINGLE),              \
12607   X(2, (F, I), SINGLE),                 \
12608   X(2, (F, D), MIXED),                  \
12609   X(2, (D, F), MIXED),                  \
12610   X(3, (F, F, I), MIXED),               \
12611   X(4, (R, R, F, F), SINGLE),           \
12612   X(4, (F, F, R, R), SINGLE),           \
12613   X(3, (D, R, R), DOUBLE),              \
12614   X(3, (R, R, D), DOUBLE),              \
12615   X(2, (S, R), SINGLE),                 \
12616   X(2, (R, S), SINGLE),                 \
12617   X(2, (F, R), SINGLE),                 \
12618   X(2, (R, F), SINGLE)
12619
12620 #define S2(A,B)         NS_##A##B
12621 #define S3(A,B,C)       NS_##A##B##C
12622 #define S4(A,B,C,D)     NS_##A##B##C##D
12623
12624 #define X(N, L, C) S##N L
12625
12626 enum neon_shape
12627 {
12628   NEON_SHAPE_DEF,
12629   NS_NULL
12630 };
12631
12632 #undef X
12633 #undef S2
12634 #undef S3
12635 #undef S4
12636
12637 enum neon_shape_class
12638 {
12639   SC_SINGLE,
12640   SC_DOUBLE,
12641   SC_QUAD,
12642   SC_MIXED
12643 };
12644
12645 #define X(N, L, C) SC_##C
12646
12647 static enum neon_shape_class neon_shape_class[] =
12648 {
12649   NEON_SHAPE_DEF
12650 };
12651
12652 #undef X
12653
12654 enum neon_shape_el
12655 {
12656   SE_F,
12657   SE_D,
12658   SE_Q,
12659   SE_I,
12660   SE_S,
12661   SE_R,
12662   SE_L
12663 };
12664
12665 /* Register widths of above.  */
12666 static unsigned neon_shape_el_size[] =
12667 {
12668   32,
12669   64,
12670   128,
12671   0,
12672   32,
12673   32,
12674   0
12675 };
12676
12677 struct neon_shape_info
12678 {
12679   unsigned els;
12680   enum neon_shape_el el[NEON_MAX_TYPE_ELS];
12681 };
12682
12683 #define S2(A,B)         { SE_##A, SE_##B }
12684 #define S3(A,B,C)       { SE_##A, SE_##B, SE_##C }
12685 #define S4(A,B,C,D)     { SE_##A, SE_##B, SE_##C, SE_##D }
12686
12687 #define X(N, L, C) { N, S##N L }
12688
12689 static struct neon_shape_info neon_shape_tab[] =
12690 {
12691   NEON_SHAPE_DEF
12692 };
12693
12694 #undef X
12695 #undef S2
12696 #undef S3
12697 #undef S4
12698
12699 /* Bit masks used in type checking given instructions.
12700   'N_EQK' means the type must be the same as (or based on in some way) the key
12701    type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
12702    set, various other bits can be set as well in order to modify the meaning of
12703    the type constraint.  */
12704
12705 enum neon_type_mask
12706 {
12707   N_S8   = 0x0000001,
12708   N_S16  = 0x0000002,
12709   N_S32  = 0x0000004,
12710   N_S64  = 0x0000008,
12711   N_U8   = 0x0000010,
12712   N_U16  = 0x0000020,
12713   N_U32  = 0x0000040,
12714   N_U64  = 0x0000080,
12715   N_I8   = 0x0000100,
12716   N_I16  = 0x0000200,
12717   N_I32  = 0x0000400,
12718   N_I64  = 0x0000800,
12719   N_8    = 0x0001000,
12720   N_16   = 0x0002000,
12721   N_32   = 0x0004000,
12722   N_64   = 0x0008000,
12723   N_P8   = 0x0010000,
12724   N_P16  = 0x0020000,
12725   N_F16  = 0x0040000,
12726   N_F32  = 0x0080000,
12727   N_F64  = 0x0100000,
12728   N_P64  = 0x0200000,
12729   N_KEY  = 0x1000000, /* Key element (main type specifier).  */
12730   N_EQK  = 0x2000000, /* Given operand has the same type & size as the key.  */
12731   N_VFP  = 0x4000000, /* VFP mode: operand size must match register width.  */
12732   N_UNT  = 0x8000000, /* Must be explicitly untyped.  */
12733   N_DBL  = 0x0000001, /* If N_EQK, this operand is twice the size.  */
12734   N_HLF  = 0x0000002, /* If N_EQK, this operand is half the size.  */
12735   N_SGN  = 0x0000004, /* If N_EQK, this operand is forced to be signed.  */
12736   N_UNS  = 0x0000008, /* If N_EQK, this operand is forced to be unsigned.  */
12737   N_INT  = 0x0000010, /* If N_EQK, this operand is forced to be integer.  */
12738   N_FLT  = 0x0000020, /* If N_EQK, this operand is forced to be float.  */
12739   N_SIZ  = 0x0000040, /* If N_EQK, this operand is forced to be size-only.  */
12740   N_UTYP = 0,
12741   N_MAX_NONSPECIAL = N_P64
12742 };
12743
12744 #define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
12745
12746 #define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
12747 #define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
12748 #define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
12749 #define N_SUF_32   (N_SU_32 | N_F32)
12750 #define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
12751 #define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F32)
12752
12753 /* Pass this as the first type argument to neon_check_type to ignore types
12754    altogether.  */
12755 #define N_IGNORE_TYPE (N_KEY | N_EQK)
12756
12757 /* Select a "shape" for the current instruction (describing register types or
12758    sizes) from a list of alternatives. Return NS_NULL if the current instruction
12759    doesn't fit. For non-polymorphic shapes, checking is usually done as a
12760    function of operand parsing, so this function doesn't need to be called.
12761    Shapes should be listed in order of decreasing length.  */
12762
12763 static enum neon_shape
12764 neon_select_shape (enum neon_shape shape, ...)
12765 {
12766   va_list ap;
12767   enum neon_shape first_shape = shape;
12768
12769   /* Fix missing optional operands. FIXME: we don't know at this point how
12770      many arguments we should have, so this makes the assumption that we have
12771      > 1. This is true of all current Neon opcodes, I think, but may not be
12772      true in the future.  */
12773   if (!inst.operands[1].present)
12774     inst.operands[1] = inst.operands[0];
12775
12776   va_start (ap, shape);
12777
12778   for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
12779     {
12780       unsigned j;
12781       int matches = 1;
12782
12783       for (j = 0; j < neon_shape_tab[shape].els; j++)
12784         {
12785           if (!inst.operands[j].present)
12786             {
12787               matches = 0;
12788               break;
12789             }
12790
12791           switch (neon_shape_tab[shape].el[j])
12792             {
12793             case SE_F:
12794               if (!(inst.operands[j].isreg
12795                     && inst.operands[j].isvec
12796                     && inst.operands[j].issingle
12797                     && !inst.operands[j].isquad))
12798                 matches = 0;
12799               break;
12800
12801             case SE_D:
12802               if (!(inst.operands[j].isreg
12803                     && inst.operands[j].isvec
12804                     && !inst.operands[j].isquad
12805                     && !inst.operands[j].issingle))
12806                 matches = 0;
12807               break;
12808
12809             case SE_R:
12810               if (!(inst.operands[j].isreg
12811                     && !inst.operands[j].isvec))
12812                 matches = 0;
12813               break;
12814
12815             case SE_Q:
12816               if (!(inst.operands[j].isreg
12817                     && inst.operands[j].isvec
12818                     && inst.operands[j].isquad
12819                     && !inst.operands[j].issingle))
12820                 matches = 0;
12821               break;
12822
12823             case SE_I:
12824               if (!(!inst.operands[j].isreg
12825                     && !inst.operands[j].isscalar))
12826                 matches = 0;
12827               break;
12828
12829             case SE_S:
12830               if (!(!inst.operands[j].isreg
12831                     && inst.operands[j].isscalar))
12832                 matches = 0;
12833               break;
12834
12835             case SE_L:
12836               break;
12837             }
12838           if (!matches)
12839             break;
12840         }
12841       if (matches && (j >= ARM_IT_MAX_OPERANDS || !inst.operands[j].present))
12842         /* We've matched all the entries in the shape table, and we don't
12843            have any left over operands which have not been matched.  */
12844         break;
12845     }
12846
12847   va_end (ap);
12848
12849   if (shape == NS_NULL && first_shape != NS_NULL)
12850     first_error (_("invalid instruction shape"));
12851
12852   return shape;
12853 }
12854
12855 /* True if SHAPE is predominantly a quadword operation (most of the time, this
12856    means the Q bit should be set).  */
12857
12858 static int
12859 neon_quad (enum neon_shape shape)
12860 {
12861   return neon_shape_class[shape] == SC_QUAD;
12862 }
12863
12864 static void
12865 neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
12866                        unsigned *g_size)
12867 {
12868   /* Allow modification to be made to types which are constrained to be
12869      based on the key element, based on bits set alongside N_EQK.  */
12870   if ((typebits & N_EQK) != 0)
12871     {
12872       if ((typebits & N_HLF) != 0)
12873         *g_size /= 2;
12874       else if ((typebits & N_DBL) != 0)
12875         *g_size *= 2;
12876       if ((typebits & N_SGN) != 0)
12877         *g_type = NT_signed;
12878       else if ((typebits & N_UNS) != 0)
12879         *g_type = NT_unsigned;
12880       else if ((typebits & N_INT) != 0)
12881         *g_type = NT_integer;
12882       else if ((typebits & N_FLT) != 0)
12883         *g_type = NT_float;
12884       else if ((typebits & N_SIZ) != 0)
12885         *g_type = NT_untyped;
12886     }
12887 }
12888
12889 /* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
12890    operand type, i.e. the single type specified in a Neon instruction when it
12891    is the only one given.  */
12892
12893 static struct neon_type_el
12894 neon_type_promote (struct neon_type_el *key, unsigned thisarg)
12895 {
12896   struct neon_type_el dest = *key;
12897
12898   gas_assert ((thisarg & N_EQK) != 0);
12899
12900   neon_modify_type_size (thisarg, &dest.type, &dest.size);
12901
12902   return dest;
12903 }
12904
12905 /* Convert Neon type and size into compact bitmask representation.  */
12906
12907 static enum neon_type_mask
12908 type_chk_of_el_type (enum neon_el_type type, unsigned size)
12909 {
12910   switch (type)
12911     {
12912     case NT_untyped:
12913       switch (size)
12914         {
12915         case 8:  return N_8;
12916         case 16: return N_16;
12917         case 32: return N_32;
12918         case 64: return N_64;
12919         default: ;
12920         }
12921       break;
12922
12923     case NT_integer:
12924       switch (size)
12925         {
12926         case 8:  return N_I8;
12927         case 16: return N_I16;
12928         case 32: return N_I32;
12929         case 64: return N_I64;
12930         default: ;
12931         }
12932       break;
12933
12934     case NT_float:
12935       switch (size)
12936         {
12937         case 16: return N_F16;
12938         case 32: return N_F32;
12939         case 64: return N_F64;
12940         default: ;
12941         }
12942       break;
12943
12944     case NT_poly:
12945       switch (size)
12946         {
12947         case 8:  return N_P8;
12948         case 16: return N_P16;
12949         case 64: return N_P64;
12950         default: ;
12951         }
12952       break;
12953
12954     case NT_signed:
12955       switch (size)
12956         {
12957         case 8:  return N_S8;
12958         case 16: return N_S16;
12959         case 32: return N_S32;
12960         case 64: return N_S64;
12961         default: ;
12962         }
12963       break;
12964
12965     case NT_unsigned:
12966       switch (size)
12967         {
12968         case 8:  return N_U8;
12969         case 16: return N_U16;
12970         case 32: return N_U32;
12971         case 64: return N_U64;
12972         default: ;
12973         }
12974       break;
12975
12976     default: ;
12977     }
12978
12979   return N_UTYP;
12980 }
12981
12982 /* Convert compact Neon bitmask type representation to a type and size. Only
12983    handles the case where a single bit is set in the mask.  */
12984
12985 static int
12986 el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
12987                      enum neon_type_mask mask)
12988 {
12989   if ((mask & N_EQK) != 0)
12990     return FAIL;
12991
12992   if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
12993     *size = 8;
12994   else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_F16 | N_P16)) != 0)
12995     *size = 16;
12996   else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
12997     *size = 32;
12998   else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64 | N_P64)) != 0)
12999     *size = 64;
13000   else
13001     return FAIL;
13002
13003   if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
13004     *type = NT_signed;
13005   else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
13006     *type = NT_unsigned;
13007   else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
13008     *type = NT_integer;
13009   else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
13010     *type = NT_untyped;
13011   else if ((mask & (N_P8 | N_P16 | N_P64)) != 0)
13012     *type = NT_poly;
13013   else if ((mask & (N_F16 | N_F32 | N_F64)) != 0)
13014     *type = NT_float;
13015   else
13016     return FAIL;
13017
13018   return SUCCESS;
13019 }
13020
13021 /* Modify a bitmask of allowed types. This is only needed for type
13022    relaxation.  */
13023
13024 static unsigned
13025 modify_types_allowed (unsigned allowed, unsigned mods)
13026 {
13027   unsigned size;
13028   enum neon_el_type type;
13029   unsigned destmask;
13030   int i;
13031
13032   destmask = 0;
13033
13034   for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
13035     {
13036       if (el_type_of_type_chk (&type, &size,
13037                                (enum neon_type_mask) (allowed & i)) == SUCCESS)
13038         {
13039           neon_modify_type_size (mods, &type, &size);
13040           destmask |= type_chk_of_el_type (type, size);
13041         }
13042     }
13043
13044   return destmask;
13045 }
13046
13047 /* Check type and return type classification.
13048    The manual states (paraphrase): If one datatype is given, it indicates the
13049    type given in:
13050     - the second operand, if there is one
13051     - the operand, if there is no second operand
13052     - the result, if there are no operands.
13053    This isn't quite good enough though, so we use a concept of a "key" datatype
13054    which is set on a per-instruction basis, which is the one which matters when
13055    only one data type is written.
13056    Note: this function has side-effects (e.g. filling in missing operands). All
13057    Neon instructions should call it before performing bit encoding.  */
13058
13059 static struct neon_type_el
13060 neon_check_type (unsigned els, enum neon_shape ns, ...)
13061 {
13062   va_list ap;
13063   unsigned i, pass, key_el = 0;
13064   unsigned types[NEON_MAX_TYPE_ELS];
13065   enum neon_el_type k_type = NT_invtype;
13066   unsigned k_size = -1u;
13067   struct neon_type_el badtype = {NT_invtype, -1};
13068   unsigned key_allowed = 0;
13069
13070   /* Optional registers in Neon instructions are always (not) in operand 1.
13071      Fill in the missing operand here, if it was omitted.  */
13072   if (els > 1 && !inst.operands[1].present)
13073     inst.operands[1] = inst.operands[0];
13074
13075   /* Suck up all the varargs.  */
13076   va_start (ap, ns);
13077   for (i = 0; i < els; i++)
13078     {
13079       unsigned thisarg = va_arg (ap, unsigned);
13080       if (thisarg == N_IGNORE_TYPE)
13081         {
13082           va_end (ap);
13083           return badtype;
13084         }
13085       types[i] = thisarg;
13086       if ((thisarg & N_KEY) != 0)
13087         key_el = i;
13088     }
13089   va_end (ap);
13090
13091   if (inst.vectype.elems > 0)
13092     for (i = 0; i < els; i++)
13093       if (inst.operands[i].vectype.type != NT_invtype)
13094         {
13095           first_error (_("types specified in both the mnemonic and operands"));
13096           return badtype;
13097         }
13098
13099   /* Duplicate inst.vectype elements here as necessary.
13100      FIXME: No idea if this is exactly the same as the ARM assembler,
13101      particularly when an insn takes one register and one non-register
13102      operand. */
13103   if (inst.vectype.elems == 1 && els > 1)
13104     {
13105       unsigned j;
13106       inst.vectype.elems = els;
13107       inst.vectype.el[key_el] = inst.vectype.el[0];
13108       for (j = 0; j < els; j++)
13109         if (j != key_el)
13110           inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
13111                                                   types[j]);
13112     }
13113   else if (inst.vectype.elems == 0 && els > 0)
13114     {
13115       unsigned j;
13116       /* No types were given after the mnemonic, so look for types specified
13117          after each operand. We allow some flexibility here; as long as the
13118          "key" operand has a type, we can infer the others.  */
13119       for (j = 0; j < els; j++)
13120         if (inst.operands[j].vectype.type != NT_invtype)
13121           inst.vectype.el[j] = inst.operands[j].vectype;
13122
13123       if (inst.operands[key_el].vectype.type != NT_invtype)
13124         {
13125           for (j = 0; j < els; j++)
13126             if (inst.operands[j].vectype.type == NT_invtype)
13127               inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
13128                                                       types[j]);
13129         }
13130       else
13131         {
13132           first_error (_("operand types can't be inferred"));
13133           return badtype;
13134         }
13135     }
13136   else if (inst.vectype.elems != els)
13137     {
13138       first_error (_("type specifier has the wrong number of parts"));
13139       return badtype;
13140     }
13141
13142   for (pass = 0; pass < 2; pass++)
13143     {
13144       for (i = 0; i < els; i++)
13145         {
13146           unsigned thisarg = types[i];
13147           unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
13148             ? modify_types_allowed (key_allowed, thisarg) : thisarg;
13149           enum neon_el_type g_type = inst.vectype.el[i].type;
13150           unsigned g_size = inst.vectype.el[i].size;
13151
13152           /* Decay more-specific signed & unsigned types to sign-insensitive
13153              integer types if sign-specific variants are unavailable.  */
13154           if ((g_type == NT_signed || g_type == NT_unsigned)
13155               && (types_allowed & N_SU_ALL) == 0)
13156             g_type = NT_integer;
13157
13158           /* If only untyped args are allowed, decay any more specific types to
13159              them. Some instructions only care about signs for some element
13160              sizes, so handle that properly.  */
13161           if (((types_allowed & N_UNT) == 0)
13162               && ((g_size == 8 && (types_allowed & N_8) != 0)
13163                   || (g_size == 16 && (types_allowed & N_16) != 0)
13164                   || (g_size == 32 && (types_allowed & N_32) != 0)
13165                   || (g_size == 64 && (types_allowed & N_64) != 0)))
13166             g_type = NT_untyped;
13167
13168           if (pass == 0)
13169             {
13170               if ((thisarg & N_KEY) != 0)
13171                 {
13172                   k_type = g_type;
13173                   k_size = g_size;
13174                   key_allowed = thisarg & ~N_KEY;
13175                 }
13176             }
13177           else
13178             {
13179               if ((thisarg & N_VFP) != 0)
13180                 {
13181                   enum neon_shape_el regshape;
13182                   unsigned regwidth, match;
13183
13184                   /* PR 11136: Catch the case where we are passed a shape of NS_NULL.  */
13185                   if (ns == NS_NULL)
13186                     {
13187                       first_error (_("invalid instruction shape"));
13188                       return badtype;
13189                     }
13190                   regshape = neon_shape_tab[ns].el[i];
13191                   regwidth = neon_shape_el_size[regshape];
13192
13193                   /* In VFP mode, operands must match register widths. If we
13194                      have a key operand, use its width, else use the width of
13195                      the current operand.  */
13196                   if (k_size != -1u)
13197                     match = k_size;
13198                   else
13199                     match = g_size;
13200
13201                   if (regwidth != match)
13202                     {
13203                       first_error (_("operand size must match register width"));
13204                       return badtype;
13205                     }
13206                 }
13207
13208               if ((thisarg & N_EQK) == 0)
13209                 {
13210                   unsigned given_type = type_chk_of_el_type (g_type, g_size);
13211
13212                   if ((given_type & types_allowed) == 0)
13213                     {
13214                       first_error (_("bad type in Neon instruction"));
13215                       return badtype;
13216                     }
13217                 }
13218               else
13219                 {
13220                   enum neon_el_type mod_k_type = k_type;
13221                   unsigned mod_k_size = k_size;
13222                   neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
13223                   if (g_type != mod_k_type || g_size != mod_k_size)
13224                     {
13225                       first_error (_("inconsistent types in Neon instruction"));
13226                       return badtype;
13227                     }
13228                 }
13229             }
13230         }
13231     }
13232
13233   return inst.vectype.el[key_el];
13234 }
13235
13236 /* Neon-style VFP instruction forwarding.  */
13237
13238 /* Thumb VFP instructions have 0xE in the condition field.  */
13239
13240 static void
13241 do_vfp_cond_or_thumb (void)
13242 {
13243   inst.is_neon = 1;
13244
13245   if (thumb_mode)
13246     inst.instruction |= 0xe0000000;
13247   else
13248     inst.instruction |= inst.cond << 28;
13249 }
13250
13251 /* Look up and encode a simple mnemonic, for use as a helper function for the
13252    Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
13253    etc.  It is assumed that operand parsing has already been done, and that the
13254    operands are in the form expected by the given opcode (this isn't necessarily
13255    the same as the form in which they were parsed, hence some massaging must
13256    take place before this function is called).
13257    Checks current arch version against that in the looked-up opcode.  */
13258
13259 static void
13260 do_vfp_nsyn_opcode (const char *opname)
13261 {
13262   const struct asm_opcode *opcode;
13263
13264   opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
13265
13266   if (!opcode)
13267     abort ();
13268
13269   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
13270                 thumb_mode ? *opcode->tvariant : *opcode->avariant),
13271               _(BAD_FPU));
13272
13273   inst.is_neon = 1;
13274
13275   if (thumb_mode)
13276     {
13277       inst.instruction = opcode->tvalue;
13278       opcode->tencode ();
13279     }
13280   else
13281     {
13282       inst.instruction = (inst.cond << 28) | opcode->avalue;
13283       opcode->aencode ();
13284     }
13285 }
13286
13287 static void
13288 do_vfp_nsyn_add_sub (enum neon_shape rs)
13289 {
13290   int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
13291
13292   if (rs == NS_FFF)
13293     {
13294       if (is_add)
13295         do_vfp_nsyn_opcode ("fadds");
13296       else
13297         do_vfp_nsyn_opcode ("fsubs");
13298     }
13299   else
13300     {
13301       if (is_add)
13302         do_vfp_nsyn_opcode ("faddd");
13303       else
13304         do_vfp_nsyn_opcode ("fsubd");
13305     }
13306 }
13307
13308 /* Check operand types to see if this is a VFP instruction, and if so call
13309    PFN ().  */
13310
13311 static int
13312 try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
13313 {
13314   enum neon_shape rs;
13315   struct neon_type_el et;
13316
13317   switch (args)
13318     {
13319     case 2:
13320       rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13321       et = neon_check_type (2, rs,
13322         N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13323       break;
13324
13325     case 3:
13326       rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13327       et = neon_check_type (3, rs,
13328         N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13329       break;
13330
13331     default:
13332       abort ();
13333     }
13334
13335   if (et.type != NT_invtype)
13336     {
13337       pfn (rs);
13338       return SUCCESS;
13339     }
13340
13341   inst.error = NULL;
13342   return FAIL;
13343 }
13344
13345 static void
13346 do_vfp_nsyn_mla_mls (enum neon_shape rs)
13347 {
13348   int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
13349
13350   if (rs == NS_FFF)
13351     {
13352       if (is_mla)
13353         do_vfp_nsyn_opcode ("fmacs");
13354       else
13355         do_vfp_nsyn_opcode ("fnmacs");
13356     }
13357   else
13358     {
13359       if (is_mla)
13360         do_vfp_nsyn_opcode ("fmacd");
13361       else
13362         do_vfp_nsyn_opcode ("fnmacd");
13363     }
13364 }
13365
13366 static void
13367 do_vfp_nsyn_fma_fms (enum neon_shape rs)
13368 {
13369   int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
13370
13371   if (rs == NS_FFF)
13372     {
13373       if (is_fma)
13374         do_vfp_nsyn_opcode ("ffmas");
13375       else
13376         do_vfp_nsyn_opcode ("ffnmas");
13377     }
13378   else
13379     {
13380       if (is_fma)
13381         do_vfp_nsyn_opcode ("ffmad");
13382       else
13383         do_vfp_nsyn_opcode ("ffnmad");
13384     }
13385 }
13386
13387 static void
13388 do_vfp_nsyn_mul (enum neon_shape rs)
13389 {
13390   if (rs == NS_FFF)
13391     do_vfp_nsyn_opcode ("fmuls");
13392   else
13393     do_vfp_nsyn_opcode ("fmuld");
13394 }
13395
13396 static void
13397 do_vfp_nsyn_abs_neg (enum neon_shape rs)
13398 {
13399   int is_neg = (inst.instruction & 0x80) != 0;
13400   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
13401
13402   if (rs == NS_FF)
13403     {
13404       if (is_neg)
13405         do_vfp_nsyn_opcode ("fnegs");
13406       else
13407         do_vfp_nsyn_opcode ("fabss");
13408     }
13409   else
13410     {
13411       if (is_neg)
13412         do_vfp_nsyn_opcode ("fnegd");
13413       else
13414         do_vfp_nsyn_opcode ("fabsd");
13415     }
13416 }
13417
13418 /* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
13419    insns belong to Neon, and are handled elsewhere.  */
13420
13421 static void
13422 do_vfp_nsyn_ldm_stm (int is_dbmode)
13423 {
13424   int is_ldm = (inst.instruction & (1 << 20)) != 0;
13425   if (is_ldm)
13426     {
13427       if (is_dbmode)
13428         do_vfp_nsyn_opcode ("fldmdbs");
13429       else
13430         do_vfp_nsyn_opcode ("fldmias");
13431     }
13432   else
13433     {
13434       if (is_dbmode)
13435         do_vfp_nsyn_opcode ("fstmdbs");
13436       else
13437         do_vfp_nsyn_opcode ("fstmias");
13438     }
13439 }
13440
13441 static void
13442 do_vfp_nsyn_sqrt (void)
13443 {
13444   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13445   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13446
13447   if (rs == NS_FF)
13448     do_vfp_nsyn_opcode ("fsqrts");
13449   else
13450     do_vfp_nsyn_opcode ("fsqrtd");
13451 }
13452
13453 static void
13454 do_vfp_nsyn_div (void)
13455 {
13456   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13457   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13458     N_F32 | N_F64 | N_KEY | N_VFP);
13459
13460   if (rs == NS_FFF)
13461     do_vfp_nsyn_opcode ("fdivs");
13462   else
13463     do_vfp_nsyn_opcode ("fdivd");
13464 }
13465
13466 static void
13467 do_vfp_nsyn_nmul (void)
13468 {
13469   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13470   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13471     N_F32 | N_F64 | N_KEY | N_VFP);
13472
13473   if (rs == NS_FFF)
13474     {
13475       NEON_ENCODE (SINGLE, inst);
13476       do_vfp_sp_dyadic ();
13477     }
13478   else
13479     {
13480       NEON_ENCODE (DOUBLE, inst);
13481       do_vfp_dp_rd_rn_rm ();
13482     }
13483   do_vfp_cond_or_thumb ();
13484 }
13485
13486 static void
13487 do_vfp_nsyn_cmp (void)
13488 {
13489   if (inst.operands[1].isreg)
13490     {
13491       enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13492       neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13493
13494       if (rs == NS_FF)
13495         {
13496           NEON_ENCODE (SINGLE, inst);
13497           do_vfp_sp_monadic ();
13498         }
13499       else
13500         {
13501           NEON_ENCODE (DOUBLE, inst);
13502           do_vfp_dp_rd_rm ();
13503         }
13504     }
13505   else
13506     {
13507       enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
13508       neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
13509
13510       switch (inst.instruction & 0x0fffffff)
13511         {
13512         case N_MNEM_vcmp:
13513           inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
13514           break;
13515         case N_MNEM_vcmpe:
13516           inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
13517           break;
13518         default:
13519           abort ();
13520         }
13521
13522       if (rs == NS_FI)
13523         {
13524           NEON_ENCODE (SINGLE, inst);
13525           do_vfp_sp_compare_z ();
13526         }
13527       else
13528         {
13529           NEON_ENCODE (DOUBLE, inst);
13530           do_vfp_dp_rd ();
13531         }
13532     }
13533   do_vfp_cond_or_thumb ();
13534 }
13535
13536 static void
13537 nsyn_insert_sp (void)
13538 {
13539   inst.operands[1] = inst.operands[0];
13540   memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
13541   inst.operands[0].reg = REG_SP;
13542   inst.operands[0].isreg = 1;
13543   inst.operands[0].writeback = 1;
13544   inst.operands[0].present = 1;
13545 }
13546
13547 static void
13548 do_vfp_nsyn_push (void)
13549 {
13550   nsyn_insert_sp ();
13551   if (inst.operands[1].issingle)
13552     do_vfp_nsyn_opcode ("fstmdbs");
13553   else
13554     do_vfp_nsyn_opcode ("fstmdbd");
13555 }
13556
13557 static void
13558 do_vfp_nsyn_pop (void)
13559 {
13560   nsyn_insert_sp ();
13561   if (inst.operands[1].issingle)
13562     do_vfp_nsyn_opcode ("fldmias");
13563   else
13564     do_vfp_nsyn_opcode ("fldmiad");
13565 }
13566
13567 /* Fix up Neon data-processing instructions, ORing in the correct bits for
13568    ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
13569
13570 static void
13571 neon_dp_fixup (struct arm_it* insn)
13572 {
13573   unsigned int i = insn->instruction;
13574   insn->is_neon = 1;
13575
13576   if (thumb_mode)
13577     {
13578       /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
13579       if (i & (1 << 24))
13580         i |= 1 << 28;
13581
13582       i &= ~(1 << 24);
13583
13584       i |= 0xef000000;
13585     }
13586   else
13587     i |= 0xf2000000;
13588
13589   insn->instruction = i;
13590 }
13591
13592 /* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
13593    (0, 1, 2, 3).  */
13594
13595 static unsigned
13596 neon_logbits (unsigned x)
13597 {
13598   return ffs (x) - 4;
13599 }
13600
13601 #define LOW4(R) ((R) & 0xf)
13602 #define HI1(R) (((R) >> 4) & 1)
13603
13604 /* Encode insns with bit pattern:
13605
13606   |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
13607   |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
13608
13609   SIZE is passed in bits. -1 means size field isn't changed, in case it has a
13610   different meaning for some instruction.  */
13611
13612 static void
13613 neon_three_same (int isquad, int ubit, int size)
13614 {
13615   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13616   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13617   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13618   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13619   inst.instruction |= LOW4 (inst.operands[2].reg);
13620   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13621   inst.instruction |= (isquad != 0) << 6;
13622   inst.instruction |= (ubit != 0) << 24;
13623   if (size != -1)
13624     inst.instruction |= neon_logbits (size) << 20;
13625
13626   neon_dp_fixup (&inst);
13627 }
13628
13629 /* Encode instructions of the form:
13630
13631   |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
13632   |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
13633
13634   Don't write size if SIZE == -1.  */
13635
13636 static void
13637 neon_two_same (int qbit, int ubit, int size)
13638 {
13639   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13640   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13641   inst.instruction |= LOW4 (inst.operands[1].reg);
13642   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13643   inst.instruction |= (qbit != 0) << 6;
13644   inst.instruction |= (ubit != 0) << 24;
13645
13646   if (size != -1)
13647     inst.instruction |= neon_logbits (size) << 18;
13648
13649   neon_dp_fixup (&inst);
13650 }
13651
13652 /* Neon instruction encoders, in approximate order of appearance.  */
13653
13654 static void
13655 do_neon_dyadic_i_su (void)
13656 {
13657   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13658   struct neon_type_el et = neon_check_type (3, rs,
13659     N_EQK, N_EQK, N_SU_32 | N_KEY);
13660   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13661 }
13662
13663 static void
13664 do_neon_dyadic_i64_su (void)
13665 {
13666   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13667   struct neon_type_el et = neon_check_type (3, rs,
13668     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13669   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13670 }
13671
13672 static void
13673 neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
13674                 unsigned immbits)
13675 {
13676   unsigned size = et.size >> 3;
13677   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13678   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13679   inst.instruction |= LOW4 (inst.operands[1].reg);
13680   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13681   inst.instruction |= (isquad != 0) << 6;
13682   inst.instruction |= immbits << 16;
13683   inst.instruction |= (size >> 3) << 7;
13684   inst.instruction |= (size & 0x7) << 19;
13685   if (write_ubit)
13686     inst.instruction |= (uval != 0) << 24;
13687
13688   neon_dp_fixup (&inst);
13689 }
13690
13691 static void
13692 do_neon_shl_imm (void)
13693 {
13694   if (!inst.operands[2].isreg)
13695     {
13696       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13697       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
13698       NEON_ENCODE (IMMED, inst);
13699       neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
13700     }
13701   else
13702     {
13703       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13704       struct neon_type_el et = neon_check_type (3, rs,
13705         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13706       unsigned int tmp;
13707
13708       /* VSHL/VQSHL 3-register variants have syntax such as:
13709            vshl.xx Dd, Dm, Dn
13710          whereas other 3-register operations encoded by neon_three_same have
13711          syntax like:
13712            vadd.xx Dd, Dn, Dm
13713          (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
13714          here.  */
13715       tmp = inst.operands[2].reg;
13716       inst.operands[2].reg = inst.operands[1].reg;
13717       inst.operands[1].reg = tmp;
13718       NEON_ENCODE (INTEGER, inst);
13719       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13720     }
13721 }
13722
13723 static void
13724 do_neon_qshl_imm (void)
13725 {
13726   if (!inst.operands[2].isreg)
13727     {
13728       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13729       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
13730
13731       NEON_ENCODE (IMMED, inst);
13732       neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
13733                       inst.operands[2].imm);
13734     }
13735   else
13736     {
13737       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13738       struct neon_type_el et = neon_check_type (3, rs,
13739         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13740       unsigned int tmp;
13741
13742       /* See note in do_neon_shl_imm.  */
13743       tmp = inst.operands[2].reg;
13744       inst.operands[2].reg = inst.operands[1].reg;
13745       inst.operands[1].reg = tmp;
13746       NEON_ENCODE (INTEGER, inst);
13747       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13748     }
13749 }
13750
13751 static void
13752 do_neon_rshl (void)
13753 {
13754   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13755   struct neon_type_el et = neon_check_type (3, rs,
13756     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13757   unsigned int tmp;
13758
13759   tmp = inst.operands[2].reg;
13760   inst.operands[2].reg = inst.operands[1].reg;
13761   inst.operands[1].reg = tmp;
13762   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13763 }
13764
13765 static int
13766 neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
13767 {
13768   /* Handle .I8 pseudo-instructions.  */
13769   if (size == 8)
13770     {
13771       /* Unfortunately, this will make everything apart from zero out-of-range.
13772          FIXME is this the intended semantics? There doesn't seem much point in
13773          accepting .I8 if so.  */
13774       immediate |= immediate << 8;
13775       size = 16;
13776     }
13777
13778   if (size >= 32)
13779     {
13780       if (immediate == (immediate & 0x000000ff))
13781         {
13782           *immbits = immediate;
13783           return 0x1;
13784         }
13785       else if (immediate == (immediate & 0x0000ff00))
13786         {
13787           *immbits = immediate >> 8;
13788           return 0x3;
13789         }
13790       else if (immediate == (immediate & 0x00ff0000))
13791         {
13792           *immbits = immediate >> 16;
13793           return 0x5;
13794         }
13795       else if (immediate == (immediate & 0xff000000))
13796         {
13797           *immbits = immediate >> 24;
13798           return 0x7;
13799         }
13800       if ((immediate & 0xffff) != (immediate >> 16))
13801         goto bad_immediate;
13802       immediate &= 0xffff;
13803     }
13804
13805   if (immediate == (immediate & 0x000000ff))
13806     {
13807       *immbits = immediate;
13808       return 0x9;
13809     }
13810   else if (immediate == (immediate & 0x0000ff00))
13811     {
13812       *immbits = immediate >> 8;
13813       return 0xb;
13814     }
13815
13816   bad_immediate:
13817   first_error (_("immediate value out of range"));
13818   return FAIL;
13819 }
13820
13821 /* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
13822    A, B, C, D.  */
13823
13824 static int
13825 neon_bits_same_in_bytes (unsigned imm)
13826 {
13827   return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
13828          && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
13829          && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
13830          && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
13831 }
13832
13833 /* For immediate of above form, return 0bABCD.  */
13834
13835 static unsigned
13836 neon_squash_bits (unsigned imm)
13837 {
13838   return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
13839          | ((imm & 0x01000000) >> 21);
13840 }
13841
13842 /* Compress quarter-float representation to 0b...000 abcdefgh.  */
13843
13844 static unsigned
13845 neon_qfloat_bits (unsigned imm)
13846 {
13847   return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
13848 }
13849
13850 /* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
13851    the instruction. *OP is passed as the initial value of the op field, and
13852    may be set to a different value depending on the constant (i.e.
13853    "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
13854    MVN).  If the immediate looks like a repeated pattern then also
13855    try smaller element sizes.  */
13856
13857 static int
13858 neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
13859                          unsigned *immbits, int *op, int size,
13860                          enum neon_el_type type)
13861 {
13862   /* Only permit float immediates (including 0.0/-0.0) if the operand type is
13863      float.  */
13864   if (type == NT_float && !float_p)
13865     return FAIL;
13866
13867   if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
13868     {
13869       if (size != 32 || *op == 1)
13870         return FAIL;
13871       *immbits = neon_qfloat_bits (immlo);
13872       return 0xf;
13873     }
13874
13875   if (size == 64)
13876     {
13877       if (neon_bits_same_in_bytes (immhi)
13878           && neon_bits_same_in_bytes (immlo))
13879         {
13880           if (*op == 1)
13881             return FAIL;
13882           *immbits = (neon_squash_bits (immhi) << 4)
13883                      | neon_squash_bits (immlo);
13884           *op = 1;
13885           return 0xe;
13886         }
13887
13888       if (immhi != immlo)
13889         return FAIL;
13890     }
13891
13892   if (size >= 32)
13893     {
13894       if (immlo == (immlo & 0x000000ff))
13895         {
13896           *immbits = immlo;
13897           return 0x0;
13898         }
13899       else if (immlo == (immlo & 0x0000ff00))
13900         {
13901           *immbits = immlo >> 8;
13902           return 0x2;
13903         }
13904       else if (immlo == (immlo & 0x00ff0000))
13905         {
13906           *immbits = immlo >> 16;
13907           return 0x4;
13908         }
13909       else if (immlo == (immlo & 0xff000000))
13910         {
13911           *immbits = immlo >> 24;
13912           return 0x6;
13913         }
13914       else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
13915         {
13916           *immbits = (immlo >> 8) & 0xff;
13917           return 0xc;
13918         }
13919       else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
13920         {
13921           *immbits = (immlo >> 16) & 0xff;
13922           return 0xd;
13923         }
13924
13925       if ((immlo & 0xffff) != (immlo >> 16))
13926         return FAIL;
13927       immlo &= 0xffff;
13928     }
13929
13930   if (size >= 16)
13931     {
13932       if (immlo == (immlo & 0x000000ff))
13933         {
13934           *immbits = immlo;
13935           return 0x8;
13936         }
13937       else if (immlo == (immlo & 0x0000ff00))
13938         {
13939           *immbits = immlo >> 8;
13940           return 0xa;
13941         }
13942
13943       if ((immlo & 0xff) != (immlo >> 8))
13944         return FAIL;
13945       immlo &= 0xff;
13946     }
13947
13948   if (immlo == (immlo & 0x000000ff))
13949     {
13950       /* Don't allow MVN with 8-bit immediate.  */
13951       if (*op == 1)
13952         return FAIL;
13953       *immbits = immlo;
13954       return 0xe;
13955     }
13956
13957   return FAIL;
13958 }
13959
13960 /* Write immediate bits [7:0] to the following locations:
13961
13962   |28/24|23     19|18 16|15                    4|3     0|
13963   |  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|
13964
13965   This function is used by VMOV/VMVN/VORR/VBIC.  */
13966
13967 static void
13968 neon_write_immbits (unsigned immbits)
13969 {
13970   inst.instruction |= immbits & 0xf;
13971   inst.instruction |= ((immbits >> 4) & 0x7) << 16;
13972   inst.instruction |= ((immbits >> 7) & 0x1) << 24;
13973 }
13974
13975 /* Invert low-order SIZE bits of XHI:XLO.  */
13976
13977 static void
13978 neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
13979 {
13980   unsigned immlo = xlo ? *xlo : 0;
13981   unsigned immhi = xhi ? *xhi : 0;
13982
13983   switch (size)
13984     {
13985     case 8:
13986       immlo = (~immlo) & 0xff;
13987       break;
13988
13989     case 16:
13990       immlo = (~immlo) & 0xffff;
13991       break;
13992
13993     case 64:
13994       immhi = (~immhi) & 0xffffffff;
13995       /* fall through.  */
13996
13997     case 32:
13998       immlo = (~immlo) & 0xffffffff;
13999       break;
14000
14001     default:
14002       abort ();
14003     }
14004
14005   if (xlo)
14006     *xlo = immlo;
14007
14008   if (xhi)
14009     *xhi = immhi;
14010 }
14011
14012 static void
14013 do_neon_logic (void)
14014 {
14015   if (inst.operands[2].present && inst.operands[2].isreg)
14016     {
14017       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14018       neon_check_type (3, rs, N_IGNORE_TYPE);
14019       /* U bit and size field were set as part of the bitmask.  */
14020       NEON_ENCODE (INTEGER, inst);
14021       neon_three_same (neon_quad (rs), 0, -1);
14022     }
14023   else
14024     {
14025       const int three_ops_form = (inst.operands[2].present
14026                                   && !inst.operands[2].isreg);
14027       const int immoperand = (three_ops_form ? 2 : 1);
14028       enum neon_shape rs = (three_ops_form
14029                             ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
14030                             : neon_select_shape (NS_DI, NS_QI, NS_NULL));
14031       struct neon_type_el et = neon_check_type (2, rs,
14032         N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
14033       enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
14034       unsigned immbits;
14035       int cmode;
14036
14037       if (et.type == NT_invtype)
14038         return;
14039
14040       if (three_ops_form)
14041         constraint (inst.operands[0].reg != inst.operands[1].reg,
14042                     _("first and second operands shall be the same register"));
14043
14044       NEON_ENCODE (IMMED, inst);
14045
14046       immbits = inst.operands[immoperand].imm;
14047       if (et.size == 64)
14048         {
14049           /* .i64 is a pseudo-op, so the immediate must be a repeating
14050              pattern.  */
14051           if (immbits != (inst.operands[immoperand].regisimm ?
14052                           inst.operands[immoperand].reg : 0))
14053             {
14054               /* Set immbits to an invalid constant.  */
14055               immbits = 0xdeadbeef;
14056             }
14057         }
14058
14059       switch (opcode)
14060         {
14061         case N_MNEM_vbic:
14062           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14063           break;
14064
14065         case N_MNEM_vorr:
14066           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14067           break;
14068
14069         case N_MNEM_vand:
14070           /* Pseudo-instruction for VBIC.  */
14071           neon_invert_size (&immbits, 0, et.size);
14072           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14073           break;
14074
14075         case N_MNEM_vorn:
14076           /* Pseudo-instruction for VORR.  */
14077           neon_invert_size (&immbits, 0, et.size);
14078           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14079           break;
14080
14081         default:
14082           abort ();
14083         }
14084
14085       if (cmode == FAIL)
14086         return;
14087
14088       inst.instruction |= neon_quad (rs) << 6;
14089       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14090       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14091       inst.instruction |= cmode << 8;
14092       neon_write_immbits (immbits);
14093
14094       neon_dp_fixup (&inst);
14095     }
14096 }
14097
14098 static void
14099 do_neon_bitfield (void)
14100 {
14101   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14102   neon_check_type (3, rs, N_IGNORE_TYPE);
14103   neon_three_same (neon_quad (rs), 0, -1);
14104 }
14105
14106 static void
14107 neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
14108                   unsigned destbits)
14109 {
14110   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14111   struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
14112                                             types | N_KEY);
14113   if (et.type == NT_float)
14114     {
14115       NEON_ENCODE (FLOAT, inst);
14116       neon_three_same (neon_quad (rs), 0, -1);
14117     }
14118   else
14119     {
14120       NEON_ENCODE (INTEGER, inst);
14121       neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
14122     }
14123 }
14124
14125 static void
14126 do_neon_dyadic_if_su (void)
14127 {
14128   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
14129 }
14130
14131 static void
14132 do_neon_dyadic_if_su_d (void)
14133 {
14134   /* This version only allow D registers, but that constraint is enforced during
14135      operand parsing so we don't need to do anything extra here.  */
14136   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
14137 }
14138
14139 static void
14140 do_neon_dyadic_if_i_d (void)
14141 {
14142   /* The "untyped" case can't happen. Do this to stop the "U" bit being
14143      affected if we specify unsigned args.  */
14144   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14145 }
14146
14147 enum vfp_or_neon_is_neon_bits
14148 {
14149   NEON_CHECK_CC = 1,
14150   NEON_CHECK_ARCH = 2,
14151   NEON_CHECK_ARCH8 = 4
14152 };
14153
14154 /* Call this function if an instruction which may have belonged to the VFP or
14155    Neon instruction sets, but turned out to be a Neon instruction (due to the
14156    operand types involved, etc.). We have to check and/or fix-up a couple of
14157    things:
14158
14159      - Make sure the user hasn't attempted to make a Neon instruction
14160        conditional.
14161      - Alter the value in the condition code field if necessary.
14162      - Make sure that the arch supports Neon instructions.
14163
14164    Which of these operations take place depends on bits from enum
14165    vfp_or_neon_is_neon_bits.
14166
14167    WARNING: This function has side effects! If NEON_CHECK_CC is used and the
14168    current instruction's condition is COND_ALWAYS, the condition field is
14169    changed to inst.uncond_value. This is necessary because instructions shared
14170    between VFP and Neon may be conditional for the VFP variants only, and the
14171    unconditional Neon version must have, e.g., 0xF in the condition field.  */
14172
14173 static int
14174 vfp_or_neon_is_neon (unsigned check)
14175 {
14176   /* Conditions are always legal in Thumb mode (IT blocks).  */
14177   if (!thumb_mode && (check & NEON_CHECK_CC))
14178     {
14179       if (inst.cond != COND_ALWAYS)
14180         {
14181           first_error (_(BAD_COND));
14182           return FAIL;
14183         }
14184       if (inst.uncond_value != -1)
14185         inst.instruction |= inst.uncond_value << 28;
14186     }
14187
14188   if ((check & NEON_CHECK_ARCH)
14189       && !mark_feature_used (&fpu_neon_ext_v1))
14190     {
14191       first_error (_(BAD_FPU));
14192       return FAIL;
14193     }
14194
14195   if ((check & NEON_CHECK_ARCH8)
14196       && !mark_feature_used (&fpu_neon_ext_armv8))
14197     {
14198       first_error (_(BAD_FPU));
14199       return FAIL;
14200     }
14201
14202   return SUCCESS;
14203 }
14204
14205 static void
14206 do_neon_addsub_if_i (void)
14207 {
14208   if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
14209     return;
14210
14211   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14212     return;
14213
14214   /* The "untyped" case can't happen. Do this to stop the "U" bit being
14215      affected if we specify unsigned args.  */
14216   neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
14217 }
14218
14219 /* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
14220    result to be:
14221      V<op> A,B     (A is operand 0, B is operand 2)
14222    to mean:
14223      V<op> A,B,A
14224    not:
14225      V<op> A,B,B
14226    so handle that case specially.  */
14227
14228 static void
14229 neon_exchange_operands (void)
14230 {
14231   void *scratch = alloca (sizeof (inst.operands[0]));
14232   if (inst.operands[1].present)
14233     {
14234       /* Swap operands[1] and operands[2].  */
14235       memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
14236       inst.operands[1] = inst.operands[2];
14237       memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
14238     }
14239   else
14240     {
14241       inst.operands[1] = inst.operands[2];
14242       inst.operands[2] = inst.operands[0];
14243     }
14244 }
14245
14246 static void
14247 neon_compare (unsigned regtypes, unsigned immtypes, int invert)
14248 {
14249   if (inst.operands[2].isreg)
14250     {
14251       if (invert)
14252         neon_exchange_operands ();
14253       neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
14254     }
14255   else
14256     {
14257       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14258       struct neon_type_el et = neon_check_type (2, rs,
14259         N_EQK | N_SIZ, immtypes | N_KEY);
14260
14261       NEON_ENCODE (IMMED, inst);
14262       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14263       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14264       inst.instruction |= LOW4 (inst.operands[1].reg);
14265       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14266       inst.instruction |= neon_quad (rs) << 6;
14267       inst.instruction |= (et.type == NT_float) << 10;
14268       inst.instruction |= neon_logbits (et.size) << 18;
14269
14270       neon_dp_fixup (&inst);
14271     }
14272 }
14273
14274 static void
14275 do_neon_cmp (void)
14276 {
14277   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
14278 }
14279
14280 static void
14281 do_neon_cmp_inv (void)
14282 {
14283   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
14284 }
14285
14286 static void
14287 do_neon_ceq (void)
14288 {
14289   neon_compare (N_IF_32, N_IF_32, FALSE);
14290 }
14291
14292 /* For multiply instructions, we have the possibility of 16-bit or 32-bit
14293    scalars, which are encoded in 5 bits, M : Rm.
14294    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
14295    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
14296    index in M.  */
14297
14298 static unsigned
14299 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
14300 {
14301   unsigned regno = NEON_SCALAR_REG (scalar);
14302   unsigned elno = NEON_SCALAR_INDEX (scalar);
14303
14304   switch (elsize)
14305     {
14306     case 16:
14307       if (regno > 7 || elno > 3)
14308         goto bad_scalar;
14309       return regno | (elno << 3);
14310
14311     case 32:
14312       if (regno > 15 || elno > 1)
14313         goto bad_scalar;
14314       return regno | (elno << 4);
14315
14316     default:
14317     bad_scalar:
14318       first_error (_("scalar out of range for multiply instruction"));
14319     }
14320
14321   return 0;
14322 }
14323
14324 /* Encode multiply / multiply-accumulate scalar instructions.  */
14325
14326 static void
14327 neon_mul_mac (struct neon_type_el et, int ubit)
14328 {
14329   unsigned scalar;
14330
14331   /* Give a more helpful error message if we have an invalid type.  */
14332   if (et.type == NT_invtype)
14333     return;
14334
14335   scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
14336   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14337   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14338   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14339   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14340   inst.instruction |= LOW4 (scalar);
14341   inst.instruction |= HI1 (scalar) << 5;
14342   inst.instruction |= (et.type == NT_float) << 8;
14343   inst.instruction |= neon_logbits (et.size) << 20;
14344   inst.instruction |= (ubit != 0) << 24;
14345
14346   neon_dp_fixup (&inst);
14347 }
14348
14349 static void
14350 do_neon_mac_maybe_scalar (void)
14351 {
14352   if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
14353     return;
14354
14355   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14356     return;
14357
14358   if (inst.operands[2].isscalar)
14359     {
14360       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
14361       struct neon_type_el et = neon_check_type (3, rs,
14362         N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
14363       NEON_ENCODE (SCALAR, inst);
14364       neon_mul_mac (et, neon_quad (rs));
14365     }
14366   else
14367     {
14368       /* The "untyped" case can't happen.  Do this to stop the "U" bit being
14369          affected if we specify unsigned args.  */
14370       neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14371     }
14372 }
14373
14374 static void
14375 do_neon_fmac (void)
14376 {
14377   if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
14378     return;
14379
14380   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14381     return;
14382
14383   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14384 }
14385
14386 static void
14387 do_neon_tst (void)
14388 {
14389   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14390   struct neon_type_el et = neon_check_type (3, rs,
14391     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
14392   neon_three_same (neon_quad (rs), 0, et.size);
14393 }
14394
14395 /* VMUL with 3 registers allows the P8 type. The scalar version supports the
14396    same types as the MAC equivalents. The polynomial type for this instruction
14397    is encoded the same as the integer type.  */
14398
14399 static void
14400 do_neon_mul (void)
14401 {
14402   if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
14403     return;
14404
14405   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14406     return;
14407
14408   if (inst.operands[2].isscalar)
14409     do_neon_mac_maybe_scalar ();
14410   else
14411     neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
14412 }
14413
14414 static void
14415 do_neon_qdmulh (void)
14416 {
14417   if (inst.operands[2].isscalar)
14418     {
14419       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
14420       struct neon_type_el et = neon_check_type (3, rs,
14421         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
14422       NEON_ENCODE (SCALAR, inst);
14423       neon_mul_mac (et, neon_quad (rs));
14424     }
14425   else
14426     {
14427       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14428       struct neon_type_el et = neon_check_type (3, rs,
14429         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
14430       NEON_ENCODE (INTEGER, inst);
14431       /* The U bit (rounding) comes from bit mask.  */
14432       neon_three_same (neon_quad (rs), 0, et.size);
14433     }
14434 }
14435
14436 static void
14437 do_neon_fcmp_absolute (void)
14438 {
14439   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14440   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14441   /* Size field comes from bit mask.  */
14442   neon_three_same (neon_quad (rs), 1, -1);
14443 }
14444
14445 static void
14446 do_neon_fcmp_absolute_inv (void)
14447 {
14448   neon_exchange_operands ();
14449   do_neon_fcmp_absolute ();
14450 }
14451
14452 static void
14453 do_neon_step (void)
14454 {
14455   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14456   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14457   neon_three_same (neon_quad (rs), 0, -1);
14458 }
14459
14460 static void
14461 do_neon_abs_neg (void)
14462 {
14463   enum neon_shape rs;
14464   struct neon_type_el et;
14465
14466   if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
14467     return;
14468
14469   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14470     return;
14471
14472   rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14473   et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
14474
14475   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14476   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14477   inst.instruction |= LOW4 (inst.operands[1].reg);
14478   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14479   inst.instruction |= neon_quad (rs) << 6;
14480   inst.instruction |= (et.type == NT_float) << 10;
14481   inst.instruction |= neon_logbits (et.size) << 18;
14482
14483   neon_dp_fixup (&inst);
14484 }
14485
14486 static void
14487 do_neon_sli (void)
14488 {
14489   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14490   struct neon_type_el et = neon_check_type (2, rs,
14491     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14492   int imm = inst.operands[2].imm;
14493   constraint (imm < 0 || (unsigned)imm >= et.size,
14494               _("immediate out of range for insert"));
14495   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
14496 }
14497
14498 static void
14499 do_neon_sri (void)
14500 {
14501   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14502   struct neon_type_el et = neon_check_type (2, rs,
14503     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14504   int imm = inst.operands[2].imm;
14505   constraint (imm < 1 || (unsigned)imm > et.size,
14506               _("immediate out of range for insert"));
14507   neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
14508 }
14509
14510 static void
14511 do_neon_qshlu_imm (void)
14512 {
14513   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14514   struct neon_type_el et = neon_check_type (2, rs,
14515     N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
14516   int imm = inst.operands[2].imm;
14517   constraint (imm < 0 || (unsigned)imm >= et.size,
14518               _("immediate out of range for shift"));
14519   /* Only encodes the 'U present' variant of the instruction.
14520      In this case, signed types have OP (bit 8) set to 0.
14521      Unsigned types have OP set to 1.  */
14522   inst.instruction |= (et.type == NT_unsigned) << 8;
14523   /* The rest of the bits are the same as other immediate shifts.  */
14524   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
14525 }
14526
14527 static void
14528 do_neon_qmovn (void)
14529 {
14530   struct neon_type_el et = neon_check_type (2, NS_DQ,
14531     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14532   /* Saturating move where operands can be signed or unsigned, and the
14533      destination has the same signedness.  */
14534   NEON_ENCODE (INTEGER, inst);
14535   if (et.type == NT_unsigned)
14536     inst.instruction |= 0xc0;
14537   else
14538     inst.instruction |= 0x80;
14539   neon_two_same (0, 1, et.size / 2);
14540 }
14541
14542 static void
14543 do_neon_qmovun (void)
14544 {
14545   struct neon_type_el et = neon_check_type (2, NS_DQ,
14546     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14547   /* Saturating move with unsigned results. Operands must be signed.  */
14548   NEON_ENCODE (INTEGER, inst);
14549   neon_two_same (0, 1, et.size / 2);
14550 }
14551
14552 static void
14553 do_neon_rshift_sat_narrow (void)
14554 {
14555   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14556      or unsigned. If operands are unsigned, results must also be unsigned.  */
14557   struct neon_type_el et = neon_check_type (2, NS_DQI,
14558     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14559   int imm = inst.operands[2].imm;
14560   /* This gets the bounds check, size encoding and immediate bits calculation
14561      right.  */
14562   et.size /= 2;
14563
14564   /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
14565      VQMOVN.I<size> <Dd>, <Qm>.  */
14566   if (imm == 0)
14567     {
14568       inst.operands[2].present = 0;
14569       inst.instruction = N_MNEM_vqmovn;
14570       do_neon_qmovn ();
14571       return;
14572     }
14573
14574   constraint (imm < 1 || (unsigned)imm > et.size,
14575               _("immediate out of range"));
14576   neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
14577 }
14578
14579 static void
14580 do_neon_rshift_sat_narrow_u (void)
14581 {
14582   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14583      or unsigned. If operands are unsigned, results must also be unsigned.  */
14584   struct neon_type_el et = neon_check_type (2, NS_DQI,
14585     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14586   int imm = inst.operands[2].imm;
14587   /* This gets the bounds check, size encoding and immediate bits calculation
14588      right.  */
14589   et.size /= 2;
14590
14591   /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
14592      VQMOVUN.I<size> <Dd>, <Qm>.  */
14593   if (imm == 0)
14594     {
14595       inst.operands[2].present = 0;
14596       inst.instruction = N_MNEM_vqmovun;
14597       do_neon_qmovun ();
14598       return;
14599     }
14600
14601   constraint (imm < 1 || (unsigned)imm > et.size,
14602               _("immediate out of range"));
14603   /* FIXME: The manual is kind of unclear about what value U should have in
14604      VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
14605      must be 1.  */
14606   neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
14607 }
14608
14609 static void
14610 do_neon_movn (void)
14611 {
14612   struct neon_type_el et = neon_check_type (2, NS_DQ,
14613     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14614   NEON_ENCODE (INTEGER, inst);
14615   neon_two_same (0, 1, et.size / 2);
14616 }
14617
14618 static void
14619 do_neon_rshift_narrow (void)
14620 {
14621   struct neon_type_el et = neon_check_type (2, NS_DQI,
14622     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14623   int imm = inst.operands[2].imm;
14624   /* This gets the bounds check, size encoding and immediate bits calculation
14625      right.  */
14626   et.size /= 2;
14627
14628   /* If immediate is zero then we are a pseudo-instruction for
14629      VMOVN.I<size> <Dd>, <Qm>  */
14630   if (imm == 0)
14631     {
14632       inst.operands[2].present = 0;
14633       inst.instruction = N_MNEM_vmovn;
14634       do_neon_movn ();
14635       return;
14636     }
14637
14638   constraint (imm < 1 || (unsigned)imm > et.size,
14639               _("immediate out of range for narrowing operation"));
14640   neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
14641 }
14642
14643 static void
14644 do_neon_shll (void)
14645 {
14646   /* FIXME: Type checking when lengthening.  */
14647   struct neon_type_el et = neon_check_type (2, NS_QDI,
14648     N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
14649   unsigned imm = inst.operands[2].imm;
14650
14651   if (imm == et.size)
14652     {
14653       /* Maximum shift variant.  */
14654       NEON_ENCODE (INTEGER, inst);
14655       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14656       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14657       inst.instruction |= LOW4 (inst.operands[1].reg);
14658       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14659       inst.instruction |= neon_logbits (et.size) << 18;
14660
14661       neon_dp_fixup (&inst);
14662     }
14663   else
14664     {
14665       /* A more-specific type check for non-max versions.  */
14666       et = neon_check_type (2, NS_QDI,
14667         N_EQK | N_DBL, N_SU_32 | N_KEY);
14668       NEON_ENCODE (IMMED, inst);
14669       neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
14670     }
14671 }
14672
14673 /* Check the various types for the VCVT instruction, and return which version
14674    the current instruction is.  */
14675
14676 #define CVT_FLAVOUR_VAR                                                       \
14677   CVT_VAR (s32_f32, N_S32, N_F32, whole_reg,   "ftosls", "ftosis", "ftosizs") \
14678   CVT_VAR (u32_f32, N_U32, N_F32, whole_reg,   "ftouls", "ftouis", "ftouizs") \
14679   CVT_VAR (f32_s32, N_F32, N_S32, whole_reg,   "fsltos", "fsitos", NULL)      \
14680   CVT_VAR (f32_u32, N_F32, N_U32, whole_reg,   "fultos", "fuitos", NULL)      \
14681   /* Half-precision conversions.  */                                          \
14682   CVT_VAR (f32_f16, N_F32, N_F16, whole_reg,   NULL,     NULL,     NULL)      \
14683   CVT_VAR (f16_f32, N_F16, N_F32, whole_reg,   NULL,     NULL,     NULL)      \
14684   /* VFP instructions.  */                                                    \
14685   CVT_VAR (f32_f64, N_F32, N_F64, N_VFP,       NULL,     "fcvtsd", NULL)      \
14686   CVT_VAR (f64_f32, N_F64, N_F32, N_VFP,       NULL,     "fcvtds", NULL)      \
14687   CVT_VAR (s32_f64, N_S32, N_F64 | key, N_VFP, "ftosld", "ftosid", "ftosizd") \
14688   CVT_VAR (u32_f64, N_U32, N_F64 | key, N_VFP, "ftould", "ftouid", "ftouizd") \
14689   CVT_VAR (f64_s32, N_F64 | key, N_S32, N_VFP, "fsltod", "fsitod", NULL)      \
14690   CVT_VAR (f64_u32, N_F64 | key, N_U32, N_VFP, "fultod", "fuitod", NULL)      \
14691   /* VFP instructions with bitshift.  */                                      \
14692   CVT_VAR (f32_s16, N_F32 | key, N_S16, N_VFP, "fshtos", NULL,     NULL)      \
14693   CVT_VAR (f32_u16, N_F32 | key, N_U16, N_VFP, "fuhtos", NULL,     NULL)      \
14694   CVT_VAR (f64_s16, N_F64 | key, N_S16, N_VFP, "fshtod", NULL,     NULL)      \
14695   CVT_VAR (f64_u16, N_F64 | key, N_U16, N_VFP, "fuhtod", NULL,     NULL)      \
14696   CVT_VAR (s16_f32, N_S16, N_F32 | key, N_VFP, "ftoshs", NULL,     NULL)      \
14697   CVT_VAR (u16_f32, N_U16, N_F32 | key, N_VFP, "ftouhs", NULL,     NULL)      \
14698   CVT_VAR (s16_f64, N_S16, N_F64 | key, N_VFP, "ftoshd", NULL,     NULL)      \
14699   CVT_VAR (u16_f64, N_U16, N_F64 | key, N_VFP, "ftouhd", NULL,     NULL)
14700
14701 #define CVT_VAR(C, X, Y, R, BSN, CN, ZN) \
14702   neon_cvt_flavour_##C,
14703
14704 /* The different types of conversions we can do.  */
14705 enum neon_cvt_flavour
14706 {
14707   CVT_FLAVOUR_VAR
14708   neon_cvt_flavour_invalid,
14709   neon_cvt_flavour_first_fp = neon_cvt_flavour_f32_f64
14710 };
14711
14712 #undef CVT_VAR
14713
14714 static enum neon_cvt_flavour
14715 get_neon_cvt_flavour (enum neon_shape rs)
14716 {
14717 #define CVT_VAR(C,X,Y,R,BSN,CN,ZN)                      \
14718   et = neon_check_type (2, rs, (R) | (X), (R) | (Y));   \
14719   if (et.type != NT_invtype)                            \
14720     {                                                   \
14721       inst.error = NULL;                                \
14722       return (neon_cvt_flavour_##C);                    \
14723     }
14724
14725   struct neon_type_el et;
14726   unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
14727                         || rs == NS_FF) ? N_VFP : 0;
14728   /* The instruction versions which take an immediate take one register
14729      argument, which is extended to the width of the full register. Thus the
14730      "source" and "destination" registers must have the same width.  Hack that
14731      here by making the size equal to the key (wider, in this case) operand.  */
14732   unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
14733
14734   CVT_FLAVOUR_VAR;
14735
14736   return neon_cvt_flavour_invalid;
14737 #undef CVT_VAR
14738 }
14739
14740 enum neon_cvt_mode
14741 {
14742   neon_cvt_mode_a,
14743   neon_cvt_mode_n,
14744   neon_cvt_mode_p,
14745   neon_cvt_mode_m,
14746   neon_cvt_mode_z,
14747   neon_cvt_mode_x,
14748   neon_cvt_mode_r
14749 };
14750
14751 /* Neon-syntax VFP conversions.  */
14752
14753 static void
14754 do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
14755 {
14756   const char *opname = 0;
14757
14758   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
14759     {
14760       /* Conversions with immediate bitshift.  */
14761       const char *enc[] =
14762         {
14763 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) BSN,
14764           CVT_FLAVOUR_VAR
14765           NULL
14766 #undef CVT_VAR
14767         };
14768
14769       if (flavour < (int) ARRAY_SIZE (enc))
14770         {
14771           opname = enc[flavour];
14772           constraint (inst.operands[0].reg != inst.operands[1].reg,
14773                       _("operands 0 and 1 must be the same register"));
14774           inst.operands[1] = inst.operands[2];
14775           memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
14776         }
14777     }
14778   else
14779     {
14780       /* Conversions without bitshift.  */
14781       const char *enc[] =
14782         {
14783 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) CN,
14784           CVT_FLAVOUR_VAR
14785           NULL
14786 #undef CVT_VAR
14787         };
14788
14789       if (flavour < (int) ARRAY_SIZE (enc))
14790         opname = enc[flavour];
14791     }
14792
14793   if (opname)
14794     do_vfp_nsyn_opcode (opname);
14795 }
14796
14797 static void
14798 do_vfp_nsyn_cvtz (void)
14799 {
14800   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
14801   enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
14802   const char *enc[] =
14803     {
14804 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) ZN,
14805       CVT_FLAVOUR_VAR
14806       NULL
14807 #undef CVT_VAR
14808     };
14809
14810   if (flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
14811     do_vfp_nsyn_opcode (enc[flavour]);
14812 }
14813
14814 static void
14815 do_vfp_nsyn_cvt_fpv8 (enum neon_cvt_flavour flavour,
14816                       enum neon_cvt_mode mode)
14817 {
14818   int sz, op;
14819   int rm;
14820
14821   set_it_insn_type (OUTSIDE_IT_INSN);
14822
14823   switch (flavour)
14824     {
14825     case neon_cvt_flavour_s32_f64:
14826       sz = 1;
14827       op = 1;
14828       break;
14829     case neon_cvt_flavour_s32_f32:
14830       sz = 0;
14831       op = 1;
14832       break;
14833     case neon_cvt_flavour_u32_f64:
14834       sz = 1;
14835       op = 0;
14836       break;
14837     case neon_cvt_flavour_u32_f32:
14838       sz = 0;
14839       op = 0;
14840       break;
14841     default:
14842       first_error (_("invalid instruction shape"));
14843       return;
14844     }
14845
14846   switch (mode)
14847     {
14848     case neon_cvt_mode_a: rm = 0; break;
14849     case neon_cvt_mode_n: rm = 1; break;
14850     case neon_cvt_mode_p: rm = 2; break;
14851     case neon_cvt_mode_m: rm = 3; break;
14852     default: first_error (_("invalid rounding mode")); return;
14853     }
14854
14855   NEON_ENCODE (FPV8, inst);
14856   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
14857   encode_arm_vfp_reg (inst.operands[1].reg, sz == 1 ? VFP_REG_Dm : VFP_REG_Sm);
14858   inst.instruction |= sz << 8;
14859   inst.instruction |= op << 7;
14860   inst.instruction |= rm << 16;
14861   inst.instruction |= 0xf0000000;
14862   inst.is_neon = TRUE;
14863 }
14864
14865 static void
14866 do_neon_cvt_1 (enum neon_cvt_mode mode)
14867 {
14868   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
14869     NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
14870   enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
14871
14872   /* PR11109: Handle round-to-zero for VCVT conversions.  */
14873   if (mode == neon_cvt_mode_z
14874       && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
14875       && (flavour == neon_cvt_flavour_s32_f32
14876           || flavour == neon_cvt_flavour_u32_f32
14877           || flavour == neon_cvt_flavour_s32_f64
14878           || flavour == neon_cvt_flavour_u32_f64)
14879       && (rs == NS_FD || rs == NS_FF))
14880     {
14881       do_vfp_nsyn_cvtz ();
14882       return;
14883     }
14884
14885   /* VFP rather than Neon conversions.  */
14886   if (flavour >= neon_cvt_flavour_first_fp)
14887     {
14888       if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
14889         do_vfp_nsyn_cvt (rs, flavour);
14890       else
14891         do_vfp_nsyn_cvt_fpv8 (flavour, mode);
14892
14893       return;
14894     }
14895
14896   switch (rs)
14897     {
14898     case NS_DDI:
14899     case NS_QQI:
14900       {
14901         unsigned immbits;
14902         unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
14903
14904         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14905           return;
14906
14907         /* Fixed-point conversion with #0 immediate is encoded as an
14908            integer conversion.  */
14909         if (inst.operands[2].present && inst.operands[2].imm == 0)
14910           goto int_encode;
14911        immbits = 32 - inst.operands[2].imm;
14912         NEON_ENCODE (IMMED, inst);
14913         if (flavour != neon_cvt_flavour_invalid)
14914           inst.instruction |= enctab[flavour];
14915         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14916         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14917         inst.instruction |= LOW4 (inst.operands[1].reg);
14918         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14919         inst.instruction |= neon_quad (rs) << 6;
14920         inst.instruction |= 1 << 21;
14921         inst.instruction |= immbits << 16;
14922
14923         neon_dp_fixup (&inst);
14924       }
14925       break;
14926
14927     case NS_DD:
14928     case NS_QQ:
14929       if (mode != neon_cvt_mode_x && mode != neon_cvt_mode_z)
14930         {
14931           NEON_ENCODE (FLOAT, inst);
14932           set_it_insn_type (OUTSIDE_IT_INSN);
14933
14934           if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
14935             return;
14936
14937           inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14938           inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14939           inst.instruction |= LOW4 (inst.operands[1].reg);
14940           inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14941           inst.instruction |= neon_quad (rs) << 6;
14942           inst.instruction |= (flavour == neon_cvt_flavour_u32_f32) << 7;
14943           inst.instruction |= mode << 8;
14944           if (thumb_mode)
14945             inst.instruction |= 0xfc000000;
14946           else
14947             inst.instruction |= 0xf0000000;
14948         }
14949       else
14950         {
14951     int_encode:
14952           {
14953             unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
14954
14955             NEON_ENCODE (INTEGER, inst);
14956
14957             if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14958               return;
14959
14960             if (flavour != neon_cvt_flavour_invalid)
14961               inst.instruction |= enctab[flavour];
14962
14963             inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14964             inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14965             inst.instruction |= LOW4 (inst.operands[1].reg);
14966             inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14967             inst.instruction |= neon_quad (rs) << 6;
14968             inst.instruction |= 2 << 18;
14969
14970             neon_dp_fixup (&inst);
14971           }
14972         }
14973       break;
14974
14975     /* Half-precision conversions for Advanced SIMD -- neon.  */
14976     case NS_QD:
14977     case NS_DQ:
14978
14979       if ((rs == NS_DQ)
14980           && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
14981           {
14982             as_bad (_("operand size must match register width"));
14983             break;
14984           }
14985
14986       if ((rs == NS_QD)
14987           && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
14988           {
14989             as_bad (_("operand size must match register width"));
14990             break;
14991           }
14992
14993       if (rs == NS_DQ)
14994         inst.instruction = 0x3b60600;
14995       else
14996         inst.instruction = 0x3b60700;
14997
14998       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14999       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15000       inst.instruction |= LOW4 (inst.operands[1].reg);
15001       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15002       neon_dp_fixup (&inst);
15003       break;
15004
15005     default:
15006       /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
15007       if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
15008         do_vfp_nsyn_cvt (rs, flavour);
15009       else
15010         do_vfp_nsyn_cvt_fpv8 (flavour, mode);
15011     }
15012 }
15013
15014 static void
15015 do_neon_cvtr (void)
15016 {
15017   do_neon_cvt_1 (neon_cvt_mode_x);
15018 }
15019
15020 static void
15021 do_neon_cvt (void)
15022 {
15023   do_neon_cvt_1 (neon_cvt_mode_z);
15024 }
15025
15026 static void
15027 do_neon_cvta (void)
15028 {
15029   do_neon_cvt_1 (neon_cvt_mode_a);
15030 }
15031
15032 static void
15033 do_neon_cvtn (void)
15034 {
15035   do_neon_cvt_1 (neon_cvt_mode_n);
15036 }
15037
15038 static void
15039 do_neon_cvtp (void)
15040 {
15041   do_neon_cvt_1 (neon_cvt_mode_p);
15042 }
15043
15044 static void
15045 do_neon_cvtm (void)
15046 {
15047   do_neon_cvt_1 (neon_cvt_mode_m);
15048 }
15049
15050 static void
15051 do_neon_cvttb_2 (bfd_boolean t, bfd_boolean to, bfd_boolean is_double)
15052 {
15053   if (is_double)
15054     mark_feature_used (&fpu_vfp_ext_armv8);
15055
15056   encode_arm_vfp_reg (inst.operands[0].reg,
15057                       (is_double && !to) ? VFP_REG_Dd : VFP_REG_Sd);
15058   encode_arm_vfp_reg (inst.operands[1].reg,
15059                       (is_double && to) ? VFP_REG_Dm : VFP_REG_Sm);
15060   inst.instruction |= to ? 0x10000 : 0;
15061   inst.instruction |= t ? 0x80 : 0;
15062   inst.instruction |= is_double ? 0x100 : 0;
15063   do_vfp_cond_or_thumb ();
15064 }
15065
15066 static void
15067 do_neon_cvttb_1 (bfd_boolean t)
15068 {
15069   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_DF, NS_NULL);
15070
15071   if (rs == NS_NULL)
15072     return;
15073   else if (neon_check_type (2, rs, N_F16, N_F32 | N_VFP).type != NT_invtype)
15074     {
15075       inst.error = NULL;
15076       do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/FALSE);
15077     }
15078   else if (neon_check_type (2, rs, N_F32 | N_VFP, N_F16).type != NT_invtype)
15079     {
15080       inst.error = NULL;
15081       do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/FALSE);
15082     }
15083   else if (neon_check_type (2, rs, N_F16, N_F64 | N_VFP).type != NT_invtype)
15084     {
15085       inst.error = NULL;
15086       do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/TRUE);
15087     }
15088   else if (neon_check_type (2, rs, N_F64 | N_VFP, N_F16).type != NT_invtype)
15089     {
15090       inst.error = NULL;
15091       do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/TRUE);
15092     }
15093   else
15094     return;
15095 }
15096
15097 static void
15098 do_neon_cvtb (void)
15099 {
15100   do_neon_cvttb_1 (FALSE);
15101 }
15102
15103
15104 static void
15105 do_neon_cvtt (void)
15106 {
15107   do_neon_cvttb_1 (TRUE);
15108 }
15109
15110 static void
15111 neon_move_immediate (void)
15112 {
15113   enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
15114   struct neon_type_el et = neon_check_type (2, rs,
15115     N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
15116   unsigned immlo, immhi = 0, immbits;
15117   int op, cmode, float_p;
15118
15119   constraint (et.type == NT_invtype,
15120               _("operand size must be specified for immediate VMOV"));
15121
15122   /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
15123   op = (inst.instruction & (1 << 5)) != 0;
15124
15125   immlo = inst.operands[1].imm;
15126   if (inst.operands[1].regisimm)
15127     immhi = inst.operands[1].reg;
15128
15129   constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
15130               _("immediate has bits set outside the operand size"));
15131
15132   float_p = inst.operands[1].immisfloat;
15133
15134   if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
15135                                         et.size, et.type)) == FAIL)
15136     {
15137       /* Invert relevant bits only.  */
15138       neon_invert_size (&immlo, &immhi, et.size);
15139       /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
15140          with one or the other; those cases are caught by
15141          neon_cmode_for_move_imm.  */
15142       op = !op;
15143       if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
15144                                             &op, et.size, et.type)) == FAIL)
15145         {
15146           first_error (_("immediate out of range"));
15147           return;
15148         }
15149     }
15150
15151   inst.instruction &= ~(1 << 5);
15152   inst.instruction |= op << 5;
15153
15154   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15155   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15156   inst.instruction |= neon_quad (rs) << 6;
15157   inst.instruction |= cmode << 8;
15158
15159   neon_write_immbits (immbits);
15160 }
15161
15162 static void
15163 do_neon_mvn (void)
15164 {
15165   if (inst.operands[1].isreg)
15166     {
15167       enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15168
15169       NEON_ENCODE (INTEGER, inst);
15170       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15171       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15172       inst.instruction |= LOW4 (inst.operands[1].reg);
15173       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15174       inst.instruction |= neon_quad (rs) << 6;
15175     }
15176   else
15177     {
15178       NEON_ENCODE (IMMED, inst);
15179       neon_move_immediate ();
15180     }
15181
15182   neon_dp_fixup (&inst);
15183 }
15184
15185 /* Encode instructions of form:
15186
15187   |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
15188   |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |  */
15189
15190 static void
15191 neon_mixed_length (struct neon_type_el et, unsigned size)
15192 {
15193   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15194   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15195   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15196   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15197   inst.instruction |= LOW4 (inst.operands[2].reg);
15198   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15199   inst.instruction |= (et.type == NT_unsigned) << 24;
15200   inst.instruction |= neon_logbits (size) << 20;
15201
15202   neon_dp_fixup (&inst);
15203 }
15204
15205 static void
15206 do_neon_dyadic_long (void)
15207 {
15208   /* FIXME: Type checking for lengthening op.  */
15209   struct neon_type_el et = neon_check_type (3, NS_QDD,
15210     N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
15211   neon_mixed_length (et, et.size);
15212 }
15213
15214 static void
15215 do_neon_abal (void)
15216 {
15217   struct neon_type_el et = neon_check_type (3, NS_QDD,
15218     N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
15219   neon_mixed_length (et, et.size);
15220 }
15221
15222 static void
15223 neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
15224 {
15225   if (inst.operands[2].isscalar)
15226     {
15227       struct neon_type_el et = neon_check_type (3, NS_QDS,
15228         N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
15229       NEON_ENCODE (SCALAR, inst);
15230       neon_mul_mac (et, et.type == NT_unsigned);
15231     }
15232   else
15233     {
15234       struct neon_type_el et = neon_check_type (3, NS_QDD,
15235         N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
15236       NEON_ENCODE (INTEGER, inst);
15237       neon_mixed_length (et, et.size);
15238     }
15239 }
15240
15241 static void
15242 do_neon_mac_maybe_scalar_long (void)
15243 {
15244   neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
15245 }
15246
15247 static void
15248 do_neon_dyadic_wide (void)
15249 {
15250   struct neon_type_el et = neon_check_type (3, NS_QQD,
15251     N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
15252   neon_mixed_length (et, et.size);
15253 }
15254
15255 static void
15256 do_neon_dyadic_narrow (void)
15257 {
15258   struct neon_type_el et = neon_check_type (3, NS_QDD,
15259     N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
15260   /* Operand sign is unimportant, and the U bit is part of the opcode,
15261      so force the operand type to integer.  */
15262   et.type = NT_integer;
15263   neon_mixed_length (et, et.size / 2);
15264 }
15265
15266 static void
15267 do_neon_mul_sat_scalar_long (void)
15268 {
15269   neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
15270 }
15271
15272 static void
15273 do_neon_vmull (void)
15274 {
15275   if (inst.operands[2].isscalar)
15276     do_neon_mac_maybe_scalar_long ();
15277   else
15278     {
15279       struct neon_type_el et = neon_check_type (3, NS_QDD,
15280         N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_P64 | N_KEY);
15281
15282       if (et.type == NT_poly)
15283         NEON_ENCODE (POLY, inst);
15284       else
15285         NEON_ENCODE (INTEGER, inst);
15286
15287       /* For polynomial encoding the U bit must be zero, and the size must
15288          be 8 (encoded as 0b00) or, on ARMv8 or later 64 (encoded, non
15289          obviously, as 0b10).  */
15290       if (et.size == 64)
15291         {
15292           /* Check we're on the correct architecture.  */
15293           if (!mark_feature_used (&fpu_crypto_ext_armv8))
15294             inst.error =
15295               _("Instruction form not available on this architecture.");
15296
15297           et.size = 32;
15298         }
15299
15300       neon_mixed_length (et, et.size);
15301     }
15302 }
15303
15304 static void
15305 do_neon_ext (void)
15306 {
15307   enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
15308   struct neon_type_el et = neon_check_type (3, rs,
15309     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
15310   unsigned imm = (inst.operands[3].imm * et.size) / 8;
15311
15312   constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
15313               _("shift out of range"));
15314   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15315   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15316   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15317   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15318   inst.instruction |= LOW4 (inst.operands[2].reg);
15319   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15320   inst.instruction |= neon_quad (rs) << 6;
15321   inst.instruction |= imm << 8;
15322
15323   neon_dp_fixup (&inst);
15324 }
15325
15326 static void
15327 do_neon_rev (void)
15328 {
15329   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15330   struct neon_type_el et = neon_check_type (2, rs,
15331     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15332   unsigned op = (inst.instruction >> 7) & 3;
15333   /* N (width of reversed regions) is encoded as part of the bitmask. We
15334      extract it here to check the elements to be reversed are smaller.
15335      Otherwise we'd get a reserved instruction.  */
15336   unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
15337   gas_assert (elsize != 0);
15338   constraint (et.size >= elsize,
15339               _("elements must be smaller than reversal region"));
15340   neon_two_same (neon_quad (rs), 1, et.size);
15341 }
15342
15343 static void
15344 do_neon_dup (void)
15345 {
15346   if (inst.operands[1].isscalar)
15347     {
15348       enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
15349       struct neon_type_el et = neon_check_type (2, rs,
15350         N_EQK, N_8 | N_16 | N_32 | N_KEY);
15351       unsigned sizebits = et.size >> 3;
15352       unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
15353       int logsize = neon_logbits (et.size);
15354       unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
15355
15356       if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
15357         return;
15358
15359       NEON_ENCODE (SCALAR, inst);
15360       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15361       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15362       inst.instruction |= LOW4 (dm);
15363       inst.instruction |= HI1 (dm) << 5;
15364       inst.instruction |= neon_quad (rs) << 6;
15365       inst.instruction |= x << 17;
15366       inst.instruction |= sizebits << 16;
15367
15368       neon_dp_fixup (&inst);
15369     }
15370   else
15371     {
15372       enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
15373       struct neon_type_el et = neon_check_type (2, rs,
15374         N_8 | N_16 | N_32 | N_KEY, N_EQK);
15375       /* Duplicate ARM register to lanes of vector.  */
15376       NEON_ENCODE (ARMREG, inst);
15377       switch (et.size)
15378         {
15379         case 8:  inst.instruction |= 0x400000; break;
15380         case 16: inst.instruction |= 0x000020; break;
15381         case 32: inst.instruction |= 0x000000; break;
15382         default: break;
15383         }
15384       inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15385       inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
15386       inst.instruction |= HI1 (inst.operands[0].reg) << 7;
15387       inst.instruction |= neon_quad (rs) << 21;
15388       /* The encoding for this instruction is identical for the ARM and Thumb
15389          variants, except for the condition field.  */
15390       do_vfp_cond_or_thumb ();
15391     }
15392 }
15393
15394 /* VMOV has particularly many variations. It can be one of:
15395      0. VMOV<c><q> <Qd>, <Qm>
15396      1. VMOV<c><q> <Dd>, <Dm>
15397    (Register operations, which are VORR with Rm = Rn.)
15398      2. VMOV<c><q>.<dt> <Qd>, #<imm>
15399      3. VMOV<c><q>.<dt> <Dd>, #<imm>
15400    (Immediate loads.)
15401      4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
15402    (ARM register to scalar.)
15403      5. VMOV<c><q> <Dm>, <Rd>, <Rn>
15404    (Two ARM registers to vector.)
15405      6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
15406    (Scalar to ARM register.)
15407      7. VMOV<c><q> <Rd>, <Rn>, <Dm>
15408    (Vector to two ARM registers.)
15409      8. VMOV.F32 <Sd>, <Sm>
15410      9. VMOV.F64 <Dd>, <Dm>
15411    (VFP register moves.)
15412     10. VMOV.F32 <Sd>, #imm
15413     11. VMOV.F64 <Dd>, #imm
15414    (VFP float immediate load.)
15415     12. VMOV <Rd>, <Sm>
15416    (VFP single to ARM reg.)
15417     13. VMOV <Sd>, <Rm>
15418    (ARM reg to VFP single.)
15419     14. VMOV <Rd>, <Re>, <Sn>, <Sm>
15420    (Two ARM regs to two VFP singles.)
15421     15. VMOV <Sd>, <Se>, <Rn>, <Rm>
15422    (Two VFP singles to two ARM regs.)
15423
15424    These cases can be disambiguated using neon_select_shape, except cases 1/9
15425    and 3/11 which depend on the operand type too.
15426
15427    All the encoded bits are hardcoded by this function.
15428
15429    Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
15430    Cases 5, 7 may be used with VFPv2 and above.
15431
15432    FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
15433    can specify a type where it doesn't make sense to, and is ignored).  */
15434
15435 static void
15436 do_neon_mov (void)
15437 {
15438   enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
15439     NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
15440     NS_NULL);
15441   struct neon_type_el et;
15442   const char *ldconst = 0;
15443
15444   switch (rs)
15445     {
15446     case NS_DD:  /* case 1/9.  */
15447       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15448       /* It is not an error here if no type is given.  */
15449       inst.error = NULL;
15450       if (et.type == NT_float && et.size == 64)
15451         {
15452           do_vfp_nsyn_opcode ("fcpyd");
15453           break;
15454         }
15455       /* fall through.  */
15456
15457     case NS_QQ:  /* case 0/1.  */
15458       {
15459         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15460           return;
15461         /* The architecture manual I have doesn't explicitly state which
15462            value the U bit should have for register->register moves, but
15463            the equivalent VORR instruction has U = 0, so do that.  */
15464         inst.instruction = 0x0200110;
15465         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15466         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15467         inst.instruction |= LOW4 (inst.operands[1].reg);
15468         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15469         inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15470         inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15471         inst.instruction |= neon_quad (rs) << 6;
15472
15473         neon_dp_fixup (&inst);
15474       }
15475       break;
15476
15477     case NS_DI:  /* case 3/11.  */
15478       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15479       inst.error = NULL;
15480       if (et.type == NT_float && et.size == 64)
15481         {
15482           /* case 11 (fconstd).  */
15483           ldconst = "fconstd";
15484           goto encode_fconstd;
15485         }
15486       /* fall through.  */
15487
15488     case NS_QI:  /* case 2/3.  */
15489       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15490         return;
15491       inst.instruction = 0x0800010;
15492       neon_move_immediate ();
15493       neon_dp_fixup (&inst);
15494       break;
15495
15496     case NS_SR:  /* case 4.  */
15497       {
15498         unsigned bcdebits = 0;
15499         int logsize;
15500         unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
15501         unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
15502
15503         /* .<size> is optional here, defaulting to .32. */
15504         if (inst.vectype.elems == 0
15505             && inst.operands[0].vectype.type == NT_invtype
15506             && inst.operands[1].vectype.type == NT_invtype)
15507           {
15508             inst.vectype.el[0].type = NT_untyped;
15509             inst.vectype.el[0].size = 32;
15510             inst.vectype.elems = 1;
15511           }
15512
15513         et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
15514         logsize = neon_logbits (et.size);
15515
15516         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15517                     _(BAD_FPU));
15518         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15519                     && et.size != 32, _(BAD_FPU));
15520         constraint (et.type == NT_invtype, _("bad type for scalar"));
15521         constraint (x >= 64 / et.size, _("scalar index out of range"));
15522
15523         switch (et.size)
15524           {
15525           case 8:  bcdebits = 0x8; break;
15526           case 16: bcdebits = 0x1; break;
15527           case 32: bcdebits = 0x0; break;
15528           default: ;
15529           }
15530
15531         bcdebits |= x << logsize;
15532
15533         inst.instruction = 0xe000b10;
15534         do_vfp_cond_or_thumb ();
15535         inst.instruction |= LOW4 (dn) << 16;
15536         inst.instruction |= HI1 (dn) << 7;
15537         inst.instruction |= inst.operands[1].reg << 12;
15538         inst.instruction |= (bcdebits & 3) << 5;
15539         inst.instruction |= (bcdebits >> 2) << 21;
15540       }
15541       break;
15542
15543     case NS_DRR:  /* case 5 (fmdrr).  */
15544       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
15545                   _(BAD_FPU));
15546
15547       inst.instruction = 0xc400b10;
15548       do_vfp_cond_or_thumb ();
15549       inst.instruction |= LOW4 (inst.operands[0].reg);
15550       inst.instruction |= HI1 (inst.operands[0].reg) << 5;
15551       inst.instruction |= inst.operands[1].reg << 12;
15552       inst.instruction |= inst.operands[2].reg << 16;
15553       break;
15554
15555     case NS_RS:  /* case 6.  */
15556       {
15557         unsigned logsize;
15558         unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
15559         unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
15560         unsigned abcdebits = 0;
15561
15562         /* .<dt> is optional here, defaulting to .32. */
15563         if (inst.vectype.elems == 0
15564             && inst.operands[0].vectype.type == NT_invtype
15565             && inst.operands[1].vectype.type == NT_invtype)
15566           {
15567             inst.vectype.el[0].type = NT_untyped;
15568             inst.vectype.el[0].size = 32;
15569             inst.vectype.elems = 1;
15570           }
15571
15572         et = neon_check_type (2, NS_NULL,
15573                               N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
15574         logsize = neon_logbits (et.size);
15575
15576         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15577                     _(BAD_FPU));
15578         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15579                     && et.size != 32, _(BAD_FPU));
15580         constraint (et.type == NT_invtype, _("bad type for scalar"));
15581         constraint (x >= 64 / et.size, _("scalar index out of range"));
15582
15583         switch (et.size)
15584           {
15585           case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
15586           case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
15587           case 32: abcdebits = 0x00; break;
15588           default: ;
15589           }
15590
15591         abcdebits |= x << logsize;
15592         inst.instruction = 0xe100b10;
15593         do_vfp_cond_or_thumb ();
15594         inst.instruction |= LOW4 (dn) << 16;
15595         inst.instruction |= HI1 (dn) << 7;
15596         inst.instruction |= inst.operands[0].reg << 12;
15597         inst.instruction |= (abcdebits & 3) << 5;
15598         inst.instruction |= (abcdebits >> 2) << 21;
15599       }
15600       break;
15601
15602     case NS_RRD:  /* case 7 (fmrrd).  */
15603       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
15604                   _(BAD_FPU));
15605
15606       inst.instruction = 0xc500b10;
15607       do_vfp_cond_or_thumb ();
15608       inst.instruction |= inst.operands[0].reg << 12;
15609       inst.instruction |= inst.operands[1].reg << 16;
15610       inst.instruction |= LOW4 (inst.operands[2].reg);
15611       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15612       break;
15613
15614     case NS_FF:  /* case 8 (fcpys).  */
15615       do_vfp_nsyn_opcode ("fcpys");
15616       break;
15617
15618     case NS_FI:  /* case 10 (fconsts).  */
15619       ldconst = "fconsts";
15620       encode_fconstd:
15621       if (is_quarter_float (inst.operands[1].imm))
15622         {
15623           inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
15624           do_vfp_nsyn_opcode (ldconst);
15625         }
15626       else
15627         first_error (_("immediate out of range"));
15628       break;
15629
15630     case NS_RF:  /* case 12 (fmrs).  */
15631       do_vfp_nsyn_opcode ("fmrs");
15632       break;
15633
15634     case NS_FR:  /* case 13 (fmsr).  */
15635       do_vfp_nsyn_opcode ("fmsr");
15636       break;
15637
15638     /* The encoders for the fmrrs and fmsrr instructions expect three operands
15639        (one of which is a list), but we have parsed four.  Do some fiddling to
15640        make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
15641        expect.  */
15642     case NS_RRFF:  /* case 14 (fmrrs).  */
15643       constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
15644                   _("VFP registers must be adjacent"));
15645       inst.operands[2].imm = 2;
15646       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15647       do_vfp_nsyn_opcode ("fmrrs");
15648       break;
15649
15650     case NS_FFRR:  /* case 15 (fmsrr).  */
15651       constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
15652                   _("VFP registers must be adjacent"));
15653       inst.operands[1] = inst.operands[2];
15654       inst.operands[2] = inst.operands[3];
15655       inst.operands[0].imm = 2;
15656       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15657       do_vfp_nsyn_opcode ("fmsrr");
15658       break;
15659
15660     case NS_NULL:
15661       /* neon_select_shape has determined that the instruction
15662          shape is wrong and has already set the error message.  */
15663       break;
15664
15665     default:
15666       abort ();
15667     }
15668 }
15669
15670 static void
15671 do_neon_rshift_round_imm (void)
15672 {
15673   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
15674   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
15675   int imm = inst.operands[2].imm;
15676
15677   /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
15678   if (imm == 0)
15679     {
15680       inst.operands[2].present = 0;
15681       do_neon_mov ();
15682       return;
15683     }
15684
15685   constraint (imm < 1 || (unsigned)imm > et.size,
15686               _("immediate out of range for shift"));
15687   neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
15688                   et.size - imm);
15689 }
15690
15691 static void
15692 do_neon_movl (void)
15693 {
15694   struct neon_type_el et = neon_check_type (2, NS_QD,
15695     N_EQK | N_DBL, N_SU_32 | N_KEY);
15696   unsigned sizebits = et.size >> 3;
15697   inst.instruction |= sizebits << 19;
15698   neon_two_same (0, et.type == NT_unsigned, -1);
15699 }
15700
15701 static void
15702 do_neon_trn (void)
15703 {
15704   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15705   struct neon_type_el et = neon_check_type (2, rs,
15706     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15707   NEON_ENCODE (INTEGER, inst);
15708   neon_two_same (neon_quad (rs), 1, et.size);
15709 }
15710
15711 static void
15712 do_neon_zip_uzp (void)
15713 {
15714   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15715   struct neon_type_el et = neon_check_type (2, rs,
15716     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15717   if (rs == NS_DD && et.size == 32)
15718     {
15719       /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
15720       inst.instruction = N_MNEM_vtrn;
15721       do_neon_trn ();
15722       return;
15723     }
15724   neon_two_same (neon_quad (rs), 1, et.size);
15725 }
15726
15727 static void
15728 do_neon_sat_abs_neg (void)
15729 {
15730   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15731   struct neon_type_el et = neon_check_type (2, rs,
15732     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15733   neon_two_same (neon_quad (rs), 1, et.size);
15734 }
15735
15736 static void
15737 do_neon_pair_long (void)
15738 {
15739   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15740   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
15741   /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
15742   inst.instruction |= (et.type == NT_unsigned) << 7;
15743   neon_two_same (neon_quad (rs), 1, et.size);
15744 }
15745
15746 static void
15747 do_neon_recip_est (void)
15748 {
15749   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15750   struct neon_type_el et = neon_check_type (2, rs,
15751     N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
15752   inst.instruction |= (et.type == NT_float) << 8;
15753   neon_two_same (neon_quad (rs), 1, et.size);
15754 }
15755
15756 static void
15757 do_neon_cls (void)
15758 {
15759   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15760   struct neon_type_el et = neon_check_type (2, rs,
15761     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15762   neon_two_same (neon_quad (rs), 1, et.size);
15763 }
15764
15765 static void
15766 do_neon_clz (void)
15767 {
15768   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15769   struct neon_type_el et = neon_check_type (2, rs,
15770     N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
15771   neon_two_same (neon_quad (rs), 1, et.size);
15772 }
15773
15774 static void
15775 do_neon_cnt (void)
15776 {
15777   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15778   struct neon_type_el et = neon_check_type (2, rs,
15779     N_EQK | N_INT, N_8 | N_KEY);
15780   neon_two_same (neon_quad (rs), 1, et.size);
15781 }
15782
15783 static void
15784 do_neon_swp (void)
15785 {
15786   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15787   neon_two_same (neon_quad (rs), 1, -1);
15788 }
15789
15790 static void
15791 do_neon_tbl_tbx (void)
15792 {
15793   unsigned listlenbits;
15794   neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
15795
15796   if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
15797     {
15798       first_error (_("bad list length for table lookup"));
15799       return;
15800     }
15801
15802   listlenbits = inst.operands[1].imm - 1;
15803   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15804   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15805   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15806   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15807   inst.instruction |= LOW4 (inst.operands[2].reg);
15808   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15809   inst.instruction |= listlenbits << 8;
15810
15811   neon_dp_fixup (&inst);
15812 }
15813
15814 static void
15815 do_neon_ldm_stm (void)
15816 {
15817   /* P, U and L bits are part of bitmask.  */
15818   int is_dbmode = (inst.instruction & (1 << 24)) != 0;
15819   unsigned offsetbits = inst.operands[1].imm * 2;
15820
15821   if (inst.operands[1].issingle)
15822     {
15823       do_vfp_nsyn_ldm_stm (is_dbmode);
15824       return;
15825     }
15826
15827   constraint (is_dbmode && !inst.operands[0].writeback,
15828               _("writeback (!) must be used for VLDMDB and VSTMDB"));
15829
15830   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
15831               _("register list must contain at least 1 and at most 16 "
15832                 "registers"));
15833
15834   inst.instruction |= inst.operands[0].reg << 16;
15835   inst.instruction |= inst.operands[0].writeback << 21;
15836   inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15837   inst.instruction |= HI1 (inst.operands[1].reg) << 22;
15838
15839   inst.instruction |= offsetbits;
15840
15841   do_vfp_cond_or_thumb ();
15842 }
15843
15844 static void
15845 do_neon_ldr_str (void)
15846 {
15847   int is_ldr = (inst.instruction & (1 << 20)) != 0;
15848
15849   /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
15850      And is UNPREDICTABLE in thumb mode.  */
15851   if (!is_ldr
15852       && inst.operands[1].reg == REG_PC
15853       && (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7) || thumb_mode))
15854     {
15855       if (thumb_mode)
15856         inst.error = _("Use of PC here is UNPREDICTABLE");
15857       else if (warn_on_deprecated)
15858         as_warn (_("Use of PC here is deprecated"));
15859     }
15860
15861   if (inst.operands[0].issingle)
15862     {
15863       if (is_ldr)
15864         do_vfp_nsyn_opcode ("flds");
15865       else
15866         do_vfp_nsyn_opcode ("fsts");
15867     }
15868   else
15869     {
15870       if (is_ldr)
15871         do_vfp_nsyn_opcode ("fldd");
15872       else
15873         do_vfp_nsyn_opcode ("fstd");
15874     }
15875 }
15876
15877 /* "interleave" version also handles non-interleaving register VLD1/VST1
15878    instructions.  */
15879
15880 static void
15881 do_neon_ld_st_interleave (void)
15882 {
15883   struct neon_type_el et = neon_check_type (1, NS_NULL,
15884                                             N_8 | N_16 | N_32 | N_64);
15885   unsigned alignbits = 0;
15886   unsigned idx;
15887   /* The bits in this table go:
15888      0: register stride of one (0) or two (1)
15889      1,2: register list length, minus one (1, 2, 3, 4).
15890      3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
15891      We use -1 for invalid entries.  */
15892   const int typetable[] =
15893     {
15894       0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
15895        -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
15896        -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
15897        -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
15898     };
15899   int typebits;
15900
15901   if (et.type == NT_invtype)
15902     return;
15903
15904   if (inst.operands[1].immisalign)
15905     switch (inst.operands[1].imm >> 8)
15906       {
15907       case 64: alignbits = 1; break;
15908       case 128:
15909         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
15910             && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15911           goto bad_alignment;
15912         alignbits = 2;
15913         break;
15914       case 256:
15915         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15916           goto bad_alignment;
15917         alignbits = 3;
15918         break;
15919       default:
15920       bad_alignment:
15921         first_error (_("bad alignment"));
15922         return;
15923       }
15924
15925   inst.instruction |= alignbits << 4;
15926   inst.instruction |= neon_logbits (et.size) << 6;
15927
15928   /* Bits [4:6] of the immediate in a list specifier encode register stride
15929      (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
15930      VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
15931      up the right value for "type" in a table based on this value and the given
15932      list style, then stick it back.  */
15933   idx = ((inst.operands[0].imm >> 4) & 7)
15934         | (((inst.instruction >> 8) & 3) << 3);
15935
15936   typebits = typetable[idx];
15937
15938   constraint (typebits == -1, _("bad list type for instruction"));
15939   constraint (((inst.instruction >> 8) & 3) && et.size == 64,
15940               _("bad element type for instruction"));
15941
15942   inst.instruction &= ~0xf00;
15943   inst.instruction |= typebits << 8;
15944 }
15945
15946 /* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
15947    *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
15948    otherwise. The variable arguments are a list of pairs of legal (size, align)
15949    values, terminated with -1.  */
15950
15951 static int
15952 neon_alignment_bit (int size, int align, int *do_align, ...)
15953 {
15954   va_list ap;
15955   int result = FAIL, thissize, thisalign;
15956
15957   if (!inst.operands[1].immisalign)
15958     {
15959       *do_align = 0;
15960       return SUCCESS;
15961     }
15962
15963   va_start (ap, do_align);
15964
15965   do
15966     {
15967       thissize = va_arg (ap, int);
15968       if (thissize == -1)
15969         break;
15970       thisalign = va_arg (ap, int);
15971
15972       if (size == thissize && align == thisalign)
15973         result = SUCCESS;
15974     }
15975   while (result != SUCCESS);
15976
15977   va_end (ap);
15978
15979   if (result == SUCCESS)
15980     *do_align = 1;
15981   else
15982     first_error (_("unsupported alignment for instruction"));
15983
15984   return result;
15985 }
15986
15987 static void
15988 do_neon_ld_st_lane (void)
15989 {
15990   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15991   int align_good, do_align = 0;
15992   int logsize = neon_logbits (et.size);
15993   int align = inst.operands[1].imm >> 8;
15994   int n = (inst.instruction >> 8) & 3;
15995   int max_el = 64 / et.size;
15996
15997   if (et.type == NT_invtype)
15998     return;
15999
16000   constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
16001               _("bad list length"));
16002   constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
16003               _("scalar index out of range"));
16004   constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
16005               && et.size == 8,
16006               _("stride of 2 unavailable when element size is 8"));
16007
16008   switch (n)
16009     {
16010     case 0:  /* VLD1 / VST1.  */
16011       align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
16012                                        32, 32, -1);
16013       if (align_good == FAIL)
16014         return;
16015       if (do_align)
16016         {
16017           unsigned alignbits = 0;
16018           switch (et.size)
16019             {
16020             case 16: alignbits = 0x1; break;
16021             case 32: alignbits = 0x3; break;
16022             default: ;
16023             }
16024           inst.instruction |= alignbits << 4;
16025         }
16026       break;
16027
16028     case 1:  /* VLD2 / VST2.  */
16029       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
16030                                        32, 64, -1);
16031       if (align_good == FAIL)
16032         return;
16033       if (do_align)
16034         inst.instruction |= 1 << 4;
16035       break;
16036
16037     case 2:  /* VLD3 / VST3.  */
16038       constraint (inst.operands[1].immisalign,
16039                   _("can't use alignment with this instruction"));
16040       break;
16041
16042     case 3:  /* VLD4 / VST4.  */
16043       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
16044                                        16, 64, 32, 64, 32, 128, -1);
16045       if (align_good == FAIL)
16046         return;
16047       if (do_align)
16048         {
16049           unsigned alignbits = 0;
16050           switch (et.size)
16051             {
16052             case 8:  alignbits = 0x1; break;
16053             case 16: alignbits = 0x1; break;
16054             case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
16055             default: ;
16056             }
16057           inst.instruction |= alignbits << 4;
16058         }
16059       break;
16060
16061     default: ;
16062     }
16063
16064   /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
16065   if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
16066     inst.instruction |= 1 << (4 + logsize);
16067
16068   inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
16069   inst.instruction |= logsize << 10;
16070 }
16071
16072 /* Encode single n-element structure to all lanes VLD<n> instructions.  */
16073
16074 static void
16075 do_neon_ld_dup (void)
16076 {
16077   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
16078   int align_good, do_align = 0;
16079
16080   if (et.type == NT_invtype)
16081     return;
16082
16083   switch ((inst.instruction >> 8) & 3)
16084     {
16085     case 0:  /* VLD1.  */
16086       gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
16087       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
16088                                        &do_align, 16, 16, 32, 32, -1);
16089       if (align_good == FAIL)
16090         return;
16091       switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
16092         {
16093         case 1: break;
16094         case 2: inst.instruction |= 1 << 5; break;
16095         default: first_error (_("bad list length")); return;
16096         }
16097       inst.instruction |= neon_logbits (et.size) << 6;
16098       break;
16099
16100     case 1:  /* VLD2.  */
16101       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
16102                                        &do_align, 8, 16, 16, 32, 32, 64, -1);
16103       if (align_good == FAIL)
16104         return;
16105       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
16106                   _("bad list length"));
16107       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
16108         inst.instruction |= 1 << 5;
16109       inst.instruction |= neon_logbits (et.size) << 6;
16110       break;
16111
16112     case 2:  /* VLD3.  */
16113       constraint (inst.operands[1].immisalign,
16114                   _("can't use alignment with this instruction"));
16115       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
16116                   _("bad list length"));
16117       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
16118         inst.instruction |= 1 << 5;
16119       inst.instruction |= neon_logbits (et.size) << 6;
16120       break;
16121
16122     case 3:  /* VLD4.  */
16123       {
16124         int align = inst.operands[1].imm >> 8;
16125         align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
16126                                          16, 64, 32, 64, 32, 128, -1);
16127         if (align_good == FAIL)
16128           return;
16129         constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
16130                     _("bad list length"));
16131         if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
16132           inst.instruction |= 1 << 5;
16133         if (et.size == 32 && align == 128)
16134           inst.instruction |= 0x3 << 6;
16135         else
16136           inst.instruction |= neon_logbits (et.size) << 6;
16137       }
16138       break;
16139
16140     default: ;
16141     }
16142
16143   inst.instruction |= do_align << 4;
16144 }
16145
16146 /* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
16147    apart from bits [11:4].  */
16148
16149 static void
16150 do_neon_ldx_stx (void)
16151 {
16152   if (inst.operands[1].isreg)
16153     constraint (inst.operands[1].reg == REG_PC, BAD_PC);
16154
16155   switch (NEON_LANE (inst.operands[0].imm))
16156     {
16157     case NEON_INTERLEAVE_LANES:
16158       NEON_ENCODE (INTERLV, inst);
16159       do_neon_ld_st_interleave ();
16160       break;
16161
16162     case NEON_ALL_LANES:
16163       NEON_ENCODE (DUP, inst);
16164       if (inst.instruction == N_INV)
16165         {
16166           first_error ("only loads support such operands");
16167           break;
16168         }
16169       do_neon_ld_dup ();
16170       break;
16171
16172     default:
16173       NEON_ENCODE (LANE, inst);
16174       do_neon_ld_st_lane ();
16175     }
16176
16177   /* L bit comes from bit mask.  */
16178   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16179   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16180   inst.instruction |= inst.operands[1].reg << 16;
16181
16182   if (inst.operands[1].postind)
16183     {
16184       int postreg = inst.operands[1].imm & 0xf;
16185       constraint (!inst.operands[1].immisreg,
16186                   _("post-index must be a register"));
16187       constraint (postreg == 0xd || postreg == 0xf,
16188                   _("bad register for post-index"));
16189       inst.instruction |= postreg;
16190     }
16191   else
16192     {
16193       constraint (inst.operands[1].immisreg, BAD_ADDR_MODE);
16194       constraint (inst.reloc.exp.X_op != O_constant
16195                   || inst.reloc.exp.X_add_number != 0,
16196                   BAD_ADDR_MODE);
16197
16198       if (inst.operands[1].writeback)
16199         {
16200           inst.instruction |= 0xd;
16201         }
16202       else
16203         inst.instruction |= 0xf;
16204     }
16205
16206   if (thumb_mode)
16207     inst.instruction |= 0xf9000000;
16208   else
16209     inst.instruction |= 0xf4000000;
16210 }
16211
16212 /* FP v8.  */
16213 static void
16214 do_vfp_nsyn_fpv8 (enum neon_shape rs)
16215 {
16216   NEON_ENCODE (FPV8, inst);
16217
16218   if (rs == NS_FFF)
16219     do_vfp_sp_dyadic ();
16220   else
16221     do_vfp_dp_rd_rn_rm ();
16222
16223   if (rs == NS_DDD)
16224     inst.instruction |= 0x100;
16225
16226   inst.instruction |= 0xf0000000;
16227 }
16228
16229 static void
16230 do_vsel (void)
16231 {
16232   set_it_insn_type (OUTSIDE_IT_INSN);
16233
16234   if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) != SUCCESS)
16235     first_error (_("invalid instruction shape"));
16236 }
16237
16238 static void
16239 do_vmaxnm (void)
16240 {
16241   set_it_insn_type (OUTSIDE_IT_INSN);
16242
16243   if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) == SUCCESS)
16244     return;
16245
16246   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
16247     return;
16248
16249   neon_dyadic_misc (NT_untyped, N_F32, 0);
16250 }
16251
16252 static void
16253 do_vrint_1 (enum neon_cvt_mode mode)
16254 {
16255   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_QQ, NS_NULL);
16256   struct neon_type_el et;
16257
16258   if (rs == NS_NULL)
16259     return;
16260
16261   et = neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
16262   if (et.type != NT_invtype)
16263     {
16264       /* VFP encodings.  */
16265       if (mode == neon_cvt_mode_a || mode == neon_cvt_mode_n
16266           || mode == neon_cvt_mode_p || mode == neon_cvt_mode_m)
16267         set_it_insn_type (OUTSIDE_IT_INSN);
16268
16269       NEON_ENCODE (FPV8, inst);
16270       if (rs == NS_FF)
16271         do_vfp_sp_monadic ();
16272       else
16273         do_vfp_dp_rd_rm ();
16274
16275       switch (mode)
16276         {
16277         case neon_cvt_mode_r: inst.instruction |= 0x00000000; break;
16278         case neon_cvt_mode_z: inst.instruction |= 0x00000080; break;
16279         case neon_cvt_mode_x: inst.instruction |= 0x00010000; break;
16280         case neon_cvt_mode_a: inst.instruction |= 0xf0000000; break;
16281         case neon_cvt_mode_n: inst.instruction |= 0xf0010000; break;
16282         case neon_cvt_mode_p: inst.instruction |= 0xf0020000; break;
16283         case neon_cvt_mode_m: inst.instruction |= 0xf0030000; break;
16284         default: abort ();
16285         }
16286
16287       inst.instruction |= (rs == NS_DD) << 8;
16288       do_vfp_cond_or_thumb ();
16289     }
16290   else
16291     {
16292       /* Neon encodings (or something broken...).  */
16293       inst.error = NULL;
16294       et = neon_check_type (2, rs, N_EQK, N_F32 | N_KEY);
16295
16296       if (et.type == NT_invtype)
16297         return;
16298
16299       set_it_insn_type (OUTSIDE_IT_INSN);
16300       NEON_ENCODE (FLOAT, inst);
16301
16302       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
16303         return;
16304
16305       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16306       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16307       inst.instruction |= LOW4 (inst.operands[1].reg);
16308       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16309       inst.instruction |= neon_quad (rs) << 6;
16310       switch (mode)
16311         {
16312         case neon_cvt_mode_z: inst.instruction |= 3 << 7; break;
16313         case neon_cvt_mode_x: inst.instruction |= 1 << 7; break;
16314         case neon_cvt_mode_a: inst.instruction |= 2 << 7; break;
16315         case neon_cvt_mode_n: inst.instruction |= 0 << 7; break;
16316         case neon_cvt_mode_p: inst.instruction |= 7 << 7; break;
16317         case neon_cvt_mode_m: inst.instruction |= 5 << 7; break;
16318         case neon_cvt_mode_r: inst.error = _("invalid rounding mode"); break;
16319         default: abort ();
16320         }
16321
16322       if (thumb_mode)
16323         inst.instruction |= 0xfc000000;
16324       else
16325         inst.instruction |= 0xf0000000;
16326     }
16327 }
16328
16329 static void
16330 do_vrintx (void)
16331 {
16332   do_vrint_1 (neon_cvt_mode_x);
16333 }
16334
16335 static void
16336 do_vrintz (void)
16337 {
16338   do_vrint_1 (neon_cvt_mode_z);
16339 }
16340
16341 static void
16342 do_vrintr (void)
16343 {
16344   do_vrint_1 (neon_cvt_mode_r);
16345 }
16346
16347 static void
16348 do_vrinta (void)
16349 {
16350   do_vrint_1 (neon_cvt_mode_a);
16351 }
16352
16353 static void
16354 do_vrintn (void)
16355 {
16356   do_vrint_1 (neon_cvt_mode_n);
16357 }
16358
16359 static void
16360 do_vrintp (void)
16361 {
16362   do_vrint_1 (neon_cvt_mode_p);
16363 }
16364
16365 static void
16366 do_vrintm (void)
16367 {
16368   do_vrint_1 (neon_cvt_mode_m);
16369 }
16370
16371 /* Crypto v1 instructions.  */
16372 static void
16373 do_crypto_2op_1 (unsigned elttype, int op)
16374 {
16375   set_it_insn_type (OUTSIDE_IT_INSN);
16376
16377   if (neon_check_type (2, NS_QQ, N_EQK | N_UNT, elttype | N_UNT | N_KEY).type
16378       == NT_invtype)
16379     return;
16380
16381   inst.error = NULL;
16382
16383   NEON_ENCODE (INTEGER, inst);
16384   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16385   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16386   inst.instruction |= LOW4 (inst.operands[1].reg);
16387   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16388   if (op != -1)
16389     inst.instruction |= op << 6;
16390
16391   if (thumb_mode)
16392     inst.instruction |= 0xfc000000;
16393   else
16394     inst.instruction |= 0xf0000000;
16395 }
16396
16397 static void
16398 do_crypto_3op_1 (int u, int op)
16399 {
16400   set_it_insn_type (OUTSIDE_IT_INSN);
16401
16402   if (neon_check_type (3, NS_QQQ, N_EQK | N_UNT, N_EQK | N_UNT,
16403                        N_32 | N_UNT | N_KEY).type == NT_invtype)
16404     return;
16405
16406   inst.error = NULL;
16407
16408   NEON_ENCODE (INTEGER, inst);
16409   neon_three_same (1, u, 8 << op);
16410 }
16411
16412 static void
16413 do_aese (void)
16414 {
16415   do_crypto_2op_1 (N_8, 0);
16416 }
16417
16418 static void
16419 do_aesd (void)
16420 {
16421   do_crypto_2op_1 (N_8, 1);
16422 }
16423
16424 static void
16425 do_aesmc (void)
16426 {
16427   do_crypto_2op_1 (N_8, 2);
16428 }
16429
16430 static void
16431 do_aesimc (void)
16432 {
16433   do_crypto_2op_1 (N_8, 3);
16434 }
16435
16436 static void
16437 do_sha1c (void)
16438 {
16439   do_crypto_3op_1 (0, 0);
16440 }
16441
16442 static void
16443 do_sha1p (void)
16444 {
16445   do_crypto_3op_1 (0, 1);
16446 }
16447
16448 static void
16449 do_sha1m (void)
16450 {
16451   do_crypto_3op_1 (0, 2);
16452 }
16453
16454 static void
16455 do_sha1su0 (void)
16456 {
16457   do_crypto_3op_1 (0, 3);
16458 }
16459
16460 static void
16461 do_sha256h (void)
16462 {
16463   do_crypto_3op_1 (1, 0);
16464 }
16465
16466 static void
16467 do_sha256h2 (void)
16468 {
16469   do_crypto_3op_1 (1, 1);
16470 }
16471
16472 static void
16473 do_sha256su1 (void)
16474 {
16475   do_crypto_3op_1 (1, 2);
16476 }
16477
16478 static void
16479 do_sha1h (void)
16480 {
16481   do_crypto_2op_1 (N_32, -1);
16482 }
16483
16484 static void
16485 do_sha1su1 (void)
16486 {
16487   do_crypto_2op_1 (N_32, 0);
16488 }
16489
16490 static void
16491 do_sha256su0 (void)
16492 {
16493   do_crypto_2op_1 (N_32, 1);
16494 }
16495
16496 static void
16497 do_crc32_1 (unsigned int poly, unsigned int sz)
16498 {
16499   unsigned int Rd = inst.operands[0].reg;
16500   unsigned int Rn = inst.operands[1].reg;
16501   unsigned int Rm = inst.operands[2].reg;
16502
16503   set_it_insn_type (OUTSIDE_IT_INSN);
16504   inst.instruction |= LOW4 (Rd) << (thumb_mode ? 8 : 12);
16505   inst.instruction |= LOW4 (Rn) << 16;
16506   inst.instruction |= LOW4 (Rm);
16507   inst.instruction |= sz << (thumb_mode ? 4 : 21);
16508   inst.instruction |= poly << (thumb_mode ? 20 : 9);
16509
16510   if (Rd == REG_PC || Rn == REG_PC || Rm == REG_PC)
16511     as_warn (UNPRED_REG ("r15"));
16512   if (thumb_mode && (Rd == REG_SP || Rn == REG_SP || Rm == REG_SP))
16513     as_warn (UNPRED_REG ("r13"));
16514 }
16515
16516 static void
16517 do_crc32b (void)
16518 {
16519   do_crc32_1 (0, 0);
16520 }
16521
16522 static void
16523 do_crc32h (void)
16524 {
16525   do_crc32_1 (0, 1);
16526 }
16527
16528 static void
16529 do_crc32w (void)
16530 {
16531   do_crc32_1 (0, 2);
16532 }
16533
16534 static void
16535 do_crc32cb (void)
16536 {
16537   do_crc32_1 (1, 0);
16538 }
16539
16540 static void
16541 do_crc32ch (void)
16542 {
16543   do_crc32_1 (1, 1);
16544 }
16545
16546 static void
16547 do_crc32cw (void)
16548 {
16549   do_crc32_1 (1, 2);
16550 }
16551
16552 \f
16553 /* Overall per-instruction processing.  */
16554
16555 /* We need to be able to fix up arbitrary expressions in some statements.
16556    This is so that we can handle symbols that are an arbitrary distance from
16557    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
16558    which returns part of an address in a form which will be valid for
16559    a data instruction.  We do this by pushing the expression into a symbol
16560    in the expr_section, and creating a fix for that.  */
16561
16562 static void
16563 fix_new_arm (fragS *       frag,
16564              int           where,
16565              short int     size,
16566              expressionS * exp,
16567              int           pc_rel,
16568              int           reloc)
16569 {
16570   fixS *           new_fix;
16571
16572   switch (exp->X_op)
16573     {
16574     case O_constant:
16575       if (pc_rel)
16576         {
16577           /* Create an absolute valued symbol, so we have something to
16578              refer to in the object file.  Unfortunately for us, gas's
16579              generic expression parsing will already have folded out
16580              any use of .set foo/.type foo %function that may have
16581              been used to set type information of the target location,
16582              that's being specified symbolically.  We have to presume
16583              the user knows what they are doing.  */
16584           char name[16 + 8];
16585           symbolS *symbol;
16586
16587           sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
16588
16589           symbol = symbol_find_or_make (name);
16590           S_SET_SEGMENT (symbol, absolute_section);
16591           symbol_set_frag (symbol, &zero_address_frag);
16592           S_SET_VALUE (symbol, exp->X_add_number);
16593           exp->X_op = O_symbol;
16594           exp->X_add_symbol = symbol;
16595           exp->X_add_number = 0;
16596         }
16597       /* FALLTHROUGH */
16598     case O_symbol:
16599     case O_add:
16600     case O_subtract:
16601       new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
16602                              (enum bfd_reloc_code_real) reloc);
16603       break;
16604
16605     default:
16606       new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
16607                                   pc_rel, (enum bfd_reloc_code_real) reloc);
16608       break;
16609     }
16610
16611   /* Mark whether the fix is to a THUMB instruction, or an ARM
16612      instruction.  */
16613   new_fix->tc_fix_data = thumb_mode;
16614 }
16615
16616 /* Create a frg for an instruction requiring relaxation.  */
16617 static void
16618 output_relax_insn (void)
16619 {
16620   char * to;
16621   symbolS *sym;
16622   int offset;
16623
16624   /* The size of the instruction is unknown, so tie the debug info to the
16625      start of the instruction.  */
16626   dwarf2_emit_insn (0);
16627
16628   switch (inst.reloc.exp.X_op)
16629     {
16630     case O_symbol:
16631       sym = inst.reloc.exp.X_add_symbol;
16632       offset = inst.reloc.exp.X_add_number;
16633       break;
16634     case O_constant:
16635       sym = NULL;
16636       offset = inst.reloc.exp.X_add_number;
16637       break;
16638     default:
16639       sym = make_expr_symbol (&inst.reloc.exp);
16640       offset = 0;
16641       break;
16642   }
16643   to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
16644                  inst.relax, sym, offset, NULL/*offset, opcode*/);
16645   md_number_to_chars (to, inst.instruction, THUMB_SIZE);
16646 }
16647
16648 /* Write a 32-bit thumb instruction to buf.  */
16649 static void
16650 put_thumb32_insn (char * buf, unsigned long insn)
16651 {
16652   md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
16653   md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
16654 }
16655
16656 static void
16657 output_inst (const char * str)
16658 {
16659   char * to = NULL;
16660
16661   if (inst.error)
16662     {
16663       as_bad ("%s -- `%s'", inst.error, str);
16664       return;
16665     }
16666   if (inst.relax)
16667     {
16668       output_relax_insn ();
16669       return;
16670     }
16671   if (inst.size == 0)
16672     return;
16673
16674   to = frag_more (inst.size);
16675   /* PR 9814: Record the thumb mode into the current frag so that we know
16676      what type of NOP padding to use, if necessary.  We override any previous
16677      setting so that if the mode has changed then the NOPS that we use will
16678      match the encoding of the last instruction in the frag.  */
16679   frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
16680
16681   if (thumb_mode && (inst.size > THUMB_SIZE))
16682     {
16683       gas_assert (inst.size == (2 * THUMB_SIZE));
16684       put_thumb32_insn (to, inst.instruction);
16685     }
16686   else if (inst.size > INSN_SIZE)
16687     {
16688       gas_assert (inst.size == (2 * INSN_SIZE));
16689       md_number_to_chars (to, inst.instruction, INSN_SIZE);
16690       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
16691     }
16692   else
16693     md_number_to_chars (to, inst.instruction, inst.size);
16694
16695   if (inst.reloc.type != BFD_RELOC_UNUSED)
16696     fix_new_arm (frag_now, to - frag_now->fr_literal,
16697                  inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
16698                  inst.reloc.type);
16699
16700   dwarf2_emit_insn (inst.size);
16701 }
16702
16703 static char *
16704 output_it_inst (int cond, int mask, char * to)
16705 {
16706   unsigned long instruction = 0xbf00;
16707
16708   mask &= 0xf;
16709   instruction |= mask;
16710   instruction |= cond << 4;
16711
16712   if (to == NULL)
16713     {
16714       to = frag_more (2);
16715 #ifdef OBJ_ELF
16716       dwarf2_emit_insn (2);
16717 #endif
16718     }
16719
16720   md_number_to_chars (to, instruction, 2);
16721
16722   return to;
16723 }
16724
16725 /* Tag values used in struct asm_opcode's tag field.  */
16726 enum opcode_tag
16727 {
16728   OT_unconditional,     /* Instruction cannot be conditionalized.
16729                            The ARM condition field is still 0xE.  */
16730   OT_unconditionalF,    /* Instruction cannot be conditionalized
16731                            and carries 0xF in its ARM condition field.  */
16732   OT_csuffix,           /* Instruction takes a conditional suffix.  */
16733   OT_csuffixF,          /* Some forms of the instruction take a conditional
16734                            suffix, others place 0xF where the condition field
16735                            would be.  */
16736   OT_cinfix3,           /* Instruction takes a conditional infix,
16737                            beginning at character index 3.  (In
16738                            unified mode, it becomes a suffix.)  */
16739   OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
16740                             tsts, cmps, cmns, and teqs. */
16741   OT_cinfix3_legacy,    /* Legacy instruction takes a conditional infix at
16742                            character index 3, even in unified mode.  Used for
16743                            legacy instructions where suffix and infix forms
16744                            may be ambiguous.  */
16745   OT_csuf_or_in3,       /* Instruction takes either a conditional
16746                            suffix or an infix at character index 3.  */
16747   OT_odd_infix_unc,     /* This is the unconditional variant of an
16748                            instruction that takes a conditional infix
16749                            at an unusual position.  In unified mode,
16750                            this variant will accept a suffix.  */
16751   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
16752                            are the conditional variants of instructions that
16753                            take conditional infixes in unusual positions.
16754                            The infix appears at character index
16755                            (tag - OT_odd_infix_0).  These are not accepted
16756                            in unified mode.  */
16757 };
16758
16759 /* Subroutine of md_assemble, responsible for looking up the primary
16760    opcode from the mnemonic the user wrote.  STR points to the
16761    beginning of the mnemonic.
16762
16763    This is not simply a hash table lookup, because of conditional
16764    variants.  Most instructions have conditional variants, which are
16765    expressed with a _conditional affix_ to the mnemonic.  If we were
16766    to encode each conditional variant as a literal string in the opcode
16767    table, it would have approximately 20,000 entries.
16768
16769    Most mnemonics take this affix as a suffix, and in unified syntax,
16770    'most' is upgraded to 'all'.  However, in the divided syntax, some
16771    instructions take the affix as an infix, notably the s-variants of
16772    the arithmetic instructions.  Of those instructions, all but six
16773    have the infix appear after the third character of the mnemonic.
16774
16775    Accordingly, the algorithm for looking up primary opcodes given
16776    an identifier is:
16777
16778    1. Look up the identifier in the opcode table.
16779       If we find a match, go to step U.
16780
16781    2. Look up the last two characters of the identifier in the
16782       conditions table.  If we find a match, look up the first N-2
16783       characters of the identifier in the opcode table.  If we
16784       find a match, go to step CE.
16785
16786    3. Look up the fourth and fifth characters of the identifier in
16787       the conditions table.  If we find a match, extract those
16788       characters from the identifier, and look up the remaining
16789       characters in the opcode table.  If we find a match, go
16790       to step CM.
16791
16792    4. Fail.
16793
16794    U. Examine the tag field of the opcode structure, in case this is
16795       one of the six instructions with its conditional infix in an
16796       unusual place.  If it is, the tag tells us where to find the
16797       infix; look it up in the conditions table and set inst.cond
16798       accordingly.  Otherwise, this is an unconditional instruction.
16799       Again set inst.cond accordingly.  Return the opcode structure.
16800
16801   CE. Examine the tag field to make sure this is an instruction that
16802       should receive a conditional suffix.  If it is not, fail.
16803       Otherwise, set inst.cond from the suffix we already looked up,
16804       and return the opcode structure.
16805
16806   CM. Examine the tag field to make sure this is an instruction that
16807       should receive a conditional infix after the third character.
16808       If it is not, fail.  Otherwise, undo the edits to the current
16809       line of input and proceed as for case CE.  */
16810
16811 static const struct asm_opcode *
16812 opcode_lookup (char **str)
16813 {
16814   char *end, *base;
16815   char *affix;
16816   const struct asm_opcode *opcode;
16817   const struct asm_cond *cond;
16818   char save[2];
16819
16820   /* Scan up to the end of the mnemonic, which must end in white space,
16821      '.' (in unified mode, or for Neon/VFP instructions), or end of string.  */
16822   for (base = end = *str; *end != '\0'; end++)
16823     if (*end == ' ' || *end == '.')
16824       break;
16825
16826   if (end == base)
16827     return NULL;
16828
16829   /* Handle a possible width suffix and/or Neon type suffix.  */
16830   if (end[0] == '.')
16831     {
16832       int offset = 2;
16833
16834       /* The .w and .n suffixes are only valid if the unified syntax is in
16835          use.  */
16836       if (unified_syntax && end[1] == 'w')
16837         inst.size_req = 4;
16838       else if (unified_syntax && end[1] == 'n')
16839         inst.size_req = 2;
16840       else
16841         offset = 0;
16842
16843       inst.vectype.elems = 0;
16844
16845       *str = end + offset;
16846
16847       if (end[offset] == '.')
16848         {
16849           /* See if we have a Neon type suffix (possible in either unified or
16850              non-unified ARM syntax mode).  */
16851           if (parse_neon_type (&inst.vectype, str) == FAIL)
16852             return NULL;
16853         }
16854       else if (end[offset] != '\0' && end[offset] != ' ')
16855         return NULL;
16856     }
16857   else
16858     *str = end;
16859
16860   /* Look for unaffixed or special-case affixed mnemonic.  */
16861   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16862                                                     end - base);
16863   if (opcode)
16864     {
16865       /* step U */
16866       if (opcode->tag < OT_odd_infix_0)
16867         {
16868           inst.cond = COND_ALWAYS;
16869           return opcode;
16870         }
16871
16872       if (warn_on_deprecated && unified_syntax)
16873         as_warn (_("conditional infixes are deprecated in unified syntax"));
16874       affix = base + (opcode->tag - OT_odd_infix_0);
16875       cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16876       gas_assert (cond);
16877
16878       inst.cond = cond->value;
16879       return opcode;
16880     }
16881
16882   /* Cannot have a conditional suffix on a mnemonic of less than two
16883      characters.  */
16884   if (end - base < 3)
16885     return NULL;
16886
16887   /* Look for suffixed mnemonic.  */
16888   affix = end - 2;
16889   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16890   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16891                                                     affix - base);
16892   if (opcode && cond)
16893     {
16894       /* step CE */
16895       switch (opcode->tag)
16896         {
16897         case OT_cinfix3_legacy:
16898           /* Ignore conditional suffixes matched on infix only mnemonics.  */
16899           break;
16900
16901         case OT_cinfix3:
16902         case OT_cinfix3_deprecated:
16903         case OT_odd_infix_unc:
16904           if (!unified_syntax)
16905             return 0;
16906           /* else fall through */
16907
16908         case OT_csuffix:
16909         case OT_csuffixF:
16910         case OT_csuf_or_in3:
16911           inst.cond = cond->value;
16912           return opcode;
16913
16914         case OT_unconditional:
16915         case OT_unconditionalF:
16916           if (thumb_mode)
16917             inst.cond = cond->value;
16918           else
16919             {
16920               /* Delayed diagnostic.  */
16921               inst.error = BAD_COND;
16922               inst.cond = COND_ALWAYS;
16923             }
16924           return opcode;
16925
16926         default:
16927           return NULL;
16928         }
16929     }
16930
16931   /* Cannot have a usual-position infix on a mnemonic of less than
16932      six characters (five would be a suffix).  */
16933   if (end - base < 6)
16934     return NULL;
16935
16936   /* Look for infixed mnemonic in the usual position.  */
16937   affix = base + 3;
16938   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16939   if (!cond)
16940     return NULL;
16941
16942   memcpy (save, affix, 2);
16943   memmove (affix, affix + 2, (end - affix) - 2);
16944   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16945                                                     (end - base) - 2);
16946   memmove (affix + 2, affix, (end - affix) - 2);
16947   memcpy (affix, save, 2);
16948
16949   if (opcode
16950       && (opcode->tag == OT_cinfix3
16951           || opcode->tag == OT_cinfix3_deprecated
16952           || opcode->tag == OT_csuf_or_in3
16953           || opcode->tag == OT_cinfix3_legacy))
16954     {
16955       /* Step CM.  */
16956       if (warn_on_deprecated && unified_syntax
16957           && (opcode->tag == OT_cinfix3
16958               || opcode->tag == OT_cinfix3_deprecated))
16959         as_warn (_("conditional infixes are deprecated in unified syntax"));
16960
16961       inst.cond = cond->value;
16962       return opcode;
16963     }
16964
16965   return NULL;
16966 }
16967
16968 /* This function generates an initial IT instruction, leaving its block
16969    virtually open for the new instructions. Eventually,
16970    the mask will be updated by now_it_add_mask () each time
16971    a new instruction needs to be included in the IT block.
16972    Finally, the block is closed with close_automatic_it_block ().
16973    The block closure can be requested either from md_assemble (),
16974    a tencode (), or due to a label hook.  */
16975
16976 static void
16977 new_automatic_it_block (int cond)
16978 {
16979   now_it.state = AUTOMATIC_IT_BLOCK;
16980   now_it.mask = 0x18;
16981   now_it.cc = cond;
16982   now_it.block_length = 1;
16983   mapping_state (MAP_THUMB);
16984   now_it.insn = output_it_inst (cond, now_it.mask, NULL);
16985   now_it.warn_deprecated = FALSE;
16986   now_it.insn_cond = TRUE;
16987 }
16988
16989 /* Close an automatic IT block.
16990    See comments in new_automatic_it_block ().  */
16991
16992 static void
16993 close_automatic_it_block (void)
16994 {
16995   now_it.mask = 0x10;
16996   now_it.block_length = 0;
16997 }
16998
16999 /* Update the mask of the current automatically-generated IT
17000    instruction. See comments in new_automatic_it_block ().  */
17001
17002 static void
17003 now_it_add_mask (int cond)
17004 {
17005 #define CLEAR_BIT(value, nbit)  ((value) & ~(1 << (nbit)))
17006 #define SET_BIT_VALUE(value, bitvalue, nbit)  (CLEAR_BIT (value, nbit) \
17007                                               | ((bitvalue) << (nbit)))
17008   const int resulting_bit = (cond & 1);
17009
17010   now_it.mask &= 0xf;
17011   now_it.mask = SET_BIT_VALUE (now_it.mask,
17012                                    resulting_bit,
17013                                   (5 - now_it.block_length));
17014   now_it.mask = SET_BIT_VALUE (now_it.mask,
17015                                    1,
17016                                    ((5 - now_it.block_length) - 1) );
17017   output_it_inst (now_it.cc, now_it.mask, now_it.insn);
17018
17019 #undef CLEAR_BIT
17020 #undef SET_BIT_VALUE
17021 }
17022
17023 /* The IT blocks handling machinery is accessed through the these functions:
17024      it_fsm_pre_encode ()               from md_assemble ()
17025      set_it_insn_type ()                optional, from the tencode functions
17026      set_it_insn_type_last ()           ditto
17027      in_it_block ()                     ditto
17028      it_fsm_post_encode ()              from md_assemble ()
17029      force_automatic_it_block_close ()  from label habdling functions
17030
17031    Rationale:
17032      1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
17033         initializing the IT insn type with a generic initial value depending
17034         on the inst.condition.
17035      2) During the tencode function, two things may happen:
17036         a) The tencode function overrides the IT insn type by
17037            calling either set_it_insn_type (type) or set_it_insn_type_last ().
17038         b) The tencode function queries the IT block state by
17039            calling in_it_block () (i.e. to determine narrow/not narrow mode).
17040
17041         Both set_it_insn_type and in_it_block run the internal FSM state
17042         handling function (handle_it_state), because: a) setting the IT insn
17043         type may incur in an invalid state (exiting the function),
17044         and b) querying the state requires the FSM to be updated.
17045         Specifically we want to avoid creating an IT block for conditional
17046         branches, so it_fsm_pre_encode is actually a guess and we can't
17047         determine whether an IT block is required until the tencode () routine
17048         has decided what type of instruction this actually it.
17049         Because of this, if set_it_insn_type and in_it_block have to be used,
17050         set_it_insn_type has to be called first.
17051
17052         set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
17053         determines the insn IT type depending on the inst.cond code.
17054         When a tencode () routine encodes an instruction that can be
17055         either outside an IT block, or, in the case of being inside, has to be
17056         the last one, set_it_insn_type_last () will determine the proper
17057         IT instruction type based on the inst.cond code. Otherwise,
17058         set_it_insn_type can be called for overriding that logic or
17059         for covering other cases.
17060
17061         Calling handle_it_state () may not transition the IT block state to
17062         OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
17063         still queried. Instead, if the FSM determines that the state should
17064         be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
17065         after the tencode () function: that's what it_fsm_post_encode () does.
17066
17067         Since in_it_block () calls the state handling function to get an
17068         updated state, an error may occur (due to invalid insns combination).
17069         In that case, inst.error is set.
17070         Therefore, inst.error has to be checked after the execution of
17071         the tencode () routine.
17072
17073      3) Back in md_assemble(), it_fsm_post_encode () is called to commit
17074         any pending state change (if any) that didn't take place in
17075         handle_it_state () as explained above.  */
17076
17077 static void
17078 it_fsm_pre_encode (void)
17079 {
17080   if (inst.cond != COND_ALWAYS)
17081     inst.it_insn_type = INSIDE_IT_INSN;
17082   else
17083     inst.it_insn_type = OUTSIDE_IT_INSN;
17084
17085   now_it.state_handled = 0;
17086 }
17087
17088 /* IT state FSM handling function.  */
17089
17090 static int
17091 handle_it_state (void)
17092 {
17093   now_it.state_handled = 1;
17094   now_it.insn_cond = FALSE;
17095
17096   switch (now_it.state)
17097     {
17098     case OUTSIDE_IT_BLOCK:
17099       switch (inst.it_insn_type)
17100         {
17101         case OUTSIDE_IT_INSN:
17102           break;
17103
17104         case INSIDE_IT_INSN:
17105         case INSIDE_IT_LAST_INSN:
17106           if (thumb_mode == 0)
17107             {
17108               if (unified_syntax
17109                   && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
17110                 as_tsktsk (_("Warning: conditional outside an IT block"\
17111                              " for Thumb."));
17112             }
17113           else
17114             {
17115               if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
17116                   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
17117                 {
17118                   /* Automatically generate the IT instruction.  */
17119                   new_automatic_it_block (inst.cond);
17120                   if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
17121                     close_automatic_it_block ();
17122                 }
17123               else
17124                 {
17125                   inst.error = BAD_OUT_IT;
17126                   return FAIL;
17127                 }
17128             }
17129           break;
17130
17131         case IF_INSIDE_IT_LAST_INSN:
17132         case NEUTRAL_IT_INSN:
17133           break;
17134
17135         case IT_INSN:
17136           now_it.state = MANUAL_IT_BLOCK;
17137           now_it.block_length = 0;
17138           break;
17139         }
17140       break;
17141
17142     case AUTOMATIC_IT_BLOCK:
17143       /* Three things may happen now:
17144          a) We should increment current it block size;
17145          b) We should close current it block (closing insn or 4 insns);
17146          c) We should close current it block and start a new one (due
17147          to incompatible conditions or
17148          4 insns-length block reached).  */
17149
17150       switch (inst.it_insn_type)
17151         {
17152         case OUTSIDE_IT_INSN:
17153           /* The closure of the block shall happen immediatelly,
17154              so any in_it_block () call reports the block as closed.  */
17155           force_automatic_it_block_close ();
17156           break;
17157
17158         case INSIDE_IT_INSN:
17159         case INSIDE_IT_LAST_INSN:
17160         case IF_INSIDE_IT_LAST_INSN:
17161           now_it.block_length++;
17162
17163           if (now_it.block_length > 4
17164               || !now_it_compatible (inst.cond))
17165             {
17166               force_automatic_it_block_close ();
17167               if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
17168                 new_automatic_it_block (inst.cond);
17169             }
17170           else
17171             {
17172               now_it.insn_cond = TRUE;
17173               now_it_add_mask (inst.cond);
17174             }
17175
17176           if (now_it.state == AUTOMATIC_IT_BLOCK
17177               && (inst.it_insn_type == INSIDE_IT_LAST_INSN
17178                   || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
17179             close_automatic_it_block ();
17180           break;
17181
17182         case NEUTRAL_IT_INSN:
17183           now_it.block_length++;
17184           now_it.insn_cond = TRUE;
17185
17186           if (now_it.block_length > 4)
17187             force_automatic_it_block_close ();
17188           else
17189             now_it_add_mask (now_it.cc & 1);
17190           break;
17191
17192         case IT_INSN:
17193           close_automatic_it_block ();
17194           now_it.state = MANUAL_IT_BLOCK;
17195           break;
17196         }
17197       break;
17198
17199     case MANUAL_IT_BLOCK:
17200       {
17201         /* Check conditional suffixes.  */
17202         const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
17203         int is_last;
17204         now_it.mask <<= 1;
17205         now_it.mask &= 0x1f;
17206         is_last = (now_it.mask == 0x10);
17207         now_it.insn_cond = TRUE;
17208
17209         switch (inst.it_insn_type)
17210           {
17211           case OUTSIDE_IT_INSN:
17212             inst.error = BAD_NOT_IT;
17213             return FAIL;
17214
17215           case INSIDE_IT_INSN:
17216             if (cond != inst.cond)
17217               {
17218                 inst.error = BAD_IT_COND;
17219                 return FAIL;
17220               }
17221             break;
17222
17223           case INSIDE_IT_LAST_INSN:
17224           case IF_INSIDE_IT_LAST_INSN:
17225             if (cond != inst.cond)
17226               {
17227                 inst.error = BAD_IT_COND;
17228                 return FAIL;
17229               }
17230             if (!is_last)
17231               {
17232                 inst.error = BAD_BRANCH;
17233                 return FAIL;
17234               }
17235             break;
17236
17237           case NEUTRAL_IT_INSN:
17238             /* The BKPT instruction is unconditional even in an IT block.  */
17239             break;
17240
17241           case IT_INSN:
17242             inst.error = BAD_IT_IT;
17243             return FAIL;
17244           }
17245       }
17246       break;
17247     }
17248
17249   return SUCCESS;
17250 }
17251
17252 struct depr_insn_mask
17253 {
17254   unsigned long pattern;
17255   unsigned long mask;
17256   const char* description;
17257 };
17258
17259 /* List of 16-bit instruction patterns deprecated in an IT block in
17260    ARMv8.  */
17261 static const struct depr_insn_mask depr_it_insns[] = {
17262   { 0xc000, 0xc000, N_("Short branches, Undefined, SVC, LDM/STM") },
17263   { 0xb000, 0xb000, N_("Miscellaneous 16-bit instructions") },
17264   { 0xa000, 0xb800, N_("ADR") },
17265   { 0x4800, 0xf800, N_("Literal loads") },
17266   { 0x4478, 0xf478, N_("Hi-register ADD, MOV, CMP, BX, BLX using pc") },
17267   { 0x4487, 0xfc87, N_("Hi-register ADD, MOV, CMP using pc") },
17268   { 0, 0, NULL }
17269 };
17270
17271 static void
17272 it_fsm_post_encode (void)
17273 {
17274   int is_last;
17275
17276   if (!now_it.state_handled)
17277     handle_it_state ();
17278
17279   if (now_it.insn_cond
17280       && !now_it.warn_deprecated
17281       && warn_on_deprecated
17282       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
17283     {
17284       if (inst.instruction >= 0x10000)
17285         {
17286           as_warn (_("IT blocks containing 32-bit Thumb instructions are "
17287                      "deprecated in ARMv8"));
17288           now_it.warn_deprecated = TRUE;
17289         }
17290       else
17291         {
17292           const struct depr_insn_mask *p = depr_it_insns;
17293
17294           while (p->mask != 0)
17295             {
17296               if ((inst.instruction & p->mask) == p->pattern)
17297                 {
17298                   as_warn (_("IT blocks containing 16-bit Thumb instructions "
17299                              "of the following class are deprecated in ARMv8: "
17300                              "%s"), p->description);
17301                   now_it.warn_deprecated = TRUE;
17302                   break;
17303                 }
17304
17305               ++p;
17306             }
17307         }
17308
17309       if (now_it.block_length > 1)
17310         {
17311           as_warn (_("IT blocks containing more than one conditional "
17312                      "instruction are deprecated in ARMv8"));
17313           now_it.warn_deprecated = TRUE;
17314         }
17315     }
17316
17317   is_last = (now_it.mask == 0x10);
17318   if (is_last)
17319     {
17320       now_it.state = OUTSIDE_IT_BLOCK;
17321       now_it.mask = 0;
17322     }
17323 }
17324
17325 static void
17326 force_automatic_it_block_close (void)
17327 {
17328   if (now_it.state == AUTOMATIC_IT_BLOCK)
17329     {
17330       close_automatic_it_block ();
17331       now_it.state = OUTSIDE_IT_BLOCK;
17332       now_it.mask = 0;
17333     }
17334 }
17335
17336 static int
17337 in_it_block (void)
17338 {
17339   if (!now_it.state_handled)
17340     handle_it_state ();
17341
17342   return now_it.state != OUTSIDE_IT_BLOCK;
17343 }
17344
17345 void
17346 md_assemble (char *str)
17347 {
17348   char *p = str;
17349   const struct asm_opcode * opcode;
17350
17351   /* Align the previous label if needed.  */
17352   if (last_label_seen != NULL)
17353     {
17354       symbol_set_frag (last_label_seen, frag_now);
17355       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
17356       S_SET_SEGMENT (last_label_seen, now_seg);
17357     }
17358
17359   memset (&inst, '\0', sizeof (inst));
17360   inst.reloc.type = BFD_RELOC_UNUSED;
17361
17362   opcode = opcode_lookup (&p);
17363   if (!opcode)
17364     {
17365       /* It wasn't an instruction, but it might be a register alias of
17366          the form alias .req reg, or a Neon .dn/.qn directive.  */
17367       if (! create_register_alias (str, p)
17368           && ! create_neon_reg_alias (str, p))
17369         as_bad (_("bad instruction `%s'"), str);
17370
17371       return;
17372     }
17373
17374   if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
17375     as_warn (_("s suffix on comparison instruction is deprecated"));
17376
17377   /* The value which unconditional instructions should have in place of the
17378      condition field.  */
17379   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
17380
17381   if (thumb_mode)
17382     {
17383       arm_feature_set variant;
17384
17385       variant = cpu_variant;
17386       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
17387       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
17388         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
17389       /* Check that this instruction is supported for this CPU.  */
17390       if (!opcode->tvariant
17391           || (thumb_mode == 1
17392               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
17393         {
17394           as_bad (_("selected processor does not support Thumb mode `%s'"), str);
17395           return;
17396         }
17397       if (inst.cond != COND_ALWAYS && !unified_syntax
17398           && opcode->tencode != do_t_branch)
17399         {
17400           as_bad (_("Thumb does not support conditional execution"));
17401           return;
17402         }
17403
17404       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
17405         {
17406           if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
17407               && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
17408                    || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
17409             {
17410               /* Two things are addressed here.
17411                  1) Implicit require narrow instructions on Thumb-1.
17412                     This avoids relaxation accidentally introducing Thumb-2
17413                      instructions.
17414                  2) Reject wide instructions in non Thumb-2 cores.  */
17415               if (inst.size_req == 0)
17416                 inst.size_req = 2;
17417               else if (inst.size_req == 4)
17418                 {
17419                   as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
17420                   return;
17421                 }
17422             }
17423         }
17424
17425       inst.instruction = opcode->tvalue;
17426
17427       if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
17428         {
17429           /* Prepare the it_insn_type for those encodings that don't set
17430              it.  */
17431           it_fsm_pre_encode ();
17432
17433           opcode->tencode ();
17434
17435           it_fsm_post_encode ();
17436         }
17437
17438       if (!(inst.error || inst.relax))
17439         {
17440           gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
17441           inst.size = (inst.instruction > 0xffff ? 4 : 2);
17442           if (inst.size_req && inst.size_req != inst.size)
17443             {
17444               as_bad (_("cannot honor width suffix -- `%s'"), str);
17445               return;
17446             }
17447         }
17448
17449       /* Something has gone badly wrong if we try to relax a fixed size
17450          instruction.  */
17451       gas_assert (inst.size_req == 0 || !inst.relax);
17452
17453       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17454                               *opcode->tvariant);
17455       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
17456          set those bits when Thumb-2 32-bit instructions are seen.  ie.
17457          anything other than bl/blx and v6-M instructions.
17458          This is overly pessimistic for relaxable instructions.  */
17459       if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
17460            || inst.relax)
17461           && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
17462                || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
17463         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17464                                 arm_ext_v6t2);
17465
17466       check_neon_suffixes;
17467
17468       if (!inst.error)
17469         {
17470           mapping_state (MAP_THUMB);
17471         }
17472     }
17473   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
17474     {
17475       bfd_boolean is_bx;
17476
17477       /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
17478       is_bx = (opcode->aencode == do_bx);
17479
17480       /* Check that this instruction is supported for this CPU.  */
17481       if (!(is_bx && fix_v4bx)
17482           && !(opcode->avariant &&
17483                ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
17484         {
17485           as_bad (_("selected processor does not support ARM mode `%s'"), str);
17486           return;
17487         }
17488       if (inst.size_req)
17489         {
17490           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
17491           return;
17492         }
17493
17494       inst.instruction = opcode->avalue;
17495       if (opcode->tag == OT_unconditionalF)
17496         inst.instruction |= 0xF << 28;
17497       else
17498         inst.instruction |= inst.cond << 28;
17499       inst.size = INSN_SIZE;
17500       if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
17501         {
17502           it_fsm_pre_encode ();
17503           opcode->aencode ();
17504           it_fsm_post_encode ();
17505         }
17506       /* Arm mode bx is marked as both v4T and v5 because it's still required
17507          on a hypothetical non-thumb v5 core.  */
17508       if (is_bx)
17509         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
17510       else
17511         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
17512                                 *opcode->avariant);
17513
17514       check_neon_suffixes;
17515
17516       if (!inst.error)
17517         {
17518           mapping_state (MAP_ARM);
17519         }
17520     }
17521   else
17522     {
17523       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
17524                 "-- `%s'"), str);
17525       return;
17526     }
17527   output_inst (str);
17528 }
17529
17530 static void
17531 check_it_blocks_finished (void)
17532 {
17533 #ifdef OBJ_ELF
17534   asection *sect;
17535
17536   for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
17537     if (seg_info (sect)->tc_segment_info_data.current_it.state
17538         == MANUAL_IT_BLOCK)
17539       {
17540         as_warn (_("section '%s' finished with an open IT block."),
17541                  sect->name);
17542       }
17543 #else
17544   if (now_it.state == MANUAL_IT_BLOCK)
17545     as_warn (_("file finished with an open IT block."));
17546 #endif
17547 }
17548
17549 /* Various frobbings of labels and their addresses.  */
17550
17551 void
17552 arm_start_line_hook (void)
17553 {
17554   last_label_seen = NULL;
17555 }
17556
17557 void
17558 arm_frob_label (symbolS * sym)
17559 {
17560   last_label_seen = sym;
17561
17562   ARM_SET_THUMB (sym, thumb_mode);
17563
17564 #if defined OBJ_COFF || defined OBJ_ELF
17565   ARM_SET_INTERWORK (sym, support_interwork);
17566 #endif
17567
17568   force_automatic_it_block_close ();
17569
17570   /* Note - do not allow local symbols (.Lxxx) to be labelled
17571      as Thumb functions.  This is because these labels, whilst
17572      they exist inside Thumb code, are not the entry points for
17573      possible ARM->Thumb calls.  Also, these labels can be used
17574      as part of a computed goto or switch statement.  eg gcc
17575      can generate code that looks like this:
17576
17577                 ldr  r2, [pc, .Laaa]
17578                 lsl  r3, r3, #2
17579                 ldr  r2, [r3, r2]
17580                 mov  pc, r2
17581
17582        .Lbbb:  .word .Lxxx
17583        .Lccc:  .word .Lyyy
17584        ..etc...
17585        .Laaa:   .word Lbbb
17586
17587      The first instruction loads the address of the jump table.
17588      The second instruction converts a table index into a byte offset.
17589      The third instruction gets the jump address out of the table.
17590      The fourth instruction performs the jump.
17591
17592      If the address stored at .Laaa is that of a symbol which has the
17593      Thumb_Func bit set, then the linker will arrange for this address
17594      to have the bottom bit set, which in turn would mean that the
17595      address computation performed by the third instruction would end
17596      up with the bottom bit set.  Since the ARM is capable of unaligned
17597      word loads, the instruction would then load the incorrect address
17598      out of the jump table, and chaos would ensue.  */
17599   if (label_is_thumb_function_name
17600       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
17601       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
17602     {
17603       /* When the address of a Thumb function is taken the bottom
17604          bit of that address should be set.  This will allow
17605          interworking between Arm and Thumb functions to work
17606          correctly.  */
17607
17608       THUMB_SET_FUNC (sym, 1);
17609
17610       label_is_thumb_function_name = FALSE;
17611     }
17612
17613   dwarf2_emit_label (sym);
17614 }
17615
17616 bfd_boolean
17617 arm_data_in_code (void)
17618 {
17619   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
17620     {
17621       *input_line_pointer = '/';
17622       input_line_pointer += 5;
17623       *input_line_pointer = 0;
17624       return TRUE;
17625     }
17626
17627   return FALSE;
17628 }
17629
17630 char *
17631 arm_canonicalize_symbol_name (char * name)
17632 {
17633   int len;
17634
17635   if (thumb_mode && (len = strlen (name)) > 5
17636       && streq (name + len - 5, "/data"))
17637     *(name + len - 5) = 0;
17638
17639   return name;
17640 }
17641 \f
17642 /* Table of all register names defined by default.  The user can
17643    define additional names with .req.  Note that all register names
17644    should appear in both upper and lowercase variants.  Some registers
17645    also have mixed-case names.  */
17646
17647 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
17648 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
17649 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
17650 #define REGSET(p,t) \
17651   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
17652   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
17653   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
17654   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
17655 #define REGSETH(p,t) \
17656   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
17657   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
17658   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
17659   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
17660 #define REGSET2(p,t) \
17661   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
17662   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
17663   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
17664   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
17665 #define SPLRBANK(base,bank,t) \
17666   REGDEF(lr_##bank, 768|((base+0)<<16), t), \
17667   REGDEF(sp_##bank, 768|((base+1)<<16), t), \
17668   REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
17669   REGDEF(LR_##bank, 768|((base+0)<<16), t), \
17670   REGDEF(SP_##bank, 768|((base+1)<<16), t), \
17671   REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
17672
17673 static const struct reg_entry reg_names[] =
17674 {
17675   /* ARM integer registers.  */
17676   REGSET(r, RN), REGSET(R, RN),
17677
17678   /* ATPCS synonyms.  */
17679   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
17680   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
17681   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
17682
17683   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
17684   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
17685   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
17686
17687   /* Well-known aliases.  */
17688   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
17689   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
17690
17691   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
17692   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
17693
17694   /* Coprocessor numbers.  */
17695   REGSET(p, CP), REGSET(P, CP),
17696
17697   /* Coprocessor register numbers.  The "cr" variants are for backward
17698      compatibility.  */
17699   REGSET(c,  CN), REGSET(C, CN),
17700   REGSET(cr, CN), REGSET(CR, CN),
17701
17702   /* ARM banked registers.  */
17703   REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
17704   REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
17705   REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
17706   REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
17707   REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
17708   REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
17709   REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
17710
17711   REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
17712   REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
17713   REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
17714   REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
17715   REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
17716   REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(sp_fiq,512|(13<<16),RNB),
17717   REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
17718   REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
17719
17720   SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
17721   SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
17722   SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
17723   SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
17724   SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
17725   REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
17726   REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
17727   REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
17728   REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
17729
17730   /* FPA registers.  */
17731   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
17732   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
17733
17734   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
17735   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
17736
17737   /* VFP SP registers.  */
17738   REGSET(s,VFS),  REGSET(S,VFS),
17739   REGSETH(s,VFS), REGSETH(S,VFS),
17740
17741   /* VFP DP Registers.  */
17742   REGSET(d,VFD),  REGSET(D,VFD),
17743   /* Extra Neon DP registers.  */
17744   REGSETH(d,VFD), REGSETH(D,VFD),
17745
17746   /* Neon QP registers.  */
17747   REGSET2(q,NQ),  REGSET2(Q,NQ),
17748
17749   /* VFP control registers.  */
17750   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
17751   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
17752   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
17753   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
17754   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
17755   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
17756
17757   /* Maverick DSP coprocessor registers.  */
17758   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
17759   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
17760
17761   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
17762   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
17763   REGDEF(dspsc,0,DSPSC),
17764
17765   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
17766   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
17767   REGDEF(DSPSC,0,DSPSC),
17768
17769   /* iWMMXt data registers - p0, c0-15.  */
17770   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
17771
17772   /* iWMMXt control registers - p1, c0-3.  */
17773   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
17774   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
17775   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
17776   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
17777
17778   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
17779   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
17780   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
17781   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
17782   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
17783
17784   /* XScale accumulator registers.  */
17785   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
17786 };
17787 #undef REGDEF
17788 #undef REGNUM
17789 #undef REGSET
17790
17791 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
17792    within psr_required_here.  */
17793 static const struct asm_psr psrs[] =
17794 {
17795   /* Backward compatibility notation.  Note that "all" is no longer
17796      truly all possible PSR bits.  */
17797   {"all",  PSR_c | PSR_f},
17798   {"flg",  PSR_f},
17799   {"ctl",  PSR_c},
17800
17801   /* Individual flags.  */
17802   {"f",    PSR_f},
17803   {"c",    PSR_c},
17804   {"x",    PSR_x},
17805   {"s",    PSR_s},
17806
17807   /* Combinations of flags.  */
17808   {"fs",   PSR_f | PSR_s},
17809   {"fx",   PSR_f | PSR_x},
17810   {"fc",   PSR_f | PSR_c},
17811   {"sf",   PSR_s | PSR_f},
17812   {"sx",   PSR_s | PSR_x},
17813   {"sc",   PSR_s | PSR_c},
17814   {"xf",   PSR_x | PSR_f},
17815   {"xs",   PSR_x | PSR_s},
17816   {"xc",   PSR_x | PSR_c},
17817   {"cf",   PSR_c | PSR_f},
17818   {"cs",   PSR_c | PSR_s},
17819   {"cx",   PSR_c | PSR_x},
17820   {"fsx",  PSR_f | PSR_s | PSR_x},
17821   {"fsc",  PSR_f | PSR_s | PSR_c},
17822   {"fxs",  PSR_f | PSR_x | PSR_s},
17823   {"fxc",  PSR_f | PSR_x | PSR_c},
17824   {"fcs",  PSR_f | PSR_c | PSR_s},
17825   {"fcx",  PSR_f | PSR_c | PSR_x},
17826   {"sfx",  PSR_s | PSR_f | PSR_x},
17827   {"sfc",  PSR_s | PSR_f | PSR_c},
17828   {"sxf",  PSR_s | PSR_x | PSR_f},
17829   {"sxc",  PSR_s | PSR_x | PSR_c},
17830   {"scf",  PSR_s | PSR_c | PSR_f},
17831   {"scx",  PSR_s | PSR_c | PSR_x},
17832   {"xfs",  PSR_x | PSR_f | PSR_s},
17833   {"xfc",  PSR_x | PSR_f | PSR_c},
17834   {"xsf",  PSR_x | PSR_s | PSR_f},
17835   {"xsc",  PSR_x | PSR_s | PSR_c},
17836   {"xcf",  PSR_x | PSR_c | PSR_f},
17837   {"xcs",  PSR_x | PSR_c | PSR_s},
17838   {"cfs",  PSR_c | PSR_f | PSR_s},
17839   {"cfx",  PSR_c | PSR_f | PSR_x},
17840   {"csf",  PSR_c | PSR_s | PSR_f},
17841   {"csx",  PSR_c | PSR_s | PSR_x},
17842   {"cxf",  PSR_c | PSR_x | PSR_f},
17843   {"cxs",  PSR_c | PSR_x | PSR_s},
17844   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
17845   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
17846   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
17847   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
17848   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
17849   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
17850   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
17851   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
17852   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
17853   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
17854   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
17855   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
17856   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
17857   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
17858   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
17859   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
17860   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
17861   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
17862   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
17863   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
17864   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
17865   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
17866   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
17867   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
17868 };
17869
17870 /* Table of V7M psr names.  */
17871 static const struct asm_psr v7m_psrs[] =
17872 {
17873   {"apsr",        0 }, {"APSR",         0 },
17874   {"iapsr",       1 }, {"IAPSR",        1 },
17875   {"eapsr",       2 }, {"EAPSR",        2 },
17876   {"psr",         3 }, {"PSR",          3 },
17877   {"xpsr",        3 }, {"XPSR",         3 }, {"xPSR",     3 },
17878   {"ipsr",        5 }, {"IPSR",         5 },
17879   {"epsr",        6 }, {"EPSR",         6 },
17880   {"iepsr",       7 }, {"IEPSR",        7 },
17881   {"msp",         8 }, {"MSP",          8 },
17882   {"psp",         9 }, {"PSP",          9 },
17883   {"primask",     16}, {"PRIMASK",      16},
17884   {"basepri",     17}, {"BASEPRI",      17},
17885   {"basepri_max", 18}, {"BASEPRI_MAX",  18},
17886   {"basepri_max", 18}, {"BASEPRI_MASK", 18}, /* Typo, preserved for backwards compatibility.  */
17887   {"faultmask",   19}, {"FAULTMASK",    19},
17888   {"control",     20}, {"CONTROL",      20}
17889 };
17890
17891 /* Table of all shift-in-operand names.  */
17892 static const struct asm_shift_name shift_names [] =
17893 {
17894   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
17895   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
17896   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
17897   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
17898   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
17899   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
17900 };
17901
17902 /* Table of all explicit relocation names.  */
17903 #ifdef OBJ_ELF
17904 static struct reloc_entry reloc_names[] =
17905 {
17906   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
17907   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
17908   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
17909   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
17910   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
17911   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
17912   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
17913   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
17914   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
17915   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
17916   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32},
17917   { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
17918   { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
17919         { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
17920   { "tlscall", BFD_RELOC_ARM_TLS_CALL},
17921         { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
17922   { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
17923         { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
17924 };
17925 #endif
17926
17927 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
17928 static const struct asm_cond conds[] =
17929 {
17930   {"eq", 0x0},
17931   {"ne", 0x1},
17932   {"cs", 0x2}, {"hs", 0x2},
17933   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
17934   {"mi", 0x4},
17935   {"pl", 0x5},
17936   {"vs", 0x6},
17937   {"vc", 0x7},
17938   {"hi", 0x8},
17939   {"ls", 0x9},
17940   {"ge", 0xa},
17941   {"lt", 0xb},
17942   {"gt", 0xc},
17943   {"le", 0xd},
17944   {"al", 0xe}
17945 };
17946
17947 #define UL_BARRIER(L,U,CODE,FEAT) \
17948   { L, CODE, ARM_FEATURE (FEAT, 0) }, \
17949   { U, CODE, ARM_FEATURE (FEAT, 0) }
17950
17951 static struct asm_barrier_opt barrier_opt_names[] =
17952 {
17953   UL_BARRIER ("sy",     "SY",    0xf, ARM_EXT_BARRIER),
17954   UL_BARRIER ("st",     "ST",    0xe, ARM_EXT_BARRIER),
17955   UL_BARRIER ("ld",     "LD",    0xd, ARM_EXT_V8),
17956   UL_BARRIER ("ish",    "ISH",   0xb, ARM_EXT_BARRIER),
17957   UL_BARRIER ("sh",     "SH",    0xb, ARM_EXT_BARRIER),
17958   UL_BARRIER ("ishst",  "ISHST", 0xa, ARM_EXT_BARRIER),
17959   UL_BARRIER ("shst",   "SHST",  0xa, ARM_EXT_BARRIER),
17960   UL_BARRIER ("ishld",  "ISHLD", 0x9, ARM_EXT_V8),
17961   UL_BARRIER ("un",     "UN",    0x7, ARM_EXT_BARRIER),
17962   UL_BARRIER ("nsh",    "NSH",   0x7, ARM_EXT_BARRIER),
17963   UL_BARRIER ("unst",   "UNST",  0x6, ARM_EXT_BARRIER),
17964   UL_BARRIER ("nshst",  "NSHST", 0x6, ARM_EXT_BARRIER),
17965   UL_BARRIER ("nshld",  "NSHLD", 0x5, ARM_EXT_V8),
17966   UL_BARRIER ("osh",    "OSH",   0x3, ARM_EXT_BARRIER),
17967   UL_BARRIER ("oshst",  "OSHST", 0x2, ARM_EXT_BARRIER),
17968   UL_BARRIER ("oshld",  "OSHLD", 0x1, ARM_EXT_V8)
17969 };
17970
17971 #undef UL_BARRIER
17972
17973 /* Table of ARM-format instructions.    */
17974
17975 /* Macros for gluing together operand strings.  N.B. In all cases
17976    other than OPS0, the trailing OP_stop comes from default
17977    zero-initialization of the unspecified elements of the array.  */
17978 #define OPS0()            { OP_stop, }
17979 #define OPS1(a)           { OP_##a, }
17980 #define OPS2(a,b)         { OP_##a,OP_##b, }
17981 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
17982 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
17983 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
17984 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
17985
17986 /* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
17987    This is useful when mixing operands for ARM and THUMB, i.e. using the
17988    MIX_ARM_THUMB_OPERANDS macro.
17989    In order to use these macros, prefix the number of operands with _
17990    e.g. _3.  */
17991 #define OPS_1(a)           { a, }
17992 #define OPS_2(a,b)         { a,b, }
17993 #define OPS_3(a,b,c)       { a,b,c, }
17994 #define OPS_4(a,b,c,d)     { a,b,c,d, }
17995 #define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
17996 #define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
17997
17998 /* These macros abstract out the exact format of the mnemonic table and
17999    save some repeated characters.  */
18000
18001 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
18002 #define TxCE(mnem, op, top, nops, ops, ae, te) \
18003   { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
18004     THUMB_VARIANT, do_##ae, do_##te }
18005
18006 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
18007    a T_MNEM_xyz enumerator.  */
18008 #define TCE(mnem, aop, top, nops, ops, ae, te) \
18009       TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
18010 #define tCE(mnem, aop, top, nops, ops, ae, te) \
18011       TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
18012
18013 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
18014    infix after the third character.  */
18015 #define TxC3(mnem, op, top, nops, ops, ae, te) \
18016   { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
18017     THUMB_VARIANT, do_##ae, do_##te }
18018 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
18019   { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
18020     THUMB_VARIANT, do_##ae, do_##te }
18021 #define TC3(mnem, aop, top, nops, ops, ae, te) \
18022       TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
18023 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
18024       TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
18025 #define tC3(mnem, aop, top, nops, ops, ae, te) \
18026       TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
18027 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
18028       TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
18029
18030 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
18031    field is still 0xE.  Many of the Thumb variants can be executed
18032    conditionally, so this is checked separately.  */
18033 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
18034   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
18035     THUMB_VARIANT, do_##ae, do_##te }
18036
18037 /* Same as TUE but the encoding function for ARM and Thumb modes is the same.
18038    Used by mnemonics that have very minimal differences in the encoding for
18039    ARM and Thumb variants and can be handled in a common function.  */
18040 #define TUEc(mnem, op, top, nops, ops, en) \
18041   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
18042     THUMB_VARIANT, do_##en, do_##en }
18043
18044 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
18045    condition code field.  */
18046 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
18047   { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
18048     THUMB_VARIANT, do_##ae, do_##te }
18049
18050 /* ARM-only variants of all the above.  */
18051 #define CE(mnem,  op, nops, ops, ae)    \
18052   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18053
18054 #define C3(mnem, op, nops, ops, ae)     \
18055   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18056
18057 /* Legacy mnemonics that always have conditional infix after the third
18058    character.  */
18059 #define CL(mnem, op, nops, ops, ae)     \
18060   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
18061     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18062
18063 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
18064 #define cCE(mnem,  op, nops, ops, ae)   \
18065   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
18066
18067 /* Legacy coprocessor instructions where conditional infix and conditional
18068    suffix are ambiguous.  For consistency this includes all FPA instructions,
18069    not just the potentially ambiguous ones.  */
18070 #define cCL(mnem, op, nops, ops, ae)    \
18071   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
18072     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
18073
18074 /* Coprocessor, takes either a suffix or a position-3 infix
18075    (for an FPA corner case). */
18076 #define C3E(mnem, op, nops, ops, ae) \
18077   { mnem, OPS##nops ops, OT_csuf_or_in3, \
18078     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
18079
18080 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
18081   { m1 #m2 m3, OPS##nops ops, \
18082     sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
18083     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18084
18085 #define CM(m1, m2, op, nops, ops, ae)   \
18086   xCM_ (m1,   , m2, op, nops, ops, ae), \
18087   xCM_ (m1, eq, m2, op, nops, ops, ae), \
18088   xCM_ (m1, ne, m2, op, nops, ops, ae), \
18089   xCM_ (m1, cs, m2, op, nops, ops, ae), \
18090   xCM_ (m1, hs, m2, op, nops, ops, ae), \
18091   xCM_ (m1, cc, m2, op, nops, ops, ae), \
18092   xCM_ (m1, ul, m2, op, nops, ops, ae), \
18093   xCM_ (m1, lo, m2, op, nops, ops, ae), \
18094   xCM_ (m1, mi, m2, op, nops, ops, ae), \
18095   xCM_ (m1, pl, m2, op, nops, ops, ae), \
18096   xCM_ (m1, vs, m2, op, nops, ops, ae), \
18097   xCM_ (m1, vc, m2, op, nops, ops, ae), \
18098   xCM_ (m1, hi, m2, op, nops, ops, ae), \
18099   xCM_ (m1, ls, m2, op, nops, ops, ae), \
18100   xCM_ (m1, ge, m2, op, nops, ops, ae), \
18101   xCM_ (m1, lt, m2, op, nops, ops, ae), \
18102   xCM_ (m1, gt, m2, op, nops, ops, ae), \
18103   xCM_ (m1, le, m2, op, nops, ops, ae), \
18104   xCM_ (m1, al, m2, op, nops, ops, ae)
18105
18106 #define UE(mnem, op, nops, ops, ae)     \
18107   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
18108
18109 #define UF(mnem, op, nops, ops, ae)     \
18110   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
18111
18112 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
18113    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
18114    use the same encoding function for each.  */
18115 #define NUF(mnem, op, nops, ops, enc)                                   \
18116   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
18117     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
18118
18119 /* Neon data processing, version which indirects through neon_enc_tab for
18120    the various overloaded versions of opcodes.  */
18121 #define nUF(mnem, op, nops, ops, enc)                                   \
18122   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
18123     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
18124
18125 /* Neon insn with conditional suffix for the ARM version, non-overloaded
18126    version.  */
18127 #define NCE_tag(mnem, op, nops, ops, enc, tag)                          \
18128   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
18129     THUMB_VARIANT, do_##enc, do_##enc }
18130
18131 #define NCE(mnem, op, nops, ops, enc)                                   \
18132    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
18133
18134 #define NCEF(mnem, op, nops, ops, enc)                                  \
18135     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
18136
18137 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
18138 #define nCE_tag(mnem, op, nops, ops, enc, tag)                          \
18139   { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,          \
18140     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
18141
18142 #define nCE(mnem, op, nops, ops, enc)                                   \
18143    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
18144
18145 #define nCEF(mnem, op, nops, ops, enc)                                  \
18146     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
18147
18148 #define do_0 0
18149
18150 static const struct asm_opcode insns[] =
18151 {
18152 #define ARM_VARIANT    & arm_ext_v1 /* Core ARM Instructions.  */
18153 #define THUMB_VARIANT  & arm_ext_v4t
18154  tCE("and",     0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
18155  tC3("ands",    0100000, _ands,    3, (RR, oRR, SH), arit, t_arit3c),
18156  tCE("eor",     0200000, _eor,     3, (RR, oRR, SH), arit, t_arit3c),
18157  tC3("eors",    0300000, _eors,    3, (RR, oRR, SH), arit, t_arit3c),
18158  tCE("sub",     0400000, _sub,     3, (RR, oRR, SH), arit, t_add_sub),
18159  tC3("subs",    0500000, _subs,    3, (RR, oRR, SH), arit, t_add_sub),
18160  tCE("add",     0800000, _add,     3, (RR, oRR, SHG), arit, t_add_sub),
18161  tC3("adds",    0900000, _adds,    3, (RR, oRR, SHG), arit, t_add_sub),
18162  tCE("adc",     0a00000, _adc,     3, (RR, oRR, SH), arit, t_arit3c),
18163  tC3("adcs",    0b00000, _adcs,    3, (RR, oRR, SH), arit, t_arit3c),
18164  tCE("sbc",     0c00000, _sbc,     3, (RR, oRR, SH), arit, t_arit3),
18165  tC3("sbcs",    0d00000, _sbcs,    3, (RR, oRR, SH), arit, t_arit3),
18166  tCE("orr",     1800000, _orr,     3, (RR, oRR, SH), arit, t_arit3c),
18167  tC3("orrs",    1900000, _orrs,    3, (RR, oRR, SH), arit, t_arit3c),
18168  tCE("bic",     1c00000, _bic,     3, (RR, oRR, SH), arit, t_arit3),
18169  tC3("bics",    1d00000, _bics,    3, (RR, oRR, SH), arit, t_arit3),
18170
18171  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
18172     for setting PSR flag bits.  They are obsolete in V6 and do not
18173     have Thumb equivalents. */
18174  tCE("tst",     1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
18175  tC3w("tsts",   1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
18176   CL("tstp",    110f000,           2, (RR, SH),      cmp),
18177  tCE("cmp",     1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
18178  tC3w("cmps",   1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
18179   CL("cmpp",    150f000,           2, (RR, SH),      cmp),
18180  tCE("cmn",     1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
18181  tC3w("cmns",   1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
18182   CL("cmnp",    170f000,           2, (RR, SH),      cmp),
18183
18184  tCE("mov",     1a00000, _mov,     2, (RR, SH),      mov,  t_mov_cmp),
18185  tC3("movs",    1b00000, _movs,    2, (RR, SH),      mov,  t_mov_cmp),
18186  tCE("mvn",     1e00000, _mvn,     2, (RR, SH),      mov,  t_mvn_tst),
18187  tC3("mvns",    1f00000, _mvns,    2, (RR, SH),      mov,  t_mvn_tst),
18188
18189  tCE("ldr",     4100000, _ldr,     2, (RR, ADDRGLDR),ldst, t_ldst),
18190  tC3("ldrb",    4500000, _ldrb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
18191  tCE("str",     4000000, _str,     _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
18192                                                                 OP_RRnpc),
18193                                         OP_ADDRGLDR),ldst, t_ldst),
18194  tC3("strb",    4400000, _strb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
18195
18196  tCE("stm",     8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18197  tC3("stmia",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18198  tC3("stmea",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18199  tCE("ldm",     8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18200  tC3("ldmia",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18201  tC3("ldmfd",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18202
18203  TCE("swi",     f000000, df00,     1, (EXPi),        swi, t_swi),
18204  TCE("svc",     f000000, df00,     1, (EXPi),        swi, t_swi),
18205  tCE("b",       a000000, _b,       1, (EXPr),        branch, t_branch),
18206  TCE("bl",      b000000, f000f800, 1, (EXPr),        bl, t_branch23),
18207
18208   /* Pseudo ops.  */
18209  tCE("adr",     28f0000, _adr,     2, (RR, EXP),     adr,  t_adr),
18210   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
18211  tCE("nop",     1a00000, _nop,     1, (oI255c),      nop,  t_nop),
18212  tCE("udf",     7f000f0, _udf,     1, (oIffffb),     bkpt, t_udf),
18213
18214   /* Thumb-compatibility pseudo ops.  */
18215  tCE("lsl",     1a00000, _lsl,     3, (RR, oRR, SH), shift, t_shift),
18216  tC3("lsls",    1b00000, _lsls,    3, (RR, oRR, SH), shift, t_shift),
18217  tCE("lsr",     1a00020, _lsr,     3, (RR, oRR, SH), shift, t_shift),
18218  tC3("lsrs",    1b00020, _lsrs,    3, (RR, oRR, SH), shift, t_shift),
18219  tCE("asr",     1a00040, _asr,     3, (RR, oRR, SH), shift, t_shift),
18220  tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
18221  tCE("ror",     1a00060, _ror,     3, (RR, oRR, SH), shift, t_shift),
18222  tC3("rors",    1b00060, _rors,    3, (RR, oRR, SH), shift, t_shift),
18223  tCE("neg",     2600000, _neg,     2, (RR, RR),      rd_rn, t_neg),
18224  tC3("negs",    2700000, _negs,    2, (RR, RR),      rd_rn, t_neg),
18225  tCE("push",    92d0000, _push,     1, (REGLST),             push_pop, t_push_pop),
18226  tCE("pop",     8bd0000, _pop,     1, (REGLST),      push_pop, t_push_pop),
18227
18228  /* These may simplify to neg.  */
18229  TCE("rsb",     0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
18230  TC3("rsbs",    0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
18231
18232 #undef  THUMB_VARIANT
18233 #define THUMB_VARIANT  & arm_ext_v6
18234
18235  TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
18236
18237  /* V1 instructions with no Thumb analogue prior to V6T2.  */
18238 #undef  THUMB_VARIANT
18239 #define THUMB_VARIANT  & arm_ext_v6t2
18240
18241  TCE("teq",     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
18242  TC3w("teqs",   1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
18243   CL("teqp",    130f000,           2, (RR, SH),      cmp),
18244
18245  TC3("ldrt",    4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18246  TC3("ldrbt",   4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18247  TC3("strt",    4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
18248  TC3("strbt",   4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18249
18250  TC3("stmdb",   9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18251  TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18252
18253  TC3("ldmdb",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18254  TC3("ldmea",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18255
18256  /* V1 instructions with no Thumb analogue at all.  */
18257   CE("rsc",     0e00000,           3, (RR, oRR, SH), arit),
18258   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
18259
18260   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
18261   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
18262   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
18263   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
18264   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
18265   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
18266   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
18267   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
18268
18269 #undef  ARM_VARIANT
18270 #define ARM_VARIANT    & arm_ext_v2     /* ARM 2 - multiplies.  */
18271 #undef  THUMB_VARIANT
18272 #define THUMB_VARIANT  & arm_ext_v4t
18273
18274  tCE("mul",     0000090, _mul,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
18275  tC3("muls",    0100090, _muls,    3, (RRnpc, RRnpc, oRR), mul, t_mul),
18276
18277 #undef  THUMB_VARIANT
18278 #define THUMB_VARIANT  & arm_ext_v6t2
18279
18280  TCE("mla",     0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
18281   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
18282
18283   /* Generic coprocessor instructions.  */
18284  TCE("cdp",     e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
18285  TCE("ldc",     c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18286  TC3("ldcl",    c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18287  TCE("stc",     c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18288  TC3("stcl",    c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18289  TCE("mcr",     e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18290  TCE("mrc",     e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b),   co_reg, co_reg),
18291
18292 #undef  ARM_VARIANT
18293 #define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
18294
18295   CE("swp",     1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
18296   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
18297
18298 #undef  ARM_VARIANT
18299 #define ARM_VARIANT    & arm_ext_v3     /* ARM 6 Status register instructions.  */
18300 #undef  THUMB_VARIANT
18301 #define THUMB_VARIANT  & arm_ext_msr
18302
18303  TCE("mrs",     1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
18304  TCE("msr",     120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
18305
18306 #undef  ARM_VARIANT
18307 #define ARM_VARIANT    & arm_ext_v3m     /* ARM 7M long multiplies.  */
18308 #undef  THUMB_VARIANT
18309 #define THUMB_VARIANT  & arm_ext_v6t2
18310
18311  TCE("smull",   0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18312   CM("smull","s",       0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18313  TCE("umull",   0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18314   CM("umull","s",       0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18315  TCE("smlal",   0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18316   CM("smlal","s",       0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18317  TCE("umlal",   0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18318   CM("umlal","s",       0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18319
18320 #undef  ARM_VARIANT
18321 #define ARM_VARIANT    & arm_ext_v4     /* ARM Architecture 4.  */
18322 #undef  THUMB_VARIANT
18323 #define THUMB_VARIANT  & arm_ext_v4t
18324
18325  tC3("ldrh",    01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18326  tC3("strh",    00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18327  tC3("ldrsh",   01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18328  tC3("ldrsb",   01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18329  tC3("ldsh",    01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18330  tC3("ldsb",    01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18331
18332 #undef  ARM_VARIANT
18333 #define ARM_VARIANT  & arm_ext_v4t_5
18334
18335   /* ARM Architecture 4T.  */
18336   /* Note: bx (and blx) are required on V5, even if the processor does
18337      not support Thumb.  */
18338  TCE("bx",      12fff10, 4700, 1, (RR), bx, t_bx),
18339
18340 #undef  ARM_VARIANT
18341 #define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.     */
18342 #undef  THUMB_VARIANT
18343 #define THUMB_VARIANT  & arm_ext_v5t
18344
18345   /* Note: blx has 2 variants; the .value coded here is for
18346      BLX(2).  Only this variant has conditional execution.  */
18347  TCE("blx",     12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
18348  TUE("bkpt",    1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
18349
18350 #undef  THUMB_VARIANT
18351 #define THUMB_VARIANT  & arm_ext_v6t2
18352
18353  TCE("clz",     16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
18354  TUF("ldc2",    c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18355  TUF("ldc2l",   c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
18356  TUF("stc2",    c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18357  TUF("stc2l",   c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
18358  TUF("cdp2",    e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
18359  TUF("mcr2",    e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18360  TUF("mrc2",    e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18361
18362 #undef  ARM_VARIANT
18363 #define ARM_VARIANT    & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
18364 #undef  THUMB_VARIANT
18365 #define THUMB_VARIANT  & arm_ext_v5exp
18366
18367  TCE("smlabb",  1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18368  TCE("smlatb",  10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18369  TCE("smlabt",  10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18370  TCE("smlatt",  10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18371
18372  TCE("smlawb",  1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18373  TCE("smlawt",  12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18374
18375  TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18376  TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18377  TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18378  TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18379
18380  TCE("smulbb",  1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18381  TCE("smultb",  16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18382  TCE("smulbt",  16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18383  TCE("smultt",  16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18384
18385  TCE("smulwb",  12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18386  TCE("smulwt",  12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18387
18388  TCE("qadd",    1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18389  TCE("qdadd",   1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18390  TCE("qsub",    1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18391  TCE("qdsub",   1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18392
18393 #undef  ARM_VARIANT
18394 #define ARM_VARIANT    & arm_ext_v5e /*  ARM Architecture 5TE.  */
18395 #undef  THUMB_VARIANT
18396 #define THUMB_VARIANT  & arm_ext_v6t2
18397
18398  TUF("pld",     450f000, f810f000, 1, (ADDR),                pld,  t_pld),
18399  TC3("ldrd",    00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
18400      ldrd, t_ldstd),
18401  TC3("strd",    00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
18402                                        ADDRGLDRS), ldrd, t_ldstd),
18403
18404  TCE("mcrr",    c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18405  TCE("mrrc",    c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18406
18407 #undef  ARM_VARIANT
18408 #define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
18409
18410  TCE("bxj",     12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
18411
18412 #undef  ARM_VARIANT
18413 #define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
18414 #undef  THUMB_VARIANT
18415 #define THUMB_VARIANT  & arm_ext_v6
18416
18417  TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
18418  TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
18419  tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18420  tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18421  tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18422  tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18423  tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18424  tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18425  tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18426  TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
18427
18428 #undef  THUMB_VARIANT
18429 #define THUMB_VARIANT  & arm_ext_v6t2
18430
18431  TCE("ldrex",   1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),        ldrex, t_ldrex),
18432  TCE("strex",   1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18433                                       strex,  t_strex),
18434  TUF("mcrr2",   c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18435  TUF("mrrc2",   c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18436
18437  TCE("ssat",    6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
18438  TCE("usat",    6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
18439
18440 /*  ARM V6 not included in V7M.  */
18441 #undef  THUMB_VARIANT
18442 #define THUMB_VARIANT  & arm_ext_v6_notm
18443  TUF("rfeia",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18444  TUF("rfe",     8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18445   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
18446   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
18447  TUF("rfedb",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
18448  TUF("rfefd",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18449   UF(rfefa,     8100a00,           1, (RRw),                       rfe),
18450  TUF("rfeea",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
18451   UF(rfeed,     9900a00,           1, (RRw),                       rfe),
18452  TUF("srsia",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18453  TUF("srs",     8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18454  TUF("srsea",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18455   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
18456   UF(srsfa,     9c00500,           2, (oRRw, I31w),                srs),
18457   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
18458   UF(srsed,     8400500,           2, (oRRw, I31w),                srs),
18459  TUF("srsdb",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
18460  TUF("srsfd",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
18461
18462 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
18463 #undef  THUMB_VARIANT
18464 #define THUMB_VARIANT  & arm_ext_v6_dsp
18465  TUF("cps",     1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
18466  TCE("pkhbt",   6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
18467  TCE("pkhtb",   6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
18468  TCE("qadd16",  6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18469  TCE("qadd8",   6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18470  TCE("qasx",    6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18471  /* Old name for QASX.  */
18472  TCE("qaddsubx",6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18473  TCE("qsax",    6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18474  /* Old name for QSAX.  */
18475  TCE("qsubaddx",6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18476  TCE("qsub16",  6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18477  TCE("qsub8",   6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18478  TCE("sadd16",  6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18479  TCE("sadd8",   6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18480  TCE("sasx",    6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18481  /* Old name for SASX.  */
18482  TCE("saddsubx",6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18483  TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18484  TCE("shadd8",  6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18485  TCE("shasx",   6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18486  /* Old name for SHASX.  */
18487  TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18488  TCE("shsax",     6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18489  /* Old name for SHSAX.  */
18490  TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18491  TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18492  TCE("shsub8",  6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18493  TCE("ssax",    6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18494  /* Old name for SSAX.  */
18495  TCE("ssubaddx",6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18496  TCE("ssub16",  6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18497  TCE("ssub8",   6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18498  TCE("uadd16",  6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18499  TCE("uadd8",   6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18500  TCE("uasx",    6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18501  /* Old name for UASX.  */
18502  TCE("uaddsubx",6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18503  TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18504  TCE("uhadd8",  6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18505  TCE("uhasx",   6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18506  /* Old name for UHASX.  */
18507  TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18508  TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18509  /* Old name for UHSAX.  */
18510  TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18511  TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18512  TCE("uhsub8",  6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18513  TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18514  TCE("uqadd8",  6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18515  TCE("uqasx",   6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18516  /* Old name for UQASX.  */
18517  TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18518  TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18519  /* Old name for UQSAX.  */
18520  TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18521  TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18522  TCE("uqsub8",  6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18523  TCE("usub16",  6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18524  TCE("usax",    6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18525  /* Old name for USAX.  */
18526  TCE("usubaddx",6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18527  TCE("usub8",   6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18528  TCE("sxtah",   6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18529  TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18530  TCE("sxtab",   6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18531  TCE("sxtb16",  68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
18532  TCE("uxtah",   6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18533  TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18534  TCE("uxtab",   6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18535  TCE("uxtb16",  6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
18536  TCE("sel",     6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18537  TCE("smlad",   7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18538  TCE("smladx",  7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18539  TCE("smlald",  7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18540  TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18541  TCE("smlsd",   7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18542  TCE("smlsdx",  7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18543  TCE("smlsld",  7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18544  TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18545  TCE("smmla",   7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18546  TCE("smmlar",  7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18547  TCE("smmls",   75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18548  TCE("smmlsr",  75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18549  TCE("smmul",   750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18550  TCE("smmulr",  750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18551  TCE("smuad",   700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18552  TCE("smuadx",  700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18553  TCE("smusd",   700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18554  TCE("smusdx",  700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18555  TCE("ssat16",  6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
18556  TCE("umaal",   0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
18557  TCE("usad8",   780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
18558  TCE("usada8",  7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
18559  TCE("usat16",  6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
18560
18561 #undef  ARM_VARIANT
18562 #define ARM_VARIANT   & arm_ext_v6k
18563 #undef  THUMB_VARIANT
18564 #define THUMB_VARIANT & arm_ext_v6k
18565
18566  tCE("yield",   320f001, _yield,    0, (), noargs, t_hint),
18567  tCE("wfe",     320f002, _wfe,      0, (), noargs, t_hint),
18568  tCE("wfi",     320f003, _wfi,      0, (), noargs, t_hint),
18569  tCE("sev",     320f004, _sev,      0, (), noargs, t_hint),
18570
18571 #undef  THUMB_VARIANT
18572 #define THUMB_VARIANT  & arm_ext_v6_notm
18573  TCE("ldrexd",  1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
18574                                       ldrexd, t_ldrexd),
18575  TCE("strexd",  1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
18576                                        RRnpcb), strexd, t_strexd),
18577
18578 #undef  THUMB_VARIANT
18579 #define THUMB_VARIANT  & arm_ext_v6t2
18580  TCE("ldrexb",  1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
18581      rd_rn,  rd_rn),
18582  TCE("ldrexh",  1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
18583      rd_rn,  rd_rn),
18584  TCE("strexb",  1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18585      strex, t_strexbh),
18586  TCE("strexh",  1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18587      strex, t_strexbh),
18588  TUF("clrex",   57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
18589
18590 #undef  ARM_VARIANT
18591 #define ARM_VARIANT    & arm_ext_sec
18592 #undef  THUMB_VARIANT
18593 #define THUMB_VARIANT  & arm_ext_sec
18594
18595  TCE("smc",     1600070, f7f08000, 1, (EXPi), smc, t_smc),
18596
18597 #undef  ARM_VARIANT
18598 #define ARM_VARIANT    & arm_ext_virt
18599 #undef  THUMB_VARIANT
18600 #define THUMB_VARIANT    & arm_ext_virt
18601
18602  TCE("hvc",     1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
18603  TCE("eret",    160006e, f3de8f00, 0, (), noargs, noargs),
18604
18605 #undef  ARM_VARIANT
18606 #define ARM_VARIANT    & arm_ext_v6t2
18607 #undef  THUMB_VARIANT
18608 #define THUMB_VARIANT  & arm_ext_v6t2
18609
18610  TCE("bfc",     7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
18611  TCE("bfi",     7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
18612  TCE("sbfx",    7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
18613  TCE("ubfx",    7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
18614
18615  TCE("mls",     0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
18616  TCE("movw",    3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
18617  TCE("movt",    3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
18618  TCE("rbit",    6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
18619
18620  TC3("ldrht",   03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18621  TC3("ldrsht",  03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18622  TC3("ldrsbt",  03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18623  TC3("strht",   02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18624
18625  /* Thumb-only instructions.  */
18626 #undef  ARM_VARIANT
18627 #define ARM_VARIANT NULL
18628   TUE("cbnz",     0,           b900,     2, (RR, EXP), 0, t_cbz),
18629   TUE("cbz",      0,           b100,     2, (RR, EXP), 0, t_cbz),
18630
18631  /* ARM does not really have an IT instruction, so always allow it.
18632     The opcode is copied from Thumb in order to allow warnings in
18633     -mimplicit-it=[never | arm] modes.  */
18634 #undef  ARM_VARIANT
18635 #define ARM_VARIANT  & arm_ext_v1
18636
18637  TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
18638  TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
18639  TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
18640  TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
18641  TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
18642  TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
18643  TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
18644  TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
18645  TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
18646  TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
18647  TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
18648  TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
18649  TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
18650  TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
18651  TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
18652  /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
18653  TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
18654  TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
18655
18656  /* Thumb2 only instructions.  */
18657 #undef  ARM_VARIANT
18658 #define ARM_VARIANT  NULL
18659
18660  TCE("addw",    0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18661  TCE("subw",    0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18662  TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
18663  TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
18664  TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
18665  TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
18666
18667  /* Hardware division instructions.  */
18668 #undef  ARM_VARIANT
18669 #define ARM_VARIANT    & arm_ext_adiv
18670 #undef  THUMB_VARIANT
18671 #define THUMB_VARIANT  & arm_ext_div
18672
18673  TCE("sdiv",    710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
18674  TCE("udiv",    730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
18675
18676  /* ARM V6M/V7 instructions.  */
18677 #undef  ARM_VARIANT
18678 #define ARM_VARIANT    & arm_ext_barrier
18679 #undef  THUMB_VARIANT
18680 #define THUMB_VARIANT  & arm_ext_barrier
18681
18682  TUF("dmb",     57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, barrier),
18683  TUF("dsb",     57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, barrier),
18684  TUF("isb",     57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, barrier),
18685
18686  /* ARM V7 instructions.  */
18687 #undef  ARM_VARIANT
18688 #define ARM_VARIANT    & arm_ext_v7
18689 #undef  THUMB_VARIANT
18690 #define THUMB_VARIANT  & arm_ext_v7
18691
18692  TUF("pli",     450f000, f910f000, 1, (ADDR),     pli,      t_pld),
18693  TCE("dbg",     320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
18694
18695 #undef  ARM_VARIANT
18696 #define ARM_VARIANT    & arm_ext_mp
18697 #undef  THUMB_VARIANT
18698 #define THUMB_VARIANT  & arm_ext_mp
18699
18700  TUF("pldw",    410f000, f830f000, 1, (ADDR),   pld,    t_pld),
18701
18702  /* AArchv8 instructions.  */
18703 #undef  ARM_VARIANT
18704 #define ARM_VARIANT   & arm_ext_v8
18705 #undef  THUMB_VARIANT
18706 #define THUMB_VARIANT & arm_ext_v8
18707
18708  tCE("sevl",    320f005, _sevl,    0, (),               noargs, t_hint),
18709  TUE("hlt",     1000070, ba80,     1, (oIffffb),        bkpt,   t_hlt),
18710  TCE("ldaex",   1900e9f, e8d00fef, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18711  TCE("ldaexd",  1b00e9f, e8d000ff, 3, (RRnpc, oRRnpc, RRnpcb),
18712                                                         ldrexd, t_ldrexd),
18713  TCE("ldaexb",  1d00e9f, e8d00fcf, 2, (RRnpc,RRnpcb),   rd_rn,  rd_rn),
18714  TCE("ldaexh",  1f00e9f, e8d00fdf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18715  TCE("stlex",   1800e90, e8c00fe0, 3, (RRnpc, RRnpc, RRnpcb),
18716                                                         stlex,  t_stlex),
18717  TCE("stlexd",  1a00e90, e8c000f0, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb),
18718                                                         strexd, t_strexd),
18719  TCE("stlexb",  1c00e90, e8c00fc0, 3, (RRnpc, RRnpc, RRnpcb),
18720                                                         stlex, t_stlex),
18721  TCE("stlexh",  1e00e90, e8c00fd0, 3, (RRnpc, RRnpc, RRnpcb),
18722                                                         stlex, t_stlex),
18723  TCE("lda",     1900c9f, e8d00faf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18724  TCE("ldab",    1d00c9f, e8d00f8f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18725  TCE("ldah",    1f00c9f, e8d00f9f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18726  TCE("stl",     180fc90, e8c00faf, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18727  TCE("stlb",    1c0fc90, e8c00f8f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18728  TCE("stlh",    1e0fc90, e8c00f9f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18729
18730  /* ARMv8 T32 only.  */
18731 #undef  ARM_VARIANT
18732 #define ARM_VARIANT  NULL
18733  TUF("dcps1",   0,       f78f8001, 0, (),       noargs, noargs),
18734  TUF("dcps2",   0,       f78f8002, 0, (),       noargs, noargs),
18735  TUF("dcps3",   0,       f78f8003, 0, (),       noargs, noargs),
18736
18737   /* FP for ARMv8.  */
18738 #undef  ARM_VARIANT
18739 #define ARM_VARIANT   & fpu_vfp_ext_armv8
18740 #undef  THUMB_VARIANT
18741 #define THUMB_VARIANT & fpu_vfp_ext_armv8
18742
18743   nUF(vseleq, _vseleq, 3, (RVSD, RVSD, RVSD),           vsel),
18744   nUF(vselvs, _vselvs, 3, (RVSD, RVSD, RVSD),           vsel),
18745   nUF(vselge, _vselge, 3, (RVSD, RVSD, RVSD),           vsel),
18746   nUF(vselgt, _vselgt, 3, (RVSD, RVSD, RVSD),           vsel),
18747   nUF(vmaxnm, _vmaxnm, 3, (RNSDQ, oRNSDQ, RNSDQ),       vmaxnm),
18748   nUF(vminnm, _vminnm, 3, (RNSDQ, oRNSDQ, RNSDQ),       vmaxnm),
18749   nUF(vcvta,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvta),
18750   nUF(vcvtn,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtn),
18751   nUF(vcvtp,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtp),
18752   nUF(vcvtm,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtm),
18753   nCE(vrintr, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintr),
18754   nCE(vrintz, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintz),
18755   nCE(vrintx, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintx),
18756   nUF(vrinta, _vrinta, 2, (RNSDQ, oRNSDQ),              vrinta),
18757   nUF(vrintn, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintn),
18758   nUF(vrintp, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintp),
18759   nUF(vrintm, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintm),
18760
18761   /* Crypto v1 extensions.  */
18762 #undef  ARM_VARIANT
18763 #define ARM_VARIANT & fpu_crypto_ext_armv8
18764 #undef  THUMB_VARIANT
18765 #define THUMB_VARIANT & fpu_crypto_ext_armv8
18766
18767   nUF(aese, _aes, 2, (RNQ, RNQ), aese),
18768   nUF(aesd, _aes, 2, (RNQ, RNQ), aesd),
18769   nUF(aesmc, _aes, 2, (RNQ, RNQ), aesmc),
18770   nUF(aesimc, _aes, 2, (RNQ, RNQ), aesimc),
18771   nUF(sha1c, _sha3op, 3, (RNQ, RNQ, RNQ), sha1c),
18772   nUF(sha1p, _sha3op, 3, (RNQ, RNQ, RNQ), sha1p),
18773   nUF(sha1m, _sha3op, 3, (RNQ, RNQ, RNQ), sha1m),
18774   nUF(sha1su0, _sha3op, 3, (RNQ, RNQ, RNQ), sha1su0),
18775   nUF(sha256h, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h),
18776   nUF(sha256h2, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h2),
18777   nUF(sha256su1, _sha3op, 3, (RNQ, RNQ, RNQ), sha256su1),
18778   nUF(sha1h, _sha1h, 2, (RNQ, RNQ), sha1h),
18779   nUF(sha1su1, _sha2op, 2, (RNQ, RNQ), sha1su1),
18780   nUF(sha256su0, _sha2op, 2, (RNQ, RNQ), sha256su0),
18781
18782 #undef  ARM_VARIANT
18783 #define ARM_VARIANT   & crc_ext_armv8
18784 #undef  THUMB_VARIANT
18785 #define THUMB_VARIANT & crc_ext_armv8
18786   TUEc("crc32b", 1000040, fac0f080, 3, (RR, oRR, RR), crc32b),
18787   TUEc("crc32h", 1200040, fac0f090, 3, (RR, oRR, RR), crc32h),
18788   TUEc("crc32w", 1400040, fac0f0a0, 3, (RR, oRR, RR), crc32w),
18789   TUEc("crc32cb",1000240, fad0f080, 3, (RR, oRR, RR), crc32cb),
18790   TUEc("crc32ch",1200240, fad0f090, 3, (RR, oRR, RR), crc32ch),
18791   TUEc("crc32cw",1400240, fad0f0a0, 3, (RR, oRR, RR), crc32cw),
18792
18793 #undef  ARM_VARIANT
18794 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
18795 #undef  THUMB_VARIANT
18796 #define THUMB_VARIANT NULL
18797
18798  cCE("wfs",     e200110, 1, (RR),            rd),
18799  cCE("rfs",     e300110, 1, (RR),            rd),
18800  cCE("wfc",     e400110, 1, (RR),            rd),
18801  cCE("rfc",     e500110, 1, (RR),            rd),
18802
18803  cCL("ldfs",    c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18804  cCL("ldfd",    c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18805  cCL("ldfe",    c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18806  cCL("ldfp",    c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18807
18808  cCL("stfs",    c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18809  cCL("stfd",    c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18810  cCL("stfe",    c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18811  cCL("stfp",    c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18812
18813  cCL("mvfs",    e008100, 2, (RF, RF_IF),     rd_rm),
18814  cCL("mvfsp",   e008120, 2, (RF, RF_IF),     rd_rm),
18815  cCL("mvfsm",   e008140, 2, (RF, RF_IF),     rd_rm),
18816  cCL("mvfsz",   e008160, 2, (RF, RF_IF),     rd_rm),
18817  cCL("mvfd",    e008180, 2, (RF, RF_IF),     rd_rm),
18818  cCL("mvfdp",   e0081a0, 2, (RF, RF_IF),     rd_rm),
18819  cCL("mvfdm",   e0081c0, 2, (RF, RF_IF),     rd_rm),
18820  cCL("mvfdz",   e0081e0, 2, (RF, RF_IF),     rd_rm),
18821  cCL("mvfe",    e088100, 2, (RF, RF_IF),     rd_rm),
18822  cCL("mvfep",   e088120, 2, (RF, RF_IF),     rd_rm),
18823  cCL("mvfem",   e088140, 2, (RF, RF_IF),     rd_rm),
18824  cCL("mvfez",   e088160, 2, (RF, RF_IF),     rd_rm),
18825
18826  cCL("mnfs",    e108100, 2, (RF, RF_IF),     rd_rm),
18827  cCL("mnfsp",   e108120, 2, (RF, RF_IF),     rd_rm),
18828  cCL("mnfsm",   e108140, 2, (RF, RF_IF),     rd_rm),
18829  cCL("mnfsz",   e108160, 2, (RF, RF_IF),     rd_rm),
18830  cCL("mnfd",    e108180, 2, (RF, RF_IF),     rd_rm),
18831  cCL("mnfdp",   e1081a0, 2, (RF, RF_IF),     rd_rm),
18832  cCL("mnfdm",   e1081c0, 2, (RF, RF_IF),     rd_rm),
18833  cCL("mnfdz",   e1081e0, 2, (RF, RF_IF),     rd_rm),
18834  cCL("mnfe",    e188100, 2, (RF, RF_IF),     rd_rm),
18835  cCL("mnfep",   e188120, 2, (RF, RF_IF),     rd_rm),
18836  cCL("mnfem",   e188140, 2, (RF, RF_IF),     rd_rm),
18837  cCL("mnfez",   e188160, 2, (RF, RF_IF),     rd_rm),
18838
18839  cCL("abss",    e208100, 2, (RF, RF_IF),     rd_rm),
18840  cCL("abssp",   e208120, 2, (RF, RF_IF),     rd_rm),
18841  cCL("abssm",   e208140, 2, (RF, RF_IF),     rd_rm),
18842  cCL("abssz",   e208160, 2, (RF, RF_IF),     rd_rm),
18843  cCL("absd",    e208180, 2, (RF, RF_IF),     rd_rm),
18844  cCL("absdp",   e2081a0, 2, (RF, RF_IF),     rd_rm),
18845  cCL("absdm",   e2081c0, 2, (RF, RF_IF),     rd_rm),
18846  cCL("absdz",   e2081e0, 2, (RF, RF_IF),     rd_rm),
18847  cCL("abse",    e288100, 2, (RF, RF_IF),     rd_rm),
18848  cCL("absep",   e288120, 2, (RF, RF_IF),     rd_rm),
18849  cCL("absem",   e288140, 2, (RF, RF_IF),     rd_rm),
18850  cCL("absez",   e288160, 2, (RF, RF_IF),     rd_rm),
18851
18852  cCL("rnds",    e308100, 2, (RF, RF_IF),     rd_rm),
18853  cCL("rndsp",   e308120, 2, (RF, RF_IF),     rd_rm),
18854  cCL("rndsm",   e308140, 2, (RF, RF_IF),     rd_rm),
18855  cCL("rndsz",   e308160, 2, (RF, RF_IF),     rd_rm),
18856  cCL("rndd",    e308180, 2, (RF, RF_IF),     rd_rm),
18857  cCL("rnddp",   e3081a0, 2, (RF, RF_IF),     rd_rm),
18858  cCL("rnddm",   e3081c0, 2, (RF, RF_IF),     rd_rm),
18859  cCL("rnddz",   e3081e0, 2, (RF, RF_IF),     rd_rm),
18860  cCL("rnde",    e388100, 2, (RF, RF_IF),     rd_rm),
18861  cCL("rndep",   e388120, 2, (RF, RF_IF),     rd_rm),
18862  cCL("rndem",   e388140, 2, (RF, RF_IF),     rd_rm),
18863  cCL("rndez",   e388160, 2, (RF, RF_IF),     rd_rm),
18864
18865  cCL("sqts",    e408100, 2, (RF, RF_IF),     rd_rm),
18866  cCL("sqtsp",   e408120, 2, (RF, RF_IF),     rd_rm),
18867  cCL("sqtsm",   e408140, 2, (RF, RF_IF),     rd_rm),
18868  cCL("sqtsz",   e408160, 2, (RF, RF_IF),     rd_rm),
18869  cCL("sqtd",    e408180, 2, (RF, RF_IF),     rd_rm),
18870  cCL("sqtdp",   e4081a0, 2, (RF, RF_IF),     rd_rm),
18871  cCL("sqtdm",   e4081c0, 2, (RF, RF_IF),     rd_rm),
18872  cCL("sqtdz",   e4081e0, 2, (RF, RF_IF),     rd_rm),
18873  cCL("sqte",    e488100, 2, (RF, RF_IF),     rd_rm),
18874  cCL("sqtep",   e488120, 2, (RF, RF_IF),     rd_rm),
18875  cCL("sqtem",   e488140, 2, (RF, RF_IF),     rd_rm),
18876  cCL("sqtez",   e488160, 2, (RF, RF_IF),     rd_rm),
18877
18878  cCL("logs",    e508100, 2, (RF, RF_IF),     rd_rm),
18879  cCL("logsp",   e508120, 2, (RF, RF_IF),     rd_rm),
18880  cCL("logsm",   e508140, 2, (RF, RF_IF),     rd_rm),
18881  cCL("logsz",   e508160, 2, (RF, RF_IF),     rd_rm),
18882  cCL("logd",    e508180, 2, (RF, RF_IF),     rd_rm),
18883  cCL("logdp",   e5081a0, 2, (RF, RF_IF),     rd_rm),
18884  cCL("logdm",   e5081c0, 2, (RF, RF_IF),     rd_rm),
18885  cCL("logdz",   e5081e0, 2, (RF, RF_IF),     rd_rm),
18886  cCL("loge",    e588100, 2, (RF, RF_IF),     rd_rm),
18887  cCL("logep",   e588120, 2, (RF, RF_IF),     rd_rm),
18888  cCL("logem",   e588140, 2, (RF, RF_IF),     rd_rm),
18889  cCL("logez",   e588160, 2, (RF, RF_IF),     rd_rm),
18890
18891  cCL("lgns",    e608100, 2, (RF, RF_IF),     rd_rm),
18892  cCL("lgnsp",   e608120, 2, (RF, RF_IF),     rd_rm),
18893  cCL("lgnsm",   e608140, 2, (RF, RF_IF),     rd_rm),
18894  cCL("lgnsz",   e608160, 2, (RF, RF_IF),     rd_rm),
18895  cCL("lgnd",    e608180, 2, (RF, RF_IF),     rd_rm),
18896  cCL("lgndp",   e6081a0, 2, (RF, RF_IF),     rd_rm),
18897  cCL("lgndm",   e6081c0, 2, (RF, RF_IF),     rd_rm),
18898  cCL("lgndz",   e6081e0, 2, (RF, RF_IF),     rd_rm),
18899  cCL("lgne",    e688100, 2, (RF, RF_IF),     rd_rm),
18900  cCL("lgnep",   e688120, 2, (RF, RF_IF),     rd_rm),
18901  cCL("lgnem",   e688140, 2, (RF, RF_IF),     rd_rm),
18902  cCL("lgnez",   e688160, 2, (RF, RF_IF),     rd_rm),
18903
18904  cCL("exps",    e708100, 2, (RF, RF_IF),     rd_rm),
18905  cCL("expsp",   e708120, 2, (RF, RF_IF),     rd_rm),
18906  cCL("expsm",   e708140, 2, (RF, RF_IF),     rd_rm),
18907  cCL("expsz",   e708160, 2, (RF, RF_IF),     rd_rm),
18908  cCL("expd",    e708180, 2, (RF, RF_IF),     rd_rm),
18909  cCL("expdp",   e7081a0, 2, (RF, RF_IF),     rd_rm),
18910  cCL("expdm",   e7081c0, 2, (RF, RF_IF),     rd_rm),
18911  cCL("expdz",   e7081e0, 2, (RF, RF_IF),     rd_rm),
18912  cCL("expe",    e788100, 2, (RF, RF_IF),     rd_rm),
18913  cCL("expep",   e788120, 2, (RF, RF_IF),     rd_rm),
18914  cCL("expem",   e788140, 2, (RF, RF_IF),     rd_rm),
18915  cCL("expdz",   e788160, 2, (RF, RF_IF),     rd_rm),
18916
18917  cCL("sins",    e808100, 2, (RF, RF_IF),     rd_rm),
18918  cCL("sinsp",   e808120, 2, (RF, RF_IF),     rd_rm),
18919  cCL("sinsm",   e808140, 2, (RF, RF_IF),     rd_rm),
18920  cCL("sinsz",   e808160, 2, (RF, RF_IF),     rd_rm),
18921  cCL("sind",    e808180, 2, (RF, RF_IF),     rd_rm),
18922  cCL("sindp",   e8081a0, 2, (RF, RF_IF),     rd_rm),
18923  cCL("sindm",   e8081c0, 2, (RF, RF_IF),     rd_rm),
18924  cCL("sindz",   e8081e0, 2, (RF, RF_IF),     rd_rm),
18925  cCL("sine",    e888100, 2, (RF, RF_IF),     rd_rm),
18926  cCL("sinep",   e888120, 2, (RF, RF_IF),     rd_rm),
18927  cCL("sinem",   e888140, 2, (RF, RF_IF),     rd_rm),
18928  cCL("sinez",   e888160, 2, (RF, RF_IF),     rd_rm),
18929
18930  cCL("coss",    e908100, 2, (RF, RF_IF),     rd_rm),
18931  cCL("cossp",   e908120, 2, (RF, RF_IF),     rd_rm),
18932  cCL("cossm",   e908140, 2, (RF, RF_IF),     rd_rm),
18933  cCL("cossz",   e908160, 2, (RF, RF_IF),     rd_rm),
18934  cCL("cosd",    e908180, 2, (RF, RF_IF),     rd_rm),
18935  cCL("cosdp",   e9081a0, 2, (RF, RF_IF),     rd_rm),
18936  cCL("cosdm",   e9081c0, 2, (RF, RF_IF),     rd_rm),
18937  cCL("cosdz",   e9081e0, 2, (RF, RF_IF),     rd_rm),
18938  cCL("cose",    e988100, 2, (RF, RF_IF),     rd_rm),
18939  cCL("cosep",   e988120, 2, (RF, RF_IF),     rd_rm),
18940  cCL("cosem",   e988140, 2, (RF, RF_IF),     rd_rm),
18941  cCL("cosez",   e988160, 2, (RF, RF_IF),     rd_rm),
18942
18943  cCL("tans",    ea08100, 2, (RF, RF_IF),     rd_rm),
18944  cCL("tansp",   ea08120, 2, (RF, RF_IF),     rd_rm),
18945  cCL("tansm",   ea08140, 2, (RF, RF_IF),     rd_rm),
18946  cCL("tansz",   ea08160, 2, (RF, RF_IF),     rd_rm),
18947  cCL("tand",    ea08180, 2, (RF, RF_IF),     rd_rm),
18948  cCL("tandp",   ea081a0, 2, (RF, RF_IF),     rd_rm),
18949  cCL("tandm",   ea081c0, 2, (RF, RF_IF),     rd_rm),
18950  cCL("tandz",   ea081e0, 2, (RF, RF_IF),     rd_rm),
18951  cCL("tane",    ea88100, 2, (RF, RF_IF),     rd_rm),
18952  cCL("tanep",   ea88120, 2, (RF, RF_IF),     rd_rm),
18953  cCL("tanem",   ea88140, 2, (RF, RF_IF),     rd_rm),
18954  cCL("tanez",   ea88160, 2, (RF, RF_IF),     rd_rm),
18955
18956  cCL("asns",    eb08100, 2, (RF, RF_IF),     rd_rm),
18957  cCL("asnsp",   eb08120, 2, (RF, RF_IF),     rd_rm),
18958  cCL("asnsm",   eb08140, 2, (RF, RF_IF),     rd_rm),
18959  cCL("asnsz",   eb08160, 2, (RF, RF_IF),     rd_rm),
18960  cCL("asnd",    eb08180, 2, (RF, RF_IF),     rd_rm),
18961  cCL("asndp",   eb081a0, 2, (RF, RF_IF),     rd_rm),
18962  cCL("asndm",   eb081c0, 2, (RF, RF_IF),     rd_rm),
18963  cCL("asndz",   eb081e0, 2, (RF, RF_IF),     rd_rm),
18964  cCL("asne",    eb88100, 2, (RF, RF_IF),     rd_rm),
18965  cCL("asnep",   eb88120, 2, (RF, RF_IF),     rd_rm),
18966  cCL("asnem",   eb88140, 2, (RF, RF_IF),     rd_rm),
18967  cCL("asnez",   eb88160, 2, (RF, RF_IF),     rd_rm),
18968
18969  cCL("acss",    ec08100, 2, (RF, RF_IF),     rd_rm),
18970  cCL("acssp",   ec08120, 2, (RF, RF_IF),     rd_rm),
18971  cCL("acssm",   ec08140, 2, (RF, RF_IF),     rd_rm),
18972  cCL("acssz",   ec08160, 2, (RF, RF_IF),     rd_rm),
18973  cCL("acsd",    ec08180, 2, (RF, RF_IF),     rd_rm),
18974  cCL("acsdp",   ec081a0, 2, (RF, RF_IF),     rd_rm),
18975  cCL("acsdm",   ec081c0, 2, (RF, RF_IF),     rd_rm),
18976  cCL("acsdz",   ec081e0, 2, (RF, RF_IF),     rd_rm),
18977  cCL("acse",    ec88100, 2, (RF, RF_IF),     rd_rm),
18978  cCL("acsep",   ec88120, 2, (RF, RF_IF),     rd_rm),
18979  cCL("acsem",   ec88140, 2, (RF, RF_IF),     rd_rm),
18980  cCL("acsez",   ec88160, 2, (RF, RF_IF),     rd_rm),
18981
18982  cCL("atns",    ed08100, 2, (RF, RF_IF),     rd_rm),
18983  cCL("atnsp",   ed08120, 2, (RF, RF_IF),     rd_rm),
18984  cCL("atnsm",   ed08140, 2, (RF, RF_IF),     rd_rm),
18985  cCL("atnsz",   ed08160, 2, (RF, RF_IF),     rd_rm),
18986  cCL("atnd",    ed08180, 2, (RF, RF_IF),     rd_rm),
18987  cCL("atndp",   ed081a0, 2, (RF, RF_IF),     rd_rm),
18988  cCL("atndm",   ed081c0, 2, (RF, RF_IF),     rd_rm),
18989  cCL("atndz",   ed081e0, 2, (RF, RF_IF),     rd_rm),
18990  cCL("atne",    ed88100, 2, (RF, RF_IF),     rd_rm),
18991  cCL("atnep",   ed88120, 2, (RF, RF_IF),     rd_rm),
18992  cCL("atnem",   ed88140, 2, (RF, RF_IF),     rd_rm),
18993  cCL("atnez",   ed88160, 2, (RF, RF_IF),     rd_rm),
18994
18995  cCL("urds",    ee08100, 2, (RF, RF_IF),     rd_rm),
18996  cCL("urdsp",   ee08120, 2, (RF, RF_IF),     rd_rm),
18997  cCL("urdsm",   ee08140, 2, (RF, RF_IF),     rd_rm),
18998  cCL("urdsz",   ee08160, 2, (RF, RF_IF),     rd_rm),
18999  cCL("urdd",    ee08180, 2, (RF, RF_IF),     rd_rm),
19000  cCL("urddp",   ee081a0, 2, (RF, RF_IF),     rd_rm),
19001  cCL("urddm",   ee081c0, 2, (RF, RF_IF),     rd_rm),
19002  cCL("urddz",   ee081e0, 2, (RF, RF_IF),     rd_rm),
19003  cCL("urde",    ee88100, 2, (RF, RF_IF),     rd_rm),
19004  cCL("urdep",   ee88120, 2, (RF, RF_IF),     rd_rm),
19005  cCL("urdem",   ee88140, 2, (RF, RF_IF),     rd_rm),
19006  cCL("urdez",   ee88160, 2, (RF, RF_IF),     rd_rm),
19007
19008  cCL("nrms",    ef08100, 2, (RF, RF_IF),     rd_rm),
19009  cCL("nrmsp",   ef08120, 2, (RF, RF_IF),     rd_rm),
19010  cCL("nrmsm",   ef08140, 2, (RF, RF_IF),     rd_rm),
19011  cCL("nrmsz",   ef08160, 2, (RF, RF_IF),     rd_rm),
19012  cCL("nrmd",    ef08180, 2, (RF, RF_IF),     rd_rm),
19013  cCL("nrmdp",   ef081a0, 2, (RF, RF_IF),     rd_rm),
19014  cCL("nrmdm",   ef081c0, 2, (RF, RF_IF),     rd_rm),
19015  cCL("nrmdz",   ef081e0, 2, (RF, RF_IF),     rd_rm),
19016  cCL("nrme",    ef88100, 2, (RF, RF_IF),     rd_rm),
19017  cCL("nrmep",   ef88120, 2, (RF, RF_IF),     rd_rm),
19018  cCL("nrmem",   ef88140, 2, (RF, RF_IF),     rd_rm),
19019  cCL("nrmez",   ef88160, 2, (RF, RF_IF),     rd_rm),
19020
19021  cCL("adfs",    e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
19022  cCL("adfsp",   e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
19023  cCL("adfsm",   e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
19024  cCL("adfsz",   e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
19025  cCL("adfd",    e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
19026  cCL("adfdp",   e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19027  cCL("adfdm",   e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19028  cCL("adfdz",   e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19029  cCL("adfe",    e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
19030  cCL("adfep",   e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
19031  cCL("adfem",   e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
19032  cCL("adfez",   e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
19033
19034  cCL("sufs",    e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
19035  cCL("sufsp",   e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
19036  cCL("sufsm",   e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
19037  cCL("sufsz",   e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
19038  cCL("sufd",    e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
19039  cCL("sufdp",   e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19040  cCL("sufdm",   e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19041  cCL("sufdz",   e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19042  cCL("sufe",    e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
19043  cCL("sufep",   e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
19044  cCL("sufem",   e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
19045  cCL("sufez",   e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
19046
19047  cCL("rsfs",    e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
19048  cCL("rsfsp",   e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
19049  cCL("rsfsm",   e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
19050  cCL("rsfsz",   e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
19051  cCL("rsfd",    e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
19052  cCL("rsfdp",   e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19053  cCL("rsfdm",   e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19054  cCL("rsfdz",   e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19055  cCL("rsfe",    e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
19056  cCL("rsfep",   e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
19057  cCL("rsfem",   e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
19058  cCL("rsfez",   e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
19059
19060  cCL("mufs",    e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
19061  cCL("mufsp",   e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
19062  cCL("mufsm",   e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
19063  cCL("mufsz",   e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
19064  cCL("mufd",    e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
19065  cCL("mufdp",   e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19066  cCL("mufdm",   e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19067  cCL("mufdz",   e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19068  cCL("mufe",    e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
19069  cCL("mufep",   e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
19070  cCL("mufem",   e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
19071  cCL("mufez",   e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
19072
19073  cCL("dvfs",    e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
19074  cCL("dvfsp",   e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
19075  cCL("dvfsm",   e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
19076  cCL("dvfsz",   e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
19077  cCL("dvfd",    e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
19078  cCL("dvfdp",   e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19079  cCL("dvfdm",   e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19080  cCL("dvfdz",   e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19081  cCL("dvfe",    e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
19082  cCL("dvfep",   e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
19083  cCL("dvfem",   e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
19084  cCL("dvfez",   e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
19085
19086  cCL("rdfs",    e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
19087  cCL("rdfsp",   e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
19088  cCL("rdfsm",   e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
19089  cCL("rdfsz",   e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
19090  cCL("rdfd",    e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
19091  cCL("rdfdp",   e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19092  cCL("rdfdm",   e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19093  cCL("rdfdz",   e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19094  cCL("rdfe",    e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
19095  cCL("rdfep",   e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
19096  cCL("rdfem",   e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
19097  cCL("rdfez",   e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
19098
19099  cCL("pows",    e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
19100  cCL("powsp",   e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
19101  cCL("powsm",   e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
19102  cCL("powsz",   e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
19103  cCL("powd",    e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
19104  cCL("powdp",   e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19105  cCL("powdm",   e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19106  cCL("powdz",   e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19107  cCL("powe",    e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
19108  cCL("powep",   e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
19109  cCL("powem",   e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
19110  cCL("powez",   e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
19111
19112  cCL("rpws",    e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
19113  cCL("rpwsp",   e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
19114  cCL("rpwsm",   e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
19115  cCL("rpwsz",   e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
19116  cCL("rpwd",    e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
19117  cCL("rpwdp",   e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19118  cCL("rpwdm",   e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19119  cCL("rpwdz",   e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19120  cCL("rpwe",    e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
19121  cCL("rpwep",   e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
19122  cCL("rpwem",   e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
19123  cCL("rpwez",   e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
19124
19125  cCL("rmfs",    e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
19126  cCL("rmfsp",   e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
19127  cCL("rmfsm",   e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
19128  cCL("rmfsz",   e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
19129  cCL("rmfd",    e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
19130  cCL("rmfdp",   e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19131  cCL("rmfdm",   e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19132  cCL("rmfdz",   e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19133  cCL("rmfe",    e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
19134  cCL("rmfep",   e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
19135  cCL("rmfem",   e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
19136  cCL("rmfez",   e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
19137
19138  cCL("fmls",    e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
19139  cCL("fmlsp",   e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
19140  cCL("fmlsm",   e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
19141  cCL("fmlsz",   e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
19142  cCL("fmld",    e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
19143  cCL("fmldp",   e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19144  cCL("fmldm",   e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19145  cCL("fmldz",   e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19146  cCL("fmle",    e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
19147  cCL("fmlep",   e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
19148  cCL("fmlem",   e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
19149  cCL("fmlez",   e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
19150
19151  cCL("fdvs",    ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19152  cCL("fdvsp",   ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19153  cCL("fdvsm",   ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19154  cCL("fdvsz",   ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19155  cCL("fdvd",    ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19156  cCL("fdvdp",   ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19157  cCL("fdvdm",   ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19158  cCL("fdvdz",   ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19159  cCL("fdve",    ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19160  cCL("fdvep",   ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19161  cCL("fdvem",   ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19162  cCL("fdvez",   ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19163
19164  cCL("frds",    eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19165  cCL("frdsp",   eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19166  cCL("frdsm",   eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19167  cCL("frdsz",   eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19168  cCL("frdd",    eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19169  cCL("frddp",   eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19170  cCL("frddm",   eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19171  cCL("frddz",   eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19172  cCL("frde",    eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19173  cCL("frdep",   eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19174  cCL("frdem",   eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19175  cCL("frdez",   eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19176
19177  cCL("pols",    ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19178  cCL("polsp",   ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19179  cCL("polsm",   ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19180  cCL("polsz",   ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19181  cCL("pold",    ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19182  cCL("poldp",   ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19183  cCL("poldm",   ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19184  cCL("poldz",   ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19185  cCL("pole",    ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19186  cCL("polep",   ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19187  cCL("polem",   ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19188  cCL("polez",   ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19189
19190  cCE("cmf",     e90f110, 2, (RF, RF_IF),     fpa_cmp),
19191  C3E("cmfe",    ed0f110, 2, (RF, RF_IF),     fpa_cmp),
19192  cCE("cnf",     eb0f110, 2, (RF, RF_IF),     fpa_cmp),
19193  C3E("cnfe",    ef0f110, 2, (RF, RF_IF),     fpa_cmp),
19194
19195  cCL("flts",    e000110, 2, (RF, RR),        rn_rd),
19196  cCL("fltsp",   e000130, 2, (RF, RR),        rn_rd),
19197  cCL("fltsm",   e000150, 2, (RF, RR),        rn_rd),
19198  cCL("fltsz",   e000170, 2, (RF, RR),        rn_rd),
19199  cCL("fltd",    e000190, 2, (RF, RR),        rn_rd),
19200  cCL("fltdp",   e0001b0, 2, (RF, RR),        rn_rd),
19201  cCL("fltdm",   e0001d0, 2, (RF, RR),        rn_rd),
19202  cCL("fltdz",   e0001f0, 2, (RF, RR),        rn_rd),
19203  cCL("flte",    e080110, 2, (RF, RR),        rn_rd),
19204  cCL("fltep",   e080130, 2, (RF, RR),        rn_rd),
19205  cCL("fltem",   e080150, 2, (RF, RR),        rn_rd),
19206  cCL("fltez",   e080170, 2, (RF, RR),        rn_rd),
19207
19208   /* The implementation of the FIX instruction is broken on some
19209      assemblers, in that it accepts a precision specifier as well as a
19210      rounding specifier, despite the fact that this is meaningless.
19211      To be more compatible, we accept it as well, though of course it
19212      does not set any bits.  */
19213  cCE("fix",     e100110, 2, (RR, RF),        rd_rm),
19214  cCL("fixp",    e100130, 2, (RR, RF),        rd_rm),
19215  cCL("fixm",    e100150, 2, (RR, RF),        rd_rm),
19216  cCL("fixz",    e100170, 2, (RR, RF),        rd_rm),
19217  cCL("fixsp",   e100130, 2, (RR, RF),        rd_rm),
19218  cCL("fixsm",   e100150, 2, (RR, RF),        rd_rm),
19219  cCL("fixsz",   e100170, 2, (RR, RF),        rd_rm),
19220  cCL("fixdp",   e100130, 2, (RR, RF),        rd_rm),
19221  cCL("fixdm",   e100150, 2, (RR, RF),        rd_rm),
19222  cCL("fixdz",   e100170, 2, (RR, RF),        rd_rm),
19223  cCL("fixep",   e100130, 2, (RR, RF),        rd_rm),
19224  cCL("fixem",   e100150, 2, (RR, RF),        rd_rm),
19225  cCL("fixez",   e100170, 2, (RR, RF),        rd_rm),
19226
19227   /* Instructions that were new with the real FPA, call them V2.  */
19228 #undef  ARM_VARIANT
19229 #define ARM_VARIANT  & fpu_fpa_ext_v2
19230
19231  cCE("lfm",     c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19232  cCL("lfmfd",   c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19233  cCL("lfmea",   d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19234  cCE("sfm",     c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19235  cCL("sfmfd",   d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19236  cCL("sfmea",   c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19237
19238 #undef  ARM_VARIANT
19239 #define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
19240
19241   /* Moves and type conversions.  */
19242  cCE("fcpys",   eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
19243  cCE("fmrs",    e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
19244  cCE("fmsr",    e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
19245  cCE("fmstat",  ef1fa10, 0, (),               noargs),
19246  cCE("vmrs",    ef00a10, 2, (APSR_RR, RVC),   vmrs),
19247  cCE("vmsr",    ee00a10, 2, (RVC, RR),        vmsr),
19248  cCE("fsitos",  eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19249  cCE("fuitos",  eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
19250  cCE("ftosis",  ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
19251  cCE("ftosizs", ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19252  cCE("ftouis",  ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
19253  cCE("ftouizs", ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19254  cCE("fmrx",    ef00a10, 2, (RR, RVC),        rd_rn),
19255  cCE("fmxr",    ee00a10, 2, (RVC, RR),        rn_rd),
19256
19257   /* Memory operations.  */
19258  cCE("flds",    d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
19259  cCE("fsts",    d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
19260  cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19261  cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19262  cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19263  cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19264  cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19265  cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19266  cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19267  cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19268  cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19269  cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19270  cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19271  cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19272  cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19273  cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19274  cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19275  cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19276
19277   /* Monadic operations.  */
19278  cCE("fabss",   eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19279  cCE("fnegs",   eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
19280  cCE("fsqrts",  eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19281
19282   /* Dyadic operations.  */
19283  cCE("fadds",   e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19284  cCE("fsubs",   e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19285  cCE("fmuls",   e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19286  cCE("fdivs",   e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19287  cCE("fmacs",   e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19288  cCE("fmscs",   e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19289  cCE("fnmuls",  e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19290  cCE("fnmacs",  e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19291  cCE("fnmscs",  e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19292
19293   /* Comparisons.  */
19294  cCE("fcmps",   eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
19295  cCE("fcmpzs",  eb50a40, 1, (RVS),            vfp_sp_compare_z),
19296  cCE("fcmpes",  eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19297  cCE("fcmpezs", eb50ac0, 1, (RVS),            vfp_sp_compare_z),
19298
19299  /* Double precision load/store are still present on single precision
19300     implementations.  */
19301  cCE("fldd",    d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
19302  cCE("fstd",    d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
19303  cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19304  cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19305  cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19306  cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19307  cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19308  cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19309  cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19310  cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19311
19312 #undef  ARM_VARIANT
19313 #define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
19314
19315   /* Moves and type conversions.  */
19316  cCE("fcpyd",   eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19317  cCE("fcvtds",  eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19318  cCE("fcvtsd",  eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19319  cCE("fmdhr",   e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
19320  cCE("fmdlr",   e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
19321  cCE("fmrdh",   e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
19322  cCE("fmrdl",   e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
19323  cCE("fsitod",  eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19324  cCE("fuitod",  eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19325  cCE("ftosid",  ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19326  cCE("ftosizd", ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19327  cCE("ftouid",  ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19328  cCE("ftouizd", ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19329
19330   /* Monadic operations.  */
19331  cCE("fabsd",   eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19332  cCE("fnegd",   eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19333  cCE("fsqrtd",  eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19334
19335   /* Dyadic operations.  */
19336  cCE("faddd",   e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19337  cCE("fsubd",   e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19338  cCE("fmuld",   e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19339  cCE("fdivd",   e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19340  cCE("fmacd",   e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19341  cCE("fmscd",   e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19342  cCE("fnmuld",  e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19343  cCE("fnmacd",  e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19344  cCE("fnmscd",  e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19345
19346   /* Comparisons.  */
19347  cCE("fcmpd",   eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19348  cCE("fcmpzd",  eb50b40, 1, (RVD),            vfp_dp_rd),
19349  cCE("fcmped",  eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19350  cCE("fcmpezd", eb50bc0, 1, (RVD),            vfp_dp_rd),
19351
19352 #undef  ARM_VARIANT
19353 #define ARM_VARIANT  & fpu_vfp_ext_v2
19354
19355  cCE("fmsrr",   c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
19356  cCE("fmrrs",   c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
19357  cCE("fmdrr",   c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
19358  cCE("fmrrd",   c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
19359
19360 /* Instructions which may belong to either the Neon or VFP instruction sets.
19361    Individual encoder functions perform additional architecture checks.  */
19362 #undef  ARM_VARIANT
19363 #define ARM_VARIANT    & fpu_vfp_ext_v1xd
19364 #undef  THUMB_VARIANT
19365 #define THUMB_VARIANT  & fpu_vfp_ext_v1xd
19366
19367   /* These mnemonics are unique to VFP.  */
19368  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
19369  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
19370  nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19371  nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19372  nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19373  nCE(vcmp,      _vcmp,    2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
19374  nCE(vcmpe,     _vcmpe,   2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
19375  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
19376  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
19377  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
19378
19379   /* Mnemonics shared by Neon and VFP.  */
19380  nCEF(vmul,     _vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
19381  nCEF(vmla,     _vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
19382  nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
19383
19384  nCEF(vadd,     _vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
19385  nCEF(vsub,     _vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
19386
19387  NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19388  NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19389
19390  NCE(vldm,      c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19391  NCE(vldmia,    c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19392  NCE(vldmdb,    d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19393  NCE(vstm,      c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19394  NCE(vstmia,    c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19395  NCE(vstmdb,    d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19396  NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
19397  NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
19398
19399  nCEF(vcvt,     _vcvt,   3, (RNSDQ, RNSDQ, oI32z), neon_cvt),
19400  nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
19401  NCEF(vcvtb,    eb20a40, 2, (RVSD, RVSD), neon_cvtb),
19402  NCEF(vcvtt,    eb20a40, 2, (RVSD, RVSD), neon_cvtt),
19403
19404
19405   /* NOTE: All VMOV encoding is special-cased!  */
19406  NCE(vmov,      0,       1, (VMOV), neon_mov),
19407  NCE(vmovq,     0,       1, (VMOV), neon_mov),
19408
19409 #undef  THUMB_VARIANT
19410 #define THUMB_VARIANT  & fpu_neon_ext_v1
19411 #undef  ARM_VARIANT
19412 #define ARM_VARIANT    & fpu_neon_ext_v1
19413
19414   /* Data processing with three registers of the same length.  */
19415   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
19416  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
19417  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
19418  NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19419  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19420  NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19421  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19422  NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19423  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19424   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
19425  NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19426  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
19427  NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19428  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
19429  NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19430  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
19431  NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19432  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
19433   /* If not immediate, fall back to neon_dyadic_i64_su.
19434      shl_imm should accept I8 I16 I32 I64,
19435      qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
19436  nUF(vshl,      _vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
19437  nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
19438  nUF(vqshl,     _vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
19439  nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
19440   /* Logic ops, types optional & ignored.  */
19441  nUF(vand,      _vand,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19442  nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19443  nUF(vbic,      _vbic,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19444  nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19445  nUF(vorr,      _vorr,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19446  nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19447  nUF(vorn,      _vorn,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19448  nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19449  nUF(veor,      _veor,    3, (RNDQ, oRNDQ, RNDQ),      neon_logic),
19450  nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
19451   /* Bitfield ops, untyped.  */
19452  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19453  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19454  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19455  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19456  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19457  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19458   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32.  */
19459  nUF(vabd,      _vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19460  nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19461  nUF(vmax,      _vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19462  nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19463  nUF(vmin,      _vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19464  nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19465   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
19466      back to neon_dyadic_if_su.  */
19467  nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19468  nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
19469  nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19470  nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
19471  nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19472  nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
19473  nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19474  nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
19475   /* Comparison. Type I8 I16 I32 F32.  */
19476  nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
19477  nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
19478   /* As above, D registers only.  */
19479  nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
19480  nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
19481   /* Int and float variants, signedness unimportant.  */
19482  nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
19483  nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
19484  nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
19485   /* Add/sub take types I8 I16 I32 I64 F32.  */
19486  nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
19487  nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
19488   /* vtst takes sizes 8, 16, 32.  */
19489  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
19490  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
19491   /* VMUL takes I8 I16 I32 F32 P8.  */
19492  nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
19493   /* VQD{R}MULH takes S16 S32.  */
19494  nUF(vqdmulh,   _vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19495  nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
19496  nUF(vqrdmulh,  _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19497  nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
19498  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19499  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
19500  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19501  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
19502  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19503  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
19504  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19505  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
19506  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
19507  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
19508  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
19509  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
19510
19511   /* Two address, int/float. Types S8 S16 S32 F32.  */
19512  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
19513  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
19514
19515   /* Data processing with two registers and a shift amount.  */
19516   /* Right shifts, and variants with rounding.
19517      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
19518  NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19519  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
19520  NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19521  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
19522  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
19523  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
19524  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
19525  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
19526   /* Shift and insert. Sizes accepted 8 16 32 64.  */
19527  NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
19528  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
19529  NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
19530  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
19531   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
19532  NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
19533  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
19534   /* Right shift immediate, saturating & narrowing, with rounding variants.
19535      Types accepted S16 S32 S64 U16 U32 U64.  */
19536  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19537  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19538   /* As above, unsigned. Types accepted S16 S32 S64.  */
19539  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19540  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19541   /* Right shift narrowing. Types accepted I16 I32 I64.  */
19542  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19543  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19544   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
19545  nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
19546   /* CVT with optional immediate for fixed-point variant.  */
19547  nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
19548
19549  nUF(vmvn,      _vmvn,    2, (RNDQ, RNDQ_Ibig), neon_mvn),
19550  nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
19551
19552   /* Data processing, three registers of different lengths.  */
19553   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
19554  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
19555  NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
19556  NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
19557  NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
19558   /* If not scalar, fall back to neon_dyadic_long.
19559      Vector types as above, scalar types S16 S32 U16 U32.  */
19560  nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
19561  nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
19562   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
19563  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19564  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19565   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
19566  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19567  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19568  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19569  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19570   /* Saturating doubling multiplies. Types S16 S32.  */
19571  nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19572  nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19573  nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19574   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
19575      S16 S32 U16 U32.  */
19576  nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
19577
19578   /* Extract. Size 8.  */
19579  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
19580  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
19581
19582   /* Two registers, miscellaneous.  */
19583   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
19584  NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
19585  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
19586  NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
19587  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
19588  NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
19589  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
19590   /* Vector replicate. Sizes 8 16 32.  */
19591  nCE(vdup,      _vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
19592  nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
19593   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
19594  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
19595   /* VMOVN. Types I16 I32 I64.  */
19596  nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
19597   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
19598  nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
19599   /* VQMOVUN. Types S16 S32 S64.  */
19600  nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
19601   /* VZIP / VUZP. Sizes 8 16 32.  */
19602  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
19603  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
19604  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
19605  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
19606   /* VQABS / VQNEG. Types S8 S16 S32.  */
19607  NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
19608  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
19609  NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
19610  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
19611   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
19612  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
19613  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
19614  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
19615  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
19616   /* Reciprocal estimates. Types U32 F32.  */
19617  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
19618  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
19619  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
19620  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
19621   /* VCLS. Types S8 S16 S32.  */
19622  NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
19623  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
19624   /* VCLZ. Types I8 I16 I32.  */
19625  NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
19626  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
19627   /* VCNT. Size 8.  */
19628  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
19629  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
19630   /* Two address, untyped.  */
19631  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
19632  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
19633   /* VTRN. Sizes 8 16 32.  */
19634  nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
19635  nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
19636
19637   /* Table lookup. Size 8.  */
19638  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19639  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19640
19641 #undef  THUMB_VARIANT
19642 #define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
19643 #undef  ARM_VARIANT
19644 #define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
19645
19646   /* Neon element/structure load/store.  */
19647  nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19648  nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19649  nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19650  nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19651  nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19652  nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19653  nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19654  nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19655
19656 #undef  THUMB_VARIANT
19657 #define THUMB_VARIANT & fpu_vfp_ext_v3xd
19658 #undef  ARM_VARIANT
19659 #define ARM_VARIANT   & fpu_vfp_ext_v3xd
19660  cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
19661  cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19662  cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19663  cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19664  cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19665  cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19666  cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19667  cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19668  cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19669
19670 #undef  THUMB_VARIANT
19671 #define THUMB_VARIANT  & fpu_vfp_ext_v3
19672 #undef  ARM_VARIANT
19673 #define ARM_VARIANT    & fpu_vfp_ext_v3
19674
19675  cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
19676  cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19677  cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19678  cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19679  cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19680  cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19681  cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19682  cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19683  cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19684
19685 #undef  ARM_VARIANT
19686 #define ARM_VARIANT    & fpu_vfp_ext_fma
19687 #undef  THUMB_VARIANT
19688 #define THUMB_VARIANT  & fpu_vfp_ext_fma
19689  /* Mnemonics shared by Neon and VFP.  These are included in the
19690     VFP FMA variant; NEON and VFP FMA always includes the NEON
19691     FMA instructions.  */
19692  nCEF(vfma,     _vfma,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19693  nCEF(vfms,     _vfms,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19694  /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
19695     the v form should always be used.  */
19696  cCE("ffmas",   ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19697  cCE("ffnmas",  ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19698  cCE("ffmad",   ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19699  cCE("ffnmad",  ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19700  nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19701  nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19702
19703 #undef THUMB_VARIANT
19704 #undef  ARM_VARIANT
19705 #define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
19706
19707  cCE("mia",     e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19708  cCE("miaph",   e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19709  cCE("miabb",   e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19710  cCE("miabt",   e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19711  cCE("miatb",   e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19712  cCE("miatt",   e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19713  cCE("mar",     c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
19714  cCE("mra",     c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
19715
19716 #undef  ARM_VARIANT
19717 #define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
19718
19719  cCE("tandcb",  e13f130, 1, (RR),                   iwmmxt_tandorc),
19720  cCE("tandch",  e53f130, 1, (RR),                   iwmmxt_tandorc),
19721  cCE("tandcw",  e93f130, 1, (RR),                   iwmmxt_tandorc),
19722  cCE("tbcstb",  e400010, 2, (RIWR, RR),             rn_rd),
19723  cCE("tbcsth",  e400050, 2, (RIWR, RR),             rn_rd),
19724  cCE("tbcstw",  e400090, 2, (RIWR, RR),             rn_rd),
19725  cCE("textrcb", e130170, 2, (RR, I7),               iwmmxt_textrc),
19726  cCE("textrch", e530170, 2, (RR, I7),               iwmmxt_textrc),
19727  cCE("textrcw", e930170, 2, (RR, I7),               iwmmxt_textrc),
19728  cCE("textrmub",e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19729  cCE("textrmuh",e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19730  cCE("textrmuw",e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19731  cCE("textrmsb",e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19732  cCE("textrmsh",e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19733  cCE("textrmsw",e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19734  cCE("tinsrb",  e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19735  cCE("tinsrh",  e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19736  cCE("tinsrw",  e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19737  cCE("tmcr",    e000110, 2, (RIWC_RIWG, RR),        rn_rd),
19738  cCE("tmcrr",   c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
19739  cCE("tmia",    e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19740  cCE("tmiaph",  e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19741  cCE("tmiabb",  e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19742  cCE("tmiabt",  e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19743  cCE("tmiatb",  e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19744  cCE("tmiatt",  e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19745  cCE("tmovmskb",e100030, 2, (RR, RIWR),             rd_rn),
19746  cCE("tmovmskh",e500030, 2, (RR, RIWR),             rd_rn),
19747  cCE("tmovmskw",e900030, 2, (RR, RIWR),             rd_rn),
19748  cCE("tmrc",    e100110, 2, (RR, RIWC_RIWG),        rd_rn),
19749  cCE("tmrrc",   c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
19750  cCE("torcb",   e13f150, 1, (RR),                   iwmmxt_tandorc),
19751  cCE("torch",   e53f150, 1, (RR),                   iwmmxt_tandorc),
19752  cCE("torcw",   e93f150, 1, (RR),                   iwmmxt_tandorc),
19753  cCE("waccb",   e0001c0, 2, (RIWR, RIWR),           rd_rn),
19754  cCE("wacch",   e4001c0, 2, (RIWR, RIWR),           rd_rn),
19755  cCE("waccw",   e8001c0, 2, (RIWR, RIWR),           rd_rn),
19756  cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19757  cCE("waddb",   e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19758  cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19759  cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19760  cCE("waddh",   e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19761  cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19762  cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19763  cCE("waddw",   e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19764  cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19765  cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
19766  cCE("walignr0",e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19767  cCE("walignr1",e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19768  cCE("walignr2",ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19769  cCE("walignr3",eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19770  cCE("wand",    e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19771  cCE("wandn",   e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19772  cCE("wavg2b",  e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19773  cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19774  cCE("wavg2h",  ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19775  cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19776  cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19777  cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19778  cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19779  cCE("wcmpgtub",e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19780  cCE("wcmpgtuh",e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19781  cCE("wcmpgtuw",e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19782  cCE("wcmpgtsb",e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19783  cCE("wcmpgtsh",e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19784  cCE("wcmpgtsw",eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19785  cCE("wldrb",   c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19786  cCE("wldrh",   c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19787  cCE("wldrw",   c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
19788  cCE("wldrd",   c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
19789  cCE("wmacs",   e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19790  cCE("wmacsz",  e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19791  cCE("wmacu",   e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19792  cCE("wmacuz",  e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19793  cCE("wmadds",  ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19794  cCE("wmaddu",  e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19795  cCE("wmaxsb",  e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19796  cCE("wmaxsh",  e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19797  cCE("wmaxsw",  ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19798  cCE("wmaxub",  e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19799  cCE("wmaxuh",  e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19800  cCE("wmaxuw",  e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19801  cCE("wminsb",  e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19802  cCE("wminsh",  e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19803  cCE("wminsw",  eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19804  cCE("wminub",  e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19805  cCE("wminuh",  e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19806  cCE("wminuw",  e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19807  cCE("wmov",    e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
19808  cCE("wmulsm",  e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19809  cCE("wmulsl",  e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19810  cCE("wmulum",  e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19811  cCE("wmulul",  e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19812  cCE("wor",     e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19813  cCE("wpackhss",e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19814  cCE("wpackhus",e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19815  cCE("wpackwss",eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19816  cCE("wpackwus",e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19817  cCE("wpackdss",ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19818  cCE("wpackdus",ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19819  cCE("wrorh",   e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19820  cCE("wrorhg",  e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19821  cCE("wrorw",   eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19822  cCE("wrorwg",  eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19823  cCE("wrord",   ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19824  cCE("wrordg",  ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19825  cCE("wsadb",   e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19826  cCE("wsadbz",  e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19827  cCE("wsadh",   e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19828  cCE("wsadhz",  e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19829  cCE("wshufh",  e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
19830  cCE("wsllh",   e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19831  cCE("wsllhg",  e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19832  cCE("wsllw",   e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19833  cCE("wsllwg",  e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19834  cCE("wslld",   ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19835  cCE("wslldg",  ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19836  cCE("wsrah",   e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19837  cCE("wsrahg",  e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19838  cCE("wsraw",   e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19839  cCE("wsrawg",  e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19840  cCE("wsrad",   ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19841  cCE("wsradg",  ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19842  cCE("wsrlh",   e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19843  cCE("wsrlhg",  e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19844  cCE("wsrlw",   ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19845  cCE("wsrlwg",  ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19846  cCE("wsrld",   ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19847  cCE("wsrldg",  ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19848  cCE("wstrb",   c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19849  cCE("wstrh",   c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19850  cCE("wstrw",   c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
19851  cCE("wstrd",   c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
19852  cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19853  cCE("wsubb",   e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19854  cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19855  cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19856  cCE("wsubh",   e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19857  cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19858  cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19859  cCE("wsubw",   e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19860  cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19861  cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),         rd_rn),
19862  cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),         rd_rn),
19863  cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),         rd_rn),
19864  cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),         rd_rn),
19865  cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),         rd_rn),
19866  cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),         rd_rn),
19867  cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19868  cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19869  cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19870  cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),         rd_rn),
19871  cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),         rd_rn),
19872  cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),         rd_rn),
19873  cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),         rd_rn),
19874  cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),         rd_rn),
19875  cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),         rd_rn),
19876  cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19877  cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19878  cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19879  cCE("wxor",    e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19880  cCE("wzero",   e300000, 1, (RIWR),                 iwmmxt_wzero),
19881
19882 #undef  ARM_VARIANT
19883 #define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
19884
19885  cCE("torvscb",   e12f190, 1, (RR),                 iwmmxt_tandorc),
19886  cCE("torvsch",   e52f190, 1, (RR),                 iwmmxt_tandorc),
19887  cCE("torvscw",   e92f190, 1, (RR),                 iwmmxt_tandorc),
19888  cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
19889  cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
19890  cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
19891  cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19892  cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19893  cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19894  cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19895  cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19896  cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19897  cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19898  cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19899  cCE("wavg4",   e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19900  cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19901  cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19902  cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19903  cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19904  cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19905  cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
19906  cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19907  cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19908  cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19909  cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19910  cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19911  cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19912  cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19913  cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19914  cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19915  cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19916  cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19917  cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19918  cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19919  cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19920  cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19921  cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19922  cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19923  cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19924  cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19925  cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19926  cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19927  cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19928  cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19929  cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19930  cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19931  cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19932  cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19933  cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19934  cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19935  cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19936  cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19937  cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19938  cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19939  cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19940  cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19941  cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19942
19943 #undef  ARM_VARIANT
19944 #define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
19945
19946  cCE("cfldrs",  c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
19947  cCE("cfldrd",  c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
19948  cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
19949  cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
19950  cCE("cfstrs",  c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
19951  cCE("cfstrd",  c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
19952  cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
19953  cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
19954  cCE("cfmvsr",  e000450, 2, (RMF, RR),                rn_rd),
19955  cCE("cfmvrs",  e100450, 2, (RR, RMF),                rd_rn),
19956  cCE("cfmvdlr", e000410, 2, (RMD, RR),                rn_rd),
19957  cCE("cfmvrdl", e100410, 2, (RR, RMD),                rd_rn),
19958  cCE("cfmvdhr", e000430, 2, (RMD, RR),                rn_rd),
19959  cCE("cfmvrdh", e100430, 2, (RR, RMD),                rd_rn),
19960  cCE("cfmv64lr",e000510, 2, (RMDX, RR),               rn_rd),
19961  cCE("cfmvr64l",e100510, 2, (RR, RMDX),               rd_rn),
19962  cCE("cfmv64hr",e000530, 2, (RMDX, RR),               rn_rd),
19963  cCE("cfmvr64h",e100530, 2, (RR, RMDX),               rd_rn),
19964  cCE("cfmval32",e200440, 2, (RMAX, RMFX),             rd_rn),
19965  cCE("cfmv32al",e100440, 2, (RMFX, RMAX),             rd_rn),
19966  cCE("cfmvam32",e200460, 2, (RMAX, RMFX),             rd_rn),
19967  cCE("cfmv32am",e100460, 2, (RMFX, RMAX),             rd_rn),
19968  cCE("cfmvah32",e200480, 2, (RMAX, RMFX),             rd_rn),
19969  cCE("cfmv32ah",e100480, 2, (RMFX, RMAX),             rd_rn),
19970  cCE("cfmva32", e2004a0, 2, (RMAX, RMFX),             rd_rn),
19971  cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX),             rd_rn),
19972  cCE("cfmva64", e2004c0, 2, (RMAX, RMDX),             rd_rn),
19973  cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX),             rd_rn),
19974  cCE("cfmvsc32",e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
19975  cCE("cfmv32sc",e1004e0, 2, (RMDX, RMDS),             rd),
19976  cCE("cfcpys",  e000400, 2, (RMF, RMF),               rd_rn),
19977  cCE("cfcpyd",  e000420, 2, (RMD, RMD),               rd_rn),
19978  cCE("cfcvtsd", e000460, 2, (RMD, RMF),               rd_rn),
19979  cCE("cfcvtds", e000440, 2, (RMF, RMD),               rd_rn),
19980  cCE("cfcvt32s",e000480, 2, (RMF, RMFX),              rd_rn),
19981  cCE("cfcvt32d",e0004a0, 2, (RMD, RMFX),              rd_rn),
19982  cCE("cfcvt64s",e0004c0, 2, (RMF, RMDX),              rd_rn),
19983  cCE("cfcvt64d",e0004e0, 2, (RMD, RMDX),              rd_rn),
19984  cCE("cfcvts32",e100580, 2, (RMFX, RMF),              rd_rn),
19985  cCE("cfcvtd32",e1005a0, 2, (RMFX, RMD),              rd_rn),
19986  cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),            rd_rn),
19987  cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),            rd_rn),
19988  cCE("cfrshl32",e000550, 3, (RMFX, RMFX, RR),         mav_triple),
19989  cCE("cfrshl64",e000570, 3, (RMDX, RMDX, RR),         mav_triple),
19990  cCE("cfsh32",  e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
19991  cCE("cfsh64",  e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
19992  cCE("cfcmps",  e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
19993  cCE("cfcmpd",  e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
19994  cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
19995  cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
19996  cCE("cfabss",  e300400, 2, (RMF, RMF),               rd_rn),
19997  cCE("cfabsd",  e300420, 2, (RMD, RMD),               rd_rn),
19998  cCE("cfnegs",  e300440, 2, (RMF, RMF),               rd_rn),
19999  cCE("cfnegd",  e300460, 2, (RMD, RMD),               rd_rn),
20000  cCE("cfadds",  e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
20001  cCE("cfaddd",  e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
20002  cCE("cfsubs",  e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
20003  cCE("cfsubd",  e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
20004  cCE("cfmuls",  e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
20005  cCE("cfmuld",  e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
20006  cCE("cfabs32", e300500, 2, (RMFX, RMFX),             rd_rn),
20007  cCE("cfabs64", e300520, 2, (RMDX, RMDX),             rd_rn),
20008  cCE("cfneg32", e300540, 2, (RMFX, RMFX),             rd_rn),
20009  cCE("cfneg64", e300560, 2, (RMDX, RMDX),             rd_rn),
20010  cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20011  cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
20012  cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20013  cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
20014  cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20015  cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
20016  cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20017  cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20018  cCE("cfmadd32",e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
20019  cCE("cfmsub32",e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
20020  cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
20021  cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
20022 };
20023 #undef ARM_VARIANT
20024 #undef THUMB_VARIANT
20025 #undef TCE
20026 #undef TUE
20027 #undef TUF
20028 #undef TCC
20029 #undef cCE
20030 #undef cCL
20031 #undef C3E
20032 #undef CE
20033 #undef CM
20034 #undef UE
20035 #undef UF
20036 #undef UT
20037 #undef NUF
20038 #undef nUF
20039 #undef NCE
20040 #undef nCE
20041 #undef OPS0
20042 #undef OPS1
20043 #undef OPS2
20044 #undef OPS3
20045 #undef OPS4
20046 #undef OPS5
20047 #undef OPS6
20048 #undef do_0
20049 \f
20050 /* MD interface: bits in the object file.  */
20051
20052 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
20053    for use in the a.out file, and stores them in the array pointed to by buf.
20054    This knows about the endian-ness of the target machine and does
20055    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
20056    2 (short) and 4 (long)  Floating numbers are put out as a series of
20057    LITTLENUMS (shorts, here at least).  */
20058
20059 void
20060 md_number_to_chars (char * buf, valueT val, int n)
20061 {
20062   if (target_big_endian)
20063     number_to_chars_bigendian (buf, val, n);
20064   else
20065     number_to_chars_littleendian (buf, val, n);
20066 }
20067
20068 static valueT
20069 md_chars_to_number (char * buf, int n)
20070 {
20071   valueT result = 0;
20072   unsigned char * where = (unsigned char *) buf;
20073
20074   if (target_big_endian)
20075     {
20076       while (n--)
20077         {
20078           result <<= 8;
20079           result |= (*where++ & 255);
20080         }
20081     }
20082   else
20083     {
20084       while (n--)
20085         {
20086           result <<= 8;
20087           result |= (where[n] & 255);
20088         }
20089     }
20090
20091   return result;
20092 }
20093
20094 /* MD interface: Sections.  */
20095
20096 /* Calculate the maximum variable size (i.e., excluding fr_fix)
20097    that an rs_machine_dependent frag may reach.  */
20098
20099 unsigned int
20100 arm_frag_max_var (fragS *fragp)
20101 {
20102   /* We only use rs_machine_dependent for variable-size Thumb instructions,
20103      which are either THUMB_SIZE (2) or INSN_SIZE (4).
20104
20105      Note that we generate relaxable instructions even for cases that don't
20106      really need it, like an immediate that's a trivial constant.  So we're
20107      overestimating the instruction size for some of those cases.  Rather
20108      than putting more intelligence here, it would probably be better to
20109      avoid generating a relaxation frag in the first place when it can be
20110      determined up front that a short instruction will suffice.  */
20111
20112   gas_assert (fragp->fr_type == rs_machine_dependent);
20113   return INSN_SIZE;
20114 }
20115
20116 /* Estimate the size of a frag before relaxing.  Assume everything fits in
20117    2 bytes.  */
20118
20119 int
20120 md_estimate_size_before_relax (fragS * fragp,
20121                                segT    segtype ATTRIBUTE_UNUSED)
20122 {
20123   fragp->fr_var = 2;
20124   return 2;
20125 }
20126
20127 /* Convert a machine dependent frag.  */
20128
20129 void
20130 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
20131 {
20132   unsigned long insn;
20133   unsigned long old_op;
20134   char *buf;
20135   expressionS exp;
20136   fixS *fixp;
20137   int reloc_type;
20138   int pc_rel;
20139   int opcode;
20140
20141   buf = fragp->fr_literal + fragp->fr_fix;
20142
20143   old_op = bfd_get_16(abfd, buf);
20144   if (fragp->fr_symbol)
20145     {
20146       exp.X_op = O_symbol;
20147       exp.X_add_symbol = fragp->fr_symbol;
20148     }
20149   else
20150     {
20151       exp.X_op = O_constant;
20152     }
20153   exp.X_add_number = fragp->fr_offset;
20154   opcode = fragp->fr_subtype;
20155   switch (opcode)
20156     {
20157     case T_MNEM_ldr_pc:
20158     case T_MNEM_ldr_pc2:
20159     case T_MNEM_ldr_sp:
20160     case T_MNEM_str_sp:
20161     case T_MNEM_ldr:
20162     case T_MNEM_ldrb:
20163     case T_MNEM_ldrh:
20164     case T_MNEM_str:
20165     case T_MNEM_strb:
20166     case T_MNEM_strh:
20167       if (fragp->fr_var == 4)
20168         {
20169           insn = THUMB_OP32 (opcode);
20170           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
20171             {
20172               insn |= (old_op & 0x700) << 4;
20173             }
20174           else
20175             {
20176               insn |= (old_op & 7) << 12;
20177               insn |= (old_op & 0x38) << 13;
20178             }
20179           insn |= 0x00000c00;
20180           put_thumb32_insn (buf, insn);
20181           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
20182         }
20183       else
20184         {
20185           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
20186         }
20187       pc_rel = (opcode == T_MNEM_ldr_pc2);
20188       break;
20189     case T_MNEM_adr:
20190       if (fragp->fr_var == 4)
20191         {
20192           insn = THUMB_OP32 (opcode);
20193           insn |= (old_op & 0xf0) << 4;
20194           put_thumb32_insn (buf, insn);
20195           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
20196         }
20197       else
20198         {
20199           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20200           exp.X_add_number -= 4;
20201         }
20202       pc_rel = 1;
20203       break;
20204     case T_MNEM_mov:
20205     case T_MNEM_movs:
20206     case T_MNEM_cmp:
20207     case T_MNEM_cmn:
20208       if (fragp->fr_var == 4)
20209         {
20210           int r0off = (opcode == T_MNEM_mov
20211                        || opcode == T_MNEM_movs) ? 0 : 8;
20212           insn = THUMB_OP32 (opcode);
20213           insn = (insn & 0xe1ffffff) | 0x10000000;
20214           insn |= (old_op & 0x700) << r0off;
20215           put_thumb32_insn (buf, insn);
20216           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
20217         }
20218       else
20219         {
20220           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
20221         }
20222       pc_rel = 0;
20223       break;
20224     case T_MNEM_b:
20225       if (fragp->fr_var == 4)
20226         {
20227           insn = THUMB_OP32(opcode);
20228           put_thumb32_insn (buf, insn);
20229           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
20230         }
20231       else
20232         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
20233       pc_rel = 1;
20234       break;
20235     case T_MNEM_bcond:
20236       if (fragp->fr_var == 4)
20237         {
20238           insn = THUMB_OP32(opcode);
20239           insn |= (old_op & 0xf00) << 14;
20240           put_thumb32_insn (buf, insn);
20241           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
20242         }
20243       else
20244         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
20245       pc_rel = 1;
20246       break;
20247     case T_MNEM_add_sp:
20248     case T_MNEM_add_pc:
20249     case T_MNEM_inc_sp:
20250     case T_MNEM_dec_sp:
20251       if (fragp->fr_var == 4)
20252         {
20253           /* ??? Choose between add and addw.  */
20254           insn = THUMB_OP32 (opcode);
20255           insn |= (old_op & 0xf0) << 4;
20256           put_thumb32_insn (buf, insn);
20257           if (opcode == T_MNEM_add_pc)
20258             reloc_type = BFD_RELOC_ARM_T32_IMM12;
20259           else
20260             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
20261         }
20262       else
20263         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20264       pc_rel = 0;
20265       break;
20266
20267     case T_MNEM_addi:
20268     case T_MNEM_addis:
20269     case T_MNEM_subi:
20270     case T_MNEM_subis:
20271       if (fragp->fr_var == 4)
20272         {
20273           insn = THUMB_OP32 (opcode);
20274           insn |= (old_op & 0xf0) << 4;
20275           insn |= (old_op & 0xf) << 16;
20276           put_thumb32_insn (buf, insn);
20277           if (insn & (1 << 20))
20278             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
20279           else
20280             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
20281         }
20282       else
20283         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20284       pc_rel = 0;
20285       break;
20286     default:
20287       abort ();
20288     }
20289   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
20290                       (enum bfd_reloc_code_real) reloc_type);
20291   fixp->fx_file = fragp->fr_file;
20292   fixp->fx_line = fragp->fr_line;
20293   fragp->fr_fix += fragp->fr_var;
20294 }
20295
20296 /* Return the size of a relaxable immediate operand instruction.
20297    SHIFT and SIZE specify the form of the allowable immediate.  */
20298 static int
20299 relax_immediate (fragS *fragp, int size, int shift)
20300 {
20301   offsetT offset;
20302   offsetT mask;
20303   offsetT low;
20304
20305   /* ??? Should be able to do better than this.  */
20306   if (fragp->fr_symbol)
20307     return 4;
20308
20309   low = (1 << shift) - 1;
20310   mask = (1 << (shift + size)) - (1 << shift);
20311   offset = fragp->fr_offset;
20312   /* Force misaligned offsets to 32-bit variant.  */
20313   if (offset & low)
20314     return 4;
20315   if (offset & ~mask)
20316     return 4;
20317   return 2;
20318 }
20319
20320 /* Get the address of a symbol during relaxation.  */
20321 static addressT
20322 relaxed_symbol_addr (fragS *fragp, long stretch)
20323 {
20324   fragS *sym_frag;
20325   addressT addr;
20326   symbolS *sym;
20327
20328   sym = fragp->fr_symbol;
20329   sym_frag = symbol_get_frag (sym);
20330   know (S_GET_SEGMENT (sym) != absolute_section
20331         || sym_frag == &zero_address_frag);
20332   addr = S_GET_VALUE (sym) + fragp->fr_offset;
20333
20334   /* If frag has yet to be reached on this pass, assume it will
20335      move by STRETCH just as we did.  If this is not so, it will
20336      be because some frag between grows, and that will force
20337      another pass.  */
20338
20339   if (stretch != 0
20340       && sym_frag->relax_marker != fragp->relax_marker)
20341     {
20342       fragS *f;
20343
20344       /* Adjust stretch for any alignment frag.  Note that if have
20345          been expanding the earlier code, the symbol may be
20346          defined in what appears to be an earlier frag.  FIXME:
20347          This doesn't handle the fr_subtype field, which specifies
20348          a maximum number of bytes to skip when doing an
20349          alignment.  */
20350       for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
20351         {
20352           if (f->fr_type == rs_align || f->fr_type == rs_align_code)
20353             {
20354               if (stretch < 0)
20355                 stretch = - ((- stretch)
20356                              & ~ ((1 << (int) f->fr_offset) - 1));
20357               else
20358                 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
20359               if (stretch == 0)
20360                 break;
20361             }
20362         }
20363       if (f != NULL)
20364         addr += stretch;
20365     }
20366
20367   return addr;
20368 }
20369
20370 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
20371    load.  */
20372 static int
20373 relax_adr (fragS *fragp, asection *sec, long stretch)
20374 {
20375   addressT addr;
20376   offsetT val;
20377
20378   /* Assume worst case for symbols not known to be in the same section.  */
20379   if (fragp->fr_symbol == NULL
20380       || !S_IS_DEFINED (fragp->fr_symbol)
20381       || sec != S_GET_SEGMENT (fragp->fr_symbol)
20382       || S_IS_WEAK (fragp->fr_symbol))
20383     return 4;
20384
20385   val = relaxed_symbol_addr (fragp, stretch);
20386   addr = fragp->fr_address + fragp->fr_fix;
20387   addr = (addr + 4) & ~3;
20388   /* Force misaligned targets to 32-bit variant.  */
20389   if (val & 3)
20390     return 4;
20391   val -= addr;
20392   if (val < 0 || val > 1020)
20393     return 4;
20394   return 2;
20395 }
20396
20397 /* Return the size of a relaxable add/sub immediate instruction.  */
20398 static int
20399 relax_addsub (fragS *fragp, asection *sec)
20400 {
20401   char *buf;
20402   int op;
20403
20404   buf = fragp->fr_literal + fragp->fr_fix;
20405   op = bfd_get_16(sec->owner, buf);
20406   if ((op & 0xf) == ((op >> 4) & 0xf))
20407     return relax_immediate (fragp, 8, 0);
20408   else
20409     return relax_immediate (fragp, 3, 0);
20410 }
20411
20412 /* Return TRUE iff the definition of symbol S could be pre-empted
20413    (overridden) at link or load time.  */
20414 static bfd_boolean
20415 symbol_preemptible (symbolS *s)
20416 {
20417   /* Weak symbols can always be pre-empted.  */
20418   if (S_IS_WEAK (s))
20419     return TRUE;
20420
20421   /* Non-global symbols cannot be pre-empted. */
20422   if (! S_IS_EXTERNAL (s))
20423     return FALSE;
20424
20425 #ifdef OBJ_ELF
20426   /* In ELF, a global symbol can be marked protected, or private.  In that
20427      case it can't be pre-empted (other definitions in the same link unit
20428      would violate the ODR).  */
20429   if (ELF_ST_VISIBILITY (S_GET_OTHER (s)) > STV_DEFAULT)
20430     return FALSE;
20431 #endif
20432
20433   /* Other global symbols might be pre-empted.  */
20434   return TRUE;
20435 }
20436
20437 /* Return the size of a relaxable branch instruction.  BITS is the
20438    size of the offset field in the narrow instruction.  */
20439
20440 static int
20441 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
20442 {
20443   addressT addr;
20444   offsetT val;
20445   offsetT limit;
20446
20447   /* Assume worst case for symbols not known to be in the same section.  */
20448   if (!S_IS_DEFINED (fragp->fr_symbol)
20449       || sec != S_GET_SEGMENT (fragp->fr_symbol)
20450       || S_IS_WEAK (fragp->fr_symbol))
20451     return 4;
20452
20453 #ifdef OBJ_ELF
20454   /* A branch to a function in ARM state will require interworking.  */
20455   if (S_IS_DEFINED (fragp->fr_symbol)
20456       && ARM_IS_FUNC (fragp->fr_symbol))
20457       return 4;
20458 #endif
20459
20460   if (symbol_preemptible (fragp->fr_symbol))
20461     return 4;
20462
20463   val = relaxed_symbol_addr (fragp, stretch);
20464   addr = fragp->fr_address + fragp->fr_fix + 4;
20465   val -= addr;
20466
20467   /* Offset is a signed value *2 */
20468   limit = 1 << bits;
20469   if (val >= limit || val < -limit)
20470     return 4;
20471   return 2;
20472 }
20473
20474
20475 /* Relax a machine dependent frag.  This returns the amount by which
20476    the current size of the frag should change.  */
20477
20478 int
20479 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
20480 {
20481   int oldsize;
20482   int newsize;
20483
20484   oldsize = fragp->fr_var;
20485   switch (fragp->fr_subtype)
20486     {
20487     case T_MNEM_ldr_pc2:
20488       newsize = relax_adr (fragp, sec, stretch);
20489       break;
20490     case T_MNEM_ldr_pc:
20491     case T_MNEM_ldr_sp:
20492     case T_MNEM_str_sp:
20493       newsize = relax_immediate (fragp, 8, 2);
20494       break;
20495     case T_MNEM_ldr:
20496     case T_MNEM_str:
20497       newsize = relax_immediate (fragp, 5, 2);
20498       break;
20499     case T_MNEM_ldrh:
20500     case T_MNEM_strh:
20501       newsize = relax_immediate (fragp, 5, 1);
20502       break;
20503     case T_MNEM_ldrb:
20504     case T_MNEM_strb:
20505       newsize = relax_immediate (fragp, 5, 0);
20506       break;
20507     case T_MNEM_adr:
20508       newsize = relax_adr (fragp, sec, stretch);
20509       break;
20510     case T_MNEM_mov:
20511     case T_MNEM_movs:
20512     case T_MNEM_cmp:
20513     case T_MNEM_cmn:
20514       newsize = relax_immediate (fragp, 8, 0);
20515       break;
20516     case T_MNEM_b:
20517       newsize = relax_branch (fragp, sec, 11, stretch);
20518       break;
20519     case T_MNEM_bcond:
20520       newsize = relax_branch (fragp, sec, 8, stretch);
20521       break;
20522     case T_MNEM_add_sp:
20523     case T_MNEM_add_pc:
20524       newsize = relax_immediate (fragp, 8, 2);
20525       break;
20526     case T_MNEM_inc_sp:
20527     case T_MNEM_dec_sp:
20528       newsize = relax_immediate (fragp, 7, 2);
20529       break;
20530     case T_MNEM_addi:
20531     case T_MNEM_addis:
20532     case T_MNEM_subi:
20533     case T_MNEM_subis:
20534       newsize = relax_addsub (fragp, sec);
20535       break;
20536     default:
20537       abort ();
20538     }
20539
20540   fragp->fr_var = newsize;
20541   /* Freeze wide instructions that are at or before the same location as
20542      in the previous pass.  This avoids infinite loops.
20543      Don't freeze them unconditionally because targets may be artificially
20544      misaligned by the expansion of preceding frags.  */
20545   if (stretch <= 0 && newsize > 2)
20546     {
20547       md_convert_frag (sec->owner, sec, fragp);
20548       frag_wane (fragp);
20549     }
20550
20551   return newsize - oldsize;
20552 }
20553
20554 /* Round up a section size to the appropriate boundary.  */
20555
20556 valueT
20557 md_section_align (segT   segment ATTRIBUTE_UNUSED,
20558                   valueT size)
20559 {
20560 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
20561   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
20562     {
20563       /* For a.out, force the section size to be aligned.  If we don't do
20564          this, BFD will align it for us, but it will not write out the
20565          final bytes of the section.  This may be a bug in BFD, but it is
20566          easier to fix it here since that is how the other a.out targets
20567          work.  */
20568       int align;
20569
20570       align = bfd_get_section_alignment (stdoutput, segment);
20571       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
20572     }
20573 #endif
20574
20575   return size;
20576 }
20577
20578 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
20579    of an rs_align_code fragment.  */
20580
20581 void
20582 arm_handle_align (fragS * fragP)
20583 {
20584   static char const arm_noop[2][2][4] =
20585     {
20586       {  /* ARMv1 */
20587         {0x00, 0x00, 0xa0, 0xe1},  /* LE */
20588         {0xe1, 0xa0, 0x00, 0x00},  /* BE */
20589       },
20590       {  /* ARMv6k */
20591         {0x00, 0xf0, 0x20, 0xe3},  /* LE */
20592         {0xe3, 0x20, 0xf0, 0x00},  /* BE */
20593       },
20594     };
20595   static char const thumb_noop[2][2][2] =
20596     {
20597       {  /* Thumb-1 */
20598         {0xc0, 0x46},  /* LE */
20599         {0x46, 0xc0},  /* BE */
20600       },
20601       {  /* Thumb-2 */
20602         {0x00, 0xbf},  /* LE */
20603         {0xbf, 0x00}   /* BE */
20604       }
20605     };
20606   static char const wide_thumb_noop[2][4] =
20607     {  /* Wide Thumb-2 */
20608       {0xaf, 0xf3, 0x00, 0x80},  /* LE */
20609       {0xf3, 0xaf, 0x80, 0x00},  /* BE */
20610     };
20611
20612   unsigned bytes, fix, noop_size;
20613   char * p;
20614   const char * noop;
20615   const char *narrow_noop = NULL;
20616 #ifdef OBJ_ELF
20617   enum mstate state;
20618 #endif
20619
20620   if (fragP->fr_type != rs_align_code)
20621     return;
20622
20623   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
20624   p = fragP->fr_literal + fragP->fr_fix;
20625   fix = 0;
20626
20627   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
20628     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
20629
20630   gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
20631
20632   if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
20633     {
20634       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
20635         {
20636           narrow_noop = thumb_noop[1][target_big_endian];
20637           noop = wide_thumb_noop[target_big_endian];
20638         }
20639       else
20640         noop = thumb_noop[0][target_big_endian];
20641       noop_size = 2;
20642 #ifdef OBJ_ELF
20643       state = MAP_THUMB;
20644 #endif
20645     }
20646   else
20647     {
20648       noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
20649                      [target_big_endian];
20650       noop_size = 4;
20651 #ifdef OBJ_ELF
20652       state = MAP_ARM;
20653 #endif
20654     }
20655
20656   fragP->fr_var = noop_size;
20657
20658   if (bytes & (noop_size - 1))
20659     {
20660       fix = bytes & (noop_size - 1);
20661 #ifdef OBJ_ELF
20662       insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
20663 #endif
20664       memset (p, 0, fix);
20665       p += fix;
20666       bytes -= fix;
20667     }
20668
20669   if (narrow_noop)
20670     {
20671       if (bytes & noop_size)
20672         {
20673           /* Insert a narrow noop.  */
20674           memcpy (p, narrow_noop, noop_size);
20675           p += noop_size;
20676           bytes -= noop_size;
20677           fix += noop_size;
20678         }
20679
20680       /* Use wide noops for the remainder */
20681       noop_size = 4;
20682     }
20683
20684   while (bytes >= noop_size)
20685     {
20686       memcpy (p, noop, noop_size);
20687       p += noop_size;
20688       bytes -= noop_size;
20689       fix += noop_size;
20690     }
20691
20692   fragP->fr_fix += fix;
20693 }
20694
20695 /* Called from md_do_align.  Used to create an alignment
20696    frag in a code section.  */
20697
20698 void
20699 arm_frag_align_code (int n, int max)
20700 {
20701   char * p;
20702
20703   /* We assume that there will never be a requirement
20704      to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
20705   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
20706     {
20707       char err_msg[128];
20708
20709       sprintf (err_msg,
20710         _("alignments greater than %d bytes not supported in .text sections."),
20711         MAX_MEM_FOR_RS_ALIGN_CODE + 1);
20712       as_fatal ("%s", err_msg);
20713     }
20714
20715   p = frag_var (rs_align_code,
20716                 MAX_MEM_FOR_RS_ALIGN_CODE,
20717                 1,
20718                 (relax_substateT) max,
20719                 (symbolS *) NULL,
20720                 (offsetT) n,
20721                 (char *) NULL);
20722   *p = 0;
20723 }
20724
20725 /* Perform target specific initialisation of a frag.
20726    Note - despite the name this initialisation is not done when the frag
20727    is created, but only when its type is assigned.  A frag can be created
20728    and used a long time before its type is set, so beware of assuming that
20729    this initialisationis performed first.  */
20730
20731 #ifndef OBJ_ELF
20732 void
20733 arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
20734 {
20735   /* Record whether this frag is in an ARM or a THUMB area.  */
20736   fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
20737 }
20738
20739 #else /* OBJ_ELF is defined.  */
20740 void
20741 arm_init_frag (fragS * fragP, int max_chars)
20742 {
20743   /* If the current ARM vs THUMB mode has not already
20744      been recorded into this frag then do so now.  */
20745   if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
20746     {
20747       fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
20748
20749       /* Record a mapping symbol for alignment frags.  We will delete this
20750          later if the alignment ends up empty.  */
20751       switch (fragP->fr_type)
20752         {
20753           case rs_align:
20754           case rs_align_test:
20755           case rs_fill:
20756             mapping_state_2 (MAP_DATA, max_chars);
20757             break;
20758           case rs_align_code:
20759             mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
20760             break;
20761           default:
20762             break;
20763         }
20764     }
20765 }
20766
20767 /* When we change sections we need to issue a new mapping symbol.  */
20768
20769 void
20770 arm_elf_change_section (void)
20771 {
20772   /* Link an unlinked unwind index table section to the .text section.  */
20773   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
20774       && elf_linked_to_section (now_seg) == NULL)
20775     elf_linked_to_section (now_seg) = text_section;
20776 }
20777
20778 int
20779 arm_elf_section_type (const char * str, size_t len)
20780 {
20781   if (len == 5 && strncmp (str, "exidx", 5) == 0)
20782     return SHT_ARM_EXIDX;
20783
20784   return -1;
20785 }
20786 \f
20787 /* Code to deal with unwinding tables.  */
20788
20789 static void add_unwind_adjustsp (offsetT);
20790
20791 /* Generate any deferred unwind frame offset.  */
20792
20793 static void
20794 flush_pending_unwind (void)
20795 {
20796   offsetT offset;
20797
20798   offset = unwind.pending_offset;
20799   unwind.pending_offset = 0;
20800   if (offset != 0)
20801     add_unwind_adjustsp (offset);
20802 }
20803
20804 /* Add an opcode to this list for this function.  Two-byte opcodes should
20805    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
20806    order.  */
20807
20808 static void
20809 add_unwind_opcode (valueT op, int length)
20810 {
20811   /* Add any deferred stack adjustment.  */
20812   if (unwind.pending_offset)
20813     flush_pending_unwind ();
20814
20815   unwind.sp_restored = 0;
20816
20817   if (unwind.opcode_count + length > unwind.opcode_alloc)
20818     {
20819       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
20820       if (unwind.opcodes)
20821         unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
20822                                                      unwind.opcode_alloc);
20823       else
20824         unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
20825     }
20826   while (length > 0)
20827     {
20828       length--;
20829       unwind.opcodes[unwind.opcode_count] = op & 0xff;
20830       op >>= 8;
20831       unwind.opcode_count++;
20832     }
20833 }
20834
20835 /* Add unwind opcodes to adjust the stack pointer.  */
20836
20837 static void
20838 add_unwind_adjustsp (offsetT offset)
20839 {
20840   valueT op;
20841
20842   if (offset > 0x200)
20843     {
20844       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
20845       char bytes[5];
20846       int n;
20847       valueT o;
20848
20849       /* Long form: 0xb2, uleb128.  */
20850       /* This might not fit in a word so add the individual bytes,
20851          remembering the list is built in reverse order.  */
20852       o = (valueT) ((offset - 0x204) >> 2);
20853       if (o == 0)
20854         add_unwind_opcode (0, 1);
20855
20856       /* Calculate the uleb128 encoding of the offset.  */
20857       n = 0;
20858       while (o)
20859         {
20860           bytes[n] = o & 0x7f;
20861           o >>= 7;
20862           if (o)
20863             bytes[n] |= 0x80;
20864           n++;
20865         }
20866       /* Add the insn.  */
20867       for (; n; n--)
20868         add_unwind_opcode (bytes[n - 1], 1);
20869       add_unwind_opcode (0xb2, 1);
20870     }
20871   else if (offset > 0x100)
20872     {
20873       /* Two short opcodes.  */
20874       add_unwind_opcode (0x3f, 1);
20875       op = (offset - 0x104) >> 2;
20876       add_unwind_opcode (op, 1);
20877     }
20878   else if (offset > 0)
20879     {
20880       /* Short opcode.  */
20881       op = (offset - 4) >> 2;
20882       add_unwind_opcode (op, 1);
20883     }
20884   else if (offset < 0)
20885     {
20886       offset = -offset;
20887       while (offset > 0x100)
20888         {
20889           add_unwind_opcode (0x7f, 1);
20890           offset -= 0x100;
20891         }
20892       op = ((offset - 4) >> 2) | 0x40;
20893       add_unwind_opcode (op, 1);
20894     }
20895 }
20896
20897 /* Finish the list of unwind opcodes for this function.  */
20898 static void
20899 finish_unwind_opcodes (void)
20900 {
20901   valueT op;
20902
20903   if (unwind.fp_used)
20904     {
20905       /* Adjust sp as necessary.  */
20906       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
20907       flush_pending_unwind ();
20908
20909       /* After restoring sp from the frame pointer.  */
20910       op = 0x90 | unwind.fp_reg;
20911       add_unwind_opcode (op, 1);
20912     }
20913   else
20914     flush_pending_unwind ();
20915 }
20916
20917
20918 /* Start an exception table entry.  If idx is nonzero this is an index table
20919    entry.  */
20920
20921 static void
20922 start_unwind_section (const segT text_seg, int idx)
20923 {
20924   const char * text_name;
20925   const char * prefix;
20926   const char * prefix_once;
20927   const char * group_name;
20928   size_t prefix_len;
20929   size_t text_len;
20930   char * sec_name;
20931   size_t sec_name_len;
20932   int type;
20933   int flags;
20934   int linkonce;
20935
20936   if (idx)
20937     {
20938       prefix = ELF_STRING_ARM_unwind;
20939       prefix_once = ELF_STRING_ARM_unwind_once;
20940       type = SHT_ARM_EXIDX;
20941     }
20942   else
20943     {
20944       prefix = ELF_STRING_ARM_unwind_info;
20945       prefix_once = ELF_STRING_ARM_unwind_info_once;
20946       type = SHT_PROGBITS;
20947     }
20948
20949   text_name = segment_name (text_seg);
20950   if (streq (text_name, ".text"))
20951     text_name = "";
20952
20953   if (strncmp (text_name, ".gnu.linkonce.t.",
20954                strlen (".gnu.linkonce.t.")) == 0)
20955     {
20956       prefix = prefix_once;
20957       text_name += strlen (".gnu.linkonce.t.");
20958     }
20959
20960   prefix_len = strlen (prefix);
20961   text_len = strlen (text_name);
20962   sec_name_len = prefix_len + text_len;
20963   sec_name = (char *) xmalloc (sec_name_len + 1);
20964   memcpy (sec_name, prefix, prefix_len);
20965   memcpy (sec_name + prefix_len, text_name, text_len);
20966   sec_name[prefix_len + text_len] = '\0';
20967
20968   flags = SHF_ALLOC;
20969   linkonce = 0;
20970   group_name = 0;
20971
20972   /* Handle COMDAT group.  */
20973   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
20974     {
20975       group_name = elf_group_name (text_seg);
20976       if (group_name == NULL)
20977         {
20978           as_bad (_("Group section `%s' has no group signature"),
20979                   segment_name (text_seg));
20980           ignore_rest_of_line ();
20981           return;
20982         }
20983       flags |= SHF_GROUP;
20984       linkonce = 1;
20985     }
20986
20987   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
20988
20989   /* Set the section link for index tables.  */
20990   if (idx)
20991     elf_linked_to_section (now_seg) = text_seg;
20992 }
20993
20994
20995 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
20996    personality routine data.  Returns zero, or the index table value for
20997    an inline entry.  */
20998
20999 static valueT
21000 create_unwind_entry (int have_data)
21001 {
21002   int size;
21003   addressT where;
21004   char *ptr;
21005   /* The current word of data.  */
21006   valueT data;
21007   /* The number of bytes left in this word.  */
21008   int n;
21009
21010   finish_unwind_opcodes ();
21011
21012   /* Remember the current text section.  */
21013   unwind.saved_seg = now_seg;
21014   unwind.saved_subseg = now_subseg;
21015
21016   start_unwind_section (now_seg, 0);
21017
21018   if (unwind.personality_routine == NULL)
21019     {
21020       if (unwind.personality_index == -2)
21021         {
21022           if (have_data)
21023             as_bad (_("handlerdata in cantunwind frame"));
21024           return 1; /* EXIDX_CANTUNWIND.  */
21025         }
21026
21027       /* Use a default personality routine if none is specified.  */
21028       if (unwind.personality_index == -1)
21029         {
21030           if (unwind.opcode_count > 3)
21031             unwind.personality_index = 1;
21032           else
21033             unwind.personality_index = 0;
21034         }
21035
21036       /* Space for the personality routine entry.  */
21037       if (unwind.personality_index == 0)
21038         {
21039           if (unwind.opcode_count > 3)
21040             as_bad (_("too many unwind opcodes for personality routine 0"));
21041
21042           if (!have_data)
21043             {
21044               /* All the data is inline in the index table.  */
21045               data = 0x80;
21046               n = 3;
21047               while (unwind.opcode_count > 0)
21048                 {
21049                   unwind.opcode_count--;
21050                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
21051                   n--;
21052                 }
21053
21054               /* Pad with "finish" opcodes.  */
21055               while (n--)
21056                 data = (data << 8) | 0xb0;
21057
21058               return data;
21059             }
21060           size = 0;
21061         }
21062       else
21063         /* We get two opcodes "free" in the first word.  */
21064         size = unwind.opcode_count - 2;
21065     }
21066   else
21067     {
21068       /* PR 16765: Missing or misplaced unwind directives can trigger this.  */
21069       if (unwind.personality_index != -1)
21070         {
21071           as_bad (_("attempt to recreate an unwind entry"));
21072           return 1;
21073         }
21074
21075       /* An extra byte is required for the opcode count.        */
21076       size = unwind.opcode_count + 1;
21077     }
21078
21079   size = (size + 3) >> 2;
21080   if (size > 0xff)
21081     as_bad (_("too many unwind opcodes"));
21082
21083   frag_align (2, 0, 0);
21084   record_alignment (now_seg, 2);
21085   unwind.table_entry = expr_build_dot ();
21086
21087   /* Allocate the table entry.  */
21088   ptr = frag_more ((size << 2) + 4);
21089   /* PR 13449: Zero the table entries in case some of them are not used.  */
21090   memset (ptr, 0, (size << 2) + 4);
21091   where = frag_now_fix () - ((size << 2) + 4);
21092
21093   switch (unwind.personality_index)
21094     {
21095     case -1:
21096       /* ??? Should this be a PLT generating relocation?  */
21097       /* Custom personality routine.  */
21098       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
21099                BFD_RELOC_ARM_PREL31);
21100
21101       where += 4;
21102       ptr += 4;
21103
21104       /* Set the first byte to the number of additional words.  */
21105       data = size > 0 ? size - 1 : 0;
21106       n = 3;
21107       break;
21108
21109     /* ABI defined personality routines.  */
21110     case 0:
21111       /* Three opcodes bytes are packed into the first word.  */
21112       data = 0x80;
21113       n = 3;
21114       break;
21115
21116     case 1:
21117     case 2:
21118       /* The size and first two opcode bytes go in the first word.  */
21119       data = ((0x80 + unwind.personality_index) << 8) | size;
21120       n = 2;
21121       break;
21122
21123     default:
21124       /* Should never happen.  */
21125       abort ();
21126     }
21127
21128   /* Pack the opcodes into words (MSB first), reversing the list at the same
21129      time.  */
21130   while (unwind.opcode_count > 0)
21131     {
21132       if (n == 0)
21133         {
21134           md_number_to_chars (ptr, data, 4);
21135           ptr += 4;
21136           n = 4;
21137           data = 0;
21138         }
21139       unwind.opcode_count--;
21140       n--;
21141       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
21142     }
21143
21144   /* Finish off the last word.  */
21145   if (n < 4)
21146     {
21147       /* Pad with "finish" opcodes.  */
21148       while (n--)
21149         data = (data << 8) | 0xb0;
21150
21151       md_number_to_chars (ptr, data, 4);
21152     }
21153
21154   if (!have_data)
21155     {
21156       /* Add an empty descriptor if there is no user-specified data.   */
21157       ptr = frag_more (4);
21158       md_number_to_chars (ptr, 0, 4);
21159     }
21160
21161   return 0;
21162 }
21163
21164
21165 /* Initialize the DWARF-2 unwind information for this procedure.  */
21166
21167 void
21168 tc_arm_frame_initial_instructions (void)
21169 {
21170   cfi_add_CFA_def_cfa (REG_SP, 0);
21171 }
21172 #endif /* OBJ_ELF */
21173
21174 /* Convert REGNAME to a DWARF-2 register number.  */
21175
21176 int
21177 tc_arm_regname_to_dw2regnum (char *regname)
21178 {
21179   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
21180   if (reg != FAIL)
21181     return reg;
21182
21183   /* PR 16694: Allow VFP registers as well.  */
21184   reg = arm_reg_parse (&regname, REG_TYPE_VFS);
21185   if (reg != FAIL)
21186     return 64 + reg;
21187
21188   reg = arm_reg_parse (&regname, REG_TYPE_VFD);
21189   if (reg != FAIL)
21190     return reg + 256;
21191
21192   return -1;
21193 }
21194
21195 #ifdef TE_PE
21196 void
21197 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
21198 {
21199   expressionS exp;
21200
21201   exp.X_op = O_secrel;
21202   exp.X_add_symbol = symbol;
21203   exp.X_add_number = 0;
21204   emit_expr (&exp, size);
21205 }
21206 #endif
21207
21208 /* MD interface: Symbol and relocation handling.  */
21209
21210 /* Return the address within the segment that a PC-relative fixup is
21211    relative to.  For ARM, PC-relative fixups applied to instructions
21212    are generally relative to the location of the fixup plus 8 bytes.
21213    Thumb branches are offset by 4, and Thumb loads relative to PC
21214    require special handling.  */
21215
21216 long
21217 md_pcrel_from_section (fixS * fixP, segT seg)
21218 {
21219   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
21220
21221   /* If this is pc-relative and we are going to emit a relocation
21222      then we just want to put out any pipeline compensation that the linker
21223      will need.  Otherwise we want to use the calculated base.
21224      For WinCE we skip the bias for externals as well, since this
21225      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
21226   if (fixP->fx_pcrel
21227       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
21228           || (arm_force_relocation (fixP)
21229 #ifdef TE_WINCE
21230               && !S_IS_EXTERNAL (fixP->fx_addsy)
21231 #endif
21232               )))
21233     base = 0;
21234
21235
21236   switch (fixP->fx_r_type)
21237     {
21238       /* PC relative addressing on the Thumb is slightly odd as the
21239          bottom two bits of the PC are forced to zero for the
21240          calculation.  This happens *after* application of the
21241          pipeline offset.  However, Thumb adrl already adjusts for
21242          this, so we need not do it again.  */
21243     case BFD_RELOC_ARM_THUMB_ADD:
21244       return base & ~3;
21245
21246     case BFD_RELOC_ARM_THUMB_OFFSET:
21247     case BFD_RELOC_ARM_T32_OFFSET_IMM:
21248     case BFD_RELOC_ARM_T32_ADD_PC12:
21249     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
21250       return (base + 4) & ~3;
21251
21252       /* Thumb branches are simply offset by +4.  */
21253     case BFD_RELOC_THUMB_PCREL_BRANCH7:
21254     case BFD_RELOC_THUMB_PCREL_BRANCH9:
21255     case BFD_RELOC_THUMB_PCREL_BRANCH12:
21256     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21257     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21258       return base + 4;
21259
21260     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21261       if (fixP->fx_addsy
21262           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21263           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21264           && ARM_IS_FUNC (fixP->fx_addsy)
21265           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21266         base = fixP->fx_where + fixP->fx_frag->fr_address;
21267        return base + 4;
21268
21269       /* BLX is like branches above, but forces the low two bits of PC to
21270          zero.  */
21271     case BFD_RELOC_THUMB_PCREL_BLX:
21272       if (fixP->fx_addsy
21273           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21274           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21275           && THUMB_IS_FUNC (fixP->fx_addsy)
21276           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21277         base = fixP->fx_where + fixP->fx_frag->fr_address;
21278       return (base + 4) & ~3;
21279
21280       /* ARM mode branches are offset by +8.  However, the Windows CE
21281          loader expects the relocation not to take this into account.  */
21282     case BFD_RELOC_ARM_PCREL_BLX:
21283       if (fixP->fx_addsy
21284           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21285           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21286           && ARM_IS_FUNC (fixP->fx_addsy)
21287           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21288         base = fixP->fx_where + fixP->fx_frag->fr_address;
21289       return base + 8;
21290
21291     case BFD_RELOC_ARM_PCREL_CALL:
21292       if (fixP->fx_addsy
21293           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21294           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21295           && THUMB_IS_FUNC (fixP->fx_addsy)
21296           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21297         base = fixP->fx_where + fixP->fx_frag->fr_address;
21298       return base + 8;
21299
21300     case BFD_RELOC_ARM_PCREL_BRANCH:
21301     case BFD_RELOC_ARM_PCREL_JUMP:
21302     case BFD_RELOC_ARM_PLT32:
21303 #ifdef TE_WINCE
21304       /* When handling fixups immediately, because we have already
21305          discovered the value of a symbol, or the address of the frag involved
21306          we must account for the offset by +8, as the OS loader will never see the reloc.
21307          see fixup_segment() in write.c
21308          The S_IS_EXTERNAL test handles the case of global symbols.
21309          Those need the calculated base, not just the pipe compensation the linker will need.  */
21310       if (fixP->fx_pcrel
21311           && fixP->fx_addsy != NULL
21312           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21313           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
21314         return base + 8;
21315       return base;
21316 #else
21317       return base + 8;
21318 #endif
21319
21320
21321       /* ARM mode loads relative to PC are also offset by +8.  Unlike
21322          branches, the Windows CE loader *does* expect the relocation
21323          to take this into account.  */
21324     case BFD_RELOC_ARM_OFFSET_IMM:
21325     case BFD_RELOC_ARM_OFFSET_IMM8:
21326     case BFD_RELOC_ARM_HWLITERAL:
21327     case BFD_RELOC_ARM_LITERAL:
21328     case BFD_RELOC_ARM_CP_OFF_IMM:
21329       return base + 8;
21330
21331
21332       /* Other PC-relative relocations are un-offset.  */
21333     default:
21334       return base;
21335     }
21336 }
21337
21338 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
21339    Otherwise we have no need to default values of symbols.  */
21340
21341 symbolS *
21342 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
21343 {
21344 #ifdef OBJ_ELF
21345   if (name[0] == '_' && name[1] == 'G'
21346       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
21347     {
21348       if (!GOT_symbol)
21349         {
21350           if (symbol_find (name))
21351             as_bad (_("GOT already in the symbol table"));
21352
21353           GOT_symbol = symbol_new (name, undefined_section,
21354                                    (valueT) 0, & zero_address_frag);
21355         }
21356
21357       return GOT_symbol;
21358     }
21359 #endif
21360
21361   return NULL;
21362 }
21363
21364 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
21365    computed as two separate immediate values, added together.  We
21366    already know that this value cannot be computed by just one ARM
21367    instruction.  */
21368
21369 static unsigned int
21370 validate_immediate_twopart (unsigned int   val,
21371                             unsigned int * highpart)
21372 {
21373   unsigned int a;
21374   unsigned int i;
21375
21376   for (i = 0; i < 32; i += 2)
21377     if (((a = rotate_left (val, i)) & 0xff) != 0)
21378       {
21379         if (a & 0xff00)
21380           {
21381             if (a & ~ 0xffff)
21382               continue;
21383             * highpart = (a  >> 8) | ((i + 24) << 7);
21384           }
21385         else if (a & 0xff0000)
21386           {
21387             if (a & 0xff000000)
21388               continue;
21389             * highpart = (a >> 16) | ((i + 16) << 7);
21390           }
21391         else
21392           {
21393             gas_assert (a & 0xff000000);
21394             * highpart = (a >> 24) | ((i + 8) << 7);
21395           }
21396
21397         return (a & 0xff) | (i << 7);
21398       }
21399
21400   return FAIL;
21401 }
21402
21403 static int
21404 validate_offset_imm (unsigned int val, int hwse)
21405 {
21406   if ((hwse && val > 255) || val > 4095)
21407     return FAIL;
21408   return val;
21409 }
21410
21411 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
21412    negative immediate constant by altering the instruction.  A bit of
21413    a hack really.
21414         MOV <-> MVN
21415         AND <-> BIC
21416         ADC <-> SBC
21417         by inverting the second operand, and
21418         ADD <-> SUB
21419         CMP <-> CMN
21420         by negating the second operand.  */
21421
21422 static int
21423 negate_data_op (unsigned long * instruction,
21424                 unsigned long   value)
21425 {
21426   int op, new_inst;
21427   unsigned long negated, inverted;
21428
21429   negated = encode_arm_immediate (-value);
21430   inverted = encode_arm_immediate (~value);
21431
21432   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
21433   switch (op)
21434     {
21435       /* First negates.  */
21436     case OPCODE_SUB:             /* ADD <-> SUB  */
21437       new_inst = OPCODE_ADD;
21438       value = negated;
21439       break;
21440
21441     case OPCODE_ADD:
21442       new_inst = OPCODE_SUB;
21443       value = negated;
21444       break;
21445
21446     case OPCODE_CMP:             /* CMP <-> CMN  */
21447       new_inst = OPCODE_CMN;
21448       value = negated;
21449       break;
21450
21451     case OPCODE_CMN:
21452       new_inst = OPCODE_CMP;
21453       value = negated;
21454       break;
21455
21456       /* Now Inverted ops.  */
21457     case OPCODE_MOV:             /* MOV <-> MVN  */
21458       new_inst = OPCODE_MVN;
21459       value = inverted;
21460       break;
21461
21462     case OPCODE_MVN:
21463       new_inst = OPCODE_MOV;
21464       value = inverted;
21465       break;
21466
21467     case OPCODE_AND:             /* AND <-> BIC  */
21468       new_inst = OPCODE_BIC;
21469       value = inverted;
21470       break;
21471
21472     case OPCODE_BIC:
21473       new_inst = OPCODE_AND;
21474       value = inverted;
21475       break;
21476
21477     case OPCODE_ADC:              /* ADC <-> SBC  */
21478       new_inst = OPCODE_SBC;
21479       value = inverted;
21480       break;
21481
21482     case OPCODE_SBC:
21483       new_inst = OPCODE_ADC;
21484       value = inverted;
21485       break;
21486
21487       /* We cannot do anything.  */
21488     default:
21489       return FAIL;
21490     }
21491
21492   if (value == (unsigned) FAIL)
21493     return FAIL;
21494
21495   *instruction &= OPCODE_MASK;
21496   *instruction |= new_inst << DATA_OP_SHIFT;
21497   return value;
21498 }
21499
21500 /* Like negate_data_op, but for Thumb-2.   */
21501
21502 static unsigned int
21503 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
21504 {
21505   int op, new_inst;
21506   int rd;
21507   unsigned int negated, inverted;
21508
21509   negated = encode_thumb32_immediate (-value);
21510   inverted = encode_thumb32_immediate (~value);
21511
21512   rd = (*instruction >> 8) & 0xf;
21513   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
21514   switch (op)
21515     {
21516       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
21517     case T2_OPCODE_SUB:
21518       new_inst = T2_OPCODE_ADD;
21519       value = negated;
21520       break;
21521
21522     case T2_OPCODE_ADD:
21523       new_inst = T2_OPCODE_SUB;
21524       value = negated;
21525       break;
21526
21527       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
21528     case T2_OPCODE_ORR:
21529       new_inst = T2_OPCODE_ORN;
21530       value = inverted;
21531       break;
21532
21533     case T2_OPCODE_ORN:
21534       new_inst = T2_OPCODE_ORR;
21535       value = inverted;
21536       break;
21537
21538       /* AND <-> BIC.  TST has no inverted equivalent.  */
21539     case T2_OPCODE_AND:
21540       new_inst = T2_OPCODE_BIC;
21541       if (rd == 15)
21542         value = FAIL;
21543       else
21544         value = inverted;
21545       break;
21546
21547     case T2_OPCODE_BIC:
21548       new_inst = T2_OPCODE_AND;
21549       value = inverted;
21550       break;
21551
21552       /* ADC <-> SBC  */
21553     case T2_OPCODE_ADC:
21554       new_inst = T2_OPCODE_SBC;
21555       value = inverted;
21556       break;
21557
21558     case T2_OPCODE_SBC:
21559       new_inst = T2_OPCODE_ADC;
21560       value = inverted;
21561       break;
21562
21563       /* We cannot do anything.  */
21564     default:
21565       return FAIL;
21566     }
21567
21568   if (value == (unsigned int)FAIL)
21569     return FAIL;
21570
21571   *instruction &= T2_OPCODE_MASK;
21572   *instruction |= new_inst << T2_DATA_OP_SHIFT;
21573   return value;
21574 }
21575
21576 /* Read a 32-bit thumb instruction from buf.  */
21577 static unsigned long
21578 get_thumb32_insn (char * buf)
21579 {
21580   unsigned long insn;
21581   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
21582   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21583
21584   return insn;
21585 }
21586
21587
21588 /* We usually want to set the low bit on the address of thumb function
21589    symbols.  In particular .word foo - . should have the low bit set.
21590    Generic code tries to fold the difference of two symbols to
21591    a constant.  Prevent this and force a relocation when the first symbols
21592    is a thumb function.  */
21593
21594 bfd_boolean
21595 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
21596 {
21597   if (op == O_subtract
21598       && l->X_op == O_symbol
21599       && r->X_op == O_symbol
21600       && THUMB_IS_FUNC (l->X_add_symbol))
21601     {
21602       l->X_op = O_subtract;
21603       l->X_op_symbol = r->X_add_symbol;
21604       l->X_add_number -= r->X_add_number;
21605       return TRUE;
21606     }
21607
21608   /* Process as normal.  */
21609   return FALSE;
21610 }
21611
21612 /* Encode Thumb2 unconditional branches and calls. The encoding
21613    for the 2 are identical for the immediate values.  */
21614
21615 static void
21616 encode_thumb2_b_bl_offset (char * buf, offsetT value)
21617 {
21618 #define T2I1I2MASK  ((1 << 13) | (1 << 11))
21619   offsetT newval;
21620   offsetT newval2;
21621   addressT S, I1, I2, lo, hi;
21622
21623   S = (value >> 24) & 0x01;
21624   I1 = (value >> 23) & 0x01;
21625   I2 = (value >> 22) & 0x01;
21626   hi = (value >> 12) & 0x3ff;
21627   lo = (value >> 1) & 0x7ff;
21628   newval   = md_chars_to_number (buf, THUMB_SIZE);
21629   newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21630   newval  |= (S << 10) | hi;
21631   newval2 &=  ~T2I1I2MASK;
21632   newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
21633   md_number_to_chars (buf, newval, THUMB_SIZE);
21634   md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
21635 }
21636
21637 void
21638 md_apply_fix (fixS *    fixP,
21639                valueT * valP,
21640                segT     seg)
21641 {
21642   offsetT        value = * valP;
21643   offsetT        newval;
21644   unsigned int   newimm;
21645   unsigned long  temp;
21646   int            sign;
21647   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
21648
21649   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
21650
21651   /* Note whether this will delete the relocation.  */
21652
21653   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
21654     fixP->fx_done = 1;
21655
21656   /* On a 64-bit host, silently truncate 'value' to 32 bits for
21657      consistency with the behaviour on 32-bit hosts.  Remember value
21658      for emit_reloc.  */
21659   value &= 0xffffffff;
21660   value ^= 0x80000000;
21661   value -= 0x80000000;
21662
21663   *valP = value;
21664   fixP->fx_addnumber = value;
21665
21666   /* Same treatment for fixP->fx_offset.  */
21667   fixP->fx_offset &= 0xffffffff;
21668   fixP->fx_offset ^= 0x80000000;
21669   fixP->fx_offset -= 0x80000000;
21670
21671   switch (fixP->fx_r_type)
21672     {
21673     case BFD_RELOC_NONE:
21674       /* This will need to go in the object file.  */
21675       fixP->fx_done = 0;
21676       break;
21677
21678     case BFD_RELOC_ARM_IMMEDIATE:
21679       /* We claim that this fixup has been processed here,
21680          even if in fact we generate an error because we do
21681          not have a reloc for it, so tc_gen_reloc will reject it.  */
21682       fixP->fx_done = 1;
21683
21684       if (fixP->fx_addsy)
21685         {
21686           const char *msg = 0;
21687
21688           if (! S_IS_DEFINED (fixP->fx_addsy))
21689             msg = _("undefined symbol %s used as an immediate value");
21690           else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21691             msg = _("symbol %s is in a different section");
21692           else if (S_IS_WEAK (fixP->fx_addsy))
21693             msg = _("symbol %s is weak and may be overridden later");
21694
21695           if (msg)
21696             {
21697               as_bad_where (fixP->fx_file, fixP->fx_line,
21698                             msg, S_GET_NAME (fixP->fx_addsy));
21699               break;
21700             }
21701         }
21702
21703       temp = md_chars_to_number (buf, INSN_SIZE);
21704
21705       /* If the offset is negative, we should use encoding A2 for ADR.  */
21706       if ((temp & 0xfff0000) == 0x28f0000 && value < 0)
21707         newimm = negate_data_op (&temp, value);
21708       else
21709         {
21710           newimm = encode_arm_immediate (value);
21711
21712           /* If the instruction will fail, see if we can fix things up by
21713              changing the opcode.  */
21714           if (newimm == (unsigned int) FAIL)
21715             newimm = negate_data_op (&temp, value);
21716         }
21717
21718       if (newimm == (unsigned int) FAIL)
21719         {
21720           as_bad_where (fixP->fx_file, fixP->fx_line,
21721                         _("invalid constant (%lx) after fixup"),
21722                         (unsigned long) value);
21723           break;
21724         }
21725
21726       newimm |= (temp & 0xfffff000);
21727       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
21728       break;
21729
21730     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21731       {
21732         unsigned int highpart = 0;
21733         unsigned int newinsn  = 0xe1a00000; /* nop.  */
21734
21735         if (fixP->fx_addsy)
21736           {
21737             const char *msg = 0;
21738
21739             if (! S_IS_DEFINED (fixP->fx_addsy))
21740               msg = _("undefined symbol %s used as an immediate value");
21741             else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21742               msg = _("symbol %s is in a different section");
21743             else if (S_IS_WEAK (fixP->fx_addsy))
21744               msg = _("symbol %s is weak and may be overridden later");
21745
21746             if (msg)
21747               {
21748                 as_bad_where (fixP->fx_file, fixP->fx_line,
21749                               msg, S_GET_NAME (fixP->fx_addsy));
21750                 break;
21751               }
21752           }
21753
21754         newimm = encode_arm_immediate (value);
21755         temp = md_chars_to_number (buf, INSN_SIZE);
21756
21757         /* If the instruction will fail, see if we can fix things up by
21758            changing the opcode.  */
21759         if (newimm == (unsigned int) FAIL
21760             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
21761           {
21762             /* No ?  OK - try using two ADD instructions to generate
21763                the value.  */
21764             newimm = validate_immediate_twopart (value, & highpart);
21765
21766             /* Yes - then make sure that the second instruction is
21767                also an add.  */
21768             if (newimm != (unsigned int) FAIL)
21769               newinsn = temp;
21770             /* Still No ?  Try using a negated value.  */
21771             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
21772               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
21773             /* Otherwise - give up.  */
21774             else
21775               {
21776                 as_bad_where (fixP->fx_file, fixP->fx_line,
21777                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
21778                               (long) value);
21779                 break;
21780               }
21781
21782             /* Replace the first operand in the 2nd instruction (which
21783                is the PC) with the destination register.  We have
21784                already added in the PC in the first instruction and we
21785                do not want to do it again.  */
21786             newinsn &= ~ 0xf0000;
21787             newinsn |= ((newinsn & 0x0f000) << 4);
21788           }
21789
21790         newimm |= (temp & 0xfffff000);
21791         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
21792
21793         highpart |= (newinsn & 0xfffff000);
21794         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
21795       }
21796       break;
21797
21798     case BFD_RELOC_ARM_OFFSET_IMM:
21799       if (!fixP->fx_done && seg->use_rela_p)
21800         value = 0;
21801
21802     case BFD_RELOC_ARM_LITERAL:
21803       sign = value > 0;
21804
21805       if (value < 0)
21806         value = - value;
21807
21808       if (validate_offset_imm (value, 0) == FAIL)
21809         {
21810           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
21811             as_bad_where (fixP->fx_file, fixP->fx_line,
21812                           _("invalid literal constant: pool needs to be closer"));
21813           else
21814             as_bad_where (fixP->fx_file, fixP->fx_line,
21815                           _("bad immediate value for offset (%ld)"),
21816                           (long) value);
21817           break;
21818         }
21819
21820       newval = md_chars_to_number (buf, INSN_SIZE);
21821       if (value == 0)
21822         newval &= 0xfffff000;
21823       else
21824         {
21825           newval &= 0xff7ff000;
21826           newval |= value | (sign ? INDEX_UP : 0);
21827         }
21828       md_number_to_chars (buf, newval, INSN_SIZE);
21829       break;
21830
21831     case BFD_RELOC_ARM_OFFSET_IMM8:
21832     case BFD_RELOC_ARM_HWLITERAL:
21833       sign = value > 0;
21834
21835       if (value < 0)
21836         value = - value;
21837
21838       if (validate_offset_imm (value, 1) == FAIL)
21839         {
21840           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
21841             as_bad_where (fixP->fx_file, fixP->fx_line,
21842                           _("invalid literal constant: pool needs to be closer"));
21843           else
21844             as_bad_where (fixP->fx_file, fixP->fx_line,
21845                           _("bad immediate value for 8-bit offset (%ld)"),
21846                           (long) value);
21847           break;
21848         }
21849
21850       newval = md_chars_to_number (buf, INSN_SIZE);
21851       if (value == 0)
21852         newval &= 0xfffff0f0;
21853       else
21854         {
21855           newval &= 0xff7ff0f0;
21856           newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
21857         }
21858       md_number_to_chars (buf, newval, INSN_SIZE);
21859       break;
21860
21861     case BFD_RELOC_ARM_T32_OFFSET_U8:
21862       if (value < 0 || value > 1020 || value % 4 != 0)
21863         as_bad_where (fixP->fx_file, fixP->fx_line,
21864                       _("bad immediate value for offset (%ld)"), (long) value);
21865       value /= 4;
21866
21867       newval = md_chars_to_number (buf+2, THUMB_SIZE);
21868       newval |= value;
21869       md_number_to_chars (buf+2, newval, THUMB_SIZE);
21870       break;
21871
21872     case BFD_RELOC_ARM_T32_OFFSET_IMM:
21873       /* This is a complicated relocation used for all varieties of Thumb32
21874          load/store instruction with immediate offset:
21875
21876          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
21877                                                    *4, optional writeback(W)
21878                                                    (doubleword load/store)
21879
21880          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
21881          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
21882          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
21883          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
21884          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
21885
21886          Uppercase letters indicate bits that are already encoded at
21887          this point.  Lowercase letters are our problem.  For the
21888          second block of instructions, the secondary opcode nybble
21889          (bits 8..11) is present, and bit 23 is zero, even if this is
21890          a PC-relative operation.  */
21891       newval = md_chars_to_number (buf, THUMB_SIZE);
21892       newval <<= 16;
21893       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
21894
21895       if ((newval & 0xf0000000) == 0xe0000000)
21896         {
21897           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
21898           if (value >= 0)
21899             newval |= (1 << 23);
21900           else
21901             value = -value;
21902           if (value % 4 != 0)
21903             {
21904               as_bad_where (fixP->fx_file, fixP->fx_line,
21905                             _("offset not a multiple of 4"));
21906               break;
21907             }
21908           value /= 4;
21909           if (value > 0xff)
21910             {
21911               as_bad_where (fixP->fx_file, fixP->fx_line,
21912                             _("offset out of range"));
21913               break;
21914             }
21915           newval &= ~0xff;
21916         }
21917       else if ((newval & 0x000f0000) == 0x000f0000)
21918         {
21919           /* PC-relative, 12-bit offset.  */
21920           if (value >= 0)
21921             newval |= (1 << 23);
21922           else
21923             value = -value;
21924           if (value > 0xfff)
21925             {
21926               as_bad_where (fixP->fx_file, fixP->fx_line,
21927                             _("offset out of range"));
21928               break;
21929             }
21930           newval &= ~0xfff;
21931         }
21932       else if ((newval & 0x00000100) == 0x00000100)
21933         {
21934           /* Writeback: 8-bit, +/- offset.  */
21935           if (value >= 0)
21936             newval |= (1 << 9);
21937           else
21938             value = -value;
21939           if (value > 0xff)
21940             {
21941               as_bad_where (fixP->fx_file, fixP->fx_line,
21942                             _("offset out of range"));
21943               break;
21944             }
21945           newval &= ~0xff;
21946         }
21947       else if ((newval & 0x00000f00) == 0x00000e00)
21948         {
21949           /* T-instruction: positive 8-bit offset.  */
21950           if (value < 0 || value > 0xff)
21951             {
21952               as_bad_where (fixP->fx_file, fixP->fx_line,
21953                             _("offset out of range"));
21954               break;
21955             }
21956           newval &= ~0xff;
21957           newval |= value;
21958         }
21959       else
21960         {
21961           /* Positive 12-bit or negative 8-bit offset.  */
21962           int limit;
21963           if (value >= 0)
21964             {
21965               newval |= (1 << 23);
21966               limit = 0xfff;
21967             }
21968           else
21969             {
21970               value = -value;
21971               limit = 0xff;
21972             }
21973           if (value > limit)
21974             {
21975               as_bad_where (fixP->fx_file, fixP->fx_line,
21976                             _("offset out of range"));
21977               break;
21978             }
21979           newval &= ~limit;
21980         }
21981
21982       newval |= value;
21983       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
21984       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
21985       break;
21986
21987     case BFD_RELOC_ARM_SHIFT_IMM:
21988       newval = md_chars_to_number (buf, INSN_SIZE);
21989       if (((unsigned long) value) > 32
21990           || (value == 32
21991               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
21992         {
21993           as_bad_where (fixP->fx_file, fixP->fx_line,
21994                         _("shift expression is too large"));
21995           break;
21996         }
21997
21998       if (value == 0)
21999         /* Shifts of zero must be done as lsl.  */
22000         newval &= ~0x60;
22001       else if (value == 32)
22002         value = 0;
22003       newval &= 0xfffff07f;
22004       newval |= (value & 0x1f) << 7;
22005       md_number_to_chars (buf, newval, INSN_SIZE);
22006       break;
22007
22008     case BFD_RELOC_ARM_T32_IMMEDIATE:
22009     case BFD_RELOC_ARM_T32_ADD_IMM:
22010     case BFD_RELOC_ARM_T32_IMM12:
22011     case BFD_RELOC_ARM_T32_ADD_PC12:
22012       /* We claim that this fixup has been processed here,
22013          even if in fact we generate an error because we do
22014          not have a reloc for it, so tc_gen_reloc will reject it.  */
22015       fixP->fx_done = 1;
22016
22017       if (fixP->fx_addsy
22018           && ! S_IS_DEFINED (fixP->fx_addsy))
22019         {
22020           as_bad_where (fixP->fx_file, fixP->fx_line,
22021                         _("undefined symbol %s used as an immediate value"),
22022                         S_GET_NAME (fixP->fx_addsy));
22023           break;
22024         }
22025
22026       newval = md_chars_to_number (buf, THUMB_SIZE);
22027       newval <<= 16;
22028       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
22029
22030       newimm = FAIL;
22031       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
22032           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
22033         {
22034           newimm = encode_thumb32_immediate (value);
22035           if (newimm == (unsigned int) FAIL)
22036             newimm = thumb32_negate_data_op (&newval, value);
22037         }
22038       if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
22039           && newimm == (unsigned int) FAIL)
22040         {
22041           /* Turn add/sum into addw/subw.  */
22042           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
22043             newval = (newval & 0xfeffffff) | 0x02000000;
22044           /* No flat 12-bit imm encoding for addsw/subsw.  */
22045           if ((newval & 0x00100000) == 0)
22046             {
22047               /* 12 bit immediate for addw/subw.  */
22048               if (value < 0)
22049                 {
22050                   value = -value;
22051                   newval ^= 0x00a00000;
22052                 }
22053               if (value > 0xfff)
22054                 newimm = (unsigned int) FAIL;
22055               else
22056                 newimm = value;
22057             }
22058         }
22059
22060       if (newimm == (unsigned int)FAIL)
22061         {
22062           as_bad_where (fixP->fx_file, fixP->fx_line,
22063                         _("invalid constant (%lx) after fixup"),
22064                         (unsigned long) value);
22065           break;
22066         }
22067
22068       newval |= (newimm & 0x800) << 15;
22069       newval |= (newimm & 0x700) << 4;
22070       newval |= (newimm & 0x0ff);
22071
22072       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
22073       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
22074       break;
22075
22076     case BFD_RELOC_ARM_SMC:
22077       if (((unsigned long) value) > 0xffff)
22078         as_bad_where (fixP->fx_file, fixP->fx_line,
22079                       _("invalid smc expression"));
22080       newval = md_chars_to_number (buf, INSN_SIZE);
22081       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
22082       md_number_to_chars (buf, newval, INSN_SIZE);
22083       break;
22084
22085     case BFD_RELOC_ARM_HVC:
22086       if (((unsigned long) value) > 0xffff)
22087         as_bad_where (fixP->fx_file, fixP->fx_line,
22088                       _("invalid hvc expression"));
22089       newval = md_chars_to_number (buf, INSN_SIZE);
22090       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
22091       md_number_to_chars (buf, newval, INSN_SIZE);
22092       break;
22093
22094     case BFD_RELOC_ARM_SWI:
22095       if (fixP->tc_fix_data != 0)
22096         {
22097           if (((unsigned long) value) > 0xff)
22098             as_bad_where (fixP->fx_file, fixP->fx_line,
22099                           _("invalid swi expression"));
22100           newval = md_chars_to_number (buf, THUMB_SIZE);
22101           newval |= value;
22102           md_number_to_chars (buf, newval, THUMB_SIZE);
22103         }
22104       else
22105         {
22106           if (((unsigned long) value) > 0x00ffffff)
22107             as_bad_where (fixP->fx_file, fixP->fx_line,
22108                           _("invalid swi expression"));
22109           newval = md_chars_to_number (buf, INSN_SIZE);
22110           newval |= value;
22111           md_number_to_chars (buf, newval, INSN_SIZE);
22112         }
22113       break;
22114
22115     case BFD_RELOC_ARM_MULTI:
22116       if (((unsigned long) value) > 0xffff)
22117         as_bad_where (fixP->fx_file, fixP->fx_line,
22118                       _("invalid expression in load/store multiple"));
22119       newval = value | md_chars_to_number (buf, INSN_SIZE);
22120       md_number_to_chars (buf, newval, INSN_SIZE);
22121       break;
22122
22123 #ifdef OBJ_ELF
22124     case BFD_RELOC_ARM_PCREL_CALL:
22125
22126       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22127           && fixP->fx_addsy
22128           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22129           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22130           && THUMB_IS_FUNC (fixP->fx_addsy))
22131         /* Flip the bl to blx. This is a simple flip
22132            bit here because we generate PCREL_CALL for
22133            unconditional bls.  */
22134         {
22135           newval = md_chars_to_number (buf, INSN_SIZE);
22136           newval = newval | 0x10000000;
22137           md_number_to_chars (buf, newval, INSN_SIZE);
22138           temp = 1;
22139           fixP->fx_done = 1;
22140         }
22141       else
22142         temp = 3;
22143       goto arm_branch_common;
22144
22145     case BFD_RELOC_ARM_PCREL_JUMP:
22146       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22147           && fixP->fx_addsy
22148           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22149           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22150           && THUMB_IS_FUNC (fixP->fx_addsy))
22151         {
22152           /* This would map to a bl<cond>, b<cond>,
22153              b<always> to a Thumb function. We
22154              need to force a relocation for this particular
22155              case.  */
22156           newval = md_chars_to_number (buf, INSN_SIZE);
22157           fixP->fx_done = 0;
22158         }
22159
22160     case BFD_RELOC_ARM_PLT32:
22161 #endif
22162     case BFD_RELOC_ARM_PCREL_BRANCH:
22163       temp = 3;
22164       goto arm_branch_common;
22165
22166     case BFD_RELOC_ARM_PCREL_BLX:
22167
22168       temp = 1;
22169       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22170           && fixP->fx_addsy
22171           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22172           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22173           && ARM_IS_FUNC (fixP->fx_addsy))
22174         {
22175           /* Flip the blx to a bl and warn.  */
22176           const char *name = S_GET_NAME (fixP->fx_addsy);
22177           newval = 0xeb000000;
22178           as_warn_where (fixP->fx_file, fixP->fx_line,
22179                          _("blx to '%s' an ARM ISA state function changed to bl"),
22180                           name);
22181           md_number_to_chars (buf, newval, INSN_SIZE);
22182           temp = 3;
22183           fixP->fx_done = 1;
22184         }
22185
22186 #ifdef OBJ_ELF
22187        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22188          fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
22189 #endif
22190
22191     arm_branch_common:
22192       /* We are going to store value (shifted right by two) in the
22193          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
22194          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
22195          also be be clear.  */
22196       if (value & temp)
22197         as_bad_where (fixP->fx_file, fixP->fx_line,
22198                       _("misaligned branch destination"));
22199       if ((value & (offsetT)0xfe000000) != (offsetT)0
22200           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
22201         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22202
22203       if (fixP->fx_done || !seg->use_rela_p)
22204         {
22205           newval = md_chars_to_number (buf, INSN_SIZE);
22206           newval |= (value >> 2) & 0x00ffffff;
22207           /* Set the H bit on BLX instructions.  */
22208           if (temp == 1)
22209             {
22210               if (value & 2)
22211                 newval |= 0x01000000;
22212               else
22213                 newval &= ~0x01000000;
22214             }
22215           md_number_to_chars (buf, newval, INSN_SIZE);
22216         }
22217       break;
22218
22219     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
22220       /* CBZ can only branch forward.  */
22221
22222       /* Attempts to use CBZ to branch to the next instruction
22223          (which, strictly speaking, are prohibited) will be turned into
22224          no-ops.
22225
22226          FIXME: It may be better to remove the instruction completely and
22227          perform relaxation.  */
22228       if (value == -2)
22229         {
22230           newval = md_chars_to_number (buf, THUMB_SIZE);
22231           newval = 0xbf00; /* NOP encoding T1 */
22232           md_number_to_chars (buf, newval, THUMB_SIZE);
22233         }
22234       else
22235         {
22236           if (value & ~0x7e)
22237             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22238
22239           if (fixP->fx_done || !seg->use_rela_p)
22240             {
22241               newval = md_chars_to_number (buf, THUMB_SIZE);
22242               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
22243               md_number_to_chars (buf, newval, THUMB_SIZE);
22244             }
22245         }
22246       break;
22247
22248     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
22249       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
22250         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22251
22252       if (fixP->fx_done || !seg->use_rela_p)
22253         {
22254           newval = md_chars_to_number (buf, THUMB_SIZE);
22255           newval |= (value & 0x1ff) >> 1;
22256           md_number_to_chars (buf, newval, THUMB_SIZE);
22257         }
22258       break;
22259
22260     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
22261       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
22262         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22263
22264       if (fixP->fx_done || !seg->use_rela_p)
22265         {
22266           newval = md_chars_to_number (buf, THUMB_SIZE);
22267           newval |= (value & 0xfff) >> 1;
22268           md_number_to_chars (buf, newval, THUMB_SIZE);
22269         }
22270       break;
22271
22272     case BFD_RELOC_THUMB_PCREL_BRANCH20:
22273       if (fixP->fx_addsy
22274           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22275           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22276           && ARM_IS_FUNC (fixP->fx_addsy)
22277           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22278         {
22279           /* Force a relocation for a branch 20 bits wide.  */
22280           fixP->fx_done = 0;
22281         }
22282       if ((value & ~0x1fffff) && ((value & ~0x0fffff) != ~0x0fffff))
22283         as_bad_where (fixP->fx_file, fixP->fx_line,
22284                       _("conditional branch out of range"));
22285
22286       if (fixP->fx_done || !seg->use_rela_p)
22287         {
22288           offsetT newval2;
22289           addressT S, J1, J2, lo, hi;
22290
22291           S  = (value & 0x00100000) >> 20;
22292           J2 = (value & 0x00080000) >> 19;
22293           J1 = (value & 0x00040000) >> 18;
22294           hi = (value & 0x0003f000) >> 12;
22295           lo = (value & 0x00000ffe) >> 1;
22296
22297           newval   = md_chars_to_number (buf, THUMB_SIZE);
22298           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22299           newval  |= (S << 10) | hi;
22300           newval2 |= (J1 << 13) | (J2 << 11) | lo;
22301           md_number_to_chars (buf, newval, THUMB_SIZE);
22302           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
22303         }
22304       break;
22305
22306     case BFD_RELOC_THUMB_PCREL_BLX:
22307       /* If there is a blx from a thumb state function to
22308          another thumb function flip this to a bl and warn
22309          about it.  */
22310
22311       if (fixP->fx_addsy
22312           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22313           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22314           && THUMB_IS_FUNC (fixP->fx_addsy))
22315         {
22316           const char *name = S_GET_NAME (fixP->fx_addsy);
22317           as_warn_where (fixP->fx_file, fixP->fx_line,
22318                          _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
22319                          name);
22320           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22321           newval = newval | 0x1000;
22322           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22323           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22324           fixP->fx_done = 1;
22325         }
22326
22327
22328       goto thumb_bl_common;
22329
22330     case BFD_RELOC_THUMB_PCREL_BRANCH23:
22331       /* A bl from Thumb state ISA to an internal ARM state function
22332          is converted to a blx.  */
22333       if (fixP->fx_addsy
22334           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22335           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22336           && ARM_IS_FUNC (fixP->fx_addsy)
22337           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22338         {
22339           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22340           newval = newval & ~0x1000;
22341           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22342           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
22343           fixP->fx_done = 1;
22344         }
22345
22346     thumb_bl_common:
22347
22348       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22349         /* For a BLX instruction, make sure that the relocation is rounded up
22350            to a word boundary.  This follows the semantics of the instruction
22351            which specifies that bit 1 of the target address will come from bit
22352            1 of the base address.  */
22353         value = (value + 3) & ~ 3;
22354
22355 #ifdef OBJ_ELF
22356        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4
22357            && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22358          fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22359 #endif
22360
22361       if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
22362         {
22363           if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
22364             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22365           else if ((value & ~0x1ffffff)
22366                    && ((value & ~0x1ffffff) != ~0x1ffffff))
22367             as_bad_where (fixP->fx_file, fixP->fx_line,
22368                           _("Thumb2 branch out of range"));
22369         }
22370
22371       if (fixP->fx_done || !seg->use_rela_p)
22372         encode_thumb2_b_bl_offset (buf, value);
22373
22374       break;
22375
22376     case BFD_RELOC_THUMB_PCREL_BRANCH25:
22377       if ((value & ~0x0ffffff) && ((value & ~0x0ffffff) != ~0x0ffffff))
22378         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22379
22380       if (fixP->fx_done || !seg->use_rela_p)
22381           encode_thumb2_b_bl_offset (buf, value);
22382
22383       break;
22384
22385     case BFD_RELOC_8:
22386       if (fixP->fx_done || !seg->use_rela_p)
22387         md_number_to_chars (buf, value, 1);
22388       break;
22389
22390     case BFD_RELOC_16:
22391       if (fixP->fx_done || !seg->use_rela_p)
22392         md_number_to_chars (buf, value, 2);
22393       break;
22394
22395 #ifdef OBJ_ELF
22396     case BFD_RELOC_ARM_TLS_CALL:
22397     case BFD_RELOC_ARM_THM_TLS_CALL:
22398     case BFD_RELOC_ARM_TLS_DESCSEQ:
22399     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
22400       S_SET_THREAD_LOCAL (fixP->fx_addsy);
22401       break;
22402
22403     case BFD_RELOC_ARM_TLS_GOTDESC:
22404     case BFD_RELOC_ARM_TLS_GD32:
22405     case BFD_RELOC_ARM_TLS_LE32:
22406     case BFD_RELOC_ARM_TLS_IE32:
22407     case BFD_RELOC_ARM_TLS_LDM32:
22408     case BFD_RELOC_ARM_TLS_LDO32:
22409       S_SET_THREAD_LOCAL (fixP->fx_addsy);
22410       /* fall through */
22411
22412     case BFD_RELOC_ARM_GOT32:
22413     case BFD_RELOC_ARM_GOTOFF:
22414       if (fixP->fx_done || !seg->use_rela_p)
22415         md_number_to_chars (buf, 0, 4);
22416       break;
22417
22418     case BFD_RELOC_ARM_GOT_PREL:
22419       if (fixP->fx_done || !seg->use_rela_p)
22420         md_number_to_chars (buf, value, 4);
22421       break;
22422
22423     case BFD_RELOC_ARM_TARGET2:
22424       /* TARGET2 is not partial-inplace, so we need to write the
22425          addend here for REL targets, because it won't be written out
22426          during reloc processing later.  */
22427       if (fixP->fx_done || !seg->use_rela_p)
22428         md_number_to_chars (buf, fixP->fx_offset, 4);
22429       break;
22430 #endif
22431
22432     case BFD_RELOC_RVA:
22433     case BFD_RELOC_32:
22434     case BFD_RELOC_ARM_TARGET1:
22435     case BFD_RELOC_ARM_ROSEGREL32:
22436     case BFD_RELOC_ARM_SBREL32:
22437     case BFD_RELOC_32_PCREL:
22438 #ifdef TE_PE
22439     case BFD_RELOC_32_SECREL:
22440 #endif
22441       if (fixP->fx_done || !seg->use_rela_p)
22442 #ifdef TE_WINCE
22443         /* For WinCE we only do this for pcrel fixups.  */
22444         if (fixP->fx_done || fixP->fx_pcrel)
22445 #endif
22446           md_number_to_chars (buf, value, 4);
22447       break;
22448
22449 #ifdef OBJ_ELF
22450     case BFD_RELOC_ARM_PREL31:
22451       if (fixP->fx_done || !seg->use_rela_p)
22452         {
22453           newval = md_chars_to_number (buf, 4) & 0x80000000;
22454           if ((value ^ (value >> 1)) & 0x40000000)
22455             {
22456               as_bad_where (fixP->fx_file, fixP->fx_line,
22457                             _("rel31 relocation overflow"));
22458             }
22459           newval |= value & 0x7fffffff;
22460           md_number_to_chars (buf, newval, 4);
22461         }
22462       break;
22463 #endif
22464
22465     case BFD_RELOC_ARM_CP_OFF_IMM:
22466     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
22467       if (value < -1023 || value > 1023 || (value & 3))
22468         as_bad_where (fixP->fx_file, fixP->fx_line,
22469                       _("co-processor offset out of range"));
22470     cp_off_common:
22471       sign = value > 0;
22472       if (value < 0)
22473         value = -value;
22474       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22475           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22476         newval = md_chars_to_number (buf, INSN_SIZE);
22477       else
22478         newval = get_thumb32_insn (buf);
22479       if (value == 0)
22480         newval &= 0xffffff00;
22481       else
22482         {
22483           newval &= 0xff7fff00;
22484           newval |= (value >> 2) | (sign ? INDEX_UP : 0);
22485         }
22486       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22487           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22488         md_number_to_chars (buf, newval, INSN_SIZE);
22489       else
22490         put_thumb32_insn (buf, newval);
22491       break;
22492
22493     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
22494     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
22495       if (value < -255 || value > 255)
22496         as_bad_where (fixP->fx_file, fixP->fx_line,
22497                       _("co-processor offset out of range"));
22498       value *= 4;
22499       goto cp_off_common;
22500
22501     case BFD_RELOC_ARM_THUMB_OFFSET:
22502       newval = md_chars_to_number (buf, THUMB_SIZE);
22503       /* Exactly what ranges, and where the offset is inserted depends
22504          on the type of instruction, we can establish this from the
22505          top 4 bits.  */
22506       switch (newval >> 12)
22507         {
22508         case 4: /* PC load.  */
22509           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
22510              forced to zero for these loads; md_pcrel_from has already
22511              compensated for this.  */
22512           if (value & 3)
22513             as_bad_where (fixP->fx_file, fixP->fx_line,
22514                           _("invalid offset, target not word aligned (0x%08lX)"),
22515                           (((unsigned long) fixP->fx_frag->fr_address
22516                             + (unsigned long) fixP->fx_where) & ~3)
22517                           + (unsigned long) value);
22518
22519           if (value & ~0x3fc)
22520             as_bad_where (fixP->fx_file, fixP->fx_line,
22521                           _("invalid offset, value too big (0x%08lX)"),
22522                           (long) value);
22523
22524           newval |= value >> 2;
22525           break;
22526
22527         case 9: /* SP load/store.  */
22528           if (value & ~0x3fc)
22529             as_bad_where (fixP->fx_file, fixP->fx_line,
22530                           _("invalid offset, value too big (0x%08lX)"),
22531                           (long) value);
22532           newval |= value >> 2;
22533           break;
22534
22535         case 6: /* Word load/store.  */
22536           if (value & ~0x7c)
22537             as_bad_where (fixP->fx_file, fixP->fx_line,
22538                           _("invalid offset, value too big (0x%08lX)"),
22539                           (long) value);
22540           newval |= value << 4; /* 6 - 2.  */
22541           break;
22542
22543         case 7: /* Byte load/store.  */
22544           if (value & ~0x1f)
22545             as_bad_where (fixP->fx_file, fixP->fx_line,
22546                           _("invalid offset, value too big (0x%08lX)"),
22547                           (long) value);
22548           newval |= value << 6;
22549           break;
22550
22551         case 8: /* Halfword load/store.  */
22552           if (value & ~0x3e)
22553             as_bad_where (fixP->fx_file, fixP->fx_line,
22554                           _("invalid offset, value too big (0x%08lX)"),
22555                           (long) value);
22556           newval |= value << 5; /* 6 - 1.  */
22557           break;
22558
22559         default:
22560           as_bad_where (fixP->fx_file, fixP->fx_line,
22561                         "Unable to process relocation for thumb opcode: %lx",
22562                         (unsigned long) newval);
22563           break;
22564         }
22565       md_number_to_chars (buf, newval, THUMB_SIZE);
22566       break;
22567
22568     case BFD_RELOC_ARM_THUMB_ADD:
22569       /* This is a complicated relocation, since we use it for all of
22570          the following immediate relocations:
22571
22572             3bit ADD/SUB
22573             8bit ADD/SUB
22574             9bit ADD/SUB SP word-aligned
22575            10bit ADD PC/SP word-aligned
22576
22577          The type of instruction being processed is encoded in the
22578          instruction field:
22579
22580            0x8000  SUB
22581            0x00F0  Rd
22582            0x000F  Rs
22583       */
22584       newval = md_chars_to_number (buf, THUMB_SIZE);
22585       {
22586         int rd = (newval >> 4) & 0xf;
22587         int rs = newval & 0xf;
22588         int subtract = !!(newval & 0x8000);
22589
22590         /* Check for HI regs, only very restricted cases allowed:
22591            Adjusting SP, and using PC or SP to get an address.  */
22592         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
22593             || (rs > 7 && rs != REG_SP && rs != REG_PC))
22594           as_bad_where (fixP->fx_file, fixP->fx_line,
22595                         _("invalid Hi register with immediate"));
22596
22597         /* If value is negative, choose the opposite instruction.  */
22598         if (value < 0)
22599           {
22600             value = -value;
22601             subtract = !subtract;
22602             if (value < 0)
22603               as_bad_where (fixP->fx_file, fixP->fx_line,
22604                             _("immediate value out of range"));
22605           }
22606
22607         if (rd == REG_SP)
22608           {
22609             if (value & ~0x1fc)
22610               as_bad_where (fixP->fx_file, fixP->fx_line,
22611                             _("invalid immediate for stack address calculation"));
22612             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
22613             newval |= value >> 2;
22614           }
22615         else if (rs == REG_PC || rs == REG_SP)
22616           {
22617             if (subtract || value & ~0x3fc)
22618               as_bad_where (fixP->fx_file, fixP->fx_line,
22619                             _("invalid immediate for address calculation (value = 0x%08lX)"),
22620                             (unsigned long) value);
22621             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
22622             newval |= rd << 8;
22623             newval |= value >> 2;
22624           }
22625         else if (rs == rd)
22626           {
22627             if (value & ~0xff)
22628               as_bad_where (fixP->fx_file, fixP->fx_line,
22629                             _("immediate value out of range"));
22630             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
22631             newval |= (rd << 8) | value;
22632           }
22633         else
22634           {
22635             if (value & ~0x7)
22636               as_bad_where (fixP->fx_file, fixP->fx_line,
22637                             _("immediate value out of range"));
22638             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
22639             newval |= rd | (rs << 3) | (value << 6);
22640           }
22641       }
22642       md_number_to_chars (buf, newval, THUMB_SIZE);
22643       break;
22644
22645     case BFD_RELOC_ARM_THUMB_IMM:
22646       newval = md_chars_to_number (buf, THUMB_SIZE);
22647       if (value < 0 || value > 255)
22648         as_bad_where (fixP->fx_file, fixP->fx_line,
22649                       _("invalid immediate: %ld is out of range"),
22650                       (long) value);
22651       newval |= value;
22652       md_number_to_chars (buf, newval, THUMB_SIZE);
22653       break;
22654
22655     case BFD_RELOC_ARM_THUMB_SHIFT:
22656       /* 5bit shift value (0..32).  LSL cannot take 32.  */
22657       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
22658       temp = newval & 0xf800;
22659       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
22660         as_bad_where (fixP->fx_file, fixP->fx_line,
22661                       _("invalid shift value: %ld"), (long) value);
22662       /* Shifts of zero must be encoded as LSL.  */
22663       if (value == 0)
22664         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
22665       /* Shifts of 32 are encoded as zero.  */
22666       else if (value == 32)
22667         value = 0;
22668       newval |= value << 6;
22669       md_number_to_chars (buf, newval, THUMB_SIZE);
22670       break;
22671
22672     case BFD_RELOC_VTABLE_INHERIT:
22673     case BFD_RELOC_VTABLE_ENTRY:
22674       fixP->fx_done = 0;
22675       return;
22676
22677     case BFD_RELOC_ARM_MOVW:
22678     case BFD_RELOC_ARM_MOVT:
22679     case BFD_RELOC_ARM_THUMB_MOVW:
22680     case BFD_RELOC_ARM_THUMB_MOVT:
22681       if (fixP->fx_done || !seg->use_rela_p)
22682         {
22683           /* REL format relocations are limited to a 16-bit addend.  */
22684           if (!fixP->fx_done)
22685             {
22686               if (value < -0x8000 || value > 0x7fff)
22687                   as_bad_where (fixP->fx_file, fixP->fx_line,
22688                                 _("offset out of range"));
22689             }
22690           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
22691                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22692             {
22693               value >>= 16;
22694             }
22695
22696           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
22697               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22698             {
22699               newval = get_thumb32_insn (buf);
22700               newval &= 0xfbf08f00;
22701               newval |= (value & 0xf000) << 4;
22702               newval |= (value & 0x0800) << 15;
22703               newval |= (value & 0x0700) << 4;
22704               newval |= (value & 0x00ff);
22705               put_thumb32_insn (buf, newval);
22706             }
22707           else
22708             {
22709               newval = md_chars_to_number (buf, 4);
22710               newval &= 0xfff0f000;
22711               newval |= value & 0x0fff;
22712               newval |= (value & 0xf000) << 4;
22713               md_number_to_chars (buf, newval, 4);
22714             }
22715         }
22716       return;
22717
22718    case BFD_RELOC_ARM_ALU_PC_G0_NC:
22719    case BFD_RELOC_ARM_ALU_PC_G0:
22720    case BFD_RELOC_ARM_ALU_PC_G1_NC:
22721    case BFD_RELOC_ARM_ALU_PC_G1:
22722    case BFD_RELOC_ARM_ALU_PC_G2:
22723    case BFD_RELOC_ARM_ALU_SB_G0_NC:
22724    case BFD_RELOC_ARM_ALU_SB_G0:
22725    case BFD_RELOC_ARM_ALU_SB_G1_NC:
22726    case BFD_RELOC_ARM_ALU_SB_G1:
22727    case BFD_RELOC_ARM_ALU_SB_G2:
22728      gas_assert (!fixP->fx_done);
22729      if (!seg->use_rela_p)
22730        {
22731          bfd_vma insn;
22732          bfd_vma encoded_addend;
22733          bfd_vma addend_abs = abs (value);
22734
22735          /* Check that the absolute value of the addend can be
22736             expressed as an 8-bit constant plus a rotation.  */
22737          encoded_addend = encode_arm_immediate (addend_abs);
22738          if (encoded_addend == (unsigned int) FAIL)
22739            as_bad_where (fixP->fx_file, fixP->fx_line,
22740                          _("the offset 0x%08lX is not representable"),
22741                          (unsigned long) addend_abs);
22742
22743          /* Extract the instruction.  */
22744          insn = md_chars_to_number (buf, INSN_SIZE);
22745
22746          /* If the addend is positive, use an ADD instruction.
22747             Otherwise use a SUB.  Take care not to destroy the S bit.  */
22748          insn &= 0xff1fffff;
22749          if (value < 0)
22750            insn |= 1 << 22;
22751          else
22752            insn |= 1 << 23;
22753
22754          /* Place the encoded addend into the first 12 bits of the
22755             instruction.  */
22756          insn &= 0xfffff000;
22757          insn |= encoded_addend;
22758
22759          /* Update the instruction.  */
22760          md_number_to_chars (buf, insn, INSN_SIZE);
22761        }
22762      break;
22763
22764     case BFD_RELOC_ARM_LDR_PC_G0:
22765     case BFD_RELOC_ARM_LDR_PC_G1:
22766     case BFD_RELOC_ARM_LDR_PC_G2:
22767     case BFD_RELOC_ARM_LDR_SB_G0:
22768     case BFD_RELOC_ARM_LDR_SB_G1:
22769     case BFD_RELOC_ARM_LDR_SB_G2:
22770       gas_assert (!fixP->fx_done);
22771       if (!seg->use_rela_p)
22772         {
22773           bfd_vma insn;
22774           bfd_vma addend_abs = abs (value);
22775
22776           /* Check that the absolute value of the addend can be
22777              encoded in 12 bits.  */
22778           if (addend_abs >= 0x1000)
22779             as_bad_where (fixP->fx_file, fixP->fx_line,
22780                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
22781                           (unsigned long) addend_abs);
22782
22783           /* Extract the instruction.  */
22784           insn = md_chars_to_number (buf, INSN_SIZE);
22785
22786           /* If the addend is negative, clear bit 23 of the instruction.
22787              Otherwise set it.  */
22788           if (value < 0)
22789             insn &= ~(1 << 23);
22790           else
22791             insn |= 1 << 23;
22792
22793           /* Place the absolute value of the addend into the first 12 bits
22794              of the instruction.  */
22795           insn &= 0xfffff000;
22796           insn |= addend_abs;
22797
22798           /* Update the instruction.  */
22799           md_number_to_chars (buf, insn, INSN_SIZE);
22800         }
22801       break;
22802
22803     case BFD_RELOC_ARM_LDRS_PC_G0:
22804     case BFD_RELOC_ARM_LDRS_PC_G1:
22805     case BFD_RELOC_ARM_LDRS_PC_G2:
22806     case BFD_RELOC_ARM_LDRS_SB_G0:
22807     case BFD_RELOC_ARM_LDRS_SB_G1:
22808     case BFD_RELOC_ARM_LDRS_SB_G2:
22809       gas_assert (!fixP->fx_done);
22810       if (!seg->use_rela_p)
22811         {
22812           bfd_vma insn;
22813           bfd_vma addend_abs = abs (value);
22814
22815           /* Check that the absolute value of the addend can be
22816              encoded in 8 bits.  */
22817           if (addend_abs >= 0x100)
22818             as_bad_where (fixP->fx_file, fixP->fx_line,
22819                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
22820                           (unsigned long) addend_abs);
22821
22822           /* Extract the instruction.  */
22823           insn = md_chars_to_number (buf, INSN_SIZE);
22824
22825           /* If the addend is negative, clear bit 23 of the instruction.
22826              Otherwise set it.  */
22827           if (value < 0)
22828             insn &= ~(1 << 23);
22829           else
22830             insn |= 1 << 23;
22831
22832           /* Place the first four bits of the absolute value of the addend
22833              into the first 4 bits of the instruction, and the remaining
22834              four into bits 8 .. 11.  */
22835           insn &= 0xfffff0f0;
22836           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
22837
22838           /* Update the instruction.  */
22839           md_number_to_chars (buf, insn, INSN_SIZE);
22840         }
22841       break;
22842
22843     case BFD_RELOC_ARM_LDC_PC_G0:
22844     case BFD_RELOC_ARM_LDC_PC_G1:
22845     case BFD_RELOC_ARM_LDC_PC_G2:
22846     case BFD_RELOC_ARM_LDC_SB_G0:
22847     case BFD_RELOC_ARM_LDC_SB_G1:
22848     case BFD_RELOC_ARM_LDC_SB_G2:
22849       gas_assert (!fixP->fx_done);
22850       if (!seg->use_rela_p)
22851         {
22852           bfd_vma insn;
22853           bfd_vma addend_abs = abs (value);
22854
22855           /* Check that the absolute value of the addend is a multiple of
22856              four and, when divided by four, fits in 8 bits.  */
22857           if (addend_abs & 0x3)
22858             as_bad_where (fixP->fx_file, fixP->fx_line,
22859                           _("bad offset 0x%08lX (must be word-aligned)"),
22860                           (unsigned long) addend_abs);
22861
22862           if ((addend_abs >> 2) > 0xff)
22863             as_bad_where (fixP->fx_file, fixP->fx_line,
22864                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
22865                           (unsigned long) addend_abs);
22866
22867           /* Extract the instruction.  */
22868           insn = md_chars_to_number (buf, INSN_SIZE);
22869
22870           /* If the addend is negative, clear bit 23 of the instruction.
22871              Otherwise set it.  */
22872           if (value < 0)
22873             insn &= ~(1 << 23);
22874           else
22875             insn |= 1 << 23;
22876
22877           /* Place the addend (divided by four) into the first eight
22878              bits of the instruction.  */
22879           insn &= 0xfffffff0;
22880           insn |= addend_abs >> 2;
22881
22882           /* Update the instruction.  */
22883           md_number_to_chars (buf, insn, INSN_SIZE);
22884         }
22885       break;
22886
22887     case BFD_RELOC_ARM_V4BX:
22888       /* This will need to go in the object file.  */
22889       fixP->fx_done = 0;
22890       break;
22891
22892     case BFD_RELOC_UNUSED:
22893     default:
22894       as_bad_where (fixP->fx_file, fixP->fx_line,
22895                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
22896     }
22897 }
22898
22899 /* Translate internal representation of relocation info to BFD target
22900    format.  */
22901
22902 arelent *
22903 tc_gen_reloc (asection *section, fixS *fixp)
22904 {
22905   arelent * reloc;
22906   bfd_reloc_code_real_type code;
22907
22908   reloc = (arelent *) xmalloc (sizeof (arelent));
22909
22910   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
22911   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
22912   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
22913
22914   if (fixp->fx_pcrel)
22915     {
22916       if (section->use_rela_p)
22917         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
22918       else
22919         fixp->fx_offset = reloc->address;
22920     }
22921   reloc->addend = fixp->fx_offset;
22922
22923   switch (fixp->fx_r_type)
22924     {
22925     case BFD_RELOC_8:
22926       if (fixp->fx_pcrel)
22927         {
22928           code = BFD_RELOC_8_PCREL;
22929           break;
22930         }
22931
22932     case BFD_RELOC_16:
22933       if (fixp->fx_pcrel)
22934         {
22935           code = BFD_RELOC_16_PCREL;
22936           break;
22937         }
22938
22939     case BFD_RELOC_32:
22940       if (fixp->fx_pcrel)
22941         {
22942           code = BFD_RELOC_32_PCREL;
22943           break;
22944         }
22945
22946     case BFD_RELOC_ARM_MOVW:
22947       if (fixp->fx_pcrel)
22948         {
22949           code = BFD_RELOC_ARM_MOVW_PCREL;
22950           break;
22951         }
22952
22953     case BFD_RELOC_ARM_MOVT:
22954       if (fixp->fx_pcrel)
22955         {
22956           code = BFD_RELOC_ARM_MOVT_PCREL;
22957           break;
22958         }
22959
22960     case BFD_RELOC_ARM_THUMB_MOVW:
22961       if (fixp->fx_pcrel)
22962         {
22963           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
22964           break;
22965         }
22966
22967     case BFD_RELOC_ARM_THUMB_MOVT:
22968       if (fixp->fx_pcrel)
22969         {
22970           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
22971           break;
22972         }
22973
22974     case BFD_RELOC_NONE:
22975     case BFD_RELOC_ARM_PCREL_BRANCH:
22976     case BFD_RELOC_ARM_PCREL_BLX:
22977     case BFD_RELOC_RVA:
22978     case BFD_RELOC_THUMB_PCREL_BRANCH7:
22979     case BFD_RELOC_THUMB_PCREL_BRANCH9:
22980     case BFD_RELOC_THUMB_PCREL_BRANCH12:
22981     case BFD_RELOC_THUMB_PCREL_BRANCH20:
22982     case BFD_RELOC_THUMB_PCREL_BRANCH23:
22983     case BFD_RELOC_THUMB_PCREL_BRANCH25:
22984     case BFD_RELOC_VTABLE_ENTRY:
22985     case BFD_RELOC_VTABLE_INHERIT:
22986 #ifdef TE_PE
22987     case BFD_RELOC_32_SECREL:
22988 #endif
22989       code = fixp->fx_r_type;
22990       break;
22991
22992     case BFD_RELOC_THUMB_PCREL_BLX:
22993 #ifdef OBJ_ELF
22994       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22995         code = BFD_RELOC_THUMB_PCREL_BRANCH23;
22996       else
22997 #endif
22998         code = BFD_RELOC_THUMB_PCREL_BLX;
22999       break;
23000
23001     case BFD_RELOC_ARM_LITERAL:
23002     case BFD_RELOC_ARM_HWLITERAL:
23003       /* If this is called then the a literal has
23004          been referenced across a section boundary.  */
23005       as_bad_where (fixp->fx_file, fixp->fx_line,
23006                     _("literal referenced across section boundary"));
23007       return NULL;
23008
23009 #ifdef OBJ_ELF
23010     case BFD_RELOC_ARM_TLS_CALL:
23011     case BFD_RELOC_ARM_THM_TLS_CALL:
23012     case BFD_RELOC_ARM_TLS_DESCSEQ:
23013     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
23014     case BFD_RELOC_ARM_GOT32:
23015     case BFD_RELOC_ARM_GOTOFF:
23016     case BFD_RELOC_ARM_GOT_PREL:
23017     case BFD_RELOC_ARM_PLT32:
23018     case BFD_RELOC_ARM_TARGET1:
23019     case BFD_RELOC_ARM_ROSEGREL32:
23020     case BFD_RELOC_ARM_SBREL32:
23021     case BFD_RELOC_ARM_PREL31:
23022     case BFD_RELOC_ARM_TARGET2:
23023     case BFD_RELOC_ARM_TLS_LE32:
23024     case BFD_RELOC_ARM_TLS_LDO32:
23025     case BFD_RELOC_ARM_PCREL_CALL:
23026     case BFD_RELOC_ARM_PCREL_JUMP:
23027     case BFD_RELOC_ARM_ALU_PC_G0_NC:
23028     case BFD_RELOC_ARM_ALU_PC_G0:
23029     case BFD_RELOC_ARM_ALU_PC_G1_NC:
23030     case BFD_RELOC_ARM_ALU_PC_G1:
23031     case BFD_RELOC_ARM_ALU_PC_G2:
23032     case BFD_RELOC_ARM_LDR_PC_G0:
23033     case BFD_RELOC_ARM_LDR_PC_G1:
23034     case BFD_RELOC_ARM_LDR_PC_G2:
23035     case BFD_RELOC_ARM_LDRS_PC_G0:
23036     case BFD_RELOC_ARM_LDRS_PC_G1:
23037     case BFD_RELOC_ARM_LDRS_PC_G2:
23038     case BFD_RELOC_ARM_LDC_PC_G0:
23039     case BFD_RELOC_ARM_LDC_PC_G1:
23040     case BFD_RELOC_ARM_LDC_PC_G2:
23041     case BFD_RELOC_ARM_ALU_SB_G0_NC:
23042     case BFD_RELOC_ARM_ALU_SB_G0:
23043     case BFD_RELOC_ARM_ALU_SB_G1_NC:
23044     case BFD_RELOC_ARM_ALU_SB_G1:
23045     case BFD_RELOC_ARM_ALU_SB_G2:
23046     case BFD_RELOC_ARM_LDR_SB_G0:
23047     case BFD_RELOC_ARM_LDR_SB_G1:
23048     case BFD_RELOC_ARM_LDR_SB_G2:
23049     case BFD_RELOC_ARM_LDRS_SB_G0:
23050     case BFD_RELOC_ARM_LDRS_SB_G1:
23051     case BFD_RELOC_ARM_LDRS_SB_G2:
23052     case BFD_RELOC_ARM_LDC_SB_G0:
23053     case BFD_RELOC_ARM_LDC_SB_G1:
23054     case BFD_RELOC_ARM_LDC_SB_G2:
23055     case BFD_RELOC_ARM_V4BX:
23056       code = fixp->fx_r_type;
23057       break;
23058
23059     case BFD_RELOC_ARM_TLS_GOTDESC:
23060     case BFD_RELOC_ARM_TLS_GD32:
23061     case BFD_RELOC_ARM_TLS_IE32:
23062     case BFD_RELOC_ARM_TLS_LDM32:
23063       /* BFD will include the symbol's address in the addend.
23064          But we don't want that, so subtract it out again here.  */
23065       if (!S_IS_COMMON (fixp->fx_addsy))
23066         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
23067       code = fixp->fx_r_type;
23068       break;
23069 #endif
23070
23071     case BFD_RELOC_ARM_IMMEDIATE:
23072       as_bad_where (fixp->fx_file, fixp->fx_line,
23073                     _("internal relocation (type: IMMEDIATE) not fixed up"));
23074       return NULL;
23075
23076     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
23077       as_bad_where (fixp->fx_file, fixp->fx_line,
23078                     _("ADRL used for a symbol not defined in the same file"));
23079       return NULL;
23080
23081     case BFD_RELOC_ARM_OFFSET_IMM:
23082       if (section->use_rela_p)
23083         {
23084           code = fixp->fx_r_type;
23085           break;
23086         }
23087
23088       if (fixp->fx_addsy != NULL
23089           && !S_IS_DEFINED (fixp->fx_addsy)
23090           && S_IS_LOCAL (fixp->fx_addsy))
23091         {
23092           as_bad_where (fixp->fx_file, fixp->fx_line,
23093                         _("undefined local label `%s'"),
23094                         S_GET_NAME (fixp->fx_addsy));
23095           return NULL;
23096         }
23097
23098       as_bad_where (fixp->fx_file, fixp->fx_line,
23099                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
23100       return NULL;
23101
23102     default:
23103       {
23104         char * type;
23105
23106         switch (fixp->fx_r_type)
23107           {
23108           case BFD_RELOC_NONE:             type = "NONE";         break;
23109           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
23110           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
23111           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
23112           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
23113           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
23114           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
23115           case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
23116           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
23117           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
23118           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
23119           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
23120           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
23121           default:                         type = _("<unknown>"); break;
23122           }
23123         as_bad_where (fixp->fx_file, fixp->fx_line,
23124                       _("cannot represent %s relocation in this object file format"),
23125                       type);
23126         return NULL;
23127       }
23128     }
23129
23130 #ifdef OBJ_ELF
23131   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
23132       && GOT_symbol
23133       && fixp->fx_addsy == GOT_symbol)
23134     {
23135       code = BFD_RELOC_ARM_GOTPC;
23136       reloc->addend = fixp->fx_offset = reloc->address;
23137     }
23138 #endif
23139
23140   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
23141
23142   if (reloc->howto == NULL)
23143     {
23144       as_bad_where (fixp->fx_file, fixp->fx_line,
23145                     _("cannot represent %s relocation in this object file format"),
23146                     bfd_get_reloc_code_name (code));
23147       return NULL;
23148     }
23149
23150   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
23151      vtable entry to be used in the relocation's section offset.  */
23152   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
23153     reloc->address = fixp->fx_offset;
23154
23155   return reloc;
23156 }
23157
23158 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
23159
23160 void
23161 cons_fix_new_arm (fragS *       frag,
23162                   int           where,
23163                   int           size,
23164                   expressionS * exp,
23165                   bfd_reloc_code_real_type reloc)
23166 {
23167   int pcrel = 0;
23168
23169   /* Pick a reloc.
23170      FIXME: @@ Should look at CPU word size.  */
23171   switch (size)
23172     {
23173     case 1:
23174       reloc = BFD_RELOC_8;
23175       break;
23176     case 2:
23177       reloc = BFD_RELOC_16;
23178       break;
23179     case 4:
23180     default:
23181       reloc = BFD_RELOC_32;
23182       break;
23183     case 8:
23184       reloc = BFD_RELOC_64;
23185       break;
23186     }
23187
23188 #ifdef TE_PE
23189   if (exp->X_op == O_secrel)
23190   {
23191     exp->X_op = O_symbol;
23192     reloc = BFD_RELOC_32_SECREL;
23193   }
23194 #endif
23195
23196   fix_new_exp (frag, where, size, exp, pcrel, reloc);
23197 }
23198
23199 #if defined (OBJ_COFF)
23200 void
23201 arm_validate_fix (fixS * fixP)
23202 {
23203   /* If the destination of the branch is a defined symbol which does not have
23204      the THUMB_FUNC attribute, then we must be calling a function which has
23205      the (interfacearm) attribute.  We look for the Thumb entry point to that
23206      function and change the branch to refer to that function instead.  */
23207   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
23208       && fixP->fx_addsy != NULL
23209       && S_IS_DEFINED (fixP->fx_addsy)
23210       && ! THUMB_IS_FUNC (fixP->fx_addsy))
23211     {
23212       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
23213     }
23214 }
23215 #endif
23216
23217
23218 int
23219 arm_force_relocation (struct fix * fixp)
23220 {
23221 #if defined (OBJ_COFF) && defined (TE_PE)
23222   if (fixp->fx_r_type == BFD_RELOC_RVA)
23223     return 1;
23224 #endif
23225
23226   /* In case we have a call or a branch to a function in ARM ISA mode from
23227      a thumb function or vice-versa force the relocation. These relocations
23228      are cleared off for some cores that might have blx and simple transformations
23229      are possible.  */
23230
23231 #ifdef OBJ_ELF
23232   switch (fixp->fx_r_type)
23233     {
23234     case BFD_RELOC_ARM_PCREL_JUMP:
23235     case BFD_RELOC_ARM_PCREL_CALL:
23236     case BFD_RELOC_THUMB_PCREL_BLX:
23237       if (THUMB_IS_FUNC (fixp->fx_addsy))
23238         return 1;
23239       break;
23240
23241     case BFD_RELOC_ARM_PCREL_BLX:
23242     case BFD_RELOC_THUMB_PCREL_BRANCH25:
23243     case BFD_RELOC_THUMB_PCREL_BRANCH20:
23244     case BFD_RELOC_THUMB_PCREL_BRANCH23:
23245       if (ARM_IS_FUNC (fixp->fx_addsy))
23246         return 1;
23247       break;
23248
23249     default:
23250       break;
23251     }
23252 #endif
23253
23254   /* Resolve these relocations even if the symbol is extern or weak.
23255      Technically this is probably wrong due to symbol preemption.
23256      In practice these relocations do not have enough range to be useful
23257      at dynamic link time, and some code (e.g. in the Linux kernel)
23258      expects these references to be resolved.  */
23259   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
23260       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
23261       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
23262       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
23263       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
23264       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
23265       || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
23266       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
23267       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
23268       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
23269       || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
23270       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
23271       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
23272       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
23273     return 0;
23274
23275   /* Always leave these relocations for the linker.  */
23276   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23277        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23278       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
23279     return 1;
23280
23281   /* Always generate relocations against function symbols.  */
23282   if (fixp->fx_r_type == BFD_RELOC_32
23283       && fixp->fx_addsy
23284       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
23285     return 1;
23286
23287   return generic_force_reloc (fixp);
23288 }
23289
23290 #if defined (OBJ_ELF) || defined (OBJ_COFF)
23291 /* Relocations against function names must be left unadjusted,
23292    so that the linker can use this information to generate interworking
23293    stubs.  The MIPS version of this function
23294    also prevents relocations that are mips-16 specific, but I do not
23295    know why it does this.
23296
23297    FIXME:
23298    There is one other problem that ought to be addressed here, but
23299    which currently is not:  Taking the address of a label (rather
23300    than a function) and then later jumping to that address.  Such
23301    addresses also ought to have their bottom bit set (assuming that
23302    they reside in Thumb code), but at the moment they will not.  */
23303
23304 bfd_boolean
23305 arm_fix_adjustable (fixS * fixP)
23306 {
23307   if (fixP->fx_addsy == NULL)
23308     return 1;
23309
23310   /* Preserve relocations against symbols with function type.  */
23311   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
23312     return FALSE;
23313
23314   if (THUMB_IS_FUNC (fixP->fx_addsy)
23315       && fixP->fx_subsy == NULL)
23316     return FALSE;
23317
23318   /* We need the symbol name for the VTABLE entries.  */
23319   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
23320       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
23321     return FALSE;
23322
23323   /* Don't allow symbols to be discarded on GOT related relocs.  */
23324   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
23325       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
23326       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
23327       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
23328       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
23329       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
23330       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
23331       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
23332       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
23333       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
23334       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
23335       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
23336       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
23337       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
23338     return FALSE;
23339
23340   /* Similarly for group relocations.  */
23341   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23342        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23343       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
23344     return FALSE;
23345
23346   /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
23347   if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
23348       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
23349       || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
23350       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
23351       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
23352       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
23353       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
23354       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
23355     return FALSE;
23356
23357   return TRUE;
23358 }
23359 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
23360
23361 #ifdef OBJ_ELF
23362
23363 const char *
23364 elf32_arm_target_format (void)
23365 {
23366 #ifdef TE_SYMBIAN
23367   return (target_big_endian
23368           ? "elf32-bigarm-symbian"
23369           : "elf32-littlearm-symbian");
23370 #elif defined (TE_VXWORKS)
23371   return (target_big_endian
23372           ? "elf32-bigarm-vxworks"
23373           : "elf32-littlearm-vxworks");
23374 #elif defined (TE_NACL)
23375   return (target_big_endian
23376           ? "elf32-bigarm-nacl"
23377           : "elf32-littlearm-nacl");
23378 #else
23379   if (target_big_endian)
23380     return "elf32-bigarm";
23381   else
23382     return "elf32-littlearm";
23383 #endif
23384 }
23385
23386 void
23387 armelf_frob_symbol (symbolS * symp,
23388                     int *     puntp)
23389 {
23390   elf_frob_symbol (symp, puntp);
23391 }
23392 #endif
23393
23394 /* MD interface: Finalization.  */
23395
23396 void
23397 arm_cleanup (void)
23398 {
23399   literal_pool * pool;
23400
23401   /* Ensure that all the IT blocks are properly closed.  */
23402   check_it_blocks_finished ();
23403
23404   for (pool = list_of_pools; pool; pool = pool->next)
23405     {
23406       /* Put it at the end of the relevant section.  */
23407       subseg_set (pool->section, pool->sub_section);
23408 #ifdef OBJ_ELF
23409       arm_elf_change_section ();
23410 #endif
23411       s_ltorg (0);
23412     }
23413 }
23414
23415 #ifdef OBJ_ELF
23416 /* Remove any excess mapping symbols generated for alignment frags in
23417    SEC.  We may have created a mapping symbol before a zero byte
23418    alignment; remove it if there's a mapping symbol after the
23419    alignment.  */
23420 static void
23421 check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
23422                        void *dummy ATTRIBUTE_UNUSED)
23423 {
23424   segment_info_type *seginfo = seg_info (sec);
23425   fragS *fragp;
23426
23427   if (seginfo == NULL || seginfo->frchainP == NULL)
23428     return;
23429
23430   for (fragp = seginfo->frchainP->frch_root;
23431        fragp != NULL;
23432        fragp = fragp->fr_next)
23433     {
23434       symbolS *sym = fragp->tc_frag_data.last_map;
23435       fragS *next = fragp->fr_next;
23436
23437       /* Variable-sized frags have been converted to fixed size by
23438          this point.  But if this was variable-sized to start with,
23439          there will be a fixed-size frag after it.  So don't handle
23440          next == NULL.  */
23441       if (sym == NULL || next == NULL)
23442         continue;
23443
23444       if (S_GET_VALUE (sym) < next->fr_address)
23445         /* Not at the end of this frag.  */
23446         continue;
23447       know (S_GET_VALUE (sym) == next->fr_address);
23448
23449       do
23450         {
23451           if (next->tc_frag_data.first_map != NULL)
23452             {
23453               /* Next frag starts with a mapping symbol.  Discard this
23454                  one.  */
23455               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23456               break;
23457             }
23458
23459           if (next->fr_next == NULL)
23460             {
23461               /* This mapping symbol is at the end of the section.  Discard
23462                  it.  */
23463               know (next->fr_fix == 0 && next->fr_var == 0);
23464               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23465               break;
23466             }
23467
23468           /* As long as we have empty frags without any mapping symbols,
23469              keep looking.  */
23470           /* If the next frag is non-empty and does not start with a
23471              mapping symbol, then this mapping symbol is required.  */
23472           if (next->fr_address != next->fr_next->fr_address)
23473             break;
23474
23475           next = next->fr_next;
23476         }
23477       while (next != NULL);
23478     }
23479 }
23480 #endif
23481
23482 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
23483    ARM ones.  */
23484
23485 void
23486 arm_adjust_symtab (void)
23487 {
23488 #ifdef OBJ_COFF
23489   symbolS * sym;
23490
23491   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
23492     {
23493       if (ARM_IS_THUMB (sym))
23494         {
23495           if (THUMB_IS_FUNC (sym))
23496             {
23497               /* Mark the symbol as a Thumb function.  */
23498               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
23499                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
23500                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
23501
23502               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
23503                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
23504               else
23505                 as_bad (_("%s: unexpected function type: %d"),
23506                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
23507             }
23508           else switch (S_GET_STORAGE_CLASS (sym))
23509             {
23510             case C_EXT:
23511               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
23512               break;
23513             case C_STAT:
23514               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
23515               break;
23516             case C_LABEL:
23517               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
23518               break;
23519             default:
23520               /* Do nothing.  */
23521               break;
23522             }
23523         }
23524
23525       if (ARM_IS_INTERWORK (sym))
23526         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
23527     }
23528 #endif
23529 #ifdef OBJ_ELF
23530   symbolS * sym;
23531   char      bind;
23532
23533   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
23534     {
23535       if (ARM_IS_THUMB (sym))
23536         {
23537           elf_symbol_type * elf_sym;
23538
23539           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
23540           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
23541
23542           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
23543                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
23544             {
23545               /* If it's a .thumb_func, declare it as so,
23546                  otherwise tag label as .code 16.  */
23547               if (THUMB_IS_FUNC (sym))
23548                 elf_sym->internal_elf_sym.st_target_internal
23549                   = ST_BRANCH_TO_THUMB;
23550               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
23551                 elf_sym->internal_elf_sym.st_info =
23552                   ELF_ST_INFO (bind, STT_ARM_16BIT);
23553             }
23554         }
23555     }
23556
23557   /* Remove any overlapping mapping symbols generated by alignment frags.  */
23558   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
23559   /* Now do generic ELF adjustments.  */
23560   elf_adjust_symtab ();
23561 #endif
23562 }
23563
23564 /* MD interface: Initialization.  */
23565
23566 static void
23567 set_constant_flonums (void)
23568 {
23569   int i;
23570
23571   for (i = 0; i < NUM_FLOAT_VALS; i++)
23572     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
23573       abort ();
23574 }
23575
23576 /* Auto-select Thumb mode if it's the only available instruction set for the
23577    given architecture.  */
23578
23579 static void
23580 autoselect_thumb_from_cpu_variant (void)
23581 {
23582   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
23583     opcode_select (16);
23584 }
23585
23586 void
23587 md_begin (void)
23588 {
23589   unsigned mach;
23590   unsigned int i;
23591
23592   if (   (arm_ops_hsh = hash_new ()) == NULL
23593       || (arm_cond_hsh = hash_new ()) == NULL
23594       || (arm_shift_hsh = hash_new ()) == NULL
23595       || (arm_psr_hsh = hash_new ()) == NULL
23596       || (arm_v7m_psr_hsh = hash_new ()) == NULL
23597       || (arm_reg_hsh = hash_new ()) == NULL
23598       || (arm_reloc_hsh = hash_new ()) == NULL
23599       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
23600     as_fatal (_("virtual memory exhausted"));
23601
23602   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
23603     hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
23604   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
23605     hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
23606   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
23607     hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
23608   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
23609     hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
23610   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
23611     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
23612                  (void *) (v7m_psrs + i));
23613   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
23614     hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
23615   for (i = 0;
23616        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
23617        i++)
23618     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
23619                  (void *) (barrier_opt_names + i));
23620 #ifdef OBJ_ELF
23621   for (i = 0; i < ARRAY_SIZE (reloc_names); i++)
23622     {
23623       struct reloc_entry * entry = reloc_names + i;
23624
23625       if (arm_is_eabi() && entry->reloc == BFD_RELOC_ARM_PLT32)
23626         /* This makes encode_branch() use the EABI versions of this relocation.  */
23627         entry->reloc = BFD_RELOC_UNUSED;
23628
23629       hash_insert (arm_reloc_hsh, entry->name, (void *) entry);
23630     }
23631 #endif
23632
23633   set_constant_flonums ();
23634
23635   /* Set the cpu variant based on the command-line options.  We prefer
23636      -mcpu= over -march= if both are set (as for GCC); and we prefer
23637      -mfpu= over any other way of setting the floating point unit.
23638      Use of legacy options with new options are faulted.  */
23639   if (legacy_cpu)
23640     {
23641       if (mcpu_cpu_opt || march_cpu_opt)
23642         as_bad (_("use of old and new-style options to set CPU type"));
23643
23644       mcpu_cpu_opt = legacy_cpu;
23645     }
23646   else if (!mcpu_cpu_opt)
23647     mcpu_cpu_opt = march_cpu_opt;
23648
23649   if (legacy_fpu)
23650     {
23651       if (mfpu_opt)
23652         as_bad (_("use of old and new-style options to set FPU type"));
23653
23654       mfpu_opt = legacy_fpu;
23655     }
23656   else if (!mfpu_opt)
23657     {
23658 #if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
23659         || defined (TE_NetBSD) || defined (TE_VXWORKS))
23660       /* Some environments specify a default FPU.  If they don't, infer it
23661          from the processor.  */
23662       if (mcpu_fpu_opt)
23663         mfpu_opt = mcpu_fpu_opt;
23664       else
23665         mfpu_opt = march_fpu_opt;
23666 #else
23667       mfpu_opt = &fpu_default;
23668 #endif
23669     }
23670
23671   if (!mfpu_opt)
23672     {
23673       if (mcpu_cpu_opt != NULL)
23674         mfpu_opt = &fpu_default;
23675       else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
23676         mfpu_opt = &fpu_arch_vfp_v2;
23677       else
23678         mfpu_opt = &fpu_arch_fpa;
23679     }
23680
23681 #ifdef CPU_DEFAULT
23682   if (!mcpu_cpu_opt)
23683     {
23684       mcpu_cpu_opt = &cpu_default;
23685       selected_cpu = cpu_default;
23686     }
23687 #else
23688   if (mcpu_cpu_opt)
23689     selected_cpu = *mcpu_cpu_opt;
23690   else
23691     mcpu_cpu_opt = &arm_arch_any;
23692 #endif
23693
23694   ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23695
23696   autoselect_thumb_from_cpu_variant ();
23697
23698   arm_arch_used = thumb_arch_used = arm_arch_none;
23699
23700 #if defined OBJ_COFF || defined OBJ_ELF
23701   {
23702     unsigned int flags = 0;
23703
23704 #if defined OBJ_ELF
23705     flags = meabi_flags;
23706
23707     switch (meabi_flags)
23708       {
23709       case EF_ARM_EABI_UNKNOWN:
23710 #endif
23711         /* Set the flags in the private structure.  */
23712         if (uses_apcs_26)      flags |= F_APCS26;
23713         if (support_interwork) flags |= F_INTERWORK;
23714         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
23715         if (pic_code)          flags |= F_PIC;
23716         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
23717           flags |= F_SOFT_FLOAT;
23718
23719         switch (mfloat_abi_opt)
23720           {
23721           case ARM_FLOAT_ABI_SOFT:
23722           case ARM_FLOAT_ABI_SOFTFP:
23723             flags |= F_SOFT_FLOAT;
23724             break;
23725
23726           case ARM_FLOAT_ABI_HARD:
23727             if (flags & F_SOFT_FLOAT)
23728               as_bad (_("hard-float conflicts with specified fpu"));
23729             break;
23730           }
23731
23732         /* Using pure-endian doubles (even if soft-float).      */
23733         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
23734           flags |= F_VFP_FLOAT;
23735
23736 #if defined OBJ_ELF
23737         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
23738             flags |= EF_ARM_MAVERICK_FLOAT;
23739         break;
23740
23741       case EF_ARM_EABI_VER4:
23742       case EF_ARM_EABI_VER5:
23743         /* No additional flags to set.  */
23744         break;
23745
23746       default:
23747         abort ();
23748       }
23749 #endif
23750     bfd_set_private_flags (stdoutput, flags);
23751
23752     /* We have run out flags in the COFF header to encode the
23753        status of ATPCS support, so instead we create a dummy,
23754        empty, debug section called .arm.atpcs.  */
23755     if (atpcs)
23756       {
23757         asection * sec;
23758
23759         sec = bfd_make_section (stdoutput, ".arm.atpcs");
23760
23761         if (sec != NULL)
23762           {
23763             bfd_set_section_flags
23764               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
23765             bfd_set_section_size (stdoutput, sec, 0);
23766             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
23767           }
23768       }
23769   }
23770 #endif
23771
23772   /* Record the CPU type as well.  */
23773   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
23774     mach = bfd_mach_arm_iWMMXt2;
23775   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
23776     mach = bfd_mach_arm_iWMMXt;
23777   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
23778     mach = bfd_mach_arm_XScale;
23779   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
23780     mach = bfd_mach_arm_ep9312;
23781   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
23782     mach = bfd_mach_arm_5TE;
23783   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
23784     {
23785       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
23786         mach = bfd_mach_arm_5T;
23787       else
23788         mach = bfd_mach_arm_5;
23789     }
23790   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
23791     {
23792       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
23793         mach = bfd_mach_arm_4T;
23794       else
23795         mach = bfd_mach_arm_4;
23796     }
23797   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
23798     mach = bfd_mach_arm_3M;
23799   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
23800     mach = bfd_mach_arm_3;
23801   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
23802     mach = bfd_mach_arm_2a;
23803   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
23804     mach = bfd_mach_arm_2;
23805   else
23806     mach = bfd_mach_arm_unknown;
23807
23808   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
23809 }
23810
23811 /* Command line processing.  */
23812
23813 /* md_parse_option
23814       Invocation line includes a switch not recognized by the base assembler.
23815       See if it's a processor-specific option.
23816
23817       This routine is somewhat complicated by the need for backwards
23818       compatibility (since older releases of gcc can't be changed).
23819       The new options try to make the interface as compatible as
23820       possible with GCC.
23821
23822       New options (supported) are:
23823
23824               -mcpu=<cpu name>           Assemble for selected processor
23825               -march=<architecture name> Assemble for selected architecture
23826               -mfpu=<fpu architecture>   Assemble for selected FPU.
23827               -EB/-mbig-endian           Big-endian
23828               -EL/-mlittle-endian        Little-endian
23829               -k                         Generate PIC code
23830               -mthumb                    Start in Thumb mode
23831               -mthumb-interwork          Code supports ARM/Thumb interworking
23832
23833               -m[no-]warn-deprecated     Warn about deprecated features
23834
23835       For now we will also provide support for:
23836
23837               -mapcs-32                  32-bit Program counter
23838               -mapcs-26                  26-bit Program counter
23839               -macps-float               Floats passed in FP registers
23840               -mapcs-reentrant           Reentrant code
23841               -matpcs
23842       (sometime these will probably be replaced with -mapcs=<list of options>
23843       and -matpcs=<list of options>)
23844
23845       The remaining options are only supported for back-wards compatibility.
23846       Cpu variants, the arm part is optional:
23847               -m[arm]1                Currently not supported.
23848               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
23849               -m[arm]3                Arm 3 processor
23850               -m[arm]6[xx],           Arm 6 processors
23851               -m[arm]7[xx][t][[d]m]   Arm 7 processors
23852               -m[arm]8[10]            Arm 8 processors
23853               -m[arm]9[20][tdmi]      Arm 9 processors
23854               -mstrongarm[110[0]]     StrongARM processors
23855               -mxscale                XScale processors
23856               -m[arm]v[2345[t[e]]]    Arm architectures
23857               -mall                   All (except the ARM1)
23858       FP variants:
23859               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
23860               -mfpe-old               (No float load/store multiples)
23861               -mvfpxd                 VFP Single precision
23862               -mvfp                   All VFP
23863               -mno-fpu                Disable all floating point instructions
23864
23865       The following CPU names are recognized:
23866               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
23867               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
23868               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
23869               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
23870               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
23871               arm10t arm10e, arm1020t, arm1020e, arm10200e,
23872               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
23873
23874       */
23875
23876 const char * md_shortopts = "m:k";
23877
23878 #ifdef ARM_BI_ENDIAN
23879 #define OPTION_EB (OPTION_MD_BASE + 0)
23880 #define OPTION_EL (OPTION_MD_BASE + 1)
23881 #else
23882 #if TARGET_BYTES_BIG_ENDIAN
23883 #define OPTION_EB (OPTION_MD_BASE + 0)
23884 #else
23885 #define OPTION_EL (OPTION_MD_BASE + 1)
23886 #endif
23887 #endif
23888 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
23889
23890 struct option md_longopts[] =
23891 {
23892 #ifdef OPTION_EB
23893   {"EB", no_argument, NULL, OPTION_EB},
23894 #endif
23895 #ifdef OPTION_EL
23896   {"EL", no_argument, NULL, OPTION_EL},
23897 #endif
23898   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
23899   {NULL, no_argument, NULL, 0}
23900 };
23901
23902 size_t md_longopts_size = sizeof (md_longopts);
23903
23904 struct arm_option_table
23905 {
23906   char *option;         /* Option name to match.  */
23907   char *help;           /* Help information.  */
23908   int  *var;            /* Variable to change.  */
23909   int   value;          /* What to change it to.  */
23910   char *deprecated;     /* If non-null, print this message.  */
23911 };
23912
23913 struct arm_option_table arm_opts[] =
23914 {
23915   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
23916   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
23917   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
23918    &support_interwork, 1, NULL},
23919   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
23920   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
23921   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
23922    1, NULL},
23923   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
23924   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
23925   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
23926   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
23927    NULL},
23928
23929   /* These are recognized by the assembler, but have no affect on code.  */
23930   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
23931   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
23932
23933   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
23934   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
23935    &warn_on_deprecated, 0, NULL},
23936   {NULL, NULL, NULL, 0, NULL}
23937 };
23938
23939 struct arm_legacy_option_table
23940 {
23941   char *option;                         /* Option name to match.  */
23942   const arm_feature_set **var;          /* Variable to change.  */
23943   const arm_feature_set value;          /* What to change it to.  */
23944   char *deprecated;                     /* If non-null, print this message.  */
23945 };
23946
23947 const struct arm_legacy_option_table arm_legacy_opts[] =
23948 {
23949   /* DON'T add any new processors to this list -- we want the whole list
23950      to go away...  Add them to the processors table instead.  */
23951   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
23952   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
23953   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
23954   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
23955   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23956   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23957   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23958   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23959   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
23960   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
23961   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
23962   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
23963   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
23964   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
23965   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
23966   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
23967   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
23968   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
23969   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
23970   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
23971   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
23972   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
23973   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
23974   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
23975   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
23976   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
23977   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
23978   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
23979   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
23980   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
23981   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
23982   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
23983   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
23984   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
23985   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23986   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23987   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23988   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23989   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23990   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23991   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
23992   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
23993   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
23994   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
23995   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
23996   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
23997   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23998   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23999   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
24000   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
24001   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
24002   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
24003   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
24004   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
24005   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
24006   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
24007   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
24008   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
24009   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
24010   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
24011   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
24012   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
24013   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
24014   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
24015   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
24016   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
24017   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
24018   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
24019   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
24020   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
24021    N_("use -mcpu=strongarm110")},
24022   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
24023    N_("use -mcpu=strongarm1100")},
24024   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
24025    N_("use -mcpu=strongarm1110")},
24026   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
24027   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
24028   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
24029
24030   /* Architecture variants -- don't add any more to this list either.  */
24031   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
24032   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
24033   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
24034   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
24035   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
24036   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
24037   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
24038   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
24039   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
24040   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
24041   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
24042   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
24043   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
24044   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
24045   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
24046   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
24047   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
24048   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
24049
24050   /* Floating point variants -- don't add any more to this list either.  */
24051   {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
24052   {"mfpa10",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
24053   {"mfpa11",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
24054   {"mno-fpu",  &legacy_fpu, ARM_ARCH_NONE,
24055    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
24056
24057   {NULL, NULL, ARM_ARCH_NONE, NULL}
24058 };
24059
24060 struct arm_cpu_option_table
24061 {
24062   char *name;
24063   size_t name_len;
24064   const arm_feature_set value;
24065   /* For some CPUs we assume an FPU unless the user explicitly sets
24066      -mfpu=...  */
24067   const arm_feature_set default_fpu;
24068   /* The canonical name of the CPU, or NULL to use NAME converted to upper
24069      case.  */
24070   const char *canonical_name;
24071 };
24072
24073 /* This list should, at a minimum, contain all the cpu names
24074    recognized by GCC.  */
24075 #define ARM_CPU_OPT(N, V, DF, CN) { N, sizeof (N) - 1, V, DF, CN }
24076 static const struct arm_cpu_option_table arm_cpus[] =
24077 {
24078   ARM_CPU_OPT ("all",           ARM_ANY,         FPU_ARCH_FPA,    NULL),
24079   ARM_CPU_OPT ("arm1",          ARM_ARCH_V1,     FPU_ARCH_FPA,    NULL),
24080   ARM_CPU_OPT ("arm2",          ARM_ARCH_V2,     FPU_ARCH_FPA,    NULL),
24081   ARM_CPU_OPT ("arm250",        ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
24082   ARM_CPU_OPT ("arm3",          ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
24083   ARM_CPU_OPT ("arm6",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24084   ARM_CPU_OPT ("arm60",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24085   ARM_CPU_OPT ("arm600",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24086   ARM_CPU_OPT ("arm610",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24087   ARM_CPU_OPT ("arm620",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24088   ARM_CPU_OPT ("arm7",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24089   ARM_CPU_OPT ("arm7m",         ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
24090   ARM_CPU_OPT ("arm7d",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24091   ARM_CPU_OPT ("arm7dm",        ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
24092   ARM_CPU_OPT ("arm7di",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24093   ARM_CPU_OPT ("arm7dmi",       ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
24094   ARM_CPU_OPT ("arm70",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24095   ARM_CPU_OPT ("arm700",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24096   ARM_CPU_OPT ("arm700i",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24097   ARM_CPU_OPT ("arm710",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24098   ARM_CPU_OPT ("arm710t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24099   ARM_CPU_OPT ("arm720",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24100   ARM_CPU_OPT ("arm720t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24101   ARM_CPU_OPT ("arm740t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24102   ARM_CPU_OPT ("arm710c",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24103   ARM_CPU_OPT ("arm7100",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24104   ARM_CPU_OPT ("arm7500",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24105   ARM_CPU_OPT ("arm7500fe",     ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24106   ARM_CPU_OPT ("arm7t",         ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24107   ARM_CPU_OPT ("arm7tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24108   ARM_CPU_OPT ("arm7tdmi-s",    ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24109   ARM_CPU_OPT ("arm8",          ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24110   ARM_CPU_OPT ("arm810",        ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24111   ARM_CPU_OPT ("strongarm",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24112   ARM_CPU_OPT ("strongarm1",    ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24113   ARM_CPU_OPT ("strongarm110",  ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24114   ARM_CPU_OPT ("strongarm1100", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24115   ARM_CPU_OPT ("strongarm1110", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24116   ARM_CPU_OPT ("arm9",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24117   ARM_CPU_OPT ("arm920",        ARM_ARCH_V4T,    FPU_ARCH_FPA,    "ARM920T"),
24118   ARM_CPU_OPT ("arm920t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24119   ARM_CPU_OPT ("arm922t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24120   ARM_CPU_OPT ("arm940t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24121   ARM_CPU_OPT ("arm9tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24122   ARM_CPU_OPT ("fa526",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24123   ARM_CPU_OPT ("fa626",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24124   /* For V5 or later processors we default to using VFP; but the user
24125      should really set the FPU type explicitly.  */
24126   ARM_CPU_OPT ("arm9e-r0",      ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
24127   ARM_CPU_OPT ("arm9e",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24128   ARM_CPU_OPT ("arm926ej",      ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
24129   ARM_CPU_OPT ("arm926ejs",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
24130   ARM_CPU_OPT ("arm926ej-s",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
24131   ARM_CPU_OPT ("arm946e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
24132   ARM_CPU_OPT ("arm946e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM946E-S"),
24133   ARM_CPU_OPT ("arm946e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24134   ARM_CPU_OPT ("arm966e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
24135   ARM_CPU_OPT ("arm966e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM966E-S"),
24136   ARM_CPU_OPT ("arm966e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24137   ARM_CPU_OPT ("arm968e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24138   ARM_CPU_OPT ("arm10t",        ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
24139   ARM_CPU_OPT ("arm10tdmi",     ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
24140   ARM_CPU_OPT ("arm10e",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24141   ARM_CPU_OPT ("arm1020",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM1020E"),
24142   ARM_CPU_OPT ("arm1020t",      ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
24143   ARM_CPU_OPT ("arm1020e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24144   ARM_CPU_OPT ("arm1022e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24145   ARM_CPU_OPT ("arm1026ejs",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2,
24146                                                                  "ARM1026EJ-S"),
24147   ARM_CPU_OPT ("arm1026ej-s",   ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
24148   ARM_CPU_OPT ("fa606te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24149   ARM_CPU_OPT ("fa616te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24150   ARM_CPU_OPT ("fa626te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24151   ARM_CPU_OPT ("fmp626",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24152   ARM_CPU_OPT ("fa726te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24153   ARM_CPU_OPT ("arm1136js",     ARM_ARCH_V6,     FPU_NONE,        "ARM1136J-S"),
24154   ARM_CPU_OPT ("arm1136j-s",    ARM_ARCH_V6,     FPU_NONE,        NULL),
24155   ARM_CPU_OPT ("arm1136jfs",    ARM_ARCH_V6,     FPU_ARCH_VFP_V2,
24156                                                                  "ARM1136JF-S"),
24157   ARM_CPU_OPT ("arm1136jf-s",   ARM_ARCH_V6,     FPU_ARCH_VFP_V2, NULL),
24158   ARM_CPU_OPT ("mpcore",        ARM_ARCH_V6K,    FPU_ARCH_VFP_V2, "MPCore"),
24159   ARM_CPU_OPT ("mpcorenovfp",   ARM_ARCH_V6K,    FPU_NONE,        "MPCore"),
24160   ARM_CPU_OPT ("arm1156t2-s",   ARM_ARCH_V6T2,   FPU_NONE,        NULL),
24161   ARM_CPU_OPT ("arm1156t2f-s",  ARM_ARCH_V6T2,   FPU_ARCH_VFP_V2, NULL),
24162   ARM_CPU_OPT ("arm1176jz-s",   ARM_ARCH_V6ZK,   FPU_NONE,        NULL),
24163   ARM_CPU_OPT ("arm1176jzf-s",  ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2, NULL),
24164   ARM_CPU_OPT ("cortex-a5",     ARM_ARCH_V7A_MP_SEC,
24165                                                  FPU_NONE,        "Cortex-A5"),
24166   ARM_CPU_OPT ("cortex-a7",     ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24167                                                                   "Cortex-A7"),
24168   ARM_CPU_OPT ("cortex-a8",     ARM_ARCH_V7A_SEC,
24169                                                  ARM_FEATURE (0, FPU_VFP_V3
24170                                                         | FPU_NEON_EXT_V1),
24171                                                                   "Cortex-A8"),
24172   ARM_CPU_OPT ("cortex-a9",     ARM_ARCH_V7A_MP_SEC,
24173                                                  ARM_FEATURE (0, FPU_VFP_V3
24174                                                         | FPU_NEON_EXT_V1),
24175                                                                   "Cortex-A9"),
24176   ARM_CPU_OPT ("cortex-a12",    ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24177                                                                   "Cortex-A12"),
24178   ARM_CPU_OPT ("cortex-a15",    ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24179                                                                   "Cortex-A15"),
24180   ARM_CPU_OPT ("cortex-a53",    ARM_ARCH_V8A,    FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24181                                                                   "Cortex-A53"),
24182   ARM_CPU_OPT ("cortex-a57",    ARM_ARCH_V8A,    FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24183                                                                   "Cortex-A57"),
24184   ARM_CPU_OPT ("cortex-r4",     ARM_ARCH_V7R,    FPU_NONE,        "Cortex-R4"),
24185   ARM_CPU_OPT ("cortex-r4f",    ARM_ARCH_V7R,    FPU_ARCH_VFP_V3D16,
24186                                                                   "Cortex-R4F"),
24187   ARM_CPU_OPT ("cortex-r5",     ARM_ARCH_V7R_IDIV,
24188                                                  FPU_NONE,        "Cortex-R5"),
24189   ARM_CPU_OPT ("cortex-r7",     ARM_ARCH_V7R_IDIV,
24190                                                  FPU_ARCH_VFP_V3D16,
24191                                                                   "Cortex-R7"),
24192   ARM_CPU_OPT ("cortex-m4",     ARM_ARCH_V7EM,   FPU_NONE,        "Cortex-M4"),
24193   ARM_CPU_OPT ("cortex-m3",     ARM_ARCH_V7M,    FPU_NONE,        "Cortex-M3"),
24194   ARM_CPU_OPT ("cortex-m1",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M1"),
24195   ARM_CPU_OPT ("cortex-m0",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0"),
24196   ARM_CPU_OPT ("cortex-m0plus", ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0+"),
24197   /* ??? XSCALE is really an architecture.  */
24198   ARM_CPU_OPT ("xscale",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
24199   /* ??? iwmmxt is not a processor.  */
24200   ARM_CPU_OPT ("iwmmxt",        ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL),
24201   ARM_CPU_OPT ("iwmmxt2",       ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL),
24202   ARM_CPU_OPT ("i80200",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
24203   /* Maverick */
24204   ARM_CPU_OPT ("ep9312",        ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK),
24205                                                  FPU_ARCH_MAVERICK, "ARM920T"),
24206   /* Marvell processors.  */
24207   ARM_CPU_OPT ("marvell-pj4",   ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC, 0),
24208                                                 FPU_ARCH_VFP_V3D16, NULL),
24209
24210   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
24211 };
24212 #undef ARM_CPU_OPT
24213
24214 struct arm_arch_option_table
24215 {
24216   char *name;
24217   size_t name_len;
24218   const arm_feature_set value;
24219   const arm_feature_set default_fpu;
24220 };
24221
24222 /* This list should, at a minimum, contain all the architecture names
24223    recognized by GCC.  */
24224 #define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF }
24225 static const struct arm_arch_option_table arm_archs[] =
24226 {
24227   ARM_ARCH_OPT ("all",          ARM_ANY,         FPU_ARCH_FPA),
24228   ARM_ARCH_OPT ("armv1",        ARM_ARCH_V1,     FPU_ARCH_FPA),
24229   ARM_ARCH_OPT ("armv2",        ARM_ARCH_V2,     FPU_ARCH_FPA),
24230   ARM_ARCH_OPT ("armv2a",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
24231   ARM_ARCH_OPT ("armv2s",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
24232   ARM_ARCH_OPT ("armv3",        ARM_ARCH_V3,     FPU_ARCH_FPA),
24233   ARM_ARCH_OPT ("armv3m",       ARM_ARCH_V3M,    FPU_ARCH_FPA),
24234   ARM_ARCH_OPT ("armv4",        ARM_ARCH_V4,     FPU_ARCH_FPA),
24235   ARM_ARCH_OPT ("armv4xm",      ARM_ARCH_V4xM,   FPU_ARCH_FPA),
24236   ARM_ARCH_OPT ("armv4t",       ARM_ARCH_V4T,    FPU_ARCH_FPA),
24237   ARM_ARCH_OPT ("armv4txm",     ARM_ARCH_V4TxM,  FPU_ARCH_FPA),
24238   ARM_ARCH_OPT ("armv5",        ARM_ARCH_V5,     FPU_ARCH_VFP),
24239   ARM_ARCH_OPT ("armv5t",       ARM_ARCH_V5T,    FPU_ARCH_VFP),
24240   ARM_ARCH_OPT ("armv5txm",     ARM_ARCH_V5TxM,  FPU_ARCH_VFP),
24241   ARM_ARCH_OPT ("armv5te",      ARM_ARCH_V5TE,   FPU_ARCH_VFP),
24242   ARM_ARCH_OPT ("armv5texp",    ARM_ARCH_V5TExP, FPU_ARCH_VFP),
24243   ARM_ARCH_OPT ("armv5tej",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP),
24244   ARM_ARCH_OPT ("armv6",        ARM_ARCH_V6,     FPU_ARCH_VFP),
24245   ARM_ARCH_OPT ("armv6j",       ARM_ARCH_V6,     FPU_ARCH_VFP),
24246   ARM_ARCH_OPT ("armv6k",       ARM_ARCH_V6K,    FPU_ARCH_VFP),
24247   ARM_ARCH_OPT ("armv6z",       ARM_ARCH_V6Z,    FPU_ARCH_VFP),
24248   ARM_ARCH_OPT ("armv6zk",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP),
24249   ARM_ARCH_OPT ("armv6t2",      ARM_ARCH_V6T2,   FPU_ARCH_VFP),
24250   ARM_ARCH_OPT ("armv6kt2",     ARM_ARCH_V6KT2,  FPU_ARCH_VFP),
24251   ARM_ARCH_OPT ("armv6zt2",     ARM_ARCH_V6ZT2,  FPU_ARCH_VFP),
24252   ARM_ARCH_OPT ("armv6zkt2",    ARM_ARCH_V6ZKT2, FPU_ARCH_VFP),
24253   ARM_ARCH_OPT ("armv6-m",      ARM_ARCH_V6M,    FPU_ARCH_VFP),
24254   ARM_ARCH_OPT ("armv6s-m",     ARM_ARCH_V6SM,   FPU_ARCH_VFP),
24255   ARM_ARCH_OPT ("armv7",        ARM_ARCH_V7,     FPU_ARCH_VFP),
24256   /* The official spelling of the ARMv7 profile variants is the dashed form.
24257      Accept the non-dashed form for compatibility with old toolchains.  */
24258   ARM_ARCH_OPT ("armv7a",       ARM_ARCH_V7A,    FPU_ARCH_VFP),
24259   ARM_ARCH_OPT ("armv7ve",      ARM_ARCH_V7VE,   FPU_ARCH_VFP),
24260   ARM_ARCH_OPT ("armv7r",       ARM_ARCH_V7R,    FPU_ARCH_VFP),
24261   ARM_ARCH_OPT ("armv7m",       ARM_ARCH_V7M,    FPU_ARCH_VFP),
24262   ARM_ARCH_OPT ("armv7-a",      ARM_ARCH_V7A,    FPU_ARCH_VFP),
24263   ARM_ARCH_OPT ("armv7-r",      ARM_ARCH_V7R,    FPU_ARCH_VFP),
24264   ARM_ARCH_OPT ("armv7-m",      ARM_ARCH_V7M,    FPU_ARCH_VFP),
24265   ARM_ARCH_OPT ("armv7e-m",     ARM_ARCH_V7EM,   FPU_ARCH_VFP),
24266   ARM_ARCH_OPT ("armv8-a",      ARM_ARCH_V8A,    FPU_ARCH_VFP),
24267   ARM_ARCH_OPT ("xscale",       ARM_ARCH_XSCALE, FPU_ARCH_VFP),
24268   ARM_ARCH_OPT ("iwmmxt",       ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
24269   ARM_ARCH_OPT ("iwmmxt2",      ARM_ARCH_IWMMXT2,FPU_ARCH_VFP),
24270   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
24271 };
24272 #undef ARM_ARCH_OPT
24273
24274 /* ISA extensions in the co-processor and main instruction set space.  */
24275 struct arm_option_extension_value_table
24276 {
24277   char *name;
24278   size_t name_len;
24279   const arm_feature_set value;
24280   const arm_feature_set allowed_archs;
24281 };
24282
24283 /* The following table must be in alphabetical order with a NULL last entry.
24284    */
24285 #define ARM_EXT_OPT(N, V, AA) { N, sizeof (N) - 1, V, AA }
24286 static const struct arm_option_extension_value_table arm_extensions[] =
24287 {
24288   ARM_EXT_OPT ("crc",  ARCH_CRC_ARMV8, ARM_FEATURE (ARM_EXT_V8, 0)),
24289   ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24290                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24291   ARM_EXT_OPT ("fp",     FPU_ARCH_VFP_ARMV8,
24292                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24293   ARM_EXT_OPT ("idiv",  ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
24294                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
24295   ARM_EXT_OPT ("iwmmxt",ARM_FEATURE (0, ARM_CEXT_IWMMXT),       ARM_ANY),
24296   ARM_EXT_OPT ("iwmmxt2",
24297                         ARM_FEATURE (0, ARM_CEXT_IWMMXT2),      ARM_ANY),
24298   ARM_EXT_OPT ("maverick",
24299                         ARM_FEATURE (0, ARM_CEXT_MAVERICK),     ARM_ANY),
24300   ARM_EXT_OPT ("mp",    ARM_FEATURE (ARM_EXT_MP, 0),
24301                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
24302   ARM_EXT_OPT ("simd",   FPU_ARCH_NEON_VFP_ARMV8,
24303                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24304   ARM_EXT_OPT ("os",    ARM_FEATURE (ARM_EXT_OS, 0),
24305                                    ARM_FEATURE (ARM_EXT_V6M, 0)),
24306   ARM_EXT_OPT ("sec",   ARM_FEATURE (ARM_EXT_SEC, 0),
24307                                    ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)),
24308   ARM_EXT_OPT ("virt",  ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV
24309                                      | ARM_EXT_DIV, 0),
24310                                    ARM_FEATURE (ARM_EXT_V7A, 0)),
24311   ARM_EXT_OPT ("xscale",ARM_FEATURE (0, ARM_CEXT_XSCALE),       ARM_ANY),
24312   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
24313 };
24314 #undef ARM_EXT_OPT
24315
24316 /* ISA floating-point and Advanced SIMD extensions.  */
24317 struct arm_option_fpu_value_table
24318 {
24319   char *name;
24320   const arm_feature_set value;
24321 };
24322
24323 /* This list should, at a minimum, contain all the fpu names
24324    recognized by GCC.  */
24325 static const struct arm_option_fpu_value_table arm_fpus[] =
24326 {
24327   {"softfpa",           FPU_NONE},
24328   {"fpe",               FPU_ARCH_FPE},
24329   {"fpe2",              FPU_ARCH_FPE},
24330   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
24331   {"fpa",               FPU_ARCH_FPA},
24332   {"fpa10",             FPU_ARCH_FPA},
24333   {"fpa11",             FPU_ARCH_FPA},
24334   {"arm7500fe",         FPU_ARCH_FPA},
24335   {"softvfp",           FPU_ARCH_VFP},
24336   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
24337   {"vfp",               FPU_ARCH_VFP_V2},
24338   {"vfp9",              FPU_ARCH_VFP_V2},
24339   {"vfp3",              FPU_ARCH_VFP_V3}, /* For backwards compatbility.  */
24340   {"vfp10",             FPU_ARCH_VFP_V2},
24341   {"vfp10-r0",          FPU_ARCH_VFP_V1},
24342   {"vfpxd",             FPU_ARCH_VFP_V1xD},
24343   {"vfpv2",             FPU_ARCH_VFP_V2},
24344   {"vfpv3",             FPU_ARCH_VFP_V3},
24345   {"vfpv3-fp16",        FPU_ARCH_VFP_V3_FP16},
24346   {"vfpv3-d16",         FPU_ARCH_VFP_V3D16},
24347   {"vfpv3-d16-fp16",    FPU_ARCH_VFP_V3D16_FP16},
24348   {"vfpv3xd",           FPU_ARCH_VFP_V3xD},
24349   {"vfpv3xd-fp16",      FPU_ARCH_VFP_V3xD_FP16},
24350   {"arm1020t",          FPU_ARCH_VFP_V1},
24351   {"arm1020e",          FPU_ARCH_VFP_V2},
24352   {"arm1136jfs",        FPU_ARCH_VFP_V2},
24353   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
24354   {"maverick",          FPU_ARCH_MAVERICK},
24355   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
24356   {"neon-fp16",         FPU_ARCH_NEON_FP16},
24357   {"vfpv4",             FPU_ARCH_VFP_V4},
24358   {"vfpv4-d16",         FPU_ARCH_VFP_V4D16},
24359   {"fpv4-sp-d16",       FPU_ARCH_VFP_V4_SP_D16},
24360   {"neon-vfpv4",        FPU_ARCH_NEON_VFP_V4},
24361   {"fp-armv8",          FPU_ARCH_VFP_ARMV8},
24362   {"neon-fp-armv8",     FPU_ARCH_NEON_VFP_ARMV8},
24363   {"crypto-neon-fp-armv8",
24364                         FPU_ARCH_CRYPTO_NEON_VFP_ARMV8},
24365   {NULL,                ARM_ARCH_NONE}
24366 };
24367
24368 struct arm_option_value_table
24369 {
24370   char *name;
24371   long value;
24372 };
24373
24374 static const struct arm_option_value_table arm_float_abis[] =
24375 {
24376   {"hard",      ARM_FLOAT_ABI_HARD},
24377   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
24378   {"soft",      ARM_FLOAT_ABI_SOFT},
24379   {NULL,        0}
24380 };
24381
24382 #ifdef OBJ_ELF
24383 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
24384 static const struct arm_option_value_table arm_eabis[] =
24385 {
24386   {"gnu",       EF_ARM_EABI_UNKNOWN},
24387   {"4",         EF_ARM_EABI_VER4},
24388   {"5",         EF_ARM_EABI_VER5},
24389   {NULL,        0}
24390 };
24391 #endif
24392
24393 struct arm_long_option_table
24394 {
24395   char * option;                /* Substring to match.  */
24396   char * help;                  /* Help information.  */
24397   int (* func) (char * subopt); /* Function to decode sub-option.  */
24398   char * deprecated;            /* If non-null, print this message.  */
24399 };
24400
24401 static bfd_boolean
24402 arm_parse_extension (char *str, const arm_feature_set **opt_p)
24403 {
24404   arm_feature_set *ext_set = (arm_feature_set *)
24405       xmalloc (sizeof (arm_feature_set));
24406
24407   /* We insist on extensions being specified in alphabetical order, and with
24408      extensions being added before being removed.  We achieve this by having
24409      the global ARM_EXTENSIONS table in alphabetical order, and using the
24410      ADDING_VALUE variable to indicate whether we are adding an extension (1)
24411      or removing it (0) and only allowing it to change in the order
24412      -1 -> 1 -> 0.  */
24413   const struct arm_option_extension_value_table * opt = NULL;
24414   int adding_value = -1;
24415
24416   /* Copy the feature set, so that we can modify it.  */
24417   *ext_set = **opt_p;
24418   *opt_p = ext_set;
24419
24420   while (str != NULL && *str != 0)
24421     {
24422       char *ext;
24423       size_t len;
24424
24425       if (*str != '+')
24426         {
24427           as_bad (_("invalid architectural extension"));
24428           return FALSE;
24429         }
24430
24431       str++;
24432       ext = strchr (str, '+');
24433
24434       if (ext != NULL)
24435         len = ext - str;
24436       else
24437         len = strlen (str);
24438
24439       if (len >= 2 && strncmp (str, "no", 2) == 0)
24440         {
24441           if (adding_value != 0)
24442             {
24443               adding_value = 0;
24444               opt = arm_extensions;
24445             }
24446
24447           len -= 2;
24448           str += 2;
24449         }
24450       else if (len > 0)
24451         {
24452           if (adding_value == -1)
24453             {
24454               adding_value = 1;
24455               opt = arm_extensions;
24456             }
24457           else if (adding_value != 1)
24458             {
24459               as_bad (_("must specify extensions to add before specifying "
24460                         "those to remove"));
24461               return FALSE;
24462             }
24463         }
24464
24465       if (len == 0)
24466         {
24467           as_bad (_("missing architectural extension"));
24468           return FALSE;
24469         }
24470
24471       gas_assert (adding_value != -1);
24472       gas_assert (opt != NULL);
24473
24474       /* Scan over the options table trying to find an exact match. */
24475       for (; opt->name != NULL; opt++)
24476         if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24477           {
24478             /* Check we can apply the extension to this architecture.  */
24479             if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
24480               {
24481                 as_bad (_("extension does not apply to the base architecture"));
24482                 return FALSE;
24483               }
24484
24485             /* Add or remove the extension.  */
24486             if (adding_value)
24487               ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
24488             else
24489               ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
24490
24491             break;
24492           }
24493
24494       if (opt->name == NULL)
24495         {
24496           /* Did we fail to find an extension because it wasn't specified in
24497              alphabetical order, or because it does not exist?  */
24498
24499           for (opt = arm_extensions; opt->name != NULL; opt++)
24500             if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24501               break;
24502
24503           if (opt->name == NULL)
24504             as_bad (_("unknown architectural extension `%s'"), str);
24505           else
24506             as_bad (_("architectural extensions must be specified in "
24507                       "alphabetical order"));
24508
24509           return FALSE;
24510         }
24511       else
24512         {
24513           /* We should skip the extension we've just matched the next time
24514              round.  */
24515           opt++;
24516         }
24517
24518       str = ext;
24519     };
24520
24521   return TRUE;
24522 }
24523
24524 static bfd_boolean
24525 arm_parse_cpu (char *str)
24526 {
24527   const struct arm_cpu_option_table *opt;
24528   char *ext = strchr (str, '+');
24529   size_t len;
24530
24531   if (ext != NULL)
24532     len = ext - str;
24533   else
24534     len = strlen (str);
24535
24536   if (len == 0)
24537     {
24538       as_bad (_("missing cpu name `%s'"), str);
24539       return FALSE;
24540     }
24541
24542   for (opt = arm_cpus; opt->name != NULL; opt++)
24543     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24544       {
24545         mcpu_cpu_opt = &opt->value;
24546         mcpu_fpu_opt = &opt->default_fpu;
24547         if (opt->canonical_name)
24548           strcpy (selected_cpu_name, opt->canonical_name);
24549         else
24550           {
24551             size_t i;
24552
24553             for (i = 0; i < len; i++)
24554               selected_cpu_name[i] = TOUPPER (opt->name[i]);
24555             selected_cpu_name[i] = 0;
24556           }
24557
24558         if (ext != NULL)
24559           return arm_parse_extension (ext, &mcpu_cpu_opt);
24560
24561         return TRUE;
24562       }
24563
24564   as_bad (_("unknown cpu `%s'"), str);
24565   return FALSE;
24566 }
24567
24568 static bfd_boolean
24569 arm_parse_arch (char *str)
24570 {
24571   const struct arm_arch_option_table *opt;
24572   char *ext = strchr (str, '+');
24573   size_t len;
24574
24575   if (ext != NULL)
24576     len = ext - str;
24577   else
24578     len = strlen (str);
24579
24580   if (len == 0)
24581     {
24582       as_bad (_("missing architecture name `%s'"), str);
24583       return FALSE;
24584     }
24585
24586   for (opt = arm_archs; opt->name != NULL; opt++)
24587     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24588       {
24589         march_cpu_opt = &opt->value;
24590         march_fpu_opt = &opt->default_fpu;
24591         strcpy (selected_cpu_name, opt->name);
24592
24593         if (ext != NULL)
24594           return arm_parse_extension (ext, &march_cpu_opt);
24595
24596         return TRUE;
24597       }
24598
24599   as_bad (_("unknown architecture `%s'\n"), str);
24600   return FALSE;
24601 }
24602
24603 static bfd_boolean
24604 arm_parse_fpu (char * str)
24605 {
24606   const struct arm_option_fpu_value_table * opt;
24607
24608   for (opt = arm_fpus; opt->name != NULL; opt++)
24609     if (streq (opt->name, str))
24610       {
24611         mfpu_opt = &opt->value;
24612         return TRUE;
24613       }
24614
24615   as_bad (_("unknown floating point format `%s'\n"), str);
24616   return FALSE;
24617 }
24618
24619 static bfd_boolean
24620 arm_parse_float_abi (char * str)
24621 {
24622   const struct arm_option_value_table * opt;
24623
24624   for (opt = arm_float_abis; opt->name != NULL; opt++)
24625     if (streq (opt->name, str))
24626       {
24627         mfloat_abi_opt = opt->value;
24628         return TRUE;
24629       }
24630
24631   as_bad (_("unknown floating point abi `%s'\n"), str);
24632   return FALSE;
24633 }
24634
24635 #ifdef OBJ_ELF
24636 static bfd_boolean
24637 arm_parse_eabi (char * str)
24638 {
24639   const struct arm_option_value_table *opt;
24640
24641   for (opt = arm_eabis; opt->name != NULL; opt++)
24642     if (streq (opt->name, str))
24643       {
24644         meabi_flags = opt->value;
24645         return TRUE;
24646       }
24647   as_bad (_("unknown EABI `%s'\n"), str);
24648   return FALSE;
24649 }
24650 #endif
24651
24652 static bfd_boolean
24653 arm_parse_it_mode (char * str)
24654 {
24655   bfd_boolean ret = TRUE;
24656
24657   if (streq ("arm", str))
24658     implicit_it_mode = IMPLICIT_IT_MODE_ARM;
24659   else if (streq ("thumb", str))
24660     implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
24661   else if (streq ("always", str))
24662     implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
24663   else if (streq ("never", str))
24664     implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
24665   else
24666     {
24667       as_bad (_("unknown implicit IT mode `%s', should be "\
24668                 "arm, thumb, always, or never."), str);
24669       ret = FALSE;
24670     }
24671
24672   return ret;
24673 }
24674
24675 static bfd_boolean
24676 arm_ccs_mode (char * unused ATTRIBUTE_UNUSED)
24677 {
24678   codecomposer_syntax = TRUE;
24679   arm_comment_chars[0] = ';';
24680   arm_line_separator_chars[0] = 0;
24681   return TRUE;
24682 }
24683
24684 struct arm_long_option_table arm_long_opts[] =
24685 {
24686   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
24687    arm_parse_cpu, NULL},
24688   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
24689    arm_parse_arch, NULL},
24690   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
24691    arm_parse_fpu, NULL},
24692   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
24693    arm_parse_float_abi, NULL},
24694 #ifdef OBJ_ELF
24695   {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
24696    arm_parse_eabi, NULL},
24697 #endif
24698   {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
24699    arm_parse_it_mode, NULL},
24700   {"mccs", N_("\t\t\t  TI CodeComposer Studio syntax compatibility mode"),
24701    arm_ccs_mode, NULL},
24702   {NULL, NULL, 0, NULL}
24703 };
24704
24705 int
24706 md_parse_option (int c, char * arg)
24707 {
24708   struct arm_option_table *opt;
24709   const struct arm_legacy_option_table *fopt;
24710   struct arm_long_option_table *lopt;
24711
24712   switch (c)
24713     {
24714 #ifdef OPTION_EB
24715     case OPTION_EB:
24716       target_big_endian = 1;
24717       break;
24718 #endif
24719
24720 #ifdef OPTION_EL
24721     case OPTION_EL:
24722       target_big_endian = 0;
24723       break;
24724 #endif
24725
24726     case OPTION_FIX_V4BX:
24727       fix_v4bx = TRUE;
24728       break;
24729
24730     case 'a':
24731       /* Listing option.  Just ignore these, we don't support additional
24732          ones.  */
24733       return 0;
24734
24735     default:
24736       for (opt = arm_opts; opt->option != NULL; opt++)
24737         {
24738           if (c == opt->option[0]
24739               && ((arg == NULL && opt->option[1] == 0)
24740                   || streq (arg, opt->option + 1)))
24741             {
24742               /* If the option is deprecated, tell the user.  */
24743               if (warn_on_deprecated && opt->deprecated != NULL)
24744                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24745                            arg ? arg : "", _(opt->deprecated));
24746
24747               if (opt->var != NULL)
24748                 *opt->var = opt->value;
24749
24750               return 1;
24751             }
24752         }
24753
24754       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
24755         {
24756           if (c == fopt->option[0]
24757               && ((arg == NULL && fopt->option[1] == 0)
24758                   || streq (arg, fopt->option + 1)))
24759             {
24760               /* If the option is deprecated, tell the user.  */
24761               if (warn_on_deprecated && fopt->deprecated != NULL)
24762                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24763                            arg ? arg : "", _(fopt->deprecated));
24764
24765               if (fopt->var != NULL)
24766                 *fopt->var = &fopt->value;
24767
24768               return 1;
24769             }
24770         }
24771
24772       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24773         {
24774           /* These options are expected to have an argument.  */
24775           if (c == lopt->option[0]
24776               && arg != NULL
24777               && strncmp (arg, lopt->option + 1,
24778                           strlen (lopt->option + 1)) == 0)
24779             {
24780               /* If the option is deprecated, tell the user.  */
24781               if (warn_on_deprecated && lopt->deprecated != NULL)
24782                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
24783                            _(lopt->deprecated));
24784
24785               /* Call the sup-option parser.  */
24786               return lopt->func (arg + strlen (lopt->option) - 1);
24787             }
24788         }
24789
24790       return 0;
24791     }
24792
24793   return 1;
24794 }
24795
24796 void
24797 md_show_usage (FILE * fp)
24798 {
24799   struct arm_option_table *opt;
24800   struct arm_long_option_table *lopt;
24801
24802   fprintf (fp, _(" ARM-specific assembler options:\n"));
24803
24804   for (opt = arm_opts; opt->option != NULL; opt++)
24805     if (opt->help != NULL)
24806       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
24807
24808   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24809     if (lopt->help != NULL)
24810       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
24811
24812 #ifdef OPTION_EB
24813   fprintf (fp, _("\
24814   -EB                     assemble code for a big-endian cpu\n"));
24815 #endif
24816
24817 #ifdef OPTION_EL
24818   fprintf (fp, _("\
24819   -EL                     assemble code for a little-endian cpu\n"));
24820 #endif
24821
24822   fprintf (fp, _("\
24823   --fix-v4bx              Allow BX in ARMv4 code\n"));
24824 }
24825
24826
24827 #ifdef OBJ_ELF
24828 typedef struct
24829 {
24830   int val;
24831   arm_feature_set flags;
24832 } cpu_arch_ver_table;
24833
24834 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
24835    least features first.  */
24836 static const cpu_arch_ver_table cpu_arch_ver[] =
24837 {
24838     {1, ARM_ARCH_V4},
24839     {2, ARM_ARCH_V4T},
24840     {3, ARM_ARCH_V5},
24841     {3, ARM_ARCH_V5T},
24842     {4, ARM_ARCH_V5TE},
24843     {5, ARM_ARCH_V5TEJ},
24844     {6, ARM_ARCH_V6},
24845     {9, ARM_ARCH_V6K},
24846     {7, ARM_ARCH_V6Z},
24847     {11, ARM_ARCH_V6M},
24848     {12, ARM_ARCH_V6SM},
24849     {8, ARM_ARCH_V6T2},
24850     {10, ARM_ARCH_V7VE},
24851     {10, ARM_ARCH_V7R},
24852     {10, ARM_ARCH_V7M},
24853     {14, ARM_ARCH_V8A},
24854     {0, ARM_ARCH_NONE}
24855 };
24856
24857 /* Set an attribute if it has not already been set by the user.  */
24858 static void
24859 aeabi_set_attribute_int (int tag, int value)
24860 {
24861   if (tag < 1
24862       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24863       || !attributes_set_explicitly[tag])
24864     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
24865 }
24866
24867 static void
24868 aeabi_set_attribute_string (int tag, const char *value)
24869 {
24870   if (tag < 1
24871       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24872       || !attributes_set_explicitly[tag])
24873     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
24874 }
24875
24876 /* Set the public EABI object attributes.  */
24877 static void
24878 aeabi_set_public_attributes (void)
24879 {
24880   int arch;
24881   char profile;
24882   int virt_sec = 0;
24883   int fp16_optional = 0;
24884   arm_feature_set flags;
24885   arm_feature_set tmp;
24886   const cpu_arch_ver_table *p;
24887
24888   /* Choose the architecture based on the capabilities of the requested cpu
24889      (if any) and/or the instructions actually used.  */
24890   ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
24891   ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
24892   ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
24893
24894   if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
24895     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
24896
24897   if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
24898     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
24899
24900   /* Allow the user to override the reported architecture.  */
24901   if (object_arch)
24902     {
24903       ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
24904       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
24905     }
24906
24907   /* We need to make sure that the attributes do not identify us as v6S-M
24908      when the only v6S-M feature in use is the Operating System Extensions.  */
24909   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
24910       if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
24911         ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
24912
24913   tmp = flags;
24914   arch = 0;
24915   for (p = cpu_arch_ver; p->val; p++)
24916     {
24917       if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
24918         {
24919           arch = p->val;
24920           ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
24921         }
24922     }
24923
24924   /* The table lookup above finds the last architecture to contribute
24925      a new feature.  Unfortunately, Tag13 is a subset of the union of
24926      v6T2 and v7-M, so it is never seen as contributing a new feature.
24927      We can not search for the last entry which is entirely used,
24928      because if no CPU is specified we build up only those flags
24929      actually used.  Perhaps we should separate out the specified
24930      and implicit cases.  Avoid taking this path for -march=all by
24931      checking for contradictory v7-A / v7-M features.  */
24932   if (arch == 10
24933       && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
24934       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
24935       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
24936     arch = 13;
24937
24938   /* Tag_CPU_name.  */
24939   if (selected_cpu_name[0])
24940     {
24941       char *q;
24942
24943       q = selected_cpu_name;
24944       if (strncmp (q, "armv", 4) == 0)
24945         {
24946           int i;
24947
24948           q += 4;
24949           for (i = 0; q[i]; i++)
24950             q[i] = TOUPPER (q[i]);
24951         }
24952       aeabi_set_attribute_string (Tag_CPU_name, q);
24953     }
24954
24955   /* Tag_CPU_arch.  */
24956   aeabi_set_attribute_int (Tag_CPU_arch, arch);
24957
24958   /* Tag_CPU_arch_profile.  */
24959   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
24960     profile = 'A';
24961   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
24962     profile = 'R';
24963   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
24964     profile = 'M';
24965   else
24966     profile = '\0';
24967
24968   if (profile != '\0')
24969     aeabi_set_attribute_int (Tag_CPU_arch_profile, profile);
24970
24971   /* Tag_ARM_ISA_use.  */
24972   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
24973       || arch == 0)
24974     aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
24975
24976   /* Tag_THUMB_ISA_use.  */
24977   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
24978       || arch == 0)
24979     aeabi_set_attribute_int (Tag_THUMB_ISA_use,
24980         ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
24981
24982   /* Tag_VFP_arch.  */
24983   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_armv8))
24984     aeabi_set_attribute_int (Tag_VFP_arch, 7);
24985   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
24986     aeabi_set_attribute_int (Tag_VFP_arch,
24987                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
24988                              ? 5 : 6);
24989   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
24990     {
24991       fp16_optional = 1;
24992       aeabi_set_attribute_int (Tag_VFP_arch, 3);
24993     }
24994   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
24995     {
24996       aeabi_set_attribute_int (Tag_VFP_arch, 4);
24997       fp16_optional = 1;
24998     }
24999   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
25000     aeabi_set_attribute_int (Tag_VFP_arch, 2);
25001   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
25002            || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
25003     aeabi_set_attribute_int (Tag_VFP_arch, 1);
25004
25005   /* Tag_ABI_HardFP_use.  */
25006   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
25007       && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
25008     aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
25009
25010   /* Tag_WMMX_arch.  */
25011   if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
25012     aeabi_set_attribute_int (Tag_WMMX_arch, 2);
25013   else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
25014     aeabi_set_attribute_int (Tag_WMMX_arch, 1);
25015
25016   /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
25017   if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_armv8))
25018     aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 3);
25019   else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
25020     {
25021       if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma))
25022         {
25023           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 2);
25024         }
25025       else
25026         {
25027           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 1);
25028           fp16_optional = 1;
25029         }
25030     }
25031
25032   /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
25033   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16) && fp16_optional)
25034     aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
25035
25036   /* Tag_DIV_use.
25037
25038      We set Tag_DIV_use to two when integer divide instructions have been used
25039      in ARM state, or when Thumb integer divide instructions have been used,
25040      but we have no architecture profile set, nor have we any ARM instructions.
25041
25042      For ARMv8 we set the tag to 0 as integer divide is implied by the base
25043      architecture.
25044
25045      For new architectures we will have to check these tests.  */
25046   gas_assert (arch <= TAG_CPU_ARCH_V8);
25047   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v8))
25048     aeabi_set_attribute_int (Tag_DIV_use, 0);
25049   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv)
25050            || (profile == '\0'
25051                && ARM_CPU_HAS_FEATURE (flags, arm_ext_div)
25052                && !ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any)))
25053     aeabi_set_attribute_int (Tag_DIV_use, 2);
25054
25055   /* Tag_MP_extension_use.  */
25056   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
25057     aeabi_set_attribute_int (Tag_MPextension_use, 1);
25058
25059   /* Tag Virtualization_use.  */
25060   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
25061     virt_sec |= 1;
25062   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
25063     virt_sec |= 2;
25064   if (virt_sec != 0)
25065     aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
25066 }
25067
25068 /* Add the default contents for the .ARM.attributes section.  */
25069 void
25070 arm_md_end (void)
25071 {
25072   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
25073     return;
25074
25075   aeabi_set_public_attributes ();
25076 }
25077 #endif /* OBJ_ELF */
25078
25079
25080 /* Parse a .cpu directive.  */
25081
25082 static void
25083 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
25084 {
25085   const struct arm_cpu_option_table *opt;
25086   char *name;
25087   char saved_char;
25088
25089   name = input_line_pointer;
25090   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25091     input_line_pointer++;
25092   saved_char = *input_line_pointer;
25093   *input_line_pointer = 0;
25094
25095   /* Skip the first "all" entry.  */
25096   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
25097     if (streq (opt->name, name))
25098       {
25099         mcpu_cpu_opt = &opt->value;
25100         selected_cpu = opt->value;
25101         if (opt->canonical_name)
25102           strcpy (selected_cpu_name, opt->canonical_name);
25103         else
25104           {
25105             int i;
25106             for (i = 0; opt->name[i]; i++)
25107               selected_cpu_name[i] = TOUPPER (opt->name[i]);
25108
25109             selected_cpu_name[i] = 0;
25110           }
25111         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25112         *input_line_pointer = saved_char;
25113         demand_empty_rest_of_line ();
25114         return;
25115       }
25116   as_bad (_("unknown cpu `%s'"), name);
25117   *input_line_pointer = saved_char;
25118   ignore_rest_of_line ();
25119 }
25120
25121
25122 /* Parse a .arch directive.  */
25123
25124 static void
25125 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
25126 {
25127   const struct arm_arch_option_table *opt;
25128   char saved_char;
25129   char *name;
25130
25131   name = input_line_pointer;
25132   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25133     input_line_pointer++;
25134   saved_char = *input_line_pointer;
25135   *input_line_pointer = 0;
25136
25137   /* Skip the first "all" entry.  */
25138   for (opt = arm_archs + 1; opt->name != NULL; opt++)
25139     if (streq (opt->name, name))
25140       {
25141         mcpu_cpu_opt = &opt->value;
25142         selected_cpu = opt->value;
25143         strcpy (selected_cpu_name, opt->name);
25144         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25145         *input_line_pointer = saved_char;
25146         demand_empty_rest_of_line ();
25147         return;
25148       }
25149
25150   as_bad (_("unknown architecture `%s'\n"), name);
25151   *input_line_pointer = saved_char;
25152   ignore_rest_of_line ();
25153 }
25154
25155
25156 /* Parse a .object_arch directive.  */
25157
25158 static void
25159 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
25160 {
25161   const struct arm_arch_option_table *opt;
25162   char saved_char;
25163   char *name;
25164
25165   name = input_line_pointer;
25166   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25167     input_line_pointer++;
25168   saved_char = *input_line_pointer;
25169   *input_line_pointer = 0;
25170
25171   /* Skip the first "all" entry.  */
25172   for (opt = arm_archs + 1; opt->name != NULL; opt++)
25173     if (streq (opt->name, name))
25174       {
25175         object_arch = &opt->value;
25176         *input_line_pointer = saved_char;
25177         demand_empty_rest_of_line ();
25178         return;
25179       }
25180
25181   as_bad (_("unknown architecture `%s'\n"), name);
25182   *input_line_pointer = saved_char;
25183   ignore_rest_of_line ();
25184 }
25185
25186 /* Parse a .arch_extension directive.  */
25187
25188 static void
25189 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
25190 {
25191   const struct arm_option_extension_value_table *opt;
25192   char saved_char;
25193   char *name;
25194   int adding_value = 1;
25195
25196   name = input_line_pointer;
25197   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25198     input_line_pointer++;
25199   saved_char = *input_line_pointer;
25200   *input_line_pointer = 0;
25201
25202   if (strlen (name) >= 2
25203       && strncmp (name, "no", 2) == 0)
25204     {
25205       adding_value = 0;
25206       name += 2;
25207     }
25208
25209   for (opt = arm_extensions; opt->name != NULL; opt++)
25210     if (streq (opt->name, name))
25211       {
25212         if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
25213           {
25214             as_bad (_("architectural extension `%s' is not allowed for the "
25215                       "current base architecture"), name);
25216             break;
25217           }
25218
25219         if (adding_value)
25220           ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
25221         else
25222           ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
25223
25224         mcpu_cpu_opt = &selected_cpu;
25225         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25226         *input_line_pointer = saved_char;
25227         demand_empty_rest_of_line ();
25228         return;
25229       }
25230
25231   if (opt->name == NULL)
25232     as_bad (_("unknown architecture extension `%s'\n"), name);
25233
25234   *input_line_pointer = saved_char;
25235   ignore_rest_of_line ();
25236 }
25237
25238 /* Parse a .fpu directive.  */
25239
25240 static void
25241 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
25242 {
25243   const struct arm_option_fpu_value_table *opt;
25244   char saved_char;
25245   char *name;
25246
25247   name = input_line_pointer;
25248   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25249     input_line_pointer++;
25250   saved_char = *input_line_pointer;
25251   *input_line_pointer = 0;
25252
25253   for (opt = arm_fpus; opt->name != NULL; opt++)
25254     if (streq (opt->name, name))
25255       {
25256         mfpu_opt = &opt->value;
25257         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25258         *input_line_pointer = saved_char;
25259         demand_empty_rest_of_line ();
25260         return;
25261       }
25262
25263   as_bad (_("unknown floating point format `%s'\n"), name);
25264   *input_line_pointer = saved_char;
25265   ignore_rest_of_line ();
25266 }
25267
25268 /* Copy symbol information.  */
25269
25270 void
25271 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
25272 {
25273   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
25274 }
25275
25276 #ifdef OBJ_ELF
25277 /* Given a symbolic attribute NAME, return the proper integer value.
25278    Returns -1 if the attribute is not known.  */
25279
25280 int
25281 arm_convert_symbolic_attribute (const char *name)
25282 {
25283   static const struct
25284   {
25285     const char * name;
25286     const int    tag;
25287   }
25288   attribute_table[] =
25289     {
25290       /* When you modify this table you should
25291          also modify the list in doc/c-arm.texi.  */
25292 #define T(tag) {#tag, tag}
25293       T (Tag_CPU_raw_name),
25294       T (Tag_CPU_name),
25295       T (Tag_CPU_arch),
25296       T (Tag_CPU_arch_profile),
25297       T (Tag_ARM_ISA_use),
25298       T (Tag_THUMB_ISA_use),
25299       T (Tag_FP_arch),
25300       T (Tag_VFP_arch),
25301       T (Tag_WMMX_arch),
25302       T (Tag_Advanced_SIMD_arch),
25303       T (Tag_PCS_config),
25304       T (Tag_ABI_PCS_R9_use),
25305       T (Tag_ABI_PCS_RW_data),
25306       T (Tag_ABI_PCS_RO_data),
25307       T (Tag_ABI_PCS_GOT_use),
25308       T (Tag_ABI_PCS_wchar_t),
25309       T (Tag_ABI_FP_rounding),
25310       T (Tag_ABI_FP_denormal),
25311       T (Tag_ABI_FP_exceptions),
25312       T (Tag_ABI_FP_user_exceptions),
25313       T (Tag_ABI_FP_number_model),
25314       T (Tag_ABI_align_needed),
25315       T (Tag_ABI_align8_needed),
25316       T (Tag_ABI_align_preserved),
25317       T (Tag_ABI_align8_preserved),
25318       T (Tag_ABI_enum_size),
25319       T (Tag_ABI_HardFP_use),
25320       T (Tag_ABI_VFP_args),
25321       T (Tag_ABI_WMMX_args),
25322       T (Tag_ABI_optimization_goals),
25323       T (Tag_ABI_FP_optimization_goals),
25324       T (Tag_compatibility),
25325       T (Tag_CPU_unaligned_access),
25326       T (Tag_FP_HP_extension),
25327       T (Tag_VFP_HP_extension),
25328       T (Tag_ABI_FP_16bit_format),
25329       T (Tag_MPextension_use),
25330       T (Tag_DIV_use),
25331       T (Tag_nodefaults),
25332       T (Tag_also_compatible_with),
25333       T (Tag_conformance),
25334       T (Tag_T2EE_use),
25335       T (Tag_Virtualization_use),
25336       /* We deliberately do not include Tag_MPextension_use_legacy.  */
25337 #undef T
25338     };
25339   unsigned int i;
25340
25341   if (name == NULL)
25342     return -1;
25343
25344   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
25345     if (streq (name, attribute_table[i].name))
25346       return attribute_table[i].tag;
25347
25348   return -1;
25349 }
25350
25351
25352 /* Apply sym value for relocations only in the case that
25353    they are for local symbols and you have the respective
25354    architectural feature for blx and simple switches.  */
25355 int
25356 arm_apply_sym_value (struct fix * fixP)
25357 {
25358   if (fixP->fx_addsy
25359       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
25360       && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
25361     {
25362       switch (fixP->fx_r_type)
25363         {
25364         case BFD_RELOC_ARM_PCREL_BLX:
25365         case BFD_RELOC_THUMB_PCREL_BRANCH23:
25366           if (ARM_IS_FUNC (fixP->fx_addsy))
25367             return 1;
25368           break;
25369
25370         case BFD_RELOC_ARM_PCREL_CALL:
25371         case BFD_RELOC_THUMB_PCREL_BLX:
25372           if (THUMB_IS_FUNC (fixP->fx_addsy))
25373               return 1;
25374           break;
25375
25376         default:
25377           break;
25378         }
25379
25380     }
25381   return 0;
25382 }
25383 #endif /* OBJ_ELF */