Fix uninitialised ARM data
[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 (nbytes);
3457                   memset (p, 0, nbytes);
3458                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
3459                                size, &exp, 0, (enum bfd_reloc_code_real) reloc);
3460                 }
3461             }
3462         }
3463     }
3464   while (*input_line_pointer++ == ',');
3465
3466   /* Put terminator back into stream.  */
3467   input_line_pointer --;
3468   demand_empty_rest_of_line ();
3469 }
3470
3471 /* Emit an expression containing a 32-bit thumb instruction.
3472    Implementation based on put_thumb32_insn.  */
3473
3474 static void
3475 emit_thumb32_expr (expressionS * exp)
3476 {
3477   expressionS exp_high = *exp;
3478
3479   exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3480   emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3481   exp->X_add_number &= 0xffff;
3482   emit_expr (exp, (unsigned int) THUMB_SIZE);
3483 }
3484
3485 /*  Guess the instruction size based on the opcode.  */
3486
3487 static int
3488 thumb_insn_size (int opcode)
3489 {
3490   if ((unsigned int) opcode < 0xe800u)
3491     return 2;
3492   else if ((unsigned int) opcode >= 0xe8000000u)
3493     return 4;
3494   else
3495     return 0;
3496 }
3497
3498 static bfd_boolean
3499 emit_insn (expressionS *exp, int nbytes)
3500 {
3501   int size = 0;
3502
3503   if (exp->X_op == O_constant)
3504     {
3505       size = nbytes;
3506
3507       if (size == 0)
3508         size = thumb_insn_size (exp->X_add_number);
3509
3510       if (size != 0)
3511         {
3512           if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3513             {
3514               as_bad (_(".inst.n operand too big. "\
3515                         "Use .inst.w instead"));
3516               size = 0;
3517             }
3518           else
3519             {
3520               if (now_it.state == AUTOMATIC_IT_BLOCK)
3521                 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3522               else
3523                 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3524
3525               if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3526                 emit_thumb32_expr (exp);
3527               else
3528                 emit_expr (exp, (unsigned int) size);
3529
3530               it_fsm_post_encode ();
3531             }
3532         }
3533       else
3534         as_bad (_("cannot determine Thumb instruction size. "   \
3535                   "Use .inst.n/.inst.w instead"));
3536     }
3537   else
3538     as_bad (_("constant expression required"));
3539
3540   return (size != 0);
3541 }
3542
3543 /* Like s_arm_elf_cons but do not use md_cons_align and
3544    set the mapping state to MAP_ARM/MAP_THUMB.  */
3545
3546 static void
3547 s_arm_elf_inst (int nbytes)
3548 {
3549   if (is_it_end_of_statement ())
3550     {
3551       demand_empty_rest_of_line ();
3552       return;
3553     }
3554
3555   /* Calling mapping_state () here will not change ARM/THUMB,
3556      but will ensure not to be in DATA state.  */
3557
3558   if (thumb_mode)
3559     mapping_state (MAP_THUMB);
3560   else
3561     {
3562       if (nbytes != 0)
3563         {
3564           as_bad (_("width suffixes are invalid in ARM mode"));
3565           ignore_rest_of_line ();
3566           return;
3567         }
3568
3569       nbytes = 4;
3570
3571       mapping_state (MAP_ARM);
3572     }
3573
3574   do
3575     {
3576       expressionS exp;
3577
3578       expression (& exp);
3579
3580       if (! emit_insn (& exp, nbytes))
3581         {
3582           ignore_rest_of_line ();
3583           return;
3584         }
3585     }
3586   while (*input_line_pointer++ == ',');
3587
3588   /* Put terminator back into stream.  */
3589   input_line_pointer --;
3590   demand_empty_rest_of_line ();
3591 }
3592
3593 /* Parse a .rel31 directive.  */
3594
3595 static void
3596 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3597 {
3598   expressionS exp;
3599   char *p;
3600   valueT highbit;
3601
3602   highbit = 0;
3603   if (*input_line_pointer == '1')
3604     highbit = 0x80000000;
3605   else if (*input_line_pointer != '0')
3606     as_bad (_("expected 0 or 1"));
3607
3608   input_line_pointer++;
3609   if (*input_line_pointer != ',')
3610     as_bad (_("missing comma"));
3611   input_line_pointer++;
3612
3613 #ifdef md_flush_pending_output
3614   md_flush_pending_output ();
3615 #endif
3616
3617 #ifdef md_cons_align
3618   md_cons_align (4);
3619 #endif
3620
3621   mapping_state (MAP_DATA);
3622
3623   expression (&exp);
3624
3625   p = frag_more (4);
3626   md_number_to_chars (p, highbit, 4);
3627   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3628                BFD_RELOC_ARM_PREL31);
3629
3630   demand_empty_rest_of_line ();
3631 }
3632
3633 /* Directives: AEABI stack-unwind tables.  */
3634
3635 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
3636
3637 static void
3638 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3639 {
3640   demand_empty_rest_of_line ();
3641   if (unwind.proc_start)
3642     {
3643       as_bad (_("duplicate .fnstart directive"));
3644       return;
3645     }
3646
3647   /* Mark the start of the function.  */
3648   unwind.proc_start = expr_build_dot ();
3649
3650   /* Reset the rest of the unwind info.  */
3651   unwind.opcode_count = 0;
3652   unwind.table_entry = NULL;
3653   unwind.personality_routine = NULL;
3654   unwind.personality_index = -1;
3655   unwind.frame_size = 0;
3656   unwind.fp_offset = 0;
3657   unwind.fp_reg = REG_SP;
3658   unwind.fp_used = 0;
3659   unwind.sp_restored = 0;
3660 }
3661
3662
3663 /* Parse a handlerdata directive.  Creates the exception handling table entry
3664    for the function.  */
3665
3666 static void
3667 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3668 {
3669   demand_empty_rest_of_line ();
3670   if (!unwind.proc_start)
3671     as_bad (MISSING_FNSTART);
3672
3673   if (unwind.table_entry)
3674     as_bad (_("duplicate .handlerdata directive"));
3675
3676   create_unwind_entry (1);
3677 }
3678
3679 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
3680
3681 static void
3682 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3683 {
3684   long where;
3685   char *ptr;
3686   valueT val;
3687   unsigned int marked_pr_dependency;
3688
3689   demand_empty_rest_of_line ();
3690
3691   if (!unwind.proc_start)
3692     {
3693       as_bad (_(".fnend directive without .fnstart"));
3694       return;
3695     }
3696
3697   /* Add eh table entry.  */
3698   if (unwind.table_entry == NULL)
3699     val = create_unwind_entry (0);
3700   else
3701     val = 0;
3702
3703   /* Add index table entry.  This is two words.  */
3704   start_unwind_section (unwind.saved_seg, 1);
3705   frag_align (2, 0, 0);
3706   record_alignment (now_seg, 2);
3707
3708   ptr = frag_more (8);
3709   memset (ptr, 0, 8);
3710   where = frag_now_fix () - 8;
3711
3712   /* Self relative offset of the function start.  */
3713   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3714            BFD_RELOC_ARM_PREL31);
3715
3716   /* Indicate dependency on EHABI-defined personality routines to the
3717      linker, if it hasn't been done already.  */
3718   marked_pr_dependency
3719     = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
3720   if (unwind.personality_index >= 0 && unwind.personality_index < 3
3721       && !(marked_pr_dependency & (1 << unwind.personality_index)))
3722     {
3723       static const char *const name[] =
3724         {
3725           "__aeabi_unwind_cpp_pr0",
3726           "__aeabi_unwind_cpp_pr1",
3727           "__aeabi_unwind_cpp_pr2"
3728         };
3729       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3730       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3731       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3732         |= 1 << unwind.personality_index;
3733     }
3734
3735   if (val)
3736     /* Inline exception table entry.  */
3737     md_number_to_chars (ptr + 4, val, 4);
3738   else
3739     /* Self relative offset of the table entry.  */
3740     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3741              BFD_RELOC_ARM_PREL31);
3742
3743   /* Restore the original section.  */
3744   subseg_set (unwind.saved_seg, unwind.saved_subseg);
3745
3746   unwind.proc_start = NULL;
3747 }
3748
3749
3750 /* Parse an unwind_cantunwind directive.  */
3751
3752 static void
3753 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3754 {
3755   demand_empty_rest_of_line ();
3756   if (!unwind.proc_start)
3757     as_bad (MISSING_FNSTART);
3758
3759   if (unwind.personality_routine || unwind.personality_index != -1)
3760     as_bad (_("personality routine specified for cantunwind frame"));
3761
3762   unwind.personality_index = -2;
3763 }
3764
3765
3766 /* Parse a personalityindex directive.  */
3767
3768 static void
3769 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3770 {
3771   expressionS exp;
3772
3773   if (!unwind.proc_start)
3774     as_bad (MISSING_FNSTART);
3775
3776   if (unwind.personality_routine || unwind.personality_index != -1)
3777     as_bad (_("duplicate .personalityindex directive"));
3778
3779   expression (&exp);
3780
3781   if (exp.X_op != O_constant
3782       || exp.X_add_number < 0 || exp.X_add_number > 15)
3783     {
3784       as_bad (_("bad personality routine number"));
3785       ignore_rest_of_line ();
3786       return;
3787     }
3788
3789   unwind.personality_index = exp.X_add_number;
3790
3791   demand_empty_rest_of_line ();
3792 }
3793
3794
3795 /* Parse a personality directive.  */
3796
3797 static void
3798 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3799 {
3800   char *name, *p, c;
3801
3802   if (!unwind.proc_start)
3803     as_bad (MISSING_FNSTART);
3804
3805   if (unwind.personality_routine || unwind.personality_index != -1)
3806     as_bad (_("duplicate .personality directive"));
3807
3808   name = input_line_pointer;
3809   c = get_symbol_end ();
3810   p = input_line_pointer;
3811   unwind.personality_routine = symbol_find_or_make (name);
3812   *p = c;
3813   demand_empty_rest_of_line ();
3814 }
3815
3816
3817 /* Parse a directive saving core registers.  */
3818
3819 static void
3820 s_arm_unwind_save_core (void)
3821 {
3822   valueT op;
3823   long range;
3824   int n;
3825
3826   range = parse_reg_list (&input_line_pointer);
3827   if (range == FAIL)
3828     {
3829       as_bad (_("expected register list"));
3830       ignore_rest_of_line ();
3831       return;
3832     }
3833
3834   demand_empty_rest_of_line ();
3835
3836   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3837      into .unwind_save {..., sp...}.  We aren't bothered about the value of
3838      ip because it is clobbered by calls.  */
3839   if (unwind.sp_restored && unwind.fp_reg == 12
3840       && (range & 0x3000) == 0x1000)
3841     {
3842       unwind.opcode_count--;
3843       unwind.sp_restored = 0;
3844       range = (range | 0x2000) & ~0x1000;
3845       unwind.pending_offset = 0;
3846     }
3847
3848   /* Pop r4-r15.  */
3849   if (range & 0xfff0)
3850     {
3851       /* See if we can use the short opcodes.  These pop a block of up to 8
3852          registers starting with r4, plus maybe r14.  */
3853       for (n = 0; n < 8; n++)
3854         {
3855           /* Break at the first non-saved register.      */
3856           if ((range & (1 << (n + 4))) == 0)
3857             break;
3858         }
3859       /* See if there are any other bits set.  */
3860       if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3861         {
3862           /* Use the long form.  */
3863           op = 0x8000 | ((range >> 4) & 0xfff);
3864           add_unwind_opcode (op, 2);
3865         }
3866       else
3867         {
3868           /* Use the short form.  */
3869           if (range & 0x4000)
3870             op = 0xa8; /* Pop r14.      */
3871           else
3872             op = 0xa0; /* Do not pop r14.  */
3873           op |= (n - 1);
3874           add_unwind_opcode (op, 1);
3875         }
3876     }
3877
3878   /* Pop r0-r3.  */
3879   if (range & 0xf)
3880     {
3881       op = 0xb100 | (range & 0xf);
3882       add_unwind_opcode (op, 2);
3883     }
3884
3885   /* Record the number of bytes pushed.  */
3886   for (n = 0; n < 16; n++)
3887     {
3888       if (range & (1 << n))
3889         unwind.frame_size += 4;
3890     }
3891 }
3892
3893
3894 /* Parse a directive saving FPA registers.  */
3895
3896 static void
3897 s_arm_unwind_save_fpa (int reg)
3898 {
3899   expressionS exp;
3900   int num_regs;
3901   valueT op;
3902
3903   /* Get Number of registers to transfer.  */
3904   if (skip_past_comma (&input_line_pointer) != FAIL)
3905     expression (&exp);
3906   else
3907     exp.X_op = O_illegal;
3908
3909   if (exp.X_op != O_constant)
3910     {
3911       as_bad (_("expected , <constant>"));
3912       ignore_rest_of_line ();
3913       return;
3914     }
3915
3916   num_regs = exp.X_add_number;
3917
3918   if (num_regs < 1 || num_regs > 4)
3919     {
3920       as_bad (_("number of registers must be in the range [1:4]"));
3921       ignore_rest_of_line ();
3922       return;
3923     }
3924
3925   demand_empty_rest_of_line ();
3926
3927   if (reg == 4)
3928     {
3929       /* Short form.  */
3930       op = 0xb4 | (num_regs - 1);
3931       add_unwind_opcode (op, 1);
3932     }
3933   else
3934     {
3935       /* Long form.  */
3936       op = 0xc800 | (reg << 4) | (num_regs - 1);
3937       add_unwind_opcode (op, 2);
3938     }
3939   unwind.frame_size += num_regs * 12;
3940 }
3941
3942
3943 /* Parse a directive saving VFP registers for ARMv6 and above.  */
3944
3945 static void
3946 s_arm_unwind_save_vfp_armv6 (void)
3947 {
3948   int count;
3949   unsigned int start;
3950   valueT op;
3951   int num_vfpv3_regs = 0;
3952   int num_regs_below_16;
3953
3954   count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3955   if (count == FAIL)
3956     {
3957       as_bad (_("expected register list"));
3958       ignore_rest_of_line ();
3959       return;
3960     }
3961
3962   demand_empty_rest_of_line ();
3963
3964   /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3965      than FSTMX/FLDMX-style ones).  */
3966
3967   /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
3968   if (start >= 16)
3969     num_vfpv3_regs = count;
3970   else if (start + count > 16)
3971     num_vfpv3_regs = start + count - 16;
3972
3973   if (num_vfpv3_regs > 0)
3974     {
3975       int start_offset = start > 16 ? start - 16 : 0;
3976       op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3977       add_unwind_opcode (op, 2);
3978     }
3979
3980   /* Generate opcode for registers numbered in the range 0 .. 15.  */
3981   num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
3982   gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
3983   if (num_regs_below_16 > 0)
3984     {
3985       op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3986       add_unwind_opcode (op, 2);
3987     }
3988
3989   unwind.frame_size += count * 8;
3990 }
3991
3992
3993 /* Parse a directive saving VFP registers for pre-ARMv6.  */
3994
3995 static void
3996 s_arm_unwind_save_vfp (void)
3997 {
3998   int count;
3999   unsigned int reg;
4000   valueT op;
4001
4002   count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
4003   if (count == FAIL)
4004     {
4005       as_bad (_("expected register list"));
4006       ignore_rest_of_line ();
4007       return;
4008     }
4009
4010   demand_empty_rest_of_line ();
4011
4012   if (reg == 8)
4013     {
4014       /* Short form.  */
4015       op = 0xb8 | (count - 1);
4016       add_unwind_opcode (op, 1);
4017     }
4018   else
4019     {
4020       /* Long form.  */
4021       op = 0xb300 | (reg << 4) | (count - 1);
4022       add_unwind_opcode (op, 2);
4023     }
4024   unwind.frame_size += count * 8 + 4;
4025 }
4026
4027
4028 /* Parse a directive saving iWMMXt data registers.  */
4029
4030 static void
4031 s_arm_unwind_save_mmxwr (void)
4032 {
4033   int reg;
4034   int hi_reg;
4035   int i;
4036   unsigned mask = 0;
4037   valueT op;
4038
4039   if (*input_line_pointer == '{')
4040     input_line_pointer++;
4041
4042   do
4043     {
4044       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
4045
4046       if (reg == FAIL)
4047         {
4048           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
4049           goto error;
4050         }
4051
4052       if (mask >> reg)
4053         as_tsktsk (_("register list not in ascending order"));
4054       mask |= 1 << reg;
4055
4056       if (*input_line_pointer == '-')
4057         {
4058           input_line_pointer++;
4059           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
4060           if (hi_reg == FAIL)
4061             {
4062               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
4063               goto error;
4064             }
4065           else if (reg >= hi_reg)
4066             {
4067               as_bad (_("bad register range"));
4068               goto error;
4069             }
4070           for (; reg < hi_reg; reg++)
4071             mask |= 1 << reg;
4072         }
4073     }
4074   while (skip_past_comma (&input_line_pointer) != FAIL);
4075
4076   skip_past_char (&input_line_pointer, '}');
4077
4078   demand_empty_rest_of_line ();
4079
4080   /* Generate any deferred opcodes because we're going to be looking at
4081      the list.  */
4082   flush_pending_unwind ();
4083
4084   for (i = 0; i < 16; i++)
4085     {
4086       if (mask & (1 << i))
4087         unwind.frame_size += 8;
4088     }
4089
4090   /* Attempt to combine with a previous opcode.  We do this because gcc
4091      likes to output separate unwind directives for a single block of
4092      registers.  */
4093   if (unwind.opcode_count > 0)
4094     {
4095       i = unwind.opcodes[unwind.opcode_count - 1];
4096       if ((i & 0xf8) == 0xc0)
4097         {
4098           i &= 7;
4099           /* Only merge if the blocks are contiguous.  */
4100           if (i < 6)
4101             {
4102               if ((mask & 0xfe00) == (1 << 9))
4103                 {
4104                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
4105                   unwind.opcode_count--;
4106                 }
4107             }
4108           else if (i == 6 && unwind.opcode_count >= 2)
4109             {
4110               i = unwind.opcodes[unwind.opcode_count - 2];
4111               reg = i >> 4;
4112               i &= 0xf;
4113
4114               op = 0xffff << (reg - 1);
4115               if (reg > 0
4116                   && ((mask & op) == (1u << (reg - 1))))
4117                 {
4118                   op = (1 << (reg + i + 1)) - 1;
4119                   op &= ~((1 << reg) - 1);
4120                   mask |= op;
4121                   unwind.opcode_count -= 2;
4122                 }
4123             }
4124         }
4125     }
4126
4127   hi_reg = 15;
4128   /* We want to generate opcodes in the order the registers have been
4129      saved, ie. descending order.  */
4130   for (reg = 15; reg >= -1; reg--)
4131     {
4132       /* Save registers in blocks.  */
4133       if (reg < 0
4134           || !(mask & (1 << reg)))
4135         {
4136           /* We found an unsaved reg.  Generate opcodes to save the
4137              preceding block.   */
4138           if (reg != hi_reg)
4139             {
4140               if (reg == 9)
4141                 {
4142                   /* Short form.  */
4143                   op = 0xc0 | (hi_reg - 10);
4144                   add_unwind_opcode (op, 1);
4145                 }
4146               else
4147                 {
4148                   /* Long form.  */
4149                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
4150                   add_unwind_opcode (op, 2);
4151                 }
4152             }
4153           hi_reg = reg - 1;
4154         }
4155     }
4156
4157   return;
4158 error:
4159   ignore_rest_of_line ();
4160 }
4161
4162 static void
4163 s_arm_unwind_save_mmxwcg (void)
4164 {
4165   int reg;
4166   int hi_reg;
4167   unsigned mask = 0;
4168   valueT op;
4169
4170   if (*input_line_pointer == '{')
4171     input_line_pointer++;
4172
4173   skip_whitespace (input_line_pointer);
4174
4175   do
4176     {
4177       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4178
4179       if (reg == FAIL)
4180         {
4181           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4182           goto error;
4183         }
4184
4185       reg -= 8;
4186       if (mask >> reg)
4187         as_tsktsk (_("register list not in ascending order"));
4188       mask |= 1 << reg;
4189
4190       if (*input_line_pointer == '-')
4191         {
4192           input_line_pointer++;
4193           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4194           if (hi_reg == FAIL)
4195             {
4196               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4197               goto error;
4198             }
4199           else if (reg >= hi_reg)
4200             {
4201               as_bad (_("bad register range"));
4202               goto error;
4203             }
4204           for (; reg < hi_reg; reg++)
4205             mask |= 1 << reg;
4206         }
4207     }
4208   while (skip_past_comma (&input_line_pointer) != FAIL);
4209
4210   skip_past_char (&input_line_pointer, '}');
4211
4212   demand_empty_rest_of_line ();
4213
4214   /* Generate any deferred opcodes because we're going to be looking at
4215      the list.  */
4216   flush_pending_unwind ();
4217
4218   for (reg = 0; reg < 16; reg++)
4219     {
4220       if (mask & (1 << reg))
4221         unwind.frame_size += 4;
4222     }
4223   op = 0xc700 | mask;
4224   add_unwind_opcode (op, 2);
4225   return;
4226 error:
4227   ignore_rest_of_line ();
4228 }
4229
4230
4231 /* Parse an unwind_save directive.
4232    If the argument is non-zero, this is a .vsave directive.  */
4233
4234 static void
4235 s_arm_unwind_save (int arch_v6)
4236 {
4237   char *peek;
4238   struct reg_entry *reg;
4239   bfd_boolean had_brace = FALSE;
4240
4241   if (!unwind.proc_start)
4242     as_bad (MISSING_FNSTART);
4243
4244   /* Figure out what sort of save we have.  */
4245   peek = input_line_pointer;
4246
4247   if (*peek == '{')
4248     {
4249       had_brace = TRUE;
4250       peek++;
4251     }
4252
4253   reg = arm_reg_parse_multi (&peek);
4254
4255   if (!reg)
4256     {
4257       as_bad (_("register expected"));
4258       ignore_rest_of_line ();
4259       return;
4260     }
4261
4262   switch (reg->type)
4263     {
4264     case REG_TYPE_FN:
4265       if (had_brace)
4266         {
4267           as_bad (_("FPA .unwind_save does not take a register list"));
4268           ignore_rest_of_line ();
4269           return;
4270         }
4271       input_line_pointer = peek;
4272       s_arm_unwind_save_fpa (reg->number);
4273       return;
4274
4275     case REG_TYPE_RN:
4276       s_arm_unwind_save_core ();
4277       return;
4278
4279     case REG_TYPE_VFD:
4280       if (arch_v6)
4281         s_arm_unwind_save_vfp_armv6 ();
4282       else
4283         s_arm_unwind_save_vfp ();
4284       return;
4285
4286     case REG_TYPE_MMXWR:
4287       s_arm_unwind_save_mmxwr ();
4288       return;
4289
4290     case REG_TYPE_MMXWCG:
4291       s_arm_unwind_save_mmxwcg ();
4292       return;
4293
4294     default:
4295       as_bad (_(".unwind_save does not support this kind of register"));
4296       ignore_rest_of_line ();
4297     }
4298 }
4299
4300
4301 /* Parse an unwind_movsp directive.  */
4302
4303 static void
4304 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4305 {
4306   int reg;
4307   valueT op;
4308   int offset;
4309
4310   if (!unwind.proc_start)
4311     as_bad (MISSING_FNSTART);
4312
4313   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4314   if (reg == FAIL)
4315     {
4316       as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
4317       ignore_rest_of_line ();
4318       return;
4319     }
4320
4321   /* Optional constant.  */
4322   if (skip_past_comma (&input_line_pointer) != FAIL)
4323     {
4324       if (immediate_for_directive (&offset) == FAIL)
4325         return;
4326     }
4327   else
4328     offset = 0;
4329
4330   demand_empty_rest_of_line ();
4331
4332   if (reg == REG_SP || reg == REG_PC)
4333     {
4334       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
4335       return;
4336     }
4337
4338   if (unwind.fp_reg != REG_SP)
4339     as_bad (_("unexpected .unwind_movsp directive"));
4340
4341   /* Generate opcode to restore the value.  */
4342   op = 0x90 | reg;
4343   add_unwind_opcode (op, 1);
4344
4345   /* Record the information for later.  */
4346   unwind.fp_reg = reg;
4347   unwind.fp_offset = unwind.frame_size - offset;
4348   unwind.sp_restored = 1;
4349 }
4350
4351 /* Parse an unwind_pad directive.  */
4352
4353 static void
4354 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
4355 {
4356   int offset;
4357
4358   if (!unwind.proc_start)
4359     as_bad (MISSING_FNSTART);
4360
4361   if (immediate_for_directive (&offset) == FAIL)
4362     return;
4363
4364   if (offset & 3)
4365     {
4366       as_bad (_("stack increment must be multiple of 4"));
4367       ignore_rest_of_line ();
4368       return;
4369     }
4370
4371   /* Don't generate any opcodes, just record the details for later.  */
4372   unwind.frame_size += offset;
4373   unwind.pending_offset += offset;
4374
4375   demand_empty_rest_of_line ();
4376 }
4377
4378 /* Parse an unwind_setfp directive.  */
4379
4380 static void
4381 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
4382 {
4383   int sp_reg;
4384   int fp_reg;
4385   int offset;
4386
4387   if (!unwind.proc_start)
4388     as_bad (MISSING_FNSTART);
4389
4390   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4391   if (skip_past_comma (&input_line_pointer) == FAIL)
4392     sp_reg = FAIL;
4393   else
4394     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4395
4396   if (fp_reg == FAIL || sp_reg == FAIL)
4397     {
4398       as_bad (_("expected <reg>, <reg>"));
4399       ignore_rest_of_line ();
4400       return;
4401     }
4402
4403   /* Optional constant.  */
4404   if (skip_past_comma (&input_line_pointer) != FAIL)
4405     {
4406       if (immediate_for_directive (&offset) == FAIL)
4407         return;
4408     }
4409   else
4410     offset = 0;
4411
4412   demand_empty_rest_of_line ();
4413
4414   if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4415     {
4416       as_bad (_("register must be either sp or set by a previous"
4417                 "unwind_movsp directive"));
4418       return;
4419     }
4420
4421   /* Don't generate any opcodes, just record the information for later.  */
4422   unwind.fp_reg = fp_reg;
4423   unwind.fp_used = 1;
4424   if (sp_reg == REG_SP)
4425     unwind.fp_offset = unwind.frame_size - offset;
4426   else
4427     unwind.fp_offset -= offset;
4428 }
4429
4430 /* Parse an unwind_raw directive.  */
4431
4432 static void
4433 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
4434 {
4435   expressionS exp;
4436   /* This is an arbitrary limit.         */
4437   unsigned char op[16];
4438   int count;
4439
4440   if (!unwind.proc_start)
4441     as_bad (MISSING_FNSTART);
4442
4443   expression (&exp);
4444   if (exp.X_op == O_constant
4445       && skip_past_comma (&input_line_pointer) != FAIL)
4446     {
4447       unwind.frame_size += exp.X_add_number;
4448       expression (&exp);
4449     }
4450   else
4451     exp.X_op = O_illegal;
4452
4453   if (exp.X_op != O_constant)
4454     {
4455       as_bad (_("expected <offset>, <opcode>"));
4456       ignore_rest_of_line ();
4457       return;
4458     }
4459
4460   count = 0;
4461
4462   /* Parse the opcode.  */
4463   for (;;)
4464     {
4465       if (count >= 16)
4466         {
4467           as_bad (_("unwind opcode too long"));
4468           ignore_rest_of_line ();
4469         }
4470       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
4471         {
4472           as_bad (_("invalid unwind opcode"));
4473           ignore_rest_of_line ();
4474           return;
4475         }
4476       op[count++] = exp.X_add_number;
4477
4478       /* Parse the next byte.  */
4479       if (skip_past_comma (&input_line_pointer) == FAIL)
4480         break;
4481
4482       expression (&exp);
4483     }
4484
4485   /* Add the opcode bytes in reverse order.  */
4486   while (count--)
4487     add_unwind_opcode (op[count], 1);
4488
4489   demand_empty_rest_of_line ();
4490 }
4491
4492
4493 /* Parse a .eabi_attribute directive.  */
4494
4495 static void
4496 s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4497 {
4498   int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
4499
4500   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4501     attributes_set_explicitly[tag] = 1;
4502 }
4503
4504 /* Emit a tls fix for the symbol.  */
4505
4506 static void
4507 s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4508 {
4509   char *p;
4510   expressionS exp;
4511 #ifdef md_flush_pending_output
4512   md_flush_pending_output ();
4513 #endif
4514
4515 #ifdef md_cons_align
4516   md_cons_align (4);
4517 #endif
4518
4519   /* Since we're just labelling the code, there's no need to define a
4520      mapping symbol.  */
4521   expression (&exp);
4522   p = obstack_next_free (&frchain_now->frch_obstack);
4523   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4524                thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4525                : BFD_RELOC_ARM_TLS_DESCSEQ);
4526 }
4527 #endif /* OBJ_ELF */
4528
4529 static void s_arm_arch (int);
4530 static void s_arm_object_arch (int);
4531 static void s_arm_cpu (int);
4532 static void s_arm_fpu (int);
4533 static void s_arm_arch_extension (int);
4534
4535 #ifdef TE_PE
4536
4537 static void
4538 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
4539 {
4540   expressionS exp;
4541
4542   do
4543     {
4544       expression (&exp);
4545       if (exp.X_op == O_symbol)
4546         exp.X_op = O_secrel;
4547
4548       emit_expr (&exp, 4);
4549     }
4550   while (*input_line_pointer++ == ',');
4551
4552   input_line_pointer--;
4553   demand_empty_rest_of_line ();
4554 }
4555 #endif /* TE_PE */
4556
4557 /* This table describes all the machine specific pseudo-ops the assembler
4558    has to support.  The fields are:
4559      pseudo-op name without dot
4560      function to call to execute this pseudo-op
4561      Integer arg to pass to the function.  */
4562
4563 const pseudo_typeS md_pseudo_table[] =
4564 {
4565   /* Never called because '.req' does not start a line.  */
4566   { "req",         s_req,         0 },
4567   /* Following two are likewise never called.  */
4568   { "dn",          s_dn,          0 },
4569   { "qn",          s_qn,          0 },
4570   { "unreq",       s_unreq,       0 },
4571   { "bss",         s_bss,         0 },
4572   { "align",       s_align,       0 },
4573   { "arm",         s_arm,         0 },
4574   { "thumb",       s_thumb,       0 },
4575   { "code",        s_code,        0 },
4576   { "force_thumb", s_force_thumb, 0 },
4577   { "thumb_func",  s_thumb_func,  0 },
4578   { "thumb_set",   s_thumb_set,   0 },
4579   { "even",        s_even,        0 },
4580   { "ltorg",       s_ltorg,       0 },
4581   { "pool",        s_ltorg,       0 },
4582   { "syntax",      s_syntax,      0 },
4583   { "cpu",         s_arm_cpu,     0 },
4584   { "arch",        s_arm_arch,    0 },
4585   { "object_arch", s_arm_object_arch,   0 },
4586   { "fpu",         s_arm_fpu,     0 },
4587   { "arch_extension", s_arm_arch_extension, 0 },
4588 #ifdef OBJ_ELF
4589   { "word",             s_arm_elf_cons, 4 },
4590   { "long",             s_arm_elf_cons, 4 },
4591   { "inst.n",           s_arm_elf_inst, 2 },
4592   { "inst.w",           s_arm_elf_inst, 4 },
4593   { "inst",             s_arm_elf_inst, 0 },
4594   { "rel31",            s_arm_rel31,      0 },
4595   { "fnstart",          s_arm_unwind_fnstart,   0 },
4596   { "fnend",            s_arm_unwind_fnend,     0 },
4597   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
4598   { "personality",      s_arm_unwind_personality, 0 },
4599   { "personalityindex", s_arm_unwind_personalityindex, 0 },
4600   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
4601   { "save",             s_arm_unwind_save,      0 },
4602   { "vsave",            s_arm_unwind_save,      1 },
4603   { "movsp",            s_arm_unwind_movsp,     0 },
4604   { "pad",              s_arm_unwind_pad,       0 },
4605   { "setfp",            s_arm_unwind_setfp,     0 },
4606   { "unwind_raw",       s_arm_unwind_raw,       0 },
4607   { "eabi_attribute",   s_arm_eabi_attribute,   0 },
4608   { "tlsdescseq",       s_arm_tls_descseq,      0 },
4609 #else
4610   { "word",        cons, 4},
4611
4612   /* These are used for dwarf.  */
4613   {"2byte", cons, 2},
4614   {"4byte", cons, 4},
4615   {"8byte", cons, 8},
4616   /* These are used for dwarf2.  */
4617   { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4618   { "loc",  dwarf2_directive_loc,  0 },
4619   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
4620 #endif
4621   { "extend",      float_cons, 'x' },
4622   { "ldouble",     float_cons, 'x' },
4623   { "packed",      float_cons, 'p' },
4624 #ifdef TE_PE
4625   {"secrel32", pe_directive_secrel, 0},
4626 #endif
4627
4628   /* These are for compatibility with CodeComposer Studio.  */
4629   {"ref",          s_ccs_ref,        0},
4630   {"def",          s_ccs_def,        0},
4631   {"asmfunc",      s_ccs_asmfunc,    0},
4632   {"endasmfunc",   s_ccs_endasmfunc, 0},
4633
4634   { 0, 0, 0 }
4635 };
4636 \f
4637 /* Parser functions used exclusively in instruction operands.  */
4638
4639 /* Generic immediate-value read function for use in insn parsing.
4640    STR points to the beginning of the immediate (the leading #);
4641    VAL receives the value; if the value is outside [MIN, MAX]
4642    issue an error.  PREFIX_OPT is true if the immediate prefix is
4643    optional.  */
4644
4645 static int
4646 parse_immediate (char **str, int *val, int min, int max,
4647                  bfd_boolean prefix_opt)
4648 {
4649   expressionS exp;
4650   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4651   if (exp.X_op != O_constant)
4652     {
4653       inst.error = _("constant expression required");
4654       return FAIL;
4655     }
4656
4657   if (exp.X_add_number < min || exp.X_add_number > max)
4658     {
4659       inst.error = _("immediate value out of range");
4660       return FAIL;
4661     }
4662
4663   *val = exp.X_add_number;
4664   return SUCCESS;
4665 }
4666
4667 /* Less-generic immediate-value read function with the possibility of loading a
4668    big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
4669    instructions. Puts the result directly in inst.operands[i].  */
4670
4671 static int
4672 parse_big_immediate (char **str, int i)
4673 {
4674   expressionS exp;
4675   char *ptr = *str;
4676
4677   my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4678
4679   if (exp.X_op == O_constant)
4680     {
4681       inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4682       /* If we're on a 64-bit host, then a 64-bit number can be returned using
4683          O_constant.  We have to be careful not to break compilation for
4684          32-bit X_add_number, though.  */
4685       if ((exp.X_add_number & ~(offsetT)(0xffffffffU)) != 0)
4686         {
4687           /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4.  */
4688           inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4689           inst.operands[i].regisimm = 1;
4690         }
4691     }
4692   else if (exp.X_op == O_big
4693            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
4694     {
4695       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
4696
4697       /* Bignums have their least significant bits in
4698          generic_bignum[0]. Make sure we put 32 bits in imm and
4699          32 bits in reg,  in a (hopefully) portable way.  */
4700       gas_assert (parts != 0);
4701
4702       /* Make sure that the number is not too big.
4703          PR 11972: Bignums can now be sign-extended to the
4704          size of a .octa so check that the out of range bits
4705          are all zero or all one.  */
4706       if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
4707         {
4708           LITTLENUM_TYPE m = -1;
4709
4710           if (generic_bignum[parts * 2] != 0
4711               && generic_bignum[parts * 2] != m)
4712             return FAIL;
4713
4714           for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
4715             if (generic_bignum[j] != generic_bignum[j-1])
4716               return FAIL;
4717         }
4718
4719       inst.operands[i].imm = 0;
4720       for (j = 0; j < parts; j++, idx++)
4721         inst.operands[i].imm |= generic_bignum[idx]
4722                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4723       inst.operands[i].reg = 0;
4724       for (j = 0; j < parts; j++, idx++)
4725         inst.operands[i].reg |= generic_bignum[idx]
4726                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4727       inst.operands[i].regisimm = 1;
4728     }
4729   else
4730     return FAIL;
4731
4732   *str = ptr;
4733
4734   return SUCCESS;
4735 }
4736
4737 /* Returns the pseudo-register number of an FPA immediate constant,
4738    or FAIL if there isn't a valid constant here.  */
4739
4740 static int
4741 parse_fpa_immediate (char ** str)
4742 {
4743   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4744   char *         save_in;
4745   expressionS    exp;
4746   int            i;
4747   int            j;
4748
4749   /* First try and match exact strings, this is to guarantee
4750      that some formats will work even for cross assembly.  */
4751
4752   for (i = 0; fp_const[i]; i++)
4753     {
4754       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
4755         {
4756           char *start = *str;
4757
4758           *str += strlen (fp_const[i]);
4759           if (is_end_of_line[(unsigned char) **str])
4760             return i + 8;
4761           *str = start;
4762         }
4763     }
4764
4765   /* Just because we didn't get a match doesn't mean that the constant
4766      isn't valid, just that it is in a format that we don't
4767      automatically recognize.  Try parsing it with the standard
4768      expression routines.  */
4769
4770   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
4771
4772   /* Look for a raw floating point number.  */
4773   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4774       && is_end_of_line[(unsigned char) *save_in])
4775     {
4776       for (i = 0; i < NUM_FLOAT_VALS; i++)
4777         {
4778           for (j = 0; j < MAX_LITTLENUMS; j++)
4779             {
4780               if (words[j] != fp_values[i][j])
4781                 break;
4782             }
4783
4784           if (j == MAX_LITTLENUMS)
4785             {
4786               *str = save_in;
4787               return i + 8;
4788             }
4789         }
4790     }
4791
4792   /* Try and parse a more complex expression, this will probably fail
4793      unless the code uses a floating point prefix (eg "0f").  */
4794   save_in = input_line_pointer;
4795   input_line_pointer = *str;
4796   if (expression (&exp) == absolute_section
4797       && exp.X_op == O_big
4798       && exp.X_add_number < 0)
4799     {
4800       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4801          Ditto for 15.  */
4802       if (gen_to_words (words, 5, (long) 15) == 0)
4803         {
4804           for (i = 0; i < NUM_FLOAT_VALS; i++)
4805             {
4806               for (j = 0; j < MAX_LITTLENUMS; j++)
4807                 {
4808                   if (words[j] != fp_values[i][j])
4809                     break;
4810                 }
4811
4812               if (j == MAX_LITTLENUMS)
4813                 {
4814                   *str = input_line_pointer;
4815                   input_line_pointer = save_in;
4816                   return i + 8;
4817                 }
4818             }
4819         }
4820     }
4821
4822   *str = input_line_pointer;
4823   input_line_pointer = save_in;
4824   inst.error = _("invalid FPA immediate expression");
4825   return FAIL;
4826 }
4827
4828 /* Returns 1 if a number has "quarter-precision" float format
4829    0baBbbbbbc defgh000 00000000 00000000.  */
4830
4831 static int
4832 is_quarter_float (unsigned imm)
4833 {
4834   int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4835   return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4836 }
4837
4838 /* Parse an 8-bit "quarter-precision" floating point number of the form:
4839    0baBbbbbbc defgh000 00000000 00000000.
4840    The zero and minus-zero cases need special handling, since they can't be
4841    encoded in the "quarter-precision" float format, but can nonetheless be
4842    loaded as integer constants.  */
4843
4844 static unsigned
4845 parse_qfloat_immediate (char **ccp, int *immed)
4846 {
4847   char *str = *ccp;
4848   char *fpnum;
4849   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4850   int found_fpchar = 0;
4851
4852   skip_past_char (&str, '#');
4853
4854   /* We must not accidentally parse an integer as a floating-point number. Make
4855      sure that the value we parse is not an integer by checking for special
4856      characters '.' or 'e'.
4857      FIXME: This is a horrible hack, but doing better is tricky because type
4858      information isn't in a very usable state at parse time.  */
4859   fpnum = str;
4860   skip_whitespace (fpnum);
4861
4862   if (strncmp (fpnum, "0x", 2) == 0)
4863     return FAIL;
4864   else
4865     {
4866       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4867         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4868           {
4869             found_fpchar = 1;
4870             break;
4871           }
4872
4873       if (!found_fpchar)
4874         return FAIL;
4875     }
4876
4877   if ((str = atof_ieee (str, 's', words)) != NULL)
4878     {
4879       unsigned fpword = 0;
4880       int i;
4881
4882       /* Our FP word must be 32 bits (single-precision FP).  */
4883       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4884         {
4885           fpword <<= LITTLENUM_NUMBER_OF_BITS;
4886           fpword |= words[i];
4887         }
4888
4889       if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
4890         *immed = fpword;
4891       else
4892         return FAIL;
4893
4894       *ccp = str;
4895
4896       return SUCCESS;
4897     }
4898
4899   return FAIL;
4900 }
4901
4902 /* Shift operands.  */
4903 enum shift_kind
4904 {
4905   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4906 };
4907
4908 struct asm_shift_name
4909 {
4910   const char      *name;
4911   enum shift_kind  kind;
4912 };
4913
4914 /* Third argument to parse_shift.  */
4915 enum parse_shift_mode
4916 {
4917   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
4918   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
4919   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
4920   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
4921   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
4922 };
4923
4924 /* Parse a <shift> specifier on an ARM data processing instruction.
4925    This has three forms:
4926
4927      (LSL|LSR|ASL|ASR|ROR) Rs
4928      (LSL|LSR|ASL|ASR|ROR) #imm
4929      RRX
4930
4931    Note that ASL is assimilated to LSL in the instruction encoding, and
4932    RRX to ROR #0 (which cannot be written as such).  */
4933
4934 static int
4935 parse_shift (char **str, int i, enum parse_shift_mode mode)
4936 {
4937   const struct asm_shift_name *shift_name;
4938   enum shift_kind shift;
4939   char *s = *str;
4940   char *p = s;
4941   int reg;
4942
4943   for (p = *str; ISALPHA (*p); p++)
4944     ;
4945
4946   if (p == *str)
4947     {
4948       inst.error = _("shift expression expected");
4949       return FAIL;
4950     }
4951
4952   shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
4953                                                             p - *str);
4954
4955   if (shift_name == NULL)
4956     {
4957       inst.error = _("shift expression expected");
4958       return FAIL;
4959     }
4960
4961   shift = shift_name->kind;
4962
4963   switch (mode)
4964     {
4965     case NO_SHIFT_RESTRICT:
4966     case SHIFT_IMMEDIATE:   break;
4967
4968     case SHIFT_LSL_OR_ASR_IMMEDIATE:
4969       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4970         {
4971           inst.error = _("'LSL' or 'ASR' required");
4972           return FAIL;
4973         }
4974       break;
4975
4976     case SHIFT_LSL_IMMEDIATE:
4977       if (shift != SHIFT_LSL)
4978         {
4979           inst.error = _("'LSL' required");
4980           return FAIL;
4981         }
4982       break;
4983
4984     case SHIFT_ASR_IMMEDIATE:
4985       if (shift != SHIFT_ASR)
4986         {
4987           inst.error = _("'ASR' required");
4988           return FAIL;
4989         }
4990       break;
4991
4992     default: abort ();
4993     }
4994
4995   if (shift != SHIFT_RRX)
4996     {
4997       /* Whitespace can appear here if the next thing is a bare digit.  */
4998       skip_whitespace (p);
4999
5000       if (mode == NO_SHIFT_RESTRICT
5001           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5002         {
5003           inst.operands[i].imm = reg;
5004           inst.operands[i].immisreg = 1;
5005         }
5006       else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5007         return FAIL;
5008     }
5009   inst.operands[i].shift_kind = shift;
5010   inst.operands[i].shifted = 1;
5011   *str = p;
5012   return SUCCESS;
5013 }
5014
5015 /* Parse a <shifter_operand> for an ARM data processing instruction:
5016
5017       #<immediate>
5018       #<immediate>, <rotate>
5019       <Rm>
5020       <Rm>, <shift>
5021
5022    where <shift> is defined by parse_shift above, and <rotate> is a
5023    multiple of 2 between 0 and 30.  Validation of immediate operands
5024    is deferred to md_apply_fix.  */
5025
5026 static int
5027 parse_shifter_operand (char **str, int i)
5028 {
5029   int value;
5030   expressionS exp;
5031
5032   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
5033     {
5034       inst.operands[i].reg = value;
5035       inst.operands[i].isreg = 1;
5036
5037       /* parse_shift will override this if appropriate */
5038       inst.reloc.exp.X_op = O_constant;
5039       inst.reloc.exp.X_add_number = 0;
5040
5041       if (skip_past_comma (str) == FAIL)
5042         return SUCCESS;
5043
5044       /* Shift operation on register.  */
5045       return parse_shift (str, i, NO_SHIFT_RESTRICT);
5046     }
5047
5048   if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
5049     return FAIL;
5050
5051   if (skip_past_comma (str) == SUCCESS)
5052     {
5053       /* #x, y -- ie explicit rotation by Y.  */
5054       if (my_get_expression (&exp, str, GE_NO_PREFIX))
5055         return FAIL;
5056
5057       if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
5058         {
5059           inst.error = _("constant expression expected");
5060           return FAIL;
5061         }
5062
5063       value = exp.X_add_number;
5064       if (value < 0 || value > 30 || value % 2 != 0)
5065         {
5066           inst.error = _("invalid rotation");
5067           return FAIL;
5068         }
5069       if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
5070         {
5071           inst.error = _("invalid constant");
5072           return FAIL;
5073         }
5074
5075       /* Encode as specified.  */
5076       inst.operands[i].imm = inst.reloc.exp.X_add_number | value << 7;
5077       return SUCCESS;
5078     }
5079
5080   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
5081   inst.reloc.pc_rel = 0;
5082   return SUCCESS;
5083 }
5084
5085 /* Group relocation information.  Each entry in the table contains the
5086    textual name of the relocation as may appear in assembler source
5087    and must end with a colon.
5088    Along with this textual name are the relocation codes to be used if
5089    the corresponding instruction is an ALU instruction (ADD or SUB only),
5090    an LDR, an LDRS, or an LDC.  */
5091
5092 struct group_reloc_table_entry
5093 {
5094   const char *name;
5095   int alu_code;
5096   int ldr_code;
5097   int ldrs_code;
5098   int ldc_code;
5099 };
5100
5101 typedef enum
5102 {
5103   /* Varieties of non-ALU group relocation.  */
5104
5105   GROUP_LDR,
5106   GROUP_LDRS,
5107   GROUP_LDC
5108 } group_reloc_type;
5109
5110 static struct group_reloc_table_entry group_reloc_table[] =
5111   { /* Program counter relative: */
5112     { "pc_g0_nc",
5113       BFD_RELOC_ARM_ALU_PC_G0_NC,       /* ALU */
5114       0,                                /* LDR */
5115       0,                                /* LDRS */
5116       0 },                              /* LDC */
5117     { "pc_g0",
5118       BFD_RELOC_ARM_ALU_PC_G0,          /* ALU */
5119       BFD_RELOC_ARM_LDR_PC_G0,          /* LDR */
5120       BFD_RELOC_ARM_LDRS_PC_G0,         /* LDRS */
5121       BFD_RELOC_ARM_LDC_PC_G0 },        /* LDC */
5122     { "pc_g1_nc",
5123       BFD_RELOC_ARM_ALU_PC_G1_NC,       /* ALU */
5124       0,                                /* LDR */
5125       0,                                /* LDRS */
5126       0 },                              /* LDC */
5127     { "pc_g1",
5128       BFD_RELOC_ARM_ALU_PC_G1,          /* ALU */
5129       BFD_RELOC_ARM_LDR_PC_G1,          /* LDR */
5130       BFD_RELOC_ARM_LDRS_PC_G1,         /* LDRS */
5131       BFD_RELOC_ARM_LDC_PC_G1 },        /* LDC */
5132     { "pc_g2",
5133       BFD_RELOC_ARM_ALU_PC_G2,          /* ALU */
5134       BFD_RELOC_ARM_LDR_PC_G2,          /* LDR */
5135       BFD_RELOC_ARM_LDRS_PC_G2,         /* LDRS */
5136       BFD_RELOC_ARM_LDC_PC_G2 },        /* LDC */
5137     /* Section base relative */
5138     { "sb_g0_nc",
5139       BFD_RELOC_ARM_ALU_SB_G0_NC,       /* ALU */
5140       0,                                /* LDR */
5141       0,                                /* LDRS */
5142       0 },                              /* LDC */
5143     { "sb_g0",
5144       BFD_RELOC_ARM_ALU_SB_G0,          /* ALU */
5145       BFD_RELOC_ARM_LDR_SB_G0,          /* LDR */
5146       BFD_RELOC_ARM_LDRS_SB_G0,         /* LDRS */
5147       BFD_RELOC_ARM_LDC_SB_G0 },        /* LDC */
5148     { "sb_g1_nc",
5149       BFD_RELOC_ARM_ALU_SB_G1_NC,       /* ALU */
5150       0,                                /* LDR */
5151       0,                                /* LDRS */
5152       0 },                              /* LDC */
5153     { "sb_g1",
5154       BFD_RELOC_ARM_ALU_SB_G1,          /* ALU */
5155       BFD_RELOC_ARM_LDR_SB_G1,          /* LDR */
5156       BFD_RELOC_ARM_LDRS_SB_G1,         /* LDRS */
5157       BFD_RELOC_ARM_LDC_SB_G1 },        /* LDC */
5158     { "sb_g2",
5159       BFD_RELOC_ARM_ALU_SB_G2,          /* ALU */
5160       BFD_RELOC_ARM_LDR_SB_G2,          /* LDR */
5161       BFD_RELOC_ARM_LDRS_SB_G2,         /* LDRS */
5162       BFD_RELOC_ARM_LDC_SB_G2 } };      /* LDC */
5163
5164 /* Given the address of a pointer pointing to the textual name of a group
5165    relocation as may appear in assembler source, attempt to find its details
5166    in group_reloc_table.  The pointer will be updated to the character after
5167    the trailing colon.  On failure, FAIL will be returned; SUCCESS
5168    otherwise.  On success, *entry will be updated to point at the relevant
5169    group_reloc_table entry. */
5170
5171 static int
5172 find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
5173 {
5174   unsigned int i;
5175   for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
5176     {
5177       int length = strlen (group_reloc_table[i].name);
5178
5179       if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
5180           && (*str)[length] == ':')
5181         {
5182           *out = &group_reloc_table[i];
5183           *str += (length + 1);
5184           return SUCCESS;
5185         }
5186     }
5187
5188   return FAIL;
5189 }
5190
5191 /* Parse a <shifter_operand> for an ARM data processing instruction
5192    (as for parse_shifter_operand) where group relocations are allowed:
5193
5194       #<immediate>
5195       #<immediate>, <rotate>
5196       #:<group_reloc>:<expression>
5197       <Rm>
5198       <Rm>, <shift>
5199
5200    where <group_reloc> is one of the strings defined in group_reloc_table.
5201    The hashes are optional.
5202
5203    Everything else is as for parse_shifter_operand.  */
5204
5205 static parse_operand_result
5206 parse_shifter_operand_group_reloc (char **str, int i)
5207 {
5208   /* Determine if we have the sequence of characters #: or just :
5209      coming next.  If we do, then we check for a group relocation.
5210      If we don't, punt the whole lot to parse_shifter_operand.  */
5211
5212   if (((*str)[0] == '#' && (*str)[1] == ':')
5213       || (*str)[0] == ':')
5214     {
5215       struct group_reloc_table_entry *entry;
5216
5217       if ((*str)[0] == '#')
5218         (*str) += 2;
5219       else
5220         (*str)++;
5221
5222       /* Try to parse a group relocation.  Anything else is an error.  */
5223       if (find_group_reloc_table_entry (str, &entry) == FAIL)
5224         {
5225           inst.error = _("unknown group relocation");
5226           return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5227         }
5228
5229       /* We now have the group relocation table entry corresponding to
5230          the name in the assembler source.  Next, we parse the expression.  */
5231       if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
5232         return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5233
5234       /* Record the relocation type (always the ALU variant here).  */
5235       inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
5236       gas_assert (inst.reloc.type != 0);
5237
5238       return PARSE_OPERAND_SUCCESS;
5239     }
5240   else
5241     return parse_shifter_operand (str, i) == SUCCESS
5242            ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
5243
5244   /* Never reached.  */
5245 }
5246
5247 /* Parse a Neon alignment expression.  Information is written to
5248    inst.operands[i].  We assume the initial ':' has been skipped.
5249
5250    align        .imm = align << 8, .immisalign=1, .preind=0  */
5251 static parse_operand_result
5252 parse_neon_alignment (char **str, int i)
5253 {
5254   char *p = *str;
5255   expressionS exp;
5256
5257   my_get_expression (&exp, &p, GE_NO_PREFIX);
5258
5259   if (exp.X_op != O_constant)
5260     {
5261       inst.error = _("alignment must be constant");
5262       return PARSE_OPERAND_FAIL;
5263     }
5264
5265   inst.operands[i].imm = exp.X_add_number << 8;
5266   inst.operands[i].immisalign = 1;
5267   /* Alignments are not pre-indexes.  */
5268   inst.operands[i].preind = 0;
5269
5270   *str = p;
5271   return PARSE_OPERAND_SUCCESS;
5272 }
5273
5274 /* Parse all forms of an ARM address expression.  Information is written
5275    to inst.operands[i] and/or inst.reloc.
5276
5277    Preindexed addressing (.preind=1):
5278
5279    [Rn, #offset]       .reg=Rn .reloc.exp=offset
5280    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5281    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5282                        .shift_kind=shift .reloc.exp=shift_imm
5283
5284    These three may have a trailing ! which causes .writeback to be set also.
5285
5286    Postindexed addressing (.postind=1, .writeback=1):
5287
5288    [Rn], #offset       .reg=Rn .reloc.exp=offset
5289    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5290    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5291                        .shift_kind=shift .reloc.exp=shift_imm
5292
5293    Unindexed addressing (.preind=0, .postind=0):
5294
5295    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
5296
5297    Other:
5298
5299    [Rn]{!}             shorthand for [Rn,#0]{!}
5300    =immediate          .isreg=0 .reloc.exp=immediate
5301    label               .reg=PC .reloc.pc_rel=1 .reloc.exp=label
5302
5303   It is the caller's responsibility to check for addressing modes not
5304   supported by the instruction, and to set inst.reloc.type.  */
5305
5306 static parse_operand_result
5307 parse_address_main (char **str, int i, int group_relocations,
5308                     group_reloc_type group_type)
5309 {
5310   char *p = *str;
5311   int reg;
5312
5313   if (skip_past_char (&p, '[') == FAIL)
5314     {
5315       if (skip_past_char (&p, '=') == FAIL)
5316         {
5317           /* Bare address - translate to PC-relative offset.  */
5318           inst.reloc.pc_rel = 1;
5319           inst.operands[i].reg = REG_PC;
5320           inst.operands[i].isreg = 1;
5321           inst.operands[i].preind = 1;
5322         }
5323       /* Otherwise a load-constant pseudo op, no special treatment needed here.  */
5324
5325       if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5326         return PARSE_OPERAND_FAIL;
5327
5328       *str = p;
5329       return PARSE_OPERAND_SUCCESS;
5330     }
5331
5332   /* PR gas/14887: Allow for whitespace after the opening bracket.  */
5333   skip_whitespace (p);
5334
5335   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5336     {
5337       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5338       return PARSE_OPERAND_FAIL;
5339     }
5340   inst.operands[i].reg = reg;
5341   inst.operands[i].isreg = 1;
5342
5343   if (skip_past_comma (&p) == SUCCESS)
5344     {
5345       inst.operands[i].preind = 1;
5346
5347       if (*p == '+') p++;
5348       else if (*p == '-') p++, inst.operands[i].negative = 1;
5349
5350       if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5351         {
5352           inst.operands[i].imm = reg;
5353           inst.operands[i].immisreg = 1;
5354
5355           if (skip_past_comma (&p) == SUCCESS)
5356             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5357               return PARSE_OPERAND_FAIL;
5358         }
5359       else if (skip_past_char (&p, ':') == SUCCESS)
5360         {
5361           /* FIXME: '@' should be used here, but it's filtered out by generic
5362              code before we get to see it here. This may be subject to
5363              change.  */
5364           parse_operand_result result = parse_neon_alignment (&p, i);
5365
5366           if (result != PARSE_OPERAND_SUCCESS)
5367             return result;
5368         }
5369       else
5370         {
5371           if (inst.operands[i].negative)
5372             {
5373               inst.operands[i].negative = 0;
5374               p--;
5375             }
5376
5377           if (group_relocations
5378               && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
5379             {
5380               struct group_reloc_table_entry *entry;
5381
5382               /* Skip over the #: or : sequence.  */
5383               if (*p == '#')
5384                 p += 2;
5385               else
5386                 p++;
5387
5388               /* Try to parse a group relocation.  Anything else is an
5389                  error.  */
5390               if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5391                 {
5392                   inst.error = _("unknown group relocation");
5393                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5394                 }
5395
5396               /* We now have the group relocation table entry corresponding to
5397                  the name in the assembler source.  Next, we parse the
5398                  expression.  */
5399               if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5400                 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5401
5402               /* Record the relocation type.  */
5403               switch (group_type)
5404                 {
5405                   case GROUP_LDR:
5406                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
5407                     break;
5408
5409                   case GROUP_LDRS:
5410                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
5411                     break;
5412
5413                   case GROUP_LDC:
5414                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
5415                     break;
5416
5417                   default:
5418                     gas_assert (0);
5419                 }
5420
5421               if (inst.reloc.type == 0)
5422                 {
5423                   inst.error = _("this group relocation is not allowed on this instruction");
5424                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5425                 }
5426             }
5427           else
5428             {
5429               char *q = p;
5430               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5431                 return PARSE_OPERAND_FAIL;
5432               /* If the offset is 0, find out if it's a +0 or -0.  */
5433               if (inst.reloc.exp.X_op == O_constant
5434                   && inst.reloc.exp.X_add_number == 0)
5435                 {
5436                   skip_whitespace (q);
5437                   if (*q == '#')
5438                     {
5439                       q++;
5440                       skip_whitespace (q);
5441                     }
5442                   if (*q == '-')
5443                     inst.operands[i].negative = 1;
5444                 }
5445             }
5446         }
5447     }
5448   else if (skip_past_char (&p, ':') == SUCCESS)
5449     {
5450       /* FIXME: '@' should be used here, but it's filtered out by generic code
5451          before we get to see it here. This may be subject to change.  */
5452       parse_operand_result result = parse_neon_alignment (&p, i);
5453
5454       if (result != PARSE_OPERAND_SUCCESS)
5455         return result;
5456     }
5457
5458   if (skip_past_char (&p, ']') == FAIL)
5459     {
5460       inst.error = _("']' expected");
5461       return PARSE_OPERAND_FAIL;
5462     }
5463
5464   if (skip_past_char (&p, '!') == SUCCESS)
5465     inst.operands[i].writeback = 1;
5466
5467   else if (skip_past_comma (&p) == SUCCESS)
5468     {
5469       if (skip_past_char (&p, '{') == SUCCESS)
5470         {
5471           /* [Rn], {expr} - unindexed, with option */
5472           if (parse_immediate (&p, &inst.operands[i].imm,
5473                                0, 255, TRUE) == FAIL)
5474             return PARSE_OPERAND_FAIL;
5475
5476           if (skip_past_char (&p, '}') == FAIL)
5477             {
5478               inst.error = _("'}' expected at end of 'option' field");
5479               return PARSE_OPERAND_FAIL;
5480             }
5481           if (inst.operands[i].preind)
5482             {
5483               inst.error = _("cannot combine index with option");
5484               return PARSE_OPERAND_FAIL;
5485             }
5486           *str = p;
5487           return PARSE_OPERAND_SUCCESS;
5488         }
5489       else
5490         {
5491           inst.operands[i].postind = 1;
5492           inst.operands[i].writeback = 1;
5493
5494           if (inst.operands[i].preind)
5495             {
5496               inst.error = _("cannot combine pre- and post-indexing");
5497               return PARSE_OPERAND_FAIL;
5498             }
5499
5500           if (*p == '+') p++;
5501           else if (*p == '-') p++, inst.operands[i].negative = 1;
5502
5503           if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5504             {
5505               /* We might be using the immediate for alignment already. If we
5506                  are, OR the register number into the low-order bits.  */
5507               if (inst.operands[i].immisalign)
5508                 inst.operands[i].imm |= reg;
5509               else
5510                 inst.operands[i].imm = reg;
5511               inst.operands[i].immisreg = 1;
5512
5513               if (skip_past_comma (&p) == SUCCESS)
5514                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5515                   return PARSE_OPERAND_FAIL;
5516             }
5517           else
5518             {
5519               char *q = p;
5520               if (inst.operands[i].negative)
5521                 {
5522                   inst.operands[i].negative = 0;
5523                   p--;
5524                 }
5525               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5526                 return PARSE_OPERAND_FAIL;
5527               /* If the offset is 0, find out if it's a +0 or -0.  */
5528               if (inst.reloc.exp.X_op == O_constant
5529                   && inst.reloc.exp.X_add_number == 0)
5530                 {
5531                   skip_whitespace (q);
5532                   if (*q == '#')
5533                     {
5534                       q++;
5535                       skip_whitespace (q);
5536                     }
5537                   if (*q == '-')
5538                     inst.operands[i].negative = 1;
5539                 }
5540             }
5541         }
5542     }
5543
5544   /* If at this point neither .preind nor .postind is set, we have a
5545      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
5546   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5547     {
5548       inst.operands[i].preind = 1;
5549       inst.reloc.exp.X_op = O_constant;
5550       inst.reloc.exp.X_add_number = 0;
5551     }
5552   *str = p;
5553   return PARSE_OPERAND_SUCCESS;
5554 }
5555
5556 static int
5557 parse_address (char **str, int i)
5558 {
5559   return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
5560          ? SUCCESS : FAIL;
5561 }
5562
5563 static parse_operand_result
5564 parse_address_group_reloc (char **str, int i, group_reloc_type type)
5565 {
5566   return parse_address_main (str, i, 1, type);
5567 }
5568
5569 /* Parse an operand for a MOVW or MOVT instruction.  */
5570 static int
5571 parse_half (char **str)
5572 {
5573   char * p;
5574
5575   p = *str;
5576   skip_past_char (&p, '#');
5577   if (strncasecmp (p, ":lower16:", 9) == 0)
5578     inst.reloc.type = BFD_RELOC_ARM_MOVW;
5579   else if (strncasecmp (p, ":upper16:", 9) == 0)
5580     inst.reloc.type = BFD_RELOC_ARM_MOVT;
5581
5582   if (inst.reloc.type != BFD_RELOC_UNUSED)
5583     {
5584       p += 9;
5585       skip_whitespace (p);
5586     }
5587
5588   if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5589     return FAIL;
5590
5591   if (inst.reloc.type == BFD_RELOC_UNUSED)
5592     {
5593       if (inst.reloc.exp.X_op != O_constant)
5594         {
5595           inst.error = _("constant expression expected");
5596           return FAIL;
5597         }
5598       if (inst.reloc.exp.X_add_number < 0
5599           || inst.reloc.exp.X_add_number > 0xffff)
5600         {
5601           inst.error = _("immediate value out of range");
5602           return FAIL;
5603         }
5604     }
5605   *str = p;
5606   return SUCCESS;
5607 }
5608
5609 /* Miscellaneous. */
5610
5611 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
5612    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
5613 static int
5614 parse_psr (char **str, bfd_boolean lhs)
5615 {
5616   char *p;
5617   unsigned long psr_field;
5618   const struct asm_psr *psr;
5619   char *start;
5620   bfd_boolean is_apsr = FALSE;
5621   bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
5622
5623   /* PR gas/12698:  If the user has specified -march=all then m_profile will
5624      be TRUE, but we want to ignore it in this case as we are building for any
5625      CPU type, including non-m variants.  */
5626   if (selected_cpu.core == arm_arch_any.core)
5627     m_profile = FALSE;
5628
5629   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
5630      feature for ease of use and backwards compatibility.  */
5631   p = *str;
5632   if (strncasecmp (p, "SPSR", 4) == 0)
5633     {
5634       if (m_profile)
5635         goto unsupported_psr;
5636
5637       psr_field = SPSR_BIT;
5638     }
5639   else if (strncasecmp (p, "CPSR", 4) == 0)
5640     {
5641       if (m_profile)
5642         goto unsupported_psr;
5643
5644       psr_field = 0;
5645     }
5646   else if (strncasecmp (p, "APSR", 4) == 0)
5647     {
5648       /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
5649          and ARMv7-R architecture CPUs.  */
5650       is_apsr = TRUE;
5651       psr_field = 0;
5652     }
5653   else if (m_profile)
5654     {
5655       start = p;
5656       do
5657         p++;
5658       while (ISALNUM (*p) || *p == '_');
5659
5660       if (strncasecmp (start, "iapsr", 5) == 0
5661           || strncasecmp (start, "eapsr", 5) == 0
5662           || strncasecmp (start, "xpsr", 4) == 0
5663           || strncasecmp (start, "psr", 3) == 0)
5664         p = start + strcspn (start, "rR") + 1;
5665
5666       psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5667                                                   p - start);
5668
5669       if (!psr)
5670         return FAIL;
5671
5672       /* If APSR is being written, a bitfield may be specified.  Note that
5673          APSR itself is handled above.  */
5674       if (psr->field <= 3)
5675         {
5676           psr_field = psr->field;
5677           is_apsr = TRUE;
5678           goto check_suffix;
5679         }
5680
5681       *str = p;
5682       /* M-profile MSR instructions have the mask field set to "10", except
5683          *PSR variants which modify APSR, which may use a different mask (and
5684          have been handled already).  Do that by setting the PSR_f field
5685          here.  */
5686       return psr->field | (lhs ? PSR_f : 0);
5687     }
5688   else
5689     goto unsupported_psr;
5690
5691   p += 4;
5692 check_suffix:
5693   if (*p == '_')
5694     {
5695       /* A suffix follows.  */
5696       p++;
5697       start = p;
5698
5699       do
5700         p++;
5701       while (ISALNUM (*p) || *p == '_');
5702
5703       if (is_apsr)
5704         {
5705           /* APSR uses a notation for bits, rather than fields.  */
5706           unsigned int nzcvq_bits = 0;
5707           unsigned int g_bit = 0;
5708           char *bit;
5709
5710           for (bit = start; bit != p; bit++)
5711             {
5712               switch (TOLOWER (*bit))
5713                 {
5714                 case 'n':
5715                   nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
5716                   break;
5717
5718                 case 'z':
5719                   nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
5720                   break;
5721
5722                 case 'c':
5723                   nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
5724                   break;
5725
5726                 case 'v':
5727                   nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
5728                   break;
5729
5730                 case 'q':
5731                   nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
5732                   break;
5733
5734                 case 'g':
5735                   g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
5736                   break;
5737
5738                 default:
5739                   inst.error = _("unexpected bit specified after APSR");
5740                   return FAIL;
5741                 }
5742             }
5743
5744           if (nzcvq_bits == 0x1f)
5745             psr_field |= PSR_f;
5746
5747           if (g_bit == 0x1)
5748             {
5749               if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
5750                 {
5751                   inst.error = _("selected processor does not "
5752                                  "support DSP extension");
5753                   return FAIL;
5754                 }
5755
5756               psr_field |= PSR_s;
5757             }
5758
5759           if ((nzcvq_bits & 0x20) != 0
5760               || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
5761               || (g_bit & 0x2) != 0)
5762             {
5763               inst.error = _("bad bitmask specified after APSR");
5764               return FAIL;
5765             }
5766         }
5767       else
5768         {
5769           psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5770                                                       p - start);
5771           if (!psr)
5772             goto error;
5773
5774           psr_field |= psr->field;
5775         }
5776     }
5777   else
5778     {
5779       if (ISALNUM (*p))
5780         goto error;    /* Garbage after "[CS]PSR".  */
5781
5782       /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes).  This
5783          is deprecated, but allow it anyway.  */
5784       if (is_apsr && lhs)
5785         {
5786           psr_field |= PSR_f;
5787           as_tsktsk (_("writing to APSR without specifying a bitmask is "
5788                        "deprecated"));
5789         }
5790       else if (!m_profile)
5791         /* These bits are never right for M-profile devices: don't set them
5792            (only code paths which read/write APSR reach here).  */
5793         psr_field |= (PSR_c | PSR_f);
5794     }
5795   *str = p;
5796   return psr_field;
5797
5798  unsupported_psr:
5799   inst.error = _("selected processor does not support requested special "
5800                  "purpose register");
5801   return FAIL;
5802
5803  error:
5804   inst.error = _("flag for {c}psr instruction expected");
5805   return FAIL;
5806 }
5807
5808 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
5809    value suitable for splatting into the AIF field of the instruction.  */
5810
5811 static int
5812 parse_cps_flags (char **str)
5813 {
5814   int val = 0;
5815   int saw_a_flag = 0;
5816   char *s = *str;
5817
5818   for (;;)
5819     switch (*s++)
5820       {
5821       case '\0': case ',':
5822         goto done;
5823
5824       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5825       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5826       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
5827
5828       default:
5829         inst.error = _("unrecognized CPS flag");
5830         return FAIL;
5831       }
5832
5833  done:
5834   if (saw_a_flag == 0)
5835     {
5836       inst.error = _("missing CPS flags");
5837       return FAIL;
5838     }
5839
5840   *str = s - 1;
5841   return val;
5842 }
5843
5844 /* Parse an endian specifier ("BE" or "LE", case insensitive);
5845    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
5846
5847 static int
5848 parse_endian_specifier (char **str)
5849 {
5850   int little_endian;
5851   char *s = *str;
5852
5853   if (strncasecmp (s, "BE", 2))
5854     little_endian = 0;
5855   else if (strncasecmp (s, "LE", 2))
5856     little_endian = 1;
5857   else
5858     {
5859       inst.error = _("valid endian specifiers are be or le");
5860       return FAIL;
5861     }
5862
5863   if (ISALNUM (s[2]) || s[2] == '_')
5864     {
5865       inst.error = _("valid endian specifiers are be or le");
5866       return FAIL;
5867     }
5868
5869   *str = s + 2;
5870   return little_endian;
5871 }
5872
5873 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
5874    value suitable for poking into the rotate field of an sxt or sxta
5875    instruction, or FAIL on error.  */
5876
5877 static int
5878 parse_ror (char **str)
5879 {
5880   int rot;
5881   char *s = *str;
5882
5883   if (strncasecmp (s, "ROR", 3) == 0)
5884     s += 3;
5885   else
5886     {
5887       inst.error = _("missing rotation field after comma");
5888       return FAIL;
5889     }
5890
5891   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5892     return FAIL;
5893
5894   switch (rot)
5895     {
5896     case  0: *str = s; return 0x0;
5897     case  8: *str = s; return 0x1;
5898     case 16: *str = s; return 0x2;
5899     case 24: *str = s; return 0x3;
5900
5901     default:
5902       inst.error = _("rotation can only be 0, 8, 16, or 24");
5903       return FAIL;
5904     }
5905 }
5906
5907 /* Parse a conditional code (from conds[] below).  The value returned is in the
5908    range 0 .. 14, or FAIL.  */
5909 static int
5910 parse_cond (char **str)
5911 {
5912   char *q;
5913   const struct asm_cond *c;
5914   int n;
5915   /* Condition codes are always 2 characters, so matching up to
5916      3 characters is sufficient.  */
5917   char cond[3];
5918
5919   q = *str;
5920   n = 0;
5921   while (ISALPHA (*q) && n < 3)
5922     {
5923       cond[n] = TOLOWER (*q);
5924       q++;
5925       n++;
5926     }
5927
5928   c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
5929   if (!c)
5930     {
5931       inst.error = _("condition required");
5932       return FAIL;
5933     }
5934
5935   *str = q;
5936   return c->value;
5937 }
5938
5939 /* If the given feature available in the selected CPU, mark it as used.
5940    Returns TRUE iff feature is available.  */
5941 static bfd_boolean
5942 mark_feature_used (const arm_feature_set *feature)
5943 {
5944   /* Ensure the option is valid on the current architecture.  */
5945   if (!ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
5946     return FALSE;
5947
5948   /* Add the appropriate architecture feature for the barrier option used.
5949      */
5950   if (thumb_mode)
5951     ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, *feature);
5952   else
5953     ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, *feature);
5954
5955   return TRUE;
5956 }
5957
5958 /* Parse an option for a barrier instruction.  Returns the encoding for the
5959    option, or FAIL.  */
5960 static int
5961 parse_barrier (char **str)
5962 {
5963   char *p, *q;
5964   const struct asm_barrier_opt *o;
5965
5966   p = q = *str;
5967   while (ISALPHA (*q))
5968     q++;
5969
5970   o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
5971                                                     q - p);
5972   if (!o)
5973     return FAIL;
5974
5975   if (!mark_feature_used (&o->arch))
5976     return FAIL;
5977
5978   *str = q;
5979   return o->value;
5980 }
5981
5982 /* Parse the operands of a table branch instruction.  Similar to a memory
5983    operand.  */
5984 static int
5985 parse_tb (char **str)
5986 {
5987   char * p = *str;
5988   int reg;
5989
5990   if (skip_past_char (&p, '[') == FAIL)
5991     {
5992       inst.error = _("'[' expected");
5993       return FAIL;
5994     }
5995
5996   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5997     {
5998       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5999       return FAIL;
6000     }
6001   inst.operands[0].reg = reg;
6002
6003   if (skip_past_comma (&p) == FAIL)
6004     {
6005       inst.error = _("',' expected");
6006       return FAIL;
6007     }
6008
6009   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
6010     {
6011       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
6012       return FAIL;
6013     }
6014   inst.operands[0].imm = reg;
6015
6016   if (skip_past_comma (&p) == SUCCESS)
6017     {
6018       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
6019         return FAIL;
6020       if (inst.reloc.exp.X_add_number != 1)
6021         {
6022           inst.error = _("invalid shift");
6023           return FAIL;
6024         }
6025       inst.operands[0].shifted = 1;
6026     }
6027
6028   if (skip_past_char (&p, ']') == FAIL)
6029     {
6030       inst.error = _("']' expected");
6031       return FAIL;
6032     }
6033   *str = p;
6034   return SUCCESS;
6035 }
6036
6037 /* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
6038    information on the types the operands can take and how they are encoded.
6039    Up to four operands may be read; this function handles setting the
6040    ".present" field for each read operand itself.
6041    Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
6042    else returns FAIL.  */
6043
6044 static int
6045 parse_neon_mov (char **str, int *which_operand)
6046 {
6047   int i = *which_operand, val;
6048   enum arm_reg_type rtype;
6049   char *ptr = *str;
6050   struct neon_type_el optype;
6051
6052   if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
6053     {
6054       /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
6055       inst.operands[i].reg = val;
6056       inst.operands[i].isscalar = 1;
6057       inst.operands[i].vectype = optype;
6058       inst.operands[i++].present = 1;
6059
6060       if (skip_past_comma (&ptr) == FAIL)
6061         goto wanted_comma;
6062
6063       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6064         goto wanted_arm;
6065
6066       inst.operands[i].reg = val;
6067       inst.operands[i].isreg = 1;
6068       inst.operands[i].present = 1;
6069     }
6070   else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
6071            != FAIL)
6072     {
6073       /* Cases 0, 1, 2, 3, 5 (D only).  */
6074       if (skip_past_comma (&ptr) == FAIL)
6075         goto wanted_comma;
6076
6077       inst.operands[i].reg = val;
6078       inst.operands[i].isreg = 1;
6079       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
6080       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6081       inst.operands[i].isvec = 1;
6082       inst.operands[i].vectype = optype;
6083       inst.operands[i++].present = 1;
6084
6085       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6086         {
6087           /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
6088              Case 13: VMOV <Sd>, <Rm>  */
6089           inst.operands[i].reg = val;
6090           inst.operands[i].isreg = 1;
6091           inst.operands[i].present = 1;
6092
6093           if (rtype == REG_TYPE_NQ)
6094             {
6095               first_error (_("can't use Neon quad register here"));
6096               return FAIL;
6097             }
6098           else if (rtype != REG_TYPE_VFS)
6099             {
6100               i++;
6101               if (skip_past_comma (&ptr) == FAIL)
6102                 goto wanted_comma;
6103               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6104                 goto wanted_arm;
6105               inst.operands[i].reg = val;
6106               inst.operands[i].isreg = 1;
6107               inst.operands[i].present = 1;
6108             }
6109         }
6110       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
6111                                            &optype)) != FAIL)
6112         {
6113           /* Case 0: VMOV<c><q> <Qd>, <Qm>
6114              Case 1: VMOV<c><q> <Dd>, <Dm>
6115              Case 8: VMOV.F32 <Sd>, <Sm>
6116              Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
6117
6118           inst.operands[i].reg = val;
6119           inst.operands[i].isreg = 1;
6120           inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
6121           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6122           inst.operands[i].isvec = 1;
6123           inst.operands[i].vectype = optype;
6124           inst.operands[i].present = 1;
6125
6126           if (skip_past_comma (&ptr) == SUCCESS)
6127             {
6128               /* Case 15.  */
6129               i++;
6130
6131               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6132                 goto wanted_arm;
6133
6134               inst.operands[i].reg = val;
6135               inst.operands[i].isreg = 1;
6136               inst.operands[i++].present = 1;
6137
6138               if (skip_past_comma (&ptr) == FAIL)
6139                 goto wanted_comma;
6140
6141               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6142                 goto wanted_arm;
6143
6144               inst.operands[i].reg = val;
6145               inst.operands[i].isreg = 1;
6146               inst.operands[i].present = 1;
6147             }
6148         }
6149       else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
6150           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
6151              Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
6152              Case 10: VMOV.F32 <Sd>, #<imm>
6153              Case 11: VMOV.F64 <Dd>, #<imm>  */
6154         inst.operands[i].immisfloat = 1;
6155       else if (parse_big_immediate (&ptr, i) == SUCCESS)
6156           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
6157              Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
6158         ;
6159       else
6160         {
6161           first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
6162           return FAIL;
6163         }
6164     }
6165   else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6166     {
6167       /* Cases 6, 7.  */
6168       inst.operands[i].reg = val;
6169       inst.operands[i].isreg = 1;
6170       inst.operands[i++].present = 1;
6171
6172       if (skip_past_comma (&ptr) == FAIL)
6173         goto wanted_comma;
6174
6175       if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
6176         {
6177           /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
6178           inst.operands[i].reg = val;
6179           inst.operands[i].isscalar = 1;
6180           inst.operands[i].present = 1;
6181           inst.operands[i].vectype = optype;
6182         }
6183       else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6184         {
6185           /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
6186           inst.operands[i].reg = val;
6187           inst.operands[i].isreg = 1;
6188           inst.operands[i++].present = 1;
6189
6190           if (skip_past_comma (&ptr) == FAIL)
6191             goto wanted_comma;
6192
6193           if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
6194               == FAIL)
6195             {
6196               first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
6197               return FAIL;
6198             }
6199
6200           inst.operands[i].reg = val;
6201           inst.operands[i].isreg = 1;
6202           inst.operands[i].isvec = 1;
6203           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6204           inst.operands[i].vectype = optype;
6205           inst.operands[i].present = 1;
6206
6207           if (rtype == REG_TYPE_VFS)
6208             {
6209               /* Case 14.  */
6210               i++;
6211               if (skip_past_comma (&ptr) == FAIL)
6212                 goto wanted_comma;
6213               if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
6214                                               &optype)) == FAIL)
6215                 {
6216                   first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
6217                   return FAIL;
6218                 }
6219               inst.operands[i].reg = val;
6220               inst.operands[i].isreg = 1;
6221               inst.operands[i].isvec = 1;
6222               inst.operands[i].issingle = 1;
6223               inst.operands[i].vectype = optype;
6224               inst.operands[i].present = 1;
6225             }
6226         }
6227       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
6228                != FAIL)
6229         {
6230           /* Case 13.  */
6231           inst.operands[i].reg = val;
6232           inst.operands[i].isreg = 1;
6233           inst.operands[i].isvec = 1;
6234           inst.operands[i].issingle = 1;
6235           inst.operands[i].vectype = optype;
6236           inst.operands[i].present = 1;
6237         }
6238     }
6239   else
6240     {
6241       first_error (_("parse error"));
6242       return FAIL;
6243     }
6244
6245   /* Successfully parsed the operands. Update args.  */
6246   *which_operand = i;
6247   *str = ptr;
6248   return SUCCESS;
6249
6250  wanted_comma:
6251   first_error (_("expected comma"));
6252   return FAIL;
6253
6254  wanted_arm:
6255   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
6256   return FAIL;
6257 }
6258
6259 /* Use this macro when the operand constraints are different
6260    for ARM and THUMB (e.g. ldrd).  */
6261 #define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6262         ((arm_operand) | ((thumb_operand) << 16))
6263
6264 /* Matcher codes for parse_operands.  */
6265 enum operand_parse_code
6266 {
6267   OP_stop,      /* end of line */
6268
6269   OP_RR,        /* ARM register */
6270   OP_RRnpc,     /* ARM register, not r15 */
6271   OP_RRnpcsp,   /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
6272   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
6273   OP_RRnpctw,   /* ARM register, not r15 in Thumb-state or with writeback,
6274                    optional trailing ! */
6275   OP_RRw,       /* ARM register, not r15, optional trailing ! */
6276   OP_RCP,       /* Coprocessor number */
6277   OP_RCN,       /* Coprocessor register */
6278   OP_RF,        /* FPA register */
6279   OP_RVS,       /* VFP single precision register */
6280   OP_RVD,       /* VFP double precision register (0..15) */
6281   OP_RND,       /* Neon double precision register (0..31) */
6282   OP_RNQ,       /* Neon quad precision register */
6283   OP_RVSD,      /* VFP single or double precision register */
6284   OP_RNDQ,      /* Neon double or quad precision register */
6285   OP_RNSDQ,     /* Neon single, double or quad precision register */
6286   OP_RNSC,      /* Neon scalar D[X] */
6287   OP_RVC,       /* VFP control register */
6288   OP_RMF,       /* Maverick F register */
6289   OP_RMD,       /* Maverick D register */
6290   OP_RMFX,      /* Maverick FX register */
6291   OP_RMDX,      /* Maverick DX register */
6292   OP_RMAX,      /* Maverick AX register */
6293   OP_RMDS,      /* Maverick DSPSC register */
6294   OP_RIWR,      /* iWMMXt wR register */
6295   OP_RIWC,      /* iWMMXt wC register */
6296   OP_RIWG,      /* iWMMXt wCG register */
6297   OP_RXA,       /* XScale accumulator register */
6298
6299   OP_REGLST,    /* ARM register list */
6300   OP_VRSLST,    /* VFP single-precision register list */
6301   OP_VRDLST,    /* VFP double-precision register list */
6302   OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
6303   OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
6304   OP_NSTRLST,   /* Neon element/structure list */
6305
6306   OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
6307   OP_RVSD_I0,   /* VFP S or D reg, or immediate zero.  */
6308   OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
6309   OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
6310   OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
6311   OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
6312   OP_VMOV,      /* Neon VMOV operands.  */
6313   OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN.  */
6314   OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
6315   OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
6316
6317   OP_I0,        /* immediate zero */
6318   OP_I7,        /* immediate value 0 .. 7 */
6319   OP_I15,       /*                 0 .. 15 */
6320   OP_I16,       /*                 1 .. 16 */
6321   OP_I16z,      /*                 0 .. 16 */
6322   OP_I31,       /*                 0 .. 31 */
6323   OP_I31w,      /*                 0 .. 31, optional trailing ! */
6324   OP_I32,       /*                 1 .. 32 */
6325   OP_I32z,      /*                 0 .. 32 */
6326   OP_I63,       /*                 0 .. 63 */
6327   OP_I63s,      /*               -64 .. 63 */
6328   OP_I64,       /*                 1 .. 64 */
6329   OP_I64z,      /*                 0 .. 64 */
6330   OP_I255,      /*                 0 .. 255 */
6331
6332   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
6333   OP_I7b,       /*                             0 .. 7 */
6334   OP_I15b,      /*                             0 .. 15 */
6335   OP_I31b,      /*                             0 .. 31 */
6336
6337   OP_SH,        /* shifter operand */
6338   OP_SHG,       /* shifter operand with possible group relocation */
6339   OP_ADDR,      /* Memory address expression (any mode) */
6340   OP_ADDRGLDR,  /* Mem addr expr (any mode) with possible LDR group reloc */
6341   OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6342   OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
6343   OP_EXP,       /* arbitrary expression */
6344   OP_EXPi,      /* same, with optional immediate prefix */
6345   OP_EXPr,      /* same, with optional relocation suffix */
6346   OP_HALF,      /* 0 .. 65535 or low/high reloc.  */
6347
6348   OP_CPSF,      /* CPS flags */
6349   OP_ENDI,      /* Endianness specifier */
6350   OP_wPSR,      /* CPSR/SPSR/APSR mask for msr (writing).  */
6351   OP_rPSR,      /* CPSR/SPSR/APSR mask for msr (reading).  */
6352   OP_COND,      /* conditional code */
6353   OP_TB,        /* Table branch.  */
6354
6355   OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
6356
6357   OP_RRnpc_I0,  /* ARM register or literal 0 */
6358   OP_RR_EXr,    /* ARM register or expression with opt. reloc suff. */
6359   OP_RR_EXi,    /* ARM register or expression with imm prefix */
6360   OP_RF_IF,     /* FPA register or immediate */
6361   OP_RIWR_RIWC, /* iWMMXt R or C reg */
6362   OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
6363
6364   /* Optional operands.  */
6365   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
6366   OP_oI31b,      /*                             0 .. 31 */
6367   OP_oI32b,      /*                             1 .. 32 */
6368   OP_oI32z,      /*                             0 .. 32 */
6369   OP_oIffffb,    /*                             0 .. 65535 */
6370   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
6371
6372   OP_oRR,        /* ARM register */
6373   OP_oRRnpc,     /* ARM register, not the PC */
6374   OP_oRRnpcsp,   /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
6375   OP_oRRw,       /* ARM register, not r15, optional trailing ! */
6376   OP_oRND,       /* Optional Neon double precision register */
6377   OP_oRNQ,       /* Optional Neon quad precision register */
6378   OP_oRNDQ,      /* Optional Neon double or quad precision register */
6379   OP_oRNSDQ,     /* Optional single, double or quad precision vector register */
6380   OP_oSHll,      /* LSL immediate */
6381   OP_oSHar,      /* ASR immediate */
6382   OP_oSHllar,    /* LSL or ASR immediate */
6383   OP_oROR,       /* ROR 0/8/16/24 */
6384   OP_oBARRIER_I15, /* Option argument for a barrier instruction.  */
6385
6386   /* Some pre-defined mixed (ARM/THUMB) operands.  */
6387   OP_RR_npcsp           = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
6388   OP_RRnpc_npcsp        = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
6389   OP_oRRnpc_npcsp       = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
6390
6391   OP_FIRST_OPTIONAL = OP_oI7b
6392 };
6393
6394 /* Generic instruction operand parser.  This does no encoding and no
6395    semantic validation; it merely squirrels values away in the inst
6396    structure.  Returns SUCCESS or FAIL depending on whether the
6397    specified grammar matched.  */
6398 static int
6399 parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
6400 {
6401   unsigned const int *upat = pattern;
6402   char *backtrack_pos = 0;
6403   const char *backtrack_error = 0;
6404   int i, val = 0, backtrack_index = 0;
6405   enum arm_reg_type rtype;
6406   parse_operand_result result;
6407   unsigned int op_parse_code;
6408
6409 #define po_char_or_fail(chr)                    \
6410   do                                            \
6411     {                                           \
6412       if (skip_past_char (&str, chr) == FAIL)   \
6413         goto bad_args;                          \
6414     }                                           \
6415   while (0)
6416
6417 #define po_reg_or_fail(regtype)                                 \
6418   do                                                            \
6419     {                                                           \
6420       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6421                                  & inst.operands[i].vectype);   \
6422       if (val == FAIL)                                          \
6423         {                                                       \
6424           first_error (_(reg_expected_msgs[regtype]));          \
6425           goto failure;                                         \
6426         }                                                       \
6427       inst.operands[i].reg = val;                               \
6428       inst.operands[i].isreg = 1;                               \
6429       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6430       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6431       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6432                              || rtype == REG_TYPE_VFD           \
6433                              || rtype == REG_TYPE_NQ);          \
6434     }                                                           \
6435   while (0)
6436
6437 #define po_reg_or_goto(regtype, label)                          \
6438   do                                                            \
6439     {                                                           \
6440       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6441                                  & inst.operands[i].vectype);   \
6442       if (val == FAIL)                                          \
6443         goto label;                                             \
6444                                                                 \
6445       inst.operands[i].reg = val;                               \
6446       inst.operands[i].isreg = 1;                               \
6447       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6448       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6449       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6450                              || rtype == REG_TYPE_VFD           \
6451                              || rtype == REG_TYPE_NQ);          \
6452     }                                                           \
6453   while (0)
6454
6455 #define po_imm_or_fail(min, max, popt)                          \
6456   do                                                            \
6457     {                                                           \
6458       if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
6459         goto failure;                                           \
6460       inst.operands[i].imm = val;                               \
6461     }                                                           \
6462   while (0)
6463
6464 #define po_scalar_or_goto(elsz, label)                                  \
6465   do                                                                    \
6466     {                                                                   \
6467       val = parse_scalar (& str, elsz, & inst.operands[i].vectype);     \
6468       if (val == FAIL)                                                  \
6469         goto label;                                                     \
6470       inst.operands[i].reg = val;                                       \
6471       inst.operands[i].isscalar = 1;                                    \
6472     }                                                                   \
6473   while (0)
6474
6475 #define po_misc_or_fail(expr)                   \
6476   do                                            \
6477     {                                           \
6478       if (expr)                                 \
6479         goto failure;                           \
6480     }                                           \
6481   while (0)
6482
6483 #define po_misc_or_fail_no_backtrack(expr)              \
6484   do                                                    \
6485     {                                                   \
6486       result = expr;                                    \
6487       if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)    \
6488         backtrack_pos = 0;                              \
6489       if (result != PARSE_OPERAND_SUCCESS)              \
6490         goto failure;                                   \
6491     }                                                   \
6492   while (0)
6493
6494 #define po_barrier_or_imm(str)                             \
6495   do                                                       \
6496     {                                                      \
6497       val = parse_barrier (&str);                          \
6498       if (val == FAIL && ! ISALPHA (*str))                 \
6499         goto immediate;                                    \
6500       if (val == FAIL                                      \
6501           /* ISB can only take SY as an option.  */        \
6502           || ((inst.instruction & 0xf0) == 0x60            \
6503                && val != 0xf))                             \
6504         {                                                  \
6505            inst.error = _("invalid barrier type");         \
6506            backtrack_pos = 0;                              \
6507            goto failure;                                   \
6508         }                                                  \
6509     }                                                      \
6510   while (0)
6511
6512   skip_whitespace (str);
6513
6514   for (i = 0; upat[i] != OP_stop; i++)
6515     {
6516       op_parse_code = upat[i];
6517       if (op_parse_code >= 1<<16)
6518         op_parse_code = thumb ? (op_parse_code >> 16)
6519                                 : (op_parse_code & ((1<<16)-1));
6520
6521       if (op_parse_code >= OP_FIRST_OPTIONAL)
6522         {
6523           /* Remember where we are in case we need to backtrack.  */
6524           gas_assert (!backtrack_pos);
6525           backtrack_pos = str;
6526           backtrack_error = inst.error;
6527           backtrack_index = i;
6528         }
6529
6530       if (i > 0 && (i > 1 || inst.operands[0].present))
6531         po_char_or_fail (',');
6532
6533       switch (op_parse_code)
6534         {
6535           /* Registers */
6536         case OP_oRRnpc:
6537         case OP_oRRnpcsp:
6538         case OP_RRnpc:
6539         case OP_RRnpcsp:
6540         case OP_oRR:
6541         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
6542         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
6543         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
6544         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
6545         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
6546         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
6547         case OP_oRND:
6548         case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);     break;
6549         case OP_RVC:
6550           po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6551           break;
6552           /* Also accept generic coprocessor regs for unknown registers.  */
6553           coproc_reg:
6554           po_reg_or_fail (REG_TYPE_CN);
6555           break;
6556         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
6557         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
6558         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
6559         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
6560         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
6561         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
6562         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
6563         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
6564         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
6565         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
6566         case OP_oRNQ:
6567         case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
6568         case OP_oRNDQ:
6569         case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
6570         case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
6571         case OP_oRNSDQ:
6572         case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
6573
6574         /* Neon scalar. Using an element size of 8 means that some invalid
6575            scalars are accepted here, so deal with those in later code.  */
6576         case OP_RNSC:  po_scalar_or_goto (8, failure);    break;
6577
6578         case OP_RNDQ_I0:
6579           {
6580             po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6581             break;
6582             try_imm0:
6583             po_imm_or_fail (0, 0, TRUE);
6584           }
6585           break;
6586
6587         case OP_RVSD_I0:
6588           po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6589           break;
6590
6591         case OP_RR_RNSC:
6592           {
6593             po_scalar_or_goto (8, try_rr);
6594             break;
6595             try_rr:
6596             po_reg_or_fail (REG_TYPE_RN);
6597           }
6598           break;
6599
6600         case OP_RNSDQ_RNSC:
6601           {
6602             po_scalar_or_goto (8, try_nsdq);
6603             break;
6604             try_nsdq:
6605             po_reg_or_fail (REG_TYPE_NSDQ);
6606           }
6607           break;
6608
6609         case OP_RNDQ_RNSC:
6610           {
6611             po_scalar_or_goto (8, try_ndq);
6612             break;
6613             try_ndq:
6614             po_reg_or_fail (REG_TYPE_NDQ);
6615           }
6616           break;
6617
6618         case OP_RND_RNSC:
6619           {
6620             po_scalar_or_goto (8, try_vfd);
6621             break;
6622             try_vfd:
6623             po_reg_or_fail (REG_TYPE_VFD);
6624           }
6625           break;
6626
6627         case OP_VMOV:
6628           /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6629              not careful then bad things might happen.  */
6630           po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6631           break;
6632
6633         case OP_RNDQ_Ibig:
6634           {
6635             po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
6636             break;
6637             try_immbig:
6638             /* There's a possibility of getting a 64-bit immediate here, so
6639                we need special handling.  */
6640             if (parse_big_immediate (&str, i) == FAIL)
6641               {
6642                 inst.error = _("immediate value is out of range");
6643                 goto failure;
6644               }
6645           }
6646           break;
6647
6648         case OP_RNDQ_I63b:
6649           {
6650             po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6651             break;
6652             try_shimm:
6653             po_imm_or_fail (0, 63, TRUE);
6654           }
6655           break;
6656
6657         case OP_RRnpcb:
6658           po_char_or_fail ('[');
6659           po_reg_or_fail  (REG_TYPE_RN);
6660           po_char_or_fail (']');
6661           break;
6662
6663         case OP_RRnpctw:
6664         case OP_RRw:
6665         case OP_oRRw:
6666           po_reg_or_fail (REG_TYPE_RN);
6667           if (skip_past_char (&str, '!') == SUCCESS)
6668             inst.operands[i].writeback = 1;
6669           break;
6670
6671           /* Immediates */
6672         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
6673         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
6674         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
6675         case OP_I16z:    po_imm_or_fail (  0,     16, FALSE);   break;
6676         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
6677         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
6678         case OP_I32z:    po_imm_or_fail (  0,     32, FALSE);   break;
6679         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
6680         case OP_I63:     po_imm_or_fail (  0,     63, FALSE);   break;
6681         case OP_I64:     po_imm_or_fail (  1,     64, FALSE);   break;
6682         case OP_I64z:    po_imm_or_fail (  0,     64, FALSE);   break;
6683         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
6684
6685         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
6686         case OP_oI7b:
6687         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
6688         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
6689         case OP_oI31b:
6690         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
6691         case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
6692         case OP_oI32z:   po_imm_or_fail (  0,     32, TRUE);    break;
6693         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
6694
6695           /* Immediate variants */
6696         case OP_oI255c:
6697           po_char_or_fail ('{');
6698           po_imm_or_fail (0, 255, TRUE);
6699           po_char_or_fail ('}');
6700           break;
6701
6702         case OP_I31w:
6703           /* The expression parser chokes on a trailing !, so we have
6704              to find it first and zap it.  */
6705           {
6706             char *s = str;
6707             while (*s && *s != ',')
6708               s++;
6709             if (s[-1] == '!')
6710               {
6711                 s[-1] = '\0';
6712                 inst.operands[i].writeback = 1;
6713               }
6714             po_imm_or_fail (0, 31, TRUE);
6715             if (str == s - 1)
6716               str = s;
6717           }
6718           break;
6719
6720           /* Expressions */
6721         case OP_EXPi:   EXPi:
6722           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6723                                               GE_OPT_PREFIX));
6724           break;
6725
6726         case OP_EXP:
6727           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6728                                               GE_NO_PREFIX));
6729           break;
6730
6731         case OP_EXPr:   EXPr:
6732           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6733                                               GE_NO_PREFIX));
6734           if (inst.reloc.exp.X_op == O_symbol)
6735             {
6736               val = parse_reloc (&str);
6737               if (val == -1)
6738                 {
6739                   inst.error = _("unrecognized relocation suffix");
6740                   goto failure;
6741                 }
6742               else if (val != BFD_RELOC_UNUSED)
6743                 {
6744                   inst.operands[i].imm = val;
6745                   inst.operands[i].hasreloc = 1;
6746                 }
6747             }
6748           break;
6749
6750           /* Operand for MOVW or MOVT.  */
6751         case OP_HALF:
6752           po_misc_or_fail (parse_half (&str));
6753           break;
6754
6755           /* Register or expression.  */
6756         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6757         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
6758
6759           /* Register or immediate.  */
6760         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
6761         I0:               po_imm_or_fail (0, 0, FALSE);       break;
6762
6763         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
6764         IF:
6765           if (!is_immediate_prefix (*str))
6766             goto bad_args;
6767           str++;
6768           val = parse_fpa_immediate (&str);
6769           if (val == FAIL)
6770             goto failure;
6771           /* FPA immediates are encoded as registers 8-15.
6772              parse_fpa_immediate has already applied the offset.  */
6773           inst.operands[i].reg = val;
6774           inst.operands[i].isreg = 1;
6775           break;
6776
6777         case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6778         I32z:             po_imm_or_fail (0, 32, FALSE);          break;
6779
6780           /* Two kinds of register.  */
6781         case OP_RIWR_RIWC:
6782           {
6783             struct reg_entry *rege = arm_reg_parse_multi (&str);
6784             if (!rege
6785                 || (rege->type != REG_TYPE_MMXWR
6786                     && rege->type != REG_TYPE_MMXWC
6787                     && rege->type != REG_TYPE_MMXWCG))
6788               {
6789                 inst.error = _("iWMMXt data or control register expected");
6790                 goto failure;
6791               }
6792             inst.operands[i].reg = rege->number;
6793             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6794           }
6795           break;
6796
6797         case OP_RIWC_RIWG:
6798           {
6799             struct reg_entry *rege = arm_reg_parse_multi (&str);
6800             if (!rege
6801                 || (rege->type != REG_TYPE_MMXWC
6802                     && rege->type != REG_TYPE_MMXWCG))
6803               {
6804                 inst.error = _("iWMMXt control register expected");
6805                 goto failure;
6806               }
6807             inst.operands[i].reg = rege->number;
6808             inst.operands[i].isreg = 1;
6809           }
6810           break;
6811
6812           /* Misc */
6813         case OP_CPSF:    val = parse_cps_flags (&str);          break;
6814         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
6815         case OP_oROR:    val = parse_ror (&str);                break;
6816         case OP_COND:    val = parse_cond (&str);               break;
6817         case OP_oBARRIER_I15:
6818           po_barrier_or_imm (str); break;
6819           immediate:
6820           if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
6821             goto failure;
6822           break;
6823
6824         case OP_wPSR:
6825         case OP_rPSR:
6826           po_reg_or_goto (REG_TYPE_RNB, try_psr);
6827           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
6828             {
6829               inst.error = _("Banked registers are not available with this "
6830                              "architecture.");
6831               goto failure;
6832             }
6833           break;
6834           try_psr:
6835           val = parse_psr (&str, op_parse_code == OP_wPSR);
6836           break;
6837
6838         case OP_APSR_RR:
6839           po_reg_or_goto (REG_TYPE_RN, try_apsr);
6840           break;
6841           try_apsr:
6842           /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6843              instruction).  */
6844           if (strncasecmp (str, "APSR_", 5) == 0)
6845             {
6846               unsigned found = 0;
6847               str += 5;
6848               while (found < 15)
6849                 switch (*str++)
6850                   {
6851                   case 'c': found = (found & 1) ? 16 : found | 1; break;
6852                   case 'n': found = (found & 2) ? 16 : found | 2; break;
6853                   case 'z': found = (found & 4) ? 16 : found | 4; break;
6854                   case 'v': found = (found & 8) ? 16 : found | 8; break;
6855                   default: found = 16;
6856                   }
6857               if (found != 15)
6858                 goto failure;
6859               inst.operands[i].isvec = 1;
6860               /* APSR_nzcv is encoded in instructions as if it were the REG_PC.  */
6861               inst.operands[i].reg = REG_PC;
6862             }
6863           else
6864             goto failure;
6865           break;
6866
6867         case OP_TB:
6868           po_misc_or_fail (parse_tb (&str));
6869           break;
6870
6871           /* Register lists.  */
6872         case OP_REGLST:
6873           val = parse_reg_list (&str);
6874           if (*str == '^')
6875             {
6876               inst.operands[1].writeback = 1;
6877               str++;
6878             }
6879           break;
6880
6881         case OP_VRSLST:
6882           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
6883           break;
6884
6885         case OP_VRDLST:
6886           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
6887           break;
6888
6889         case OP_VRSDLST:
6890           /* Allow Q registers too.  */
6891           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6892                                     REGLIST_NEON_D);
6893           if (val == FAIL)
6894             {
6895               inst.error = NULL;
6896               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6897                                         REGLIST_VFP_S);
6898               inst.operands[i].issingle = 1;
6899             }
6900           break;
6901
6902         case OP_NRDLST:
6903           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6904                                     REGLIST_NEON_D);
6905           break;
6906
6907         case OP_NSTRLST:
6908           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6909                                            &inst.operands[i].vectype);
6910           break;
6911
6912           /* Addressing modes */
6913         case OP_ADDR:
6914           po_misc_or_fail (parse_address (&str, i));
6915           break;
6916
6917         case OP_ADDRGLDR:
6918           po_misc_or_fail_no_backtrack (
6919             parse_address_group_reloc (&str, i, GROUP_LDR));
6920           break;
6921
6922         case OP_ADDRGLDRS:
6923           po_misc_or_fail_no_backtrack (
6924             parse_address_group_reloc (&str, i, GROUP_LDRS));
6925           break;
6926
6927         case OP_ADDRGLDC:
6928           po_misc_or_fail_no_backtrack (
6929             parse_address_group_reloc (&str, i, GROUP_LDC));
6930           break;
6931
6932         case OP_SH:
6933           po_misc_or_fail (parse_shifter_operand (&str, i));
6934           break;
6935
6936         case OP_SHG:
6937           po_misc_or_fail_no_backtrack (
6938             parse_shifter_operand_group_reloc (&str, i));
6939           break;
6940
6941         case OP_oSHll:
6942           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6943           break;
6944
6945         case OP_oSHar:
6946           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6947           break;
6948
6949         case OP_oSHllar:
6950           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6951           break;
6952
6953         default:
6954           as_fatal (_("unhandled operand code %d"), op_parse_code);
6955         }
6956
6957       /* Various value-based sanity checks and shared operations.  We
6958          do not signal immediate failures for the register constraints;
6959          this allows a syntax error to take precedence.  */
6960       switch (op_parse_code)
6961         {
6962         case OP_oRRnpc:
6963         case OP_RRnpc:
6964         case OP_RRnpcb:
6965         case OP_RRw:
6966         case OP_oRRw:
6967         case OP_RRnpc_I0:
6968           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6969             inst.error = BAD_PC;
6970           break;
6971
6972         case OP_oRRnpcsp:
6973         case OP_RRnpcsp:
6974           if (inst.operands[i].isreg)
6975             {
6976               if (inst.operands[i].reg == REG_PC)
6977                 inst.error = BAD_PC;
6978               else if (inst.operands[i].reg == REG_SP)
6979                 inst.error = BAD_SP;
6980             }
6981           break;
6982
6983         case OP_RRnpctw:
6984           if (inst.operands[i].isreg
6985               && inst.operands[i].reg == REG_PC
6986               && (inst.operands[i].writeback || thumb))
6987             inst.error = BAD_PC;
6988           break;
6989
6990         case OP_CPSF:
6991         case OP_ENDI:
6992         case OP_oROR:
6993         case OP_wPSR:
6994         case OP_rPSR:
6995         case OP_COND:
6996         case OP_oBARRIER_I15:
6997         case OP_REGLST:
6998         case OP_VRSLST:
6999         case OP_VRDLST:
7000         case OP_VRSDLST:
7001         case OP_NRDLST:
7002         case OP_NSTRLST:
7003           if (val == FAIL)
7004             goto failure;
7005           inst.operands[i].imm = val;
7006           break;
7007
7008         default:
7009           break;
7010         }
7011
7012       /* If we get here, this operand was successfully parsed.  */
7013       inst.operands[i].present = 1;
7014       continue;
7015
7016     bad_args:
7017       inst.error = BAD_ARGS;
7018
7019     failure:
7020       if (!backtrack_pos)
7021         {
7022           /* The parse routine should already have set inst.error, but set a
7023              default here just in case.  */
7024           if (!inst.error)
7025             inst.error = _("syntax error");
7026           return FAIL;
7027         }
7028
7029       /* Do not backtrack over a trailing optional argument that
7030          absorbed some text.  We will only fail again, with the
7031          'garbage following instruction' error message, which is
7032          probably less helpful than the current one.  */
7033       if (backtrack_index == i && backtrack_pos != str
7034           && upat[i+1] == OP_stop)
7035         {
7036           if (!inst.error)
7037             inst.error = _("syntax error");
7038           return FAIL;
7039         }
7040
7041       /* Try again, skipping the optional argument at backtrack_pos.  */
7042       str = backtrack_pos;
7043       inst.error = backtrack_error;
7044       inst.operands[backtrack_index].present = 0;
7045       i = backtrack_index;
7046       backtrack_pos = 0;
7047     }
7048
7049   /* Check that we have parsed all the arguments.  */
7050   if (*str != '\0' && !inst.error)
7051     inst.error = _("garbage following instruction");
7052
7053   return inst.error ? FAIL : SUCCESS;
7054 }
7055
7056 #undef po_char_or_fail
7057 #undef po_reg_or_fail
7058 #undef po_reg_or_goto
7059 #undef po_imm_or_fail
7060 #undef po_scalar_or_fail
7061 #undef po_barrier_or_imm
7062
7063 /* Shorthand macro for instruction encoding functions issuing errors.  */
7064 #define constraint(expr, err)                   \
7065   do                                            \
7066     {                                           \
7067       if (expr)                                 \
7068         {                                       \
7069           inst.error = err;                     \
7070           return;                               \
7071         }                                       \
7072     }                                           \
7073   while (0)
7074
7075 /* Reject "bad registers" for Thumb-2 instructions.  Many Thumb-2
7076    instructions are unpredictable if these registers are used.  This
7077    is the BadReg predicate in ARM's Thumb-2 documentation.  */
7078 #define reject_bad_reg(reg)                             \
7079   do                                                    \
7080    if (reg == REG_SP || reg == REG_PC)                  \
7081      {                                                  \
7082        inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC;  \
7083        return;                                          \
7084      }                                                  \
7085   while (0)
7086
7087 /* If REG is R13 (the stack pointer), warn that its use is
7088    deprecated.  */
7089 #define warn_deprecated_sp(reg)                 \
7090   do                                            \
7091     if (warn_on_deprecated && reg == REG_SP)    \
7092        as_warn (_("use of r13 is deprecated")); \
7093   while (0)
7094
7095 /* Functions for operand encoding.  ARM, then Thumb.  */
7096
7097 #define rotate_left(v, n) (v << n | v >> (32 - n))
7098
7099 /* If VAL can be encoded in the immediate field of an ARM instruction,
7100    return the encoded form.  Otherwise, return FAIL.  */
7101
7102 static unsigned int
7103 encode_arm_immediate (unsigned int val)
7104 {
7105   unsigned int a, i;
7106
7107   for (i = 0; i < 32; i += 2)
7108     if ((a = rotate_left (val, i)) <= 0xff)
7109       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
7110
7111   return FAIL;
7112 }
7113
7114 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
7115    return the encoded form.  Otherwise, return FAIL.  */
7116 static unsigned int
7117 encode_thumb32_immediate (unsigned int val)
7118 {
7119   unsigned int a, i;
7120
7121   if (val <= 0xff)
7122     return val;
7123
7124   for (i = 1; i <= 24; i++)
7125     {
7126       a = val >> i;
7127       if ((val & ~(0xff << i)) == 0)
7128         return ((val >> i) & 0x7f) | ((32 - i) << 7);
7129     }
7130
7131   a = val & 0xff;
7132   if (val == ((a << 16) | a))
7133     return 0x100 | a;
7134   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
7135     return 0x300 | a;
7136
7137   a = val & 0xff00;
7138   if (val == ((a << 16) | a))
7139     return 0x200 | (a >> 8);
7140
7141   return FAIL;
7142 }
7143 /* Encode a VFP SP or DP register number into inst.instruction.  */
7144
7145 static void
7146 encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
7147 {
7148   if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
7149       && reg > 15)
7150     {
7151       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
7152         {
7153           if (thumb_mode)
7154             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
7155                                     fpu_vfp_ext_d32);
7156           else
7157             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
7158                                     fpu_vfp_ext_d32);
7159         }
7160       else
7161         {
7162           first_error (_("D register out of range for selected VFP version"));
7163           return;
7164         }
7165     }
7166
7167   switch (pos)
7168     {
7169     case VFP_REG_Sd:
7170       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
7171       break;
7172
7173     case VFP_REG_Sn:
7174       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
7175       break;
7176
7177     case VFP_REG_Sm:
7178       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
7179       break;
7180
7181     case VFP_REG_Dd:
7182       inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
7183       break;
7184
7185     case VFP_REG_Dn:
7186       inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
7187       break;
7188
7189     case VFP_REG_Dm:
7190       inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
7191       break;
7192
7193     default:
7194       abort ();
7195     }
7196 }
7197
7198 /* Encode a <shift> in an ARM-format instruction.  The immediate,
7199    if any, is handled by md_apply_fix.   */
7200 static void
7201 encode_arm_shift (int i)
7202 {
7203   if (inst.operands[i].shift_kind == SHIFT_RRX)
7204     inst.instruction |= SHIFT_ROR << 5;
7205   else
7206     {
7207       inst.instruction |= inst.operands[i].shift_kind << 5;
7208       if (inst.operands[i].immisreg)
7209         {
7210           inst.instruction |= SHIFT_BY_REG;
7211           inst.instruction |= inst.operands[i].imm << 8;
7212         }
7213       else
7214         inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7215     }
7216 }
7217
7218 static void
7219 encode_arm_shifter_operand (int i)
7220 {
7221   if (inst.operands[i].isreg)
7222     {
7223       inst.instruction |= inst.operands[i].reg;
7224       encode_arm_shift (i);
7225     }
7226   else
7227     {
7228       inst.instruction |= INST_IMMEDIATE;
7229       if (inst.reloc.type != BFD_RELOC_ARM_IMMEDIATE)
7230         inst.instruction |= inst.operands[i].imm;
7231     }
7232 }
7233
7234 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
7235 static void
7236 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
7237 {
7238   /* PR 14260:
7239      Generate an error if the operand is not a register.  */
7240   constraint (!inst.operands[i].isreg,
7241               _("Instruction does not support =N addresses"));
7242
7243   inst.instruction |= inst.operands[i].reg << 16;
7244
7245   if (inst.operands[i].preind)
7246     {
7247       if (is_t)
7248         {
7249           inst.error = _("instruction does not accept preindexed addressing");
7250           return;
7251         }
7252       inst.instruction |= PRE_INDEX;
7253       if (inst.operands[i].writeback)
7254         inst.instruction |= WRITE_BACK;
7255
7256     }
7257   else if (inst.operands[i].postind)
7258     {
7259       gas_assert (inst.operands[i].writeback);
7260       if (is_t)
7261         inst.instruction |= WRITE_BACK;
7262     }
7263   else /* unindexed - only for coprocessor */
7264     {
7265       inst.error = _("instruction does not accept unindexed addressing");
7266       return;
7267     }
7268
7269   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
7270       && (((inst.instruction & 0x000f0000) >> 16)
7271           == ((inst.instruction & 0x0000f000) >> 12)))
7272     as_warn ((inst.instruction & LOAD_BIT)
7273              ? _("destination register same as write-back base")
7274              : _("source register same as write-back base"));
7275 }
7276
7277 /* inst.operands[i] was set up by parse_address.  Encode it into an
7278    ARM-format mode 2 load or store instruction.  If is_t is true,
7279    reject forms that cannot be used with a T instruction (i.e. not
7280    post-indexed).  */
7281 static void
7282 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
7283 {
7284   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
7285
7286   encode_arm_addr_mode_common (i, is_t);
7287
7288   if (inst.operands[i].immisreg)
7289     {
7290       constraint ((inst.operands[i].imm == REG_PC
7291                    || (is_pc && inst.operands[i].writeback)),
7292                   BAD_PC_ADDRESSING);
7293       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
7294       inst.instruction |= inst.operands[i].imm;
7295       if (!inst.operands[i].negative)
7296         inst.instruction |= INDEX_UP;
7297       if (inst.operands[i].shifted)
7298         {
7299           if (inst.operands[i].shift_kind == SHIFT_RRX)
7300             inst.instruction |= SHIFT_ROR << 5;
7301           else
7302             {
7303               inst.instruction |= inst.operands[i].shift_kind << 5;
7304               inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7305             }
7306         }
7307     }
7308   else /* immediate offset in inst.reloc */
7309     {
7310       if (is_pc && !inst.reloc.pc_rel)
7311         {
7312           const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
7313
7314           /* If is_t is TRUE, it's called from do_ldstt.  ldrt/strt
7315              cannot use PC in addressing.
7316              PC cannot be used in writeback addressing, either.  */
7317           constraint ((is_t || inst.operands[i].writeback),
7318                       BAD_PC_ADDRESSING);
7319
7320           /* Use of PC in str is deprecated for ARMv7.  */
7321           if (warn_on_deprecated
7322               && !is_load
7323               && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
7324             as_warn (_("use of PC in this instruction is deprecated"));
7325         }
7326
7327       if (inst.reloc.type == BFD_RELOC_UNUSED)
7328         {
7329           /* Prefer + for zero encoded value.  */
7330           if (!inst.operands[i].negative)
7331             inst.instruction |= INDEX_UP;
7332           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
7333         }
7334     }
7335 }
7336
7337 /* inst.operands[i] was set up by parse_address.  Encode it into an
7338    ARM-format mode 3 load or store instruction.  Reject forms that
7339    cannot be used with such instructions.  If is_t is true, reject
7340    forms that cannot be used with a T instruction (i.e. not
7341    post-indexed).  */
7342 static void
7343 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
7344 {
7345   if (inst.operands[i].immisreg && inst.operands[i].shifted)
7346     {
7347       inst.error = _("instruction does not accept scaled register index");
7348       return;
7349     }
7350
7351   encode_arm_addr_mode_common (i, is_t);
7352
7353   if (inst.operands[i].immisreg)
7354     {
7355       constraint ((inst.operands[i].imm == REG_PC
7356                    || (is_t && inst.operands[i].reg == REG_PC)),
7357                   BAD_PC_ADDRESSING);
7358       constraint (inst.operands[i].reg == REG_PC && inst.operands[i].writeback,
7359                   BAD_PC_WRITEBACK);
7360       inst.instruction |= inst.operands[i].imm;
7361       if (!inst.operands[i].negative)
7362         inst.instruction |= INDEX_UP;
7363     }
7364   else /* immediate offset in inst.reloc */
7365     {
7366       constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
7367                    && inst.operands[i].writeback),
7368                   BAD_PC_WRITEBACK);
7369       inst.instruction |= HWOFFSET_IMM;
7370       if (inst.reloc.type == BFD_RELOC_UNUSED)
7371         {
7372           /* Prefer + for zero encoded value.  */
7373           if (!inst.operands[i].negative)
7374             inst.instruction |= INDEX_UP;
7375
7376           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
7377         }
7378     }
7379 }
7380
7381 /* inst.operands[i] was set up by parse_address.  Encode it into an
7382    ARM-format instruction.  Reject all forms which cannot be encoded
7383    into a coprocessor load/store instruction.  If wb_ok is false,
7384    reject use of writeback; if unind_ok is false, reject use of
7385    unindexed addressing.  If reloc_override is not 0, use it instead
7386    of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
7387    (in which case it is preserved).  */
7388
7389 static int
7390 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
7391 {
7392   inst.instruction |= inst.operands[i].reg << 16;
7393
7394   gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
7395
7396   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
7397     {
7398       gas_assert (!inst.operands[i].writeback);
7399       if (!unind_ok)
7400         {
7401           inst.error = _("instruction does not support unindexed addressing");
7402           return FAIL;
7403         }
7404       inst.instruction |= inst.operands[i].imm;
7405       inst.instruction |= INDEX_UP;
7406       return SUCCESS;
7407     }
7408
7409   if (inst.operands[i].preind)
7410     inst.instruction |= PRE_INDEX;
7411
7412   if (inst.operands[i].writeback)
7413     {
7414       if (inst.operands[i].reg == REG_PC)
7415         {
7416           inst.error = _("pc may not be used with write-back");
7417           return FAIL;
7418         }
7419       if (!wb_ok)
7420         {
7421           inst.error = _("instruction does not support writeback");
7422           return FAIL;
7423         }
7424       inst.instruction |= WRITE_BACK;
7425     }
7426
7427   if (reloc_override)
7428     inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
7429   else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
7430             || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
7431            && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
7432     {
7433       if (thumb_mode)
7434         inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
7435       else
7436         inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
7437     }
7438
7439   /* Prefer + for zero encoded value.  */
7440   if (!inst.operands[i].negative)
7441     inst.instruction |= INDEX_UP;
7442
7443   return SUCCESS;
7444 }
7445
7446 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
7447    Determine whether it can be performed with a move instruction; if
7448    it can, convert inst.instruction to that move instruction and
7449    return TRUE; if it can't, convert inst.instruction to a literal-pool
7450    load and return FALSE.  If this is not a valid thing to do in the
7451    current context, set inst.error and return TRUE.
7452
7453    inst.operands[i] describes the destination register.  */
7454
7455 static bfd_boolean
7456 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
7457 {
7458   unsigned long tbit;
7459
7460   if (thumb_p)
7461     tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7462   else
7463     tbit = LOAD_BIT;
7464
7465   if ((inst.instruction & tbit) == 0)
7466     {
7467       inst.error = _("invalid pseudo operation");
7468       return TRUE;
7469     }
7470   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
7471     {
7472       inst.error = _("constant expression expected");
7473       return TRUE;
7474     }
7475   if (inst.reloc.exp.X_op == O_constant)
7476     {
7477       if (thumb_p)
7478         {
7479           if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
7480             {
7481               /* This can be done with a mov(1) instruction.  */
7482               inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
7483               inst.instruction |= inst.reloc.exp.X_add_number;
7484               return TRUE;
7485             }
7486         }
7487       else
7488         {
7489           int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
7490           if (value != FAIL)
7491             {
7492               /* This can be done with a mov instruction.  */
7493               inst.instruction &= LITERAL_MASK;
7494               inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
7495               inst.instruction |= value & 0xfff;
7496               return TRUE;
7497             }
7498
7499           value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
7500           if (value != FAIL)
7501             {
7502               /* This can be done with a mvn instruction.  */
7503               inst.instruction &= LITERAL_MASK;
7504               inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
7505               inst.instruction |= value & 0xfff;
7506               return TRUE;
7507             }
7508         }
7509     }
7510
7511   if (add_to_lit_pool () == FAIL)
7512     {
7513       inst.error = _("literal pool insertion failed");
7514       return TRUE;
7515     }
7516   inst.operands[1].reg = REG_PC;
7517   inst.operands[1].isreg = 1;
7518   inst.operands[1].preind = 1;
7519   inst.reloc.pc_rel = 1;
7520   inst.reloc.type = (thumb_p
7521                      ? BFD_RELOC_ARM_THUMB_OFFSET
7522                      : (mode_3
7523                         ? BFD_RELOC_ARM_HWLITERAL
7524                         : BFD_RELOC_ARM_LITERAL));
7525   return FALSE;
7526 }
7527
7528 /* Functions for instruction encoding, sorted by sub-architecture.
7529    First some generics; their names are taken from the conventional
7530    bit positions for register arguments in ARM format instructions.  */
7531
7532 static void
7533 do_noargs (void)
7534 {
7535 }
7536
7537 static void
7538 do_rd (void)
7539 {
7540   inst.instruction |= inst.operands[0].reg << 12;
7541 }
7542
7543 static void
7544 do_rd_rm (void)
7545 {
7546   inst.instruction |= inst.operands[0].reg << 12;
7547   inst.instruction |= inst.operands[1].reg;
7548 }
7549
7550 static void
7551 do_rm_rn (void)
7552 {
7553   inst.instruction |= inst.operands[0].reg;
7554   inst.instruction |= inst.operands[1].reg << 16;
7555 }
7556
7557 static void
7558 do_rd_rn (void)
7559 {
7560   inst.instruction |= inst.operands[0].reg << 12;
7561   inst.instruction |= inst.operands[1].reg << 16;
7562 }
7563
7564 static void
7565 do_rn_rd (void)
7566 {
7567   inst.instruction |= inst.operands[0].reg << 16;
7568   inst.instruction |= inst.operands[1].reg << 12;
7569 }
7570
7571 static bfd_boolean
7572 check_obsolete (const arm_feature_set *feature, const char *msg)
7573 {
7574   if (ARM_CPU_IS_ANY (cpu_variant))
7575     {
7576       as_warn ("%s", msg);
7577       return TRUE;
7578     }
7579   else if (ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
7580     {
7581       as_bad ("%s", msg);
7582       return TRUE;
7583     }
7584
7585   return FALSE;
7586 }
7587
7588 static void
7589 do_rd_rm_rn (void)
7590 {
7591   unsigned Rn = inst.operands[2].reg;
7592   /* Enforce restrictions on SWP instruction.  */
7593   if ((inst.instruction & 0x0fbfffff) == 0x01000090)
7594     {
7595       constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
7596                   _("Rn must not overlap other operands"));
7597
7598       /* SWP{b} is obsolete for ARMv8-A, and deprecated for ARMv6* and ARMv7.
7599        */
7600       if (!check_obsolete (&arm_ext_v8,
7601                            _("swp{b} use is obsoleted for ARMv8 and later"))
7602           && warn_on_deprecated
7603           && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6))
7604         as_warn (_("swp{b} use is deprecated for ARMv6 and ARMv7"));
7605     }
7606
7607   inst.instruction |= inst.operands[0].reg << 12;
7608   inst.instruction |= inst.operands[1].reg;
7609   inst.instruction |= Rn << 16;
7610 }
7611
7612 static void
7613 do_rd_rn_rm (void)
7614 {
7615   inst.instruction |= inst.operands[0].reg << 12;
7616   inst.instruction |= inst.operands[1].reg << 16;
7617   inst.instruction |= inst.operands[2].reg;
7618 }
7619
7620 static void
7621 do_rm_rd_rn (void)
7622 {
7623   constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7624   constraint (((inst.reloc.exp.X_op != O_constant
7625                 && inst.reloc.exp.X_op != O_illegal)
7626                || inst.reloc.exp.X_add_number != 0),
7627               BAD_ADDR_MODE);
7628   inst.instruction |= inst.operands[0].reg;
7629   inst.instruction |= inst.operands[1].reg << 12;
7630   inst.instruction |= inst.operands[2].reg << 16;
7631 }
7632
7633 static void
7634 do_imm0 (void)
7635 {
7636   inst.instruction |= inst.operands[0].imm;
7637 }
7638
7639 static void
7640 do_rd_cpaddr (void)
7641 {
7642   inst.instruction |= inst.operands[0].reg << 12;
7643   encode_arm_cp_address (1, TRUE, TRUE, 0);
7644 }
7645
7646 /* ARM instructions, in alphabetical order by function name (except
7647    that wrapper functions appear immediately after the function they
7648    wrap).  */
7649
7650 /* This is a pseudo-op of the form "adr rd, label" to be converted
7651    into a relative address of the form "add rd, pc, #label-.-8".  */
7652
7653 static void
7654 do_adr (void)
7655 {
7656   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7657
7658   /* Frag hacking will turn this into a sub instruction if the offset turns
7659      out to be negative.  */
7660   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7661   inst.reloc.pc_rel = 1;
7662   inst.reloc.exp.X_add_number -= 8;
7663 }
7664
7665 /* This is a pseudo-op of the form "adrl rd, label" to be converted
7666    into a relative address of the form:
7667    add rd, pc, #low(label-.-8)"
7668    add rd, rd, #high(label-.-8)"  */
7669
7670 static void
7671 do_adrl (void)
7672 {
7673   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7674
7675   /* Frag hacking will turn this into a sub instruction if the offset turns
7676      out to be negative.  */
7677   inst.reloc.type              = BFD_RELOC_ARM_ADRL_IMMEDIATE;
7678   inst.reloc.pc_rel            = 1;
7679   inst.size                    = INSN_SIZE * 2;
7680   inst.reloc.exp.X_add_number -= 8;
7681 }
7682
7683 static void
7684 do_arit (void)
7685 {
7686   if (!inst.operands[1].present)
7687     inst.operands[1].reg = inst.operands[0].reg;
7688   inst.instruction |= inst.operands[0].reg << 12;
7689   inst.instruction |= inst.operands[1].reg << 16;
7690   encode_arm_shifter_operand (2);
7691 }
7692
7693 static void
7694 do_barrier (void)
7695 {
7696   if (inst.operands[0].present)
7697     inst.instruction |= inst.operands[0].imm;
7698   else
7699     inst.instruction |= 0xf;
7700 }
7701
7702 static void
7703 do_bfc (void)
7704 {
7705   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7706   constraint (msb > 32, _("bit-field extends past end of register"));
7707   /* The instruction encoding stores the LSB and MSB,
7708      not the LSB and width.  */
7709   inst.instruction |= inst.operands[0].reg << 12;
7710   inst.instruction |= inst.operands[1].imm << 7;
7711   inst.instruction |= (msb - 1) << 16;
7712 }
7713
7714 static void
7715 do_bfi (void)
7716 {
7717   unsigned int msb;
7718
7719   /* #0 in second position is alternative syntax for bfc, which is
7720      the same instruction but with REG_PC in the Rm field.  */
7721   if (!inst.operands[1].isreg)
7722     inst.operands[1].reg = REG_PC;
7723
7724   msb = inst.operands[2].imm + inst.operands[3].imm;
7725   constraint (msb > 32, _("bit-field extends past end of register"));
7726   /* The instruction encoding stores the LSB and MSB,
7727      not the LSB and width.  */
7728   inst.instruction |= inst.operands[0].reg << 12;
7729   inst.instruction |= inst.operands[1].reg;
7730   inst.instruction |= inst.operands[2].imm << 7;
7731   inst.instruction |= (msb - 1) << 16;
7732 }
7733
7734 static void
7735 do_bfx (void)
7736 {
7737   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7738               _("bit-field extends past end of register"));
7739   inst.instruction |= inst.operands[0].reg << 12;
7740   inst.instruction |= inst.operands[1].reg;
7741   inst.instruction |= inst.operands[2].imm << 7;
7742   inst.instruction |= (inst.operands[3].imm - 1) << 16;
7743 }
7744
7745 /* ARM V5 breakpoint instruction (argument parse)
7746      BKPT <16 bit unsigned immediate>
7747      Instruction is not conditional.
7748         The bit pattern given in insns[] has the COND_ALWAYS condition,
7749         and it is an error if the caller tried to override that.  */
7750
7751 static void
7752 do_bkpt (void)
7753 {
7754   /* Top 12 of 16 bits to bits 19:8.  */
7755   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
7756
7757   /* Bottom 4 of 16 bits to bits 3:0.  */
7758   inst.instruction |= inst.operands[0].imm & 0xf;
7759 }
7760
7761 static void
7762 encode_branch (int default_reloc)
7763 {
7764   if (inst.operands[0].hasreloc)
7765     {
7766       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
7767                   && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
7768                   _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
7769       inst.reloc.type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
7770         ? BFD_RELOC_ARM_PLT32
7771         : thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
7772     }
7773   else
7774     inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
7775   inst.reloc.pc_rel = 1;
7776 }
7777
7778 static void
7779 do_branch (void)
7780 {
7781 #ifdef OBJ_ELF
7782   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7783     encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7784   else
7785 #endif
7786     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7787 }
7788
7789 static void
7790 do_bl (void)
7791 {
7792 #ifdef OBJ_ELF
7793   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7794     {
7795       if (inst.cond == COND_ALWAYS)
7796         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7797       else
7798         encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7799     }
7800   else
7801 #endif
7802     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7803 }
7804
7805 /* ARM V5 branch-link-exchange instruction (argument parse)
7806      BLX <target_addr>          ie BLX(1)
7807      BLX{<condition>} <Rm>      ie BLX(2)
7808    Unfortunately, there are two different opcodes for this mnemonic.
7809    So, the insns[].value is not used, and the code here zaps values
7810         into inst.instruction.
7811    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
7812
7813 static void
7814 do_blx (void)
7815 {
7816   if (inst.operands[0].isreg)
7817     {
7818       /* Arg is a register; the opcode provided by insns[] is correct.
7819          It is not illegal to do "blx pc", just useless.  */
7820       if (inst.operands[0].reg == REG_PC)
7821         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
7822
7823       inst.instruction |= inst.operands[0].reg;
7824     }
7825   else
7826     {
7827       /* Arg is an address; this instruction cannot be executed
7828          conditionally, and the opcode must be adjusted.
7829          We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7830          where we generate out a BFD_RELOC_ARM_PCREL_CALL instead.  */
7831       constraint (inst.cond != COND_ALWAYS, BAD_COND);
7832       inst.instruction = 0xfa000000;
7833       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
7834     }
7835 }
7836
7837 static void
7838 do_bx (void)
7839 {
7840   bfd_boolean want_reloc;
7841
7842   if (inst.operands[0].reg == REG_PC)
7843     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
7844
7845   inst.instruction |= inst.operands[0].reg;
7846   /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7847      it is for ARMv4t or earlier.  */
7848   want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7849   if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7850       want_reloc = TRUE;
7851
7852 #ifdef OBJ_ELF
7853   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
7854 #endif
7855     want_reloc = FALSE;
7856
7857   if (want_reloc)
7858     inst.reloc.type = BFD_RELOC_ARM_V4BX;
7859 }
7860
7861
7862 /* ARM v5TEJ.  Jump to Jazelle code.  */
7863
7864 static void
7865 do_bxj (void)
7866 {
7867   if (inst.operands[0].reg == REG_PC)
7868     as_tsktsk (_("use of r15 in bxj is not really useful"));
7869
7870   inst.instruction |= inst.operands[0].reg;
7871 }
7872
7873 /* Co-processor data operation:
7874       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7875       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
7876 static void
7877 do_cdp (void)
7878 {
7879   inst.instruction |= inst.operands[0].reg << 8;
7880   inst.instruction |= inst.operands[1].imm << 20;
7881   inst.instruction |= inst.operands[2].reg << 12;
7882   inst.instruction |= inst.operands[3].reg << 16;
7883   inst.instruction |= inst.operands[4].reg;
7884   inst.instruction |= inst.operands[5].imm << 5;
7885 }
7886
7887 static void
7888 do_cmp (void)
7889 {
7890   inst.instruction |= inst.operands[0].reg << 16;
7891   encode_arm_shifter_operand (1);
7892 }
7893
7894 /* Transfer between coprocessor and ARM registers.
7895    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7896    MRC2
7897    MCR{cond}
7898    MCR2
7899
7900    No special properties.  */
7901
7902 struct deprecated_coproc_regs_s
7903 {
7904   unsigned cp;
7905   int opc1;
7906   unsigned crn;
7907   unsigned crm;
7908   int opc2;
7909   arm_feature_set deprecated;
7910   arm_feature_set obsoleted;
7911   const char *dep_msg;
7912   const char *obs_msg;
7913 };
7914
7915 #define DEPR_ACCESS_V8 \
7916   N_("This coprocessor register access is deprecated in ARMv8")
7917
7918 /* Table of all deprecated coprocessor registers.  */
7919 static struct deprecated_coproc_regs_s deprecated_coproc_regs[] =
7920 {
7921     {15, 0, 7, 10, 5,                                   /* CP15DMB.  */
7922      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7923      DEPR_ACCESS_V8, NULL},
7924     {15, 0, 7, 10, 4,                                   /* CP15DSB.  */
7925      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7926      DEPR_ACCESS_V8, NULL},
7927     {15, 0, 7,  5, 4,                                   /* CP15ISB.  */
7928      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7929      DEPR_ACCESS_V8, NULL},
7930     {14, 6, 1,  0, 0,                                   /* TEEHBR.  */
7931      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7932      DEPR_ACCESS_V8, NULL},
7933     {14, 6, 0,  0, 0,                                   /* TEECR.  */
7934      ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7935      DEPR_ACCESS_V8, NULL},
7936 };
7937
7938 #undef DEPR_ACCESS_V8
7939
7940 static const size_t deprecated_coproc_reg_count =
7941   sizeof (deprecated_coproc_regs) / sizeof (deprecated_coproc_regs[0]);
7942
7943 static void
7944 do_co_reg (void)
7945 {
7946   unsigned Rd;
7947   size_t i;
7948
7949   Rd = inst.operands[2].reg;
7950   if (thumb_mode)
7951     {
7952       if (inst.instruction == 0xee000010
7953           || inst.instruction == 0xfe000010)
7954         /* MCR, MCR2  */
7955         reject_bad_reg (Rd);
7956       else
7957         /* MRC, MRC2  */
7958         constraint (Rd == REG_SP, BAD_SP);
7959     }
7960   else
7961     {
7962       /* MCR */
7963       if (inst.instruction == 0xe000010)
7964         constraint (Rd == REG_PC, BAD_PC);
7965     }
7966
7967     for (i = 0; i < deprecated_coproc_reg_count; ++i)
7968       {
7969         const struct deprecated_coproc_regs_s *r =
7970           deprecated_coproc_regs + i;
7971
7972         if (inst.operands[0].reg == r->cp
7973             && inst.operands[1].imm == r->opc1
7974             && inst.operands[3].reg == r->crn
7975             && inst.operands[4].reg == r->crm
7976             && inst.operands[5].imm == r->opc2)
7977           {
7978             if (! ARM_CPU_IS_ANY (cpu_variant)
7979                 && warn_on_deprecated
7980                 && ARM_CPU_HAS_FEATURE (cpu_variant, r->deprecated))
7981               as_warn ("%s", r->dep_msg);
7982           }
7983       }
7984
7985   inst.instruction |= inst.operands[0].reg << 8;
7986   inst.instruction |= inst.operands[1].imm << 21;
7987   inst.instruction |= Rd << 12;
7988   inst.instruction |= inst.operands[3].reg << 16;
7989   inst.instruction |= inst.operands[4].reg;
7990   inst.instruction |= inst.operands[5].imm << 5;
7991 }
7992
7993 /* Transfer between coprocessor register and pair of ARM registers.
7994    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7995    MCRR2
7996    MRRC{cond}
7997    MRRC2
7998
7999    Two XScale instructions are special cases of these:
8000
8001      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
8002      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
8003
8004    Result unpredictable if Rd or Rn is R15.  */
8005
8006 static void
8007 do_co_reg2c (void)
8008 {
8009   unsigned Rd, Rn;
8010
8011   Rd = inst.operands[2].reg;
8012   Rn = inst.operands[3].reg;
8013
8014   if (thumb_mode)
8015     {
8016       reject_bad_reg (Rd);
8017       reject_bad_reg (Rn);
8018     }
8019   else
8020     {
8021       constraint (Rd == REG_PC, BAD_PC);
8022       constraint (Rn == REG_PC, BAD_PC);
8023     }
8024
8025   inst.instruction |= inst.operands[0].reg << 8;
8026   inst.instruction |= inst.operands[1].imm << 4;
8027   inst.instruction |= Rd << 12;
8028   inst.instruction |= Rn << 16;
8029   inst.instruction |= inst.operands[4].reg;
8030 }
8031
8032 static void
8033 do_cpsi (void)
8034 {
8035   inst.instruction |= inst.operands[0].imm << 6;
8036   if (inst.operands[1].present)
8037     {
8038       inst.instruction |= CPSI_MMOD;
8039       inst.instruction |= inst.operands[1].imm;
8040     }
8041 }
8042
8043 static void
8044 do_dbg (void)
8045 {
8046   inst.instruction |= inst.operands[0].imm;
8047 }
8048
8049 static void
8050 do_div (void)
8051 {
8052   unsigned Rd, Rn, Rm;
8053
8054   Rd = inst.operands[0].reg;
8055   Rn = (inst.operands[1].present
8056         ? inst.operands[1].reg : Rd);
8057   Rm = inst.operands[2].reg;
8058
8059   constraint ((Rd == REG_PC), BAD_PC);
8060   constraint ((Rn == REG_PC), BAD_PC);
8061   constraint ((Rm == REG_PC), BAD_PC);
8062
8063   inst.instruction |= Rd << 16;
8064   inst.instruction |= Rn << 0;
8065   inst.instruction |= Rm << 8;
8066 }
8067
8068 static void
8069 do_it (void)
8070 {
8071   /* There is no IT instruction in ARM mode.  We
8072      process it to do the validation as if in
8073      thumb mode, just in case the code gets
8074      assembled for thumb using the unified syntax.  */
8075
8076   inst.size = 0;
8077   if (unified_syntax)
8078     {
8079       set_it_insn_type (IT_INSN);
8080       now_it.mask = (inst.instruction & 0xf) | 0x10;
8081       now_it.cc = inst.operands[0].imm;
8082     }
8083 }
8084
8085 /* If there is only one register in the register list,
8086    then return its register number.  Otherwise return -1.  */
8087 static int
8088 only_one_reg_in_list (int range)
8089 {
8090   int i = ffs (range) - 1;
8091   return (i > 15 || range != (1 << i)) ? -1 : i;
8092 }
8093
8094 static void
8095 encode_ldmstm(int from_push_pop_mnem)
8096 {
8097   int base_reg = inst.operands[0].reg;
8098   int range = inst.operands[1].imm;
8099   int one_reg;
8100
8101   inst.instruction |= base_reg << 16;
8102   inst.instruction |= range;
8103
8104   if (inst.operands[1].writeback)
8105     inst.instruction |= LDM_TYPE_2_OR_3;
8106
8107   if (inst.operands[0].writeback)
8108     {
8109       inst.instruction |= WRITE_BACK;
8110       /* Check for unpredictable uses of writeback.  */
8111       if (inst.instruction & LOAD_BIT)
8112         {
8113           /* Not allowed in LDM type 2.  */
8114           if ((inst.instruction & LDM_TYPE_2_OR_3)
8115               && ((range & (1 << REG_PC)) == 0))
8116             as_warn (_("writeback of base register is UNPREDICTABLE"));
8117           /* Only allowed if base reg not in list for other types.  */
8118           else if (range & (1 << base_reg))
8119             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
8120         }
8121       else /* STM.  */
8122         {
8123           /* Not allowed for type 2.  */
8124           if (inst.instruction & LDM_TYPE_2_OR_3)
8125             as_warn (_("writeback of base register is UNPREDICTABLE"));
8126           /* Only allowed if base reg not in list, or first in list.  */
8127           else if ((range & (1 << base_reg))
8128                    && (range & ((1 << base_reg) - 1)))
8129             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
8130         }
8131     }
8132
8133   /* If PUSH/POP has only one register, then use the A2 encoding.  */
8134   one_reg = only_one_reg_in_list (range);
8135   if (from_push_pop_mnem && one_reg >= 0)
8136     {
8137       int is_push = (inst.instruction & A_PUSH_POP_OP_MASK) == A1_OPCODE_PUSH;
8138
8139       inst.instruction &= A_COND_MASK;
8140       inst.instruction |= is_push ? A2_OPCODE_PUSH : A2_OPCODE_POP;
8141       inst.instruction |= one_reg << 12;
8142     }
8143 }
8144
8145 static void
8146 do_ldmstm (void)
8147 {
8148   encode_ldmstm (/*from_push_pop_mnem=*/FALSE);
8149 }
8150
8151 /* ARMv5TE load-consecutive (argument parse)
8152    Mode is like LDRH.
8153
8154      LDRccD R, mode
8155      STRccD R, mode.  */
8156
8157 static void
8158 do_ldrd (void)
8159 {
8160   constraint (inst.operands[0].reg % 2 != 0,
8161               _("first transfer register must be even"));
8162   constraint (inst.operands[1].present
8163               && inst.operands[1].reg != inst.operands[0].reg + 1,
8164               _("can only transfer two consecutive registers"));
8165   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
8166   constraint (!inst.operands[2].isreg, _("'[' expected"));
8167
8168   if (!inst.operands[1].present)
8169     inst.operands[1].reg = inst.operands[0].reg + 1;
8170
8171   /* encode_arm_addr_mode_3 will diagnose overlap between the base
8172      register and the first register written; we have to diagnose
8173      overlap between the base and the second register written here.  */
8174
8175   if (inst.operands[2].reg == inst.operands[1].reg
8176       && (inst.operands[2].writeback || inst.operands[2].postind))
8177     as_warn (_("base register written back, and overlaps "
8178                "second transfer register"));
8179
8180   if (!(inst.instruction & V4_STR_BIT))
8181     {
8182       /* For an index-register load, the index register must not overlap the
8183         destination (even if not write-back).  */
8184       if (inst.operands[2].immisreg
8185               && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
8186               || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
8187         as_warn (_("index register overlaps transfer register"));
8188     }
8189   inst.instruction |= inst.operands[0].reg << 12;
8190   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
8191 }
8192
8193 static void
8194 do_ldrex (void)
8195 {
8196   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
8197               || inst.operands[1].postind || inst.operands[1].writeback
8198               || inst.operands[1].immisreg || inst.operands[1].shifted
8199               || inst.operands[1].negative
8200               /* This can arise if the programmer has written
8201                    strex rN, rM, foo
8202                  or if they have mistakenly used a register name as the last
8203                  operand,  eg:
8204                    strex rN, rM, rX
8205                  It is very difficult to distinguish between these two cases
8206                  because "rX" might actually be a label. ie the register
8207                  name has been occluded by a symbol of the same name. So we
8208                  just generate a general 'bad addressing mode' type error
8209                  message and leave it up to the programmer to discover the
8210                  true cause and fix their mistake.  */
8211               || (inst.operands[1].reg == REG_PC),
8212               BAD_ADDR_MODE);
8213
8214   constraint (inst.reloc.exp.X_op != O_constant
8215               || inst.reloc.exp.X_add_number != 0,
8216               _("offset must be zero in ARM encoding"));
8217
8218   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
8219
8220   inst.instruction |= inst.operands[0].reg << 12;
8221   inst.instruction |= inst.operands[1].reg << 16;
8222   inst.reloc.type = BFD_RELOC_UNUSED;
8223 }
8224
8225 static void
8226 do_ldrexd (void)
8227 {
8228   constraint (inst.operands[0].reg % 2 != 0,
8229               _("even register required"));
8230   constraint (inst.operands[1].present
8231               && inst.operands[1].reg != inst.operands[0].reg + 1,
8232               _("can only load two consecutive registers"));
8233   /* If op 1 were present and equal to PC, this function wouldn't
8234      have been called in the first place.  */
8235   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
8236
8237   inst.instruction |= inst.operands[0].reg << 12;
8238   inst.instruction |= inst.operands[2].reg << 16;
8239 }
8240
8241 /* In both ARM and thumb state 'ldr pc, #imm'  with an immediate
8242    which is not a multiple of four is UNPREDICTABLE.  */
8243 static void
8244 check_ldr_r15_aligned (void)
8245 {
8246   constraint (!(inst.operands[1].immisreg)
8247               && (inst.operands[0].reg == REG_PC
8248               && inst.operands[1].reg == REG_PC
8249               && (inst.reloc.exp.X_add_number & 0x3)),
8250               _("ldr to register 15 must be 4-byte alligned"));
8251 }
8252
8253 static void
8254 do_ldst (void)
8255 {
8256   inst.instruction |= inst.operands[0].reg << 12;
8257   if (!inst.operands[1].isreg)
8258     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
8259       return;
8260   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
8261   check_ldr_r15_aligned ();
8262 }
8263
8264 static void
8265 do_ldstt (void)
8266 {
8267   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
8268      reject [Rn,...].  */
8269   if (inst.operands[1].preind)
8270     {
8271       constraint (inst.reloc.exp.X_op != O_constant
8272                   || inst.reloc.exp.X_add_number != 0,
8273                   _("this instruction requires a post-indexed address"));
8274
8275       inst.operands[1].preind = 0;
8276       inst.operands[1].postind = 1;
8277       inst.operands[1].writeback = 1;
8278     }
8279   inst.instruction |= inst.operands[0].reg << 12;
8280   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
8281 }
8282
8283 /* Halfword and signed-byte load/store operations.  */
8284
8285 static void
8286 do_ldstv4 (void)
8287 {
8288   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
8289   inst.instruction |= inst.operands[0].reg << 12;
8290   if (!inst.operands[1].isreg)
8291     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
8292       return;
8293   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
8294 }
8295
8296 static void
8297 do_ldsttv4 (void)
8298 {
8299   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
8300      reject [Rn,...].  */
8301   if (inst.operands[1].preind)
8302     {
8303       constraint (inst.reloc.exp.X_op != O_constant
8304                   || inst.reloc.exp.X_add_number != 0,
8305                   _("this instruction requires a post-indexed address"));
8306
8307       inst.operands[1].preind = 0;
8308       inst.operands[1].postind = 1;
8309       inst.operands[1].writeback = 1;
8310     }
8311   inst.instruction |= inst.operands[0].reg << 12;
8312   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
8313 }
8314
8315 /* Co-processor register load/store.
8316    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
8317 static void
8318 do_lstc (void)
8319 {
8320   inst.instruction |= inst.operands[0].reg << 8;
8321   inst.instruction |= inst.operands[1].reg << 12;
8322   encode_arm_cp_address (2, TRUE, TRUE, 0);
8323 }
8324
8325 static void
8326 do_mlas (void)
8327 {
8328   /* This restriction does not apply to mls (nor to mla in v6 or later).  */
8329   if (inst.operands[0].reg == inst.operands[1].reg
8330       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
8331       && !(inst.instruction & 0x00400000))
8332     as_tsktsk (_("Rd and Rm should be different in mla"));
8333
8334   inst.instruction |= inst.operands[0].reg << 16;
8335   inst.instruction |= inst.operands[1].reg;
8336   inst.instruction |= inst.operands[2].reg << 8;
8337   inst.instruction |= inst.operands[3].reg << 12;
8338 }
8339
8340 static void
8341 do_mov (void)
8342 {
8343   inst.instruction |= inst.operands[0].reg << 12;
8344   encode_arm_shifter_operand (1);
8345 }
8346
8347 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
8348 static void
8349 do_mov16 (void)
8350 {
8351   bfd_vma imm;
8352   bfd_boolean top;
8353
8354   top = (inst.instruction & 0x00400000) != 0;
8355   constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
8356               _(":lower16: not allowed this instruction"));
8357   constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
8358               _(":upper16: not allowed instruction"));
8359   inst.instruction |= inst.operands[0].reg << 12;
8360   if (inst.reloc.type == BFD_RELOC_UNUSED)
8361     {
8362       imm = inst.reloc.exp.X_add_number;
8363       /* The value is in two pieces: 0:11, 16:19.  */
8364       inst.instruction |= (imm & 0x00000fff);
8365       inst.instruction |= (imm & 0x0000f000) << 4;
8366     }
8367 }
8368
8369 static void do_vfp_nsyn_opcode (const char *);
8370
8371 static int
8372 do_vfp_nsyn_mrs (void)
8373 {
8374   if (inst.operands[0].isvec)
8375     {
8376       if (inst.operands[1].reg != 1)
8377         first_error (_("operand 1 must be FPSCR"));
8378       memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
8379       memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
8380       do_vfp_nsyn_opcode ("fmstat");
8381     }
8382   else if (inst.operands[1].isvec)
8383     do_vfp_nsyn_opcode ("fmrx");
8384   else
8385     return FAIL;
8386
8387   return SUCCESS;
8388 }
8389
8390 static int
8391 do_vfp_nsyn_msr (void)
8392 {
8393   if (inst.operands[0].isvec)
8394     do_vfp_nsyn_opcode ("fmxr");
8395   else
8396     return FAIL;
8397
8398   return SUCCESS;
8399 }
8400
8401 static void
8402 do_vmrs (void)
8403 {
8404   unsigned Rt = inst.operands[0].reg;
8405
8406   if (thumb_mode && Rt == REG_SP)
8407     {
8408       inst.error = BAD_SP;
8409       return;
8410     }
8411
8412   /* APSR_ sets isvec. All other refs to PC are illegal.  */
8413   if (!inst.operands[0].isvec && Rt == REG_PC)
8414     {
8415       inst.error = BAD_PC;
8416       return;
8417     }
8418
8419   /* If we get through parsing the register name, we just insert the number
8420      generated into the instruction without further validation.  */
8421   inst.instruction |= (inst.operands[1].reg << 16);
8422   inst.instruction |= (Rt << 12);
8423 }
8424
8425 static void
8426 do_vmsr (void)
8427 {
8428   unsigned Rt = inst.operands[1].reg;
8429
8430   if (thumb_mode)
8431     reject_bad_reg (Rt);
8432   else if (Rt == REG_PC)
8433     {
8434       inst.error = BAD_PC;
8435       return;
8436     }
8437
8438   /* If we get through parsing the register name, we just insert the number
8439      generated into the instruction without further validation.  */
8440   inst.instruction |= (inst.operands[0].reg << 16);
8441   inst.instruction |= (Rt << 12);
8442 }
8443
8444 static void
8445 do_mrs (void)
8446 {
8447   unsigned br;
8448
8449   if (do_vfp_nsyn_mrs () == SUCCESS)
8450     return;
8451
8452   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
8453   inst.instruction |= inst.operands[0].reg << 12;
8454
8455   if (inst.operands[1].isreg)
8456     {
8457       br = inst.operands[1].reg;
8458       if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf000))
8459         as_bad (_("bad register for mrs"));
8460     }
8461   else
8462     {
8463       /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
8464       constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
8465                   != (PSR_c|PSR_f),
8466                   _("'APSR', 'CPSR' or 'SPSR' expected"));
8467       br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
8468     }
8469
8470   inst.instruction |= br;
8471 }
8472
8473 /* Two possible forms:
8474       "{C|S}PSR_<field>, Rm",
8475       "{C|S}PSR_f, #expression".  */
8476
8477 static void
8478 do_msr (void)
8479 {
8480   if (do_vfp_nsyn_msr () == SUCCESS)
8481     return;
8482
8483   inst.instruction |= inst.operands[0].imm;
8484   if (inst.operands[1].isreg)
8485     inst.instruction |= inst.operands[1].reg;
8486   else
8487     {
8488       inst.instruction |= INST_IMMEDIATE;
8489       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
8490       inst.reloc.pc_rel = 0;
8491     }
8492 }
8493
8494 static void
8495 do_mul (void)
8496 {
8497   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
8498
8499   if (!inst.operands[2].present)
8500     inst.operands[2].reg = inst.operands[0].reg;
8501   inst.instruction |= inst.operands[0].reg << 16;
8502   inst.instruction |= inst.operands[1].reg;
8503   inst.instruction |= inst.operands[2].reg << 8;
8504
8505   if (inst.operands[0].reg == inst.operands[1].reg
8506       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8507     as_tsktsk (_("Rd and Rm should be different in mul"));
8508 }
8509
8510 /* Long Multiply Parser
8511    UMULL RdLo, RdHi, Rm, Rs
8512    SMULL RdLo, RdHi, Rm, Rs
8513    UMLAL RdLo, RdHi, Rm, Rs
8514    SMLAL RdLo, RdHi, Rm, Rs.  */
8515
8516 static void
8517 do_mull (void)
8518 {
8519   inst.instruction |= inst.operands[0].reg << 12;
8520   inst.instruction |= inst.operands[1].reg << 16;
8521   inst.instruction |= inst.operands[2].reg;
8522   inst.instruction |= inst.operands[3].reg << 8;
8523
8524   /* rdhi and rdlo must be different.  */
8525   if (inst.operands[0].reg == inst.operands[1].reg)
8526     as_tsktsk (_("rdhi and rdlo must be different"));
8527
8528   /* rdhi, rdlo and rm must all be different before armv6.  */
8529   if ((inst.operands[0].reg == inst.operands[2].reg
8530       || inst.operands[1].reg == inst.operands[2].reg)
8531       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8532     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
8533 }
8534
8535 static void
8536 do_nop (void)
8537 {
8538   if (inst.operands[0].present
8539       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
8540     {
8541       /* Architectural NOP hints are CPSR sets with no bits selected.  */
8542       inst.instruction &= 0xf0000000;
8543       inst.instruction |= 0x0320f000;
8544       if (inst.operands[0].present)
8545         inst.instruction |= inst.operands[0].imm;
8546     }
8547 }
8548
8549 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
8550    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
8551    Condition defaults to COND_ALWAYS.
8552    Error if Rd, Rn or Rm are R15.  */
8553
8554 static void
8555 do_pkhbt (void)
8556 {
8557   inst.instruction |= inst.operands[0].reg << 12;
8558   inst.instruction |= inst.operands[1].reg << 16;
8559   inst.instruction |= inst.operands[2].reg;
8560   if (inst.operands[3].present)
8561     encode_arm_shift (3);
8562 }
8563
8564 /* ARM V6 PKHTB (Argument Parse).  */
8565
8566 static void
8567 do_pkhtb (void)
8568 {
8569   if (!inst.operands[3].present)
8570     {
8571       /* If the shift specifier is omitted, turn the instruction
8572          into pkhbt rd, rm, rn. */
8573       inst.instruction &= 0xfff00010;
8574       inst.instruction |= inst.operands[0].reg << 12;
8575       inst.instruction |= inst.operands[1].reg;
8576       inst.instruction |= inst.operands[2].reg << 16;
8577     }
8578   else
8579     {
8580       inst.instruction |= inst.operands[0].reg << 12;
8581       inst.instruction |= inst.operands[1].reg << 16;
8582       inst.instruction |= inst.operands[2].reg;
8583       encode_arm_shift (3);
8584     }
8585 }
8586
8587 /* ARMv5TE: Preload-Cache
8588    MP Extensions: Preload for write
8589
8590     PLD(W) <addr_mode>
8591
8592   Syntactically, like LDR with B=1, W=0, L=1.  */
8593
8594 static void
8595 do_pld (void)
8596 {
8597   constraint (!inst.operands[0].isreg,
8598               _("'[' expected after PLD mnemonic"));
8599   constraint (inst.operands[0].postind,
8600               _("post-indexed expression used in preload instruction"));
8601   constraint (inst.operands[0].writeback,
8602               _("writeback used in preload instruction"));
8603   constraint (!inst.operands[0].preind,
8604               _("unindexed addressing used in preload instruction"));
8605   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8606 }
8607
8608 /* ARMv7: PLI <addr_mode>  */
8609 static void
8610 do_pli (void)
8611 {
8612   constraint (!inst.operands[0].isreg,
8613               _("'[' expected after PLI mnemonic"));
8614   constraint (inst.operands[0].postind,
8615               _("post-indexed expression used in preload instruction"));
8616   constraint (inst.operands[0].writeback,
8617               _("writeback used in preload instruction"));
8618   constraint (!inst.operands[0].preind,
8619               _("unindexed addressing used in preload instruction"));
8620   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8621   inst.instruction &= ~PRE_INDEX;
8622 }
8623
8624 static void
8625 do_push_pop (void)
8626 {
8627   inst.operands[1] = inst.operands[0];
8628   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
8629   inst.operands[0].isreg = 1;
8630   inst.operands[0].writeback = 1;
8631   inst.operands[0].reg = REG_SP;
8632   encode_ldmstm (/*from_push_pop_mnem=*/TRUE);
8633 }
8634
8635 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
8636    word at the specified address and the following word
8637    respectively.
8638    Unconditionally executed.
8639    Error if Rn is R15.  */
8640
8641 static void
8642 do_rfe (void)
8643 {
8644   inst.instruction |= inst.operands[0].reg << 16;
8645   if (inst.operands[0].writeback)
8646     inst.instruction |= WRITE_BACK;
8647 }
8648
8649 /* ARM V6 ssat (argument parse).  */
8650
8651 static void
8652 do_ssat (void)
8653 {
8654   inst.instruction |= inst.operands[0].reg << 12;
8655   inst.instruction |= (inst.operands[1].imm - 1) << 16;
8656   inst.instruction |= inst.operands[2].reg;
8657
8658   if (inst.operands[3].present)
8659     encode_arm_shift (3);
8660 }
8661
8662 /* ARM V6 usat (argument parse).  */
8663
8664 static void
8665 do_usat (void)
8666 {
8667   inst.instruction |= inst.operands[0].reg << 12;
8668   inst.instruction |= inst.operands[1].imm << 16;
8669   inst.instruction |= inst.operands[2].reg;
8670
8671   if (inst.operands[3].present)
8672     encode_arm_shift (3);
8673 }
8674
8675 /* ARM V6 ssat16 (argument parse).  */
8676
8677 static void
8678 do_ssat16 (void)
8679 {
8680   inst.instruction |= inst.operands[0].reg << 12;
8681   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
8682   inst.instruction |= inst.operands[2].reg;
8683 }
8684
8685 static void
8686 do_usat16 (void)
8687 {
8688   inst.instruction |= inst.operands[0].reg << 12;
8689   inst.instruction |= inst.operands[1].imm << 16;
8690   inst.instruction |= inst.operands[2].reg;
8691 }
8692
8693 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
8694    preserving the other bits.
8695
8696    setend <endian_specifier>, where <endian_specifier> is either
8697    BE or LE.  */
8698
8699 static void
8700 do_setend (void)
8701 {
8702   if (warn_on_deprecated
8703       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
8704       as_warn (_("setend use is deprecated for ARMv8"));
8705
8706   if (inst.operands[0].imm)
8707     inst.instruction |= 0x200;
8708 }
8709
8710 static void
8711 do_shift (void)
8712 {
8713   unsigned int Rm = (inst.operands[1].present
8714                      ? inst.operands[1].reg
8715                      : inst.operands[0].reg);
8716
8717   inst.instruction |= inst.operands[0].reg << 12;
8718   inst.instruction |= Rm;
8719   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
8720     {
8721       inst.instruction |= inst.operands[2].reg << 8;
8722       inst.instruction |= SHIFT_BY_REG;
8723       /* PR 12854: Error on extraneous shifts.  */
8724       constraint (inst.operands[2].shifted,
8725                   _("extraneous shift as part of operand to shift insn"));
8726     }
8727   else
8728     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
8729 }
8730
8731 static void
8732 do_smc (void)
8733 {
8734   inst.reloc.type = BFD_RELOC_ARM_SMC;
8735   inst.reloc.pc_rel = 0;
8736 }
8737
8738 static void
8739 do_hvc (void)
8740 {
8741   inst.reloc.type = BFD_RELOC_ARM_HVC;
8742   inst.reloc.pc_rel = 0;
8743 }
8744
8745 static void
8746 do_swi (void)
8747 {
8748   inst.reloc.type = BFD_RELOC_ARM_SWI;
8749   inst.reloc.pc_rel = 0;
8750 }
8751
8752 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
8753    SMLAxy{cond} Rd,Rm,Rs,Rn
8754    SMLAWy{cond} Rd,Rm,Rs,Rn
8755    Error if any register is R15.  */
8756
8757 static void
8758 do_smla (void)
8759 {
8760   inst.instruction |= inst.operands[0].reg << 16;
8761   inst.instruction |= inst.operands[1].reg;
8762   inst.instruction |= inst.operands[2].reg << 8;
8763   inst.instruction |= inst.operands[3].reg << 12;
8764 }
8765
8766 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8767    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8768    Error if any register is R15.
8769    Warning if Rdlo == Rdhi.  */
8770
8771 static void
8772 do_smlal (void)
8773 {
8774   inst.instruction |= inst.operands[0].reg << 12;
8775   inst.instruction |= inst.operands[1].reg << 16;
8776   inst.instruction |= inst.operands[2].reg;
8777   inst.instruction |= inst.operands[3].reg << 8;
8778
8779   if (inst.operands[0].reg == inst.operands[1].reg)
8780     as_tsktsk (_("rdhi and rdlo must be different"));
8781 }
8782
8783 /* ARM V5E (El Segundo) signed-multiply (argument parse)
8784    SMULxy{cond} Rd,Rm,Rs
8785    Error if any register is R15.  */
8786
8787 static void
8788 do_smul (void)
8789 {
8790   inst.instruction |= inst.operands[0].reg << 16;
8791   inst.instruction |= inst.operands[1].reg;
8792   inst.instruction |= inst.operands[2].reg << 8;
8793 }
8794
8795 /* ARM V6 srs (argument parse).  The variable fields in the encoding are
8796    the same for both ARM and Thumb-2.  */
8797
8798 static void
8799 do_srs (void)
8800 {
8801   int reg;
8802
8803   if (inst.operands[0].present)
8804     {
8805       reg = inst.operands[0].reg;
8806       constraint (reg != REG_SP, _("SRS base register must be r13"));
8807     }
8808   else
8809     reg = REG_SP;
8810
8811   inst.instruction |= reg << 16;
8812   inst.instruction |= inst.operands[1].imm;
8813   if (inst.operands[0].writeback || inst.operands[1].writeback)
8814     inst.instruction |= WRITE_BACK;
8815 }
8816
8817 /* ARM V6 strex (argument parse).  */
8818
8819 static void
8820 do_strex (void)
8821 {
8822   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8823               || inst.operands[2].postind || inst.operands[2].writeback
8824               || inst.operands[2].immisreg || inst.operands[2].shifted
8825               || inst.operands[2].negative
8826               /* See comment in do_ldrex().  */
8827               || (inst.operands[2].reg == REG_PC),
8828               BAD_ADDR_MODE);
8829
8830   constraint (inst.operands[0].reg == inst.operands[1].reg
8831               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8832
8833   constraint (inst.reloc.exp.X_op != O_constant
8834               || inst.reloc.exp.X_add_number != 0,
8835               _("offset must be zero in ARM encoding"));
8836
8837   inst.instruction |= inst.operands[0].reg << 12;
8838   inst.instruction |= inst.operands[1].reg;
8839   inst.instruction |= inst.operands[2].reg << 16;
8840   inst.reloc.type = BFD_RELOC_UNUSED;
8841 }
8842
8843 static void
8844 do_t_strexbh (void)
8845 {
8846   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8847               || inst.operands[2].postind || inst.operands[2].writeback
8848               || inst.operands[2].immisreg || inst.operands[2].shifted
8849               || inst.operands[2].negative,
8850               BAD_ADDR_MODE);
8851
8852   constraint (inst.operands[0].reg == inst.operands[1].reg
8853               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8854
8855   do_rm_rd_rn ();
8856 }
8857
8858 static void
8859 do_strexd (void)
8860 {
8861   constraint (inst.operands[1].reg % 2 != 0,
8862               _("even register required"));
8863   constraint (inst.operands[2].present
8864               && inst.operands[2].reg != inst.operands[1].reg + 1,
8865               _("can only store two consecutive registers"));
8866   /* If op 2 were present and equal to PC, this function wouldn't
8867      have been called in the first place.  */
8868   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
8869
8870   constraint (inst.operands[0].reg == inst.operands[1].reg
8871               || inst.operands[0].reg == inst.operands[1].reg + 1
8872               || inst.operands[0].reg == inst.operands[3].reg,
8873               BAD_OVERLAP);
8874
8875   inst.instruction |= inst.operands[0].reg << 12;
8876   inst.instruction |= inst.operands[1].reg;
8877   inst.instruction |= inst.operands[3].reg << 16;
8878 }
8879
8880 /* ARM V8 STRL.  */
8881 static void
8882 do_stlex (void)
8883 {
8884   constraint (inst.operands[0].reg == inst.operands[1].reg
8885               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8886
8887   do_rd_rm_rn ();
8888 }
8889
8890 static void
8891 do_t_stlex (void)
8892 {
8893   constraint (inst.operands[0].reg == inst.operands[1].reg
8894               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8895
8896   do_rm_rd_rn ();
8897 }
8898
8899 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8900    extends it to 32-bits, and adds the result to a value in another
8901    register.  You can specify a rotation by 0, 8, 16, or 24 bits
8902    before extracting the 16-bit value.
8903    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8904    Condition defaults to COND_ALWAYS.
8905    Error if any register uses R15.  */
8906
8907 static void
8908 do_sxtah (void)
8909 {
8910   inst.instruction |= inst.operands[0].reg << 12;
8911   inst.instruction |= inst.operands[1].reg << 16;
8912   inst.instruction |= inst.operands[2].reg;
8913   inst.instruction |= inst.operands[3].imm << 10;
8914 }
8915
8916 /* ARM V6 SXTH.
8917
8918    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8919    Condition defaults to COND_ALWAYS.
8920    Error if any register uses R15.  */
8921
8922 static void
8923 do_sxth (void)
8924 {
8925   inst.instruction |= inst.operands[0].reg << 12;
8926   inst.instruction |= inst.operands[1].reg;
8927   inst.instruction |= inst.operands[2].imm << 10;
8928 }
8929 \f
8930 /* VFP instructions.  In a logical order: SP variant first, monad
8931    before dyad, arithmetic then move then load/store.  */
8932
8933 static void
8934 do_vfp_sp_monadic (void)
8935 {
8936   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8937   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8938 }
8939
8940 static void
8941 do_vfp_sp_dyadic (void)
8942 {
8943   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8944   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8945   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8946 }
8947
8948 static void
8949 do_vfp_sp_compare_z (void)
8950 {
8951   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8952 }
8953
8954 static void
8955 do_vfp_dp_sp_cvt (void)
8956 {
8957   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8958   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8959 }
8960
8961 static void
8962 do_vfp_sp_dp_cvt (void)
8963 {
8964   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8965   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8966 }
8967
8968 static void
8969 do_vfp_reg_from_sp (void)
8970 {
8971   inst.instruction |= inst.operands[0].reg << 12;
8972   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8973 }
8974
8975 static void
8976 do_vfp_reg2_from_sp2 (void)
8977 {
8978   constraint (inst.operands[2].imm != 2,
8979               _("only two consecutive VFP SP registers allowed here"));
8980   inst.instruction |= inst.operands[0].reg << 12;
8981   inst.instruction |= inst.operands[1].reg << 16;
8982   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8983 }
8984
8985 static void
8986 do_vfp_sp_from_reg (void)
8987 {
8988   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
8989   inst.instruction |= inst.operands[1].reg << 12;
8990 }
8991
8992 static void
8993 do_vfp_sp2_from_reg2 (void)
8994 {
8995   constraint (inst.operands[0].imm != 2,
8996               _("only two consecutive VFP SP registers allowed here"));
8997   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
8998   inst.instruction |= inst.operands[1].reg << 12;
8999   inst.instruction |= inst.operands[2].reg << 16;
9000 }
9001
9002 static void
9003 do_vfp_sp_ldst (void)
9004 {
9005   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9006   encode_arm_cp_address (1, FALSE, TRUE, 0);
9007 }
9008
9009 static void
9010 do_vfp_dp_ldst (void)
9011 {
9012   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9013   encode_arm_cp_address (1, FALSE, TRUE, 0);
9014 }
9015
9016
9017 static void
9018 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
9019 {
9020   if (inst.operands[0].writeback)
9021     inst.instruction |= WRITE_BACK;
9022   else
9023     constraint (ldstm_type != VFP_LDSTMIA,
9024                 _("this addressing mode requires base-register writeback"));
9025   inst.instruction |= inst.operands[0].reg << 16;
9026   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
9027   inst.instruction |= inst.operands[1].imm;
9028 }
9029
9030 static void
9031 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
9032 {
9033   int count;
9034
9035   if (inst.operands[0].writeback)
9036     inst.instruction |= WRITE_BACK;
9037   else
9038     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
9039                 _("this addressing mode requires base-register writeback"));
9040
9041   inst.instruction |= inst.operands[0].reg << 16;
9042   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
9043
9044   count = inst.operands[1].imm << 1;
9045   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
9046     count += 1;
9047
9048   inst.instruction |= count;
9049 }
9050
9051 static void
9052 do_vfp_sp_ldstmia (void)
9053 {
9054   vfp_sp_ldstm (VFP_LDSTMIA);
9055 }
9056
9057 static void
9058 do_vfp_sp_ldstmdb (void)
9059 {
9060   vfp_sp_ldstm (VFP_LDSTMDB);
9061 }
9062
9063 static void
9064 do_vfp_dp_ldstmia (void)
9065 {
9066   vfp_dp_ldstm (VFP_LDSTMIA);
9067 }
9068
9069 static void
9070 do_vfp_dp_ldstmdb (void)
9071 {
9072   vfp_dp_ldstm (VFP_LDSTMDB);
9073 }
9074
9075 static void
9076 do_vfp_xp_ldstmia (void)
9077 {
9078   vfp_dp_ldstm (VFP_LDSTMIAX);
9079 }
9080
9081 static void
9082 do_vfp_xp_ldstmdb (void)
9083 {
9084   vfp_dp_ldstm (VFP_LDSTMDBX);
9085 }
9086
9087 static void
9088 do_vfp_dp_rd_rm (void)
9089 {
9090   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9091   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
9092 }
9093
9094 static void
9095 do_vfp_dp_rn_rd (void)
9096 {
9097   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
9098   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
9099 }
9100
9101 static void
9102 do_vfp_dp_rd_rn (void)
9103 {
9104   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9105   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
9106 }
9107
9108 static void
9109 do_vfp_dp_rd_rn_rm (void)
9110 {
9111   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9112   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
9113   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
9114 }
9115
9116 static void
9117 do_vfp_dp_rd (void)
9118 {
9119   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9120 }
9121
9122 static void
9123 do_vfp_dp_rm_rd_rn (void)
9124 {
9125   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
9126   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
9127   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
9128 }
9129
9130 /* VFPv3 instructions.  */
9131 static void
9132 do_vfp_sp_const (void)
9133 {
9134   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9135   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
9136   inst.instruction |= (inst.operands[1].imm & 0x0f);
9137 }
9138
9139 static void
9140 do_vfp_dp_const (void)
9141 {
9142   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9143   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
9144   inst.instruction |= (inst.operands[1].imm & 0x0f);
9145 }
9146
9147 static void
9148 vfp_conv (int srcsize)
9149 {
9150   int immbits = srcsize - inst.operands[1].imm;
9151
9152   if (srcsize == 16 && !(immbits >= 0 && immbits <= srcsize))
9153     {
9154       /* If srcsize is 16, inst.operands[1].imm must be in the range 0-16.
9155          i.e. immbits must be in range 0 - 16.  */
9156       inst.error = _("immediate value out of range, expected range [0, 16]");
9157       return;
9158     }
9159   else if (srcsize == 32 && !(immbits >= 0 && immbits < srcsize))
9160     {
9161       /* If srcsize is 32, inst.operands[1].imm must be in the range 1-32.
9162          i.e. immbits must be in range 0 - 31.  */
9163       inst.error = _("immediate value out of range, expected range [1, 32]");
9164       return;
9165     }
9166
9167   inst.instruction |= (immbits & 1) << 5;
9168   inst.instruction |= (immbits >> 1);
9169 }
9170
9171 static void
9172 do_vfp_sp_conv_16 (void)
9173 {
9174   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9175   vfp_conv (16);
9176 }
9177
9178 static void
9179 do_vfp_dp_conv_16 (void)
9180 {
9181   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9182   vfp_conv (16);
9183 }
9184
9185 static void
9186 do_vfp_sp_conv_32 (void)
9187 {
9188   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9189   vfp_conv (32);
9190 }
9191
9192 static void
9193 do_vfp_dp_conv_32 (void)
9194 {
9195   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9196   vfp_conv (32);
9197 }
9198 \f
9199 /* FPA instructions.  Also in a logical order.  */
9200
9201 static void
9202 do_fpa_cmp (void)
9203 {
9204   inst.instruction |= inst.operands[0].reg << 16;
9205   inst.instruction |= inst.operands[1].reg;
9206 }
9207
9208 static void
9209 do_fpa_ldmstm (void)
9210 {
9211   inst.instruction |= inst.operands[0].reg << 12;
9212   switch (inst.operands[1].imm)
9213     {
9214     case 1: inst.instruction |= CP_T_X;          break;
9215     case 2: inst.instruction |= CP_T_Y;          break;
9216     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
9217     case 4:                                      break;
9218     default: abort ();
9219     }
9220
9221   if (inst.instruction & (PRE_INDEX | INDEX_UP))
9222     {
9223       /* The instruction specified "ea" or "fd", so we can only accept
9224          [Rn]{!}.  The instruction does not really support stacking or
9225          unstacking, so we have to emulate these by setting appropriate
9226          bits and offsets.  */
9227       constraint (inst.reloc.exp.X_op != O_constant
9228                   || inst.reloc.exp.X_add_number != 0,
9229                   _("this instruction does not support indexing"));
9230
9231       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
9232         inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
9233
9234       if (!(inst.instruction & INDEX_UP))
9235         inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
9236
9237       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
9238         {
9239           inst.operands[2].preind = 0;
9240           inst.operands[2].postind = 1;
9241         }
9242     }
9243
9244   encode_arm_cp_address (2, TRUE, TRUE, 0);
9245 }
9246 \f
9247 /* iWMMXt instructions: strictly in alphabetical order.  */
9248
9249 static void
9250 do_iwmmxt_tandorc (void)
9251 {
9252   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
9253 }
9254
9255 static void
9256 do_iwmmxt_textrc (void)
9257 {
9258   inst.instruction |= inst.operands[0].reg << 12;
9259   inst.instruction |= inst.operands[1].imm;
9260 }
9261
9262 static void
9263 do_iwmmxt_textrm (void)
9264 {
9265   inst.instruction |= inst.operands[0].reg << 12;
9266   inst.instruction |= inst.operands[1].reg << 16;
9267   inst.instruction |= inst.operands[2].imm;
9268 }
9269
9270 static void
9271 do_iwmmxt_tinsr (void)
9272 {
9273   inst.instruction |= inst.operands[0].reg << 16;
9274   inst.instruction |= inst.operands[1].reg << 12;
9275   inst.instruction |= inst.operands[2].imm;
9276 }
9277
9278 static void
9279 do_iwmmxt_tmia (void)
9280 {
9281   inst.instruction |= inst.operands[0].reg << 5;
9282   inst.instruction |= inst.operands[1].reg;
9283   inst.instruction |= inst.operands[2].reg << 12;
9284 }
9285
9286 static void
9287 do_iwmmxt_waligni (void)
9288 {
9289   inst.instruction |= inst.operands[0].reg << 12;
9290   inst.instruction |= inst.operands[1].reg << 16;
9291   inst.instruction |= inst.operands[2].reg;
9292   inst.instruction |= inst.operands[3].imm << 20;
9293 }
9294
9295 static void
9296 do_iwmmxt_wmerge (void)
9297 {
9298   inst.instruction |= inst.operands[0].reg << 12;
9299   inst.instruction |= inst.operands[1].reg << 16;
9300   inst.instruction |= inst.operands[2].reg;
9301   inst.instruction |= inst.operands[3].imm << 21;
9302 }
9303
9304 static void
9305 do_iwmmxt_wmov (void)
9306 {
9307   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
9308   inst.instruction |= inst.operands[0].reg << 12;
9309   inst.instruction |= inst.operands[1].reg << 16;
9310   inst.instruction |= inst.operands[1].reg;
9311 }
9312
9313 static void
9314 do_iwmmxt_wldstbh (void)
9315 {
9316   int reloc;
9317   inst.instruction |= inst.operands[0].reg << 12;
9318   if (thumb_mode)
9319     reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
9320   else
9321     reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
9322   encode_arm_cp_address (1, TRUE, FALSE, reloc);
9323 }
9324
9325 static void
9326 do_iwmmxt_wldstw (void)
9327 {
9328   /* RIWR_RIWC clears .isreg for a control register.  */
9329   if (!inst.operands[0].isreg)
9330     {
9331       constraint (inst.cond != COND_ALWAYS, BAD_COND);
9332       inst.instruction |= 0xf0000000;
9333     }
9334
9335   inst.instruction |= inst.operands[0].reg << 12;
9336   encode_arm_cp_address (1, TRUE, TRUE, 0);
9337 }
9338
9339 static void
9340 do_iwmmxt_wldstd (void)
9341 {
9342   inst.instruction |= inst.operands[0].reg << 12;
9343   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
9344       && inst.operands[1].immisreg)
9345     {
9346       inst.instruction &= ~0x1a000ff;
9347       inst.instruction |= (0xf << 28);
9348       if (inst.operands[1].preind)
9349         inst.instruction |= PRE_INDEX;
9350       if (!inst.operands[1].negative)
9351         inst.instruction |= INDEX_UP;
9352       if (inst.operands[1].writeback)
9353         inst.instruction |= WRITE_BACK;
9354       inst.instruction |= inst.operands[1].reg << 16;
9355       inst.instruction |= inst.reloc.exp.X_add_number << 4;
9356       inst.instruction |= inst.operands[1].imm;
9357     }
9358   else
9359     encode_arm_cp_address (1, TRUE, FALSE, 0);
9360 }
9361
9362 static void
9363 do_iwmmxt_wshufh (void)
9364 {
9365   inst.instruction |= inst.operands[0].reg << 12;
9366   inst.instruction |= inst.operands[1].reg << 16;
9367   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
9368   inst.instruction |= (inst.operands[2].imm & 0x0f);
9369 }
9370
9371 static void
9372 do_iwmmxt_wzero (void)
9373 {
9374   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
9375   inst.instruction |= inst.operands[0].reg;
9376   inst.instruction |= inst.operands[0].reg << 12;
9377   inst.instruction |= inst.operands[0].reg << 16;
9378 }
9379
9380 static void
9381 do_iwmmxt_wrwrwr_or_imm5 (void)
9382 {
9383   if (inst.operands[2].isreg)
9384     do_rd_rn_rm ();
9385   else {
9386     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
9387                 _("immediate operand requires iWMMXt2"));
9388     do_rd_rn ();
9389     if (inst.operands[2].imm == 0)
9390       {
9391         switch ((inst.instruction >> 20) & 0xf)
9392           {
9393           case 4:
9394           case 5:
9395           case 6:
9396           case 7:
9397             /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
9398             inst.operands[2].imm = 16;
9399             inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
9400             break;
9401           case 8:
9402           case 9:
9403           case 10:
9404           case 11:
9405             /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
9406             inst.operands[2].imm = 32;
9407             inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
9408             break;
9409           case 12:
9410           case 13:
9411           case 14:
9412           case 15:
9413             {
9414               /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
9415               unsigned long wrn;
9416               wrn = (inst.instruction >> 16) & 0xf;
9417               inst.instruction &= 0xff0fff0f;
9418               inst.instruction |= wrn;
9419               /* Bail out here; the instruction is now assembled.  */
9420               return;
9421             }
9422           }
9423       }
9424     /* Map 32 -> 0, etc.  */
9425     inst.operands[2].imm &= 0x1f;
9426     inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
9427   }
9428 }
9429 \f
9430 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
9431    operations first, then control, shift, and load/store.  */
9432
9433 /* Insns like "foo X,Y,Z".  */
9434
9435 static void
9436 do_mav_triple (void)
9437 {
9438   inst.instruction |= inst.operands[0].reg << 16;
9439   inst.instruction |= inst.operands[1].reg;
9440   inst.instruction |= inst.operands[2].reg << 12;
9441 }
9442
9443 /* Insns like "foo W,X,Y,Z".
9444     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
9445
9446 static void
9447 do_mav_quad (void)
9448 {
9449   inst.instruction |= inst.operands[0].reg << 5;
9450   inst.instruction |= inst.operands[1].reg << 12;
9451   inst.instruction |= inst.operands[2].reg << 16;
9452   inst.instruction |= inst.operands[3].reg;
9453 }
9454
9455 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
9456 static void
9457 do_mav_dspsc (void)
9458 {
9459   inst.instruction |= inst.operands[1].reg << 12;
9460 }
9461
9462 /* Maverick shift immediate instructions.
9463    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
9464    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
9465
9466 static void
9467 do_mav_shift (void)
9468 {
9469   int imm = inst.operands[2].imm;
9470
9471   inst.instruction |= inst.operands[0].reg << 12;
9472   inst.instruction |= inst.operands[1].reg << 16;
9473
9474   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
9475      Bits 5-7 of the insn should have bits 4-6 of the immediate.
9476      Bit 4 should be 0.  */
9477   imm = (imm & 0xf) | ((imm & 0x70) << 1);
9478
9479   inst.instruction |= imm;
9480 }
9481 \f
9482 /* XScale instructions.  Also sorted arithmetic before move.  */
9483
9484 /* Xscale multiply-accumulate (argument parse)
9485      MIAcc   acc0,Rm,Rs
9486      MIAPHcc acc0,Rm,Rs
9487      MIAxycc acc0,Rm,Rs.  */
9488
9489 static void
9490 do_xsc_mia (void)
9491 {
9492   inst.instruction |= inst.operands[1].reg;
9493   inst.instruction |= inst.operands[2].reg << 12;
9494 }
9495
9496 /* Xscale move-accumulator-register (argument parse)
9497
9498      MARcc   acc0,RdLo,RdHi.  */
9499
9500 static void
9501 do_xsc_mar (void)
9502 {
9503   inst.instruction |= inst.operands[1].reg << 12;
9504   inst.instruction |= inst.operands[2].reg << 16;
9505 }
9506
9507 /* Xscale move-register-accumulator (argument parse)
9508
9509      MRAcc   RdLo,RdHi,acc0.  */
9510
9511 static void
9512 do_xsc_mra (void)
9513 {
9514   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
9515   inst.instruction |= inst.operands[0].reg << 12;
9516   inst.instruction |= inst.operands[1].reg << 16;
9517 }
9518 \f
9519 /* Encoding functions relevant only to Thumb.  */
9520
9521 /* inst.operands[i] is a shifted-register operand; encode
9522    it into inst.instruction in the format used by Thumb32.  */
9523
9524 static void
9525 encode_thumb32_shifted_operand (int i)
9526 {
9527   unsigned int value = inst.reloc.exp.X_add_number;
9528   unsigned int shift = inst.operands[i].shift_kind;
9529
9530   constraint (inst.operands[i].immisreg,
9531               _("shift by register not allowed in thumb mode"));
9532   inst.instruction |= inst.operands[i].reg;
9533   if (shift == SHIFT_RRX)
9534     inst.instruction |= SHIFT_ROR << 4;
9535   else
9536     {
9537       constraint (inst.reloc.exp.X_op != O_constant,
9538                   _("expression too complex"));
9539
9540       constraint (value > 32
9541                   || (value == 32 && (shift == SHIFT_LSL
9542                                       || shift == SHIFT_ROR)),
9543                   _("shift expression is too large"));
9544
9545       if (value == 0)
9546         shift = SHIFT_LSL;
9547       else if (value == 32)
9548         value = 0;
9549
9550       inst.instruction |= shift << 4;
9551       inst.instruction |= (value & 0x1c) << 10;
9552       inst.instruction |= (value & 0x03) << 6;
9553     }
9554 }
9555
9556
9557 /* inst.operands[i] was set up by parse_address.  Encode it into a
9558    Thumb32 format load or store instruction.  Reject forms that cannot
9559    be used with such instructions.  If is_t is true, reject forms that
9560    cannot be used with a T instruction; if is_d is true, reject forms
9561    that cannot be used with a D instruction.  If it is a store insn,
9562    reject PC in Rn.  */
9563
9564 static void
9565 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
9566 {
9567   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
9568
9569   constraint (!inst.operands[i].isreg,
9570               _("Instruction does not support =N addresses"));
9571
9572   inst.instruction |= inst.operands[i].reg << 16;
9573   if (inst.operands[i].immisreg)
9574     {
9575       constraint (is_pc, BAD_PC_ADDRESSING);
9576       constraint (is_t || is_d, _("cannot use register index with this instruction"));
9577       constraint (inst.operands[i].negative,
9578                   _("Thumb does not support negative register indexing"));
9579       constraint (inst.operands[i].postind,
9580                   _("Thumb does not support register post-indexing"));
9581       constraint (inst.operands[i].writeback,
9582                   _("Thumb does not support register indexing with writeback"));
9583       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
9584                   _("Thumb supports only LSL in shifted register indexing"));
9585
9586       inst.instruction |= inst.operands[i].imm;
9587       if (inst.operands[i].shifted)
9588         {
9589           constraint (inst.reloc.exp.X_op != O_constant,
9590                       _("expression too complex"));
9591           constraint (inst.reloc.exp.X_add_number < 0
9592                       || inst.reloc.exp.X_add_number > 3,
9593                       _("shift out of range"));
9594           inst.instruction |= inst.reloc.exp.X_add_number << 4;
9595         }
9596       inst.reloc.type = BFD_RELOC_UNUSED;
9597     }
9598   else if (inst.operands[i].preind)
9599     {
9600       constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
9601       constraint (is_t && inst.operands[i].writeback,
9602                   _("cannot use writeback with this instruction"));
9603       constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0),
9604                   BAD_PC_ADDRESSING);
9605
9606       if (is_d)
9607         {
9608           inst.instruction |= 0x01000000;
9609           if (inst.operands[i].writeback)
9610             inst.instruction |= 0x00200000;
9611         }
9612       else
9613         {
9614           inst.instruction |= 0x00000c00;
9615           if (inst.operands[i].writeback)
9616             inst.instruction |= 0x00000100;
9617         }
9618       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9619     }
9620   else if (inst.operands[i].postind)
9621     {
9622       gas_assert (inst.operands[i].writeback);
9623       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
9624       constraint (is_t, _("cannot use post-indexing with this instruction"));
9625
9626       if (is_d)
9627         inst.instruction |= 0x00200000;
9628       else
9629         inst.instruction |= 0x00000900;
9630       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9631     }
9632   else /* unindexed - only for coprocessor */
9633     inst.error = _("instruction does not accept unindexed addressing");
9634 }
9635
9636 /* Table of Thumb instructions which exist in both 16- and 32-bit
9637    encodings (the latter only in post-V6T2 cores).  The index is the
9638    value used in the insns table below.  When there is more than one
9639    possible 16-bit encoding for the instruction, this table always
9640    holds variant (1).
9641    Also contains several pseudo-instructions used during relaxation.  */
9642 #define T16_32_TAB                              \
9643   X(_adc,   4140, eb400000),                    \
9644   X(_adcs,  4140, eb500000),                    \
9645   X(_add,   1c00, eb000000),                    \
9646   X(_adds,  1c00, eb100000),                    \
9647   X(_addi,  0000, f1000000),                    \
9648   X(_addis, 0000, f1100000),                    \
9649   X(_add_pc,000f, f20f0000),                    \
9650   X(_add_sp,000d, f10d0000),                    \
9651   X(_adr,   000f, f20f0000),                    \
9652   X(_and,   4000, ea000000),                    \
9653   X(_ands,  4000, ea100000),                    \
9654   X(_asr,   1000, fa40f000),                    \
9655   X(_asrs,  1000, fa50f000),                    \
9656   X(_b,     e000, f000b000),                    \
9657   X(_bcond, d000, f0008000),                    \
9658   X(_bic,   4380, ea200000),                    \
9659   X(_bics,  4380, ea300000),                    \
9660   X(_cmn,   42c0, eb100f00),                    \
9661   X(_cmp,   2800, ebb00f00),                    \
9662   X(_cpsie, b660, f3af8400),                    \
9663   X(_cpsid, b670, f3af8600),                    \
9664   X(_cpy,   4600, ea4f0000),                    \
9665   X(_dec_sp,80dd, f1ad0d00),                    \
9666   X(_eor,   4040, ea800000),                    \
9667   X(_eors,  4040, ea900000),                    \
9668   X(_inc_sp,00dd, f10d0d00),                    \
9669   X(_ldmia, c800, e8900000),                    \
9670   X(_ldr,   6800, f8500000),                    \
9671   X(_ldrb,  7800, f8100000),                    \
9672   X(_ldrh,  8800, f8300000),                    \
9673   X(_ldrsb, 5600, f9100000),                    \
9674   X(_ldrsh, 5e00, f9300000),                    \
9675   X(_ldr_pc,4800, f85f0000),                    \
9676   X(_ldr_pc2,4800, f85f0000),                   \
9677   X(_ldr_sp,9800, f85d0000),                    \
9678   X(_lsl,   0000, fa00f000),                    \
9679   X(_lsls,  0000, fa10f000),                    \
9680   X(_lsr,   0800, fa20f000),                    \
9681   X(_lsrs,  0800, fa30f000),                    \
9682   X(_mov,   2000, ea4f0000),                    \
9683   X(_movs,  2000, ea5f0000),                    \
9684   X(_mul,   4340, fb00f000),                     \
9685   X(_muls,  4340, ffffffff), /* no 32b muls */  \
9686   X(_mvn,   43c0, ea6f0000),                    \
9687   X(_mvns,  43c0, ea7f0000),                    \
9688   X(_neg,   4240, f1c00000), /* rsb #0 */       \
9689   X(_negs,  4240, f1d00000), /* rsbs #0 */      \
9690   X(_orr,   4300, ea400000),                    \
9691   X(_orrs,  4300, ea500000),                    \
9692   X(_pop,   bc00, e8bd0000), /* ldmia sp!,... */        \
9693   X(_push,  b400, e92d0000), /* stmdb sp!,... */        \
9694   X(_rev,   ba00, fa90f080),                    \
9695   X(_rev16, ba40, fa90f090),                    \
9696   X(_revsh, bac0, fa90f0b0),                    \
9697   X(_ror,   41c0, fa60f000),                    \
9698   X(_rors,  41c0, fa70f000),                    \
9699   X(_sbc,   4180, eb600000),                    \
9700   X(_sbcs,  4180, eb700000),                    \
9701   X(_stmia, c000, e8800000),                    \
9702   X(_str,   6000, f8400000),                    \
9703   X(_strb,  7000, f8000000),                    \
9704   X(_strh,  8000, f8200000),                    \
9705   X(_str_sp,9000, f84d0000),                    \
9706   X(_sub,   1e00, eba00000),                    \
9707   X(_subs,  1e00, ebb00000),                    \
9708   X(_subi,  8000, f1a00000),                    \
9709   X(_subis, 8000, f1b00000),                    \
9710   X(_sxtb,  b240, fa4ff080),                    \
9711   X(_sxth,  b200, fa0ff080),                    \
9712   X(_tst,   4200, ea100f00),                    \
9713   X(_uxtb,  b2c0, fa5ff080),                    \
9714   X(_uxth,  b280, fa1ff080),                    \
9715   X(_nop,   bf00, f3af8000),                    \
9716   X(_yield, bf10, f3af8001),                    \
9717   X(_wfe,   bf20, f3af8002),                    \
9718   X(_wfi,   bf30, f3af8003),                    \
9719   X(_sev,   bf40, f3af8004),                    \
9720   X(_sevl,  bf50, f3af8005),                    \
9721   X(_udf,   de00, f7f0a000)
9722
9723 /* To catch errors in encoding functions, the codes are all offset by
9724    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
9725    as 16-bit instructions.  */
9726 #define X(a,b,c) T_MNEM##a
9727 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
9728 #undef X
9729
9730 #define X(a,b,c) 0x##b
9731 static const unsigned short thumb_op16[] = { T16_32_TAB };
9732 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
9733 #undef X
9734
9735 #define X(a,b,c) 0x##c
9736 static const unsigned int thumb_op32[] = { T16_32_TAB };
9737 #define THUMB_OP32(n)        (thumb_op32[(n) - (T16_32_OFFSET + 1)])
9738 #define THUMB_SETS_FLAGS(n)  (THUMB_OP32 (n) & 0x00100000)
9739 #undef X
9740 #undef T16_32_TAB
9741
9742 /* Thumb instruction encoders, in alphabetical order.  */
9743
9744 /* ADDW or SUBW.  */
9745
9746 static void
9747 do_t_add_sub_w (void)
9748 {
9749   int Rd, Rn;
9750
9751   Rd = inst.operands[0].reg;
9752   Rn = inst.operands[1].reg;
9753
9754   /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
9755      is the SP-{plus,minus}-immediate form of the instruction.  */
9756   if (Rn == REG_SP)
9757     constraint (Rd == REG_PC, BAD_PC);
9758   else
9759     reject_bad_reg (Rd);
9760
9761   inst.instruction |= (Rn << 16) | (Rd << 8);
9762   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9763 }
9764
9765 /* Parse an add or subtract instruction.  We get here with inst.instruction
9766    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
9767
9768 static void
9769 do_t_add_sub (void)
9770 {
9771   int Rd, Rs, Rn;
9772
9773   Rd = inst.operands[0].reg;
9774   Rs = (inst.operands[1].present
9775         ? inst.operands[1].reg    /* Rd, Rs, foo */
9776         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9777
9778   if (Rd == REG_PC)
9779     set_it_insn_type_last ();
9780
9781   if (unified_syntax)
9782     {
9783       bfd_boolean flags;
9784       bfd_boolean narrow;
9785       int opcode;
9786
9787       flags = (inst.instruction == T_MNEM_adds
9788                || inst.instruction == T_MNEM_subs);
9789       if (flags)
9790         narrow = !in_it_block ();
9791       else
9792         narrow = in_it_block ();
9793       if (!inst.operands[2].isreg)
9794         {
9795           int add;
9796
9797           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9798
9799           add = (inst.instruction == T_MNEM_add
9800                  || inst.instruction == T_MNEM_adds);
9801           opcode = 0;
9802           if (inst.size_req != 4)
9803             {
9804               /* Attempt to use a narrow opcode, with relaxation if
9805                  appropriate.  */
9806               if (Rd == REG_SP && Rs == REG_SP && !flags)
9807                 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
9808               else if (Rd <= 7 && Rs == REG_SP && add && !flags)
9809                 opcode = T_MNEM_add_sp;
9810               else if (Rd <= 7 && Rs == REG_PC && add && !flags)
9811                 opcode = T_MNEM_add_pc;
9812               else if (Rd <= 7 && Rs <= 7 && narrow)
9813                 {
9814                   if (flags)
9815                     opcode = add ? T_MNEM_addis : T_MNEM_subis;
9816                   else
9817                     opcode = add ? T_MNEM_addi : T_MNEM_subi;
9818                 }
9819               if (opcode)
9820                 {
9821                   inst.instruction = THUMB_OP16(opcode);
9822                   inst.instruction |= (Rd << 4) | Rs;
9823                   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9824                   if (inst.size_req != 2)
9825                     inst.relax = opcode;
9826                 }
9827               else
9828                 constraint (inst.size_req == 2, BAD_HIREG);
9829             }
9830           if (inst.size_req == 4
9831               || (inst.size_req != 2 && !opcode))
9832             {
9833               if (Rd == REG_PC)
9834                 {
9835                   constraint (add, BAD_PC);
9836                   constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9837                              _("only SUBS PC, LR, #const allowed"));
9838                   constraint (inst.reloc.exp.X_op != O_constant,
9839                               _("expression too complex"));
9840                   constraint (inst.reloc.exp.X_add_number < 0
9841                               || inst.reloc.exp.X_add_number > 0xff,
9842                              _("immediate value out of range"));
9843                   inst.instruction = T2_SUBS_PC_LR
9844                                      | inst.reloc.exp.X_add_number;
9845                   inst.reloc.type = BFD_RELOC_UNUSED;
9846                   return;
9847                 }
9848               else if (Rs == REG_PC)
9849                 {
9850                   /* Always use addw/subw.  */
9851                   inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9852                   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9853                 }
9854               else
9855                 {
9856                   inst.instruction = THUMB_OP32 (inst.instruction);
9857                   inst.instruction = (inst.instruction & 0xe1ffffff)
9858                                      | 0x10000000;
9859                   if (flags)
9860                     inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9861                   else
9862                     inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9863                 }
9864               inst.instruction |= Rd << 8;
9865               inst.instruction |= Rs << 16;
9866             }
9867         }
9868       else
9869         {
9870           unsigned int value = inst.reloc.exp.X_add_number;
9871           unsigned int shift = inst.operands[2].shift_kind;
9872
9873           Rn = inst.operands[2].reg;
9874           /* See if we can do this with a 16-bit instruction.  */
9875           if (!inst.operands[2].shifted && inst.size_req != 4)
9876             {
9877               if (Rd > 7 || Rs > 7 || Rn > 7)
9878                 narrow = FALSE;
9879
9880               if (narrow)
9881                 {
9882                   inst.instruction = ((inst.instruction == T_MNEM_adds
9883                                        || inst.instruction == T_MNEM_add)
9884                                       ? T_OPCODE_ADD_R3
9885                                       : T_OPCODE_SUB_R3);
9886                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9887                   return;
9888                 }
9889
9890               if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
9891                 {
9892                   /* Thumb-1 cores (except v6-M) require at least one high
9893                      register in a narrow non flag setting add.  */
9894                   if (Rd > 7 || Rn > 7
9895                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9896                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
9897                     {
9898                       if (Rd == Rn)
9899                         {
9900                           Rn = Rs;
9901                           Rs = Rd;
9902                         }
9903                       inst.instruction = T_OPCODE_ADD_HI;
9904                       inst.instruction |= (Rd & 8) << 4;
9905                       inst.instruction |= (Rd & 7);
9906                       inst.instruction |= Rn << 3;
9907                       return;
9908                     }
9909                 }
9910             }
9911
9912           constraint (Rd == REG_PC, BAD_PC);
9913           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9914           constraint (Rs == REG_PC, BAD_PC);
9915           reject_bad_reg (Rn);
9916
9917           /* If we get here, it can't be done in 16 bits.  */
9918           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9919                       _("shift must be constant"));
9920           inst.instruction = THUMB_OP32 (inst.instruction);
9921           inst.instruction |= Rd << 8;
9922           inst.instruction |= Rs << 16;
9923           constraint (Rd == REG_SP && Rs == REG_SP && value > 3,
9924                       _("shift value over 3 not allowed in thumb mode"));
9925           constraint (Rd == REG_SP && Rs == REG_SP && shift != SHIFT_LSL,
9926                       _("only LSL shift allowed in thumb mode"));
9927           encode_thumb32_shifted_operand (2);
9928         }
9929     }
9930   else
9931     {
9932       constraint (inst.instruction == T_MNEM_adds
9933                   || inst.instruction == T_MNEM_subs,
9934                   BAD_THUMB32);
9935
9936       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
9937         {
9938           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9939                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9940                       BAD_HIREG);
9941
9942           inst.instruction = (inst.instruction == T_MNEM_add
9943                               ? 0x0000 : 0x8000);
9944           inst.instruction |= (Rd << 4) | Rs;
9945           inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9946           return;
9947         }
9948
9949       Rn = inst.operands[2].reg;
9950       constraint (inst.operands[2].shifted, _("unshifted register required"));
9951
9952       /* We now have Rd, Rs, and Rn set to registers.  */
9953       if (Rd > 7 || Rs > 7 || Rn > 7)
9954         {
9955           /* Can't do this for SUB.      */
9956           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9957           inst.instruction = T_OPCODE_ADD_HI;
9958           inst.instruction |= (Rd & 8) << 4;
9959           inst.instruction |= (Rd & 7);
9960           if (Rs == Rd)
9961             inst.instruction |= Rn << 3;
9962           else if (Rn == Rd)
9963             inst.instruction |= Rs << 3;
9964           else
9965             constraint (1, _("dest must overlap one source register"));
9966         }
9967       else
9968         {
9969           inst.instruction = (inst.instruction == T_MNEM_add
9970                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9971           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9972         }
9973     }
9974 }
9975
9976 static void
9977 do_t_adr (void)
9978 {
9979   unsigned Rd;
9980
9981   Rd = inst.operands[0].reg;
9982   reject_bad_reg (Rd);
9983
9984   if (unified_syntax && inst.size_req == 0 && Rd <= 7)
9985     {
9986       /* Defer to section relaxation.  */
9987       inst.relax = inst.instruction;
9988       inst.instruction = THUMB_OP16 (inst.instruction);
9989       inst.instruction |= Rd << 4;
9990     }
9991   else if (unified_syntax && inst.size_req != 2)
9992     {
9993       /* Generate a 32-bit opcode.  */
9994       inst.instruction = THUMB_OP32 (inst.instruction);
9995       inst.instruction |= Rd << 8;
9996       inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9997       inst.reloc.pc_rel = 1;
9998     }
9999   else
10000     {
10001       /* Generate a 16-bit opcode.  */
10002       inst.instruction = THUMB_OP16 (inst.instruction);
10003       inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
10004       inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
10005       inst.reloc.pc_rel = 1;
10006
10007       inst.instruction |= Rd << 4;
10008     }
10009 }
10010
10011 /* Arithmetic instructions for which there is just one 16-bit
10012    instruction encoding, and it allows only two low registers.
10013    For maximal compatibility with ARM syntax, we allow three register
10014    operands even when Thumb-32 instructions are not available, as long
10015    as the first two are identical.  For instance, both "sbc r0,r1" and
10016    "sbc r0,r0,r1" are allowed.  */
10017 static void
10018 do_t_arit3 (void)
10019 {
10020   int Rd, Rs, Rn;
10021
10022   Rd = inst.operands[0].reg;
10023   Rs = (inst.operands[1].present
10024         ? inst.operands[1].reg    /* Rd, Rs, foo */
10025         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
10026   Rn = inst.operands[2].reg;
10027
10028   reject_bad_reg (Rd);
10029   reject_bad_reg (Rs);
10030   if (inst.operands[2].isreg)
10031     reject_bad_reg (Rn);
10032
10033   if (unified_syntax)
10034     {
10035       if (!inst.operands[2].isreg)
10036         {
10037           /* For an immediate, we always generate a 32-bit opcode;
10038              section relaxation will shrink it later if possible.  */
10039           inst.instruction = THUMB_OP32 (inst.instruction);
10040           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10041           inst.instruction |= Rd << 8;
10042           inst.instruction |= Rs << 16;
10043           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10044         }
10045       else
10046         {
10047           bfd_boolean narrow;
10048
10049           /* See if we can do this with a 16-bit instruction.  */
10050           if (THUMB_SETS_FLAGS (inst.instruction))
10051             narrow = !in_it_block ();
10052           else
10053             narrow = in_it_block ();
10054
10055           if (Rd > 7 || Rn > 7 || Rs > 7)
10056             narrow = FALSE;
10057           if (inst.operands[2].shifted)
10058             narrow = FALSE;
10059           if (inst.size_req == 4)
10060             narrow = FALSE;
10061
10062           if (narrow
10063               && Rd == Rs)
10064             {
10065               inst.instruction = THUMB_OP16 (inst.instruction);
10066               inst.instruction |= Rd;
10067               inst.instruction |= Rn << 3;
10068               return;
10069             }
10070
10071           /* If we get here, it can't be done in 16 bits.  */
10072           constraint (inst.operands[2].shifted
10073                       && inst.operands[2].immisreg,
10074                       _("shift must be constant"));
10075           inst.instruction = THUMB_OP32 (inst.instruction);
10076           inst.instruction |= Rd << 8;
10077           inst.instruction |= Rs << 16;
10078           encode_thumb32_shifted_operand (2);
10079         }
10080     }
10081   else
10082     {
10083       /* On its face this is a lie - the instruction does set the
10084          flags.  However, the only supported mnemonic in this mode
10085          says it doesn't.  */
10086       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
10087
10088       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
10089                   _("unshifted register required"));
10090       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
10091       constraint (Rd != Rs,
10092                   _("dest and source1 must be the same register"));
10093
10094       inst.instruction = THUMB_OP16 (inst.instruction);
10095       inst.instruction |= Rd;
10096       inst.instruction |= Rn << 3;
10097     }
10098 }
10099
10100 /* Similarly, but for instructions where the arithmetic operation is
10101    commutative, so we can allow either of them to be different from
10102    the destination operand in a 16-bit instruction.  For instance, all
10103    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
10104    accepted.  */
10105 static void
10106 do_t_arit3c (void)
10107 {
10108   int Rd, Rs, Rn;
10109
10110   Rd = inst.operands[0].reg;
10111   Rs = (inst.operands[1].present
10112         ? inst.operands[1].reg    /* Rd, Rs, foo */
10113         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
10114   Rn = inst.operands[2].reg;
10115
10116   reject_bad_reg (Rd);
10117   reject_bad_reg (Rs);
10118   if (inst.operands[2].isreg)
10119     reject_bad_reg (Rn);
10120
10121   if (unified_syntax)
10122     {
10123       if (!inst.operands[2].isreg)
10124         {
10125           /* For an immediate, we always generate a 32-bit opcode;
10126              section relaxation will shrink it later if possible.  */
10127           inst.instruction = THUMB_OP32 (inst.instruction);
10128           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10129           inst.instruction |= Rd << 8;
10130           inst.instruction |= Rs << 16;
10131           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10132         }
10133       else
10134         {
10135           bfd_boolean narrow;
10136
10137           /* See if we can do this with a 16-bit instruction.  */
10138           if (THUMB_SETS_FLAGS (inst.instruction))
10139             narrow = !in_it_block ();
10140           else
10141             narrow = in_it_block ();
10142
10143           if (Rd > 7 || Rn > 7 || Rs > 7)
10144             narrow = FALSE;
10145           if (inst.operands[2].shifted)
10146             narrow = FALSE;
10147           if (inst.size_req == 4)
10148             narrow = FALSE;
10149
10150           if (narrow)
10151             {
10152               if (Rd == Rs)
10153                 {
10154                   inst.instruction = THUMB_OP16 (inst.instruction);
10155                   inst.instruction |= Rd;
10156                   inst.instruction |= Rn << 3;
10157                   return;
10158                 }
10159               if (Rd == Rn)
10160                 {
10161                   inst.instruction = THUMB_OP16 (inst.instruction);
10162                   inst.instruction |= Rd;
10163                   inst.instruction |= Rs << 3;
10164                   return;
10165                 }
10166             }
10167
10168           /* If we get here, it can't be done in 16 bits.  */
10169           constraint (inst.operands[2].shifted
10170                       && inst.operands[2].immisreg,
10171                       _("shift must be constant"));
10172           inst.instruction = THUMB_OP32 (inst.instruction);
10173           inst.instruction |= Rd << 8;
10174           inst.instruction |= Rs << 16;
10175           encode_thumb32_shifted_operand (2);
10176         }
10177     }
10178   else
10179     {
10180       /* On its face this is a lie - the instruction does set the
10181          flags.  However, the only supported mnemonic in this mode
10182          says it doesn't.  */
10183       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
10184
10185       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
10186                   _("unshifted register required"));
10187       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
10188
10189       inst.instruction = THUMB_OP16 (inst.instruction);
10190       inst.instruction |= Rd;
10191
10192       if (Rd == Rs)
10193         inst.instruction |= Rn << 3;
10194       else if (Rd == Rn)
10195         inst.instruction |= Rs << 3;
10196       else
10197         constraint (1, _("dest must overlap one source register"));
10198     }
10199 }
10200
10201 static void
10202 do_t_bfc (void)
10203 {
10204   unsigned Rd;
10205   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
10206   constraint (msb > 32, _("bit-field extends past end of register"));
10207   /* The instruction encoding stores the LSB and MSB,
10208      not the LSB and width.  */
10209   Rd = inst.operands[0].reg;
10210   reject_bad_reg (Rd);
10211   inst.instruction |= Rd << 8;
10212   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
10213   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
10214   inst.instruction |= msb - 1;
10215 }
10216
10217 static void
10218 do_t_bfi (void)
10219 {
10220   int Rd, Rn;
10221   unsigned int msb;
10222
10223   Rd = inst.operands[0].reg;
10224   reject_bad_reg (Rd);
10225
10226   /* #0 in second position is alternative syntax for bfc, which is
10227      the same instruction but with REG_PC in the Rm field.  */
10228   if (!inst.operands[1].isreg)
10229     Rn = REG_PC;
10230   else
10231     {
10232       Rn = inst.operands[1].reg;
10233       reject_bad_reg (Rn);
10234     }
10235
10236   msb = inst.operands[2].imm + inst.operands[3].imm;
10237   constraint (msb > 32, _("bit-field extends past end of register"));
10238   /* The instruction encoding stores the LSB and MSB,
10239      not the LSB and width.  */
10240   inst.instruction |= Rd << 8;
10241   inst.instruction |= Rn << 16;
10242   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10243   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10244   inst.instruction |= msb - 1;
10245 }
10246
10247 static void
10248 do_t_bfx (void)
10249 {
10250   unsigned Rd, Rn;
10251
10252   Rd = inst.operands[0].reg;
10253   Rn = inst.operands[1].reg;
10254
10255   reject_bad_reg (Rd);
10256   reject_bad_reg (Rn);
10257
10258   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
10259               _("bit-field extends past end of register"));
10260   inst.instruction |= Rd << 8;
10261   inst.instruction |= Rn << 16;
10262   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10263   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10264   inst.instruction |= inst.operands[3].imm - 1;
10265 }
10266
10267 /* ARM V5 Thumb BLX (argument parse)
10268         BLX <target_addr>       which is BLX(1)
10269         BLX <Rm>                which is BLX(2)
10270    Unfortunately, there are two different opcodes for this mnemonic.
10271    So, the insns[].value is not used, and the code here zaps values
10272         into inst.instruction.
10273
10274    ??? How to take advantage of the additional two bits of displacement
10275    available in Thumb32 mode?  Need new relocation?  */
10276
10277 static void
10278 do_t_blx (void)
10279 {
10280   set_it_insn_type_last ();
10281
10282   if (inst.operands[0].isreg)
10283     {
10284       constraint (inst.operands[0].reg == REG_PC, BAD_PC);
10285       /* We have a register, so this is BLX(2).  */
10286       inst.instruction |= inst.operands[0].reg << 3;
10287     }
10288   else
10289     {
10290       /* No register.  This must be BLX(1).  */
10291       inst.instruction = 0xf000e800;
10292       encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
10293     }
10294 }
10295
10296 static void
10297 do_t_branch (void)
10298 {
10299   int opcode;
10300   int cond;
10301   int reloc;
10302
10303   cond = inst.cond;
10304   set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
10305
10306   if (in_it_block ())
10307     {
10308       /* Conditional branches inside IT blocks are encoded as unconditional
10309          branches.  */
10310       cond = COND_ALWAYS;
10311     }
10312   else
10313     cond = inst.cond;
10314
10315   if (cond != COND_ALWAYS)
10316     opcode = T_MNEM_bcond;
10317   else
10318     opcode = inst.instruction;
10319
10320   if (unified_syntax
10321       && (inst.size_req == 4
10322           || (inst.size_req != 2
10323               && (inst.operands[0].hasreloc
10324                   || inst.reloc.exp.X_op == O_constant))))
10325     {
10326       inst.instruction = THUMB_OP32(opcode);
10327       if (cond == COND_ALWAYS)
10328         reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
10329       else
10330         {
10331           gas_assert (cond != 0xF);
10332           inst.instruction |= cond << 22;
10333           reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
10334         }
10335     }
10336   else
10337     {
10338       inst.instruction = THUMB_OP16(opcode);
10339       if (cond == COND_ALWAYS)
10340         reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
10341       else
10342         {
10343           inst.instruction |= cond << 8;
10344           reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
10345         }
10346       /* Allow section relaxation.  */
10347       if (unified_syntax && inst.size_req != 2)
10348         inst.relax = opcode;
10349     }
10350   inst.reloc.type = reloc;
10351   inst.reloc.pc_rel = 1;
10352 }
10353
10354 /* Actually do the work for Thumb state bkpt and hlt.  The only difference
10355    between the two is the maximum immediate allowed - which is passed in
10356    RANGE.  */
10357 static void
10358 do_t_bkpt_hlt1 (int range)
10359 {
10360   constraint (inst.cond != COND_ALWAYS,
10361               _("instruction is always unconditional"));
10362   if (inst.operands[0].present)
10363     {
10364       constraint (inst.operands[0].imm > range,
10365                   _("immediate value out of range"));
10366       inst.instruction |= inst.operands[0].imm;
10367     }
10368
10369   set_it_insn_type (NEUTRAL_IT_INSN);
10370 }
10371
10372 static void
10373 do_t_hlt (void)
10374 {
10375   do_t_bkpt_hlt1 (63);
10376 }
10377
10378 static void
10379 do_t_bkpt (void)
10380 {
10381   do_t_bkpt_hlt1 (255);
10382 }
10383
10384 static void
10385 do_t_branch23 (void)
10386 {
10387   set_it_insn_type_last ();
10388   encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
10389
10390   /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
10391      this file.  We used to simply ignore the PLT reloc type here --
10392      the branch encoding is now needed to deal with TLSCALL relocs.
10393      So if we see a PLT reloc now, put it back to how it used to be to
10394      keep the preexisting behaviour.  */
10395   if (inst.reloc.type == BFD_RELOC_ARM_PLT32)
10396     inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
10397
10398 #if defined(OBJ_COFF)
10399   /* If the destination of the branch is a defined symbol which does not have
10400      the THUMB_FUNC attribute, then we must be calling a function which has
10401      the (interfacearm) attribute.  We look for the Thumb entry point to that
10402      function and change the branch to refer to that function instead.  */
10403   if (   inst.reloc.exp.X_op == O_symbol
10404       && inst.reloc.exp.X_add_symbol != NULL
10405       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
10406       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
10407     inst.reloc.exp.X_add_symbol =
10408       find_real_start (inst.reloc.exp.X_add_symbol);
10409 #endif
10410 }
10411
10412 static void
10413 do_t_bx (void)
10414 {
10415   set_it_insn_type_last ();
10416   inst.instruction |= inst.operands[0].reg << 3;
10417   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
10418      should cause the alignment to be checked once it is known.  This is
10419      because BX PC only works if the instruction is word aligned.  */
10420 }
10421
10422 static void
10423 do_t_bxj (void)
10424 {
10425   int Rm;
10426
10427   set_it_insn_type_last ();
10428   Rm = inst.operands[0].reg;
10429   reject_bad_reg (Rm);
10430   inst.instruction |= Rm << 16;
10431 }
10432
10433 static void
10434 do_t_clz (void)
10435 {
10436   unsigned Rd;
10437   unsigned Rm;
10438
10439   Rd = inst.operands[0].reg;
10440   Rm = inst.operands[1].reg;
10441
10442   reject_bad_reg (Rd);
10443   reject_bad_reg (Rm);
10444
10445   inst.instruction |= Rd << 8;
10446   inst.instruction |= Rm << 16;
10447   inst.instruction |= Rm;
10448 }
10449
10450 static void
10451 do_t_cps (void)
10452 {
10453   set_it_insn_type (OUTSIDE_IT_INSN);
10454   inst.instruction |= inst.operands[0].imm;
10455 }
10456
10457 static void
10458 do_t_cpsi (void)
10459 {
10460   set_it_insn_type (OUTSIDE_IT_INSN);
10461   if (unified_syntax
10462       && (inst.operands[1].present || inst.size_req == 4)
10463       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
10464     {
10465       unsigned int imod = (inst.instruction & 0x0030) >> 4;
10466       inst.instruction = 0xf3af8000;
10467       inst.instruction |= imod << 9;
10468       inst.instruction |= inst.operands[0].imm << 5;
10469       if (inst.operands[1].present)
10470         inst.instruction |= 0x100 | inst.operands[1].imm;
10471     }
10472   else
10473     {
10474       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
10475                   && (inst.operands[0].imm & 4),
10476                   _("selected processor does not support 'A' form "
10477                     "of this instruction"));
10478       constraint (inst.operands[1].present || inst.size_req == 4,
10479                   _("Thumb does not support the 2-argument "
10480                     "form of this instruction"));
10481       inst.instruction |= inst.operands[0].imm;
10482     }
10483 }
10484
10485 /* THUMB CPY instruction (argument parse).  */
10486
10487 static void
10488 do_t_cpy (void)
10489 {
10490   if (inst.size_req == 4)
10491     {
10492       inst.instruction = THUMB_OP32 (T_MNEM_mov);
10493       inst.instruction |= inst.operands[0].reg << 8;
10494       inst.instruction |= inst.operands[1].reg;
10495     }
10496   else
10497     {
10498       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
10499       inst.instruction |= (inst.operands[0].reg & 0x7);
10500       inst.instruction |= inst.operands[1].reg << 3;
10501     }
10502 }
10503
10504 static void
10505 do_t_cbz (void)
10506 {
10507   set_it_insn_type (OUTSIDE_IT_INSN);
10508   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10509   inst.instruction |= inst.operands[0].reg;
10510   inst.reloc.pc_rel = 1;
10511   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
10512 }
10513
10514 static void
10515 do_t_dbg (void)
10516 {
10517   inst.instruction |= inst.operands[0].imm;
10518 }
10519
10520 static void
10521 do_t_div (void)
10522 {
10523   unsigned Rd, Rn, Rm;
10524
10525   Rd = inst.operands[0].reg;
10526   Rn = (inst.operands[1].present
10527         ? inst.operands[1].reg : Rd);
10528   Rm = inst.operands[2].reg;
10529
10530   reject_bad_reg (Rd);
10531   reject_bad_reg (Rn);
10532   reject_bad_reg (Rm);
10533
10534   inst.instruction |= Rd << 8;
10535   inst.instruction |= Rn << 16;
10536   inst.instruction |= Rm;
10537 }
10538
10539 static void
10540 do_t_hint (void)
10541 {
10542   if (unified_syntax && inst.size_req == 4)
10543     inst.instruction = THUMB_OP32 (inst.instruction);
10544   else
10545     inst.instruction = THUMB_OP16 (inst.instruction);
10546 }
10547
10548 static void
10549 do_t_it (void)
10550 {
10551   unsigned int cond = inst.operands[0].imm;
10552
10553   set_it_insn_type (IT_INSN);
10554   now_it.mask = (inst.instruction & 0xf) | 0x10;
10555   now_it.cc = cond;
10556   now_it.warn_deprecated = FALSE;
10557
10558   /* If the condition is a negative condition, invert the mask.  */
10559   if ((cond & 0x1) == 0x0)
10560     {
10561       unsigned int mask = inst.instruction & 0x000f;
10562
10563       if ((mask & 0x7) == 0)
10564         {
10565           /* No conversion needed.  */
10566           now_it.block_length = 1;
10567         }
10568       else if ((mask & 0x3) == 0)
10569         {
10570           mask ^= 0x8;
10571           now_it.block_length = 2;
10572         }
10573       else if ((mask & 0x1) == 0)
10574         {
10575           mask ^= 0xC;
10576           now_it.block_length = 3;
10577         }
10578       else
10579         {
10580           mask ^= 0xE;
10581           now_it.block_length = 4;
10582         }
10583
10584       inst.instruction &= 0xfff0;
10585       inst.instruction |= mask;
10586     }
10587
10588   inst.instruction |= cond << 4;
10589 }
10590
10591 /* Helper function used for both push/pop and ldm/stm.  */
10592 static void
10593 encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
10594 {
10595   bfd_boolean load;
10596
10597   load = (inst.instruction & (1 << 20)) != 0;
10598
10599   if (mask & (1 << 13))
10600     inst.error =  _("SP not allowed in register list");
10601
10602   if ((mask & (1 << base)) != 0
10603       && writeback)
10604     inst.error = _("having the base register in the register list when "
10605                    "using write back is UNPREDICTABLE");
10606
10607   if (load)
10608     {
10609       if (mask & (1 << 15))
10610         {
10611           if (mask & (1 << 14))
10612             inst.error = _("LR and PC should not both be in register list");
10613           else
10614             set_it_insn_type_last ();
10615         }
10616     }
10617   else
10618     {
10619       if (mask & (1 << 15))
10620         inst.error = _("PC not allowed in register list");
10621     }
10622
10623   if ((mask & (mask - 1)) == 0)
10624     {
10625       /* Single register transfers implemented as str/ldr.  */
10626       if (writeback)
10627         {
10628           if (inst.instruction & (1 << 23))
10629             inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
10630           else
10631             inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
10632         }
10633       else
10634         {
10635           if (inst.instruction & (1 << 23))
10636             inst.instruction = 0x00800000; /* ia -> [base] */
10637           else
10638             inst.instruction = 0x00000c04; /* db -> [base, #-4] */
10639         }
10640
10641       inst.instruction |= 0xf8400000;
10642       if (load)
10643         inst.instruction |= 0x00100000;
10644
10645       mask = ffs (mask) - 1;
10646       mask <<= 12;
10647     }
10648   else if (writeback)
10649     inst.instruction |= WRITE_BACK;
10650
10651   inst.instruction |= mask;
10652   inst.instruction |= base << 16;
10653 }
10654
10655 static void
10656 do_t_ldmstm (void)
10657 {
10658   /* This really doesn't seem worth it.  */
10659   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10660               _("expression too complex"));
10661   constraint (inst.operands[1].writeback,
10662               _("Thumb load/store multiple does not support {reglist}^"));
10663
10664   if (unified_syntax)
10665     {
10666       bfd_boolean narrow;
10667       unsigned mask;
10668
10669       narrow = FALSE;
10670       /* See if we can use a 16-bit instruction.  */
10671       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
10672           && inst.size_req != 4
10673           && !(inst.operands[1].imm & ~0xff))
10674         {
10675           mask = 1 << inst.operands[0].reg;
10676
10677           if (inst.operands[0].reg <= 7)
10678             {
10679               if (inst.instruction == T_MNEM_stmia
10680                   ? inst.operands[0].writeback
10681                   : (inst.operands[0].writeback
10682                      == !(inst.operands[1].imm & mask)))
10683                 {
10684                   if (inst.instruction == T_MNEM_stmia
10685                       && (inst.operands[1].imm & mask)
10686                       && (inst.operands[1].imm & (mask - 1)))
10687                     as_warn (_("value stored for r%d is UNKNOWN"),
10688                              inst.operands[0].reg);
10689
10690                   inst.instruction = THUMB_OP16 (inst.instruction);
10691                   inst.instruction |= inst.operands[0].reg << 8;
10692                   inst.instruction |= inst.operands[1].imm;
10693                   narrow = TRUE;
10694                 }
10695               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10696                 {
10697                   /* This means 1 register in reg list one of 3 situations:
10698                      1. Instruction is stmia, but without writeback.
10699                      2. lmdia without writeback, but with Rn not in
10700                         reglist.
10701                      3. ldmia with writeback, but with Rn in reglist.
10702                      Case 3 is UNPREDICTABLE behaviour, so we handle
10703                      case 1 and 2 which can be converted into a 16-bit
10704                      str or ldr. The SP cases are handled below.  */
10705                   unsigned long opcode;
10706                   /* First, record an error for Case 3.  */
10707                   if (inst.operands[1].imm & mask
10708                       && inst.operands[0].writeback)
10709                     inst.error =
10710                         _("having the base register in the register list when "
10711                           "using write back is UNPREDICTABLE");
10712
10713                   opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str
10714                                                              : T_MNEM_ldr);
10715                   inst.instruction = THUMB_OP16 (opcode);
10716                   inst.instruction |= inst.operands[0].reg << 3;
10717                   inst.instruction |= (ffs (inst.operands[1].imm)-1);
10718                   narrow = TRUE;
10719                 }
10720             }
10721           else if (inst.operands[0] .reg == REG_SP)
10722             {
10723               if (inst.operands[0].writeback)
10724                 {
10725                   inst.instruction =
10726                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10727                                     ? T_MNEM_push : T_MNEM_pop);
10728                   inst.instruction |= inst.operands[1].imm;
10729                   narrow = TRUE;
10730                 }
10731               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10732                 {
10733                   inst.instruction =
10734                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10735                                     ? T_MNEM_str_sp : T_MNEM_ldr_sp);
10736                   inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
10737                   narrow = TRUE;
10738                 }
10739             }
10740         }
10741
10742       if (!narrow)
10743         {
10744           if (inst.instruction < 0xffff)
10745             inst.instruction = THUMB_OP32 (inst.instruction);
10746
10747           encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
10748                                 inst.operands[0].writeback);
10749         }
10750     }
10751   else
10752     {
10753       constraint (inst.operands[0].reg > 7
10754                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
10755       constraint (inst.instruction != T_MNEM_ldmia
10756                   && inst.instruction != T_MNEM_stmia,
10757                   _("Thumb-2 instruction only valid in unified syntax"));
10758       if (inst.instruction == T_MNEM_stmia)
10759         {
10760           if (!inst.operands[0].writeback)
10761             as_warn (_("this instruction will write back the base register"));
10762           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
10763               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
10764             as_warn (_("value stored for r%d is UNKNOWN"),
10765                      inst.operands[0].reg);
10766         }
10767       else
10768         {
10769           if (!inst.operands[0].writeback
10770               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
10771             as_warn (_("this instruction will write back the base register"));
10772           else if (inst.operands[0].writeback
10773                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
10774             as_warn (_("this instruction will not write back the base register"));
10775         }
10776
10777       inst.instruction = THUMB_OP16 (inst.instruction);
10778       inst.instruction |= inst.operands[0].reg << 8;
10779       inst.instruction |= inst.operands[1].imm;
10780     }
10781 }
10782
10783 static void
10784 do_t_ldrex (void)
10785 {
10786   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
10787               || inst.operands[1].postind || inst.operands[1].writeback
10788               || inst.operands[1].immisreg || inst.operands[1].shifted
10789               || inst.operands[1].negative,
10790               BAD_ADDR_MODE);
10791
10792   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
10793
10794   inst.instruction |= inst.operands[0].reg << 12;
10795   inst.instruction |= inst.operands[1].reg << 16;
10796   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10797 }
10798
10799 static void
10800 do_t_ldrexd (void)
10801 {
10802   if (!inst.operands[1].present)
10803     {
10804       constraint (inst.operands[0].reg == REG_LR,
10805                   _("r14 not allowed as first register "
10806                     "when second register is omitted"));
10807       inst.operands[1].reg = inst.operands[0].reg + 1;
10808     }
10809   constraint (inst.operands[0].reg == inst.operands[1].reg,
10810               BAD_OVERLAP);
10811
10812   inst.instruction |= inst.operands[0].reg << 12;
10813   inst.instruction |= inst.operands[1].reg << 8;
10814   inst.instruction |= inst.operands[2].reg << 16;
10815 }
10816
10817 static void
10818 do_t_ldst (void)
10819 {
10820   unsigned long opcode;
10821   int Rn;
10822
10823   if (inst.operands[0].isreg
10824       && !inst.operands[0].preind
10825       && inst.operands[0].reg == REG_PC)
10826     set_it_insn_type_last ();
10827
10828   opcode = inst.instruction;
10829   if (unified_syntax)
10830     {
10831       if (!inst.operands[1].isreg)
10832         {
10833           if (opcode <= 0xffff)
10834             inst.instruction = THUMB_OP32 (opcode);
10835           if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10836             return;
10837         }
10838       if (inst.operands[1].isreg
10839           && !inst.operands[1].writeback
10840           && !inst.operands[1].shifted && !inst.operands[1].postind
10841           && !inst.operands[1].negative && inst.operands[0].reg <= 7
10842           && opcode <= 0xffff
10843           && inst.size_req != 4)
10844         {
10845           /* Insn may have a 16-bit form.  */
10846           Rn = inst.operands[1].reg;
10847           if (inst.operands[1].immisreg)
10848             {
10849               inst.instruction = THUMB_OP16 (opcode);
10850               /* [Rn, Rik] */
10851               if (Rn <= 7 && inst.operands[1].imm <= 7)
10852                 goto op16;
10853               else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
10854                 reject_bad_reg (inst.operands[1].imm);
10855             }
10856           else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
10857                     && opcode != T_MNEM_ldrsb)
10858                    || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
10859                    || (Rn == REG_SP && opcode == T_MNEM_str))
10860             {
10861               /* [Rn, #const] */
10862               if (Rn > 7)
10863                 {
10864                   if (Rn == REG_PC)
10865                     {
10866                       if (inst.reloc.pc_rel)
10867                         opcode = T_MNEM_ldr_pc2;
10868                       else
10869                         opcode = T_MNEM_ldr_pc;
10870                     }
10871                   else
10872                     {
10873                       if (opcode == T_MNEM_ldr)
10874                         opcode = T_MNEM_ldr_sp;
10875                       else
10876                         opcode = T_MNEM_str_sp;
10877                     }
10878                   inst.instruction = inst.operands[0].reg << 8;
10879                 }
10880               else
10881                 {
10882                   inst.instruction = inst.operands[0].reg;
10883                   inst.instruction |= inst.operands[1].reg << 3;
10884                 }
10885               inst.instruction |= THUMB_OP16 (opcode);
10886               if (inst.size_req == 2)
10887                 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10888               else
10889                 inst.relax = opcode;
10890               return;
10891             }
10892         }
10893       /* Definitely a 32-bit variant.  */
10894
10895       /* Warning for Erratum 752419.  */
10896       if (opcode == T_MNEM_ldr
10897           && inst.operands[0].reg == REG_SP
10898           && inst.operands[1].writeback == 1
10899           && !inst.operands[1].immisreg)
10900         {
10901           if (no_cpu_selected ()
10902               || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
10903                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
10904                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
10905             as_warn (_("This instruction may be unpredictable "
10906                        "if executed on M-profile cores "
10907                        "with interrupts enabled."));
10908         }
10909
10910       /* Do some validations regarding addressing modes.  */
10911       if (inst.operands[1].immisreg)
10912         reject_bad_reg (inst.operands[1].imm);
10913
10914       constraint (inst.operands[1].writeback == 1
10915                   && inst.operands[0].reg == inst.operands[1].reg,
10916                   BAD_OVERLAP);
10917
10918       inst.instruction = THUMB_OP32 (opcode);
10919       inst.instruction |= inst.operands[0].reg << 12;
10920       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
10921       check_ldr_r15_aligned ();
10922       return;
10923     }
10924
10925   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10926
10927   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
10928     {
10929       /* Only [Rn,Rm] is acceptable.  */
10930       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10931       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10932                   || inst.operands[1].postind || inst.operands[1].shifted
10933                   || inst.operands[1].negative,
10934                   _("Thumb does not support this addressing mode"));
10935       inst.instruction = THUMB_OP16 (inst.instruction);
10936       goto op16;
10937     }
10938
10939   inst.instruction = THUMB_OP16 (inst.instruction);
10940   if (!inst.operands[1].isreg)
10941     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10942       return;
10943
10944   constraint (!inst.operands[1].preind
10945               || inst.operands[1].shifted
10946               || inst.operands[1].writeback,
10947               _("Thumb does not support this addressing mode"));
10948   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
10949     {
10950       constraint (inst.instruction & 0x0600,
10951                   _("byte or halfword not valid for base register"));
10952       constraint (inst.operands[1].reg == REG_PC
10953                   && !(inst.instruction & THUMB_LOAD_BIT),
10954                   _("r15 based store not allowed"));
10955       constraint (inst.operands[1].immisreg,
10956                   _("invalid base register for register offset"));
10957
10958       if (inst.operands[1].reg == REG_PC)
10959         inst.instruction = T_OPCODE_LDR_PC;
10960       else if (inst.instruction & THUMB_LOAD_BIT)
10961         inst.instruction = T_OPCODE_LDR_SP;
10962       else
10963         inst.instruction = T_OPCODE_STR_SP;
10964
10965       inst.instruction |= inst.operands[0].reg << 8;
10966       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10967       return;
10968     }
10969
10970   constraint (inst.operands[1].reg > 7, BAD_HIREG);
10971   if (!inst.operands[1].immisreg)
10972     {
10973       /* Immediate offset.  */
10974       inst.instruction |= inst.operands[0].reg;
10975       inst.instruction |= inst.operands[1].reg << 3;
10976       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10977       return;
10978     }
10979
10980   /* Register offset.  */
10981   constraint (inst.operands[1].imm > 7, BAD_HIREG);
10982   constraint (inst.operands[1].negative,
10983               _("Thumb does not support this addressing mode"));
10984
10985  op16:
10986   switch (inst.instruction)
10987     {
10988     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10989     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10990     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10991     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10992     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10993     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10994     case 0x5600 /* ldrsb */:
10995     case 0x5e00 /* ldrsh */: break;
10996     default: abort ();
10997     }
10998
10999   inst.instruction |= inst.operands[0].reg;
11000   inst.instruction |= inst.operands[1].reg << 3;
11001   inst.instruction |= inst.operands[1].imm << 6;
11002 }
11003
11004 static void
11005 do_t_ldstd (void)
11006 {
11007   if (!inst.operands[1].present)
11008     {
11009       inst.operands[1].reg = inst.operands[0].reg + 1;
11010       constraint (inst.operands[0].reg == REG_LR,
11011                   _("r14 not allowed here"));
11012       constraint (inst.operands[0].reg == REG_R12,
11013                   _("r12 not allowed here"));
11014     }
11015
11016   if (inst.operands[2].writeback
11017       && (inst.operands[0].reg == inst.operands[2].reg
11018       || inst.operands[1].reg == inst.operands[2].reg))
11019     as_warn (_("base register written back, and overlaps "
11020                "one of transfer registers"));
11021
11022   inst.instruction |= inst.operands[0].reg << 12;
11023   inst.instruction |= inst.operands[1].reg << 8;
11024   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
11025 }
11026
11027 static void
11028 do_t_ldstt (void)
11029 {
11030   inst.instruction |= inst.operands[0].reg << 12;
11031   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
11032 }
11033
11034 static void
11035 do_t_mla (void)
11036 {
11037   unsigned Rd, Rn, Rm, Ra;
11038
11039   Rd = inst.operands[0].reg;
11040   Rn = inst.operands[1].reg;
11041   Rm = inst.operands[2].reg;
11042   Ra = inst.operands[3].reg;
11043
11044   reject_bad_reg (Rd);
11045   reject_bad_reg (Rn);
11046   reject_bad_reg (Rm);
11047   reject_bad_reg (Ra);
11048
11049   inst.instruction |= Rd << 8;
11050   inst.instruction |= Rn << 16;
11051   inst.instruction |= Rm;
11052   inst.instruction |= Ra << 12;
11053 }
11054
11055 static void
11056 do_t_mlal (void)
11057 {
11058   unsigned RdLo, RdHi, Rn, Rm;
11059
11060   RdLo = inst.operands[0].reg;
11061   RdHi = inst.operands[1].reg;
11062   Rn = inst.operands[2].reg;
11063   Rm = inst.operands[3].reg;
11064
11065   reject_bad_reg (RdLo);
11066   reject_bad_reg (RdHi);
11067   reject_bad_reg (Rn);
11068   reject_bad_reg (Rm);
11069
11070   inst.instruction |= RdLo << 12;
11071   inst.instruction |= RdHi << 8;
11072   inst.instruction |= Rn << 16;
11073   inst.instruction |= Rm;
11074 }
11075
11076 static void
11077 do_t_mov_cmp (void)
11078 {
11079   unsigned Rn, Rm;
11080
11081   Rn = inst.operands[0].reg;
11082   Rm = inst.operands[1].reg;
11083
11084   if (Rn == REG_PC)
11085     set_it_insn_type_last ();
11086
11087   if (unified_syntax)
11088     {
11089       int r0off = (inst.instruction == T_MNEM_mov
11090                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
11091       unsigned long opcode;
11092       bfd_boolean narrow;
11093       bfd_boolean low_regs;
11094
11095       low_regs = (Rn <= 7 && Rm <= 7);
11096       opcode = inst.instruction;
11097       if (in_it_block ())
11098         narrow = opcode != T_MNEM_movs;
11099       else
11100         narrow = opcode != T_MNEM_movs || low_regs;
11101       if (inst.size_req == 4
11102           || inst.operands[1].shifted)
11103         narrow = FALSE;
11104
11105       /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
11106       if (opcode == T_MNEM_movs && inst.operands[1].isreg
11107           && !inst.operands[1].shifted
11108           && Rn == REG_PC
11109           && Rm == REG_LR)
11110         {
11111           inst.instruction = T2_SUBS_PC_LR;
11112           return;
11113         }
11114
11115       if (opcode == T_MNEM_cmp)
11116         {
11117           constraint (Rn == REG_PC, BAD_PC);
11118           if (narrow)
11119             {
11120               /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
11121                  but valid.  */
11122               warn_deprecated_sp (Rm);
11123               /* R15 was documented as a valid choice for Rm in ARMv6,
11124                  but as UNPREDICTABLE in ARMv7.  ARM's proprietary
11125                  tools reject R15, so we do too.  */
11126               constraint (Rm == REG_PC, BAD_PC);
11127             }
11128           else
11129             reject_bad_reg (Rm);
11130         }
11131       else if (opcode == T_MNEM_mov
11132                || opcode == T_MNEM_movs)
11133         {
11134           if (inst.operands[1].isreg)
11135             {
11136               if (opcode == T_MNEM_movs)
11137                 {
11138                   reject_bad_reg (Rn);
11139                   reject_bad_reg (Rm);
11140                 }
11141               else if (narrow)
11142                 {
11143                   /* This is mov.n.  */
11144                   if ((Rn == REG_SP || Rn == REG_PC)
11145                       && (Rm == REG_SP || Rm == REG_PC))
11146                     {
11147                       as_warn (_("Use of r%u as a source register is "
11148                                  "deprecated when r%u is the destination "
11149                                  "register."), Rm, Rn);
11150                     }
11151                 }
11152               else
11153                 {
11154                   /* This is mov.w.  */
11155                   constraint (Rn == REG_PC, BAD_PC);
11156                   constraint (Rm == REG_PC, BAD_PC);
11157                   constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
11158                 }
11159             }
11160           else
11161             reject_bad_reg (Rn);
11162         }
11163
11164       if (!inst.operands[1].isreg)
11165         {
11166           /* Immediate operand.  */
11167           if (!in_it_block () && opcode == T_MNEM_mov)
11168             narrow = 0;
11169           if (low_regs && narrow)
11170             {
11171               inst.instruction = THUMB_OP16 (opcode);
11172               inst.instruction |= Rn << 8;
11173               if (inst.size_req == 2)
11174                 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11175               else
11176                 inst.relax = opcode;
11177             }
11178           else
11179             {
11180               inst.instruction = THUMB_OP32 (inst.instruction);
11181               inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11182               inst.instruction |= Rn << r0off;
11183               inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11184             }
11185         }
11186       else if (inst.operands[1].shifted && inst.operands[1].immisreg
11187                && (inst.instruction == T_MNEM_mov
11188                    || inst.instruction == T_MNEM_movs))
11189         {
11190           /* Register shifts are encoded as separate shift instructions.  */
11191           bfd_boolean flags = (inst.instruction == T_MNEM_movs);
11192
11193           if (in_it_block ())
11194             narrow = !flags;
11195           else
11196             narrow = flags;
11197
11198           if (inst.size_req == 4)
11199             narrow = FALSE;
11200
11201           if (!low_regs || inst.operands[1].imm > 7)
11202             narrow = FALSE;
11203
11204           if (Rn != Rm)
11205             narrow = FALSE;
11206
11207           switch (inst.operands[1].shift_kind)
11208             {
11209             case SHIFT_LSL:
11210               opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
11211               break;
11212             case SHIFT_ASR:
11213               opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
11214               break;
11215             case SHIFT_LSR:
11216               opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
11217               break;
11218             case SHIFT_ROR:
11219               opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
11220               break;
11221             default:
11222               abort ();
11223             }
11224
11225           inst.instruction = opcode;
11226           if (narrow)
11227             {
11228               inst.instruction |= Rn;
11229               inst.instruction |= inst.operands[1].imm << 3;
11230             }
11231           else
11232             {
11233               if (flags)
11234                 inst.instruction |= CONDS_BIT;
11235
11236               inst.instruction |= Rn << 8;
11237               inst.instruction |= Rm << 16;
11238               inst.instruction |= inst.operands[1].imm;
11239             }
11240         }
11241       else if (!narrow)
11242         {
11243           /* Some mov with immediate shift have narrow variants.
11244              Register shifts are handled above.  */
11245           if (low_regs && inst.operands[1].shifted
11246               && (inst.instruction == T_MNEM_mov
11247                   || inst.instruction == T_MNEM_movs))
11248             {
11249               if (in_it_block ())
11250                 narrow = (inst.instruction == T_MNEM_mov);
11251               else
11252                 narrow = (inst.instruction == T_MNEM_movs);
11253             }
11254
11255           if (narrow)
11256             {
11257               switch (inst.operands[1].shift_kind)
11258                 {
11259                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11260                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11261                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11262                 default: narrow = FALSE; break;
11263                 }
11264             }
11265
11266           if (narrow)
11267             {
11268               inst.instruction |= Rn;
11269               inst.instruction |= Rm << 3;
11270               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11271             }
11272           else
11273             {
11274               inst.instruction = THUMB_OP32 (inst.instruction);
11275               inst.instruction |= Rn << r0off;
11276               encode_thumb32_shifted_operand (1);
11277             }
11278         }
11279       else
11280         switch (inst.instruction)
11281           {
11282           case T_MNEM_mov:
11283             /* In v4t or v5t a move of two lowregs produces unpredictable
11284                results. Don't allow this.  */
11285             if (low_regs)
11286               {
11287                 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6),
11288                             "MOV Rd, Rs with two low registers is not "
11289                             "permitted on this architecture");
11290                 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
11291                                         arm_ext_v6);
11292               }
11293
11294             inst.instruction = T_OPCODE_MOV_HR;
11295             inst.instruction |= (Rn & 0x8) << 4;
11296             inst.instruction |= (Rn & 0x7);
11297             inst.instruction |= Rm << 3;
11298             break;
11299
11300           case T_MNEM_movs:
11301             /* We know we have low registers at this point.
11302                Generate LSLS Rd, Rs, #0.  */
11303             inst.instruction = T_OPCODE_LSL_I;
11304             inst.instruction |= Rn;
11305             inst.instruction |= Rm << 3;
11306             break;
11307
11308           case T_MNEM_cmp:
11309             if (low_regs)
11310               {
11311                 inst.instruction = T_OPCODE_CMP_LR;
11312                 inst.instruction |= Rn;
11313                 inst.instruction |= Rm << 3;
11314               }
11315             else
11316               {
11317                 inst.instruction = T_OPCODE_CMP_HR;
11318                 inst.instruction |= (Rn & 0x8) << 4;
11319                 inst.instruction |= (Rn & 0x7);
11320                 inst.instruction |= Rm << 3;
11321               }
11322             break;
11323           }
11324       return;
11325     }
11326
11327   inst.instruction = THUMB_OP16 (inst.instruction);
11328
11329   /* PR 10443: Do not silently ignore shifted operands.  */
11330   constraint (inst.operands[1].shifted,
11331               _("shifts in CMP/MOV instructions are only supported in unified syntax"));
11332
11333   if (inst.operands[1].isreg)
11334     {
11335       if (Rn < 8 && Rm < 8)
11336         {
11337           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
11338              since a MOV instruction produces unpredictable results.  */
11339           if (inst.instruction == T_OPCODE_MOV_I8)
11340             inst.instruction = T_OPCODE_ADD_I3;
11341           else
11342             inst.instruction = T_OPCODE_CMP_LR;
11343
11344           inst.instruction |= Rn;
11345           inst.instruction |= Rm << 3;
11346         }
11347       else
11348         {
11349           if (inst.instruction == T_OPCODE_MOV_I8)
11350             inst.instruction = T_OPCODE_MOV_HR;
11351           else
11352             inst.instruction = T_OPCODE_CMP_HR;
11353           do_t_cpy ();
11354         }
11355     }
11356   else
11357     {
11358       constraint (Rn > 7,
11359                   _("only lo regs allowed with immediate"));
11360       inst.instruction |= Rn << 8;
11361       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11362     }
11363 }
11364
11365 static void
11366 do_t_mov16 (void)
11367 {
11368   unsigned Rd;
11369   bfd_vma imm;
11370   bfd_boolean top;
11371
11372   top = (inst.instruction & 0x00800000) != 0;
11373   if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
11374     {
11375       constraint (top, _(":lower16: not allowed this instruction"));
11376       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
11377     }
11378   else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
11379     {
11380       constraint (!top, _(":upper16: not allowed this instruction"));
11381       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
11382     }
11383
11384   Rd = inst.operands[0].reg;
11385   reject_bad_reg (Rd);
11386
11387   inst.instruction |= Rd << 8;
11388   if (inst.reloc.type == BFD_RELOC_UNUSED)
11389     {
11390       imm = inst.reloc.exp.X_add_number;
11391       inst.instruction |= (imm & 0xf000) << 4;
11392       inst.instruction |= (imm & 0x0800) << 15;
11393       inst.instruction |= (imm & 0x0700) << 4;
11394       inst.instruction |= (imm & 0x00ff);
11395     }
11396 }
11397
11398 static void
11399 do_t_mvn_tst (void)
11400 {
11401   unsigned Rn, Rm;
11402
11403   Rn = inst.operands[0].reg;
11404   Rm = inst.operands[1].reg;
11405
11406   if (inst.instruction == T_MNEM_cmp
11407       || inst.instruction == T_MNEM_cmn)
11408     constraint (Rn == REG_PC, BAD_PC);
11409   else
11410     reject_bad_reg (Rn);
11411   reject_bad_reg (Rm);
11412
11413   if (unified_syntax)
11414     {
11415       int r0off = (inst.instruction == T_MNEM_mvn
11416                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
11417       bfd_boolean narrow;
11418
11419       if (inst.size_req == 4
11420           || inst.instruction > 0xffff
11421           || inst.operands[1].shifted
11422           || Rn > 7 || Rm > 7)
11423         narrow = FALSE;
11424       else if (inst.instruction == T_MNEM_cmn
11425                || inst.instruction == T_MNEM_tst)
11426         narrow = TRUE;
11427       else if (THUMB_SETS_FLAGS (inst.instruction))
11428         narrow = !in_it_block ();
11429       else
11430         narrow = in_it_block ();
11431
11432       if (!inst.operands[1].isreg)
11433         {
11434           /* For an immediate, we always generate a 32-bit opcode;
11435              section relaxation will shrink it later if possible.  */
11436           if (inst.instruction < 0xffff)
11437             inst.instruction = THUMB_OP32 (inst.instruction);
11438           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11439           inst.instruction |= Rn << r0off;
11440           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11441         }
11442       else
11443         {
11444           /* See if we can do this with a 16-bit instruction.  */
11445           if (narrow)
11446             {
11447               inst.instruction = THUMB_OP16 (inst.instruction);
11448               inst.instruction |= Rn;
11449               inst.instruction |= Rm << 3;
11450             }
11451           else
11452             {
11453               constraint (inst.operands[1].shifted
11454                           && inst.operands[1].immisreg,
11455                           _("shift must be constant"));
11456               if (inst.instruction < 0xffff)
11457                 inst.instruction = THUMB_OP32 (inst.instruction);
11458               inst.instruction |= Rn << r0off;
11459               encode_thumb32_shifted_operand (1);
11460             }
11461         }
11462     }
11463   else
11464     {
11465       constraint (inst.instruction > 0xffff
11466                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
11467       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
11468                   _("unshifted register required"));
11469       constraint (Rn > 7 || Rm > 7,
11470                   BAD_HIREG);
11471
11472       inst.instruction = THUMB_OP16 (inst.instruction);
11473       inst.instruction |= Rn;
11474       inst.instruction |= Rm << 3;
11475     }
11476 }
11477
11478 static void
11479 do_t_mrs (void)
11480 {
11481   unsigned Rd;
11482
11483   if (do_vfp_nsyn_mrs () == SUCCESS)
11484     return;
11485
11486   Rd = inst.operands[0].reg;
11487   reject_bad_reg (Rd);
11488   inst.instruction |= Rd << 8;
11489
11490   if (inst.operands[1].isreg)
11491     {
11492       unsigned br = inst.operands[1].reg;
11493       if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
11494         as_bad (_("bad register for mrs"));
11495
11496       inst.instruction |= br & (0xf << 16);
11497       inst.instruction |= (br & 0x300) >> 4;
11498       inst.instruction |= (br & SPSR_BIT) >> 2;
11499     }
11500   else
11501     {
11502       int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11503
11504       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11505         {
11506           /* PR gas/12698:  The constraint is only applied for m_profile.
11507              If the user has specified -march=all, we want to ignore it as
11508              we are building for any CPU type, including non-m variants.  */
11509           bfd_boolean m_profile = selected_cpu.core != arm_arch_any.core;
11510           constraint ((flags != 0) && m_profile, _("selected processor does "
11511                                                    "not support requested special purpose register"));
11512         }
11513       else
11514         /* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
11515            devices).  */
11516         constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
11517                     _("'APSR', 'CPSR' or 'SPSR' expected"));
11518
11519       inst.instruction |= (flags & SPSR_BIT) >> 2;
11520       inst.instruction |= inst.operands[1].imm & 0xff;
11521       inst.instruction |= 0xf0000;
11522     }
11523 }
11524
11525 static void
11526 do_t_msr (void)
11527 {
11528   int flags;
11529   unsigned Rn;
11530
11531   if (do_vfp_nsyn_msr () == SUCCESS)
11532     return;
11533
11534   constraint (!inst.operands[1].isreg,
11535               _("Thumb encoding does not support an immediate here"));
11536
11537   if (inst.operands[0].isreg)
11538     flags = (int)(inst.operands[0].reg);
11539   else
11540     flags = inst.operands[0].imm;
11541
11542   if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11543     {
11544       int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11545
11546       /* PR gas/12698:  The constraint is only applied for m_profile.
11547          If the user has specified -march=all, we want to ignore it as
11548          we are building for any CPU type, including non-m variants.  */
11549       bfd_boolean m_profile = selected_cpu.core != arm_arch_any.core;
11550       constraint (((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11551            && (bits & ~(PSR_s | PSR_f)) != 0)
11552           || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11553               && bits != PSR_f)) && m_profile,
11554           _("selected processor does not support requested special "
11555             "purpose register"));
11556     }
11557   else
11558      constraint ((flags & 0xff) != 0, _("selected processor does not support "
11559                  "requested special purpose register"));
11560
11561   Rn = inst.operands[1].reg;
11562   reject_bad_reg (Rn);
11563
11564   inst.instruction |= (flags & SPSR_BIT) >> 2;
11565   inst.instruction |= (flags & 0xf0000) >> 8;
11566   inst.instruction |= (flags & 0x300) >> 4;
11567   inst.instruction |= (flags & 0xff);
11568   inst.instruction |= Rn << 16;
11569 }
11570
11571 static void
11572 do_t_mul (void)
11573 {
11574   bfd_boolean narrow;
11575   unsigned Rd, Rn, Rm;
11576
11577   if (!inst.operands[2].present)
11578     inst.operands[2].reg = inst.operands[0].reg;
11579
11580   Rd = inst.operands[0].reg;
11581   Rn = inst.operands[1].reg;
11582   Rm = inst.operands[2].reg;
11583
11584   if (unified_syntax)
11585     {
11586       if (inst.size_req == 4
11587           || (Rd != Rn
11588               && Rd != Rm)
11589           || Rn > 7
11590           || Rm > 7)
11591         narrow = FALSE;
11592       else if (inst.instruction == T_MNEM_muls)
11593         narrow = !in_it_block ();
11594       else
11595         narrow = in_it_block ();
11596     }
11597   else
11598     {
11599       constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
11600       constraint (Rn > 7 || Rm > 7,
11601                   BAD_HIREG);
11602       narrow = TRUE;
11603     }
11604
11605   if (narrow)
11606     {
11607       /* 16-bit MULS/Conditional MUL.  */
11608       inst.instruction = THUMB_OP16 (inst.instruction);
11609       inst.instruction |= Rd;
11610
11611       if (Rd == Rn)
11612         inst.instruction |= Rm << 3;
11613       else if (Rd == Rm)
11614         inst.instruction |= Rn << 3;
11615       else
11616         constraint (1, _("dest must overlap one source register"));
11617     }
11618   else
11619     {
11620       constraint (inst.instruction != T_MNEM_mul,
11621                   _("Thumb-2 MUL must not set flags"));
11622       /* 32-bit MUL.  */
11623       inst.instruction = THUMB_OP32 (inst.instruction);
11624       inst.instruction |= Rd << 8;
11625       inst.instruction |= Rn << 16;
11626       inst.instruction |= Rm << 0;
11627
11628       reject_bad_reg (Rd);
11629       reject_bad_reg (Rn);
11630       reject_bad_reg (Rm);
11631     }
11632 }
11633
11634 static void
11635 do_t_mull (void)
11636 {
11637   unsigned RdLo, RdHi, Rn, Rm;
11638
11639   RdLo = inst.operands[0].reg;
11640   RdHi = inst.operands[1].reg;
11641   Rn = inst.operands[2].reg;
11642   Rm = inst.operands[3].reg;
11643
11644   reject_bad_reg (RdLo);
11645   reject_bad_reg (RdHi);
11646   reject_bad_reg (Rn);
11647   reject_bad_reg (Rm);
11648
11649   inst.instruction |= RdLo << 12;
11650   inst.instruction |= RdHi << 8;
11651   inst.instruction |= Rn << 16;
11652   inst.instruction |= Rm;
11653
11654  if (RdLo == RdHi)
11655     as_tsktsk (_("rdhi and rdlo must be different"));
11656 }
11657
11658 static void
11659 do_t_nop (void)
11660 {
11661   set_it_insn_type (NEUTRAL_IT_INSN);
11662
11663   if (unified_syntax)
11664     {
11665       if (inst.size_req == 4 || inst.operands[0].imm > 15)
11666         {
11667           inst.instruction = THUMB_OP32 (inst.instruction);
11668           inst.instruction |= inst.operands[0].imm;
11669         }
11670       else
11671         {
11672           /* PR9722: Check for Thumb2 availability before
11673              generating a thumb2 nop instruction.  */
11674           if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
11675             {
11676               inst.instruction = THUMB_OP16 (inst.instruction);
11677               inst.instruction |= inst.operands[0].imm << 4;
11678             }
11679           else
11680             inst.instruction = 0x46c0;
11681         }
11682     }
11683   else
11684     {
11685       constraint (inst.operands[0].present,
11686                   _("Thumb does not support NOP with hints"));
11687       inst.instruction = 0x46c0;
11688     }
11689 }
11690
11691 static void
11692 do_t_neg (void)
11693 {
11694   if (unified_syntax)
11695     {
11696       bfd_boolean narrow;
11697
11698       if (THUMB_SETS_FLAGS (inst.instruction))
11699         narrow = !in_it_block ();
11700       else
11701         narrow = in_it_block ();
11702       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11703         narrow = FALSE;
11704       if (inst.size_req == 4)
11705         narrow = FALSE;
11706
11707       if (!narrow)
11708         {
11709           inst.instruction = THUMB_OP32 (inst.instruction);
11710           inst.instruction |= inst.operands[0].reg << 8;
11711           inst.instruction |= inst.operands[1].reg << 16;
11712         }
11713       else
11714         {
11715           inst.instruction = THUMB_OP16 (inst.instruction);
11716           inst.instruction |= inst.operands[0].reg;
11717           inst.instruction |= inst.operands[1].reg << 3;
11718         }
11719     }
11720   else
11721     {
11722       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
11723                   BAD_HIREG);
11724       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11725
11726       inst.instruction = THUMB_OP16 (inst.instruction);
11727       inst.instruction |= inst.operands[0].reg;
11728       inst.instruction |= inst.operands[1].reg << 3;
11729     }
11730 }
11731
11732 static void
11733 do_t_orn (void)
11734 {
11735   unsigned Rd, Rn;
11736
11737   Rd = inst.operands[0].reg;
11738   Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
11739
11740   reject_bad_reg (Rd);
11741   /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN.  */
11742   reject_bad_reg (Rn);
11743
11744   inst.instruction |= Rd << 8;
11745   inst.instruction |= Rn << 16;
11746
11747   if (!inst.operands[2].isreg)
11748     {
11749       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11750       inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11751     }
11752   else
11753     {
11754       unsigned Rm;
11755
11756       Rm = inst.operands[2].reg;
11757       reject_bad_reg (Rm);
11758
11759       constraint (inst.operands[2].shifted
11760                   && inst.operands[2].immisreg,
11761                   _("shift must be constant"));
11762       encode_thumb32_shifted_operand (2);
11763     }
11764 }
11765
11766 static void
11767 do_t_pkhbt (void)
11768 {
11769   unsigned Rd, Rn, Rm;
11770
11771   Rd = inst.operands[0].reg;
11772   Rn = inst.operands[1].reg;
11773   Rm = inst.operands[2].reg;
11774
11775   reject_bad_reg (Rd);
11776   reject_bad_reg (Rn);
11777   reject_bad_reg (Rm);
11778
11779   inst.instruction |= Rd << 8;
11780   inst.instruction |= Rn << 16;
11781   inst.instruction |= Rm;
11782   if (inst.operands[3].present)
11783     {
11784       unsigned int val = inst.reloc.exp.X_add_number;
11785       constraint (inst.reloc.exp.X_op != O_constant,
11786                   _("expression too complex"));
11787       inst.instruction |= (val & 0x1c) << 10;
11788       inst.instruction |= (val & 0x03) << 6;
11789     }
11790 }
11791
11792 static void
11793 do_t_pkhtb (void)
11794 {
11795   if (!inst.operands[3].present)
11796     {
11797       unsigned Rtmp;
11798
11799       inst.instruction &= ~0x00000020;
11800
11801       /* PR 10168.  Swap the Rm and Rn registers.  */
11802       Rtmp = inst.operands[1].reg;
11803       inst.operands[1].reg = inst.operands[2].reg;
11804       inst.operands[2].reg = Rtmp;
11805     }
11806   do_t_pkhbt ();
11807 }
11808
11809 static void
11810 do_t_pld (void)
11811 {
11812   if (inst.operands[0].immisreg)
11813     reject_bad_reg (inst.operands[0].imm);
11814
11815   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
11816 }
11817
11818 static void
11819 do_t_push_pop (void)
11820 {
11821   unsigned mask;
11822
11823   constraint (inst.operands[0].writeback,
11824               _("push/pop do not support {reglist}^"));
11825   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11826               _("expression too complex"));
11827
11828   mask = inst.operands[0].imm;
11829   if (inst.size_req != 4 && (mask & ~0xff) == 0)
11830     inst.instruction = THUMB_OP16 (inst.instruction) | mask;
11831   else if (inst.size_req != 4
11832            && (mask & ~0xff) == (1 << (inst.instruction == T_MNEM_push
11833                                        ? REG_LR : REG_PC)))
11834     {
11835       inst.instruction = THUMB_OP16 (inst.instruction);
11836       inst.instruction |= THUMB_PP_PC_LR;
11837       inst.instruction |= mask & 0xff;
11838     }
11839   else if (unified_syntax)
11840     {
11841       inst.instruction = THUMB_OP32 (inst.instruction);
11842       encode_thumb2_ldmstm (13, mask, TRUE);
11843     }
11844   else
11845     {
11846       inst.error = _("invalid register list to push/pop instruction");
11847       return;
11848     }
11849 }
11850
11851 static void
11852 do_t_rbit (void)
11853 {
11854   unsigned Rd, Rm;
11855
11856   Rd = inst.operands[0].reg;
11857   Rm = inst.operands[1].reg;
11858
11859   reject_bad_reg (Rd);
11860   reject_bad_reg (Rm);
11861
11862   inst.instruction |= Rd << 8;
11863   inst.instruction |= Rm << 16;
11864   inst.instruction |= Rm;
11865 }
11866
11867 static void
11868 do_t_rev (void)
11869 {
11870   unsigned Rd, Rm;
11871
11872   Rd = inst.operands[0].reg;
11873   Rm = inst.operands[1].reg;
11874
11875   reject_bad_reg (Rd);
11876   reject_bad_reg (Rm);
11877
11878   if (Rd <= 7 && Rm <= 7
11879       && inst.size_req != 4)
11880     {
11881       inst.instruction = THUMB_OP16 (inst.instruction);
11882       inst.instruction |= Rd;
11883       inst.instruction |= Rm << 3;
11884     }
11885   else if (unified_syntax)
11886     {
11887       inst.instruction = THUMB_OP32 (inst.instruction);
11888       inst.instruction |= Rd << 8;
11889       inst.instruction |= Rm << 16;
11890       inst.instruction |= Rm;
11891     }
11892   else
11893     inst.error = BAD_HIREG;
11894 }
11895
11896 static void
11897 do_t_rrx (void)
11898 {
11899   unsigned Rd, Rm;
11900
11901   Rd = inst.operands[0].reg;
11902   Rm = inst.operands[1].reg;
11903
11904   reject_bad_reg (Rd);
11905   reject_bad_reg (Rm);
11906
11907   inst.instruction |= Rd << 8;
11908   inst.instruction |= Rm;
11909 }
11910
11911 static void
11912 do_t_rsb (void)
11913 {
11914   unsigned Rd, Rs;
11915
11916   Rd = inst.operands[0].reg;
11917   Rs = (inst.operands[1].present
11918         ? inst.operands[1].reg    /* Rd, Rs, foo */
11919         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
11920
11921   reject_bad_reg (Rd);
11922   reject_bad_reg (Rs);
11923   if (inst.operands[2].isreg)
11924     reject_bad_reg (inst.operands[2].reg);
11925
11926   inst.instruction |= Rd << 8;
11927   inst.instruction |= Rs << 16;
11928   if (!inst.operands[2].isreg)
11929     {
11930       bfd_boolean narrow;
11931
11932       if ((inst.instruction & 0x00100000) != 0)
11933         narrow = !in_it_block ();
11934       else
11935         narrow = in_it_block ();
11936
11937       if (Rd > 7 || Rs > 7)
11938         narrow = FALSE;
11939
11940       if (inst.size_req == 4 || !unified_syntax)
11941         narrow = FALSE;
11942
11943       if (inst.reloc.exp.X_op != O_constant
11944           || inst.reloc.exp.X_add_number != 0)
11945         narrow = FALSE;
11946
11947       /* Turn rsb #0 into 16-bit neg.  We should probably do this via
11948          relaxation, but it doesn't seem worth the hassle.  */
11949       if (narrow)
11950         {
11951           inst.reloc.type = BFD_RELOC_UNUSED;
11952           inst.instruction = THUMB_OP16 (T_MNEM_negs);
11953           inst.instruction |= Rs << 3;
11954           inst.instruction |= Rd;
11955         }
11956       else
11957         {
11958           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11959           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11960         }
11961     }
11962   else
11963     encode_thumb32_shifted_operand (2);
11964 }
11965
11966 static void
11967 do_t_setend (void)
11968 {
11969   if (warn_on_deprecated
11970       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
11971       as_warn (_("setend use is deprecated for ARMv8"));
11972
11973   set_it_insn_type (OUTSIDE_IT_INSN);
11974   if (inst.operands[0].imm)
11975     inst.instruction |= 0x8;
11976 }
11977
11978 static void
11979 do_t_shift (void)
11980 {
11981   if (!inst.operands[1].present)
11982     inst.operands[1].reg = inst.operands[0].reg;
11983
11984   if (unified_syntax)
11985     {
11986       bfd_boolean narrow;
11987       int shift_kind;
11988
11989       switch (inst.instruction)
11990         {
11991         case T_MNEM_asr:
11992         case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11993         case T_MNEM_lsl:
11994         case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11995         case T_MNEM_lsr:
11996         case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11997         case T_MNEM_ror:
11998         case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11999         default: abort ();
12000         }
12001
12002       if (THUMB_SETS_FLAGS (inst.instruction))
12003         narrow = !in_it_block ();
12004       else
12005         narrow = in_it_block ();
12006       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
12007         narrow = FALSE;
12008       if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
12009         narrow = FALSE;
12010       if (inst.operands[2].isreg
12011           && (inst.operands[1].reg != inst.operands[0].reg
12012               || inst.operands[2].reg > 7))
12013         narrow = FALSE;
12014       if (inst.size_req == 4)
12015         narrow = FALSE;
12016
12017       reject_bad_reg (inst.operands[0].reg);
12018       reject_bad_reg (inst.operands[1].reg);
12019
12020       if (!narrow)
12021         {
12022           if (inst.operands[2].isreg)
12023             {
12024               reject_bad_reg (inst.operands[2].reg);
12025               inst.instruction = THUMB_OP32 (inst.instruction);
12026               inst.instruction |= inst.operands[0].reg << 8;
12027               inst.instruction |= inst.operands[1].reg << 16;
12028               inst.instruction |= inst.operands[2].reg;
12029
12030               /* PR 12854: Error on extraneous shifts.  */
12031               constraint (inst.operands[2].shifted,
12032                           _("extraneous shift as part of operand to shift insn"));
12033             }
12034           else
12035             {
12036               inst.operands[1].shifted = 1;
12037               inst.operands[1].shift_kind = shift_kind;
12038               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
12039                                              ? T_MNEM_movs : T_MNEM_mov);
12040               inst.instruction |= inst.operands[0].reg << 8;
12041               encode_thumb32_shifted_operand (1);
12042               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
12043               inst.reloc.type = BFD_RELOC_UNUSED;
12044             }
12045         }
12046       else
12047         {
12048           if (inst.operands[2].isreg)
12049             {
12050               switch (shift_kind)
12051                 {
12052                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
12053                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
12054                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
12055                 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
12056                 default: abort ();
12057                 }
12058
12059               inst.instruction |= inst.operands[0].reg;
12060               inst.instruction |= inst.operands[2].reg << 3;
12061
12062               /* PR 12854: Error on extraneous shifts.  */
12063               constraint (inst.operands[2].shifted,
12064                           _("extraneous shift as part of operand to shift insn"));
12065             }
12066           else
12067             {
12068               switch (shift_kind)
12069                 {
12070                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
12071                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
12072                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
12073                 default: abort ();
12074                 }
12075               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
12076               inst.instruction |= inst.operands[0].reg;
12077               inst.instruction |= inst.operands[1].reg << 3;
12078             }
12079         }
12080     }
12081   else
12082     {
12083       constraint (inst.operands[0].reg > 7
12084                   || inst.operands[1].reg > 7, BAD_HIREG);
12085       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
12086
12087       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
12088         {
12089           constraint (inst.operands[2].reg > 7, BAD_HIREG);
12090           constraint (inst.operands[0].reg != inst.operands[1].reg,
12091                       _("source1 and dest must be same register"));
12092
12093           switch (inst.instruction)
12094             {
12095             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
12096             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
12097             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
12098             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
12099             default: abort ();
12100             }
12101
12102           inst.instruction |= inst.operands[0].reg;
12103           inst.instruction |= inst.operands[2].reg << 3;
12104
12105           /* PR 12854: Error on extraneous shifts.  */
12106           constraint (inst.operands[2].shifted,
12107                       _("extraneous shift as part of operand to shift insn"));
12108         }
12109       else
12110         {
12111           switch (inst.instruction)
12112             {
12113             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
12114             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
12115             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
12116             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
12117             default: abort ();
12118             }
12119           inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
12120           inst.instruction |= inst.operands[0].reg;
12121           inst.instruction |= inst.operands[1].reg << 3;
12122         }
12123     }
12124 }
12125
12126 static void
12127 do_t_simd (void)
12128 {
12129   unsigned Rd, Rn, Rm;
12130
12131   Rd = inst.operands[0].reg;
12132   Rn = inst.operands[1].reg;
12133   Rm = inst.operands[2].reg;
12134
12135   reject_bad_reg (Rd);
12136   reject_bad_reg (Rn);
12137   reject_bad_reg (Rm);
12138
12139   inst.instruction |= Rd << 8;
12140   inst.instruction |= Rn << 16;
12141   inst.instruction |= Rm;
12142 }
12143
12144 static void
12145 do_t_simd2 (void)
12146 {
12147   unsigned Rd, Rn, Rm;
12148
12149   Rd = inst.operands[0].reg;
12150   Rm = inst.operands[1].reg;
12151   Rn = inst.operands[2].reg;
12152
12153   reject_bad_reg (Rd);
12154   reject_bad_reg (Rn);
12155   reject_bad_reg (Rm);
12156
12157   inst.instruction |= Rd << 8;
12158   inst.instruction |= Rn << 16;
12159   inst.instruction |= Rm;
12160 }
12161
12162 static void
12163 do_t_smc (void)
12164 {
12165   unsigned int value = inst.reloc.exp.X_add_number;
12166   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
12167               _("SMC is not permitted on this architecture"));
12168   constraint (inst.reloc.exp.X_op != O_constant,
12169               _("expression too complex"));
12170   inst.reloc.type = BFD_RELOC_UNUSED;
12171   inst.instruction |= (value & 0xf000) >> 12;
12172   inst.instruction |= (value & 0x0ff0);
12173   inst.instruction |= (value & 0x000f) << 16;
12174   /* PR gas/15623: SMC instructions must be last in an IT block.  */
12175   set_it_insn_type_last ();
12176 }
12177
12178 static void
12179 do_t_hvc (void)
12180 {
12181   unsigned int value = inst.reloc.exp.X_add_number;
12182
12183   inst.reloc.type = BFD_RELOC_UNUSED;
12184   inst.instruction |= (value & 0x0fff);
12185   inst.instruction |= (value & 0xf000) << 4;
12186 }
12187
12188 static void
12189 do_t_ssat_usat (int bias)
12190 {
12191   unsigned Rd, Rn;
12192
12193   Rd = inst.operands[0].reg;
12194   Rn = inst.operands[2].reg;
12195
12196   reject_bad_reg (Rd);
12197   reject_bad_reg (Rn);
12198
12199   inst.instruction |= Rd << 8;
12200   inst.instruction |= inst.operands[1].imm - bias;
12201   inst.instruction |= Rn << 16;
12202
12203   if (inst.operands[3].present)
12204     {
12205       offsetT shift_amount = inst.reloc.exp.X_add_number;
12206
12207       inst.reloc.type = BFD_RELOC_UNUSED;
12208
12209       constraint (inst.reloc.exp.X_op != O_constant,
12210                   _("expression too complex"));
12211
12212       if (shift_amount != 0)
12213         {
12214           constraint (shift_amount > 31,
12215                       _("shift expression is too large"));
12216
12217           if (inst.operands[3].shift_kind == SHIFT_ASR)
12218             inst.instruction |= 0x00200000;  /* sh bit.  */
12219
12220           inst.instruction |= (shift_amount & 0x1c) << 10;
12221           inst.instruction |= (shift_amount & 0x03) << 6;
12222         }
12223     }
12224 }
12225
12226 static void
12227 do_t_ssat (void)
12228 {
12229   do_t_ssat_usat (1);
12230 }
12231
12232 static void
12233 do_t_ssat16 (void)
12234 {
12235   unsigned Rd, Rn;
12236
12237   Rd = inst.operands[0].reg;
12238   Rn = inst.operands[2].reg;
12239
12240   reject_bad_reg (Rd);
12241   reject_bad_reg (Rn);
12242
12243   inst.instruction |= Rd << 8;
12244   inst.instruction |= inst.operands[1].imm - 1;
12245   inst.instruction |= Rn << 16;
12246 }
12247
12248 static void
12249 do_t_strex (void)
12250 {
12251   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
12252               || inst.operands[2].postind || inst.operands[2].writeback
12253               || inst.operands[2].immisreg || inst.operands[2].shifted
12254               || inst.operands[2].negative,
12255               BAD_ADDR_MODE);
12256
12257   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
12258
12259   inst.instruction |= inst.operands[0].reg << 8;
12260   inst.instruction |= inst.operands[1].reg << 12;
12261   inst.instruction |= inst.operands[2].reg << 16;
12262   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
12263 }
12264
12265 static void
12266 do_t_strexd (void)
12267 {
12268   if (!inst.operands[2].present)
12269     inst.operands[2].reg = inst.operands[1].reg + 1;
12270
12271   constraint (inst.operands[0].reg == inst.operands[1].reg
12272               || inst.operands[0].reg == inst.operands[2].reg
12273               || inst.operands[0].reg == inst.operands[3].reg,
12274               BAD_OVERLAP);
12275
12276   inst.instruction |= inst.operands[0].reg;
12277   inst.instruction |= inst.operands[1].reg << 12;
12278   inst.instruction |= inst.operands[2].reg << 8;
12279   inst.instruction |= inst.operands[3].reg << 16;
12280 }
12281
12282 static void
12283 do_t_sxtah (void)
12284 {
12285   unsigned Rd, Rn, Rm;
12286
12287   Rd = inst.operands[0].reg;
12288   Rn = inst.operands[1].reg;
12289   Rm = inst.operands[2].reg;
12290
12291   reject_bad_reg (Rd);
12292   reject_bad_reg (Rn);
12293   reject_bad_reg (Rm);
12294
12295   inst.instruction |= Rd << 8;
12296   inst.instruction |= Rn << 16;
12297   inst.instruction |= Rm;
12298   inst.instruction |= inst.operands[3].imm << 4;
12299 }
12300
12301 static void
12302 do_t_sxth (void)
12303 {
12304   unsigned Rd, Rm;
12305
12306   Rd = inst.operands[0].reg;
12307   Rm = inst.operands[1].reg;
12308
12309   reject_bad_reg (Rd);
12310   reject_bad_reg (Rm);
12311
12312   if (inst.instruction <= 0xffff
12313       && inst.size_req != 4
12314       && Rd <= 7 && Rm <= 7
12315       && (!inst.operands[2].present || inst.operands[2].imm == 0))
12316     {
12317       inst.instruction = THUMB_OP16 (inst.instruction);
12318       inst.instruction |= Rd;
12319       inst.instruction |= Rm << 3;
12320     }
12321   else if (unified_syntax)
12322     {
12323       if (inst.instruction <= 0xffff)
12324         inst.instruction = THUMB_OP32 (inst.instruction);
12325       inst.instruction |= Rd << 8;
12326       inst.instruction |= Rm;
12327       inst.instruction |= inst.operands[2].imm << 4;
12328     }
12329   else
12330     {
12331       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
12332                   _("Thumb encoding does not support rotation"));
12333       constraint (1, BAD_HIREG);
12334     }
12335 }
12336
12337 static void
12338 do_t_swi (void)
12339 {
12340   /* We have to do the following check manually as ARM_EXT_OS only applies
12341      to ARM_EXT_V6M.  */
12342   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6m))
12343     {
12344       if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_os)
12345           /* This only applies to the v6m howver, not later architectures.  */
12346           && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7))
12347         as_bad (_("SVC is not permitted on this architecture"));
12348       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, arm_ext_os);
12349     }
12350
12351   inst.reloc.type = BFD_RELOC_ARM_SWI;
12352 }
12353
12354 static void
12355 do_t_tb (void)
12356 {
12357   unsigned Rn, Rm;
12358   int half;
12359
12360   half = (inst.instruction & 0x10) != 0;
12361   set_it_insn_type_last ();
12362   constraint (inst.operands[0].immisreg,
12363               _("instruction requires register index"));
12364
12365   Rn = inst.operands[0].reg;
12366   Rm = inst.operands[0].imm;
12367
12368   constraint (Rn == REG_SP, BAD_SP);
12369   reject_bad_reg (Rm);
12370
12371   constraint (!half && inst.operands[0].shifted,
12372               _("instruction does not allow shifted index"));
12373   inst.instruction |= (Rn << 16) | Rm;
12374 }
12375
12376 static void
12377 do_t_udf (void)
12378 {
12379   if (!inst.operands[0].present)
12380     inst.operands[0].imm = 0;
12381
12382   if ((unsigned int) inst.operands[0].imm > 255 || inst.size_req == 4)
12383     {
12384       constraint (inst.size_req == 2,
12385                   _("immediate value out of range"));
12386       inst.instruction = THUMB_OP32 (inst.instruction);
12387       inst.instruction |= (inst.operands[0].imm & 0xf000u) << 4;
12388       inst.instruction |= (inst.operands[0].imm & 0x0fffu) << 0;
12389     }
12390   else
12391     {
12392       inst.instruction = THUMB_OP16 (inst.instruction);
12393       inst.instruction |= inst.operands[0].imm;
12394     }
12395
12396   set_it_insn_type (NEUTRAL_IT_INSN);
12397 }
12398
12399
12400 static void
12401 do_t_usat (void)
12402 {
12403   do_t_ssat_usat (0);
12404 }
12405
12406 static void
12407 do_t_usat16 (void)
12408 {
12409   unsigned Rd, Rn;
12410
12411   Rd = inst.operands[0].reg;
12412   Rn = inst.operands[2].reg;
12413
12414   reject_bad_reg (Rd);
12415   reject_bad_reg (Rn);
12416
12417   inst.instruction |= Rd << 8;
12418   inst.instruction |= inst.operands[1].imm;
12419   inst.instruction |= Rn << 16;
12420 }
12421
12422 /* Neon instruction encoder helpers.  */
12423
12424 /* Encodings for the different types for various Neon opcodes.  */
12425
12426 /* An "invalid" code for the following tables.  */
12427 #define N_INV -1u
12428
12429 struct neon_tab_entry
12430 {
12431   unsigned integer;
12432   unsigned float_or_poly;
12433   unsigned scalar_or_imm;
12434 };
12435
12436 /* Map overloaded Neon opcodes to their respective encodings.  */
12437 #define NEON_ENC_TAB                                    \
12438   X(vabd,       0x0000700, 0x1200d00, N_INV),           \
12439   X(vmax,       0x0000600, 0x0000f00, N_INV),           \
12440   X(vmin,       0x0000610, 0x0200f00, N_INV),           \
12441   X(vpadd,      0x0000b10, 0x1000d00, N_INV),           \
12442   X(vpmax,      0x0000a00, 0x1000f00, N_INV),           \
12443   X(vpmin,      0x0000a10, 0x1200f00, N_INV),           \
12444   X(vadd,       0x0000800, 0x0000d00, N_INV),           \
12445   X(vsub,       0x1000800, 0x0200d00, N_INV),           \
12446   X(vceq,       0x1000810, 0x0000e00, 0x1b10100),       \
12447   X(vcge,       0x0000310, 0x1000e00, 0x1b10080),       \
12448   X(vcgt,       0x0000300, 0x1200e00, 0x1b10000),       \
12449   /* Register variants of the following two instructions are encoded as
12450      vcge / vcgt with the operands reversed.  */        \
12451   X(vclt,       0x0000300, 0x1200e00, 0x1b10200),       \
12452   X(vcle,       0x0000310, 0x1000e00, 0x1b10180),       \
12453   X(vfma,       N_INV, 0x0000c10, N_INV),               \
12454   X(vfms,       N_INV, 0x0200c10, N_INV),               \
12455   X(vmla,       0x0000900, 0x0000d10, 0x0800040),       \
12456   X(vmls,       0x1000900, 0x0200d10, 0x0800440),       \
12457   X(vmul,       0x0000910, 0x1000d10, 0x0800840),       \
12458   X(vmull,      0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
12459   X(vmlal,      0x0800800, N_INV,     0x0800240),       \
12460   X(vmlsl,      0x0800a00, N_INV,     0x0800640),       \
12461   X(vqdmlal,    0x0800900, N_INV,     0x0800340),       \
12462   X(vqdmlsl,    0x0800b00, N_INV,     0x0800740),       \
12463   X(vqdmull,    0x0800d00, N_INV,     0x0800b40),       \
12464   X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),       \
12465   X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),       \
12466   X(vshl,       0x0000400, N_INV,     0x0800510),       \
12467   X(vqshl,      0x0000410, N_INV,     0x0800710),       \
12468   X(vand,       0x0000110, N_INV,     0x0800030),       \
12469   X(vbic,       0x0100110, N_INV,     0x0800030),       \
12470   X(veor,       0x1000110, N_INV,     N_INV),           \
12471   X(vorn,       0x0300110, N_INV,     0x0800010),       \
12472   X(vorr,       0x0200110, N_INV,     0x0800010),       \
12473   X(vmvn,       0x1b00580, N_INV,     0x0800030),       \
12474   X(vshll,      0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
12475   X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
12476   X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
12477   X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
12478   X(vst1,       0x0000000, 0x0800000, N_INV),           \
12479   X(vld2,       0x0200100, 0x0a00100, 0x0a00d00),       \
12480   X(vst2,       0x0000100, 0x0800100, N_INV),           \
12481   X(vld3,       0x0200200, 0x0a00200, 0x0a00e00),       \
12482   X(vst3,       0x0000200, 0x0800200, N_INV),           \
12483   X(vld4,       0x0200300, 0x0a00300, 0x0a00f00),       \
12484   X(vst4,       0x0000300, 0x0800300, N_INV),           \
12485   X(vmovn,      0x1b20200, N_INV,     N_INV),           \
12486   X(vtrn,       0x1b20080, N_INV,     N_INV),           \
12487   X(vqmovn,     0x1b20200, N_INV,     N_INV),           \
12488   X(vqmovun,    0x1b20240, N_INV,     N_INV),           \
12489   X(vnmul,      0xe200a40, 0xe200b40, N_INV),           \
12490   X(vnmla,      0xe100a40, 0xe100b40, N_INV),           \
12491   X(vnmls,      0xe100a00, 0xe100b00, N_INV),           \
12492   X(vfnma,      0xe900a40, 0xe900b40, N_INV),           \
12493   X(vfnms,      0xe900a00, 0xe900b00, N_INV),           \
12494   X(vcmp,       0xeb40a40, 0xeb40b40, N_INV),           \
12495   X(vcmpz,      0xeb50a40, 0xeb50b40, N_INV),           \
12496   X(vcmpe,      0xeb40ac0, 0xeb40bc0, N_INV),           \
12497   X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV),           \
12498   X(vseleq,     0xe000a00, N_INV,     N_INV),           \
12499   X(vselvs,     0xe100a00, N_INV,     N_INV),           \
12500   X(vselge,     0xe200a00, N_INV,     N_INV),           \
12501   X(vselgt,     0xe300a00, N_INV,     N_INV),           \
12502   X(vmaxnm,     0xe800a00, 0x3000f10, N_INV),           \
12503   X(vminnm,     0xe800a40, 0x3200f10, N_INV),           \
12504   X(vcvta,      0xebc0a40, 0x3bb0000, N_INV),           \
12505   X(vrintr,     0xeb60a40, 0x3ba0400, N_INV),           \
12506   X(vrinta,     0xeb80a40, 0x3ba0400, N_INV),           \
12507   X(aes,        0x3b00300, N_INV,     N_INV),           \
12508   X(sha3op,     0x2000c00, N_INV,     N_INV),           \
12509   X(sha1h,      0x3b902c0, N_INV,     N_INV),           \
12510   X(sha2op,     0x3ba0380, N_INV,     N_INV)
12511
12512 enum neon_opc
12513 {
12514 #define X(OPC,I,F,S) N_MNEM_##OPC
12515 NEON_ENC_TAB
12516 #undef X
12517 };
12518
12519 static const struct neon_tab_entry neon_enc_tab[] =
12520 {
12521 #define X(OPC,I,F,S) { (I), (F), (S) }
12522 NEON_ENC_TAB
12523 #undef X
12524 };
12525
12526 /* Do not use these macros; instead, use NEON_ENCODE defined below.  */
12527 #define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12528 #define NEON_ENC_ARMREG_(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
12529 #define NEON_ENC_POLY_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12530 #define NEON_ENC_FLOAT_(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12531 #define NEON_ENC_SCALAR_(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12532 #define NEON_ENC_IMMED_(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12533 #define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12534 #define NEON_ENC_LANE_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12535 #define NEON_ENC_DUP_(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12536 #define NEON_ENC_SINGLE_(X) \
12537   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
12538 #define NEON_ENC_DOUBLE_(X) \
12539   ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
12540 #define NEON_ENC_FPV8_(X) \
12541   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf000000))
12542
12543 #define NEON_ENCODE(type, inst)                                 \
12544   do                                                            \
12545     {                                                           \
12546       inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
12547       inst.is_neon = 1;                                         \
12548     }                                                           \
12549   while (0)
12550
12551 #define check_neon_suffixes                                             \
12552   do                                                                    \
12553     {                                                                   \
12554       if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon)       \
12555         {                                                               \
12556           as_bad (_("invalid neon suffix for non neon instruction"));   \
12557           return;                                                       \
12558         }                                                               \
12559     }                                                                   \
12560   while (0)
12561
12562 /* Define shapes for instruction operands. The following mnemonic characters
12563    are used in this table:
12564
12565      F - VFP S<n> register
12566      D - Neon D<n> register
12567      Q - Neon Q<n> register
12568      I - Immediate
12569      S - Scalar
12570      R - ARM register
12571      L - D<n> register list
12572
12573    This table is used to generate various data:
12574      - enumerations of the form NS_DDR to be used as arguments to
12575        neon_select_shape.
12576      - a table classifying shapes into single, double, quad, mixed.
12577      - a table used to drive neon_select_shape.  */
12578
12579 #define NEON_SHAPE_DEF                  \
12580   X(3, (D, D, D), DOUBLE),              \
12581   X(3, (Q, Q, Q), QUAD),                \
12582   X(3, (D, D, I), DOUBLE),              \
12583   X(3, (Q, Q, I), QUAD),                \
12584   X(3, (D, D, S), DOUBLE),              \
12585   X(3, (Q, Q, S), QUAD),                \
12586   X(2, (D, D), DOUBLE),                 \
12587   X(2, (Q, Q), QUAD),                   \
12588   X(2, (D, S), DOUBLE),                 \
12589   X(2, (Q, S), QUAD),                   \
12590   X(2, (D, R), DOUBLE),                 \
12591   X(2, (Q, R), QUAD),                   \
12592   X(2, (D, I), DOUBLE),                 \
12593   X(2, (Q, I), QUAD),                   \
12594   X(3, (D, L, D), DOUBLE),              \
12595   X(2, (D, Q), MIXED),                  \
12596   X(2, (Q, D), MIXED),                  \
12597   X(3, (D, Q, I), MIXED),               \
12598   X(3, (Q, D, I), MIXED),               \
12599   X(3, (Q, D, D), MIXED),               \
12600   X(3, (D, Q, Q), MIXED),               \
12601   X(3, (Q, Q, D), MIXED),               \
12602   X(3, (Q, D, S), MIXED),               \
12603   X(3, (D, Q, S), MIXED),               \
12604   X(4, (D, D, D, I), DOUBLE),           \
12605   X(4, (Q, Q, Q, I), QUAD),             \
12606   X(2, (F, F), SINGLE),                 \
12607   X(3, (F, F, F), SINGLE),              \
12608   X(2, (F, I), SINGLE),                 \
12609   X(2, (F, D), MIXED),                  \
12610   X(2, (D, F), MIXED),                  \
12611   X(3, (F, F, I), MIXED),               \
12612   X(4, (R, R, F, F), SINGLE),           \
12613   X(4, (F, F, R, R), SINGLE),           \
12614   X(3, (D, R, R), DOUBLE),              \
12615   X(3, (R, R, D), DOUBLE),              \
12616   X(2, (S, R), SINGLE),                 \
12617   X(2, (R, S), SINGLE),                 \
12618   X(2, (F, R), SINGLE),                 \
12619   X(2, (R, F), SINGLE)
12620
12621 #define S2(A,B)         NS_##A##B
12622 #define S3(A,B,C)       NS_##A##B##C
12623 #define S4(A,B,C,D)     NS_##A##B##C##D
12624
12625 #define X(N, L, C) S##N L
12626
12627 enum neon_shape
12628 {
12629   NEON_SHAPE_DEF,
12630   NS_NULL
12631 };
12632
12633 #undef X
12634 #undef S2
12635 #undef S3
12636 #undef S4
12637
12638 enum neon_shape_class
12639 {
12640   SC_SINGLE,
12641   SC_DOUBLE,
12642   SC_QUAD,
12643   SC_MIXED
12644 };
12645
12646 #define X(N, L, C) SC_##C
12647
12648 static enum neon_shape_class neon_shape_class[] =
12649 {
12650   NEON_SHAPE_DEF
12651 };
12652
12653 #undef X
12654
12655 enum neon_shape_el
12656 {
12657   SE_F,
12658   SE_D,
12659   SE_Q,
12660   SE_I,
12661   SE_S,
12662   SE_R,
12663   SE_L
12664 };
12665
12666 /* Register widths of above.  */
12667 static unsigned neon_shape_el_size[] =
12668 {
12669   32,
12670   64,
12671   128,
12672   0,
12673   32,
12674   32,
12675   0
12676 };
12677
12678 struct neon_shape_info
12679 {
12680   unsigned els;
12681   enum neon_shape_el el[NEON_MAX_TYPE_ELS];
12682 };
12683
12684 #define S2(A,B)         { SE_##A, SE_##B }
12685 #define S3(A,B,C)       { SE_##A, SE_##B, SE_##C }
12686 #define S4(A,B,C,D)     { SE_##A, SE_##B, SE_##C, SE_##D }
12687
12688 #define X(N, L, C) { N, S##N L }
12689
12690 static struct neon_shape_info neon_shape_tab[] =
12691 {
12692   NEON_SHAPE_DEF
12693 };
12694
12695 #undef X
12696 #undef S2
12697 #undef S3
12698 #undef S4
12699
12700 /* Bit masks used in type checking given instructions.
12701   'N_EQK' means the type must be the same as (or based on in some way) the key
12702    type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
12703    set, various other bits can be set as well in order to modify the meaning of
12704    the type constraint.  */
12705
12706 enum neon_type_mask
12707 {
12708   N_S8   = 0x0000001,
12709   N_S16  = 0x0000002,
12710   N_S32  = 0x0000004,
12711   N_S64  = 0x0000008,
12712   N_U8   = 0x0000010,
12713   N_U16  = 0x0000020,
12714   N_U32  = 0x0000040,
12715   N_U64  = 0x0000080,
12716   N_I8   = 0x0000100,
12717   N_I16  = 0x0000200,
12718   N_I32  = 0x0000400,
12719   N_I64  = 0x0000800,
12720   N_8    = 0x0001000,
12721   N_16   = 0x0002000,
12722   N_32   = 0x0004000,
12723   N_64   = 0x0008000,
12724   N_P8   = 0x0010000,
12725   N_P16  = 0x0020000,
12726   N_F16  = 0x0040000,
12727   N_F32  = 0x0080000,
12728   N_F64  = 0x0100000,
12729   N_P64  = 0x0200000,
12730   N_KEY  = 0x1000000, /* Key element (main type specifier).  */
12731   N_EQK  = 0x2000000, /* Given operand has the same type & size as the key.  */
12732   N_VFP  = 0x4000000, /* VFP mode: operand size must match register width.  */
12733   N_UNT  = 0x8000000, /* Must be explicitly untyped.  */
12734   N_DBL  = 0x0000001, /* If N_EQK, this operand is twice the size.  */
12735   N_HLF  = 0x0000002, /* If N_EQK, this operand is half the size.  */
12736   N_SGN  = 0x0000004, /* If N_EQK, this operand is forced to be signed.  */
12737   N_UNS  = 0x0000008, /* If N_EQK, this operand is forced to be unsigned.  */
12738   N_INT  = 0x0000010, /* If N_EQK, this operand is forced to be integer.  */
12739   N_FLT  = 0x0000020, /* If N_EQK, this operand is forced to be float.  */
12740   N_SIZ  = 0x0000040, /* If N_EQK, this operand is forced to be size-only.  */
12741   N_UTYP = 0,
12742   N_MAX_NONSPECIAL = N_P64
12743 };
12744
12745 #define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
12746
12747 #define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
12748 #define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
12749 #define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
12750 #define N_SUF_32   (N_SU_32 | N_F32)
12751 #define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
12752 #define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F32)
12753
12754 /* Pass this as the first type argument to neon_check_type to ignore types
12755    altogether.  */
12756 #define N_IGNORE_TYPE (N_KEY | N_EQK)
12757
12758 /* Select a "shape" for the current instruction (describing register types or
12759    sizes) from a list of alternatives. Return NS_NULL if the current instruction
12760    doesn't fit. For non-polymorphic shapes, checking is usually done as a
12761    function of operand parsing, so this function doesn't need to be called.
12762    Shapes should be listed in order of decreasing length.  */
12763
12764 static enum neon_shape
12765 neon_select_shape (enum neon_shape shape, ...)
12766 {
12767   va_list ap;
12768   enum neon_shape first_shape = shape;
12769
12770   /* Fix missing optional operands. FIXME: we don't know at this point how
12771      many arguments we should have, so this makes the assumption that we have
12772      > 1. This is true of all current Neon opcodes, I think, but may not be
12773      true in the future.  */
12774   if (!inst.operands[1].present)
12775     inst.operands[1] = inst.operands[0];
12776
12777   va_start (ap, shape);
12778
12779   for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
12780     {
12781       unsigned j;
12782       int matches = 1;
12783
12784       for (j = 0; j < neon_shape_tab[shape].els; j++)
12785         {
12786           if (!inst.operands[j].present)
12787             {
12788               matches = 0;
12789               break;
12790             }
12791
12792           switch (neon_shape_tab[shape].el[j])
12793             {
12794             case SE_F:
12795               if (!(inst.operands[j].isreg
12796                     && inst.operands[j].isvec
12797                     && inst.operands[j].issingle
12798                     && !inst.operands[j].isquad))
12799                 matches = 0;
12800               break;
12801
12802             case SE_D:
12803               if (!(inst.operands[j].isreg
12804                     && inst.operands[j].isvec
12805                     && !inst.operands[j].isquad
12806                     && !inst.operands[j].issingle))
12807                 matches = 0;
12808               break;
12809
12810             case SE_R:
12811               if (!(inst.operands[j].isreg
12812                     && !inst.operands[j].isvec))
12813                 matches = 0;
12814               break;
12815
12816             case SE_Q:
12817               if (!(inst.operands[j].isreg
12818                     && inst.operands[j].isvec
12819                     && inst.operands[j].isquad
12820                     && !inst.operands[j].issingle))
12821                 matches = 0;
12822               break;
12823
12824             case SE_I:
12825               if (!(!inst.operands[j].isreg
12826                     && !inst.operands[j].isscalar))
12827                 matches = 0;
12828               break;
12829
12830             case SE_S:
12831               if (!(!inst.operands[j].isreg
12832                     && inst.operands[j].isscalar))
12833                 matches = 0;
12834               break;
12835
12836             case SE_L:
12837               break;
12838             }
12839           if (!matches)
12840             break;
12841         }
12842       if (matches && (j >= ARM_IT_MAX_OPERANDS || !inst.operands[j].present))
12843         /* We've matched all the entries in the shape table, and we don't
12844            have any left over operands which have not been matched.  */
12845         break;
12846     }
12847
12848   va_end (ap);
12849
12850   if (shape == NS_NULL && first_shape != NS_NULL)
12851     first_error (_("invalid instruction shape"));
12852
12853   return shape;
12854 }
12855
12856 /* True if SHAPE is predominantly a quadword operation (most of the time, this
12857    means the Q bit should be set).  */
12858
12859 static int
12860 neon_quad (enum neon_shape shape)
12861 {
12862   return neon_shape_class[shape] == SC_QUAD;
12863 }
12864
12865 static void
12866 neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
12867                        unsigned *g_size)
12868 {
12869   /* Allow modification to be made to types which are constrained to be
12870      based on the key element, based on bits set alongside N_EQK.  */
12871   if ((typebits & N_EQK) != 0)
12872     {
12873       if ((typebits & N_HLF) != 0)
12874         *g_size /= 2;
12875       else if ((typebits & N_DBL) != 0)
12876         *g_size *= 2;
12877       if ((typebits & N_SGN) != 0)
12878         *g_type = NT_signed;
12879       else if ((typebits & N_UNS) != 0)
12880         *g_type = NT_unsigned;
12881       else if ((typebits & N_INT) != 0)
12882         *g_type = NT_integer;
12883       else if ((typebits & N_FLT) != 0)
12884         *g_type = NT_float;
12885       else if ((typebits & N_SIZ) != 0)
12886         *g_type = NT_untyped;
12887     }
12888 }
12889
12890 /* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
12891    operand type, i.e. the single type specified in a Neon instruction when it
12892    is the only one given.  */
12893
12894 static struct neon_type_el
12895 neon_type_promote (struct neon_type_el *key, unsigned thisarg)
12896 {
12897   struct neon_type_el dest = *key;
12898
12899   gas_assert ((thisarg & N_EQK) != 0);
12900
12901   neon_modify_type_size (thisarg, &dest.type, &dest.size);
12902
12903   return dest;
12904 }
12905
12906 /* Convert Neon type and size into compact bitmask representation.  */
12907
12908 static enum neon_type_mask
12909 type_chk_of_el_type (enum neon_el_type type, unsigned size)
12910 {
12911   switch (type)
12912     {
12913     case NT_untyped:
12914       switch (size)
12915         {
12916         case 8:  return N_8;
12917         case 16: return N_16;
12918         case 32: return N_32;
12919         case 64: return N_64;
12920         default: ;
12921         }
12922       break;
12923
12924     case NT_integer:
12925       switch (size)
12926         {
12927         case 8:  return N_I8;
12928         case 16: return N_I16;
12929         case 32: return N_I32;
12930         case 64: return N_I64;
12931         default: ;
12932         }
12933       break;
12934
12935     case NT_float:
12936       switch (size)
12937         {
12938         case 16: return N_F16;
12939         case 32: return N_F32;
12940         case 64: return N_F64;
12941         default: ;
12942         }
12943       break;
12944
12945     case NT_poly:
12946       switch (size)
12947         {
12948         case 8:  return N_P8;
12949         case 16: return N_P16;
12950         case 64: return N_P64;
12951         default: ;
12952         }
12953       break;
12954
12955     case NT_signed:
12956       switch (size)
12957         {
12958         case 8:  return N_S8;
12959         case 16: return N_S16;
12960         case 32: return N_S32;
12961         case 64: return N_S64;
12962         default: ;
12963         }
12964       break;
12965
12966     case NT_unsigned:
12967       switch (size)
12968         {
12969         case 8:  return N_U8;
12970         case 16: return N_U16;
12971         case 32: return N_U32;
12972         case 64: return N_U64;
12973         default: ;
12974         }
12975       break;
12976
12977     default: ;
12978     }
12979
12980   return N_UTYP;
12981 }
12982
12983 /* Convert compact Neon bitmask type representation to a type and size. Only
12984    handles the case where a single bit is set in the mask.  */
12985
12986 static int
12987 el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
12988                      enum neon_type_mask mask)
12989 {
12990   if ((mask & N_EQK) != 0)
12991     return FAIL;
12992
12993   if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
12994     *size = 8;
12995   else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_F16 | N_P16)) != 0)
12996     *size = 16;
12997   else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
12998     *size = 32;
12999   else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64 | N_P64)) != 0)
13000     *size = 64;
13001   else
13002     return FAIL;
13003
13004   if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
13005     *type = NT_signed;
13006   else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
13007     *type = NT_unsigned;
13008   else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
13009     *type = NT_integer;
13010   else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
13011     *type = NT_untyped;
13012   else if ((mask & (N_P8 | N_P16 | N_P64)) != 0)
13013     *type = NT_poly;
13014   else if ((mask & (N_F16 | N_F32 | N_F64)) != 0)
13015     *type = NT_float;
13016   else
13017     return FAIL;
13018
13019   return SUCCESS;
13020 }
13021
13022 /* Modify a bitmask of allowed types. This is only needed for type
13023    relaxation.  */
13024
13025 static unsigned
13026 modify_types_allowed (unsigned allowed, unsigned mods)
13027 {
13028   unsigned size;
13029   enum neon_el_type type;
13030   unsigned destmask;
13031   int i;
13032
13033   destmask = 0;
13034
13035   for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
13036     {
13037       if (el_type_of_type_chk (&type, &size,
13038                                (enum neon_type_mask) (allowed & i)) == SUCCESS)
13039         {
13040           neon_modify_type_size (mods, &type, &size);
13041           destmask |= type_chk_of_el_type (type, size);
13042         }
13043     }
13044
13045   return destmask;
13046 }
13047
13048 /* Check type and return type classification.
13049    The manual states (paraphrase): If one datatype is given, it indicates the
13050    type given in:
13051     - the second operand, if there is one
13052     - the operand, if there is no second operand
13053     - the result, if there are no operands.
13054    This isn't quite good enough though, so we use a concept of a "key" datatype
13055    which is set on a per-instruction basis, which is the one which matters when
13056    only one data type is written.
13057    Note: this function has side-effects (e.g. filling in missing operands). All
13058    Neon instructions should call it before performing bit encoding.  */
13059
13060 static struct neon_type_el
13061 neon_check_type (unsigned els, enum neon_shape ns, ...)
13062 {
13063   va_list ap;
13064   unsigned i, pass, key_el = 0;
13065   unsigned types[NEON_MAX_TYPE_ELS];
13066   enum neon_el_type k_type = NT_invtype;
13067   unsigned k_size = -1u;
13068   struct neon_type_el badtype = {NT_invtype, -1};
13069   unsigned key_allowed = 0;
13070
13071   /* Optional registers in Neon instructions are always (not) in operand 1.
13072      Fill in the missing operand here, if it was omitted.  */
13073   if (els > 1 && !inst.operands[1].present)
13074     inst.operands[1] = inst.operands[0];
13075
13076   /* Suck up all the varargs.  */
13077   va_start (ap, ns);
13078   for (i = 0; i < els; i++)
13079     {
13080       unsigned thisarg = va_arg (ap, unsigned);
13081       if (thisarg == N_IGNORE_TYPE)
13082         {
13083           va_end (ap);
13084           return badtype;
13085         }
13086       types[i] = thisarg;
13087       if ((thisarg & N_KEY) != 0)
13088         key_el = i;
13089     }
13090   va_end (ap);
13091
13092   if (inst.vectype.elems > 0)
13093     for (i = 0; i < els; i++)
13094       if (inst.operands[i].vectype.type != NT_invtype)
13095         {
13096           first_error (_("types specified in both the mnemonic and operands"));
13097           return badtype;
13098         }
13099
13100   /* Duplicate inst.vectype elements here as necessary.
13101      FIXME: No idea if this is exactly the same as the ARM assembler,
13102      particularly when an insn takes one register and one non-register
13103      operand. */
13104   if (inst.vectype.elems == 1 && els > 1)
13105     {
13106       unsigned j;
13107       inst.vectype.elems = els;
13108       inst.vectype.el[key_el] = inst.vectype.el[0];
13109       for (j = 0; j < els; j++)
13110         if (j != key_el)
13111           inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
13112                                                   types[j]);
13113     }
13114   else if (inst.vectype.elems == 0 && els > 0)
13115     {
13116       unsigned j;
13117       /* No types were given after the mnemonic, so look for types specified
13118          after each operand. We allow some flexibility here; as long as the
13119          "key" operand has a type, we can infer the others.  */
13120       for (j = 0; j < els; j++)
13121         if (inst.operands[j].vectype.type != NT_invtype)
13122           inst.vectype.el[j] = inst.operands[j].vectype;
13123
13124       if (inst.operands[key_el].vectype.type != NT_invtype)
13125         {
13126           for (j = 0; j < els; j++)
13127             if (inst.operands[j].vectype.type == NT_invtype)
13128               inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
13129                                                       types[j]);
13130         }
13131       else
13132         {
13133           first_error (_("operand types can't be inferred"));
13134           return badtype;
13135         }
13136     }
13137   else if (inst.vectype.elems != els)
13138     {
13139       first_error (_("type specifier has the wrong number of parts"));
13140       return badtype;
13141     }
13142
13143   for (pass = 0; pass < 2; pass++)
13144     {
13145       for (i = 0; i < els; i++)
13146         {
13147           unsigned thisarg = types[i];
13148           unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
13149             ? modify_types_allowed (key_allowed, thisarg) : thisarg;
13150           enum neon_el_type g_type = inst.vectype.el[i].type;
13151           unsigned g_size = inst.vectype.el[i].size;
13152
13153           /* Decay more-specific signed & unsigned types to sign-insensitive
13154              integer types if sign-specific variants are unavailable.  */
13155           if ((g_type == NT_signed || g_type == NT_unsigned)
13156               && (types_allowed & N_SU_ALL) == 0)
13157             g_type = NT_integer;
13158
13159           /* If only untyped args are allowed, decay any more specific types to
13160              them. Some instructions only care about signs for some element
13161              sizes, so handle that properly.  */
13162           if (((types_allowed & N_UNT) == 0)
13163               && ((g_size == 8 && (types_allowed & N_8) != 0)
13164                   || (g_size == 16 && (types_allowed & N_16) != 0)
13165                   || (g_size == 32 && (types_allowed & N_32) != 0)
13166                   || (g_size == 64 && (types_allowed & N_64) != 0)))
13167             g_type = NT_untyped;
13168
13169           if (pass == 0)
13170             {
13171               if ((thisarg & N_KEY) != 0)
13172                 {
13173                   k_type = g_type;
13174                   k_size = g_size;
13175                   key_allowed = thisarg & ~N_KEY;
13176                 }
13177             }
13178           else
13179             {
13180               if ((thisarg & N_VFP) != 0)
13181                 {
13182                   enum neon_shape_el regshape;
13183                   unsigned regwidth, match;
13184
13185                   /* PR 11136: Catch the case where we are passed a shape of NS_NULL.  */
13186                   if (ns == NS_NULL)
13187                     {
13188                       first_error (_("invalid instruction shape"));
13189                       return badtype;
13190                     }
13191                   regshape = neon_shape_tab[ns].el[i];
13192                   regwidth = neon_shape_el_size[regshape];
13193
13194                   /* In VFP mode, operands must match register widths. If we
13195                      have a key operand, use its width, else use the width of
13196                      the current operand.  */
13197                   if (k_size != -1u)
13198                     match = k_size;
13199                   else
13200                     match = g_size;
13201
13202                   if (regwidth != match)
13203                     {
13204                       first_error (_("operand size must match register width"));
13205                       return badtype;
13206                     }
13207                 }
13208
13209               if ((thisarg & N_EQK) == 0)
13210                 {
13211                   unsigned given_type = type_chk_of_el_type (g_type, g_size);
13212
13213                   if ((given_type & types_allowed) == 0)
13214                     {
13215                       first_error (_("bad type in Neon instruction"));
13216                       return badtype;
13217                     }
13218                 }
13219               else
13220                 {
13221                   enum neon_el_type mod_k_type = k_type;
13222                   unsigned mod_k_size = k_size;
13223                   neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
13224                   if (g_type != mod_k_type || g_size != mod_k_size)
13225                     {
13226                       first_error (_("inconsistent types in Neon instruction"));
13227                       return badtype;
13228                     }
13229                 }
13230             }
13231         }
13232     }
13233
13234   return inst.vectype.el[key_el];
13235 }
13236
13237 /* Neon-style VFP instruction forwarding.  */
13238
13239 /* Thumb VFP instructions have 0xE in the condition field.  */
13240
13241 static void
13242 do_vfp_cond_or_thumb (void)
13243 {
13244   inst.is_neon = 1;
13245
13246   if (thumb_mode)
13247     inst.instruction |= 0xe0000000;
13248   else
13249     inst.instruction |= inst.cond << 28;
13250 }
13251
13252 /* Look up and encode a simple mnemonic, for use as a helper function for the
13253    Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
13254    etc.  It is assumed that operand parsing has already been done, and that the
13255    operands are in the form expected by the given opcode (this isn't necessarily
13256    the same as the form in which they were parsed, hence some massaging must
13257    take place before this function is called).
13258    Checks current arch version against that in the looked-up opcode.  */
13259
13260 static void
13261 do_vfp_nsyn_opcode (const char *opname)
13262 {
13263   const struct asm_opcode *opcode;
13264
13265   opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
13266
13267   if (!opcode)
13268     abort ();
13269
13270   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
13271                 thumb_mode ? *opcode->tvariant : *opcode->avariant),
13272               _(BAD_FPU));
13273
13274   inst.is_neon = 1;
13275
13276   if (thumb_mode)
13277     {
13278       inst.instruction = opcode->tvalue;
13279       opcode->tencode ();
13280     }
13281   else
13282     {
13283       inst.instruction = (inst.cond << 28) | opcode->avalue;
13284       opcode->aencode ();
13285     }
13286 }
13287
13288 static void
13289 do_vfp_nsyn_add_sub (enum neon_shape rs)
13290 {
13291   int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
13292
13293   if (rs == NS_FFF)
13294     {
13295       if (is_add)
13296         do_vfp_nsyn_opcode ("fadds");
13297       else
13298         do_vfp_nsyn_opcode ("fsubs");
13299     }
13300   else
13301     {
13302       if (is_add)
13303         do_vfp_nsyn_opcode ("faddd");
13304       else
13305         do_vfp_nsyn_opcode ("fsubd");
13306     }
13307 }
13308
13309 /* Check operand types to see if this is a VFP instruction, and if so call
13310    PFN ().  */
13311
13312 static int
13313 try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
13314 {
13315   enum neon_shape rs;
13316   struct neon_type_el et;
13317
13318   switch (args)
13319     {
13320     case 2:
13321       rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13322       et = neon_check_type (2, rs,
13323         N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13324       break;
13325
13326     case 3:
13327       rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13328       et = neon_check_type (3, rs,
13329         N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13330       break;
13331
13332     default:
13333       abort ();
13334     }
13335
13336   if (et.type != NT_invtype)
13337     {
13338       pfn (rs);
13339       return SUCCESS;
13340     }
13341
13342   inst.error = NULL;
13343   return FAIL;
13344 }
13345
13346 static void
13347 do_vfp_nsyn_mla_mls (enum neon_shape rs)
13348 {
13349   int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
13350
13351   if (rs == NS_FFF)
13352     {
13353       if (is_mla)
13354         do_vfp_nsyn_opcode ("fmacs");
13355       else
13356         do_vfp_nsyn_opcode ("fnmacs");
13357     }
13358   else
13359     {
13360       if (is_mla)
13361         do_vfp_nsyn_opcode ("fmacd");
13362       else
13363         do_vfp_nsyn_opcode ("fnmacd");
13364     }
13365 }
13366
13367 static void
13368 do_vfp_nsyn_fma_fms (enum neon_shape rs)
13369 {
13370   int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
13371
13372   if (rs == NS_FFF)
13373     {
13374       if (is_fma)
13375         do_vfp_nsyn_opcode ("ffmas");
13376       else
13377         do_vfp_nsyn_opcode ("ffnmas");
13378     }
13379   else
13380     {
13381       if (is_fma)
13382         do_vfp_nsyn_opcode ("ffmad");
13383       else
13384         do_vfp_nsyn_opcode ("ffnmad");
13385     }
13386 }
13387
13388 static void
13389 do_vfp_nsyn_mul (enum neon_shape rs)
13390 {
13391   if (rs == NS_FFF)
13392     do_vfp_nsyn_opcode ("fmuls");
13393   else
13394     do_vfp_nsyn_opcode ("fmuld");
13395 }
13396
13397 static void
13398 do_vfp_nsyn_abs_neg (enum neon_shape rs)
13399 {
13400   int is_neg = (inst.instruction & 0x80) != 0;
13401   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
13402
13403   if (rs == NS_FF)
13404     {
13405       if (is_neg)
13406         do_vfp_nsyn_opcode ("fnegs");
13407       else
13408         do_vfp_nsyn_opcode ("fabss");
13409     }
13410   else
13411     {
13412       if (is_neg)
13413         do_vfp_nsyn_opcode ("fnegd");
13414       else
13415         do_vfp_nsyn_opcode ("fabsd");
13416     }
13417 }
13418
13419 /* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
13420    insns belong to Neon, and are handled elsewhere.  */
13421
13422 static void
13423 do_vfp_nsyn_ldm_stm (int is_dbmode)
13424 {
13425   int is_ldm = (inst.instruction & (1 << 20)) != 0;
13426   if (is_ldm)
13427     {
13428       if (is_dbmode)
13429         do_vfp_nsyn_opcode ("fldmdbs");
13430       else
13431         do_vfp_nsyn_opcode ("fldmias");
13432     }
13433   else
13434     {
13435       if (is_dbmode)
13436         do_vfp_nsyn_opcode ("fstmdbs");
13437       else
13438         do_vfp_nsyn_opcode ("fstmias");
13439     }
13440 }
13441
13442 static void
13443 do_vfp_nsyn_sqrt (void)
13444 {
13445   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13446   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13447
13448   if (rs == NS_FF)
13449     do_vfp_nsyn_opcode ("fsqrts");
13450   else
13451     do_vfp_nsyn_opcode ("fsqrtd");
13452 }
13453
13454 static void
13455 do_vfp_nsyn_div (void)
13456 {
13457   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13458   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13459     N_F32 | N_F64 | N_KEY | N_VFP);
13460
13461   if (rs == NS_FFF)
13462     do_vfp_nsyn_opcode ("fdivs");
13463   else
13464     do_vfp_nsyn_opcode ("fdivd");
13465 }
13466
13467 static void
13468 do_vfp_nsyn_nmul (void)
13469 {
13470   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13471   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13472     N_F32 | N_F64 | N_KEY | N_VFP);
13473
13474   if (rs == NS_FFF)
13475     {
13476       NEON_ENCODE (SINGLE, inst);
13477       do_vfp_sp_dyadic ();
13478     }
13479   else
13480     {
13481       NEON_ENCODE (DOUBLE, inst);
13482       do_vfp_dp_rd_rn_rm ();
13483     }
13484   do_vfp_cond_or_thumb ();
13485 }
13486
13487 static void
13488 do_vfp_nsyn_cmp (void)
13489 {
13490   if (inst.operands[1].isreg)
13491     {
13492       enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13493       neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13494
13495       if (rs == NS_FF)
13496         {
13497           NEON_ENCODE (SINGLE, inst);
13498           do_vfp_sp_monadic ();
13499         }
13500       else
13501         {
13502           NEON_ENCODE (DOUBLE, inst);
13503           do_vfp_dp_rd_rm ();
13504         }
13505     }
13506   else
13507     {
13508       enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
13509       neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
13510
13511       switch (inst.instruction & 0x0fffffff)
13512         {
13513         case N_MNEM_vcmp:
13514           inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
13515           break;
13516         case N_MNEM_vcmpe:
13517           inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
13518           break;
13519         default:
13520           abort ();
13521         }
13522
13523       if (rs == NS_FI)
13524         {
13525           NEON_ENCODE (SINGLE, inst);
13526           do_vfp_sp_compare_z ();
13527         }
13528       else
13529         {
13530           NEON_ENCODE (DOUBLE, inst);
13531           do_vfp_dp_rd ();
13532         }
13533     }
13534   do_vfp_cond_or_thumb ();
13535 }
13536
13537 static void
13538 nsyn_insert_sp (void)
13539 {
13540   inst.operands[1] = inst.operands[0];
13541   memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
13542   inst.operands[0].reg = REG_SP;
13543   inst.operands[0].isreg = 1;
13544   inst.operands[0].writeback = 1;
13545   inst.operands[0].present = 1;
13546 }
13547
13548 static void
13549 do_vfp_nsyn_push (void)
13550 {
13551   nsyn_insert_sp ();
13552   if (inst.operands[1].issingle)
13553     do_vfp_nsyn_opcode ("fstmdbs");
13554   else
13555     do_vfp_nsyn_opcode ("fstmdbd");
13556 }
13557
13558 static void
13559 do_vfp_nsyn_pop (void)
13560 {
13561   nsyn_insert_sp ();
13562   if (inst.operands[1].issingle)
13563     do_vfp_nsyn_opcode ("fldmias");
13564   else
13565     do_vfp_nsyn_opcode ("fldmiad");
13566 }
13567
13568 /* Fix up Neon data-processing instructions, ORing in the correct bits for
13569    ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
13570
13571 static void
13572 neon_dp_fixup (struct arm_it* insn)
13573 {
13574   unsigned int i = insn->instruction;
13575   insn->is_neon = 1;
13576
13577   if (thumb_mode)
13578     {
13579       /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
13580       if (i & (1 << 24))
13581         i |= 1 << 28;
13582
13583       i &= ~(1 << 24);
13584
13585       i |= 0xef000000;
13586     }
13587   else
13588     i |= 0xf2000000;
13589
13590   insn->instruction = i;
13591 }
13592
13593 /* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
13594    (0, 1, 2, 3).  */
13595
13596 static unsigned
13597 neon_logbits (unsigned x)
13598 {
13599   return ffs (x) - 4;
13600 }
13601
13602 #define LOW4(R) ((R) & 0xf)
13603 #define HI1(R) (((R) >> 4) & 1)
13604
13605 /* Encode insns with bit pattern:
13606
13607   |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
13608   |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
13609
13610   SIZE is passed in bits. -1 means size field isn't changed, in case it has a
13611   different meaning for some instruction.  */
13612
13613 static void
13614 neon_three_same (int isquad, int ubit, int size)
13615 {
13616   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13617   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13618   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13619   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13620   inst.instruction |= LOW4 (inst.operands[2].reg);
13621   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13622   inst.instruction |= (isquad != 0) << 6;
13623   inst.instruction |= (ubit != 0) << 24;
13624   if (size != -1)
13625     inst.instruction |= neon_logbits (size) << 20;
13626
13627   neon_dp_fixup (&inst);
13628 }
13629
13630 /* Encode instructions of the form:
13631
13632   |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
13633   |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
13634
13635   Don't write size if SIZE == -1.  */
13636
13637 static void
13638 neon_two_same (int qbit, int ubit, int size)
13639 {
13640   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13641   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13642   inst.instruction |= LOW4 (inst.operands[1].reg);
13643   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13644   inst.instruction |= (qbit != 0) << 6;
13645   inst.instruction |= (ubit != 0) << 24;
13646
13647   if (size != -1)
13648     inst.instruction |= neon_logbits (size) << 18;
13649
13650   neon_dp_fixup (&inst);
13651 }
13652
13653 /* Neon instruction encoders, in approximate order of appearance.  */
13654
13655 static void
13656 do_neon_dyadic_i_su (void)
13657 {
13658   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13659   struct neon_type_el et = neon_check_type (3, rs,
13660     N_EQK, N_EQK, N_SU_32 | N_KEY);
13661   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13662 }
13663
13664 static void
13665 do_neon_dyadic_i64_su (void)
13666 {
13667   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13668   struct neon_type_el et = neon_check_type (3, rs,
13669     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13670   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13671 }
13672
13673 static void
13674 neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
13675                 unsigned immbits)
13676 {
13677   unsigned size = et.size >> 3;
13678   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13679   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13680   inst.instruction |= LOW4 (inst.operands[1].reg);
13681   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13682   inst.instruction |= (isquad != 0) << 6;
13683   inst.instruction |= immbits << 16;
13684   inst.instruction |= (size >> 3) << 7;
13685   inst.instruction |= (size & 0x7) << 19;
13686   if (write_ubit)
13687     inst.instruction |= (uval != 0) << 24;
13688
13689   neon_dp_fixup (&inst);
13690 }
13691
13692 static void
13693 do_neon_shl_imm (void)
13694 {
13695   if (!inst.operands[2].isreg)
13696     {
13697       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13698       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
13699       NEON_ENCODE (IMMED, inst);
13700       neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
13701     }
13702   else
13703     {
13704       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13705       struct neon_type_el et = neon_check_type (3, rs,
13706         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13707       unsigned int tmp;
13708
13709       /* VSHL/VQSHL 3-register variants have syntax such as:
13710            vshl.xx Dd, Dm, Dn
13711          whereas other 3-register operations encoded by neon_three_same have
13712          syntax like:
13713            vadd.xx Dd, Dn, Dm
13714          (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
13715          here.  */
13716       tmp = inst.operands[2].reg;
13717       inst.operands[2].reg = inst.operands[1].reg;
13718       inst.operands[1].reg = tmp;
13719       NEON_ENCODE (INTEGER, inst);
13720       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13721     }
13722 }
13723
13724 static void
13725 do_neon_qshl_imm (void)
13726 {
13727   if (!inst.operands[2].isreg)
13728     {
13729       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13730       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
13731
13732       NEON_ENCODE (IMMED, inst);
13733       neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
13734                       inst.operands[2].imm);
13735     }
13736   else
13737     {
13738       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13739       struct neon_type_el et = neon_check_type (3, rs,
13740         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13741       unsigned int tmp;
13742
13743       /* See note in do_neon_shl_imm.  */
13744       tmp = inst.operands[2].reg;
13745       inst.operands[2].reg = inst.operands[1].reg;
13746       inst.operands[1].reg = tmp;
13747       NEON_ENCODE (INTEGER, inst);
13748       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13749     }
13750 }
13751
13752 static void
13753 do_neon_rshl (void)
13754 {
13755   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13756   struct neon_type_el et = neon_check_type (3, rs,
13757     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13758   unsigned int tmp;
13759
13760   tmp = inst.operands[2].reg;
13761   inst.operands[2].reg = inst.operands[1].reg;
13762   inst.operands[1].reg = tmp;
13763   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13764 }
13765
13766 static int
13767 neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
13768 {
13769   /* Handle .I8 pseudo-instructions.  */
13770   if (size == 8)
13771     {
13772       /* Unfortunately, this will make everything apart from zero out-of-range.
13773          FIXME is this the intended semantics? There doesn't seem much point in
13774          accepting .I8 if so.  */
13775       immediate |= immediate << 8;
13776       size = 16;
13777     }
13778
13779   if (size >= 32)
13780     {
13781       if (immediate == (immediate & 0x000000ff))
13782         {
13783           *immbits = immediate;
13784           return 0x1;
13785         }
13786       else if (immediate == (immediate & 0x0000ff00))
13787         {
13788           *immbits = immediate >> 8;
13789           return 0x3;
13790         }
13791       else if (immediate == (immediate & 0x00ff0000))
13792         {
13793           *immbits = immediate >> 16;
13794           return 0x5;
13795         }
13796       else if (immediate == (immediate & 0xff000000))
13797         {
13798           *immbits = immediate >> 24;
13799           return 0x7;
13800         }
13801       if ((immediate & 0xffff) != (immediate >> 16))
13802         goto bad_immediate;
13803       immediate &= 0xffff;
13804     }
13805
13806   if (immediate == (immediate & 0x000000ff))
13807     {
13808       *immbits = immediate;
13809       return 0x9;
13810     }
13811   else if (immediate == (immediate & 0x0000ff00))
13812     {
13813       *immbits = immediate >> 8;
13814       return 0xb;
13815     }
13816
13817   bad_immediate:
13818   first_error (_("immediate value out of range"));
13819   return FAIL;
13820 }
13821
13822 /* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
13823    A, B, C, D.  */
13824
13825 static int
13826 neon_bits_same_in_bytes (unsigned imm)
13827 {
13828   return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
13829          && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
13830          && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
13831          && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
13832 }
13833
13834 /* For immediate of above form, return 0bABCD.  */
13835
13836 static unsigned
13837 neon_squash_bits (unsigned imm)
13838 {
13839   return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
13840          | ((imm & 0x01000000) >> 21);
13841 }
13842
13843 /* Compress quarter-float representation to 0b...000 abcdefgh.  */
13844
13845 static unsigned
13846 neon_qfloat_bits (unsigned imm)
13847 {
13848   return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
13849 }
13850
13851 /* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
13852    the instruction. *OP is passed as the initial value of the op field, and
13853    may be set to a different value depending on the constant (i.e.
13854    "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
13855    MVN).  If the immediate looks like a repeated pattern then also
13856    try smaller element sizes.  */
13857
13858 static int
13859 neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
13860                          unsigned *immbits, int *op, int size,
13861                          enum neon_el_type type)
13862 {
13863   /* Only permit float immediates (including 0.0/-0.0) if the operand type is
13864      float.  */
13865   if (type == NT_float && !float_p)
13866     return FAIL;
13867
13868   if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
13869     {
13870       if (size != 32 || *op == 1)
13871         return FAIL;
13872       *immbits = neon_qfloat_bits (immlo);
13873       return 0xf;
13874     }
13875
13876   if (size == 64)
13877     {
13878       if (neon_bits_same_in_bytes (immhi)
13879           && neon_bits_same_in_bytes (immlo))
13880         {
13881           if (*op == 1)
13882             return FAIL;
13883           *immbits = (neon_squash_bits (immhi) << 4)
13884                      | neon_squash_bits (immlo);
13885           *op = 1;
13886           return 0xe;
13887         }
13888
13889       if (immhi != immlo)
13890         return FAIL;
13891     }
13892
13893   if (size >= 32)
13894     {
13895       if (immlo == (immlo & 0x000000ff))
13896         {
13897           *immbits = immlo;
13898           return 0x0;
13899         }
13900       else if (immlo == (immlo & 0x0000ff00))
13901         {
13902           *immbits = immlo >> 8;
13903           return 0x2;
13904         }
13905       else if (immlo == (immlo & 0x00ff0000))
13906         {
13907           *immbits = immlo >> 16;
13908           return 0x4;
13909         }
13910       else if (immlo == (immlo & 0xff000000))
13911         {
13912           *immbits = immlo >> 24;
13913           return 0x6;
13914         }
13915       else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
13916         {
13917           *immbits = (immlo >> 8) & 0xff;
13918           return 0xc;
13919         }
13920       else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
13921         {
13922           *immbits = (immlo >> 16) & 0xff;
13923           return 0xd;
13924         }
13925
13926       if ((immlo & 0xffff) != (immlo >> 16))
13927         return FAIL;
13928       immlo &= 0xffff;
13929     }
13930
13931   if (size >= 16)
13932     {
13933       if (immlo == (immlo & 0x000000ff))
13934         {
13935           *immbits = immlo;
13936           return 0x8;
13937         }
13938       else if (immlo == (immlo & 0x0000ff00))
13939         {
13940           *immbits = immlo >> 8;
13941           return 0xa;
13942         }
13943
13944       if ((immlo & 0xff) != (immlo >> 8))
13945         return FAIL;
13946       immlo &= 0xff;
13947     }
13948
13949   if (immlo == (immlo & 0x000000ff))
13950     {
13951       /* Don't allow MVN with 8-bit immediate.  */
13952       if (*op == 1)
13953         return FAIL;
13954       *immbits = immlo;
13955       return 0xe;
13956     }
13957
13958   return FAIL;
13959 }
13960
13961 /* Write immediate bits [7:0] to the following locations:
13962
13963   |28/24|23     19|18 16|15                    4|3     0|
13964   |  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|
13965
13966   This function is used by VMOV/VMVN/VORR/VBIC.  */
13967
13968 static void
13969 neon_write_immbits (unsigned immbits)
13970 {
13971   inst.instruction |= immbits & 0xf;
13972   inst.instruction |= ((immbits >> 4) & 0x7) << 16;
13973   inst.instruction |= ((immbits >> 7) & 0x1) << 24;
13974 }
13975
13976 /* Invert low-order SIZE bits of XHI:XLO.  */
13977
13978 static void
13979 neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
13980 {
13981   unsigned immlo = xlo ? *xlo : 0;
13982   unsigned immhi = xhi ? *xhi : 0;
13983
13984   switch (size)
13985     {
13986     case 8:
13987       immlo = (~immlo) & 0xff;
13988       break;
13989
13990     case 16:
13991       immlo = (~immlo) & 0xffff;
13992       break;
13993
13994     case 64:
13995       immhi = (~immhi) & 0xffffffff;
13996       /* fall through.  */
13997
13998     case 32:
13999       immlo = (~immlo) & 0xffffffff;
14000       break;
14001
14002     default:
14003       abort ();
14004     }
14005
14006   if (xlo)
14007     *xlo = immlo;
14008
14009   if (xhi)
14010     *xhi = immhi;
14011 }
14012
14013 static void
14014 do_neon_logic (void)
14015 {
14016   if (inst.operands[2].present && inst.operands[2].isreg)
14017     {
14018       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14019       neon_check_type (3, rs, N_IGNORE_TYPE);
14020       /* U bit and size field were set as part of the bitmask.  */
14021       NEON_ENCODE (INTEGER, inst);
14022       neon_three_same (neon_quad (rs), 0, -1);
14023     }
14024   else
14025     {
14026       const int three_ops_form = (inst.operands[2].present
14027                                   && !inst.operands[2].isreg);
14028       const int immoperand = (three_ops_form ? 2 : 1);
14029       enum neon_shape rs = (three_ops_form
14030                             ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
14031                             : neon_select_shape (NS_DI, NS_QI, NS_NULL));
14032       struct neon_type_el et = neon_check_type (2, rs,
14033         N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
14034       enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
14035       unsigned immbits;
14036       int cmode;
14037
14038       if (et.type == NT_invtype)
14039         return;
14040
14041       if (three_ops_form)
14042         constraint (inst.operands[0].reg != inst.operands[1].reg,
14043                     _("first and second operands shall be the same register"));
14044
14045       NEON_ENCODE (IMMED, inst);
14046
14047       immbits = inst.operands[immoperand].imm;
14048       if (et.size == 64)
14049         {
14050           /* .i64 is a pseudo-op, so the immediate must be a repeating
14051              pattern.  */
14052           if (immbits != (inst.operands[immoperand].regisimm ?
14053                           inst.operands[immoperand].reg : 0))
14054             {
14055               /* Set immbits to an invalid constant.  */
14056               immbits = 0xdeadbeef;
14057             }
14058         }
14059
14060       switch (opcode)
14061         {
14062         case N_MNEM_vbic:
14063           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14064           break;
14065
14066         case N_MNEM_vorr:
14067           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14068           break;
14069
14070         case N_MNEM_vand:
14071           /* Pseudo-instruction for VBIC.  */
14072           neon_invert_size (&immbits, 0, et.size);
14073           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14074           break;
14075
14076         case N_MNEM_vorn:
14077           /* Pseudo-instruction for VORR.  */
14078           neon_invert_size (&immbits, 0, et.size);
14079           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14080           break;
14081
14082         default:
14083           abort ();
14084         }
14085
14086       if (cmode == FAIL)
14087         return;
14088
14089       inst.instruction |= neon_quad (rs) << 6;
14090       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14091       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14092       inst.instruction |= cmode << 8;
14093       neon_write_immbits (immbits);
14094
14095       neon_dp_fixup (&inst);
14096     }
14097 }
14098
14099 static void
14100 do_neon_bitfield (void)
14101 {
14102   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14103   neon_check_type (3, rs, N_IGNORE_TYPE);
14104   neon_three_same (neon_quad (rs), 0, -1);
14105 }
14106
14107 static void
14108 neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
14109                   unsigned destbits)
14110 {
14111   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14112   struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
14113                                             types | N_KEY);
14114   if (et.type == NT_float)
14115     {
14116       NEON_ENCODE (FLOAT, inst);
14117       neon_three_same (neon_quad (rs), 0, -1);
14118     }
14119   else
14120     {
14121       NEON_ENCODE (INTEGER, inst);
14122       neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
14123     }
14124 }
14125
14126 static void
14127 do_neon_dyadic_if_su (void)
14128 {
14129   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
14130 }
14131
14132 static void
14133 do_neon_dyadic_if_su_d (void)
14134 {
14135   /* This version only allow D registers, but that constraint is enforced during
14136      operand parsing so we don't need to do anything extra here.  */
14137   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
14138 }
14139
14140 static void
14141 do_neon_dyadic_if_i_d (void)
14142 {
14143   /* The "untyped" case can't happen. Do this to stop the "U" bit being
14144      affected if we specify unsigned args.  */
14145   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14146 }
14147
14148 enum vfp_or_neon_is_neon_bits
14149 {
14150   NEON_CHECK_CC = 1,
14151   NEON_CHECK_ARCH = 2,
14152   NEON_CHECK_ARCH8 = 4
14153 };
14154
14155 /* Call this function if an instruction which may have belonged to the VFP or
14156    Neon instruction sets, but turned out to be a Neon instruction (due to the
14157    operand types involved, etc.). We have to check and/or fix-up a couple of
14158    things:
14159
14160      - Make sure the user hasn't attempted to make a Neon instruction
14161        conditional.
14162      - Alter the value in the condition code field if necessary.
14163      - Make sure that the arch supports Neon instructions.
14164
14165    Which of these operations take place depends on bits from enum
14166    vfp_or_neon_is_neon_bits.
14167
14168    WARNING: This function has side effects! If NEON_CHECK_CC is used and the
14169    current instruction's condition is COND_ALWAYS, the condition field is
14170    changed to inst.uncond_value. This is necessary because instructions shared
14171    between VFP and Neon may be conditional for the VFP variants only, and the
14172    unconditional Neon version must have, e.g., 0xF in the condition field.  */
14173
14174 static int
14175 vfp_or_neon_is_neon (unsigned check)
14176 {
14177   /* Conditions are always legal in Thumb mode (IT blocks).  */
14178   if (!thumb_mode && (check & NEON_CHECK_CC))
14179     {
14180       if (inst.cond != COND_ALWAYS)
14181         {
14182           first_error (_(BAD_COND));
14183           return FAIL;
14184         }
14185       if (inst.uncond_value != -1)
14186         inst.instruction |= inst.uncond_value << 28;
14187     }
14188
14189   if ((check & NEON_CHECK_ARCH)
14190       && !mark_feature_used (&fpu_neon_ext_v1))
14191     {
14192       first_error (_(BAD_FPU));
14193       return FAIL;
14194     }
14195
14196   if ((check & NEON_CHECK_ARCH8)
14197       && !mark_feature_used (&fpu_neon_ext_armv8))
14198     {
14199       first_error (_(BAD_FPU));
14200       return FAIL;
14201     }
14202
14203   return SUCCESS;
14204 }
14205
14206 static void
14207 do_neon_addsub_if_i (void)
14208 {
14209   if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
14210     return;
14211
14212   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14213     return;
14214
14215   /* The "untyped" case can't happen. Do this to stop the "U" bit being
14216      affected if we specify unsigned args.  */
14217   neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
14218 }
14219
14220 /* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
14221    result to be:
14222      V<op> A,B     (A is operand 0, B is operand 2)
14223    to mean:
14224      V<op> A,B,A
14225    not:
14226      V<op> A,B,B
14227    so handle that case specially.  */
14228
14229 static void
14230 neon_exchange_operands (void)
14231 {
14232   void *scratch = alloca (sizeof (inst.operands[0]));
14233   if (inst.operands[1].present)
14234     {
14235       /* Swap operands[1] and operands[2].  */
14236       memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
14237       inst.operands[1] = inst.operands[2];
14238       memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
14239     }
14240   else
14241     {
14242       inst.operands[1] = inst.operands[2];
14243       inst.operands[2] = inst.operands[0];
14244     }
14245 }
14246
14247 static void
14248 neon_compare (unsigned regtypes, unsigned immtypes, int invert)
14249 {
14250   if (inst.operands[2].isreg)
14251     {
14252       if (invert)
14253         neon_exchange_operands ();
14254       neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
14255     }
14256   else
14257     {
14258       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14259       struct neon_type_el et = neon_check_type (2, rs,
14260         N_EQK | N_SIZ, immtypes | N_KEY);
14261
14262       NEON_ENCODE (IMMED, inst);
14263       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14264       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14265       inst.instruction |= LOW4 (inst.operands[1].reg);
14266       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14267       inst.instruction |= neon_quad (rs) << 6;
14268       inst.instruction |= (et.type == NT_float) << 10;
14269       inst.instruction |= neon_logbits (et.size) << 18;
14270
14271       neon_dp_fixup (&inst);
14272     }
14273 }
14274
14275 static void
14276 do_neon_cmp (void)
14277 {
14278   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
14279 }
14280
14281 static void
14282 do_neon_cmp_inv (void)
14283 {
14284   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
14285 }
14286
14287 static void
14288 do_neon_ceq (void)
14289 {
14290   neon_compare (N_IF_32, N_IF_32, FALSE);
14291 }
14292
14293 /* For multiply instructions, we have the possibility of 16-bit or 32-bit
14294    scalars, which are encoded in 5 bits, M : Rm.
14295    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
14296    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
14297    index in M.  */
14298
14299 static unsigned
14300 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
14301 {
14302   unsigned regno = NEON_SCALAR_REG (scalar);
14303   unsigned elno = NEON_SCALAR_INDEX (scalar);
14304
14305   switch (elsize)
14306     {
14307     case 16:
14308       if (regno > 7 || elno > 3)
14309         goto bad_scalar;
14310       return regno | (elno << 3);
14311
14312     case 32:
14313       if (regno > 15 || elno > 1)
14314         goto bad_scalar;
14315       return regno | (elno << 4);
14316
14317     default:
14318     bad_scalar:
14319       first_error (_("scalar out of range for multiply instruction"));
14320     }
14321
14322   return 0;
14323 }
14324
14325 /* Encode multiply / multiply-accumulate scalar instructions.  */
14326
14327 static void
14328 neon_mul_mac (struct neon_type_el et, int ubit)
14329 {
14330   unsigned scalar;
14331
14332   /* Give a more helpful error message if we have an invalid type.  */
14333   if (et.type == NT_invtype)
14334     return;
14335
14336   scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
14337   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14338   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14339   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14340   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14341   inst.instruction |= LOW4 (scalar);
14342   inst.instruction |= HI1 (scalar) << 5;
14343   inst.instruction |= (et.type == NT_float) << 8;
14344   inst.instruction |= neon_logbits (et.size) << 20;
14345   inst.instruction |= (ubit != 0) << 24;
14346
14347   neon_dp_fixup (&inst);
14348 }
14349
14350 static void
14351 do_neon_mac_maybe_scalar (void)
14352 {
14353   if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
14354     return;
14355
14356   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14357     return;
14358
14359   if (inst.operands[2].isscalar)
14360     {
14361       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
14362       struct neon_type_el et = neon_check_type (3, rs,
14363         N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
14364       NEON_ENCODE (SCALAR, inst);
14365       neon_mul_mac (et, neon_quad (rs));
14366     }
14367   else
14368     {
14369       /* The "untyped" case can't happen.  Do this to stop the "U" bit being
14370          affected if we specify unsigned args.  */
14371       neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14372     }
14373 }
14374
14375 static void
14376 do_neon_fmac (void)
14377 {
14378   if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
14379     return;
14380
14381   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14382     return;
14383
14384   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14385 }
14386
14387 static void
14388 do_neon_tst (void)
14389 {
14390   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14391   struct neon_type_el et = neon_check_type (3, rs,
14392     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
14393   neon_three_same (neon_quad (rs), 0, et.size);
14394 }
14395
14396 /* VMUL with 3 registers allows the P8 type. The scalar version supports the
14397    same types as the MAC equivalents. The polynomial type for this instruction
14398    is encoded the same as the integer type.  */
14399
14400 static void
14401 do_neon_mul (void)
14402 {
14403   if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
14404     return;
14405
14406   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14407     return;
14408
14409   if (inst.operands[2].isscalar)
14410     do_neon_mac_maybe_scalar ();
14411   else
14412     neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
14413 }
14414
14415 static void
14416 do_neon_qdmulh (void)
14417 {
14418   if (inst.operands[2].isscalar)
14419     {
14420       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
14421       struct neon_type_el et = neon_check_type (3, rs,
14422         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
14423       NEON_ENCODE (SCALAR, inst);
14424       neon_mul_mac (et, neon_quad (rs));
14425     }
14426   else
14427     {
14428       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14429       struct neon_type_el et = neon_check_type (3, rs,
14430         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
14431       NEON_ENCODE (INTEGER, inst);
14432       /* The U bit (rounding) comes from bit mask.  */
14433       neon_three_same (neon_quad (rs), 0, et.size);
14434     }
14435 }
14436
14437 static void
14438 do_neon_fcmp_absolute (void)
14439 {
14440   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14441   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14442   /* Size field comes from bit mask.  */
14443   neon_three_same (neon_quad (rs), 1, -1);
14444 }
14445
14446 static void
14447 do_neon_fcmp_absolute_inv (void)
14448 {
14449   neon_exchange_operands ();
14450   do_neon_fcmp_absolute ();
14451 }
14452
14453 static void
14454 do_neon_step (void)
14455 {
14456   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14457   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14458   neon_three_same (neon_quad (rs), 0, -1);
14459 }
14460
14461 static void
14462 do_neon_abs_neg (void)
14463 {
14464   enum neon_shape rs;
14465   struct neon_type_el et;
14466
14467   if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
14468     return;
14469
14470   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14471     return;
14472
14473   rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14474   et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
14475
14476   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14477   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14478   inst.instruction |= LOW4 (inst.operands[1].reg);
14479   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14480   inst.instruction |= neon_quad (rs) << 6;
14481   inst.instruction |= (et.type == NT_float) << 10;
14482   inst.instruction |= neon_logbits (et.size) << 18;
14483
14484   neon_dp_fixup (&inst);
14485 }
14486
14487 static void
14488 do_neon_sli (void)
14489 {
14490   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14491   struct neon_type_el et = neon_check_type (2, rs,
14492     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14493   int imm = inst.operands[2].imm;
14494   constraint (imm < 0 || (unsigned)imm >= et.size,
14495               _("immediate out of range for insert"));
14496   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
14497 }
14498
14499 static void
14500 do_neon_sri (void)
14501 {
14502   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14503   struct neon_type_el et = neon_check_type (2, rs,
14504     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14505   int imm = inst.operands[2].imm;
14506   constraint (imm < 1 || (unsigned)imm > et.size,
14507               _("immediate out of range for insert"));
14508   neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
14509 }
14510
14511 static void
14512 do_neon_qshlu_imm (void)
14513 {
14514   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14515   struct neon_type_el et = neon_check_type (2, rs,
14516     N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
14517   int imm = inst.operands[2].imm;
14518   constraint (imm < 0 || (unsigned)imm >= et.size,
14519               _("immediate out of range for shift"));
14520   /* Only encodes the 'U present' variant of the instruction.
14521      In this case, signed types have OP (bit 8) set to 0.
14522      Unsigned types have OP set to 1.  */
14523   inst.instruction |= (et.type == NT_unsigned) << 8;
14524   /* The rest of the bits are the same as other immediate shifts.  */
14525   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
14526 }
14527
14528 static void
14529 do_neon_qmovn (void)
14530 {
14531   struct neon_type_el et = neon_check_type (2, NS_DQ,
14532     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14533   /* Saturating move where operands can be signed or unsigned, and the
14534      destination has the same signedness.  */
14535   NEON_ENCODE (INTEGER, inst);
14536   if (et.type == NT_unsigned)
14537     inst.instruction |= 0xc0;
14538   else
14539     inst.instruction |= 0x80;
14540   neon_two_same (0, 1, et.size / 2);
14541 }
14542
14543 static void
14544 do_neon_qmovun (void)
14545 {
14546   struct neon_type_el et = neon_check_type (2, NS_DQ,
14547     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14548   /* Saturating move with unsigned results. Operands must be signed.  */
14549   NEON_ENCODE (INTEGER, inst);
14550   neon_two_same (0, 1, et.size / 2);
14551 }
14552
14553 static void
14554 do_neon_rshift_sat_narrow (void)
14555 {
14556   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14557      or unsigned. If operands are unsigned, results must also be unsigned.  */
14558   struct neon_type_el et = neon_check_type (2, NS_DQI,
14559     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14560   int imm = inst.operands[2].imm;
14561   /* This gets the bounds check, size encoding and immediate bits calculation
14562      right.  */
14563   et.size /= 2;
14564
14565   /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
14566      VQMOVN.I<size> <Dd>, <Qm>.  */
14567   if (imm == 0)
14568     {
14569       inst.operands[2].present = 0;
14570       inst.instruction = N_MNEM_vqmovn;
14571       do_neon_qmovn ();
14572       return;
14573     }
14574
14575   constraint (imm < 1 || (unsigned)imm > et.size,
14576               _("immediate out of range"));
14577   neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
14578 }
14579
14580 static void
14581 do_neon_rshift_sat_narrow_u (void)
14582 {
14583   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14584      or unsigned. If operands are unsigned, results must also be unsigned.  */
14585   struct neon_type_el et = neon_check_type (2, NS_DQI,
14586     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14587   int imm = inst.operands[2].imm;
14588   /* This gets the bounds check, size encoding and immediate bits calculation
14589      right.  */
14590   et.size /= 2;
14591
14592   /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
14593      VQMOVUN.I<size> <Dd>, <Qm>.  */
14594   if (imm == 0)
14595     {
14596       inst.operands[2].present = 0;
14597       inst.instruction = N_MNEM_vqmovun;
14598       do_neon_qmovun ();
14599       return;
14600     }
14601
14602   constraint (imm < 1 || (unsigned)imm > et.size,
14603               _("immediate out of range"));
14604   /* FIXME: The manual is kind of unclear about what value U should have in
14605      VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
14606      must be 1.  */
14607   neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
14608 }
14609
14610 static void
14611 do_neon_movn (void)
14612 {
14613   struct neon_type_el et = neon_check_type (2, NS_DQ,
14614     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14615   NEON_ENCODE (INTEGER, inst);
14616   neon_two_same (0, 1, et.size / 2);
14617 }
14618
14619 static void
14620 do_neon_rshift_narrow (void)
14621 {
14622   struct neon_type_el et = neon_check_type (2, NS_DQI,
14623     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14624   int imm = inst.operands[2].imm;
14625   /* This gets the bounds check, size encoding and immediate bits calculation
14626      right.  */
14627   et.size /= 2;
14628
14629   /* If immediate is zero then we are a pseudo-instruction for
14630      VMOVN.I<size> <Dd>, <Qm>  */
14631   if (imm == 0)
14632     {
14633       inst.operands[2].present = 0;
14634       inst.instruction = N_MNEM_vmovn;
14635       do_neon_movn ();
14636       return;
14637     }
14638
14639   constraint (imm < 1 || (unsigned)imm > et.size,
14640               _("immediate out of range for narrowing operation"));
14641   neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
14642 }
14643
14644 static void
14645 do_neon_shll (void)
14646 {
14647   /* FIXME: Type checking when lengthening.  */
14648   struct neon_type_el et = neon_check_type (2, NS_QDI,
14649     N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
14650   unsigned imm = inst.operands[2].imm;
14651
14652   if (imm == et.size)
14653     {
14654       /* Maximum shift variant.  */
14655       NEON_ENCODE (INTEGER, inst);
14656       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14657       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14658       inst.instruction |= LOW4 (inst.operands[1].reg);
14659       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14660       inst.instruction |= neon_logbits (et.size) << 18;
14661
14662       neon_dp_fixup (&inst);
14663     }
14664   else
14665     {
14666       /* A more-specific type check for non-max versions.  */
14667       et = neon_check_type (2, NS_QDI,
14668         N_EQK | N_DBL, N_SU_32 | N_KEY);
14669       NEON_ENCODE (IMMED, inst);
14670       neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
14671     }
14672 }
14673
14674 /* Check the various types for the VCVT instruction, and return which version
14675    the current instruction is.  */
14676
14677 #define CVT_FLAVOUR_VAR                                                       \
14678   CVT_VAR (s32_f32, N_S32, N_F32, whole_reg,   "ftosls", "ftosis", "ftosizs") \
14679   CVT_VAR (u32_f32, N_U32, N_F32, whole_reg,   "ftouls", "ftouis", "ftouizs") \
14680   CVT_VAR (f32_s32, N_F32, N_S32, whole_reg,   "fsltos", "fsitos", NULL)      \
14681   CVT_VAR (f32_u32, N_F32, N_U32, whole_reg,   "fultos", "fuitos", NULL)      \
14682   /* Half-precision conversions.  */                                          \
14683   CVT_VAR (f32_f16, N_F32, N_F16, whole_reg,   NULL,     NULL,     NULL)      \
14684   CVT_VAR (f16_f32, N_F16, N_F32, whole_reg,   NULL,     NULL,     NULL)      \
14685   /* VFP instructions.  */                                                    \
14686   CVT_VAR (f32_f64, N_F32, N_F64, N_VFP,       NULL,     "fcvtsd", NULL)      \
14687   CVT_VAR (f64_f32, N_F64, N_F32, N_VFP,       NULL,     "fcvtds", NULL)      \
14688   CVT_VAR (s32_f64, N_S32, N_F64 | key, N_VFP, "ftosld", "ftosid", "ftosizd") \
14689   CVT_VAR (u32_f64, N_U32, N_F64 | key, N_VFP, "ftould", "ftouid", "ftouizd") \
14690   CVT_VAR (f64_s32, N_F64 | key, N_S32, N_VFP, "fsltod", "fsitod", NULL)      \
14691   CVT_VAR (f64_u32, N_F64 | key, N_U32, N_VFP, "fultod", "fuitod", NULL)      \
14692   /* VFP instructions with bitshift.  */                                      \
14693   CVT_VAR (f32_s16, N_F32 | key, N_S16, N_VFP, "fshtos", NULL,     NULL)      \
14694   CVT_VAR (f32_u16, N_F32 | key, N_U16, N_VFP, "fuhtos", NULL,     NULL)      \
14695   CVT_VAR (f64_s16, N_F64 | key, N_S16, N_VFP, "fshtod", NULL,     NULL)      \
14696   CVT_VAR (f64_u16, N_F64 | key, N_U16, N_VFP, "fuhtod", NULL,     NULL)      \
14697   CVT_VAR (s16_f32, N_S16, N_F32 | key, N_VFP, "ftoshs", NULL,     NULL)      \
14698   CVT_VAR (u16_f32, N_U16, N_F32 | key, N_VFP, "ftouhs", NULL,     NULL)      \
14699   CVT_VAR (s16_f64, N_S16, N_F64 | key, N_VFP, "ftoshd", NULL,     NULL)      \
14700   CVT_VAR (u16_f64, N_U16, N_F64 | key, N_VFP, "ftouhd", NULL,     NULL)
14701
14702 #define CVT_VAR(C, X, Y, R, BSN, CN, ZN) \
14703   neon_cvt_flavour_##C,
14704
14705 /* The different types of conversions we can do.  */
14706 enum neon_cvt_flavour
14707 {
14708   CVT_FLAVOUR_VAR
14709   neon_cvt_flavour_invalid,
14710   neon_cvt_flavour_first_fp = neon_cvt_flavour_f32_f64
14711 };
14712
14713 #undef CVT_VAR
14714
14715 static enum neon_cvt_flavour
14716 get_neon_cvt_flavour (enum neon_shape rs)
14717 {
14718 #define CVT_VAR(C,X,Y,R,BSN,CN,ZN)                      \
14719   et = neon_check_type (2, rs, (R) | (X), (R) | (Y));   \
14720   if (et.type != NT_invtype)                            \
14721     {                                                   \
14722       inst.error = NULL;                                \
14723       return (neon_cvt_flavour_##C);                    \
14724     }
14725
14726   struct neon_type_el et;
14727   unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
14728                         || rs == NS_FF) ? N_VFP : 0;
14729   /* The instruction versions which take an immediate take one register
14730      argument, which is extended to the width of the full register. Thus the
14731      "source" and "destination" registers must have the same width.  Hack that
14732      here by making the size equal to the key (wider, in this case) operand.  */
14733   unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
14734
14735   CVT_FLAVOUR_VAR;
14736
14737   return neon_cvt_flavour_invalid;
14738 #undef CVT_VAR
14739 }
14740
14741 enum neon_cvt_mode
14742 {
14743   neon_cvt_mode_a,
14744   neon_cvt_mode_n,
14745   neon_cvt_mode_p,
14746   neon_cvt_mode_m,
14747   neon_cvt_mode_z,
14748   neon_cvt_mode_x,
14749   neon_cvt_mode_r
14750 };
14751
14752 /* Neon-syntax VFP conversions.  */
14753
14754 static void
14755 do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
14756 {
14757   const char *opname = 0;
14758
14759   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
14760     {
14761       /* Conversions with immediate bitshift.  */
14762       const char *enc[] =
14763         {
14764 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) BSN,
14765           CVT_FLAVOUR_VAR
14766           NULL
14767 #undef CVT_VAR
14768         };
14769
14770       if (flavour < (int) ARRAY_SIZE (enc))
14771         {
14772           opname = enc[flavour];
14773           constraint (inst.operands[0].reg != inst.operands[1].reg,
14774                       _("operands 0 and 1 must be the same register"));
14775           inst.operands[1] = inst.operands[2];
14776           memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
14777         }
14778     }
14779   else
14780     {
14781       /* Conversions without bitshift.  */
14782       const char *enc[] =
14783         {
14784 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) CN,
14785           CVT_FLAVOUR_VAR
14786           NULL
14787 #undef CVT_VAR
14788         };
14789
14790       if (flavour < (int) ARRAY_SIZE (enc))
14791         opname = enc[flavour];
14792     }
14793
14794   if (opname)
14795     do_vfp_nsyn_opcode (opname);
14796 }
14797
14798 static void
14799 do_vfp_nsyn_cvtz (void)
14800 {
14801   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
14802   enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
14803   const char *enc[] =
14804     {
14805 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) ZN,
14806       CVT_FLAVOUR_VAR
14807       NULL
14808 #undef CVT_VAR
14809     };
14810
14811   if (flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
14812     do_vfp_nsyn_opcode (enc[flavour]);
14813 }
14814
14815 static void
14816 do_vfp_nsyn_cvt_fpv8 (enum neon_cvt_flavour flavour,
14817                       enum neon_cvt_mode mode)
14818 {
14819   int sz, op;
14820   int rm;
14821
14822   set_it_insn_type (OUTSIDE_IT_INSN);
14823
14824   switch (flavour)
14825     {
14826     case neon_cvt_flavour_s32_f64:
14827       sz = 1;
14828       op = 1;
14829       break;
14830     case neon_cvt_flavour_s32_f32:
14831       sz = 0;
14832       op = 1;
14833       break;
14834     case neon_cvt_flavour_u32_f64:
14835       sz = 1;
14836       op = 0;
14837       break;
14838     case neon_cvt_flavour_u32_f32:
14839       sz = 0;
14840       op = 0;
14841       break;
14842     default:
14843       first_error (_("invalid instruction shape"));
14844       return;
14845     }
14846
14847   switch (mode)
14848     {
14849     case neon_cvt_mode_a: rm = 0; break;
14850     case neon_cvt_mode_n: rm = 1; break;
14851     case neon_cvt_mode_p: rm = 2; break;
14852     case neon_cvt_mode_m: rm = 3; break;
14853     default: first_error (_("invalid rounding mode")); return;
14854     }
14855
14856   NEON_ENCODE (FPV8, inst);
14857   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
14858   encode_arm_vfp_reg (inst.operands[1].reg, sz == 1 ? VFP_REG_Dm : VFP_REG_Sm);
14859   inst.instruction |= sz << 8;
14860   inst.instruction |= op << 7;
14861   inst.instruction |= rm << 16;
14862   inst.instruction |= 0xf0000000;
14863   inst.is_neon = TRUE;
14864 }
14865
14866 static void
14867 do_neon_cvt_1 (enum neon_cvt_mode mode)
14868 {
14869   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
14870     NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
14871   enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
14872
14873   /* PR11109: Handle round-to-zero for VCVT conversions.  */
14874   if (mode == neon_cvt_mode_z
14875       && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
14876       && (flavour == neon_cvt_flavour_s32_f32
14877           || flavour == neon_cvt_flavour_u32_f32
14878           || flavour == neon_cvt_flavour_s32_f64
14879           || flavour == neon_cvt_flavour_u32_f64)
14880       && (rs == NS_FD || rs == NS_FF))
14881     {
14882       do_vfp_nsyn_cvtz ();
14883       return;
14884     }
14885
14886   /* VFP rather than Neon conversions.  */
14887   if (flavour >= neon_cvt_flavour_first_fp)
14888     {
14889       if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
14890         do_vfp_nsyn_cvt (rs, flavour);
14891       else
14892         do_vfp_nsyn_cvt_fpv8 (flavour, mode);
14893
14894       return;
14895     }
14896
14897   switch (rs)
14898     {
14899     case NS_DDI:
14900     case NS_QQI:
14901       {
14902         unsigned immbits;
14903         unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
14904
14905         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14906           return;
14907
14908         /* Fixed-point conversion with #0 immediate is encoded as an
14909            integer conversion.  */
14910         if (inst.operands[2].present && inst.operands[2].imm == 0)
14911           goto int_encode;
14912        immbits = 32 - inst.operands[2].imm;
14913         NEON_ENCODE (IMMED, inst);
14914         if (flavour != neon_cvt_flavour_invalid)
14915           inst.instruction |= enctab[flavour];
14916         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14917         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14918         inst.instruction |= LOW4 (inst.operands[1].reg);
14919         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14920         inst.instruction |= neon_quad (rs) << 6;
14921         inst.instruction |= 1 << 21;
14922         inst.instruction |= immbits << 16;
14923
14924         neon_dp_fixup (&inst);
14925       }
14926       break;
14927
14928     case NS_DD:
14929     case NS_QQ:
14930       if (mode != neon_cvt_mode_x && mode != neon_cvt_mode_z)
14931         {
14932           NEON_ENCODE (FLOAT, inst);
14933           set_it_insn_type (OUTSIDE_IT_INSN);
14934
14935           if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
14936             return;
14937
14938           inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14939           inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14940           inst.instruction |= LOW4 (inst.operands[1].reg);
14941           inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14942           inst.instruction |= neon_quad (rs) << 6;
14943           inst.instruction |= (flavour == neon_cvt_flavour_u32_f32) << 7;
14944           inst.instruction |= mode << 8;
14945           if (thumb_mode)
14946             inst.instruction |= 0xfc000000;
14947           else
14948             inst.instruction |= 0xf0000000;
14949         }
14950       else
14951         {
14952     int_encode:
14953           {
14954             unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
14955
14956             NEON_ENCODE (INTEGER, inst);
14957
14958             if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14959               return;
14960
14961             if (flavour != neon_cvt_flavour_invalid)
14962               inst.instruction |= enctab[flavour];
14963
14964             inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14965             inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14966             inst.instruction |= LOW4 (inst.operands[1].reg);
14967             inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14968             inst.instruction |= neon_quad (rs) << 6;
14969             inst.instruction |= 2 << 18;
14970
14971             neon_dp_fixup (&inst);
14972           }
14973         }
14974       break;
14975
14976     /* Half-precision conversions for Advanced SIMD -- neon.  */
14977     case NS_QD:
14978     case NS_DQ:
14979
14980       if ((rs == NS_DQ)
14981           && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
14982           {
14983             as_bad (_("operand size must match register width"));
14984             break;
14985           }
14986
14987       if ((rs == NS_QD)
14988           && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
14989           {
14990             as_bad (_("operand size must match register width"));
14991             break;
14992           }
14993
14994       if (rs == NS_DQ)
14995         inst.instruction = 0x3b60600;
14996       else
14997         inst.instruction = 0x3b60700;
14998
14999       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15000       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15001       inst.instruction |= LOW4 (inst.operands[1].reg);
15002       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15003       neon_dp_fixup (&inst);
15004       break;
15005
15006     default:
15007       /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
15008       if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
15009         do_vfp_nsyn_cvt (rs, flavour);
15010       else
15011         do_vfp_nsyn_cvt_fpv8 (flavour, mode);
15012     }
15013 }
15014
15015 static void
15016 do_neon_cvtr (void)
15017 {
15018   do_neon_cvt_1 (neon_cvt_mode_x);
15019 }
15020
15021 static void
15022 do_neon_cvt (void)
15023 {
15024   do_neon_cvt_1 (neon_cvt_mode_z);
15025 }
15026
15027 static void
15028 do_neon_cvta (void)
15029 {
15030   do_neon_cvt_1 (neon_cvt_mode_a);
15031 }
15032
15033 static void
15034 do_neon_cvtn (void)
15035 {
15036   do_neon_cvt_1 (neon_cvt_mode_n);
15037 }
15038
15039 static void
15040 do_neon_cvtp (void)
15041 {
15042   do_neon_cvt_1 (neon_cvt_mode_p);
15043 }
15044
15045 static void
15046 do_neon_cvtm (void)
15047 {
15048   do_neon_cvt_1 (neon_cvt_mode_m);
15049 }
15050
15051 static void
15052 do_neon_cvttb_2 (bfd_boolean t, bfd_boolean to, bfd_boolean is_double)
15053 {
15054   if (is_double)
15055     mark_feature_used (&fpu_vfp_ext_armv8);
15056
15057   encode_arm_vfp_reg (inst.operands[0].reg,
15058                       (is_double && !to) ? VFP_REG_Dd : VFP_REG_Sd);
15059   encode_arm_vfp_reg (inst.operands[1].reg,
15060                       (is_double && to) ? VFP_REG_Dm : VFP_REG_Sm);
15061   inst.instruction |= to ? 0x10000 : 0;
15062   inst.instruction |= t ? 0x80 : 0;
15063   inst.instruction |= is_double ? 0x100 : 0;
15064   do_vfp_cond_or_thumb ();
15065 }
15066
15067 static void
15068 do_neon_cvttb_1 (bfd_boolean t)
15069 {
15070   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_DF, NS_NULL);
15071
15072   if (rs == NS_NULL)
15073     return;
15074   else if (neon_check_type (2, rs, N_F16, N_F32 | N_VFP).type != NT_invtype)
15075     {
15076       inst.error = NULL;
15077       do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/FALSE);
15078     }
15079   else if (neon_check_type (2, rs, N_F32 | N_VFP, N_F16).type != NT_invtype)
15080     {
15081       inst.error = NULL;
15082       do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/FALSE);
15083     }
15084   else if (neon_check_type (2, rs, N_F16, N_F64 | N_VFP).type != NT_invtype)
15085     {
15086       inst.error = NULL;
15087       do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/TRUE);
15088     }
15089   else if (neon_check_type (2, rs, N_F64 | N_VFP, N_F16).type != NT_invtype)
15090     {
15091       inst.error = NULL;
15092       do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/TRUE);
15093     }
15094   else
15095     return;
15096 }
15097
15098 static void
15099 do_neon_cvtb (void)
15100 {
15101   do_neon_cvttb_1 (FALSE);
15102 }
15103
15104
15105 static void
15106 do_neon_cvtt (void)
15107 {
15108   do_neon_cvttb_1 (TRUE);
15109 }
15110
15111 static void
15112 neon_move_immediate (void)
15113 {
15114   enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
15115   struct neon_type_el et = neon_check_type (2, rs,
15116     N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
15117   unsigned immlo, immhi = 0, immbits;
15118   int op, cmode, float_p;
15119
15120   constraint (et.type == NT_invtype,
15121               _("operand size must be specified for immediate VMOV"));
15122
15123   /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
15124   op = (inst.instruction & (1 << 5)) != 0;
15125
15126   immlo = inst.operands[1].imm;
15127   if (inst.operands[1].regisimm)
15128     immhi = inst.operands[1].reg;
15129
15130   constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
15131               _("immediate has bits set outside the operand size"));
15132
15133   float_p = inst.operands[1].immisfloat;
15134
15135   if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
15136                                         et.size, et.type)) == FAIL)
15137     {
15138       /* Invert relevant bits only.  */
15139       neon_invert_size (&immlo, &immhi, et.size);
15140       /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
15141          with one or the other; those cases are caught by
15142          neon_cmode_for_move_imm.  */
15143       op = !op;
15144       if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
15145                                             &op, et.size, et.type)) == FAIL)
15146         {
15147           first_error (_("immediate out of range"));
15148           return;
15149         }
15150     }
15151
15152   inst.instruction &= ~(1 << 5);
15153   inst.instruction |= op << 5;
15154
15155   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15156   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15157   inst.instruction |= neon_quad (rs) << 6;
15158   inst.instruction |= cmode << 8;
15159
15160   neon_write_immbits (immbits);
15161 }
15162
15163 static void
15164 do_neon_mvn (void)
15165 {
15166   if (inst.operands[1].isreg)
15167     {
15168       enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15169
15170       NEON_ENCODE (INTEGER, inst);
15171       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15172       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15173       inst.instruction |= LOW4 (inst.operands[1].reg);
15174       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15175       inst.instruction |= neon_quad (rs) << 6;
15176     }
15177   else
15178     {
15179       NEON_ENCODE (IMMED, inst);
15180       neon_move_immediate ();
15181     }
15182
15183   neon_dp_fixup (&inst);
15184 }
15185
15186 /* Encode instructions of form:
15187
15188   |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
15189   |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |  */
15190
15191 static void
15192 neon_mixed_length (struct neon_type_el et, unsigned size)
15193 {
15194   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15195   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15196   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15197   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15198   inst.instruction |= LOW4 (inst.operands[2].reg);
15199   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15200   inst.instruction |= (et.type == NT_unsigned) << 24;
15201   inst.instruction |= neon_logbits (size) << 20;
15202
15203   neon_dp_fixup (&inst);
15204 }
15205
15206 static void
15207 do_neon_dyadic_long (void)
15208 {
15209   /* FIXME: Type checking for lengthening op.  */
15210   struct neon_type_el et = neon_check_type (3, NS_QDD,
15211     N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
15212   neon_mixed_length (et, et.size);
15213 }
15214
15215 static void
15216 do_neon_abal (void)
15217 {
15218   struct neon_type_el et = neon_check_type (3, NS_QDD,
15219     N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
15220   neon_mixed_length (et, et.size);
15221 }
15222
15223 static void
15224 neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
15225 {
15226   if (inst.operands[2].isscalar)
15227     {
15228       struct neon_type_el et = neon_check_type (3, NS_QDS,
15229         N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
15230       NEON_ENCODE (SCALAR, inst);
15231       neon_mul_mac (et, et.type == NT_unsigned);
15232     }
15233   else
15234     {
15235       struct neon_type_el et = neon_check_type (3, NS_QDD,
15236         N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
15237       NEON_ENCODE (INTEGER, inst);
15238       neon_mixed_length (et, et.size);
15239     }
15240 }
15241
15242 static void
15243 do_neon_mac_maybe_scalar_long (void)
15244 {
15245   neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
15246 }
15247
15248 static void
15249 do_neon_dyadic_wide (void)
15250 {
15251   struct neon_type_el et = neon_check_type (3, NS_QQD,
15252     N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
15253   neon_mixed_length (et, et.size);
15254 }
15255
15256 static void
15257 do_neon_dyadic_narrow (void)
15258 {
15259   struct neon_type_el et = neon_check_type (3, NS_QDD,
15260     N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
15261   /* Operand sign is unimportant, and the U bit is part of the opcode,
15262      so force the operand type to integer.  */
15263   et.type = NT_integer;
15264   neon_mixed_length (et, et.size / 2);
15265 }
15266
15267 static void
15268 do_neon_mul_sat_scalar_long (void)
15269 {
15270   neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
15271 }
15272
15273 static void
15274 do_neon_vmull (void)
15275 {
15276   if (inst.operands[2].isscalar)
15277     do_neon_mac_maybe_scalar_long ();
15278   else
15279     {
15280       struct neon_type_el et = neon_check_type (3, NS_QDD,
15281         N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_P64 | N_KEY);
15282
15283       if (et.type == NT_poly)
15284         NEON_ENCODE (POLY, inst);
15285       else
15286         NEON_ENCODE (INTEGER, inst);
15287
15288       /* For polynomial encoding the U bit must be zero, and the size must
15289          be 8 (encoded as 0b00) or, on ARMv8 or later 64 (encoded, non
15290          obviously, as 0b10).  */
15291       if (et.size == 64)
15292         {
15293           /* Check we're on the correct architecture.  */
15294           if (!mark_feature_used (&fpu_crypto_ext_armv8))
15295             inst.error =
15296               _("Instruction form not available on this architecture.");
15297
15298           et.size = 32;
15299         }
15300
15301       neon_mixed_length (et, et.size);
15302     }
15303 }
15304
15305 static void
15306 do_neon_ext (void)
15307 {
15308   enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
15309   struct neon_type_el et = neon_check_type (3, rs,
15310     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
15311   unsigned imm = (inst.operands[3].imm * et.size) / 8;
15312
15313   constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
15314               _("shift out of range"));
15315   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15316   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15317   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15318   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15319   inst.instruction |= LOW4 (inst.operands[2].reg);
15320   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15321   inst.instruction |= neon_quad (rs) << 6;
15322   inst.instruction |= imm << 8;
15323
15324   neon_dp_fixup (&inst);
15325 }
15326
15327 static void
15328 do_neon_rev (void)
15329 {
15330   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15331   struct neon_type_el et = neon_check_type (2, rs,
15332     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15333   unsigned op = (inst.instruction >> 7) & 3;
15334   /* N (width of reversed regions) is encoded as part of the bitmask. We
15335      extract it here to check the elements to be reversed are smaller.
15336      Otherwise we'd get a reserved instruction.  */
15337   unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
15338   gas_assert (elsize != 0);
15339   constraint (et.size >= elsize,
15340               _("elements must be smaller than reversal region"));
15341   neon_two_same (neon_quad (rs), 1, et.size);
15342 }
15343
15344 static void
15345 do_neon_dup (void)
15346 {
15347   if (inst.operands[1].isscalar)
15348     {
15349       enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
15350       struct neon_type_el et = neon_check_type (2, rs,
15351         N_EQK, N_8 | N_16 | N_32 | N_KEY);
15352       unsigned sizebits = et.size >> 3;
15353       unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
15354       int logsize = neon_logbits (et.size);
15355       unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
15356
15357       if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
15358         return;
15359
15360       NEON_ENCODE (SCALAR, inst);
15361       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15362       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15363       inst.instruction |= LOW4 (dm);
15364       inst.instruction |= HI1 (dm) << 5;
15365       inst.instruction |= neon_quad (rs) << 6;
15366       inst.instruction |= x << 17;
15367       inst.instruction |= sizebits << 16;
15368
15369       neon_dp_fixup (&inst);
15370     }
15371   else
15372     {
15373       enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
15374       struct neon_type_el et = neon_check_type (2, rs,
15375         N_8 | N_16 | N_32 | N_KEY, N_EQK);
15376       /* Duplicate ARM register to lanes of vector.  */
15377       NEON_ENCODE (ARMREG, inst);
15378       switch (et.size)
15379         {
15380         case 8:  inst.instruction |= 0x400000; break;
15381         case 16: inst.instruction |= 0x000020; break;
15382         case 32: inst.instruction |= 0x000000; break;
15383         default: break;
15384         }
15385       inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15386       inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
15387       inst.instruction |= HI1 (inst.operands[0].reg) << 7;
15388       inst.instruction |= neon_quad (rs) << 21;
15389       /* The encoding for this instruction is identical for the ARM and Thumb
15390          variants, except for the condition field.  */
15391       do_vfp_cond_or_thumb ();
15392     }
15393 }
15394
15395 /* VMOV has particularly many variations. It can be one of:
15396      0. VMOV<c><q> <Qd>, <Qm>
15397      1. VMOV<c><q> <Dd>, <Dm>
15398    (Register operations, which are VORR with Rm = Rn.)
15399      2. VMOV<c><q>.<dt> <Qd>, #<imm>
15400      3. VMOV<c><q>.<dt> <Dd>, #<imm>
15401    (Immediate loads.)
15402      4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
15403    (ARM register to scalar.)
15404      5. VMOV<c><q> <Dm>, <Rd>, <Rn>
15405    (Two ARM registers to vector.)
15406      6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
15407    (Scalar to ARM register.)
15408      7. VMOV<c><q> <Rd>, <Rn>, <Dm>
15409    (Vector to two ARM registers.)
15410      8. VMOV.F32 <Sd>, <Sm>
15411      9. VMOV.F64 <Dd>, <Dm>
15412    (VFP register moves.)
15413     10. VMOV.F32 <Sd>, #imm
15414     11. VMOV.F64 <Dd>, #imm
15415    (VFP float immediate load.)
15416     12. VMOV <Rd>, <Sm>
15417    (VFP single to ARM reg.)
15418     13. VMOV <Sd>, <Rm>
15419    (ARM reg to VFP single.)
15420     14. VMOV <Rd>, <Re>, <Sn>, <Sm>
15421    (Two ARM regs to two VFP singles.)
15422     15. VMOV <Sd>, <Se>, <Rn>, <Rm>
15423    (Two VFP singles to two ARM regs.)
15424
15425    These cases can be disambiguated using neon_select_shape, except cases 1/9
15426    and 3/11 which depend on the operand type too.
15427
15428    All the encoded bits are hardcoded by this function.
15429
15430    Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
15431    Cases 5, 7 may be used with VFPv2 and above.
15432
15433    FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
15434    can specify a type where it doesn't make sense to, and is ignored).  */
15435
15436 static void
15437 do_neon_mov (void)
15438 {
15439   enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
15440     NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
15441     NS_NULL);
15442   struct neon_type_el et;
15443   const char *ldconst = 0;
15444
15445   switch (rs)
15446     {
15447     case NS_DD:  /* case 1/9.  */
15448       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15449       /* It is not an error here if no type is given.  */
15450       inst.error = NULL;
15451       if (et.type == NT_float && et.size == 64)
15452         {
15453           do_vfp_nsyn_opcode ("fcpyd");
15454           break;
15455         }
15456       /* fall through.  */
15457
15458     case NS_QQ:  /* case 0/1.  */
15459       {
15460         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15461           return;
15462         /* The architecture manual I have doesn't explicitly state which
15463            value the U bit should have for register->register moves, but
15464            the equivalent VORR instruction has U = 0, so do that.  */
15465         inst.instruction = 0x0200110;
15466         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15467         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15468         inst.instruction |= LOW4 (inst.operands[1].reg);
15469         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15470         inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15471         inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15472         inst.instruction |= neon_quad (rs) << 6;
15473
15474         neon_dp_fixup (&inst);
15475       }
15476       break;
15477
15478     case NS_DI:  /* case 3/11.  */
15479       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15480       inst.error = NULL;
15481       if (et.type == NT_float && et.size == 64)
15482         {
15483           /* case 11 (fconstd).  */
15484           ldconst = "fconstd";
15485           goto encode_fconstd;
15486         }
15487       /* fall through.  */
15488
15489     case NS_QI:  /* case 2/3.  */
15490       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15491         return;
15492       inst.instruction = 0x0800010;
15493       neon_move_immediate ();
15494       neon_dp_fixup (&inst);
15495       break;
15496
15497     case NS_SR:  /* case 4.  */
15498       {
15499         unsigned bcdebits = 0;
15500         int logsize;
15501         unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
15502         unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
15503
15504         /* .<size> is optional here, defaulting to .32. */
15505         if (inst.vectype.elems == 0
15506             && inst.operands[0].vectype.type == NT_invtype
15507             && inst.operands[1].vectype.type == NT_invtype)
15508           {
15509             inst.vectype.el[0].type = NT_untyped;
15510             inst.vectype.el[0].size = 32;
15511             inst.vectype.elems = 1;
15512           }
15513
15514         et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
15515         logsize = neon_logbits (et.size);
15516
15517         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15518                     _(BAD_FPU));
15519         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15520                     && et.size != 32, _(BAD_FPU));
15521         constraint (et.type == NT_invtype, _("bad type for scalar"));
15522         constraint (x >= 64 / et.size, _("scalar index out of range"));
15523
15524         switch (et.size)
15525           {
15526           case 8:  bcdebits = 0x8; break;
15527           case 16: bcdebits = 0x1; break;
15528           case 32: bcdebits = 0x0; break;
15529           default: ;
15530           }
15531
15532         bcdebits |= x << logsize;
15533
15534         inst.instruction = 0xe000b10;
15535         do_vfp_cond_or_thumb ();
15536         inst.instruction |= LOW4 (dn) << 16;
15537         inst.instruction |= HI1 (dn) << 7;
15538         inst.instruction |= inst.operands[1].reg << 12;
15539         inst.instruction |= (bcdebits & 3) << 5;
15540         inst.instruction |= (bcdebits >> 2) << 21;
15541       }
15542       break;
15543
15544     case NS_DRR:  /* case 5 (fmdrr).  */
15545       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
15546                   _(BAD_FPU));
15547
15548       inst.instruction = 0xc400b10;
15549       do_vfp_cond_or_thumb ();
15550       inst.instruction |= LOW4 (inst.operands[0].reg);
15551       inst.instruction |= HI1 (inst.operands[0].reg) << 5;
15552       inst.instruction |= inst.operands[1].reg << 12;
15553       inst.instruction |= inst.operands[2].reg << 16;
15554       break;
15555
15556     case NS_RS:  /* case 6.  */
15557       {
15558         unsigned logsize;
15559         unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
15560         unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
15561         unsigned abcdebits = 0;
15562
15563         /* .<dt> is optional here, defaulting to .32. */
15564         if (inst.vectype.elems == 0
15565             && inst.operands[0].vectype.type == NT_invtype
15566             && inst.operands[1].vectype.type == NT_invtype)
15567           {
15568             inst.vectype.el[0].type = NT_untyped;
15569             inst.vectype.el[0].size = 32;
15570             inst.vectype.elems = 1;
15571           }
15572
15573         et = neon_check_type (2, NS_NULL,
15574                               N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
15575         logsize = neon_logbits (et.size);
15576
15577         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15578                     _(BAD_FPU));
15579         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15580                     && et.size != 32, _(BAD_FPU));
15581         constraint (et.type == NT_invtype, _("bad type for scalar"));
15582         constraint (x >= 64 / et.size, _("scalar index out of range"));
15583
15584         switch (et.size)
15585           {
15586           case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
15587           case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
15588           case 32: abcdebits = 0x00; break;
15589           default: ;
15590           }
15591
15592         abcdebits |= x << logsize;
15593         inst.instruction = 0xe100b10;
15594         do_vfp_cond_or_thumb ();
15595         inst.instruction |= LOW4 (dn) << 16;
15596         inst.instruction |= HI1 (dn) << 7;
15597         inst.instruction |= inst.operands[0].reg << 12;
15598         inst.instruction |= (abcdebits & 3) << 5;
15599         inst.instruction |= (abcdebits >> 2) << 21;
15600       }
15601       break;
15602
15603     case NS_RRD:  /* case 7 (fmrrd).  */
15604       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
15605                   _(BAD_FPU));
15606
15607       inst.instruction = 0xc500b10;
15608       do_vfp_cond_or_thumb ();
15609       inst.instruction |= inst.operands[0].reg << 12;
15610       inst.instruction |= inst.operands[1].reg << 16;
15611       inst.instruction |= LOW4 (inst.operands[2].reg);
15612       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15613       break;
15614
15615     case NS_FF:  /* case 8 (fcpys).  */
15616       do_vfp_nsyn_opcode ("fcpys");
15617       break;
15618
15619     case NS_FI:  /* case 10 (fconsts).  */
15620       ldconst = "fconsts";
15621       encode_fconstd:
15622       if (is_quarter_float (inst.operands[1].imm))
15623         {
15624           inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
15625           do_vfp_nsyn_opcode (ldconst);
15626         }
15627       else
15628         first_error (_("immediate out of range"));
15629       break;
15630
15631     case NS_RF:  /* case 12 (fmrs).  */
15632       do_vfp_nsyn_opcode ("fmrs");
15633       break;
15634
15635     case NS_FR:  /* case 13 (fmsr).  */
15636       do_vfp_nsyn_opcode ("fmsr");
15637       break;
15638
15639     /* The encoders for the fmrrs and fmsrr instructions expect three operands
15640        (one of which is a list), but we have parsed four.  Do some fiddling to
15641        make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
15642        expect.  */
15643     case NS_RRFF:  /* case 14 (fmrrs).  */
15644       constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
15645                   _("VFP registers must be adjacent"));
15646       inst.operands[2].imm = 2;
15647       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15648       do_vfp_nsyn_opcode ("fmrrs");
15649       break;
15650
15651     case NS_FFRR:  /* case 15 (fmsrr).  */
15652       constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
15653                   _("VFP registers must be adjacent"));
15654       inst.operands[1] = inst.operands[2];
15655       inst.operands[2] = inst.operands[3];
15656       inst.operands[0].imm = 2;
15657       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15658       do_vfp_nsyn_opcode ("fmsrr");
15659       break;
15660
15661     case NS_NULL:
15662       /* neon_select_shape has determined that the instruction
15663          shape is wrong and has already set the error message.  */
15664       break;
15665
15666     default:
15667       abort ();
15668     }
15669 }
15670
15671 static void
15672 do_neon_rshift_round_imm (void)
15673 {
15674   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
15675   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
15676   int imm = inst.operands[2].imm;
15677
15678   /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
15679   if (imm == 0)
15680     {
15681       inst.operands[2].present = 0;
15682       do_neon_mov ();
15683       return;
15684     }
15685
15686   constraint (imm < 1 || (unsigned)imm > et.size,
15687               _("immediate out of range for shift"));
15688   neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
15689                   et.size - imm);
15690 }
15691
15692 static void
15693 do_neon_movl (void)
15694 {
15695   struct neon_type_el et = neon_check_type (2, NS_QD,
15696     N_EQK | N_DBL, N_SU_32 | N_KEY);
15697   unsigned sizebits = et.size >> 3;
15698   inst.instruction |= sizebits << 19;
15699   neon_two_same (0, et.type == NT_unsigned, -1);
15700 }
15701
15702 static void
15703 do_neon_trn (void)
15704 {
15705   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15706   struct neon_type_el et = neon_check_type (2, rs,
15707     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15708   NEON_ENCODE (INTEGER, inst);
15709   neon_two_same (neon_quad (rs), 1, et.size);
15710 }
15711
15712 static void
15713 do_neon_zip_uzp (void)
15714 {
15715   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15716   struct neon_type_el et = neon_check_type (2, rs,
15717     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15718   if (rs == NS_DD && et.size == 32)
15719     {
15720       /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
15721       inst.instruction = N_MNEM_vtrn;
15722       do_neon_trn ();
15723       return;
15724     }
15725   neon_two_same (neon_quad (rs), 1, et.size);
15726 }
15727
15728 static void
15729 do_neon_sat_abs_neg (void)
15730 {
15731   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15732   struct neon_type_el et = neon_check_type (2, rs,
15733     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15734   neon_two_same (neon_quad (rs), 1, et.size);
15735 }
15736
15737 static void
15738 do_neon_pair_long (void)
15739 {
15740   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15741   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
15742   /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
15743   inst.instruction |= (et.type == NT_unsigned) << 7;
15744   neon_two_same (neon_quad (rs), 1, et.size);
15745 }
15746
15747 static void
15748 do_neon_recip_est (void)
15749 {
15750   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15751   struct neon_type_el et = neon_check_type (2, rs,
15752     N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
15753   inst.instruction |= (et.type == NT_float) << 8;
15754   neon_two_same (neon_quad (rs), 1, et.size);
15755 }
15756
15757 static void
15758 do_neon_cls (void)
15759 {
15760   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15761   struct neon_type_el et = neon_check_type (2, rs,
15762     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15763   neon_two_same (neon_quad (rs), 1, et.size);
15764 }
15765
15766 static void
15767 do_neon_clz (void)
15768 {
15769   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15770   struct neon_type_el et = neon_check_type (2, rs,
15771     N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
15772   neon_two_same (neon_quad (rs), 1, et.size);
15773 }
15774
15775 static void
15776 do_neon_cnt (void)
15777 {
15778   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15779   struct neon_type_el et = neon_check_type (2, rs,
15780     N_EQK | N_INT, N_8 | N_KEY);
15781   neon_two_same (neon_quad (rs), 1, et.size);
15782 }
15783
15784 static void
15785 do_neon_swp (void)
15786 {
15787   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15788   neon_two_same (neon_quad (rs), 1, -1);
15789 }
15790
15791 static void
15792 do_neon_tbl_tbx (void)
15793 {
15794   unsigned listlenbits;
15795   neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
15796
15797   if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
15798     {
15799       first_error (_("bad list length for table lookup"));
15800       return;
15801     }
15802
15803   listlenbits = inst.operands[1].imm - 1;
15804   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15805   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15806   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15807   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15808   inst.instruction |= LOW4 (inst.operands[2].reg);
15809   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15810   inst.instruction |= listlenbits << 8;
15811
15812   neon_dp_fixup (&inst);
15813 }
15814
15815 static void
15816 do_neon_ldm_stm (void)
15817 {
15818   /* P, U and L bits are part of bitmask.  */
15819   int is_dbmode = (inst.instruction & (1 << 24)) != 0;
15820   unsigned offsetbits = inst.operands[1].imm * 2;
15821
15822   if (inst.operands[1].issingle)
15823     {
15824       do_vfp_nsyn_ldm_stm (is_dbmode);
15825       return;
15826     }
15827
15828   constraint (is_dbmode && !inst.operands[0].writeback,
15829               _("writeback (!) must be used for VLDMDB and VSTMDB"));
15830
15831   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
15832               _("register list must contain at least 1 and at most 16 "
15833                 "registers"));
15834
15835   inst.instruction |= inst.operands[0].reg << 16;
15836   inst.instruction |= inst.operands[0].writeback << 21;
15837   inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15838   inst.instruction |= HI1 (inst.operands[1].reg) << 22;
15839
15840   inst.instruction |= offsetbits;
15841
15842   do_vfp_cond_or_thumb ();
15843 }
15844
15845 static void
15846 do_neon_ldr_str (void)
15847 {
15848   int is_ldr = (inst.instruction & (1 << 20)) != 0;
15849
15850   /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
15851      And is UNPREDICTABLE in thumb mode.  */
15852   if (!is_ldr
15853       && inst.operands[1].reg == REG_PC
15854       && (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7) || thumb_mode))
15855     {
15856       if (thumb_mode)
15857         inst.error = _("Use of PC here is UNPREDICTABLE");
15858       else if (warn_on_deprecated)
15859         as_warn (_("Use of PC here is deprecated"));
15860     }
15861
15862   if (inst.operands[0].issingle)
15863     {
15864       if (is_ldr)
15865         do_vfp_nsyn_opcode ("flds");
15866       else
15867         do_vfp_nsyn_opcode ("fsts");
15868     }
15869   else
15870     {
15871       if (is_ldr)
15872         do_vfp_nsyn_opcode ("fldd");
15873       else
15874         do_vfp_nsyn_opcode ("fstd");
15875     }
15876 }
15877
15878 /* "interleave" version also handles non-interleaving register VLD1/VST1
15879    instructions.  */
15880
15881 static void
15882 do_neon_ld_st_interleave (void)
15883 {
15884   struct neon_type_el et = neon_check_type (1, NS_NULL,
15885                                             N_8 | N_16 | N_32 | N_64);
15886   unsigned alignbits = 0;
15887   unsigned idx;
15888   /* The bits in this table go:
15889      0: register stride of one (0) or two (1)
15890      1,2: register list length, minus one (1, 2, 3, 4).
15891      3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
15892      We use -1 for invalid entries.  */
15893   const int typetable[] =
15894     {
15895       0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
15896        -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
15897        -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
15898        -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
15899     };
15900   int typebits;
15901
15902   if (et.type == NT_invtype)
15903     return;
15904
15905   if (inst.operands[1].immisalign)
15906     switch (inst.operands[1].imm >> 8)
15907       {
15908       case 64: alignbits = 1; break;
15909       case 128:
15910         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
15911             && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15912           goto bad_alignment;
15913         alignbits = 2;
15914         break;
15915       case 256:
15916         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15917           goto bad_alignment;
15918         alignbits = 3;
15919         break;
15920       default:
15921       bad_alignment:
15922         first_error (_("bad alignment"));
15923         return;
15924       }
15925
15926   inst.instruction |= alignbits << 4;
15927   inst.instruction |= neon_logbits (et.size) << 6;
15928
15929   /* Bits [4:6] of the immediate in a list specifier encode register stride
15930      (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
15931      VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
15932      up the right value for "type" in a table based on this value and the given
15933      list style, then stick it back.  */
15934   idx = ((inst.operands[0].imm >> 4) & 7)
15935         | (((inst.instruction >> 8) & 3) << 3);
15936
15937   typebits = typetable[idx];
15938
15939   constraint (typebits == -1, _("bad list type for instruction"));
15940   constraint (((inst.instruction >> 8) & 3) && et.size == 64,
15941               _("bad element type for instruction"));
15942
15943   inst.instruction &= ~0xf00;
15944   inst.instruction |= typebits << 8;
15945 }
15946
15947 /* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
15948    *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
15949    otherwise. The variable arguments are a list of pairs of legal (size, align)
15950    values, terminated with -1.  */
15951
15952 static int
15953 neon_alignment_bit (int size, int align, int *do_align, ...)
15954 {
15955   va_list ap;
15956   int result = FAIL, thissize, thisalign;
15957
15958   if (!inst.operands[1].immisalign)
15959     {
15960       *do_align = 0;
15961       return SUCCESS;
15962     }
15963
15964   va_start (ap, do_align);
15965
15966   do
15967     {
15968       thissize = va_arg (ap, int);
15969       if (thissize == -1)
15970         break;
15971       thisalign = va_arg (ap, int);
15972
15973       if (size == thissize && align == thisalign)
15974         result = SUCCESS;
15975     }
15976   while (result != SUCCESS);
15977
15978   va_end (ap);
15979
15980   if (result == SUCCESS)
15981     *do_align = 1;
15982   else
15983     first_error (_("unsupported alignment for instruction"));
15984
15985   return result;
15986 }
15987
15988 static void
15989 do_neon_ld_st_lane (void)
15990 {
15991   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15992   int align_good, do_align = 0;
15993   int logsize = neon_logbits (et.size);
15994   int align = inst.operands[1].imm >> 8;
15995   int n = (inst.instruction >> 8) & 3;
15996   int max_el = 64 / et.size;
15997
15998   if (et.type == NT_invtype)
15999     return;
16000
16001   constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
16002               _("bad list length"));
16003   constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
16004               _("scalar index out of range"));
16005   constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
16006               && et.size == 8,
16007               _("stride of 2 unavailable when element size is 8"));
16008
16009   switch (n)
16010     {
16011     case 0:  /* VLD1 / VST1.  */
16012       align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
16013                                        32, 32, -1);
16014       if (align_good == FAIL)
16015         return;
16016       if (do_align)
16017         {
16018           unsigned alignbits = 0;
16019           switch (et.size)
16020             {
16021             case 16: alignbits = 0x1; break;
16022             case 32: alignbits = 0x3; break;
16023             default: ;
16024             }
16025           inst.instruction |= alignbits << 4;
16026         }
16027       break;
16028
16029     case 1:  /* VLD2 / VST2.  */
16030       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
16031                                        32, 64, -1);
16032       if (align_good == FAIL)
16033         return;
16034       if (do_align)
16035         inst.instruction |= 1 << 4;
16036       break;
16037
16038     case 2:  /* VLD3 / VST3.  */
16039       constraint (inst.operands[1].immisalign,
16040                   _("can't use alignment with this instruction"));
16041       break;
16042
16043     case 3:  /* VLD4 / VST4.  */
16044       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
16045                                        16, 64, 32, 64, 32, 128, -1);
16046       if (align_good == FAIL)
16047         return;
16048       if (do_align)
16049         {
16050           unsigned alignbits = 0;
16051           switch (et.size)
16052             {
16053             case 8:  alignbits = 0x1; break;
16054             case 16: alignbits = 0x1; break;
16055             case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
16056             default: ;
16057             }
16058           inst.instruction |= alignbits << 4;
16059         }
16060       break;
16061
16062     default: ;
16063     }
16064
16065   /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
16066   if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
16067     inst.instruction |= 1 << (4 + logsize);
16068
16069   inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
16070   inst.instruction |= logsize << 10;
16071 }
16072
16073 /* Encode single n-element structure to all lanes VLD<n> instructions.  */
16074
16075 static void
16076 do_neon_ld_dup (void)
16077 {
16078   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
16079   int align_good, do_align = 0;
16080
16081   if (et.type == NT_invtype)
16082     return;
16083
16084   switch ((inst.instruction >> 8) & 3)
16085     {
16086     case 0:  /* VLD1.  */
16087       gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
16088       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
16089                                        &do_align, 16, 16, 32, 32, -1);
16090       if (align_good == FAIL)
16091         return;
16092       switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
16093         {
16094         case 1: break;
16095         case 2: inst.instruction |= 1 << 5; break;
16096         default: first_error (_("bad list length")); return;
16097         }
16098       inst.instruction |= neon_logbits (et.size) << 6;
16099       break;
16100
16101     case 1:  /* VLD2.  */
16102       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
16103                                        &do_align, 8, 16, 16, 32, 32, 64, -1);
16104       if (align_good == FAIL)
16105         return;
16106       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
16107                   _("bad list length"));
16108       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
16109         inst.instruction |= 1 << 5;
16110       inst.instruction |= neon_logbits (et.size) << 6;
16111       break;
16112
16113     case 2:  /* VLD3.  */
16114       constraint (inst.operands[1].immisalign,
16115                   _("can't use alignment with this instruction"));
16116       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
16117                   _("bad list length"));
16118       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
16119         inst.instruction |= 1 << 5;
16120       inst.instruction |= neon_logbits (et.size) << 6;
16121       break;
16122
16123     case 3:  /* VLD4.  */
16124       {
16125         int align = inst.operands[1].imm >> 8;
16126         align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
16127                                          16, 64, 32, 64, 32, 128, -1);
16128         if (align_good == FAIL)
16129           return;
16130         constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
16131                     _("bad list length"));
16132         if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
16133           inst.instruction |= 1 << 5;
16134         if (et.size == 32 && align == 128)
16135           inst.instruction |= 0x3 << 6;
16136         else
16137           inst.instruction |= neon_logbits (et.size) << 6;
16138       }
16139       break;
16140
16141     default: ;
16142     }
16143
16144   inst.instruction |= do_align << 4;
16145 }
16146
16147 /* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
16148    apart from bits [11:4].  */
16149
16150 static void
16151 do_neon_ldx_stx (void)
16152 {
16153   if (inst.operands[1].isreg)
16154     constraint (inst.operands[1].reg == REG_PC, BAD_PC);
16155
16156   switch (NEON_LANE (inst.operands[0].imm))
16157     {
16158     case NEON_INTERLEAVE_LANES:
16159       NEON_ENCODE (INTERLV, inst);
16160       do_neon_ld_st_interleave ();
16161       break;
16162
16163     case NEON_ALL_LANES:
16164       NEON_ENCODE (DUP, inst);
16165       if (inst.instruction == N_INV)
16166         {
16167           first_error ("only loads support such operands");
16168           break;
16169         }
16170       do_neon_ld_dup ();
16171       break;
16172
16173     default:
16174       NEON_ENCODE (LANE, inst);
16175       do_neon_ld_st_lane ();
16176     }
16177
16178   /* L bit comes from bit mask.  */
16179   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16180   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16181   inst.instruction |= inst.operands[1].reg << 16;
16182
16183   if (inst.operands[1].postind)
16184     {
16185       int postreg = inst.operands[1].imm & 0xf;
16186       constraint (!inst.operands[1].immisreg,
16187                   _("post-index must be a register"));
16188       constraint (postreg == 0xd || postreg == 0xf,
16189                   _("bad register for post-index"));
16190       inst.instruction |= postreg;
16191     }
16192   else
16193     {
16194       constraint (inst.operands[1].immisreg, BAD_ADDR_MODE);
16195       constraint (inst.reloc.exp.X_op != O_constant
16196                   || inst.reloc.exp.X_add_number != 0,
16197                   BAD_ADDR_MODE);
16198
16199       if (inst.operands[1].writeback)
16200         {
16201           inst.instruction |= 0xd;
16202         }
16203       else
16204         inst.instruction |= 0xf;
16205     }
16206
16207   if (thumb_mode)
16208     inst.instruction |= 0xf9000000;
16209   else
16210     inst.instruction |= 0xf4000000;
16211 }
16212
16213 /* FP v8.  */
16214 static void
16215 do_vfp_nsyn_fpv8 (enum neon_shape rs)
16216 {
16217   NEON_ENCODE (FPV8, inst);
16218
16219   if (rs == NS_FFF)
16220     do_vfp_sp_dyadic ();
16221   else
16222     do_vfp_dp_rd_rn_rm ();
16223
16224   if (rs == NS_DDD)
16225     inst.instruction |= 0x100;
16226
16227   inst.instruction |= 0xf0000000;
16228 }
16229
16230 static void
16231 do_vsel (void)
16232 {
16233   set_it_insn_type (OUTSIDE_IT_INSN);
16234
16235   if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) != SUCCESS)
16236     first_error (_("invalid instruction shape"));
16237 }
16238
16239 static void
16240 do_vmaxnm (void)
16241 {
16242   set_it_insn_type (OUTSIDE_IT_INSN);
16243
16244   if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) == SUCCESS)
16245     return;
16246
16247   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
16248     return;
16249
16250   neon_dyadic_misc (NT_untyped, N_F32, 0);
16251 }
16252
16253 static void
16254 do_vrint_1 (enum neon_cvt_mode mode)
16255 {
16256   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_QQ, NS_NULL);
16257   struct neon_type_el et;
16258
16259   if (rs == NS_NULL)
16260     return;
16261
16262   et = neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
16263   if (et.type != NT_invtype)
16264     {
16265       /* VFP encodings.  */
16266       if (mode == neon_cvt_mode_a || mode == neon_cvt_mode_n
16267           || mode == neon_cvt_mode_p || mode == neon_cvt_mode_m)
16268         set_it_insn_type (OUTSIDE_IT_INSN);
16269
16270       NEON_ENCODE (FPV8, inst);
16271       if (rs == NS_FF)
16272         do_vfp_sp_monadic ();
16273       else
16274         do_vfp_dp_rd_rm ();
16275
16276       switch (mode)
16277         {
16278         case neon_cvt_mode_r: inst.instruction |= 0x00000000; break;
16279         case neon_cvt_mode_z: inst.instruction |= 0x00000080; break;
16280         case neon_cvt_mode_x: inst.instruction |= 0x00010000; break;
16281         case neon_cvt_mode_a: inst.instruction |= 0xf0000000; break;
16282         case neon_cvt_mode_n: inst.instruction |= 0xf0010000; break;
16283         case neon_cvt_mode_p: inst.instruction |= 0xf0020000; break;
16284         case neon_cvt_mode_m: inst.instruction |= 0xf0030000; break;
16285         default: abort ();
16286         }
16287
16288       inst.instruction |= (rs == NS_DD) << 8;
16289       do_vfp_cond_or_thumb ();
16290     }
16291   else
16292     {
16293       /* Neon encodings (or something broken...).  */
16294       inst.error = NULL;
16295       et = neon_check_type (2, rs, N_EQK, N_F32 | N_KEY);
16296
16297       if (et.type == NT_invtype)
16298         return;
16299
16300       set_it_insn_type (OUTSIDE_IT_INSN);
16301       NEON_ENCODE (FLOAT, inst);
16302
16303       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
16304         return;
16305
16306       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16307       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16308       inst.instruction |= LOW4 (inst.operands[1].reg);
16309       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16310       inst.instruction |= neon_quad (rs) << 6;
16311       switch (mode)
16312         {
16313         case neon_cvt_mode_z: inst.instruction |= 3 << 7; break;
16314         case neon_cvt_mode_x: inst.instruction |= 1 << 7; break;
16315         case neon_cvt_mode_a: inst.instruction |= 2 << 7; break;
16316         case neon_cvt_mode_n: inst.instruction |= 0 << 7; break;
16317         case neon_cvt_mode_p: inst.instruction |= 7 << 7; break;
16318         case neon_cvt_mode_m: inst.instruction |= 5 << 7; break;
16319         case neon_cvt_mode_r: inst.error = _("invalid rounding mode"); break;
16320         default: abort ();
16321         }
16322
16323       if (thumb_mode)
16324         inst.instruction |= 0xfc000000;
16325       else
16326         inst.instruction |= 0xf0000000;
16327     }
16328 }
16329
16330 static void
16331 do_vrintx (void)
16332 {
16333   do_vrint_1 (neon_cvt_mode_x);
16334 }
16335
16336 static void
16337 do_vrintz (void)
16338 {
16339   do_vrint_1 (neon_cvt_mode_z);
16340 }
16341
16342 static void
16343 do_vrintr (void)
16344 {
16345   do_vrint_1 (neon_cvt_mode_r);
16346 }
16347
16348 static void
16349 do_vrinta (void)
16350 {
16351   do_vrint_1 (neon_cvt_mode_a);
16352 }
16353
16354 static void
16355 do_vrintn (void)
16356 {
16357   do_vrint_1 (neon_cvt_mode_n);
16358 }
16359
16360 static void
16361 do_vrintp (void)
16362 {
16363   do_vrint_1 (neon_cvt_mode_p);
16364 }
16365
16366 static void
16367 do_vrintm (void)
16368 {
16369   do_vrint_1 (neon_cvt_mode_m);
16370 }
16371
16372 /* Crypto v1 instructions.  */
16373 static void
16374 do_crypto_2op_1 (unsigned elttype, int op)
16375 {
16376   set_it_insn_type (OUTSIDE_IT_INSN);
16377
16378   if (neon_check_type (2, NS_QQ, N_EQK | N_UNT, elttype | N_UNT | N_KEY).type
16379       == NT_invtype)
16380     return;
16381
16382   inst.error = NULL;
16383
16384   NEON_ENCODE (INTEGER, inst);
16385   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16386   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16387   inst.instruction |= LOW4 (inst.operands[1].reg);
16388   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16389   if (op != -1)
16390     inst.instruction |= op << 6;
16391
16392   if (thumb_mode)
16393     inst.instruction |= 0xfc000000;
16394   else
16395     inst.instruction |= 0xf0000000;
16396 }
16397
16398 static void
16399 do_crypto_3op_1 (int u, int op)
16400 {
16401   set_it_insn_type (OUTSIDE_IT_INSN);
16402
16403   if (neon_check_type (3, NS_QQQ, N_EQK | N_UNT, N_EQK | N_UNT,
16404                        N_32 | N_UNT | N_KEY).type == NT_invtype)
16405     return;
16406
16407   inst.error = NULL;
16408
16409   NEON_ENCODE (INTEGER, inst);
16410   neon_three_same (1, u, 8 << op);
16411 }
16412
16413 static void
16414 do_aese (void)
16415 {
16416   do_crypto_2op_1 (N_8, 0);
16417 }
16418
16419 static void
16420 do_aesd (void)
16421 {
16422   do_crypto_2op_1 (N_8, 1);
16423 }
16424
16425 static void
16426 do_aesmc (void)
16427 {
16428   do_crypto_2op_1 (N_8, 2);
16429 }
16430
16431 static void
16432 do_aesimc (void)
16433 {
16434   do_crypto_2op_1 (N_8, 3);
16435 }
16436
16437 static void
16438 do_sha1c (void)
16439 {
16440   do_crypto_3op_1 (0, 0);
16441 }
16442
16443 static void
16444 do_sha1p (void)
16445 {
16446   do_crypto_3op_1 (0, 1);
16447 }
16448
16449 static void
16450 do_sha1m (void)
16451 {
16452   do_crypto_3op_1 (0, 2);
16453 }
16454
16455 static void
16456 do_sha1su0 (void)
16457 {
16458   do_crypto_3op_1 (0, 3);
16459 }
16460
16461 static void
16462 do_sha256h (void)
16463 {
16464   do_crypto_3op_1 (1, 0);
16465 }
16466
16467 static void
16468 do_sha256h2 (void)
16469 {
16470   do_crypto_3op_1 (1, 1);
16471 }
16472
16473 static void
16474 do_sha256su1 (void)
16475 {
16476   do_crypto_3op_1 (1, 2);
16477 }
16478
16479 static void
16480 do_sha1h (void)
16481 {
16482   do_crypto_2op_1 (N_32, -1);
16483 }
16484
16485 static void
16486 do_sha1su1 (void)
16487 {
16488   do_crypto_2op_1 (N_32, 0);
16489 }
16490
16491 static void
16492 do_sha256su0 (void)
16493 {
16494   do_crypto_2op_1 (N_32, 1);
16495 }
16496
16497 static void
16498 do_crc32_1 (unsigned int poly, unsigned int sz)
16499 {
16500   unsigned int Rd = inst.operands[0].reg;
16501   unsigned int Rn = inst.operands[1].reg;
16502   unsigned int Rm = inst.operands[2].reg;
16503
16504   set_it_insn_type (OUTSIDE_IT_INSN);
16505   inst.instruction |= LOW4 (Rd) << (thumb_mode ? 8 : 12);
16506   inst.instruction |= LOW4 (Rn) << 16;
16507   inst.instruction |= LOW4 (Rm);
16508   inst.instruction |= sz << (thumb_mode ? 4 : 21);
16509   inst.instruction |= poly << (thumb_mode ? 20 : 9);
16510
16511   if (Rd == REG_PC || Rn == REG_PC || Rm == REG_PC)
16512     as_warn (UNPRED_REG ("r15"));
16513   if (thumb_mode && (Rd == REG_SP || Rn == REG_SP || Rm == REG_SP))
16514     as_warn (UNPRED_REG ("r13"));
16515 }
16516
16517 static void
16518 do_crc32b (void)
16519 {
16520   do_crc32_1 (0, 0);
16521 }
16522
16523 static void
16524 do_crc32h (void)
16525 {
16526   do_crc32_1 (0, 1);
16527 }
16528
16529 static void
16530 do_crc32w (void)
16531 {
16532   do_crc32_1 (0, 2);
16533 }
16534
16535 static void
16536 do_crc32cb (void)
16537 {
16538   do_crc32_1 (1, 0);
16539 }
16540
16541 static void
16542 do_crc32ch (void)
16543 {
16544   do_crc32_1 (1, 1);
16545 }
16546
16547 static void
16548 do_crc32cw (void)
16549 {
16550   do_crc32_1 (1, 2);
16551 }
16552
16553 \f
16554 /* Overall per-instruction processing.  */
16555
16556 /* We need to be able to fix up arbitrary expressions in some statements.
16557    This is so that we can handle symbols that are an arbitrary distance from
16558    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
16559    which returns part of an address in a form which will be valid for
16560    a data instruction.  We do this by pushing the expression into a symbol
16561    in the expr_section, and creating a fix for that.  */
16562
16563 static void
16564 fix_new_arm (fragS *       frag,
16565              int           where,
16566              short int     size,
16567              expressionS * exp,
16568              int           pc_rel,
16569              int           reloc)
16570 {
16571   fixS *           new_fix;
16572
16573   switch (exp->X_op)
16574     {
16575     case O_constant:
16576       if (pc_rel)
16577         {
16578           /* Create an absolute valued symbol, so we have something to
16579              refer to in the object file.  Unfortunately for us, gas's
16580              generic expression parsing will already have folded out
16581              any use of .set foo/.type foo %function that may have
16582              been used to set type information of the target location,
16583              that's being specified symbolically.  We have to presume
16584              the user knows what they are doing.  */
16585           char name[16 + 8];
16586           symbolS *symbol;
16587
16588           sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
16589
16590           symbol = symbol_find_or_make (name);
16591           S_SET_SEGMENT (symbol, absolute_section);
16592           symbol_set_frag (symbol, &zero_address_frag);
16593           S_SET_VALUE (symbol, exp->X_add_number);
16594           exp->X_op = O_symbol;
16595           exp->X_add_symbol = symbol;
16596           exp->X_add_number = 0;
16597         }
16598       /* FALLTHROUGH */
16599     case O_symbol:
16600     case O_add:
16601     case O_subtract:
16602       new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
16603                              (enum bfd_reloc_code_real) reloc);
16604       break;
16605
16606     default:
16607       new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
16608                                   pc_rel, (enum bfd_reloc_code_real) reloc);
16609       break;
16610     }
16611
16612   /* Mark whether the fix is to a THUMB instruction, or an ARM
16613      instruction.  */
16614   new_fix->tc_fix_data = thumb_mode;
16615 }
16616
16617 /* Create a frg for an instruction requiring relaxation.  */
16618 static void
16619 output_relax_insn (void)
16620 {
16621   char * to;
16622   symbolS *sym;
16623   int offset;
16624
16625   /* The size of the instruction is unknown, so tie the debug info to the
16626      start of the instruction.  */
16627   dwarf2_emit_insn (0);
16628
16629   switch (inst.reloc.exp.X_op)
16630     {
16631     case O_symbol:
16632       sym = inst.reloc.exp.X_add_symbol;
16633       offset = inst.reloc.exp.X_add_number;
16634       break;
16635     case O_constant:
16636       sym = NULL;
16637       offset = inst.reloc.exp.X_add_number;
16638       break;
16639     default:
16640       sym = make_expr_symbol (&inst.reloc.exp);
16641       offset = 0;
16642       break;
16643   }
16644   to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
16645                  inst.relax, sym, offset, NULL/*offset, opcode*/);
16646   md_number_to_chars (to, inst.instruction, THUMB_SIZE);
16647 }
16648
16649 /* Write a 32-bit thumb instruction to buf.  */
16650 static void
16651 put_thumb32_insn (char * buf, unsigned long insn)
16652 {
16653   md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
16654   md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
16655 }
16656
16657 static void
16658 output_inst (const char * str)
16659 {
16660   char * to = NULL;
16661
16662   if (inst.error)
16663     {
16664       as_bad ("%s -- `%s'", inst.error, str);
16665       return;
16666     }
16667   if (inst.relax)
16668     {
16669       output_relax_insn ();
16670       return;
16671     }
16672   if (inst.size == 0)
16673     return;
16674
16675   to = frag_more (inst.size);
16676   /* PR 9814: Record the thumb mode into the current frag so that we know
16677      what type of NOP padding to use, if necessary.  We override any previous
16678      setting so that if the mode has changed then the NOPS that we use will
16679      match the encoding of the last instruction in the frag.  */
16680   frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
16681
16682   if (thumb_mode && (inst.size > THUMB_SIZE))
16683     {
16684       gas_assert (inst.size == (2 * THUMB_SIZE));
16685       put_thumb32_insn (to, inst.instruction);
16686     }
16687   else if (inst.size > INSN_SIZE)
16688     {
16689       gas_assert (inst.size == (2 * INSN_SIZE));
16690       md_number_to_chars (to, inst.instruction, INSN_SIZE);
16691       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
16692     }
16693   else
16694     md_number_to_chars (to, inst.instruction, inst.size);
16695
16696   if (inst.reloc.type != BFD_RELOC_UNUSED)
16697     fix_new_arm (frag_now, to - frag_now->fr_literal,
16698                  inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
16699                  inst.reloc.type);
16700
16701   dwarf2_emit_insn (inst.size);
16702 }
16703
16704 static char *
16705 output_it_inst (int cond, int mask, char * to)
16706 {
16707   unsigned long instruction = 0xbf00;
16708
16709   mask &= 0xf;
16710   instruction |= mask;
16711   instruction |= cond << 4;
16712
16713   if (to == NULL)
16714     {
16715       to = frag_more (2);
16716 #ifdef OBJ_ELF
16717       dwarf2_emit_insn (2);
16718 #endif
16719     }
16720
16721   md_number_to_chars (to, instruction, 2);
16722
16723   return to;
16724 }
16725
16726 /* Tag values used in struct asm_opcode's tag field.  */
16727 enum opcode_tag
16728 {
16729   OT_unconditional,     /* Instruction cannot be conditionalized.
16730                            The ARM condition field is still 0xE.  */
16731   OT_unconditionalF,    /* Instruction cannot be conditionalized
16732                            and carries 0xF in its ARM condition field.  */
16733   OT_csuffix,           /* Instruction takes a conditional suffix.  */
16734   OT_csuffixF,          /* Some forms of the instruction take a conditional
16735                            suffix, others place 0xF where the condition field
16736                            would be.  */
16737   OT_cinfix3,           /* Instruction takes a conditional infix,
16738                            beginning at character index 3.  (In
16739                            unified mode, it becomes a suffix.)  */
16740   OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
16741                             tsts, cmps, cmns, and teqs. */
16742   OT_cinfix3_legacy,    /* Legacy instruction takes a conditional infix at
16743                            character index 3, even in unified mode.  Used for
16744                            legacy instructions where suffix and infix forms
16745                            may be ambiguous.  */
16746   OT_csuf_or_in3,       /* Instruction takes either a conditional
16747                            suffix or an infix at character index 3.  */
16748   OT_odd_infix_unc,     /* This is the unconditional variant of an
16749                            instruction that takes a conditional infix
16750                            at an unusual position.  In unified mode,
16751                            this variant will accept a suffix.  */
16752   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
16753                            are the conditional variants of instructions that
16754                            take conditional infixes in unusual positions.
16755                            The infix appears at character index
16756                            (tag - OT_odd_infix_0).  These are not accepted
16757                            in unified mode.  */
16758 };
16759
16760 /* Subroutine of md_assemble, responsible for looking up the primary
16761    opcode from the mnemonic the user wrote.  STR points to the
16762    beginning of the mnemonic.
16763
16764    This is not simply a hash table lookup, because of conditional
16765    variants.  Most instructions have conditional variants, which are
16766    expressed with a _conditional affix_ to the mnemonic.  If we were
16767    to encode each conditional variant as a literal string in the opcode
16768    table, it would have approximately 20,000 entries.
16769
16770    Most mnemonics take this affix as a suffix, and in unified syntax,
16771    'most' is upgraded to 'all'.  However, in the divided syntax, some
16772    instructions take the affix as an infix, notably the s-variants of
16773    the arithmetic instructions.  Of those instructions, all but six
16774    have the infix appear after the third character of the mnemonic.
16775
16776    Accordingly, the algorithm for looking up primary opcodes given
16777    an identifier is:
16778
16779    1. Look up the identifier in the opcode table.
16780       If we find a match, go to step U.
16781
16782    2. Look up the last two characters of the identifier in the
16783       conditions table.  If we find a match, look up the first N-2
16784       characters of the identifier in the opcode table.  If we
16785       find a match, go to step CE.
16786
16787    3. Look up the fourth and fifth characters of the identifier in
16788       the conditions table.  If we find a match, extract those
16789       characters from the identifier, and look up the remaining
16790       characters in the opcode table.  If we find a match, go
16791       to step CM.
16792
16793    4. Fail.
16794
16795    U. Examine the tag field of the opcode structure, in case this is
16796       one of the six instructions with its conditional infix in an
16797       unusual place.  If it is, the tag tells us where to find the
16798       infix; look it up in the conditions table and set inst.cond
16799       accordingly.  Otherwise, this is an unconditional instruction.
16800       Again set inst.cond accordingly.  Return the opcode structure.
16801
16802   CE. Examine the tag field to make sure this is an instruction that
16803       should receive a conditional suffix.  If it is not, fail.
16804       Otherwise, set inst.cond from the suffix we already looked up,
16805       and return the opcode structure.
16806
16807   CM. Examine the tag field to make sure this is an instruction that
16808       should receive a conditional infix after the third character.
16809       If it is not, fail.  Otherwise, undo the edits to the current
16810       line of input and proceed as for case CE.  */
16811
16812 static const struct asm_opcode *
16813 opcode_lookup (char **str)
16814 {
16815   char *end, *base;
16816   char *affix;
16817   const struct asm_opcode *opcode;
16818   const struct asm_cond *cond;
16819   char save[2];
16820
16821   /* Scan up to the end of the mnemonic, which must end in white space,
16822      '.' (in unified mode, or for Neon/VFP instructions), or end of string.  */
16823   for (base = end = *str; *end != '\0'; end++)
16824     if (*end == ' ' || *end == '.')
16825       break;
16826
16827   if (end == base)
16828     return NULL;
16829
16830   /* Handle a possible width suffix and/or Neon type suffix.  */
16831   if (end[0] == '.')
16832     {
16833       int offset = 2;
16834
16835       /* The .w and .n suffixes are only valid if the unified syntax is in
16836          use.  */
16837       if (unified_syntax && end[1] == 'w')
16838         inst.size_req = 4;
16839       else if (unified_syntax && end[1] == 'n')
16840         inst.size_req = 2;
16841       else
16842         offset = 0;
16843
16844       inst.vectype.elems = 0;
16845
16846       *str = end + offset;
16847
16848       if (end[offset] == '.')
16849         {
16850           /* See if we have a Neon type suffix (possible in either unified or
16851              non-unified ARM syntax mode).  */
16852           if (parse_neon_type (&inst.vectype, str) == FAIL)
16853             return NULL;
16854         }
16855       else if (end[offset] != '\0' && end[offset] != ' ')
16856         return NULL;
16857     }
16858   else
16859     *str = end;
16860
16861   /* Look for unaffixed or special-case affixed mnemonic.  */
16862   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16863                                                     end - base);
16864   if (opcode)
16865     {
16866       /* step U */
16867       if (opcode->tag < OT_odd_infix_0)
16868         {
16869           inst.cond = COND_ALWAYS;
16870           return opcode;
16871         }
16872
16873       if (warn_on_deprecated && unified_syntax)
16874         as_warn (_("conditional infixes are deprecated in unified syntax"));
16875       affix = base + (opcode->tag - OT_odd_infix_0);
16876       cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16877       gas_assert (cond);
16878
16879       inst.cond = cond->value;
16880       return opcode;
16881     }
16882
16883   /* Cannot have a conditional suffix on a mnemonic of less than two
16884      characters.  */
16885   if (end - base < 3)
16886     return NULL;
16887
16888   /* Look for suffixed mnemonic.  */
16889   affix = end - 2;
16890   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16891   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16892                                                     affix - base);
16893   if (opcode && cond)
16894     {
16895       /* step CE */
16896       switch (opcode->tag)
16897         {
16898         case OT_cinfix3_legacy:
16899           /* Ignore conditional suffixes matched on infix only mnemonics.  */
16900           break;
16901
16902         case OT_cinfix3:
16903         case OT_cinfix3_deprecated:
16904         case OT_odd_infix_unc:
16905           if (!unified_syntax)
16906             return 0;
16907           /* else fall through */
16908
16909         case OT_csuffix:
16910         case OT_csuffixF:
16911         case OT_csuf_or_in3:
16912           inst.cond = cond->value;
16913           return opcode;
16914
16915         case OT_unconditional:
16916         case OT_unconditionalF:
16917           if (thumb_mode)
16918             inst.cond = cond->value;
16919           else
16920             {
16921               /* Delayed diagnostic.  */
16922               inst.error = BAD_COND;
16923               inst.cond = COND_ALWAYS;
16924             }
16925           return opcode;
16926
16927         default:
16928           return NULL;
16929         }
16930     }
16931
16932   /* Cannot have a usual-position infix on a mnemonic of less than
16933      six characters (five would be a suffix).  */
16934   if (end - base < 6)
16935     return NULL;
16936
16937   /* Look for infixed mnemonic in the usual position.  */
16938   affix = base + 3;
16939   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16940   if (!cond)
16941     return NULL;
16942
16943   memcpy (save, affix, 2);
16944   memmove (affix, affix + 2, (end - affix) - 2);
16945   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16946                                                     (end - base) - 2);
16947   memmove (affix + 2, affix, (end - affix) - 2);
16948   memcpy (affix, save, 2);
16949
16950   if (opcode
16951       && (opcode->tag == OT_cinfix3
16952           || opcode->tag == OT_cinfix3_deprecated
16953           || opcode->tag == OT_csuf_or_in3
16954           || opcode->tag == OT_cinfix3_legacy))
16955     {
16956       /* Step CM.  */
16957       if (warn_on_deprecated && unified_syntax
16958           && (opcode->tag == OT_cinfix3
16959               || opcode->tag == OT_cinfix3_deprecated))
16960         as_warn (_("conditional infixes are deprecated in unified syntax"));
16961
16962       inst.cond = cond->value;
16963       return opcode;
16964     }
16965
16966   return NULL;
16967 }
16968
16969 /* This function generates an initial IT instruction, leaving its block
16970    virtually open for the new instructions. Eventually,
16971    the mask will be updated by now_it_add_mask () each time
16972    a new instruction needs to be included in the IT block.
16973    Finally, the block is closed with close_automatic_it_block ().
16974    The block closure can be requested either from md_assemble (),
16975    a tencode (), or due to a label hook.  */
16976
16977 static void
16978 new_automatic_it_block (int cond)
16979 {
16980   now_it.state = AUTOMATIC_IT_BLOCK;
16981   now_it.mask = 0x18;
16982   now_it.cc = cond;
16983   now_it.block_length = 1;
16984   mapping_state (MAP_THUMB);
16985   now_it.insn = output_it_inst (cond, now_it.mask, NULL);
16986   now_it.warn_deprecated = FALSE;
16987   now_it.insn_cond = TRUE;
16988 }
16989
16990 /* Close an automatic IT block.
16991    See comments in new_automatic_it_block ().  */
16992
16993 static void
16994 close_automatic_it_block (void)
16995 {
16996   now_it.mask = 0x10;
16997   now_it.block_length = 0;
16998 }
16999
17000 /* Update the mask of the current automatically-generated IT
17001    instruction. See comments in new_automatic_it_block ().  */
17002
17003 static void
17004 now_it_add_mask (int cond)
17005 {
17006 #define CLEAR_BIT(value, nbit)  ((value) & ~(1 << (nbit)))
17007 #define SET_BIT_VALUE(value, bitvalue, nbit)  (CLEAR_BIT (value, nbit) \
17008                                               | ((bitvalue) << (nbit)))
17009   const int resulting_bit = (cond & 1);
17010
17011   now_it.mask &= 0xf;
17012   now_it.mask = SET_BIT_VALUE (now_it.mask,
17013                                    resulting_bit,
17014                                   (5 - now_it.block_length));
17015   now_it.mask = SET_BIT_VALUE (now_it.mask,
17016                                    1,
17017                                    ((5 - now_it.block_length) - 1) );
17018   output_it_inst (now_it.cc, now_it.mask, now_it.insn);
17019
17020 #undef CLEAR_BIT
17021 #undef SET_BIT_VALUE
17022 }
17023
17024 /* The IT blocks handling machinery is accessed through the these functions:
17025      it_fsm_pre_encode ()               from md_assemble ()
17026      set_it_insn_type ()                optional, from the tencode functions
17027      set_it_insn_type_last ()           ditto
17028      in_it_block ()                     ditto
17029      it_fsm_post_encode ()              from md_assemble ()
17030      force_automatic_it_block_close ()  from label habdling functions
17031
17032    Rationale:
17033      1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
17034         initializing the IT insn type with a generic initial value depending
17035         on the inst.condition.
17036      2) During the tencode function, two things may happen:
17037         a) The tencode function overrides the IT insn type by
17038            calling either set_it_insn_type (type) or set_it_insn_type_last ().
17039         b) The tencode function queries the IT block state by
17040            calling in_it_block () (i.e. to determine narrow/not narrow mode).
17041
17042         Both set_it_insn_type and in_it_block run the internal FSM state
17043         handling function (handle_it_state), because: a) setting the IT insn
17044         type may incur in an invalid state (exiting the function),
17045         and b) querying the state requires the FSM to be updated.
17046         Specifically we want to avoid creating an IT block for conditional
17047         branches, so it_fsm_pre_encode is actually a guess and we can't
17048         determine whether an IT block is required until the tencode () routine
17049         has decided what type of instruction this actually it.
17050         Because of this, if set_it_insn_type and in_it_block have to be used,
17051         set_it_insn_type has to be called first.
17052
17053         set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
17054         determines the insn IT type depending on the inst.cond code.
17055         When a tencode () routine encodes an instruction that can be
17056         either outside an IT block, or, in the case of being inside, has to be
17057         the last one, set_it_insn_type_last () will determine the proper
17058         IT instruction type based on the inst.cond code. Otherwise,
17059         set_it_insn_type can be called for overriding that logic or
17060         for covering other cases.
17061
17062         Calling handle_it_state () may not transition the IT block state to
17063         OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
17064         still queried. Instead, if the FSM determines that the state should
17065         be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
17066         after the tencode () function: that's what it_fsm_post_encode () does.
17067
17068         Since in_it_block () calls the state handling function to get an
17069         updated state, an error may occur (due to invalid insns combination).
17070         In that case, inst.error is set.
17071         Therefore, inst.error has to be checked after the execution of
17072         the tencode () routine.
17073
17074      3) Back in md_assemble(), it_fsm_post_encode () is called to commit
17075         any pending state change (if any) that didn't take place in
17076         handle_it_state () as explained above.  */
17077
17078 static void
17079 it_fsm_pre_encode (void)
17080 {
17081   if (inst.cond != COND_ALWAYS)
17082     inst.it_insn_type = INSIDE_IT_INSN;
17083   else
17084     inst.it_insn_type = OUTSIDE_IT_INSN;
17085
17086   now_it.state_handled = 0;
17087 }
17088
17089 /* IT state FSM handling function.  */
17090
17091 static int
17092 handle_it_state (void)
17093 {
17094   now_it.state_handled = 1;
17095   now_it.insn_cond = FALSE;
17096
17097   switch (now_it.state)
17098     {
17099     case OUTSIDE_IT_BLOCK:
17100       switch (inst.it_insn_type)
17101         {
17102         case OUTSIDE_IT_INSN:
17103           break;
17104
17105         case INSIDE_IT_INSN:
17106         case INSIDE_IT_LAST_INSN:
17107           if (thumb_mode == 0)
17108             {
17109               if (unified_syntax
17110                   && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
17111                 as_tsktsk (_("Warning: conditional outside an IT block"\
17112                              " for Thumb."));
17113             }
17114           else
17115             {
17116               if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
17117                   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
17118                 {
17119                   /* Automatically generate the IT instruction.  */
17120                   new_automatic_it_block (inst.cond);
17121                   if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
17122                     close_automatic_it_block ();
17123                 }
17124               else
17125                 {
17126                   inst.error = BAD_OUT_IT;
17127                   return FAIL;
17128                 }
17129             }
17130           break;
17131
17132         case IF_INSIDE_IT_LAST_INSN:
17133         case NEUTRAL_IT_INSN:
17134           break;
17135
17136         case IT_INSN:
17137           now_it.state = MANUAL_IT_BLOCK;
17138           now_it.block_length = 0;
17139           break;
17140         }
17141       break;
17142
17143     case AUTOMATIC_IT_BLOCK:
17144       /* Three things may happen now:
17145          a) We should increment current it block size;
17146          b) We should close current it block (closing insn or 4 insns);
17147          c) We should close current it block and start a new one (due
17148          to incompatible conditions or
17149          4 insns-length block reached).  */
17150
17151       switch (inst.it_insn_type)
17152         {
17153         case OUTSIDE_IT_INSN:
17154           /* The closure of the block shall happen immediatelly,
17155              so any in_it_block () call reports the block as closed.  */
17156           force_automatic_it_block_close ();
17157           break;
17158
17159         case INSIDE_IT_INSN:
17160         case INSIDE_IT_LAST_INSN:
17161         case IF_INSIDE_IT_LAST_INSN:
17162           now_it.block_length++;
17163
17164           if (now_it.block_length > 4
17165               || !now_it_compatible (inst.cond))
17166             {
17167               force_automatic_it_block_close ();
17168               if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
17169                 new_automatic_it_block (inst.cond);
17170             }
17171           else
17172             {
17173               now_it.insn_cond = TRUE;
17174               now_it_add_mask (inst.cond);
17175             }
17176
17177           if (now_it.state == AUTOMATIC_IT_BLOCK
17178               && (inst.it_insn_type == INSIDE_IT_LAST_INSN
17179                   || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
17180             close_automatic_it_block ();
17181           break;
17182
17183         case NEUTRAL_IT_INSN:
17184           now_it.block_length++;
17185           now_it.insn_cond = TRUE;
17186
17187           if (now_it.block_length > 4)
17188             force_automatic_it_block_close ();
17189           else
17190             now_it_add_mask (now_it.cc & 1);
17191           break;
17192
17193         case IT_INSN:
17194           close_automatic_it_block ();
17195           now_it.state = MANUAL_IT_BLOCK;
17196           break;
17197         }
17198       break;
17199
17200     case MANUAL_IT_BLOCK:
17201       {
17202         /* Check conditional suffixes.  */
17203         const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
17204         int is_last;
17205         now_it.mask <<= 1;
17206         now_it.mask &= 0x1f;
17207         is_last = (now_it.mask == 0x10);
17208         now_it.insn_cond = TRUE;
17209
17210         switch (inst.it_insn_type)
17211           {
17212           case OUTSIDE_IT_INSN:
17213             inst.error = BAD_NOT_IT;
17214             return FAIL;
17215
17216           case INSIDE_IT_INSN:
17217             if (cond != inst.cond)
17218               {
17219                 inst.error = BAD_IT_COND;
17220                 return FAIL;
17221               }
17222             break;
17223
17224           case INSIDE_IT_LAST_INSN:
17225           case IF_INSIDE_IT_LAST_INSN:
17226             if (cond != inst.cond)
17227               {
17228                 inst.error = BAD_IT_COND;
17229                 return FAIL;
17230               }
17231             if (!is_last)
17232               {
17233                 inst.error = BAD_BRANCH;
17234                 return FAIL;
17235               }
17236             break;
17237
17238           case NEUTRAL_IT_INSN:
17239             /* The BKPT instruction is unconditional even in an IT block.  */
17240             break;
17241
17242           case IT_INSN:
17243             inst.error = BAD_IT_IT;
17244             return FAIL;
17245           }
17246       }
17247       break;
17248     }
17249
17250   return SUCCESS;
17251 }
17252
17253 struct depr_insn_mask
17254 {
17255   unsigned long pattern;
17256   unsigned long mask;
17257   const char* description;
17258 };
17259
17260 /* List of 16-bit instruction patterns deprecated in an IT block in
17261    ARMv8.  */
17262 static const struct depr_insn_mask depr_it_insns[] = {
17263   { 0xc000, 0xc000, N_("Short branches, Undefined, SVC, LDM/STM") },
17264   { 0xb000, 0xb000, N_("Miscellaneous 16-bit instructions") },
17265   { 0xa000, 0xb800, N_("ADR") },
17266   { 0x4800, 0xf800, N_("Literal loads") },
17267   { 0x4478, 0xf478, N_("Hi-register ADD, MOV, CMP, BX, BLX using pc") },
17268   { 0x4487, 0xfc87, N_("Hi-register ADD, MOV, CMP using pc") },
17269   { 0, 0, NULL }
17270 };
17271
17272 static void
17273 it_fsm_post_encode (void)
17274 {
17275   int is_last;
17276
17277   if (!now_it.state_handled)
17278     handle_it_state ();
17279
17280   if (now_it.insn_cond
17281       && !now_it.warn_deprecated
17282       && warn_on_deprecated
17283       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
17284     {
17285       if (inst.instruction >= 0x10000)
17286         {
17287           as_warn (_("IT blocks containing 32-bit Thumb instructions are "
17288                      "deprecated in ARMv8"));
17289           now_it.warn_deprecated = TRUE;
17290         }
17291       else
17292         {
17293           const struct depr_insn_mask *p = depr_it_insns;
17294
17295           while (p->mask != 0)
17296             {
17297               if ((inst.instruction & p->mask) == p->pattern)
17298                 {
17299                   as_warn (_("IT blocks containing 16-bit Thumb instructions "
17300                              "of the following class are deprecated in ARMv8: "
17301                              "%s"), p->description);
17302                   now_it.warn_deprecated = TRUE;
17303                   break;
17304                 }
17305
17306               ++p;
17307             }
17308         }
17309
17310       if (now_it.block_length > 1)
17311         {
17312           as_warn (_("IT blocks containing more than one conditional "
17313                      "instruction are deprecated in ARMv8"));
17314           now_it.warn_deprecated = TRUE;
17315         }
17316     }
17317
17318   is_last = (now_it.mask == 0x10);
17319   if (is_last)
17320     {
17321       now_it.state = OUTSIDE_IT_BLOCK;
17322       now_it.mask = 0;
17323     }
17324 }
17325
17326 static void
17327 force_automatic_it_block_close (void)
17328 {
17329   if (now_it.state == AUTOMATIC_IT_BLOCK)
17330     {
17331       close_automatic_it_block ();
17332       now_it.state = OUTSIDE_IT_BLOCK;
17333       now_it.mask = 0;
17334     }
17335 }
17336
17337 static int
17338 in_it_block (void)
17339 {
17340   if (!now_it.state_handled)
17341     handle_it_state ();
17342
17343   return now_it.state != OUTSIDE_IT_BLOCK;
17344 }
17345
17346 void
17347 md_assemble (char *str)
17348 {
17349   char *p = str;
17350   const struct asm_opcode * opcode;
17351
17352   /* Align the previous label if needed.  */
17353   if (last_label_seen != NULL)
17354     {
17355       symbol_set_frag (last_label_seen, frag_now);
17356       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
17357       S_SET_SEGMENT (last_label_seen, now_seg);
17358     }
17359
17360   memset (&inst, '\0', sizeof (inst));
17361   inst.reloc.type = BFD_RELOC_UNUSED;
17362
17363   opcode = opcode_lookup (&p);
17364   if (!opcode)
17365     {
17366       /* It wasn't an instruction, but it might be a register alias of
17367          the form alias .req reg, or a Neon .dn/.qn directive.  */
17368       if (! create_register_alias (str, p)
17369           && ! create_neon_reg_alias (str, p))
17370         as_bad (_("bad instruction `%s'"), str);
17371
17372       return;
17373     }
17374
17375   if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
17376     as_warn (_("s suffix on comparison instruction is deprecated"));
17377
17378   /* The value which unconditional instructions should have in place of the
17379      condition field.  */
17380   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
17381
17382   if (thumb_mode)
17383     {
17384       arm_feature_set variant;
17385
17386       variant = cpu_variant;
17387       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
17388       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
17389         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
17390       /* Check that this instruction is supported for this CPU.  */
17391       if (!opcode->tvariant
17392           || (thumb_mode == 1
17393               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
17394         {
17395           as_bad (_("selected processor does not support Thumb mode `%s'"), str);
17396           return;
17397         }
17398       if (inst.cond != COND_ALWAYS && !unified_syntax
17399           && opcode->tencode != do_t_branch)
17400         {
17401           as_bad (_("Thumb does not support conditional execution"));
17402           return;
17403         }
17404
17405       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
17406         {
17407           if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
17408               && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
17409                    || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
17410             {
17411               /* Two things are addressed here.
17412                  1) Implicit require narrow instructions on Thumb-1.
17413                     This avoids relaxation accidentally introducing Thumb-2
17414                      instructions.
17415                  2) Reject wide instructions in non Thumb-2 cores.  */
17416               if (inst.size_req == 0)
17417                 inst.size_req = 2;
17418               else if (inst.size_req == 4)
17419                 {
17420                   as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
17421                   return;
17422                 }
17423             }
17424         }
17425
17426       inst.instruction = opcode->tvalue;
17427
17428       if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
17429         {
17430           /* Prepare the it_insn_type for those encodings that don't set
17431              it.  */
17432           it_fsm_pre_encode ();
17433
17434           opcode->tencode ();
17435
17436           it_fsm_post_encode ();
17437         }
17438
17439       if (!(inst.error || inst.relax))
17440         {
17441           gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
17442           inst.size = (inst.instruction > 0xffff ? 4 : 2);
17443           if (inst.size_req && inst.size_req != inst.size)
17444             {
17445               as_bad (_("cannot honor width suffix -- `%s'"), str);
17446               return;
17447             }
17448         }
17449
17450       /* Something has gone badly wrong if we try to relax a fixed size
17451          instruction.  */
17452       gas_assert (inst.size_req == 0 || !inst.relax);
17453
17454       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17455                               *opcode->tvariant);
17456       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
17457          set those bits when Thumb-2 32-bit instructions are seen.  ie.
17458          anything other than bl/blx and v6-M instructions.
17459          This is overly pessimistic for relaxable instructions.  */
17460       if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
17461            || inst.relax)
17462           && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
17463                || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
17464         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17465                                 arm_ext_v6t2);
17466
17467       check_neon_suffixes;
17468
17469       if (!inst.error)
17470         {
17471           mapping_state (MAP_THUMB);
17472         }
17473     }
17474   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
17475     {
17476       bfd_boolean is_bx;
17477
17478       /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
17479       is_bx = (opcode->aencode == do_bx);
17480
17481       /* Check that this instruction is supported for this CPU.  */
17482       if (!(is_bx && fix_v4bx)
17483           && !(opcode->avariant &&
17484                ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
17485         {
17486           as_bad (_("selected processor does not support ARM mode `%s'"), str);
17487           return;
17488         }
17489       if (inst.size_req)
17490         {
17491           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
17492           return;
17493         }
17494
17495       inst.instruction = opcode->avalue;
17496       if (opcode->tag == OT_unconditionalF)
17497         inst.instruction |= 0xF << 28;
17498       else
17499         inst.instruction |= inst.cond << 28;
17500       inst.size = INSN_SIZE;
17501       if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
17502         {
17503           it_fsm_pre_encode ();
17504           opcode->aencode ();
17505           it_fsm_post_encode ();
17506         }
17507       /* Arm mode bx is marked as both v4T and v5 because it's still required
17508          on a hypothetical non-thumb v5 core.  */
17509       if (is_bx)
17510         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
17511       else
17512         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
17513                                 *opcode->avariant);
17514
17515       check_neon_suffixes;
17516
17517       if (!inst.error)
17518         {
17519           mapping_state (MAP_ARM);
17520         }
17521     }
17522   else
17523     {
17524       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
17525                 "-- `%s'"), str);
17526       return;
17527     }
17528   output_inst (str);
17529 }
17530
17531 static void
17532 check_it_blocks_finished (void)
17533 {
17534 #ifdef OBJ_ELF
17535   asection *sect;
17536
17537   for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
17538     if (seg_info (sect)->tc_segment_info_data.current_it.state
17539         == MANUAL_IT_BLOCK)
17540       {
17541         as_warn (_("section '%s' finished with an open IT block."),
17542                  sect->name);
17543       }
17544 #else
17545   if (now_it.state == MANUAL_IT_BLOCK)
17546     as_warn (_("file finished with an open IT block."));
17547 #endif
17548 }
17549
17550 /* Various frobbings of labels and their addresses.  */
17551
17552 void
17553 arm_start_line_hook (void)
17554 {
17555   last_label_seen = NULL;
17556 }
17557
17558 void
17559 arm_frob_label (symbolS * sym)
17560 {
17561   last_label_seen = sym;
17562
17563   ARM_SET_THUMB (sym, thumb_mode);
17564
17565 #if defined OBJ_COFF || defined OBJ_ELF
17566   ARM_SET_INTERWORK (sym, support_interwork);
17567 #endif
17568
17569   force_automatic_it_block_close ();
17570
17571   /* Note - do not allow local symbols (.Lxxx) to be labelled
17572      as Thumb functions.  This is because these labels, whilst
17573      they exist inside Thumb code, are not the entry points for
17574      possible ARM->Thumb calls.  Also, these labels can be used
17575      as part of a computed goto or switch statement.  eg gcc
17576      can generate code that looks like this:
17577
17578                 ldr  r2, [pc, .Laaa]
17579                 lsl  r3, r3, #2
17580                 ldr  r2, [r3, r2]
17581                 mov  pc, r2
17582
17583        .Lbbb:  .word .Lxxx
17584        .Lccc:  .word .Lyyy
17585        ..etc...
17586        .Laaa:   .word Lbbb
17587
17588      The first instruction loads the address of the jump table.
17589      The second instruction converts a table index into a byte offset.
17590      The third instruction gets the jump address out of the table.
17591      The fourth instruction performs the jump.
17592
17593      If the address stored at .Laaa is that of a symbol which has the
17594      Thumb_Func bit set, then the linker will arrange for this address
17595      to have the bottom bit set, which in turn would mean that the
17596      address computation performed by the third instruction would end
17597      up with the bottom bit set.  Since the ARM is capable of unaligned
17598      word loads, the instruction would then load the incorrect address
17599      out of the jump table, and chaos would ensue.  */
17600   if (label_is_thumb_function_name
17601       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
17602       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
17603     {
17604       /* When the address of a Thumb function is taken the bottom
17605          bit of that address should be set.  This will allow
17606          interworking between Arm and Thumb functions to work
17607          correctly.  */
17608
17609       THUMB_SET_FUNC (sym, 1);
17610
17611       label_is_thumb_function_name = FALSE;
17612     }
17613
17614   dwarf2_emit_label (sym);
17615 }
17616
17617 bfd_boolean
17618 arm_data_in_code (void)
17619 {
17620   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
17621     {
17622       *input_line_pointer = '/';
17623       input_line_pointer += 5;
17624       *input_line_pointer = 0;
17625       return TRUE;
17626     }
17627
17628   return FALSE;
17629 }
17630
17631 char *
17632 arm_canonicalize_symbol_name (char * name)
17633 {
17634   int len;
17635
17636   if (thumb_mode && (len = strlen (name)) > 5
17637       && streq (name + len - 5, "/data"))
17638     *(name + len - 5) = 0;
17639
17640   return name;
17641 }
17642 \f
17643 /* Table of all register names defined by default.  The user can
17644    define additional names with .req.  Note that all register names
17645    should appear in both upper and lowercase variants.  Some registers
17646    also have mixed-case names.  */
17647
17648 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
17649 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
17650 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
17651 #define REGSET(p,t) \
17652   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
17653   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
17654   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
17655   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
17656 #define REGSETH(p,t) \
17657   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
17658   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
17659   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
17660   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
17661 #define REGSET2(p,t) \
17662   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
17663   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
17664   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
17665   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
17666 #define SPLRBANK(base,bank,t) \
17667   REGDEF(lr_##bank, 768|((base+0)<<16), t), \
17668   REGDEF(sp_##bank, 768|((base+1)<<16), t), \
17669   REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
17670   REGDEF(LR_##bank, 768|((base+0)<<16), t), \
17671   REGDEF(SP_##bank, 768|((base+1)<<16), t), \
17672   REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
17673
17674 static const struct reg_entry reg_names[] =
17675 {
17676   /* ARM integer registers.  */
17677   REGSET(r, RN), REGSET(R, RN),
17678
17679   /* ATPCS synonyms.  */
17680   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
17681   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
17682   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
17683
17684   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
17685   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
17686   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
17687
17688   /* Well-known aliases.  */
17689   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
17690   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
17691
17692   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
17693   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
17694
17695   /* Coprocessor numbers.  */
17696   REGSET(p, CP), REGSET(P, CP),
17697
17698   /* Coprocessor register numbers.  The "cr" variants are for backward
17699      compatibility.  */
17700   REGSET(c,  CN), REGSET(C, CN),
17701   REGSET(cr, CN), REGSET(CR, CN),
17702
17703   /* ARM banked registers.  */
17704   REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
17705   REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
17706   REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
17707   REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
17708   REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
17709   REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
17710   REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
17711
17712   REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
17713   REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
17714   REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
17715   REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
17716   REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
17717   REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(sp_fiq,512|(13<<16),RNB),
17718   REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
17719   REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
17720
17721   SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
17722   SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
17723   SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
17724   SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
17725   SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
17726   REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
17727   REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
17728   REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
17729   REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
17730
17731   /* FPA registers.  */
17732   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
17733   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
17734
17735   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
17736   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
17737
17738   /* VFP SP registers.  */
17739   REGSET(s,VFS),  REGSET(S,VFS),
17740   REGSETH(s,VFS), REGSETH(S,VFS),
17741
17742   /* VFP DP Registers.  */
17743   REGSET(d,VFD),  REGSET(D,VFD),
17744   /* Extra Neon DP registers.  */
17745   REGSETH(d,VFD), REGSETH(D,VFD),
17746
17747   /* Neon QP registers.  */
17748   REGSET2(q,NQ),  REGSET2(Q,NQ),
17749
17750   /* VFP control registers.  */
17751   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
17752   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
17753   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
17754   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
17755   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
17756   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
17757
17758   /* Maverick DSP coprocessor registers.  */
17759   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
17760   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
17761
17762   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
17763   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
17764   REGDEF(dspsc,0,DSPSC),
17765
17766   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
17767   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
17768   REGDEF(DSPSC,0,DSPSC),
17769
17770   /* iWMMXt data registers - p0, c0-15.  */
17771   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
17772
17773   /* iWMMXt control registers - p1, c0-3.  */
17774   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
17775   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
17776   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
17777   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
17778
17779   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
17780   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
17781   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
17782   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
17783   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
17784
17785   /* XScale accumulator registers.  */
17786   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
17787 };
17788 #undef REGDEF
17789 #undef REGNUM
17790 #undef REGSET
17791
17792 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
17793    within psr_required_here.  */
17794 static const struct asm_psr psrs[] =
17795 {
17796   /* Backward compatibility notation.  Note that "all" is no longer
17797      truly all possible PSR bits.  */
17798   {"all",  PSR_c | PSR_f},
17799   {"flg",  PSR_f},
17800   {"ctl",  PSR_c},
17801
17802   /* Individual flags.  */
17803   {"f",    PSR_f},
17804   {"c",    PSR_c},
17805   {"x",    PSR_x},
17806   {"s",    PSR_s},
17807
17808   /* Combinations of flags.  */
17809   {"fs",   PSR_f | PSR_s},
17810   {"fx",   PSR_f | PSR_x},
17811   {"fc",   PSR_f | PSR_c},
17812   {"sf",   PSR_s | PSR_f},
17813   {"sx",   PSR_s | PSR_x},
17814   {"sc",   PSR_s | PSR_c},
17815   {"xf",   PSR_x | PSR_f},
17816   {"xs",   PSR_x | PSR_s},
17817   {"xc",   PSR_x | PSR_c},
17818   {"cf",   PSR_c | PSR_f},
17819   {"cs",   PSR_c | PSR_s},
17820   {"cx",   PSR_c | PSR_x},
17821   {"fsx",  PSR_f | PSR_s | PSR_x},
17822   {"fsc",  PSR_f | PSR_s | PSR_c},
17823   {"fxs",  PSR_f | PSR_x | PSR_s},
17824   {"fxc",  PSR_f | PSR_x | PSR_c},
17825   {"fcs",  PSR_f | PSR_c | PSR_s},
17826   {"fcx",  PSR_f | PSR_c | PSR_x},
17827   {"sfx",  PSR_s | PSR_f | PSR_x},
17828   {"sfc",  PSR_s | PSR_f | PSR_c},
17829   {"sxf",  PSR_s | PSR_x | PSR_f},
17830   {"sxc",  PSR_s | PSR_x | PSR_c},
17831   {"scf",  PSR_s | PSR_c | PSR_f},
17832   {"scx",  PSR_s | PSR_c | PSR_x},
17833   {"xfs",  PSR_x | PSR_f | PSR_s},
17834   {"xfc",  PSR_x | PSR_f | PSR_c},
17835   {"xsf",  PSR_x | PSR_s | PSR_f},
17836   {"xsc",  PSR_x | PSR_s | PSR_c},
17837   {"xcf",  PSR_x | PSR_c | PSR_f},
17838   {"xcs",  PSR_x | PSR_c | PSR_s},
17839   {"cfs",  PSR_c | PSR_f | PSR_s},
17840   {"cfx",  PSR_c | PSR_f | PSR_x},
17841   {"csf",  PSR_c | PSR_s | PSR_f},
17842   {"csx",  PSR_c | PSR_s | PSR_x},
17843   {"cxf",  PSR_c | PSR_x | PSR_f},
17844   {"cxs",  PSR_c | PSR_x | PSR_s},
17845   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
17846   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
17847   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
17848   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
17849   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
17850   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
17851   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
17852   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
17853   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
17854   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
17855   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
17856   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
17857   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
17858   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
17859   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
17860   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
17861   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
17862   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
17863   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
17864   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
17865   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
17866   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
17867   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
17868   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
17869 };
17870
17871 /* Table of V7M psr names.  */
17872 static const struct asm_psr v7m_psrs[] =
17873 {
17874   {"apsr",        0 }, {"APSR",         0 },
17875   {"iapsr",       1 }, {"IAPSR",        1 },
17876   {"eapsr",       2 }, {"EAPSR",        2 },
17877   {"psr",         3 }, {"PSR",          3 },
17878   {"xpsr",        3 }, {"XPSR",         3 }, {"xPSR",     3 },
17879   {"ipsr",        5 }, {"IPSR",         5 },
17880   {"epsr",        6 }, {"EPSR",         6 },
17881   {"iepsr",       7 }, {"IEPSR",        7 },
17882   {"msp",         8 }, {"MSP",          8 },
17883   {"psp",         9 }, {"PSP",          9 },
17884   {"primask",     16}, {"PRIMASK",      16},
17885   {"basepri",     17}, {"BASEPRI",      17},
17886   {"basepri_max", 18}, {"BASEPRI_MAX",  18},
17887   {"basepri_max", 18}, {"BASEPRI_MASK", 18}, /* Typo, preserved for backwards compatibility.  */
17888   {"faultmask",   19}, {"FAULTMASK",    19},
17889   {"control",     20}, {"CONTROL",      20}
17890 };
17891
17892 /* Table of all shift-in-operand names.  */
17893 static const struct asm_shift_name shift_names [] =
17894 {
17895   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
17896   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
17897   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
17898   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
17899   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
17900   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
17901 };
17902
17903 /* Table of all explicit relocation names.  */
17904 #ifdef OBJ_ELF
17905 static struct reloc_entry reloc_names[] =
17906 {
17907   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
17908   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
17909   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
17910   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
17911   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
17912   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
17913   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
17914   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
17915   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
17916   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
17917   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32},
17918   { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
17919   { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
17920         { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
17921   { "tlscall", BFD_RELOC_ARM_TLS_CALL},
17922         { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
17923   { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
17924         { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
17925 };
17926 #endif
17927
17928 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
17929 static const struct asm_cond conds[] =
17930 {
17931   {"eq", 0x0},
17932   {"ne", 0x1},
17933   {"cs", 0x2}, {"hs", 0x2},
17934   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
17935   {"mi", 0x4},
17936   {"pl", 0x5},
17937   {"vs", 0x6},
17938   {"vc", 0x7},
17939   {"hi", 0x8},
17940   {"ls", 0x9},
17941   {"ge", 0xa},
17942   {"lt", 0xb},
17943   {"gt", 0xc},
17944   {"le", 0xd},
17945   {"al", 0xe}
17946 };
17947
17948 #define UL_BARRIER(L,U,CODE,FEAT) \
17949   { L, CODE, ARM_FEATURE (FEAT, 0) }, \
17950   { U, CODE, ARM_FEATURE (FEAT, 0) }
17951
17952 static struct asm_barrier_opt barrier_opt_names[] =
17953 {
17954   UL_BARRIER ("sy",     "SY",    0xf, ARM_EXT_BARRIER),
17955   UL_BARRIER ("st",     "ST",    0xe, ARM_EXT_BARRIER),
17956   UL_BARRIER ("ld",     "LD",    0xd, ARM_EXT_V8),
17957   UL_BARRIER ("ish",    "ISH",   0xb, ARM_EXT_BARRIER),
17958   UL_BARRIER ("sh",     "SH",    0xb, ARM_EXT_BARRIER),
17959   UL_BARRIER ("ishst",  "ISHST", 0xa, ARM_EXT_BARRIER),
17960   UL_BARRIER ("shst",   "SHST",  0xa, ARM_EXT_BARRIER),
17961   UL_BARRIER ("ishld",  "ISHLD", 0x9, ARM_EXT_V8),
17962   UL_BARRIER ("un",     "UN",    0x7, ARM_EXT_BARRIER),
17963   UL_BARRIER ("nsh",    "NSH",   0x7, ARM_EXT_BARRIER),
17964   UL_BARRIER ("unst",   "UNST",  0x6, ARM_EXT_BARRIER),
17965   UL_BARRIER ("nshst",  "NSHST", 0x6, ARM_EXT_BARRIER),
17966   UL_BARRIER ("nshld",  "NSHLD", 0x5, ARM_EXT_V8),
17967   UL_BARRIER ("osh",    "OSH",   0x3, ARM_EXT_BARRIER),
17968   UL_BARRIER ("oshst",  "OSHST", 0x2, ARM_EXT_BARRIER),
17969   UL_BARRIER ("oshld",  "OSHLD", 0x1, ARM_EXT_V8)
17970 };
17971
17972 #undef UL_BARRIER
17973
17974 /* Table of ARM-format instructions.    */
17975
17976 /* Macros for gluing together operand strings.  N.B. In all cases
17977    other than OPS0, the trailing OP_stop comes from default
17978    zero-initialization of the unspecified elements of the array.  */
17979 #define OPS0()            { OP_stop, }
17980 #define OPS1(a)           { OP_##a, }
17981 #define OPS2(a,b)         { OP_##a,OP_##b, }
17982 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
17983 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
17984 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
17985 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
17986
17987 /* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
17988    This is useful when mixing operands for ARM and THUMB, i.e. using the
17989    MIX_ARM_THUMB_OPERANDS macro.
17990    In order to use these macros, prefix the number of operands with _
17991    e.g. _3.  */
17992 #define OPS_1(a)           { a, }
17993 #define OPS_2(a,b)         { a,b, }
17994 #define OPS_3(a,b,c)       { a,b,c, }
17995 #define OPS_4(a,b,c,d)     { a,b,c,d, }
17996 #define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
17997 #define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
17998
17999 /* These macros abstract out the exact format of the mnemonic table and
18000    save some repeated characters.  */
18001
18002 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
18003 #define TxCE(mnem, op, top, nops, ops, ae, te) \
18004   { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
18005     THUMB_VARIANT, do_##ae, do_##te }
18006
18007 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
18008    a T_MNEM_xyz enumerator.  */
18009 #define TCE(mnem, aop, top, nops, ops, ae, te) \
18010       TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
18011 #define tCE(mnem, aop, top, nops, ops, ae, te) \
18012       TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
18013
18014 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
18015    infix after the third character.  */
18016 #define TxC3(mnem, op, top, nops, ops, ae, te) \
18017   { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
18018     THUMB_VARIANT, do_##ae, do_##te }
18019 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
18020   { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
18021     THUMB_VARIANT, do_##ae, do_##te }
18022 #define TC3(mnem, aop, top, nops, ops, ae, te) \
18023       TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
18024 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
18025       TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
18026 #define tC3(mnem, aop, top, nops, ops, ae, te) \
18027       TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
18028 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
18029       TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
18030
18031 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
18032    field is still 0xE.  Many of the Thumb variants can be executed
18033    conditionally, so this is checked separately.  */
18034 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
18035   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
18036     THUMB_VARIANT, do_##ae, do_##te }
18037
18038 /* Same as TUE but the encoding function for ARM and Thumb modes is the same.
18039    Used by mnemonics that have very minimal differences in the encoding for
18040    ARM and Thumb variants and can be handled in a common function.  */
18041 #define TUEc(mnem, op, top, nops, ops, en) \
18042   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
18043     THUMB_VARIANT, do_##en, do_##en }
18044
18045 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
18046    condition code field.  */
18047 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
18048   { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
18049     THUMB_VARIANT, do_##ae, do_##te }
18050
18051 /* ARM-only variants of all the above.  */
18052 #define CE(mnem,  op, nops, ops, ae)    \
18053   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18054
18055 #define C3(mnem, op, nops, ops, ae)     \
18056   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18057
18058 /* Legacy mnemonics that always have conditional infix after the third
18059    character.  */
18060 #define CL(mnem, op, nops, ops, ae)     \
18061   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
18062     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18063
18064 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
18065 #define cCE(mnem,  op, nops, ops, ae)   \
18066   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
18067
18068 /* Legacy coprocessor instructions where conditional infix and conditional
18069    suffix are ambiguous.  For consistency this includes all FPA instructions,
18070    not just the potentially ambiguous ones.  */
18071 #define cCL(mnem, op, nops, ops, ae)    \
18072   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
18073     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
18074
18075 /* Coprocessor, takes either a suffix or a position-3 infix
18076    (for an FPA corner case). */
18077 #define C3E(mnem, op, nops, ops, ae) \
18078   { mnem, OPS##nops ops, OT_csuf_or_in3, \
18079     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
18080
18081 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
18082   { m1 #m2 m3, OPS##nops ops, \
18083     sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
18084     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18085
18086 #define CM(m1, m2, op, nops, ops, ae)   \
18087   xCM_ (m1,   , m2, op, nops, ops, ae), \
18088   xCM_ (m1, eq, m2, op, nops, ops, ae), \
18089   xCM_ (m1, ne, m2, op, nops, ops, ae), \
18090   xCM_ (m1, cs, m2, op, nops, ops, ae), \
18091   xCM_ (m1, hs, m2, op, nops, ops, ae), \
18092   xCM_ (m1, cc, m2, op, nops, ops, ae), \
18093   xCM_ (m1, ul, m2, op, nops, ops, ae), \
18094   xCM_ (m1, lo, m2, op, nops, ops, ae), \
18095   xCM_ (m1, mi, m2, op, nops, ops, ae), \
18096   xCM_ (m1, pl, m2, op, nops, ops, ae), \
18097   xCM_ (m1, vs, m2, op, nops, ops, ae), \
18098   xCM_ (m1, vc, m2, op, nops, ops, ae), \
18099   xCM_ (m1, hi, m2, op, nops, ops, ae), \
18100   xCM_ (m1, ls, m2, op, nops, ops, ae), \
18101   xCM_ (m1, ge, m2, op, nops, ops, ae), \
18102   xCM_ (m1, lt, m2, op, nops, ops, ae), \
18103   xCM_ (m1, gt, m2, op, nops, ops, ae), \
18104   xCM_ (m1, le, m2, op, nops, ops, ae), \
18105   xCM_ (m1, al, m2, op, nops, ops, ae)
18106
18107 #define UE(mnem, op, nops, ops, ae)     \
18108   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
18109
18110 #define UF(mnem, op, nops, ops, ae)     \
18111   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
18112
18113 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
18114    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
18115    use the same encoding function for each.  */
18116 #define NUF(mnem, op, nops, ops, enc)                                   \
18117   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
18118     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
18119
18120 /* Neon data processing, version which indirects through neon_enc_tab for
18121    the various overloaded versions of opcodes.  */
18122 #define nUF(mnem, op, nops, ops, enc)                                   \
18123   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
18124     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
18125
18126 /* Neon insn with conditional suffix for the ARM version, non-overloaded
18127    version.  */
18128 #define NCE_tag(mnem, op, nops, ops, enc, tag)                          \
18129   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
18130     THUMB_VARIANT, do_##enc, do_##enc }
18131
18132 #define NCE(mnem, op, nops, ops, enc)                                   \
18133    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
18134
18135 #define NCEF(mnem, op, nops, ops, enc)                                  \
18136     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
18137
18138 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
18139 #define nCE_tag(mnem, op, nops, ops, enc, tag)                          \
18140   { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,          \
18141     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
18142
18143 #define nCE(mnem, op, nops, ops, enc)                                   \
18144    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
18145
18146 #define nCEF(mnem, op, nops, ops, enc)                                  \
18147     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
18148
18149 #define do_0 0
18150
18151 static const struct asm_opcode insns[] =
18152 {
18153 #define ARM_VARIANT    & arm_ext_v1 /* Core ARM Instructions.  */
18154 #define THUMB_VARIANT  & arm_ext_v4t
18155  tCE("and",     0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
18156  tC3("ands",    0100000, _ands,    3, (RR, oRR, SH), arit, t_arit3c),
18157  tCE("eor",     0200000, _eor,     3, (RR, oRR, SH), arit, t_arit3c),
18158  tC3("eors",    0300000, _eors,    3, (RR, oRR, SH), arit, t_arit3c),
18159  tCE("sub",     0400000, _sub,     3, (RR, oRR, SH), arit, t_add_sub),
18160  tC3("subs",    0500000, _subs,    3, (RR, oRR, SH), arit, t_add_sub),
18161  tCE("add",     0800000, _add,     3, (RR, oRR, SHG), arit, t_add_sub),
18162  tC3("adds",    0900000, _adds,    3, (RR, oRR, SHG), arit, t_add_sub),
18163  tCE("adc",     0a00000, _adc,     3, (RR, oRR, SH), arit, t_arit3c),
18164  tC3("adcs",    0b00000, _adcs,    3, (RR, oRR, SH), arit, t_arit3c),
18165  tCE("sbc",     0c00000, _sbc,     3, (RR, oRR, SH), arit, t_arit3),
18166  tC3("sbcs",    0d00000, _sbcs,    3, (RR, oRR, SH), arit, t_arit3),
18167  tCE("orr",     1800000, _orr,     3, (RR, oRR, SH), arit, t_arit3c),
18168  tC3("orrs",    1900000, _orrs,    3, (RR, oRR, SH), arit, t_arit3c),
18169  tCE("bic",     1c00000, _bic,     3, (RR, oRR, SH), arit, t_arit3),
18170  tC3("bics",    1d00000, _bics,    3, (RR, oRR, SH), arit, t_arit3),
18171
18172  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
18173     for setting PSR flag bits.  They are obsolete in V6 and do not
18174     have Thumb equivalents. */
18175  tCE("tst",     1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
18176  tC3w("tsts",   1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
18177   CL("tstp",    110f000,           2, (RR, SH),      cmp),
18178  tCE("cmp",     1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
18179  tC3w("cmps",   1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
18180   CL("cmpp",    150f000,           2, (RR, SH),      cmp),
18181  tCE("cmn",     1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
18182  tC3w("cmns",   1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
18183   CL("cmnp",    170f000,           2, (RR, SH),      cmp),
18184
18185  tCE("mov",     1a00000, _mov,     2, (RR, SH),      mov,  t_mov_cmp),
18186  tC3("movs",    1b00000, _movs,    2, (RR, SH),      mov,  t_mov_cmp),
18187  tCE("mvn",     1e00000, _mvn,     2, (RR, SH),      mov,  t_mvn_tst),
18188  tC3("mvns",    1f00000, _mvns,    2, (RR, SH),      mov,  t_mvn_tst),
18189
18190  tCE("ldr",     4100000, _ldr,     2, (RR, ADDRGLDR),ldst, t_ldst),
18191  tC3("ldrb",    4500000, _ldrb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
18192  tCE("str",     4000000, _str,     _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
18193                                                                 OP_RRnpc),
18194                                         OP_ADDRGLDR),ldst, t_ldst),
18195  tC3("strb",    4400000, _strb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
18196
18197  tCE("stm",     8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18198  tC3("stmia",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18199  tC3("stmea",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18200  tCE("ldm",     8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18201  tC3("ldmia",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18202  tC3("ldmfd",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18203
18204  TCE("swi",     f000000, df00,     1, (EXPi),        swi, t_swi),
18205  TCE("svc",     f000000, df00,     1, (EXPi),        swi, t_swi),
18206  tCE("b",       a000000, _b,       1, (EXPr),        branch, t_branch),
18207  TCE("bl",      b000000, f000f800, 1, (EXPr),        bl, t_branch23),
18208
18209   /* Pseudo ops.  */
18210  tCE("adr",     28f0000, _adr,     2, (RR, EXP),     adr,  t_adr),
18211   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
18212  tCE("nop",     1a00000, _nop,     1, (oI255c),      nop,  t_nop),
18213  tCE("udf",     7f000f0, _udf,     1, (oIffffb),     bkpt, t_udf),
18214
18215   /* Thumb-compatibility pseudo ops.  */
18216  tCE("lsl",     1a00000, _lsl,     3, (RR, oRR, SH), shift, t_shift),
18217  tC3("lsls",    1b00000, _lsls,    3, (RR, oRR, SH), shift, t_shift),
18218  tCE("lsr",     1a00020, _lsr,     3, (RR, oRR, SH), shift, t_shift),
18219  tC3("lsrs",    1b00020, _lsrs,    3, (RR, oRR, SH), shift, t_shift),
18220  tCE("asr",     1a00040, _asr,     3, (RR, oRR, SH), shift, t_shift),
18221  tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
18222  tCE("ror",     1a00060, _ror,     3, (RR, oRR, SH), shift, t_shift),
18223  tC3("rors",    1b00060, _rors,    3, (RR, oRR, SH), shift, t_shift),
18224  tCE("neg",     2600000, _neg,     2, (RR, RR),      rd_rn, t_neg),
18225  tC3("negs",    2700000, _negs,    2, (RR, RR),      rd_rn, t_neg),
18226  tCE("push",    92d0000, _push,     1, (REGLST),             push_pop, t_push_pop),
18227  tCE("pop",     8bd0000, _pop,     1, (REGLST),      push_pop, t_push_pop),
18228
18229  /* These may simplify to neg.  */
18230  TCE("rsb",     0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
18231  TC3("rsbs",    0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
18232
18233 #undef  THUMB_VARIANT
18234 #define THUMB_VARIANT  & arm_ext_v6
18235
18236  TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
18237
18238  /* V1 instructions with no Thumb analogue prior to V6T2.  */
18239 #undef  THUMB_VARIANT
18240 #define THUMB_VARIANT  & arm_ext_v6t2
18241
18242  TCE("teq",     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
18243  TC3w("teqs",   1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
18244   CL("teqp",    130f000,           2, (RR, SH),      cmp),
18245
18246  TC3("ldrt",    4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18247  TC3("ldrbt",   4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18248  TC3("strt",    4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
18249  TC3("strbt",   4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18250
18251  TC3("stmdb",   9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18252  TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18253
18254  TC3("ldmdb",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18255  TC3("ldmea",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18256
18257  /* V1 instructions with no Thumb analogue at all.  */
18258   CE("rsc",     0e00000,           3, (RR, oRR, SH), arit),
18259   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
18260
18261   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
18262   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
18263   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
18264   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
18265   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
18266   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
18267   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
18268   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
18269
18270 #undef  ARM_VARIANT
18271 #define ARM_VARIANT    & arm_ext_v2     /* ARM 2 - multiplies.  */
18272 #undef  THUMB_VARIANT
18273 #define THUMB_VARIANT  & arm_ext_v4t
18274
18275  tCE("mul",     0000090, _mul,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
18276  tC3("muls",    0100090, _muls,    3, (RRnpc, RRnpc, oRR), mul, t_mul),
18277
18278 #undef  THUMB_VARIANT
18279 #define THUMB_VARIANT  & arm_ext_v6t2
18280
18281  TCE("mla",     0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
18282   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
18283
18284   /* Generic coprocessor instructions.  */
18285  TCE("cdp",     e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
18286  TCE("ldc",     c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18287  TC3("ldcl",    c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18288  TCE("stc",     c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18289  TC3("stcl",    c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18290  TCE("mcr",     e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18291  TCE("mrc",     e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b),   co_reg, co_reg),
18292
18293 #undef  ARM_VARIANT
18294 #define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
18295
18296   CE("swp",     1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
18297   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
18298
18299 #undef  ARM_VARIANT
18300 #define ARM_VARIANT    & arm_ext_v3     /* ARM 6 Status register instructions.  */
18301 #undef  THUMB_VARIANT
18302 #define THUMB_VARIANT  & arm_ext_msr
18303
18304  TCE("mrs",     1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
18305  TCE("msr",     120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
18306
18307 #undef  ARM_VARIANT
18308 #define ARM_VARIANT    & arm_ext_v3m     /* ARM 7M long multiplies.  */
18309 #undef  THUMB_VARIANT
18310 #define THUMB_VARIANT  & arm_ext_v6t2
18311
18312  TCE("smull",   0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18313   CM("smull","s",       0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18314  TCE("umull",   0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18315   CM("umull","s",       0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18316  TCE("smlal",   0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18317   CM("smlal","s",       0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18318  TCE("umlal",   0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18319   CM("umlal","s",       0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18320
18321 #undef  ARM_VARIANT
18322 #define ARM_VARIANT    & arm_ext_v4     /* ARM Architecture 4.  */
18323 #undef  THUMB_VARIANT
18324 #define THUMB_VARIANT  & arm_ext_v4t
18325
18326  tC3("ldrh",    01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18327  tC3("strh",    00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18328  tC3("ldrsh",   01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18329  tC3("ldrsb",   01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18330  tC3("ldsh",    01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18331  tC3("ldsb",    01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18332
18333 #undef  ARM_VARIANT
18334 #define ARM_VARIANT  & arm_ext_v4t_5
18335
18336   /* ARM Architecture 4T.  */
18337   /* Note: bx (and blx) are required on V5, even if the processor does
18338      not support Thumb.  */
18339  TCE("bx",      12fff10, 4700, 1, (RR), bx, t_bx),
18340
18341 #undef  ARM_VARIANT
18342 #define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.     */
18343 #undef  THUMB_VARIANT
18344 #define THUMB_VARIANT  & arm_ext_v5t
18345
18346   /* Note: blx has 2 variants; the .value coded here is for
18347      BLX(2).  Only this variant has conditional execution.  */
18348  TCE("blx",     12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
18349  TUE("bkpt",    1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
18350
18351 #undef  THUMB_VARIANT
18352 #define THUMB_VARIANT  & arm_ext_v6t2
18353
18354  TCE("clz",     16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
18355  TUF("ldc2",    c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18356  TUF("ldc2l",   c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
18357  TUF("stc2",    c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18358  TUF("stc2l",   c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
18359  TUF("cdp2",    e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
18360  TUF("mcr2",    e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18361  TUF("mrc2",    e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18362
18363 #undef  ARM_VARIANT
18364 #define ARM_VARIANT    & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
18365 #undef  THUMB_VARIANT
18366 #define THUMB_VARIANT  & arm_ext_v5exp
18367
18368  TCE("smlabb",  1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18369  TCE("smlatb",  10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18370  TCE("smlabt",  10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18371  TCE("smlatt",  10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18372
18373  TCE("smlawb",  1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18374  TCE("smlawt",  12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18375
18376  TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18377  TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18378  TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18379  TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18380
18381  TCE("smulbb",  1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18382  TCE("smultb",  16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18383  TCE("smulbt",  16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18384  TCE("smultt",  16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18385
18386  TCE("smulwb",  12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18387  TCE("smulwt",  12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18388
18389  TCE("qadd",    1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18390  TCE("qdadd",   1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18391  TCE("qsub",    1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18392  TCE("qdsub",   1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18393
18394 #undef  ARM_VARIANT
18395 #define ARM_VARIANT    & arm_ext_v5e /*  ARM Architecture 5TE.  */
18396 #undef  THUMB_VARIANT
18397 #define THUMB_VARIANT  & arm_ext_v6t2
18398
18399  TUF("pld",     450f000, f810f000, 1, (ADDR),                pld,  t_pld),
18400  TC3("ldrd",    00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
18401      ldrd, t_ldstd),
18402  TC3("strd",    00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
18403                                        ADDRGLDRS), ldrd, t_ldstd),
18404
18405  TCE("mcrr",    c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18406  TCE("mrrc",    c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18407
18408 #undef  ARM_VARIANT
18409 #define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
18410
18411  TCE("bxj",     12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
18412
18413 #undef  ARM_VARIANT
18414 #define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
18415 #undef  THUMB_VARIANT
18416 #define THUMB_VARIANT  & arm_ext_v6
18417
18418  TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
18419  TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
18420  tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18421  tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18422  tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18423  tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18424  tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18425  tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18426  tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18427  TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
18428
18429 #undef  THUMB_VARIANT
18430 #define THUMB_VARIANT  & arm_ext_v6t2
18431
18432  TCE("ldrex",   1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),        ldrex, t_ldrex),
18433  TCE("strex",   1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18434                                       strex,  t_strex),
18435  TUF("mcrr2",   c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18436  TUF("mrrc2",   c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18437
18438  TCE("ssat",    6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
18439  TCE("usat",    6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
18440
18441 /*  ARM V6 not included in V7M.  */
18442 #undef  THUMB_VARIANT
18443 #define THUMB_VARIANT  & arm_ext_v6_notm
18444  TUF("rfeia",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18445  TUF("rfe",     8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18446   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
18447   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
18448  TUF("rfedb",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
18449  TUF("rfefd",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18450   UF(rfefa,     8100a00,           1, (RRw),                       rfe),
18451  TUF("rfeea",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
18452   UF(rfeed,     9900a00,           1, (RRw),                       rfe),
18453  TUF("srsia",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18454  TUF("srs",     8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18455  TUF("srsea",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18456   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
18457   UF(srsfa,     9c00500,           2, (oRRw, I31w),                srs),
18458   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
18459   UF(srsed,     8400500,           2, (oRRw, I31w),                srs),
18460  TUF("srsdb",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
18461  TUF("srsfd",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
18462
18463 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
18464 #undef  THUMB_VARIANT
18465 #define THUMB_VARIANT  & arm_ext_v6_dsp
18466  TUF("cps",     1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
18467  TCE("pkhbt",   6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
18468  TCE("pkhtb",   6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
18469  TCE("qadd16",  6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18470  TCE("qadd8",   6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18471  TCE("qasx",    6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18472  /* Old name for QASX.  */
18473  TCE("qaddsubx",6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18474  TCE("qsax",    6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18475  /* Old name for QSAX.  */
18476  TCE("qsubaddx",6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18477  TCE("qsub16",  6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18478  TCE("qsub8",   6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18479  TCE("sadd16",  6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18480  TCE("sadd8",   6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18481  TCE("sasx",    6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18482  /* Old name for SASX.  */
18483  TCE("saddsubx",6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18484  TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18485  TCE("shadd8",  6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18486  TCE("shasx",   6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18487  /* Old name for SHASX.  */
18488  TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18489  TCE("shsax",     6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18490  /* Old name for SHSAX.  */
18491  TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18492  TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18493  TCE("shsub8",  6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18494  TCE("ssax",    6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18495  /* Old name for SSAX.  */
18496  TCE("ssubaddx",6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18497  TCE("ssub16",  6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18498  TCE("ssub8",   6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18499  TCE("uadd16",  6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18500  TCE("uadd8",   6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18501  TCE("uasx",    6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18502  /* Old name for UASX.  */
18503  TCE("uaddsubx",6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18504  TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18505  TCE("uhadd8",  6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18506  TCE("uhasx",   6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18507  /* Old name for UHASX.  */
18508  TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18509  TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18510  /* Old name for UHSAX.  */
18511  TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18512  TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18513  TCE("uhsub8",  6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18514  TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18515  TCE("uqadd8",  6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18516  TCE("uqasx",   6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18517  /* Old name for UQASX.  */
18518  TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18519  TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18520  /* Old name for UQSAX.  */
18521  TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18522  TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18523  TCE("uqsub8",  6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18524  TCE("usub16",  6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18525  TCE("usax",    6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18526  /* Old name for USAX.  */
18527  TCE("usubaddx",6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18528  TCE("usub8",   6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18529  TCE("sxtah",   6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18530  TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18531  TCE("sxtab",   6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18532  TCE("sxtb16",  68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
18533  TCE("uxtah",   6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18534  TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18535  TCE("uxtab",   6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18536  TCE("uxtb16",  6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
18537  TCE("sel",     6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18538  TCE("smlad",   7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18539  TCE("smladx",  7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18540  TCE("smlald",  7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18541  TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18542  TCE("smlsd",   7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18543  TCE("smlsdx",  7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18544  TCE("smlsld",  7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18545  TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18546  TCE("smmla",   7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18547  TCE("smmlar",  7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18548  TCE("smmls",   75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18549  TCE("smmlsr",  75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18550  TCE("smmul",   750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18551  TCE("smmulr",  750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18552  TCE("smuad",   700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18553  TCE("smuadx",  700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18554  TCE("smusd",   700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18555  TCE("smusdx",  700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18556  TCE("ssat16",  6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
18557  TCE("umaal",   0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
18558  TCE("usad8",   780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
18559  TCE("usada8",  7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
18560  TCE("usat16",  6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
18561
18562 #undef  ARM_VARIANT
18563 #define ARM_VARIANT   & arm_ext_v6k
18564 #undef  THUMB_VARIANT
18565 #define THUMB_VARIANT & arm_ext_v6k
18566
18567  tCE("yield",   320f001, _yield,    0, (), noargs, t_hint),
18568  tCE("wfe",     320f002, _wfe,      0, (), noargs, t_hint),
18569  tCE("wfi",     320f003, _wfi,      0, (), noargs, t_hint),
18570  tCE("sev",     320f004, _sev,      0, (), noargs, t_hint),
18571
18572 #undef  THUMB_VARIANT
18573 #define THUMB_VARIANT  & arm_ext_v6_notm
18574  TCE("ldrexd",  1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
18575                                       ldrexd, t_ldrexd),
18576  TCE("strexd",  1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
18577                                        RRnpcb), strexd, t_strexd),
18578
18579 #undef  THUMB_VARIANT
18580 #define THUMB_VARIANT  & arm_ext_v6t2
18581  TCE("ldrexb",  1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
18582      rd_rn,  rd_rn),
18583  TCE("ldrexh",  1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
18584      rd_rn,  rd_rn),
18585  TCE("strexb",  1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18586      strex, t_strexbh),
18587  TCE("strexh",  1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18588      strex, t_strexbh),
18589  TUF("clrex",   57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
18590
18591 #undef  ARM_VARIANT
18592 #define ARM_VARIANT    & arm_ext_sec
18593 #undef  THUMB_VARIANT
18594 #define THUMB_VARIANT  & arm_ext_sec
18595
18596  TCE("smc",     1600070, f7f08000, 1, (EXPi), smc, t_smc),
18597
18598 #undef  ARM_VARIANT
18599 #define ARM_VARIANT    & arm_ext_virt
18600 #undef  THUMB_VARIANT
18601 #define THUMB_VARIANT    & arm_ext_virt
18602
18603  TCE("hvc",     1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
18604  TCE("eret",    160006e, f3de8f00, 0, (), noargs, noargs),
18605
18606 #undef  ARM_VARIANT
18607 #define ARM_VARIANT    & arm_ext_v6t2
18608 #undef  THUMB_VARIANT
18609 #define THUMB_VARIANT  & arm_ext_v6t2
18610
18611  TCE("bfc",     7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
18612  TCE("bfi",     7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
18613  TCE("sbfx",    7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
18614  TCE("ubfx",    7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
18615
18616  TCE("mls",     0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
18617  TCE("movw",    3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
18618  TCE("movt",    3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
18619  TCE("rbit",    6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
18620
18621  TC3("ldrht",   03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18622  TC3("ldrsht",  03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18623  TC3("ldrsbt",  03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18624  TC3("strht",   02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18625
18626  /* Thumb-only instructions.  */
18627 #undef  ARM_VARIANT
18628 #define ARM_VARIANT NULL
18629   TUE("cbnz",     0,           b900,     2, (RR, EXP), 0, t_cbz),
18630   TUE("cbz",      0,           b100,     2, (RR, EXP), 0, t_cbz),
18631
18632  /* ARM does not really have an IT instruction, so always allow it.
18633     The opcode is copied from Thumb in order to allow warnings in
18634     -mimplicit-it=[never | arm] modes.  */
18635 #undef  ARM_VARIANT
18636 #define ARM_VARIANT  & arm_ext_v1
18637
18638  TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
18639  TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
18640  TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
18641  TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
18642  TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
18643  TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
18644  TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
18645  TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
18646  TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
18647  TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
18648  TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
18649  TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
18650  TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
18651  TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
18652  TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
18653  /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
18654  TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
18655  TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
18656
18657  /* Thumb2 only instructions.  */
18658 #undef  ARM_VARIANT
18659 #define ARM_VARIANT  NULL
18660
18661  TCE("addw",    0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18662  TCE("subw",    0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18663  TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
18664  TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
18665  TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
18666  TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
18667
18668  /* Hardware division instructions.  */
18669 #undef  ARM_VARIANT
18670 #define ARM_VARIANT    & arm_ext_adiv
18671 #undef  THUMB_VARIANT
18672 #define THUMB_VARIANT  & arm_ext_div
18673
18674  TCE("sdiv",    710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
18675  TCE("udiv",    730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
18676
18677  /* ARM V6M/V7 instructions.  */
18678 #undef  ARM_VARIANT
18679 #define ARM_VARIANT    & arm_ext_barrier
18680 #undef  THUMB_VARIANT
18681 #define THUMB_VARIANT  & arm_ext_barrier
18682
18683  TUF("dmb",     57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, barrier),
18684  TUF("dsb",     57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, barrier),
18685  TUF("isb",     57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, barrier),
18686
18687  /* ARM V7 instructions.  */
18688 #undef  ARM_VARIANT
18689 #define ARM_VARIANT    & arm_ext_v7
18690 #undef  THUMB_VARIANT
18691 #define THUMB_VARIANT  & arm_ext_v7
18692
18693  TUF("pli",     450f000, f910f000, 1, (ADDR),     pli,      t_pld),
18694  TCE("dbg",     320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
18695
18696 #undef  ARM_VARIANT
18697 #define ARM_VARIANT    & arm_ext_mp
18698 #undef  THUMB_VARIANT
18699 #define THUMB_VARIANT  & arm_ext_mp
18700
18701  TUF("pldw",    410f000, f830f000, 1, (ADDR),   pld,    t_pld),
18702
18703  /* AArchv8 instructions.  */
18704 #undef  ARM_VARIANT
18705 #define ARM_VARIANT   & arm_ext_v8
18706 #undef  THUMB_VARIANT
18707 #define THUMB_VARIANT & arm_ext_v8
18708
18709  tCE("sevl",    320f005, _sevl,    0, (),               noargs, t_hint),
18710  TUE("hlt",     1000070, ba80,     1, (oIffffb),        bkpt,   t_hlt),
18711  TCE("ldaex",   1900e9f, e8d00fef, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18712  TCE("ldaexd",  1b00e9f, e8d000ff, 3, (RRnpc, oRRnpc, RRnpcb),
18713                                                         ldrexd, t_ldrexd),
18714  TCE("ldaexb",  1d00e9f, e8d00fcf, 2, (RRnpc,RRnpcb),   rd_rn,  rd_rn),
18715  TCE("ldaexh",  1f00e9f, e8d00fdf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18716  TCE("stlex",   1800e90, e8c00fe0, 3, (RRnpc, RRnpc, RRnpcb),
18717                                                         stlex,  t_stlex),
18718  TCE("stlexd",  1a00e90, e8c000f0, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb),
18719                                                         strexd, t_strexd),
18720  TCE("stlexb",  1c00e90, e8c00fc0, 3, (RRnpc, RRnpc, RRnpcb),
18721                                                         stlex, t_stlex),
18722  TCE("stlexh",  1e00e90, e8c00fd0, 3, (RRnpc, RRnpc, RRnpcb),
18723                                                         stlex, t_stlex),
18724  TCE("lda",     1900c9f, e8d00faf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18725  TCE("ldab",    1d00c9f, e8d00f8f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18726  TCE("ldah",    1f00c9f, e8d00f9f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18727  TCE("stl",     180fc90, e8c00faf, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18728  TCE("stlb",    1c0fc90, e8c00f8f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18729  TCE("stlh",    1e0fc90, e8c00f9f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18730
18731  /* ARMv8 T32 only.  */
18732 #undef  ARM_VARIANT
18733 #define ARM_VARIANT  NULL
18734  TUF("dcps1",   0,       f78f8001, 0, (),       noargs, noargs),
18735  TUF("dcps2",   0,       f78f8002, 0, (),       noargs, noargs),
18736  TUF("dcps3",   0,       f78f8003, 0, (),       noargs, noargs),
18737
18738   /* FP for ARMv8.  */
18739 #undef  ARM_VARIANT
18740 #define ARM_VARIANT   & fpu_vfp_ext_armv8
18741 #undef  THUMB_VARIANT
18742 #define THUMB_VARIANT & fpu_vfp_ext_armv8
18743
18744   nUF(vseleq, _vseleq, 3, (RVSD, RVSD, RVSD),           vsel),
18745   nUF(vselvs, _vselvs, 3, (RVSD, RVSD, RVSD),           vsel),
18746   nUF(vselge, _vselge, 3, (RVSD, RVSD, RVSD),           vsel),
18747   nUF(vselgt, _vselgt, 3, (RVSD, RVSD, RVSD),           vsel),
18748   nUF(vmaxnm, _vmaxnm, 3, (RNSDQ, oRNSDQ, RNSDQ),       vmaxnm),
18749   nUF(vminnm, _vminnm, 3, (RNSDQ, oRNSDQ, RNSDQ),       vmaxnm),
18750   nUF(vcvta,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvta),
18751   nUF(vcvtn,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtn),
18752   nUF(vcvtp,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtp),
18753   nUF(vcvtm,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtm),
18754   nCE(vrintr, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintr),
18755   nCE(vrintz, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintz),
18756   nCE(vrintx, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintx),
18757   nUF(vrinta, _vrinta, 2, (RNSDQ, oRNSDQ),              vrinta),
18758   nUF(vrintn, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintn),
18759   nUF(vrintp, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintp),
18760   nUF(vrintm, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintm),
18761
18762   /* Crypto v1 extensions.  */
18763 #undef  ARM_VARIANT
18764 #define ARM_VARIANT & fpu_crypto_ext_armv8
18765 #undef  THUMB_VARIANT
18766 #define THUMB_VARIANT & fpu_crypto_ext_armv8
18767
18768   nUF(aese, _aes, 2, (RNQ, RNQ), aese),
18769   nUF(aesd, _aes, 2, (RNQ, RNQ), aesd),
18770   nUF(aesmc, _aes, 2, (RNQ, RNQ), aesmc),
18771   nUF(aesimc, _aes, 2, (RNQ, RNQ), aesimc),
18772   nUF(sha1c, _sha3op, 3, (RNQ, RNQ, RNQ), sha1c),
18773   nUF(sha1p, _sha3op, 3, (RNQ, RNQ, RNQ), sha1p),
18774   nUF(sha1m, _sha3op, 3, (RNQ, RNQ, RNQ), sha1m),
18775   nUF(sha1su0, _sha3op, 3, (RNQ, RNQ, RNQ), sha1su0),
18776   nUF(sha256h, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h),
18777   nUF(sha256h2, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h2),
18778   nUF(sha256su1, _sha3op, 3, (RNQ, RNQ, RNQ), sha256su1),
18779   nUF(sha1h, _sha1h, 2, (RNQ, RNQ), sha1h),
18780   nUF(sha1su1, _sha2op, 2, (RNQ, RNQ), sha1su1),
18781   nUF(sha256su0, _sha2op, 2, (RNQ, RNQ), sha256su0),
18782
18783 #undef  ARM_VARIANT
18784 #define ARM_VARIANT   & crc_ext_armv8
18785 #undef  THUMB_VARIANT
18786 #define THUMB_VARIANT & crc_ext_armv8
18787   TUEc("crc32b", 1000040, fac0f080, 3, (RR, oRR, RR), crc32b),
18788   TUEc("crc32h", 1200040, fac0f090, 3, (RR, oRR, RR), crc32h),
18789   TUEc("crc32w", 1400040, fac0f0a0, 3, (RR, oRR, RR), crc32w),
18790   TUEc("crc32cb",1000240, fad0f080, 3, (RR, oRR, RR), crc32cb),
18791   TUEc("crc32ch",1200240, fad0f090, 3, (RR, oRR, RR), crc32ch),
18792   TUEc("crc32cw",1400240, fad0f0a0, 3, (RR, oRR, RR), crc32cw),
18793
18794 #undef  ARM_VARIANT
18795 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
18796 #undef  THUMB_VARIANT
18797 #define THUMB_VARIANT NULL
18798
18799  cCE("wfs",     e200110, 1, (RR),            rd),
18800  cCE("rfs",     e300110, 1, (RR),            rd),
18801  cCE("wfc",     e400110, 1, (RR),            rd),
18802  cCE("rfc",     e500110, 1, (RR),            rd),
18803
18804  cCL("ldfs",    c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18805  cCL("ldfd",    c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18806  cCL("ldfe",    c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18807  cCL("ldfp",    c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18808
18809  cCL("stfs",    c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18810  cCL("stfd",    c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18811  cCL("stfe",    c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18812  cCL("stfp",    c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18813
18814  cCL("mvfs",    e008100, 2, (RF, RF_IF),     rd_rm),
18815  cCL("mvfsp",   e008120, 2, (RF, RF_IF),     rd_rm),
18816  cCL("mvfsm",   e008140, 2, (RF, RF_IF),     rd_rm),
18817  cCL("mvfsz",   e008160, 2, (RF, RF_IF),     rd_rm),
18818  cCL("mvfd",    e008180, 2, (RF, RF_IF),     rd_rm),
18819  cCL("mvfdp",   e0081a0, 2, (RF, RF_IF),     rd_rm),
18820  cCL("mvfdm",   e0081c0, 2, (RF, RF_IF),     rd_rm),
18821  cCL("mvfdz",   e0081e0, 2, (RF, RF_IF),     rd_rm),
18822  cCL("mvfe",    e088100, 2, (RF, RF_IF),     rd_rm),
18823  cCL("mvfep",   e088120, 2, (RF, RF_IF),     rd_rm),
18824  cCL("mvfem",   e088140, 2, (RF, RF_IF),     rd_rm),
18825  cCL("mvfez",   e088160, 2, (RF, RF_IF),     rd_rm),
18826
18827  cCL("mnfs",    e108100, 2, (RF, RF_IF),     rd_rm),
18828  cCL("mnfsp",   e108120, 2, (RF, RF_IF),     rd_rm),
18829  cCL("mnfsm",   e108140, 2, (RF, RF_IF),     rd_rm),
18830  cCL("mnfsz",   e108160, 2, (RF, RF_IF),     rd_rm),
18831  cCL("mnfd",    e108180, 2, (RF, RF_IF),     rd_rm),
18832  cCL("mnfdp",   e1081a0, 2, (RF, RF_IF),     rd_rm),
18833  cCL("mnfdm",   e1081c0, 2, (RF, RF_IF),     rd_rm),
18834  cCL("mnfdz",   e1081e0, 2, (RF, RF_IF),     rd_rm),
18835  cCL("mnfe",    e188100, 2, (RF, RF_IF),     rd_rm),
18836  cCL("mnfep",   e188120, 2, (RF, RF_IF),     rd_rm),
18837  cCL("mnfem",   e188140, 2, (RF, RF_IF),     rd_rm),
18838  cCL("mnfez",   e188160, 2, (RF, RF_IF),     rd_rm),
18839
18840  cCL("abss",    e208100, 2, (RF, RF_IF),     rd_rm),
18841  cCL("abssp",   e208120, 2, (RF, RF_IF),     rd_rm),
18842  cCL("abssm",   e208140, 2, (RF, RF_IF),     rd_rm),
18843  cCL("abssz",   e208160, 2, (RF, RF_IF),     rd_rm),
18844  cCL("absd",    e208180, 2, (RF, RF_IF),     rd_rm),
18845  cCL("absdp",   e2081a0, 2, (RF, RF_IF),     rd_rm),
18846  cCL("absdm",   e2081c0, 2, (RF, RF_IF),     rd_rm),
18847  cCL("absdz",   e2081e0, 2, (RF, RF_IF),     rd_rm),
18848  cCL("abse",    e288100, 2, (RF, RF_IF),     rd_rm),
18849  cCL("absep",   e288120, 2, (RF, RF_IF),     rd_rm),
18850  cCL("absem",   e288140, 2, (RF, RF_IF),     rd_rm),
18851  cCL("absez",   e288160, 2, (RF, RF_IF),     rd_rm),
18852
18853  cCL("rnds",    e308100, 2, (RF, RF_IF),     rd_rm),
18854  cCL("rndsp",   e308120, 2, (RF, RF_IF),     rd_rm),
18855  cCL("rndsm",   e308140, 2, (RF, RF_IF),     rd_rm),
18856  cCL("rndsz",   e308160, 2, (RF, RF_IF),     rd_rm),
18857  cCL("rndd",    e308180, 2, (RF, RF_IF),     rd_rm),
18858  cCL("rnddp",   e3081a0, 2, (RF, RF_IF),     rd_rm),
18859  cCL("rnddm",   e3081c0, 2, (RF, RF_IF),     rd_rm),
18860  cCL("rnddz",   e3081e0, 2, (RF, RF_IF),     rd_rm),
18861  cCL("rnde",    e388100, 2, (RF, RF_IF),     rd_rm),
18862  cCL("rndep",   e388120, 2, (RF, RF_IF),     rd_rm),
18863  cCL("rndem",   e388140, 2, (RF, RF_IF),     rd_rm),
18864  cCL("rndez",   e388160, 2, (RF, RF_IF),     rd_rm),
18865
18866  cCL("sqts",    e408100, 2, (RF, RF_IF),     rd_rm),
18867  cCL("sqtsp",   e408120, 2, (RF, RF_IF),     rd_rm),
18868  cCL("sqtsm",   e408140, 2, (RF, RF_IF),     rd_rm),
18869  cCL("sqtsz",   e408160, 2, (RF, RF_IF),     rd_rm),
18870  cCL("sqtd",    e408180, 2, (RF, RF_IF),     rd_rm),
18871  cCL("sqtdp",   e4081a0, 2, (RF, RF_IF),     rd_rm),
18872  cCL("sqtdm",   e4081c0, 2, (RF, RF_IF),     rd_rm),
18873  cCL("sqtdz",   e4081e0, 2, (RF, RF_IF),     rd_rm),
18874  cCL("sqte",    e488100, 2, (RF, RF_IF),     rd_rm),
18875  cCL("sqtep",   e488120, 2, (RF, RF_IF),     rd_rm),
18876  cCL("sqtem",   e488140, 2, (RF, RF_IF),     rd_rm),
18877  cCL("sqtez",   e488160, 2, (RF, RF_IF),     rd_rm),
18878
18879  cCL("logs",    e508100, 2, (RF, RF_IF),     rd_rm),
18880  cCL("logsp",   e508120, 2, (RF, RF_IF),     rd_rm),
18881  cCL("logsm",   e508140, 2, (RF, RF_IF),     rd_rm),
18882  cCL("logsz",   e508160, 2, (RF, RF_IF),     rd_rm),
18883  cCL("logd",    e508180, 2, (RF, RF_IF),     rd_rm),
18884  cCL("logdp",   e5081a0, 2, (RF, RF_IF),     rd_rm),
18885  cCL("logdm",   e5081c0, 2, (RF, RF_IF),     rd_rm),
18886  cCL("logdz",   e5081e0, 2, (RF, RF_IF),     rd_rm),
18887  cCL("loge",    e588100, 2, (RF, RF_IF),     rd_rm),
18888  cCL("logep",   e588120, 2, (RF, RF_IF),     rd_rm),
18889  cCL("logem",   e588140, 2, (RF, RF_IF),     rd_rm),
18890  cCL("logez",   e588160, 2, (RF, RF_IF),     rd_rm),
18891
18892  cCL("lgns",    e608100, 2, (RF, RF_IF),     rd_rm),
18893  cCL("lgnsp",   e608120, 2, (RF, RF_IF),     rd_rm),
18894  cCL("lgnsm",   e608140, 2, (RF, RF_IF),     rd_rm),
18895  cCL("lgnsz",   e608160, 2, (RF, RF_IF),     rd_rm),
18896  cCL("lgnd",    e608180, 2, (RF, RF_IF),     rd_rm),
18897  cCL("lgndp",   e6081a0, 2, (RF, RF_IF),     rd_rm),
18898  cCL("lgndm",   e6081c0, 2, (RF, RF_IF),     rd_rm),
18899  cCL("lgndz",   e6081e0, 2, (RF, RF_IF),     rd_rm),
18900  cCL("lgne",    e688100, 2, (RF, RF_IF),     rd_rm),
18901  cCL("lgnep",   e688120, 2, (RF, RF_IF),     rd_rm),
18902  cCL("lgnem",   e688140, 2, (RF, RF_IF),     rd_rm),
18903  cCL("lgnez",   e688160, 2, (RF, RF_IF),     rd_rm),
18904
18905  cCL("exps",    e708100, 2, (RF, RF_IF),     rd_rm),
18906  cCL("expsp",   e708120, 2, (RF, RF_IF),     rd_rm),
18907  cCL("expsm",   e708140, 2, (RF, RF_IF),     rd_rm),
18908  cCL("expsz",   e708160, 2, (RF, RF_IF),     rd_rm),
18909  cCL("expd",    e708180, 2, (RF, RF_IF),     rd_rm),
18910  cCL("expdp",   e7081a0, 2, (RF, RF_IF),     rd_rm),
18911  cCL("expdm",   e7081c0, 2, (RF, RF_IF),     rd_rm),
18912  cCL("expdz",   e7081e0, 2, (RF, RF_IF),     rd_rm),
18913  cCL("expe",    e788100, 2, (RF, RF_IF),     rd_rm),
18914  cCL("expep",   e788120, 2, (RF, RF_IF),     rd_rm),
18915  cCL("expem",   e788140, 2, (RF, RF_IF),     rd_rm),
18916  cCL("expdz",   e788160, 2, (RF, RF_IF),     rd_rm),
18917
18918  cCL("sins",    e808100, 2, (RF, RF_IF),     rd_rm),
18919  cCL("sinsp",   e808120, 2, (RF, RF_IF),     rd_rm),
18920  cCL("sinsm",   e808140, 2, (RF, RF_IF),     rd_rm),
18921  cCL("sinsz",   e808160, 2, (RF, RF_IF),     rd_rm),
18922  cCL("sind",    e808180, 2, (RF, RF_IF),     rd_rm),
18923  cCL("sindp",   e8081a0, 2, (RF, RF_IF),     rd_rm),
18924  cCL("sindm",   e8081c0, 2, (RF, RF_IF),     rd_rm),
18925  cCL("sindz",   e8081e0, 2, (RF, RF_IF),     rd_rm),
18926  cCL("sine",    e888100, 2, (RF, RF_IF),     rd_rm),
18927  cCL("sinep",   e888120, 2, (RF, RF_IF),     rd_rm),
18928  cCL("sinem",   e888140, 2, (RF, RF_IF),     rd_rm),
18929  cCL("sinez",   e888160, 2, (RF, RF_IF),     rd_rm),
18930
18931  cCL("coss",    e908100, 2, (RF, RF_IF),     rd_rm),
18932  cCL("cossp",   e908120, 2, (RF, RF_IF),     rd_rm),
18933  cCL("cossm",   e908140, 2, (RF, RF_IF),     rd_rm),
18934  cCL("cossz",   e908160, 2, (RF, RF_IF),     rd_rm),
18935  cCL("cosd",    e908180, 2, (RF, RF_IF),     rd_rm),
18936  cCL("cosdp",   e9081a0, 2, (RF, RF_IF),     rd_rm),
18937  cCL("cosdm",   e9081c0, 2, (RF, RF_IF),     rd_rm),
18938  cCL("cosdz",   e9081e0, 2, (RF, RF_IF),     rd_rm),
18939  cCL("cose",    e988100, 2, (RF, RF_IF),     rd_rm),
18940  cCL("cosep",   e988120, 2, (RF, RF_IF),     rd_rm),
18941  cCL("cosem",   e988140, 2, (RF, RF_IF),     rd_rm),
18942  cCL("cosez",   e988160, 2, (RF, RF_IF),     rd_rm),
18943
18944  cCL("tans",    ea08100, 2, (RF, RF_IF),     rd_rm),
18945  cCL("tansp",   ea08120, 2, (RF, RF_IF),     rd_rm),
18946  cCL("tansm",   ea08140, 2, (RF, RF_IF),     rd_rm),
18947  cCL("tansz",   ea08160, 2, (RF, RF_IF),     rd_rm),
18948  cCL("tand",    ea08180, 2, (RF, RF_IF),     rd_rm),
18949  cCL("tandp",   ea081a0, 2, (RF, RF_IF),     rd_rm),
18950  cCL("tandm",   ea081c0, 2, (RF, RF_IF),     rd_rm),
18951  cCL("tandz",   ea081e0, 2, (RF, RF_IF),     rd_rm),
18952  cCL("tane",    ea88100, 2, (RF, RF_IF),     rd_rm),
18953  cCL("tanep",   ea88120, 2, (RF, RF_IF),     rd_rm),
18954  cCL("tanem",   ea88140, 2, (RF, RF_IF),     rd_rm),
18955  cCL("tanez",   ea88160, 2, (RF, RF_IF),     rd_rm),
18956
18957  cCL("asns",    eb08100, 2, (RF, RF_IF),     rd_rm),
18958  cCL("asnsp",   eb08120, 2, (RF, RF_IF),     rd_rm),
18959  cCL("asnsm",   eb08140, 2, (RF, RF_IF),     rd_rm),
18960  cCL("asnsz",   eb08160, 2, (RF, RF_IF),     rd_rm),
18961  cCL("asnd",    eb08180, 2, (RF, RF_IF),     rd_rm),
18962  cCL("asndp",   eb081a0, 2, (RF, RF_IF),     rd_rm),
18963  cCL("asndm",   eb081c0, 2, (RF, RF_IF),     rd_rm),
18964  cCL("asndz",   eb081e0, 2, (RF, RF_IF),     rd_rm),
18965  cCL("asne",    eb88100, 2, (RF, RF_IF),     rd_rm),
18966  cCL("asnep",   eb88120, 2, (RF, RF_IF),     rd_rm),
18967  cCL("asnem",   eb88140, 2, (RF, RF_IF),     rd_rm),
18968  cCL("asnez",   eb88160, 2, (RF, RF_IF),     rd_rm),
18969
18970  cCL("acss",    ec08100, 2, (RF, RF_IF),     rd_rm),
18971  cCL("acssp",   ec08120, 2, (RF, RF_IF),     rd_rm),
18972  cCL("acssm",   ec08140, 2, (RF, RF_IF),     rd_rm),
18973  cCL("acssz",   ec08160, 2, (RF, RF_IF),     rd_rm),
18974  cCL("acsd",    ec08180, 2, (RF, RF_IF),     rd_rm),
18975  cCL("acsdp",   ec081a0, 2, (RF, RF_IF),     rd_rm),
18976  cCL("acsdm",   ec081c0, 2, (RF, RF_IF),     rd_rm),
18977  cCL("acsdz",   ec081e0, 2, (RF, RF_IF),     rd_rm),
18978  cCL("acse",    ec88100, 2, (RF, RF_IF),     rd_rm),
18979  cCL("acsep",   ec88120, 2, (RF, RF_IF),     rd_rm),
18980  cCL("acsem",   ec88140, 2, (RF, RF_IF),     rd_rm),
18981  cCL("acsez",   ec88160, 2, (RF, RF_IF),     rd_rm),
18982
18983  cCL("atns",    ed08100, 2, (RF, RF_IF),     rd_rm),
18984  cCL("atnsp",   ed08120, 2, (RF, RF_IF),     rd_rm),
18985  cCL("atnsm",   ed08140, 2, (RF, RF_IF),     rd_rm),
18986  cCL("atnsz",   ed08160, 2, (RF, RF_IF),     rd_rm),
18987  cCL("atnd",    ed08180, 2, (RF, RF_IF),     rd_rm),
18988  cCL("atndp",   ed081a0, 2, (RF, RF_IF),     rd_rm),
18989  cCL("atndm",   ed081c0, 2, (RF, RF_IF),     rd_rm),
18990  cCL("atndz",   ed081e0, 2, (RF, RF_IF),     rd_rm),
18991  cCL("atne",    ed88100, 2, (RF, RF_IF),     rd_rm),
18992  cCL("atnep",   ed88120, 2, (RF, RF_IF),     rd_rm),
18993  cCL("atnem",   ed88140, 2, (RF, RF_IF),     rd_rm),
18994  cCL("atnez",   ed88160, 2, (RF, RF_IF),     rd_rm),
18995
18996  cCL("urds",    ee08100, 2, (RF, RF_IF),     rd_rm),
18997  cCL("urdsp",   ee08120, 2, (RF, RF_IF),     rd_rm),
18998  cCL("urdsm",   ee08140, 2, (RF, RF_IF),     rd_rm),
18999  cCL("urdsz",   ee08160, 2, (RF, RF_IF),     rd_rm),
19000  cCL("urdd",    ee08180, 2, (RF, RF_IF),     rd_rm),
19001  cCL("urddp",   ee081a0, 2, (RF, RF_IF),     rd_rm),
19002  cCL("urddm",   ee081c0, 2, (RF, RF_IF),     rd_rm),
19003  cCL("urddz",   ee081e0, 2, (RF, RF_IF),     rd_rm),
19004  cCL("urde",    ee88100, 2, (RF, RF_IF),     rd_rm),
19005  cCL("urdep",   ee88120, 2, (RF, RF_IF),     rd_rm),
19006  cCL("urdem",   ee88140, 2, (RF, RF_IF),     rd_rm),
19007  cCL("urdez",   ee88160, 2, (RF, RF_IF),     rd_rm),
19008
19009  cCL("nrms",    ef08100, 2, (RF, RF_IF),     rd_rm),
19010  cCL("nrmsp",   ef08120, 2, (RF, RF_IF),     rd_rm),
19011  cCL("nrmsm",   ef08140, 2, (RF, RF_IF),     rd_rm),
19012  cCL("nrmsz",   ef08160, 2, (RF, RF_IF),     rd_rm),
19013  cCL("nrmd",    ef08180, 2, (RF, RF_IF),     rd_rm),
19014  cCL("nrmdp",   ef081a0, 2, (RF, RF_IF),     rd_rm),
19015  cCL("nrmdm",   ef081c0, 2, (RF, RF_IF),     rd_rm),
19016  cCL("nrmdz",   ef081e0, 2, (RF, RF_IF),     rd_rm),
19017  cCL("nrme",    ef88100, 2, (RF, RF_IF),     rd_rm),
19018  cCL("nrmep",   ef88120, 2, (RF, RF_IF),     rd_rm),
19019  cCL("nrmem",   ef88140, 2, (RF, RF_IF),     rd_rm),
19020  cCL("nrmez",   ef88160, 2, (RF, RF_IF),     rd_rm),
19021
19022  cCL("adfs",    e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
19023  cCL("adfsp",   e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
19024  cCL("adfsm",   e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
19025  cCL("adfsz",   e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
19026  cCL("adfd",    e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
19027  cCL("adfdp",   e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19028  cCL("adfdm",   e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19029  cCL("adfdz",   e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19030  cCL("adfe",    e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
19031  cCL("adfep",   e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
19032  cCL("adfem",   e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
19033  cCL("adfez",   e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
19034
19035  cCL("sufs",    e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
19036  cCL("sufsp",   e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
19037  cCL("sufsm",   e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
19038  cCL("sufsz",   e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
19039  cCL("sufd",    e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
19040  cCL("sufdp",   e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19041  cCL("sufdm",   e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19042  cCL("sufdz",   e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19043  cCL("sufe",    e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
19044  cCL("sufep",   e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
19045  cCL("sufem",   e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
19046  cCL("sufez",   e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
19047
19048  cCL("rsfs",    e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
19049  cCL("rsfsp",   e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
19050  cCL("rsfsm",   e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
19051  cCL("rsfsz",   e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
19052  cCL("rsfd",    e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
19053  cCL("rsfdp",   e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19054  cCL("rsfdm",   e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19055  cCL("rsfdz",   e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19056  cCL("rsfe",    e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
19057  cCL("rsfep",   e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
19058  cCL("rsfem",   e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
19059  cCL("rsfez",   e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
19060
19061  cCL("mufs",    e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
19062  cCL("mufsp",   e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
19063  cCL("mufsm",   e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
19064  cCL("mufsz",   e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
19065  cCL("mufd",    e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
19066  cCL("mufdp",   e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19067  cCL("mufdm",   e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19068  cCL("mufdz",   e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19069  cCL("mufe",    e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
19070  cCL("mufep",   e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
19071  cCL("mufem",   e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
19072  cCL("mufez",   e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
19073
19074  cCL("dvfs",    e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
19075  cCL("dvfsp",   e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
19076  cCL("dvfsm",   e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
19077  cCL("dvfsz",   e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
19078  cCL("dvfd",    e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
19079  cCL("dvfdp",   e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19080  cCL("dvfdm",   e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19081  cCL("dvfdz",   e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19082  cCL("dvfe",    e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
19083  cCL("dvfep",   e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
19084  cCL("dvfem",   e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
19085  cCL("dvfez",   e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
19086
19087  cCL("rdfs",    e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
19088  cCL("rdfsp",   e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
19089  cCL("rdfsm",   e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
19090  cCL("rdfsz",   e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
19091  cCL("rdfd",    e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
19092  cCL("rdfdp",   e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19093  cCL("rdfdm",   e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19094  cCL("rdfdz",   e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19095  cCL("rdfe",    e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
19096  cCL("rdfep",   e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
19097  cCL("rdfem",   e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
19098  cCL("rdfez",   e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
19099
19100  cCL("pows",    e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
19101  cCL("powsp",   e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
19102  cCL("powsm",   e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
19103  cCL("powsz",   e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
19104  cCL("powd",    e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
19105  cCL("powdp",   e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19106  cCL("powdm",   e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19107  cCL("powdz",   e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19108  cCL("powe",    e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
19109  cCL("powep",   e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
19110  cCL("powem",   e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
19111  cCL("powez",   e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
19112
19113  cCL("rpws",    e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
19114  cCL("rpwsp",   e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
19115  cCL("rpwsm",   e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
19116  cCL("rpwsz",   e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
19117  cCL("rpwd",    e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
19118  cCL("rpwdp",   e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19119  cCL("rpwdm",   e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19120  cCL("rpwdz",   e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19121  cCL("rpwe",    e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
19122  cCL("rpwep",   e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
19123  cCL("rpwem",   e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
19124  cCL("rpwez",   e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
19125
19126  cCL("rmfs",    e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
19127  cCL("rmfsp",   e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
19128  cCL("rmfsm",   e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
19129  cCL("rmfsz",   e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
19130  cCL("rmfd",    e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
19131  cCL("rmfdp",   e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19132  cCL("rmfdm",   e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19133  cCL("rmfdz",   e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19134  cCL("rmfe",    e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
19135  cCL("rmfep",   e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
19136  cCL("rmfem",   e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
19137  cCL("rmfez",   e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
19138
19139  cCL("fmls",    e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
19140  cCL("fmlsp",   e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
19141  cCL("fmlsm",   e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
19142  cCL("fmlsz",   e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
19143  cCL("fmld",    e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
19144  cCL("fmldp",   e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19145  cCL("fmldm",   e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19146  cCL("fmldz",   e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19147  cCL("fmle",    e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
19148  cCL("fmlep",   e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
19149  cCL("fmlem",   e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
19150  cCL("fmlez",   e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
19151
19152  cCL("fdvs",    ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19153  cCL("fdvsp",   ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19154  cCL("fdvsm",   ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19155  cCL("fdvsz",   ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19156  cCL("fdvd",    ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19157  cCL("fdvdp",   ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19158  cCL("fdvdm",   ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19159  cCL("fdvdz",   ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19160  cCL("fdve",    ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19161  cCL("fdvep",   ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19162  cCL("fdvem",   ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19163  cCL("fdvez",   ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19164
19165  cCL("frds",    eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19166  cCL("frdsp",   eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19167  cCL("frdsm",   eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19168  cCL("frdsz",   eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19169  cCL("frdd",    eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19170  cCL("frddp",   eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19171  cCL("frddm",   eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19172  cCL("frddz",   eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19173  cCL("frde",    eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19174  cCL("frdep",   eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19175  cCL("frdem",   eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19176  cCL("frdez",   eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19177
19178  cCL("pols",    ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19179  cCL("polsp",   ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19180  cCL("polsm",   ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19181  cCL("polsz",   ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19182  cCL("pold",    ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19183  cCL("poldp",   ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19184  cCL("poldm",   ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19185  cCL("poldz",   ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19186  cCL("pole",    ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19187  cCL("polep",   ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19188  cCL("polem",   ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19189  cCL("polez",   ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19190
19191  cCE("cmf",     e90f110, 2, (RF, RF_IF),     fpa_cmp),
19192  C3E("cmfe",    ed0f110, 2, (RF, RF_IF),     fpa_cmp),
19193  cCE("cnf",     eb0f110, 2, (RF, RF_IF),     fpa_cmp),
19194  C3E("cnfe",    ef0f110, 2, (RF, RF_IF),     fpa_cmp),
19195
19196  cCL("flts",    e000110, 2, (RF, RR),        rn_rd),
19197  cCL("fltsp",   e000130, 2, (RF, RR),        rn_rd),
19198  cCL("fltsm",   e000150, 2, (RF, RR),        rn_rd),
19199  cCL("fltsz",   e000170, 2, (RF, RR),        rn_rd),
19200  cCL("fltd",    e000190, 2, (RF, RR),        rn_rd),
19201  cCL("fltdp",   e0001b0, 2, (RF, RR),        rn_rd),
19202  cCL("fltdm",   e0001d0, 2, (RF, RR),        rn_rd),
19203  cCL("fltdz",   e0001f0, 2, (RF, RR),        rn_rd),
19204  cCL("flte",    e080110, 2, (RF, RR),        rn_rd),
19205  cCL("fltep",   e080130, 2, (RF, RR),        rn_rd),
19206  cCL("fltem",   e080150, 2, (RF, RR),        rn_rd),
19207  cCL("fltez",   e080170, 2, (RF, RR),        rn_rd),
19208
19209   /* The implementation of the FIX instruction is broken on some
19210      assemblers, in that it accepts a precision specifier as well as a
19211      rounding specifier, despite the fact that this is meaningless.
19212      To be more compatible, we accept it as well, though of course it
19213      does not set any bits.  */
19214  cCE("fix",     e100110, 2, (RR, RF),        rd_rm),
19215  cCL("fixp",    e100130, 2, (RR, RF),        rd_rm),
19216  cCL("fixm",    e100150, 2, (RR, RF),        rd_rm),
19217  cCL("fixz",    e100170, 2, (RR, RF),        rd_rm),
19218  cCL("fixsp",   e100130, 2, (RR, RF),        rd_rm),
19219  cCL("fixsm",   e100150, 2, (RR, RF),        rd_rm),
19220  cCL("fixsz",   e100170, 2, (RR, RF),        rd_rm),
19221  cCL("fixdp",   e100130, 2, (RR, RF),        rd_rm),
19222  cCL("fixdm",   e100150, 2, (RR, RF),        rd_rm),
19223  cCL("fixdz",   e100170, 2, (RR, RF),        rd_rm),
19224  cCL("fixep",   e100130, 2, (RR, RF),        rd_rm),
19225  cCL("fixem",   e100150, 2, (RR, RF),        rd_rm),
19226  cCL("fixez",   e100170, 2, (RR, RF),        rd_rm),
19227
19228   /* Instructions that were new with the real FPA, call them V2.  */
19229 #undef  ARM_VARIANT
19230 #define ARM_VARIANT  & fpu_fpa_ext_v2
19231
19232  cCE("lfm",     c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19233  cCL("lfmfd",   c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19234  cCL("lfmea",   d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19235  cCE("sfm",     c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19236  cCL("sfmfd",   d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19237  cCL("sfmea",   c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19238
19239 #undef  ARM_VARIANT
19240 #define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
19241
19242   /* Moves and type conversions.  */
19243  cCE("fcpys",   eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
19244  cCE("fmrs",    e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
19245  cCE("fmsr",    e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
19246  cCE("fmstat",  ef1fa10, 0, (),               noargs),
19247  cCE("vmrs",    ef00a10, 2, (APSR_RR, RVC),   vmrs),
19248  cCE("vmsr",    ee00a10, 2, (RVC, RR),        vmsr),
19249  cCE("fsitos",  eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19250  cCE("fuitos",  eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
19251  cCE("ftosis",  ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
19252  cCE("ftosizs", ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19253  cCE("ftouis",  ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
19254  cCE("ftouizs", ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19255  cCE("fmrx",    ef00a10, 2, (RR, RVC),        rd_rn),
19256  cCE("fmxr",    ee00a10, 2, (RVC, RR),        rn_rd),
19257
19258   /* Memory operations.  */
19259  cCE("flds",    d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
19260  cCE("fsts",    d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
19261  cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19262  cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19263  cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19264  cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19265  cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19266  cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19267  cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19268  cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19269  cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19270  cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19271  cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19272  cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19273  cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19274  cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19275  cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19276  cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19277
19278   /* Monadic operations.  */
19279  cCE("fabss",   eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19280  cCE("fnegs",   eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
19281  cCE("fsqrts",  eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19282
19283   /* Dyadic operations.  */
19284  cCE("fadds",   e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19285  cCE("fsubs",   e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19286  cCE("fmuls",   e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19287  cCE("fdivs",   e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19288  cCE("fmacs",   e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19289  cCE("fmscs",   e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19290  cCE("fnmuls",  e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19291  cCE("fnmacs",  e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19292  cCE("fnmscs",  e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19293
19294   /* Comparisons.  */
19295  cCE("fcmps",   eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
19296  cCE("fcmpzs",  eb50a40, 1, (RVS),            vfp_sp_compare_z),
19297  cCE("fcmpes",  eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19298  cCE("fcmpezs", eb50ac0, 1, (RVS),            vfp_sp_compare_z),
19299
19300  /* Double precision load/store are still present on single precision
19301     implementations.  */
19302  cCE("fldd",    d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
19303  cCE("fstd",    d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
19304  cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19305  cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19306  cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19307  cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19308  cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19309  cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19310  cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19311  cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19312
19313 #undef  ARM_VARIANT
19314 #define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
19315
19316   /* Moves and type conversions.  */
19317  cCE("fcpyd",   eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19318  cCE("fcvtds",  eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19319  cCE("fcvtsd",  eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19320  cCE("fmdhr",   e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
19321  cCE("fmdlr",   e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
19322  cCE("fmrdh",   e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
19323  cCE("fmrdl",   e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
19324  cCE("fsitod",  eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19325  cCE("fuitod",  eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19326  cCE("ftosid",  ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19327  cCE("ftosizd", ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19328  cCE("ftouid",  ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19329  cCE("ftouizd", ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19330
19331   /* Monadic operations.  */
19332  cCE("fabsd",   eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19333  cCE("fnegd",   eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19334  cCE("fsqrtd",  eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19335
19336   /* Dyadic operations.  */
19337  cCE("faddd",   e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19338  cCE("fsubd",   e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19339  cCE("fmuld",   e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19340  cCE("fdivd",   e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19341  cCE("fmacd",   e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19342  cCE("fmscd",   e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19343  cCE("fnmuld",  e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19344  cCE("fnmacd",  e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19345  cCE("fnmscd",  e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19346
19347   /* Comparisons.  */
19348  cCE("fcmpd",   eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19349  cCE("fcmpzd",  eb50b40, 1, (RVD),            vfp_dp_rd),
19350  cCE("fcmped",  eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19351  cCE("fcmpezd", eb50bc0, 1, (RVD),            vfp_dp_rd),
19352
19353 #undef  ARM_VARIANT
19354 #define ARM_VARIANT  & fpu_vfp_ext_v2
19355
19356  cCE("fmsrr",   c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
19357  cCE("fmrrs",   c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
19358  cCE("fmdrr",   c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
19359  cCE("fmrrd",   c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
19360
19361 /* Instructions which may belong to either the Neon or VFP instruction sets.
19362    Individual encoder functions perform additional architecture checks.  */
19363 #undef  ARM_VARIANT
19364 #define ARM_VARIANT    & fpu_vfp_ext_v1xd
19365 #undef  THUMB_VARIANT
19366 #define THUMB_VARIANT  & fpu_vfp_ext_v1xd
19367
19368   /* These mnemonics are unique to VFP.  */
19369  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
19370  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
19371  nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19372  nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19373  nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19374  nCE(vcmp,      _vcmp,    2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
19375  nCE(vcmpe,     _vcmpe,   2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
19376  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
19377  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
19378  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
19379
19380   /* Mnemonics shared by Neon and VFP.  */
19381  nCEF(vmul,     _vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
19382  nCEF(vmla,     _vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
19383  nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
19384
19385  nCEF(vadd,     _vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
19386  nCEF(vsub,     _vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
19387
19388  NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19389  NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19390
19391  NCE(vldm,      c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19392  NCE(vldmia,    c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19393  NCE(vldmdb,    d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19394  NCE(vstm,      c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19395  NCE(vstmia,    c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19396  NCE(vstmdb,    d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19397  NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
19398  NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
19399
19400  nCEF(vcvt,     _vcvt,   3, (RNSDQ, RNSDQ, oI32z), neon_cvt),
19401  nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
19402  NCEF(vcvtb,    eb20a40, 2, (RVSD, RVSD), neon_cvtb),
19403  NCEF(vcvtt,    eb20a40, 2, (RVSD, RVSD), neon_cvtt),
19404
19405
19406   /* NOTE: All VMOV encoding is special-cased!  */
19407  NCE(vmov,      0,       1, (VMOV), neon_mov),
19408  NCE(vmovq,     0,       1, (VMOV), neon_mov),
19409
19410 #undef  THUMB_VARIANT
19411 #define THUMB_VARIANT  & fpu_neon_ext_v1
19412 #undef  ARM_VARIANT
19413 #define ARM_VARIANT    & fpu_neon_ext_v1
19414
19415   /* Data processing with three registers of the same length.  */
19416   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
19417  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
19418  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
19419  NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19420  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19421  NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19422  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19423  NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19424  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19425   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
19426  NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19427  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
19428  NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19429  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
19430  NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19431  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
19432  NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19433  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
19434   /* If not immediate, fall back to neon_dyadic_i64_su.
19435      shl_imm should accept I8 I16 I32 I64,
19436      qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
19437  nUF(vshl,      _vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
19438  nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
19439  nUF(vqshl,     _vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
19440  nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
19441   /* Logic ops, types optional & ignored.  */
19442  nUF(vand,      _vand,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19443  nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19444  nUF(vbic,      _vbic,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19445  nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19446  nUF(vorr,      _vorr,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19447  nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19448  nUF(vorn,      _vorn,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19449  nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19450  nUF(veor,      _veor,    3, (RNDQ, oRNDQ, RNDQ),      neon_logic),
19451  nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
19452   /* Bitfield ops, untyped.  */
19453  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19454  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19455  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19456  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19457  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19458  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19459   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32.  */
19460  nUF(vabd,      _vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19461  nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19462  nUF(vmax,      _vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19463  nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19464  nUF(vmin,      _vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19465  nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19466   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
19467      back to neon_dyadic_if_su.  */
19468  nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19469  nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
19470  nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19471  nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
19472  nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19473  nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
19474  nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19475  nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
19476   /* Comparison. Type I8 I16 I32 F32.  */
19477  nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
19478  nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
19479   /* As above, D registers only.  */
19480  nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
19481  nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
19482   /* Int and float variants, signedness unimportant.  */
19483  nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
19484  nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
19485  nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
19486   /* Add/sub take types I8 I16 I32 I64 F32.  */
19487  nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
19488  nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
19489   /* vtst takes sizes 8, 16, 32.  */
19490  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
19491  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
19492   /* VMUL takes I8 I16 I32 F32 P8.  */
19493  nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
19494   /* VQD{R}MULH takes S16 S32.  */
19495  nUF(vqdmulh,   _vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19496  nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
19497  nUF(vqrdmulh,  _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19498  nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
19499  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19500  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
19501  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19502  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
19503  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19504  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
19505  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19506  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
19507  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
19508  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
19509  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
19510  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
19511
19512   /* Two address, int/float. Types S8 S16 S32 F32.  */
19513  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
19514  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
19515
19516   /* Data processing with two registers and a shift amount.  */
19517   /* Right shifts, and variants with rounding.
19518      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
19519  NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19520  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
19521  NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19522  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
19523  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
19524  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
19525  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
19526  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
19527   /* Shift and insert. Sizes accepted 8 16 32 64.  */
19528  NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
19529  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
19530  NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
19531  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
19532   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
19533  NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
19534  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
19535   /* Right shift immediate, saturating & narrowing, with rounding variants.
19536      Types accepted S16 S32 S64 U16 U32 U64.  */
19537  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19538  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19539   /* As above, unsigned. Types accepted S16 S32 S64.  */
19540  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19541  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19542   /* Right shift narrowing. Types accepted I16 I32 I64.  */
19543  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19544  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19545   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
19546  nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
19547   /* CVT with optional immediate for fixed-point variant.  */
19548  nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
19549
19550  nUF(vmvn,      _vmvn,    2, (RNDQ, RNDQ_Ibig), neon_mvn),
19551  nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
19552
19553   /* Data processing, three registers of different lengths.  */
19554   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
19555  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
19556  NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
19557  NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
19558  NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
19559   /* If not scalar, fall back to neon_dyadic_long.
19560      Vector types as above, scalar types S16 S32 U16 U32.  */
19561  nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
19562  nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
19563   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
19564  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19565  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19566   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
19567  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19568  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19569  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19570  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19571   /* Saturating doubling multiplies. Types S16 S32.  */
19572  nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19573  nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19574  nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19575   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
19576      S16 S32 U16 U32.  */
19577  nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
19578
19579   /* Extract. Size 8.  */
19580  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
19581  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
19582
19583   /* Two registers, miscellaneous.  */
19584   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
19585  NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
19586  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
19587  NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
19588  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
19589  NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
19590  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
19591   /* Vector replicate. Sizes 8 16 32.  */
19592  nCE(vdup,      _vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
19593  nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
19594   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
19595  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
19596   /* VMOVN. Types I16 I32 I64.  */
19597  nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
19598   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
19599  nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
19600   /* VQMOVUN. Types S16 S32 S64.  */
19601  nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
19602   /* VZIP / VUZP. Sizes 8 16 32.  */
19603  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
19604  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
19605  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
19606  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
19607   /* VQABS / VQNEG. Types S8 S16 S32.  */
19608  NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
19609  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
19610  NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
19611  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
19612   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
19613  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
19614  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
19615  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
19616  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
19617   /* Reciprocal estimates. Types U32 F32.  */
19618  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
19619  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
19620  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
19621  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
19622   /* VCLS. Types S8 S16 S32.  */
19623  NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
19624  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
19625   /* VCLZ. Types I8 I16 I32.  */
19626  NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
19627  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
19628   /* VCNT. Size 8.  */
19629  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
19630  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
19631   /* Two address, untyped.  */
19632  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
19633  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
19634   /* VTRN. Sizes 8 16 32.  */
19635  nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
19636  nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
19637
19638   /* Table lookup. Size 8.  */
19639  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19640  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19641
19642 #undef  THUMB_VARIANT
19643 #define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
19644 #undef  ARM_VARIANT
19645 #define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
19646
19647   /* Neon element/structure load/store.  */
19648  nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19649  nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19650  nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19651  nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19652  nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19653  nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19654  nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19655  nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19656
19657 #undef  THUMB_VARIANT
19658 #define THUMB_VARIANT & fpu_vfp_ext_v3xd
19659 #undef  ARM_VARIANT
19660 #define ARM_VARIANT   & fpu_vfp_ext_v3xd
19661  cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
19662  cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19663  cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19664  cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19665  cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19666  cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19667  cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19668  cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19669  cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19670
19671 #undef  THUMB_VARIANT
19672 #define THUMB_VARIANT  & fpu_vfp_ext_v3
19673 #undef  ARM_VARIANT
19674 #define ARM_VARIANT    & fpu_vfp_ext_v3
19675
19676  cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
19677  cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19678  cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19679  cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19680  cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19681  cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19682  cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19683  cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19684  cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19685
19686 #undef  ARM_VARIANT
19687 #define ARM_VARIANT    & fpu_vfp_ext_fma
19688 #undef  THUMB_VARIANT
19689 #define THUMB_VARIANT  & fpu_vfp_ext_fma
19690  /* Mnemonics shared by Neon and VFP.  These are included in the
19691     VFP FMA variant; NEON and VFP FMA always includes the NEON
19692     FMA instructions.  */
19693  nCEF(vfma,     _vfma,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19694  nCEF(vfms,     _vfms,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19695  /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
19696     the v form should always be used.  */
19697  cCE("ffmas",   ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19698  cCE("ffnmas",  ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19699  cCE("ffmad",   ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19700  cCE("ffnmad",  ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19701  nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19702  nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19703
19704 #undef THUMB_VARIANT
19705 #undef  ARM_VARIANT
19706 #define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
19707
19708  cCE("mia",     e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19709  cCE("miaph",   e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19710  cCE("miabb",   e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19711  cCE("miabt",   e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19712  cCE("miatb",   e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19713  cCE("miatt",   e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19714  cCE("mar",     c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
19715  cCE("mra",     c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
19716
19717 #undef  ARM_VARIANT
19718 #define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
19719
19720  cCE("tandcb",  e13f130, 1, (RR),                   iwmmxt_tandorc),
19721  cCE("tandch",  e53f130, 1, (RR),                   iwmmxt_tandorc),
19722  cCE("tandcw",  e93f130, 1, (RR),                   iwmmxt_tandorc),
19723  cCE("tbcstb",  e400010, 2, (RIWR, RR),             rn_rd),
19724  cCE("tbcsth",  e400050, 2, (RIWR, RR),             rn_rd),
19725  cCE("tbcstw",  e400090, 2, (RIWR, RR),             rn_rd),
19726  cCE("textrcb", e130170, 2, (RR, I7),               iwmmxt_textrc),
19727  cCE("textrch", e530170, 2, (RR, I7),               iwmmxt_textrc),
19728  cCE("textrcw", e930170, 2, (RR, I7),               iwmmxt_textrc),
19729  cCE("textrmub",e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19730  cCE("textrmuh",e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19731  cCE("textrmuw",e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19732  cCE("textrmsb",e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19733  cCE("textrmsh",e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19734  cCE("textrmsw",e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19735  cCE("tinsrb",  e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19736  cCE("tinsrh",  e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19737  cCE("tinsrw",  e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19738  cCE("tmcr",    e000110, 2, (RIWC_RIWG, RR),        rn_rd),
19739  cCE("tmcrr",   c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
19740  cCE("tmia",    e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19741  cCE("tmiaph",  e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19742  cCE("tmiabb",  e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19743  cCE("tmiabt",  e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19744  cCE("tmiatb",  e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19745  cCE("tmiatt",  e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19746  cCE("tmovmskb",e100030, 2, (RR, RIWR),             rd_rn),
19747  cCE("tmovmskh",e500030, 2, (RR, RIWR),             rd_rn),
19748  cCE("tmovmskw",e900030, 2, (RR, RIWR),             rd_rn),
19749  cCE("tmrc",    e100110, 2, (RR, RIWC_RIWG),        rd_rn),
19750  cCE("tmrrc",   c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
19751  cCE("torcb",   e13f150, 1, (RR),                   iwmmxt_tandorc),
19752  cCE("torch",   e53f150, 1, (RR),                   iwmmxt_tandorc),
19753  cCE("torcw",   e93f150, 1, (RR),                   iwmmxt_tandorc),
19754  cCE("waccb",   e0001c0, 2, (RIWR, RIWR),           rd_rn),
19755  cCE("wacch",   e4001c0, 2, (RIWR, RIWR),           rd_rn),
19756  cCE("waccw",   e8001c0, 2, (RIWR, RIWR),           rd_rn),
19757  cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19758  cCE("waddb",   e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19759  cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19760  cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19761  cCE("waddh",   e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19762  cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19763  cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19764  cCE("waddw",   e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19765  cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19766  cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
19767  cCE("walignr0",e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19768  cCE("walignr1",e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19769  cCE("walignr2",ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19770  cCE("walignr3",eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19771  cCE("wand",    e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19772  cCE("wandn",   e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19773  cCE("wavg2b",  e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19774  cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19775  cCE("wavg2h",  ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19776  cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19777  cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19778  cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19779  cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19780  cCE("wcmpgtub",e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19781  cCE("wcmpgtuh",e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19782  cCE("wcmpgtuw",e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19783  cCE("wcmpgtsb",e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19784  cCE("wcmpgtsh",e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19785  cCE("wcmpgtsw",eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19786  cCE("wldrb",   c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19787  cCE("wldrh",   c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19788  cCE("wldrw",   c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
19789  cCE("wldrd",   c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
19790  cCE("wmacs",   e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19791  cCE("wmacsz",  e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19792  cCE("wmacu",   e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19793  cCE("wmacuz",  e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19794  cCE("wmadds",  ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19795  cCE("wmaddu",  e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19796  cCE("wmaxsb",  e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19797  cCE("wmaxsh",  e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19798  cCE("wmaxsw",  ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19799  cCE("wmaxub",  e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19800  cCE("wmaxuh",  e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19801  cCE("wmaxuw",  e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19802  cCE("wminsb",  e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19803  cCE("wminsh",  e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19804  cCE("wminsw",  eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19805  cCE("wminub",  e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19806  cCE("wminuh",  e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19807  cCE("wminuw",  e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19808  cCE("wmov",    e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
19809  cCE("wmulsm",  e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19810  cCE("wmulsl",  e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19811  cCE("wmulum",  e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19812  cCE("wmulul",  e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19813  cCE("wor",     e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19814  cCE("wpackhss",e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19815  cCE("wpackhus",e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19816  cCE("wpackwss",eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19817  cCE("wpackwus",e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19818  cCE("wpackdss",ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19819  cCE("wpackdus",ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19820  cCE("wrorh",   e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19821  cCE("wrorhg",  e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19822  cCE("wrorw",   eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19823  cCE("wrorwg",  eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19824  cCE("wrord",   ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19825  cCE("wrordg",  ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19826  cCE("wsadb",   e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19827  cCE("wsadbz",  e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19828  cCE("wsadh",   e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19829  cCE("wsadhz",  e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19830  cCE("wshufh",  e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
19831  cCE("wsllh",   e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19832  cCE("wsllhg",  e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19833  cCE("wsllw",   e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19834  cCE("wsllwg",  e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19835  cCE("wslld",   ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19836  cCE("wslldg",  ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19837  cCE("wsrah",   e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19838  cCE("wsrahg",  e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19839  cCE("wsraw",   e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19840  cCE("wsrawg",  e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19841  cCE("wsrad",   ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19842  cCE("wsradg",  ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19843  cCE("wsrlh",   e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19844  cCE("wsrlhg",  e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19845  cCE("wsrlw",   ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19846  cCE("wsrlwg",  ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19847  cCE("wsrld",   ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19848  cCE("wsrldg",  ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19849  cCE("wstrb",   c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19850  cCE("wstrh",   c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19851  cCE("wstrw",   c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
19852  cCE("wstrd",   c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
19853  cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19854  cCE("wsubb",   e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19855  cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19856  cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19857  cCE("wsubh",   e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19858  cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19859  cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19860  cCE("wsubw",   e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19861  cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19862  cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),         rd_rn),
19863  cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),         rd_rn),
19864  cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),         rd_rn),
19865  cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),         rd_rn),
19866  cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),         rd_rn),
19867  cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),         rd_rn),
19868  cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19869  cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19870  cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19871  cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),         rd_rn),
19872  cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),         rd_rn),
19873  cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),         rd_rn),
19874  cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),         rd_rn),
19875  cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),         rd_rn),
19876  cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),         rd_rn),
19877  cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19878  cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19879  cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19880  cCE("wxor",    e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19881  cCE("wzero",   e300000, 1, (RIWR),                 iwmmxt_wzero),
19882
19883 #undef  ARM_VARIANT
19884 #define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
19885
19886  cCE("torvscb",   e12f190, 1, (RR),                 iwmmxt_tandorc),
19887  cCE("torvsch",   e52f190, 1, (RR),                 iwmmxt_tandorc),
19888  cCE("torvscw",   e92f190, 1, (RR),                 iwmmxt_tandorc),
19889  cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
19890  cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
19891  cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
19892  cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19893  cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19894  cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19895  cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19896  cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19897  cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19898  cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19899  cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19900  cCE("wavg4",   e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19901  cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19902  cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19903  cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19904  cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19905  cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19906  cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
19907  cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19908  cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19909  cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19910  cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19911  cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19912  cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19913  cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19914  cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19915  cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19916  cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19917  cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19918  cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19919  cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19920  cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19921  cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19922  cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19923  cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19924  cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19925  cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19926  cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19927  cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19928  cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19929  cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19930  cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19931  cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19932  cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19933  cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19934  cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19935  cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19936  cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19937  cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19938  cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19939  cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19940  cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19941  cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19942  cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19943
19944 #undef  ARM_VARIANT
19945 #define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
19946
19947  cCE("cfldrs",  c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
19948  cCE("cfldrd",  c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
19949  cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
19950  cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
19951  cCE("cfstrs",  c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
19952  cCE("cfstrd",  c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
19953  cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
19954  cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
19955  cCE("cfmvsr",  e000450, 2, (RMF, RR),                rn_rd),
19956  cCE("cfmvrs",  e100450, 2, (RR, RMF),                rd_rn),
19957  cCE("cfmvdlr", e000410, 2, (RMD, RR),                rn_rd),
19958  cCE("cfmvrdl", e100410, 2, (RR, RMD),                rd_rn),
19959  cCE("cfmvdhr", e000430, 2, (RMD, RR),                rn_rd),
19960  cCE("cfmvrdh", e100430, 2, (RR, RMD),                rd_rn),
19961  cCE("cfmv64lr",e000510, 2, (RMDX, RR),               rn_rd),
19962  cCE("cfmvr64l",e100510, 2, (RR, RMDX),               rd_rn),
19963  cCE("cfmv64hr",e000530, 2, (RMDX, RR),               rn_rd),
19964  cCE("cfmvr64h",e100530, 2, (RR, RMDX),               rd_rn),
19965  cCE("cfmval32",e200440, 2, (RMAX, RMFX),             rd_rn),
19966  cCE("cfmv32al",e100440, 2, (RMFX, RMAX),             rd_rn),
19967  cCE("cfmvam32",e200460, 2, (RMAX, RMFX),             rd_rn),
19968  cCE("cfmv32am",e100460, 2, (RMFX, RMAX),             rd_rn),
19969  cCE("cfmvah32",e200480, 2, (RMAX, RMFX),             rd_rn),
19970  cCE("cfmv32ah",e100480, 2, (RMFX, RMAX),             rd_rn),
19971  cCE("cfmva32", e2004a0, 2, (RMAX, RMFX),             rd_rn),
19972  cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX),             rd_rn),
19973  cCE("cfmva64", e2004c0, 2, (RMAX, RMDX),             rd_rn),
19974  cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX),             rd_rn),
19975  cCE("cfmvsc32",e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
19976  cCE("cfmv32sc",e1004e0, 2, (RMDX, RMDS),             rd),
19977  cCE("cfcpys",  e000400, 2, (RMF, RMF),               rd_rn),
19978  cCE("cfcpyd",  e000420, 2, (RMD, RMD),               rd_rn),
19979  cCE("cfcvtsd", e000460, 2, (RMD, RMF),               rd_rn),
19980  cCE("cfcvtds", e000440, 2, (RMF, RMD),               rd_rn),
19981  cCE("cfcvt32s",e000480, 2, (RMF, RMFX),              rd_rn),
19982  cCE("cfcvt32d",e0004a0, 2, (RMD, RMFX),              rd_rn),
19983  cCE("cfcvt64s",e0004c0, 2, (RMF, RMDX),              rd_rn),
19984  cCE("cfcvt64d",e0004e0, 2, (RMD, RMDX),              rd_rn),
19985  cCE("cfcvts32",e100580, 2, (RMFX, RMF),              rd_rn),
19986  cCE("cfcvtd32",e1005a0, 2, (RMFX, RMD),              rd_rn),
19987  cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),            rd_rn),
19988  cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),            rd_rn),
19989  cCE("cfrshl32",e000550, 3, (RMFX, RMFX, RR),         mav_triple),
19990  cCE("cfrshl64",e000570, 3, (RMDX, RMDX, RR),         mav_triple),
19991  cCE("cfsh32",  e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
19992  cCE("cfsh64",  e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
19993  cCE("cfcmps",  e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
19994  cCE("cfcmpd",  e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
19995  cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
19996  cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
19997  cCE("cfabss",  e300400, 2, (RMF, RMF),               rd_rn),
19998  cCE("cfabsd",  e300420, 2, (RMD, RMD),               rd_rn),
19999  cCE("cfnegs",  e300440, 2, (RMF, RMF),               rd_rn),
20000  cCE("cfnegd",  e300460, 2, (RMD, RMD),               rd_rn),
20001  cCE("cfadds",  e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
20002  cCE("cfaddd",  e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
20003  cCE("cfsubs",  e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
20004  cCE("cfsubd",  e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
20005  cCE("cfmuls",  e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
20006  cCE("cfmuld",  e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
20007  cCE("cfabs32", e300500, 2, (RMFX, RMFX),             rd_rn),
20008  cCE("cfabs64", e300520, 2, (RMDX, RMDX),             rd_rn),
20009  cCE("cfneg32", e300540, 2, (RMFX, RMFX),             rd_rn),
20010  cCE("cfneg64", e300560, 2, (RMDX, RMDX),             rd_rn),
20011  cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20012  cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
20013  cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20014  cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
20015  cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20016  cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
20017  cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20018  cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20019  cCE("cfmadd32",e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
20020  cCE("cfmsub32",e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
20021  cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
20022  cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
20023 };
20024 #undef ARM_VARIANT
20025 #undef THUMB_VARIANT
20026 #undef TCE
20027 #undef TUE
20028 #undef TUF
20029 #undef TCC
20030 #undef cCE
20031 #undef cCL
20032 #undef C3E
20033 #undef CE
20034 #undef CM
20035 #undef UE
20036 #undef UF
20037 #undef UT
20038 #undef NUF
20039 #undef nUF
20040 #undef NCE
20041 #undef nCE
20042 #undef OPS0
20043 #undef OPS1
20044 #undef OPS2
20045 #undef OPS3
20046 #undef OPS4
20047 #undef OPS5
20048 #undef OPS6
20049 #undef do_0
20050 \f
20051 /* MD interface: bits in the object file.  */
20052
20053 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
20054    for use in the a.out file, and stores them in the array pointed to by buf.
20055    This knows about the endian-ness of the target machine and does
20056    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
20057    2 (short) and 4 (long)  Floating numbers are put out as a series of
20058    LITTLENUMS (shorts, here at least).  */
20059
20060 void
20061 md_number_to_chars (char * buf, valueT val, int n)
20062 {
20063   if (target_big_endian)
20064     number_to_chars_bigendian (buf, val, n);
20065   else
20066     number_to_chars_littleendian (buf, val, n);
20067 }
20068
20069 static valueT
20070 md_chars_to_number (char * buf, int n)
20071 {
20072   valueT result = 0;
20073   unsigned char * where = (unsigned char *) buf;
20074
20075   if (target_big_endian)
20076     {
20077       while (n--)
20078         {
20079           result <<= 8;
20080           result |= (*where++ & 255);
20081         }
20082     }
20083   else
20084     {
20085       while (n--)
20086         {
20087           result <<= 8;
20088           result |= (where[n] & 255);
20089         }
20090     }
20091
20092   return result;
20093 }
20094
20095 /* MD interface: Sections.  */
20096
20097 /* Calculate the maximum variable size (i.e., excluding fr_fix)
20098    that an rs_machine_dependent frag may reach.  */
20099
20100 unsigned int
20101 arm_frag_max_var (fragS *fragp)
20102 {
20103   /* We only use rs_machine_dependent for variable-size Thumb instructions,
20104      which are either THUMB_SIZE (2) or INSN_SIZE (4).
20105
20106      Note that we generate relaxable instructions even for cases that don't
20107      really need it, like an immediate that's a trivial constant.  So we're
20108      overestimating the instruction size for some of those cases.  Rather
20109      than putting more intelligence here, it would probably be better to
20110      avoid generating a relaxation frag in the first place when it can be
20111      determined up front that a short instruction will suffice.  */
20112
20113   gas_assert (fragp->fr_type == rs_machine_dependent);
20114   return INSN_SIZE;
20115 }
20116
20117 /* Estimate the size of a frag before relaxing.  Assume everything fits in
20118    2 bytes.  */
20119
20120 int
20121 md_estimate_size_before_relax (fragS * fragp,
20122                                segT    segtype ATTRIBUTE_UNUSED)
20123 {
20124   fragp->fr_var = 2;
20125   return 2;
20126 }
20127
20128 /* Convert a machine dependent frag.  */
20129
20130 void
20131 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
20132 {
20133   unsigned long insn;
20134   unsigned long old_op;
20135   char *buf;
20136   expressionS exp;
20137   fixS *fixp;
20138   int reloc_type;
20139   int pc_rel;
20140   int opcode;
20141
20142   buf = fragp->fr_literal + fragp->fr_fix;
20143
20144   old_op = bfd_get_16(abfd, buf);
20145   if (fragp->fr_symbol)
20146     {
20147       exp.X_op = O_symbol;
20148       exp.X_add_symbol = fragp->fr_symbol;
20149     }
20150   else
20151     {
20152       exp.X_op = O_constant;
20153     }
20154   exp.X_add_number = fragp->fr_offset;
20155   opcode = fragp->fr_subtype;
20156   switch (opcode)
20157     {
20158     case T_MNEM_ldr_pc:
20159     case T_MNEM_ldr_pc2:
20160     case T_MNEM_ldr_sp:
20161     case T_MNEM_str_sp:
20162     case T_MNEM_ldr:
20163     case T_MNEM_ldrb:
20164     case T_MNEM_ldrh:
20165     case T_MNEM_str:
20166     case T_MNEM_strb:
20167     case T_MNEM_strh:
20168       if (fragp->fr_var == 4)
20169         {
20170           insn = THUMB_OP32 (opcode);
20171           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
20172             {
20173               insn |= (old_op & 0x700) << 4;
20174             }
20175           else
20176             {
20177               insn |= (old_op & 7) << 12;
20178               insn |= (old_op & 0x38) << 13;
20179             }
20180           insn |= 0x00000c00;
20181           put_thumb32_insn (buf, insn);
20182           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
20183         }
20184       else
20185         {
20186           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
20187         }
20188       pc_rel = (opcode == T_MNEM_ldr_pc2);
20189       break;
20190     case T_MNEM_adr:
20191       if (fragp->fr_var == 4)
20192         {
20193           insn = THUMB_OP32 (opcode);
20194           insn |= (old_op & 0xf0) << 4;
20195           put_thumb32_insn (buf, insn);
20196           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
20197         }
20198       else
20199         {
20200           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20201           exp.X_add_number -= 4;
20202         }
20203       pc_rel = 1;
20204       break;
20205     case T_MNEM_mov:
20206     case T_MNEM_movs:
20207     case T_MNEM_cmp:
20208     case T_MNEM_cmn:
20209       if (fragp->fr_var == 4)
20210         {
20211           int r0off = (opcode == T_MNEM_mov
20212                        || opcode == T_MNEM_movs) ? 0 : 8;
20213           insn = THUMB_OP32 (opcode);
20214           insn = (insn & 0xe1ffffff) | 0x10000000;
20215           insn |= (old_op & 0x700) << r0off;
20216           put_thumb32_insn (buf, insn);
20217           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
20218         }
20219       else
20220         {
20221           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
20222         }
20223       pc_rel = 0;
20224       break;
20225     case T_MNEM_b:
20226       if (fragp->fr_var == 4)
20227         {
20228           insn = THUMB_OP32(opcode);
20229           put_thumb32_insn (buf, insn);
20230           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
20231         }
20232       else
20233         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
20234       pc_rel = 1;
20235       break;
20236     case T_MNEM_bcond:
20237       if (fragp->fr_var == 4)
20238         {
20239           insn = THUMB_OP32(opcode);
20240           insn |= (old_op & 0xf00) << 14;
20241           put_thumb32_insn (buf, insn);
20242           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
20243         }
20244       else
20245         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
20246       pc_rel = 1;
20247       break;
20248     case T_MNEM_add_sp:
20249     case T_MNEM_add_pc:
20250     case T_MNEM_inc_sp:
20251     case T_MNEM_dec_sp:
20252       if (fragp->fr_var == 4)
20253         {
20254           /* ??? Choose between add and addw.  */
20255           insn = THUMB_OP32 (opcode);
20256           insn |= (old_op & 0xf0) << 4;
20257           put_thumb32_insn (buf, insn);
20258           if (opcode == T_MNEM_add_pc)
20259             reloc_type = BFD_RELOC_ARM_T32_IMM12;
20260           else
20261             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
20262         }
20263       else
20264         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20265       pc_rel = 0;
20266       break;
20267
20268     case T_MNEM_addi:
20269     case T_MNEM_addis:
20270     case T_MNEM_subi:
20271     case T_MNEM_subis:
20272       if (fragp->fr_var == 4)
20273         {
20274           insn = THUMB_OP32 (opcode);
20275           insn |= (old_op & 0xf0) << 4;
20276           insn |= (old_op & 0xf) << 16;
20277           put_thumb32_insn (buf, insn);
20278           if (insn & (1 << 20))
20279             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
20280           else
20281             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
20282         }
20283       else
20284         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20285       pc_rel = 0;
20286       break;
20287     default:
20288       abort ();
20289     }
20290   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
20291                       (enum bfd_reloc_code_real) reloc_type);
20292   fixp->fx_file = fragp->fr_file;
20293   fixp->fx_line = fragp->fr_line;
20294   fragp->fr_fix += fragp->fr_var;
20295 }
20296
20297 /* Return the size of a relaxable immediate operand instruction.
20298    SHIFT and SIZE specify the form of the allowable immediate.  */
20299 static int
20300 relax_immediate (fragS *fragp, int size, int shift)
20301 {
20302   offsetT offset;
20303   offsetT mask;
20304   offsetT low;
20305
20306   /* ??? Should be able to do better than this.  */
20307   if (fragp->fr_symbol)
20308     return 4;
20309
20310   low = (1 << shift) - 1;
20311   mask = (1 << (shift + size)) - (1 << shift);
20312   offset = fragp->fr_offset;
20313   /* Force misaligned offsets to 32-bit variant.  */
20314   if (offset & low)
20315     return 4;
20316   if (offset & ~mask)
20317     return 4;
20318   return 2;
20319 }
20320
20321 /* Get the address of a symbol during relaxation.  */
20322 static addressT
20323 relaxed_symbol_addr (fragS *fragp, long stretch)
20324 {
20325   fragS *sym_frag;
20326   addressT addr;
20327   symbolS *sym;
20328
20329   sym = fragp->fr_symbol;
20330   sym_frag = symbol_get_frag (sym);
20331   know (S_GET_SEGMENT (sym) != absolute_section
20332         || sym_frag == &zero_address_frag);
20333   addr = S_GET_VALUE (sym) + fragp->fr_offset;
20334
20335   /* If frag has yet to be reached on this pass, assume it will
20336      move by STRETCH just as we did.  If this is not so, it will
20337      be because some frag between grows, and that will force
20338      another pass.  */
20339
20340   if (stretch != 0
20341       && sym_frag->relax_marker != fragp->relax_marker)
20342     {
20343       fragS *f;
20344
20345       /* Adjust stretch for any alignment frag.  Note that if have
20346          been expanding the earlier code, the symbol may be
20347          defined in what appears to be an earlier frag.  FIXME:
20348          This doesn't handle the fr_subtype field, which specifies
20349          a maximum number of bytes to skip when doing an
20350          alignment.  */
20351       for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
20352         {
20353           if (f->fr_type == rs_align || f->fr_type == rs_align_code)
20354             {
20355               if (stretch < 0)
20356                 stretch = - ((- stretch)
20357                              & ~ ((1 << (int) f->fr_offset) - 1));
20358               else
20359                 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
20360               if (stretch == 0)
20361                 break;
20362             }
20363         }
20364       if (f != NULL)
20365         addr += stretch;
20366     }
20367
20368   return addr;
20369 }
20370
20371 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
20372    load.  */
20373 static int
20374 relax_adr (fragS *fragp, asection *sec, long stretch)
20375 {
20376   addressT addr;
20377   offsetT val;
20378
20379   /* Assume worst case for symbols not known to be in the same section.  */
20380   if (fragp->fr_symbol == NULL
20381       || !S_IS_DEFINED (fragp->fr_symbol)
20382       || sec != S_GET_SEGMENT (fragp->fr_symbol)
20383       || S_IS_WEAK (fragp->fr_symbol))
20384     return 4;
20385
20386   val = relaxed_symbol_addr (fragp, stretch);
20387   addr = fragp->fr_address + fragp->fr_fix;
20388   addr = (addr + 4) & ~3;
20389   /* Force misaligned targets to 32-bit variant.  */
20390   if (val & 3)
20391     return 4;
20392   val -= addr;
20393   if (val < 0 || val > 1020)
20394     return 4;
20395   return 2;
20396 }
20397
20398 /* Return the size of a relaxable add/sub immediate instruction.  */
20399 static int
20400 relax_addsub (fragS *fragp, asection *sec)
20401 {
20402   char *buf;
20403   int op;
20404
20405   buf = fragp->fr_literal + fragp->fr_fix;
20406   op = bfd_get_16(sec->owner, buf);
20407   if ((op & 0xf) == ((op >> 4) & 0xf))
20408     return relax_immediate (fragp, 8, 0);
20409   else
20410     return relax_immediate (fragp, 3, 0);
20411 }
20412
20413 /* Return TRUE iff the definition of symbol S could be pre-empted
20414    (overridden) at link or load time.  */
20415 static bfd_boolean
20416 symbol_preemptible (symbolS *s)
20417 {
20418   /* Weak symbols can always be pre-empted.  */
20419   if (S_IS_WEAK (s))
20420     return TRUE;
20421
20422   /* Non-global symbols cannot be pre-empted. */
20423   if (! S_IS_EXTERNAL (s))
20424     return FALSE;
20425
20426 #ifdef OBJ_ELF
20427   /* In ELF, a global symbol can be marked protected, or private.  In that
20428      case it can't be pre-empted (other definitions in the same link unit
20429      would violate the ODR).  */
20430   if (ELF_ST_VISIBILITY (S_GET_OTHER (s)) > STV_DEFAULT)
20431     return FALSE;
20432 #endif
20433
20434   /* Other global symbols might be pre-empted.  */
20435   return TRUE;
20436 }
20437
20438 /* Return the size of a relaxable branch instruction.  BITS is the
20439    size of the offset field in the narrow instruction.  */
20440
20441 static int
20442 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
20443 {
20444   addressT addr;
20445   offsetT val;
20446   offsetT limit;
20447
20448   /* Assume worst case for symbols not known to be in the same section.  */
20449   if (!S_IS_DEFINED (fragp->fr_symbol)
20450       || sec != S_GET_SEGMENT (fragp->fr_symbol)
20451       || S_IS_WEAK (fragp->fr_symbol))
20452     return 4;
20453
20454 #ifdef OBJ_ELF
20455   /* A branch to a function in ARM state will require interworking.  */
20456   if (S_IS_DEFINED (fragp->fr_symbol)
20457       && ARM_IS_FUNC (fragp->fr_symbol))
20458       return 4;
20459 #endif
20460
20461   if (symbol_preemptible (fragp->fr_symbol))
20462     return 4;
20463
20464   val = relaxed_symbol_addr (fragp, stretch);
20465   addr = fragp->fr_address + fragp->fr_fix + 4;
20466   val -= addr;
20467
20468   /* Offset is a signed value *2 */
20469   limit = 1 << bits;
20470   if (val >= limit || val < -limit)
20471     return 4;
20472   return 2;
20473 }
20474
20475
20476 /* Relax a machine dependent frag.  This returns the amount by which
20477    the current size of the frag should change.  */
20478
20479 int
20480 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
20481 {
20482   int oldsize;
20483   int newsize;
20484
20485   oldsize = fragp->fr_var;
20486   switch (fragp->fr_subtype)
20487     {
20488     case T_MNEM_ldr_pc2:
20489       newsize = relax_adr (fragp, sec, stretch);
20490       break;
20491     case T_MNEM_ldr_pc:
20492     case T_MNEM_ldr_sp:
20493     case T_MNEM_str_sp:
20494       newsize = relax_immediate (fragp, 8, 2);
20495       break;
20496     case T_MNEM_ldr:
20497     case T_MNEM_str:
20498       newsize = relax_immediate (fragp, 5, 2);
20499       break;
20500     case T_MNEM_ldrh:
20501     case T_MNEM_strh:
20502       newsize = relax_immediate (fragp, 5, 1);
20503       break;
20504     case T_MNEM_ldrb:
20505     case T_MNEM_strb:
20506       newsize = relax_immediate (fragp, 5, 0);
20507       break;
20508     case T_MNEM_adr:
20509       newsize = relax_adr (fragp, sec, stretch);
20510       break;
20511     case T_MNEM_mov:
20512     case T_MNEM_movs:
20513     case T_MNEM_cmp:
20514     case T_MNEM_cmn:
20515       newsize = relax_immediate (fragp, 8, 0);
20516       break;
20517     case T_MNEM_b:
20518       newsize = relax_branch (fragp, sec, 11, stretch);
20519       break;
20520     case T_MNEM_bcond:
20521       newsize = relax_branch (fragp, sec, 8, stretch);
20522       break;
20523     case T_MNEM_add_sp:
20524     case T_MNEM_add_pc:
20525       newsize = relax_immediate (fragp, 8, 2);
20526       break;
20527     case T_MNEM_inc_sp:
20528     case T_MNEM_dec_sp:
20529       newsize = relax_immediate (fragp, 7, 2);
20530       break;
20531     case T_MNEM_addi:
20532     case T_MNEM_addis:
20533     case T_MNEM_subi:
20534     case T_MNEM_subis:
20535       newsize = relax_addsub (fragp, sec);
20536       break;
20537     default:
20538       abort ();
20539     }
20540
20541   fragp->fr_var = newsize;
20542   /* Freeze wide instructions that are at or before the same location as
20543      in the previous pass.  This avoids infinite loops.
20544      Don't freeze them unconditionally because targets may be artificially
20545      misaligned by the expansion of preceding frags.  */
20546   if (stretch <= 0 && newsize > 2)
20547     {
20548       md_convert_frag (sec->owner, sec, fragp);
20549       frag_wane (fragp);
20550     }
20551
20552   return newsize - oldsize;
20553 }
20554
20555 /* Round up a section size to the appropriate boundary.  */
20556
20557 valueT
20558 md_section_align (segT   segment ATTRIBUTE_UNUSED,
20559                   valueT size)
20560 {
20561 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
20562   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
20563     {
20564       /* For a.out, force the section size to be aligned.  If we don't do
20565          this, BFD will align it for us, but it will not write out the
20566          final bytes of the section.  This may be a bug in BFD, but it is
20567          easier to fix it here since that is how the other a.out targets
20568          work.  */
20569       int align;
20570
20571       align = bfd_get_section_alignment (stdoutput, segment);
20572       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
20573     }
20574 #endif
20575
20576   return size;
20577 }
20578
20579 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
20580    of an rs_align_code fragment.  */
20581
20582 void
20583 arm_handle_align (fragS * fragP)
20584 {
20585   static char const arm_noop[2][2][4] =
20586     {
20587       {  /* ARMv1 */
20588         {0x00, 0x00, 0xa0, 0xe1},  /* LE */
20589         {0xe1, 0xa0, 0x00, 0x00},  /* BE */
20590       },
20591       {  /* ARMv6k */
20592         {0x00, 0xf0, 0x20, 0xe3},  /* LE */
20593         {0xe3, 0x20, 0xf0, 0x00},  /* BE */
20594       },
20595     };
20596   static char const thumb_noop[2][2][2] =
20597     {
20598       {  /* Thumb-1 */
20599         {0xc0, 0x46},  /* LE */
20600         {0x46, 0xc0},  /* BE */
20601       },
20602       {  /* Thumb-2 */
20603         {0x00, 0xbf},  /* LE */
20604         {0xbf, 0x00}   /* BE */
20605       }
20606     };
20607   static char const wide_thumb_noop[2][4] =
20608     {  /* Wide Thumb-2 */
20609       {0xaf, 0xf3, 0x00, 0x80},  /* LE */
20610       {0xf3, 0xaf, 0x80, 0x00},  /* BE */
20611     };
20612
20613   unsigned bytes, fix, noop_size;
20614   char * p;
20615   const char * noop;
20616   const char *narrow_noop = NULL;
20617 #ifdef OBJ_ELF
20618   enum mstate state;
20619 #endif
20620
20621   if (fragP->fr_type != rs_align_code)
20622     return;
20623
20624   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
20625   p = fragP->fr_literal + fragP->fr_fix;
20626   fix = 0;
20627
20628   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
20629     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
20630
20631   gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
20632
20633   if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
20634     {
20635       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
20636         {
20637           narrow_noop = thumb_noop[1][target_big_endian];
20638           noop = wide_thumb_noop[target_big_endian];
20639         }
20640       else
20641         noop = thumb_noop[0][target_big_endian];
20642       noop_size = 2;
20643 #ifdef OBJ_ELF
20644       state = MAP_THUMB;
20645 #endif
20646     }
20647   else
20648     {
20649       noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
20650                      [target_big_endian];
20651       noop_size = 4;
20652 #ifdef OBJ_ELF
20653       state = MAP_ARM;
20654 #endif
20655     }
20656
20657   fragP->fr_var = noop_size;
20658
20659   if (bytes & (noop_size - 1))
20660     {
20661       fix = bytes & (noop_size - 1);
20662 #ifdef OBJ_ELF
20663       insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
20664 #endif
20665       memset (p, 0, fix);
20666       p += fix;
20667       bytes -= fix;
20668     }
20669
20670   if (narrow_noop)
20671     {
20672       if (bytes & noop_size)
20673         {
20674           /* Insert a narrow noop.  */
20675           memcpy (p, narrow_noop, noop_size);
20676           p += noop_size;
20677           bytes -= noop_size;
20678           fix += noop_size;
20679         }
20680
20681       /* Use wide noops for the remainder */
20682       noop_size = 4;
20683     }
20684
20685   while (bytes >= noop_size)
20686     {
20687       memcpy (p, noop, noop_size);
20688       p += noop_size;
20689       bytes -= noop_size;
20690       fix += noop_size;
20691     }
20692
20693   fragP->fr_fix += fix;
20694 }
20695
20696 /* Called from md_do_align.  Used to create an alignment
20697    frag in a code section.  */
20698
20699 void
20700 arm_frag_align_code (int n, int max)
20701 {
20702   char * p;
20703
20704   /* We assume that there will never be a requirement
20705      to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
20706   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
20707     {
20708       char err_msg[128];
20709
20710       sprintf (err_msg,
20711         _("alignments greater than %d bytes not supported in .text sections."),
20712         MAX_MEM_FOR_RS_ALIGN_CODE + 1);
20713       as_fatal ("%s", err_msg);
20714     }
20715
20716   p = frag_var (rs_align_code,
20717                 MAX_MEM_FOR_RS_ALIGN_CODE,
20718                 1,
20719                 (relax_substateT) max,
20720                 (symbolS *) NULL,
20721                 (offsetT) n,
20722                 (char *) NULL);
20723   *p = 0;
20724 }
20725
20726 /* Perform target specific initialisation of a frag.
20727    Note - despite the name this initialisation is not done when the frag
20728    is created, but only when its type is assigned.  A frag can be created
20729    and used a long time before its type is set, so beware of assuming that
20730    this initialisationis performed first.  */
20731
20732 #ifndef OBJ_ELF
20733 void
20734 arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
20735 {
20736   /* Record whether this frag is in an ARM or a THUMB area.  */
20737   fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
20738 }
20739
20740 #else /* OBJ_ELF is defined.  */
20741 void
20742 arm_init_frag (fragS * fragP, int max_chars)
20743 {
20744   /* If the current ARM vs THUMB mode has not already
20745      been recorded into this frag then do so now.  */
20746   if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
20747     {
20748       fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
20749
20750       /* Record a mapping symbol for alignment frags.  We will delete this
20751          later if the alignment ends up empty.  */
20752       switch (fragP->fr_type)
20753         {
20754           case rs_align:
20755           case rs_align_test:
20756           case rs_fill:
20757             mapping_state_2 (MAP_DATA, max_chars);
20758             break;
20759           case rs_align_code:
20760             mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
20761             break;
20762           default:
20763             break;
20764         }
20765     }
20766 }
20767
20768 /* When we change sections we need to issue a new mapping symbol.  */
20769
20770 void
20771 arm_elf_change_section (void)
20772 {
20773   /* Link an unlinked unwind index table section to the .text section.  */
20774   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
20775       && elf_linked_to_section (now_seg) == NULL)
20776     elf_linked_to_section (now_seg) = text_section;
20777 }
20778
20779 int
20780 arm_elf_section_type (const char * str, size_t len)
20781 {
20782   if (len == 5 && strncmp (str, "exidx", 5) == 0)
20783     return SHT_ARM_EXIDX;
20784
20785   return -1;
20786 }
20787 \f
20788 /* Code to deal with unwinding tables.  */
20789
20790 static void add_unwind_adjustsp (offsetT);
20791
20792 /* Generate any deferred unwind frame offset.  */
20793
20794 static void
20795 flush_pending_unwind (void)
20796 {
20797   offsetT offset;
20798
20799   offset = unwind.pending_offset;
20800   unwind.pending_offset = 0;
20801   if (offset != 0)
20802     add_unwind_adjustsp (offset);
20803 }
20804
20805 /* Add an opcode to this list for this function.  Two-byte opcodes should
20806    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
20807    order.  */
20808
20809 static void
20810 add_unwind_opcode (valueT op, int length)
20811 {
20812   /* Add any deferred stack adjustment.  */
20813   if (unwind.pending_offset)
20814     flush_pending_unwind ();
20815
20816   unwind.sp_restored = 0;
20817
20818   if (unwind.opcode_count + length > unwind.opcode_alloc)
20819     {
20820       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
20821       if (unwind.opcodes)
20822         unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
20823                                                      unwind.opcode_alloc);
20824       else
20825         unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
20826     }
20827   while (length > 0)
20828     {
20829       length--;
20830       unwind.opcodes[unwind.opcode_count] = op & 0xff;
20831       op >>= 8;
20832       unwind.opcode_count++;
20833     }
20834 }
20835
20836 /* Add unwind opcodes to adjust the stack pointer.  */
20837
20838 static void
20839 add_unwind_adjustsp (offsetT offset)
20840 {
20841   valueT op;
20842
20843   if (offset > 0x200)
20844     {
20845       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
20846       char bytes[5];
20847       int n;
20848       valueT o;
20849
20850       /* Long form: 0xb2, uleb128.  */
20851       /* This might not fit in a word so add the individual bytes,
20852          remembering the list is built in reverse order.  */
20853       o = (valueT) ((offset - 0x204) >> 2);
20854       if (o == 0)
20855         add_unwind_opcode (0, 1);
20856
20857       /* Calculate the uleb128 encoding of the offset.  */
20858       n = 0;
20859       while (o)
20860         {
20861           bytes[n] = o & 0x7f;
20862           o >>= 7;
20863           if (o)
20864             bytes[n] |= 0x80;
20865           n++;
20866         }
20867       /* Add the insn.  */
20868       for (; n; n--)
20869         add_unwind_opcode (bytes[n - 1], 1);
20870       add_unwind_opcode (0xb2, 1);
20871     }
20872   else if (offset > 0x100)
20873     {
20874       /* Two short opcodes.  */
20875       add_unwind_opcode (0x3f, 1);
20876       op = (offset - 0x104) >> 2;
20877       add_unwind_opcode (op, 1);
20878     }
20879   else if (offset > 0)
20880     {
20881       /* Short opcode.  */
20882       op = (offset - 4) >> 2;
20883       add_unwind_opcode (op, 1);
20884     }
20885   else if (offset < 0)
20886     {
20887       offset = -offset;
20888       while (offset > 0x100)
20889         {
20890           add_unwind_opcode (0x7f, 1);
20891           offset -= 0x100;
20892         }
20893       op = ((offset - 4) >> 2) | 0x40;
20894       add_unwind_opcode (op, 1);
20895     }
20896 }
20897
20898 /* Finish the list of unwind opcodes for this function.  */
20899 static void
20900 finish_unwind_opcodes (void)
20901 {
20902   valueT op;
20903
20904   if (unwind.fp_used)
20905     {
20906       /* Adjust sp as necessary.  */
20907       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
20908       flush_pending_unwind ();
20909
20910       /* After restoring sp from the frame pointer.  */
20911       op = 0x90 | unwind.fp_reg;
20912       add_unwind_opcode (op, 1);
20913     }
20914   else
20915     flush_pending_unwind ();
20916 }
20917
20918
20919 /* Start an exception table entry.  If idx is nonzero this is an index table
20920    entry.  */
20921
20922 static void
20923 start_unwind_section (const segT text_seg, int idx)
20924 {
20925   const char * text_name;
20926   const char * prefix;
20927   const char * prefix_once;
20928   const char * group_name;
20929   size_t prefix_len;
20930   size_t text_len;
20931   char * sec_name;
20932   size_t sec_name_len;
20933   int type;
20934   int flags;
20935   int linkonce;
20936
20937   if (idx)
20938     {
20939       prefix = ELF_STRING_ARM_unwind;
20940       prefix_once = ELF_STRING_ARM_unwind_once;
20941       type = SHT_ARM_EXIDX;
20942     }
20943   else
20944     {
20945       prefix = ELF_STRING_ARM_unwind_info;
20946       prefix_once = ELF_STRING_ARM_unwind_info_once;
20947       type = SHT_PROGBITS;
20948     }
20949
20950   text_name = segment_name (text_seg);
20951   if (streq (text_name, ".text"))
20952     text_name = "";
20953
20954   if (strncmp (text_name, ".gnu.linkonce.t.",
20955                strlen (".gnu.linkonce.t.")) == 0)
20956     {
20957       prefix = prefix_once;
20958       text_name += strlen (".gnu.linkonce.t.");
20959     }
20960
20961   prefix_len = strlen (prefix);
20962   text_len = strlen (text_name);
20963   sec_name_len = prefix_len + text_len;
20964   sec_name = (char *) xmalloc (sec_name_len + 1);
20965   memcpy (sec_name, prefix, prefix_len);
20966   memcpy (sec_name + prefix_len, text_name, text_len);
20967   sec_name[prefix_len + text_len] = '\0';
20968
20969   flags = SHF_ALLOC;
20970   linkonce = 0;
20971   group_name = 0;
20972
20973   /* Handle COMDAT group.  */
20974   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
20975     {
20976       group_name = elf_group_name (text_seg);
20977       if (group_name == NULL)
20978         {
20979           as_bad (_("Group section `%s' has no group signature"),
20980                   segment_name (text_seg));
20981           ignore_rest_of_line ();
20982           return;
20983         }
20984       flags |= SHF_GROUP;
20985       linkonce = 1;
20986     }
20987
20988   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
20989
20990   /* Set the section link for index tables.  */
20991   if (idx)
20992     elf_linked_to_section (now_seg) = text_seg;
20993 }
20994
20995
20996 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
20997    personality routine data.  Returns zero, or the index table value for
20998    an inline entry.  */
20999
21000 static valueT
21001 create_unwind_entry (int have_data)
21002 {
21003   int size;
21004   addressT where;
21005   char *ptr;
21006   /* The current word of data.  */
21007   valueT data;
21008   /* The number of bytes left in this word.  */
21009   int n;
21010
21011   finish_unwind_opcodes ();
21012
21013   /* Remember the current text section.  */
21014   unwind.saved_seg = now_seg;
21015   unwind.saved_subseg = now_subseg;
21016
21017   start_unwind_section (now_seg, 0);
21018
21019   if (unwind.personality_routine == NULL)
21020     {
21021       if (unwind.personality_index == -2)
21022         {
21023           if (have_data)
21024             as_bad (_("handlerdata in cantunwind frame"));
21025           return 1; /* EXIDX_CANTUNWIND.  */
21026         }
21027
21028       /* Use a default personality routine if none is specified.  */
21029       if (unwind.personality_index == -1)
21030         {
21031           if (unwind.opcode_count > 3)
21032             unwind.personality_index = 1;
21033           else
21034             unwind.personality_index = 0;
21035         }
21036
21037       /* Space for the personality routine entry.  */
21038       if (unwind.personality_index == 0)
21039         {
21040           if (unwind.opcode_count > 3)
21041             as_bad (_("too many unwind opcodes for personality routine 0"));
21042
21043           if (!have_data)
21044             {
21045               /* All the data is inline in the index table.  */
21046               data = 0x80;
21047               n = 3;
21048               while (unwind.opcode_count > 0)
21049                 {
21050                   unwind.opcode_count--;
21051                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
21052                   n--;
21053                 }
21054
21055               /* Pad with "finish" opcodes.  */
21056               while (n--)
21057                 data = (data << 8) | 0xb0;
21058
21059               return data;
21060             }
21061           size = 0;
21062         }
21063       else
21064         /* We get two opcodes "free" in the first word.  */
21065         size = unwind.opcode_count - 2;
21066     }
21067   else
21068     {
21069       /* PR 16765: Missing or misplaced unwind directives can trigger this.  */
21070       if (unwind.personality_index != -1)
21071         {
21072           as_bad (_("attempt to recreate an unwind entry"));
21073           return 1;
21074         }
21075
21076       /* An extra byte is required for the opcode count.        */
21077       size = unwind.opcode_count + 1;
21078     }
21079
21080   size = (size + 3) >> 2;
21081   if (size > 0xff)
21082     as_bad (_("too many unwind opcodes"));
21083
21084   frag_align (2, 0, 0);
21085   record_alignment (now_seg, 2);
21086   unwind.table_entry = expr_build_dot ();
21087
21088   /* Allocate the table entry.  */
21089   ptr = frag_more ((size << 2) + 4);
21090   /* PR 13449: Zero the table entries in case some of them are not used.  */
21091   memset (ptr, 0, (size << 2) + 4);
21092   where = frag_now_fix () - ((size << 2) + 4);
21093
21094   switch (unwind.personality_index)
21095     {
21096     case -1:
21097       /* ??? Should this be a PLT generating relocation?  */
21098       /* Custom personality routine.  */
21099       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
21100                BFD_RELOC_ARM_PREL31);
21101
21102       where += 4;
21103       ptr += 4;
21104
21105       /* Set the first byte to the number of additional words.  */
21106       data = size > 0 ? size - 1 : 0;
21107       n = 3;
21108       break;
21109
21110     /* ABI defined personality routines.  */
21111     case 0:
21112       /* Three opcodes bytes are packed into the first word.  */
21113       data = 0x80;
21114       n = 3;
21115       break;
21116
21117     case 1:
21118     case 2:
21119       /* The size and first two opcode bytes go in the first word.  */
21120       data = ((0x80 + unwind.personality_index) << 8) | size;
21121       n = 2;
21122       break;
21123
21124     default:
21125       /* Should never happen.  */
21126       abort ();
21127     }
21128
21129   /* Pack the opcodes into words (MSB first), reversing the list at the same
21130      time.  */
21131   while (unwind.opcode_count > 0)
21132     {
21133       if (n == 0)
21134         {
21135           md_number_to_chars (ptr, data, 4);
21136           ptr += 4;
21137           n = 4;
21138           data = 0;
21139         }
21140       unwind.opcode_count--;
21141       n--;
21142       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
21143     }
21144
21145   /* Finish off the last word.  */
21146   if (n < 4)
21147     {
21148       /* Pad with "finish" opcodes.  */
21149       while (n--)
21150         data = (data << 8) | 0xb0;
21151
21152       md_number_to_chars (ptr, data, 4);
21153     }
21154
21155   if (!have_data)
21156     {
21157       /* Add an empty descriptor if there is no user-specified data.   */
21158       ptr = frag_more (4);
21159       md_number_to_chars (ptr, 0, 4);
21160     }
21161
21162   return 0;
21163 }
21164
21165
21166 /* Initialize the DWARF-2 unwind information for this procedure.  */
21167
21168 void
21169 tc_arm_frame_initial_instructions (void)
21170 {
21171   cfi_add_CFA_def_cfa (REG_SP, 0);
21172 }
21173 #endif /* OBJ_ELF */
21174
21175 /* Convert REGNAME to a DWARF-2 register number.  */
21176
21177 int
21178 tc_arm_regname_to_dw2regnum (char *regname)
21179 {
21180   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
21181   if (reg != FAIL)
21182     return reg;
21183
21184   /* PR 16694: Allow VFP registers as well.  */
21185   reg = arm_reg_parse (&regname, REG_TYPE_VFS);
21186   if (reg != FAIL)
21187     return 64 + reg;
21188
21189   reg = arm_reg_parse (&regname, REG_TYPE_VFD);
21190   if (reg != FAIL)
21191     return reg + 256;
21192
21193   return -1;
21194 }
21195
21196 #ifdef TE_PE
21197 void
21198 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
21199 {
21200   expressionS exp;
21201
21202   exp.X_op = O_secrel;
21203   exp.X_add_symbol = symbol;
21204   exp.X_add_number = 0;
21205   emit_expr (&exp, size);
21206 }
21207 #endif
21208
21209 /* MD interface: Symbol and relocation handling.  */
21210
21211 /* Return the address within the segment that a PC-relative fixup is
21212    relative to.  For ARM, PC-relative fixups applied to instructions
21213    are generally relative to the location of the fixup plus 8 bytes.
21214    Thumb branches are offset by 4, and Thumb loads relative to PC
21215    require special handling.  */
21216
21217 long
21218 md_pcrel_from_section (fixS * fixP, segT seg)
21219 {
21220   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
21221
21222   /* If this is pc-relative and we are going to emit a relocation
21223      then we just want to put out any pipeline compensation that the linker
21224      will need.  Otherwise we want to use the calculated base.
21225      For WinCE we skip the bias for externals as well, since this
21226      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
21227   if (fixP->fx_pcrel
21228       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
21229           || (arm_force_relocation (fixP)
21230 #ifdef TE_WINCE
21231               && !S_IS_EXTERNAL (fixP->fx_addsy)
21232 #endif
21233               )))
21234     base = 0;
21235
21236
21237   switch (fixP->fx_r_type)
21238     {
21239       /* PC relative addressing on the Thumb is slightly odd as the
21240          bottom two bits of the PC are forced to zero for the
21241          calculation.  This happens *after* application of the
21242          pipeline offset.  However, Thumb adrl already adjusts for
21243          this, so we need not do it again.  */
21244     case BFD_RELOC_ARM_THUMB_ADD:
21245       return base & ~3;
21246
21247     case BFD_RELOC_ARM_THUMB_OFFSET:
21248     case BFD_RELOC_ARM_T32_OFFSET_IMM:
21249     case BFD_RELOC_ARM_T32_ADD_PC12:
21250     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
21251       return (base + 4) & ~3;
21252
21253       /* Thumb branches are simply offset by +4.  */
21254     case BFD_RELOC_THUMB_PCREL_BRANCH7:
21255     case BFD_RELOC_THUMB_PCREL_BRANCH9:
21256     case BFD_RELOC_THUMB_PCREL_BRANCH12:
21257     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21258     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21259       return base + 4;
21260
21261     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21262       if (fixP->fx_addsy
21263           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21264           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21265           && ARM_IS_FUNC (fixP->fx_addsy)
21266           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21267         base = fixP->fx_where + fixP->fx_frag->fr_address;
21268        return base + 4;
21269
21270       /* BLX is like branches above, but forces the low two bits of PC to
21271          zero.  */
21272     case BFD_RELOC_THUMB_PCREL_BLX:
21273       if (fixP->fx_addsy
21274           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21275           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21276           && THUMB_IS_FUNC (fixP->fx_addsy)
21277           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21278         base = fixP->fx_where + fixP->fx_frag->fr_address;
21279       return (base + 4) & ~3;
21280
21281       /* ARM mode branches are offset by +8.  However, the Windows CE
21282          loader expects the relocation not to take this into account.  */
21283     case BFD_RELOC_ARM_PCREL_BLX:
21284       if (fixP->fx_addsy
21285           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21286           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21287           && ARM_IS_FUNC (fixP->fx_addsy)
21288           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21289         base = fixP->fx_where + fixP->fx_frag->fr_address;
21290       return base + 8;
21291
21292     case BFD_RELOC_ARM_PCREL_CALL:
21293       if (fixP->fx_addsy
21294           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21295           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21296           && THUMB_IS_FUNC (fixP->fx_addsy)
21297           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21298         base = fixP->fx_where + fixP->fx_frag->fr_address;
21299       return base + 8;
21300
21301     case BFD_RELOC_ARM_PCREL_BRANCH:
21302     case BFD_RELOC_ARM_PCREL_JUMP:
21303     case BFD_RELOC_ARM_PLT32:
21304 #ifdef TE_WINCE
21305       /* When handling fixups immediately, because we have already
21306          discovered the value of a symbol, or the address of the frag involved
21307          we must account for the offset by +8, as the OS loader will never see the reloc.
21308          see fixup_segment() in write.c
21309          The S_IS_EXTERNAL test handles the case of global symbols.
21310          Those need the calculated base, not just the pipe compensation the linker will need.  */
21311       if (fixP->fx_pcrel
21312           && fixP->fx_addsy != NULL
21313           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21314           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
21315         return base + 8;
21316       return base;
21317 #else
21318       return base + 8;
21319 #endif
21320
21321
21322       /* ARM mode loads relative to PC are also offset by +8.  Unlike
21323          branches, the Windows CE loader *does* expect the relocation
21324          to take this into account.  */
21325     case BFD_RELOC_ARM_OFFSET_IMM:
21326     case BFD_RELOC_ARM_OFFSET_IMM8:
21327     case BFD_RELOC_ARM_HWLITERAL:
21328     case BFD_RELOC_ARM_LITERAL:
21329     case BFD_RELOC_ARM_CP_OFF_IMM:
21330       return base + 8;
21331
21332
21333       /* Other PC-relative relocations are un-offset.  */
21334     default:
21335       return base;
21336     }
21337 }
21338
21339 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
21340    Otherwise we have no need to default values of symbols.  */
21341
21342 symbolS *
21343 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
21344 {
21345 #ifdef OBJ_ELF
21346   if (name[0] == '_' && name[1] == 'G'
21347       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
21348     {
21349       if (!GOT_symbol)
21350         {
21351           if (symbol_find (name))
21352             as_bad (_("GOT already in the symbol table"));
21353
21354           GOT_symbol = symbol_new (name, undefined_section,
21355                                    (valueT) 0, & zero_address_frag);
21356         }
21357
21358       return GOT_symbol;
21359     }
21360 #endif
21361
21362   return NULL;
21363 }
21364
21365 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
21366    computed as two separate immediate values, added together.  We
21367    already know that this value cannot be computed by just one ARM
21368    instruction.  */
21369
21370 static unsigned int
21371 validate_immediate_twopart (unsigned int   val,
21372                             unsigned int * highpart)
21373 {
21374   unsigned int a;
21375   unsigned int i;
21376
21377   for (i = 0; i < 32; i += 2)
21378     if (((a = rotate_left (val, i)) & 0xff) != 0)
21379       {
21380         if (a & 0xff00)
21381           {
21382             if (a & ~ 0xffff)
21383               continue;
21384             * highpart = (a  >> 8) | ((i + 24) << 7);
21385           }
21386         else if (a & 0xff0000)
21387           {
21388             if (a & 0xff000000)
21389               continue;
21390             * highpart = (a >> 16) | ((i + 16) << 7);
21391           }
21392         else
21393           {
21394             gas_assert (a & 0xff000000);
21395             * highpart = (a >> 24) | ((i + 8) << 7);
21396           }
21397
21398         return (a & 0xff) | (i << 7);
21399       }
21400
21401   return FAIL;
21402 }
21403
21404 static int
21405 validate_offset_imm (unsigned int val, int hwse)
21406 {
21407   if ((hwse && val > 255) || val > 4095)
21408     return FAIL;
21409   return val;
21410 }
21411
21412 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
21413    negative immediate constant by altering the instruction.  A bit of
21414    a hack really.
21415         MOV <-> MVN
21416         AND <-> BIC
21417         ADC <-> SBC
21418         by inverting the second operand, and
21419         ADD <-> SUB
21420         CMP <-> CMN
21421         by negating the second operand.  */
21422
21423 static int
21424 negate_data_op (unsigned long * instruction,
21425                 unsigned long   value)
21426 {
21427   int op, new_inst;
21428   unsigned long negated, inverted;
21429
21430   negated = encode_arm_immediate (-value);
21431   inverted = encode_arm_immediate (~value);
21432
21433   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
21434   switch (op)
21435     {
21436       /* First negates.  */
21437     case OPCODE_SUB:             /* ADD <-> SUB  */
21438       new_inst = OPCODE_ADD;
21439       value = negated;
21440       break;
21441
21442     case OPCODE_ADD:
21443       new_inst = OPCODE_SUB;
21444       value = negated;
21445       break;
21446
21447     case OPCODE_CMP:             /* CMP <-> CMN  */
21448       new_inst = OPCODE_CMN;
21449       value = negated;
21450       break;
21451
21452     case OPCODE_CMN:
21453       new_inst = OPCODE_CMP;
21454       value = negated;
21455       break;
21456
21457       /* Now Inverted ops.  */
21458     case OPCODE_MOV:             /* MOV <-> MVN  */
21459       new_inst = OPCODE_MVN;
21460       value = inverted;
21461       break;
21462
21463     case OPCODE_MVN:
21464       new_inst = OPCODE_MOV;
21465       value = inverted;
21466       break;
21467
21468     case OPCODE_AND:             /* AND <-> BIC  */
21469       new_inst = OPCODE_BIC;
21470       value = inverted;
21471       break;
21472
21473     case OPCODE_BIC:
21474       new_inst = OPCODE_AND;
21475       value = inverted;
21476       break;
21477
21478     case OPCODE_ADC:              /* ADC <-> SBC  */
21479       new_inst = OPCODE_SBC;
21480       value = inverted;
21481       break;
21482
21483     case OPCODE_SBC:
21484       new_inst = OPCODE_ADC;
21485       value = inverted;
21486       break;
21487
21488       /* We cannot do anything.  */
21489     default:
21490       return FAIL;
21491     }
21492
21493   if (value == (unsigned) FAIL)
21494     return FAIL;
21495
21496   *instruction &= OPCODE_MASK;
21497   *instruction |= new_inst << DATA_OP_SHIFT;
21498   return value;
21499 }
21500
21501 /* Like negate_data_op, but for Thumb-2.   */
21502
21503 static unsigned int
21504 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
21505 {
21506   int op, new_inst;
21507   int rd;
21508   unsigned int negated, inverted;
21509
21510   negated = encode_thumb32_immediate (-value);
21511   inverted = encode_thumb32_immediate (~value);
21512
21513   rd = (*instruction >> 8) & 0xf;
21514   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
21515   switch (op)
21516     {
21517       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
21518     case T2_OPCODE_SUB:
21519       new_inst = T2_OPCODE_ADD;
21520       value = negated;
21521       break;
21522
21523     case T2_OPCODE_ADD:
21524       new_inst = T2_OPCODE_SUB;
21525       value = negated;
21526       break;
21527
21528       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
21529     case T2_OPCODE_ORR:
21530       new_inst = T2_OPCODE_ORN;
21531       value = inverted;
21532       break;
21533
21534     case T2_OPCODE_ORN:
21535       new_inst = T2_OPCODE_ORR;
21536       value = inverted;
21537       break;
21538
21539       /* AND <-> BIC.  TST has no inverted equivalent.  */
21540     case T2_OPCODE_AND:
21541       new_inst = T2_OPCODE_BIC;
21542       if (rd == 15)
21543         value = FAIL;
21544       else
21545         value = inverted;
21546       break;
21547
21548     case T2_OPCODE_BIC:
21549       new_inst = T2_OPCODE_AND;
21550       value = inverted;
21551       break;
21552
21553       /* ADC <-> SBC  */
21554     case T2_OPCODE_ADC:
21555       new_inst = T2_OPCODE_SBC;
21556       value = inverted;
21557       break;
21558
21559     case T2_OPCODE_SBC:
21560       new_inst = T2_OPCODE_ADC;
21561       value = inverted;
21562       break;
21563
21564       /* We cannot do anything.  */
21565     default:
21566       return FAIL;
21567     }
21568
21569   if (value == (unsigned int)FAIL)
21570     return FAIL;
21571
21572   *instruction &= T2_OPCODE_MASK;
21573   *instruction |= new_inst << T2_DATA_OP_SHIFT;
21574   return value;
21575 }
21576
21577 /* Read a 32-bit thumb instruction from buf.  */
21578 static unsigned long
21579 get_thumb32_insn (char * buf)
21580 {
21581   unsigned long insn;
21582   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
21583   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21584
21585   return insn;
21586 }
21587
21588
21589 /* We usually want to set the low bit on the address of thumb function
21590    symbols.  In particular .word foo - . should have the low bit set.
21591    Generic code tries to fold the difference of two symbols to
21592    a constant.  Prevent this and force a relocation when the first symbols
21593    is a thumb function.  */
21594
21595 bfd_boolean
21596 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
21597 {
21598   if (op == O_subtract
21599       && l->X_op == O_symbol
21600       && r->X_op == O_symbol
21601       && THUMB_IS_FUNC (l->X_add_symbol))
21602     {
21603       l->X_op = O_subtract;
21604       l->X_op_symbol = r->X_add_symbol;
21605       l->X_add_number -= r->X_add_number;
21606       return TRUE;
21607     }
21608
21609   /* Process as normal.  */
21610   return FALSE;
21611 }
21612
21613 /* Encode Thumb2 unconditional branches and calls. The encoding
21614    for the 2 are identical for the immediate values.  */
21615
21616 static void
21617 encode_thumb2_b_bl_offset (char * buf, offsetT value)
21618 {
21619 #define T2I1I2MASK  ((1 << 13) | (1 << 11))
21620   offsetT newval;
21621   offsetT newval2;
21622   addressT S, I1, I2, lo, hi;
21623
21624   S = (value >> 24) & 0x01;
21625   I1 = (value >> 23) & 0x01;
21626   I2 = (value >> 22) & 0x01;
21627   hi = (value >> 12) & 0x3ff;
21628   lo = (value >> 1) & 0x7ff;
21629   newval   = md_chars_to_number (buf, THUMB_SIZE);
21630   newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21631   newval  |= (S << 10) | hi;
21632   newval2 &=  ~T2I1I2MASK;
21633   newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
21634   md_number_to_chars (buf, newval, THUMB_SIZE);
21635   md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
21636 }
21637
21638 void
21639 md_apply_fix (fixS *    fixP,
21640                valueT * valP,
21641                segT     seg)
21642 {
21643   offsetT        value = * valP;
21644   offsetT        newval;
21645   unsigned int   newimm;
21646   unsigned long  temp;
21647   int            sign;
21648   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
21649
21650   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
21651
21652   /* Note whether this will delete the relocation.  */
21653
21654   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
21655     fixP->fx_done = 1;
21656
21657   /* On a 64-bit host, silently truncate 'value' to 32 bits for
21658      consistency with the behaviour on 32-bit hosts.  Remember value
21659      for emit_reloc.  */
21660   value &= 0xffffffff;
21661   value ^= 0x80000000;
21662   value -= 0x80000000;
21663
21664   *valP = value;
21665   fixP->fx_addnumber = value;
21666
21667   /* Same treatment for fixP->fx_offset.  */
21668   fixP->fx_offset &= 0xffffffff;
21669   fixP->fx_offset ^= 0x80000000;
21670   fixP->fx_offset -= 0x80000000;
21671
21672   switch (fixP->fx_r_type)
21673     {
21674     case BFD_RELOC_NONE:
21675       /* This will need to go in the object file.  */
21676       fixP->fx_done = 0;
21677       break;
21678
21679     case BFD_RELOC_ARM_IMMEDIATE:
21680       /* We claim that this fixup has been processed here,
21681          even if in fact we generate an error because we do
21682          not have a reloc for it, so tc_gen_reloc will reject it.  */
21683       fixP->fx_done = 1;
21684
21685       if (fixP->fx_addsy)
21686         {
21687           const char *msg = 0;
21688
21689           if (! S_IS_DEFINED (fixP->fx_addsy))
21690             msg = _("undefined symbol %s used as an immediate value");
21691           else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21692             msg = _("symbol %s is in a different section");
21693           else if (S_IS_WEAK (fixP->fx_addsy))
21694             msg = _("symbol %s is weak and may be overridden later");
21695
21696           if (msg)
21697             {
21698               as_bad_where (fixP->fx_file, fixP->fx_line,
21699                             msg, S_GET_NAME (fixP->fx_addsy));
21700               break;
21701             }
21702         }
21703
21704       temp = md_chars_to_number (buf, INSN_SIZE);
21705
21706       /* If the offset is negative, we should use encoding A2 for ADR.  */
21707       if ((temp & 0xfff0000) == 0x28f0000 && value < 0)
21708         newimm = negate_data_op (&temp, value);
21709       else
21710         {
21711           newimm = encode_arm_immediate (value);
21712
21713           /* If the instruction will fail, see if we can fix things up by
21714              changing the opcode.  */
21715           if (newimm == (unsigned int) FAIL)
21716             newimm = negate_data_op (&temp, value);
21717         }
21718
21719       if (newimm == (unsigned int) FAIL)
21720         {
21721           as_bad_where (fixP->fx_file, fixP->fx_line,
21722                         _("invalid constant (%lx) after fixup"),
21723                         (unsigned long) value);
21724           break;
21725         }
21726
21727       newimm |= (temp & 0xfffff000);
21728       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
21729       break;
21730
21731     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21732       {
21733         unsigned int highpart = 0;
21734         unsigned int newinsn  = 0xe1a00000; /* nop.  */
21735
21736         if (fixP->fx_addsy)
21737           {
21738             const char *msg = 0;
21739
21740             if (! S_IS_DEFINED (fixP->fx_addsy))
21741               msg = _("undefined symbol %s used as an immediate value");
21742             else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21743               msg = _("symbol %s is in a different section");
21744             else if (S_IS_WEAK (fixP->fx_addsy))
21745               msg = _("symbol %s is weak and may be overridden later");
21746
21747             if (msg)
21748               {
21749                 as_bad_where (fixP->fx_file, fixP->fx_line,
21750                               msg, S_GET_NAME (fixP->fx_addsy));
21751                 break;
21752               }
21753           }
21754
21755         newimm = encode_arm_immediate (value);
21756         temp = md_chars_to_number (buf, INSN_SIZE);
21757
21758         /* If the instruction will fail, see if we can fix things up by
21759            changing the opcode.  */
21760         if (newimm == (unsigned int) FAIL
21761             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
21762           {
21763             /* No ?  OK - try using two ADD instructions to generate
21764                the value.  */
21765             newimm = validate_immediate_twopart (value, & highpart);
21766
21767             /* Yes - then make sure that the second instruction is
21768                also an add.  */
21769             if (newimm != (unsigned int) FAIL)
21770               newinsn = temp;
21771             /* Still No ?  Try using a negated value.  */
21772             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
21773               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
21774             /* Otherwise - give up.  */
21775             else
21776               {
21777                 as_bad_where (fixP->fx_file, fixP->fx_line,
21778                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
21779                               (long) value);
21780                 break;
21781               }
21782
21783             /* Replace the first operand in the 2nd instruction (which
21784                is the PC) with the destination register.  We have
21785                already added in the PC in the first instruction and we
21786                do not want to do it again.  */
21787             newinsn &= ~ 0xf0000;
21788             newinsn |= ((newinsn & 0x0f000) << 4);
21789           }
21790
21791         newimm |= (temp & 0xfffff000);
21792         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
21793
21794         highpart |= (newinsn & 0xfffff000);
21795         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
21796       }
21797       break;
21798
21799     case BFD_RELOC_ARM_OFFSET_IMM:
21800       if (!fixP->fx_done && seg->use_rela_p)
21801         value = 0;
21802
21803     case BFD_RELOC_ARM_LITERAL:
21804       sign = value > 0;
21805
21806       if (value < 0)
21807         value = - value;
21808
21809       if (validate_offset_imm (value, 0) == FAIL)
21810         {
21811           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
21812             as_bad_where (fixP->fx_file, fixP->fx_line,
21813                           _("invalid literal constant: pool needs to be closer"));
21814           else
21815             as_bad_where (fixP->fx_file, fixP->fx_line,
21816                           _("bad immediate value for offset (%ld)"),
21817                           (long) value);
21818           break;
21819         }
21820
21821       newval = md_chars_to_number (buf, INSN_SIZE);
21822       if (value == 0)
21823         newval &= 0xfffff000;
21824       else
21825         {
21826           newval &= 0xff7ff000;
21827           newval |= value | (sign ? INDEX_UP : 0);
21828         }
21829       md_number_to_chars (buf, newval, INSN_SIZE);
21830       break;
21831
21832     case BFD_RELOC_ARM_OFFSET_IMM8:
21833     case BFD_RELOC_ARM_HWLITERAL:
21834       sign = value > 0;
21835
21836       if (value < 0)
21837         value = - value;
21838
21839       if (validate_offset_imm (value, 1) == FAIL)
21840         {
21841           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
21842             as_bad_where (fixP->fx_file, fixP->fx_line,
21843                           _("invalid literal constant: pool needs to be closer"));
21844           else
21845             as_bad_where (fixP->fx_file, fixP->fx_line,
21846                           _("bad immediate value for 8-bit offset (%ld)"),
21847                           (long) value);
21848           break;
21849         }
21850
21851       newval = md_chars_to_number (buf, INSN_SIZE);
21852       if (value == 0)
21853         newval &= 0xfffff0f0;
21854       else
21855         {
21856           newval &= 0xff7ff0f0;
21857           newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
21858         }
21859       md_number_to_chars (buf, newval, INSN_SIZE);
21860       break;
21861
21862     case BFD_RELOC_ARM_T32_OFFSET_U8:
21863       if (value < 0 || value > 1020 || value % 4 != 0)
21864         as_bad_where (fixP->fx_file, fixP->fx_line,
21865                       _("bad immediate value for offset (%ld)"), (long) value);
21866       value /= 4;
21867
21868       newval = md_chars_to_number (buf+2, THUMB_SIZE);
21869       newval |= value;
21870       md_number_to_chars (buf+2, newval, THUMB_SIZE);
21871       break;
21872
21873     case BFD_RELOC_ARM_T32_OFFSET_IMM:
21874       /* This is a complicated relocation used for all varieties of Thumb32
21875          load/store instruction with immediate offset:
21876
21877          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
21878                                                    *4, optional writeback(W)
21879                                                    (doubleword load/store)
21880
21881          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
21882          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
21883          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
21884          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
21885          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
21886
21887          Uppercase letters indicate bits that are already encoded at
21888          this point.  Lowercase letters are our problem.  For the
21889          second block of instructions, the secondary opcode nybble
21890          (bits 8..11) is present, and bit 23 is zero, even if this is
21891          a PC-relative operation.  */
21892       newval = md_chars_to_number (buf, THUMB_SIZE);
21893       newval <<= 16;
21894       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
21895
21896       if ((newval & 0xf0000000) == 0xe0000000)
21897         {
21898           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
21899           if (value >= 0)
21900             newval |= (1 << 23);
21901           else
21902             value = -value;
21903           if (value % 4 != 0)
21904             {
21905               as_bad_where (fixP->fx_file, fixP->fx_line,
21906                             _("offset not a multiple of 4"));
21907               break;
21908             }
21909           value /= 4;
21910           if (value > 0xff)
21911             {
21912               as_bad_where (fixP->fx_file, fixP->fx_line,
21913                             _("offset out of range"));
21914               break;
21915             }
21916           newval &= ~0xff;
21917         }
21918       else if ((newval & 0x000f0000) == 0x000f0000)
21919         {
21920           /* PC-relative, 12-bit offset.  */
21921           if (value >= 0)
21922             newval |= (1 << 23);
21923           else
21924             value = -value;
21925           if (value > 0xfff)
21926             {
21927               as_bad_where (fixP->fx_file, fixP->fx_line,
21928                             _("offset out of range"));
21929               break;
21930             }
21931           newval &= ~0xfff;
21932         }
21933       else if ((newval & 0x00000100) == 0x00000100)
21934         {
21935           /* Writeback: 8-bit, +/- offset.  */
21936           if (value >= 0)
21937             newval |= (1 << 9);
21938           else
21939             value = -value;
21940           if (value > 0xff)
21941             {
21942               as_bad_where (fixP->fx_file, fixP->fx_line,
21943                             _("offset out of range"));
21944               break;
21945             }
21946           newval &= ~0xff;
21947         }
21948       else if ((newval & 0x00000f00) == 0x00000e00)
21949         {
21950           /* T-instruction: positive 8-bit offset.  */
21951           if (value < 0 || value > 0xff)
21952             {
21953               as_bad_where (fixP->fx_file, fixP->fx_line,
21954                             _("offset out of range"));
21955               break;
21956             }
21957           newval &= ~0xff;
21958           newval |= value;
21959         }
21960       else
21961         {
21962           /* Positive 12-bit or negative 8-bit offset.  */
21963           int limit;
21964           if (value >= 0)
21965             {
21966               newval |= (1 << 23);
21967               limit = 0xfff;
21968             }
21969           else
21970             {
21971               value = -value;
21972               limit = 0xff;
21973             }
21974           if (value > limit)
21975             {
21976               as_bad_where (fixP->fx_file, fixP->fx_line,
21977                             _("offset out of range"));
21978               break;
21979             }
21980           newval &= ~limit;
21981         }
21982
21983       newval |= value;
21984       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
21985       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
21986       break;
21987
21988     case BFD_RELOC_ARM_SHIFT_IMM:
21989       newval = md_chars_to_number (buf, INSN_SIZE);
21990       if (((unsigned long) value) > 32
21991           || (value == 32
21992               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
21993         {
21994           as_bad_where (fixP->fx_file, fixP->fx_line,
21995                         _("shift expression is too large"));
21996           break;
21997         }
21998
21999       if (value == 0)
22000         /* Shifts of zero must be done as lsl.  */
22001         newval &= ~0x60;
22002       else if (value == 32)
22003         value = 0;
22004       newval &= 0xfffff07f;
22005       newval |= (value & 0x1f) << 7;
22006       md_number_to_chars (buf, newval, INSN_SIZE);
22007       break;
22008
22009     case BFD_RELOC_ARM_T32_IMMEDIATE:
22010     case BFD_RELOC_ARM_T32_ADD_IMM:
22011     case BFD_RELOC_ARM_T32_IMM12:
22012     case BFD_RELOC_ARM_T32_ADD_PC12:
22013       /* We claim that this fixup has been processed here,
22014          even if in fact we generate an error because we do
22015          not have a reloc for it, so tc_gen_reloc will reject it.  */
22016       fixP->fx_done = 1;
22017
22018       if (fixP->fx_addsy
22019           && ! S_IS_DEFINED (fixP->fx_addsy))
22020         {
22021           as_bad_where (fixP->fx_file, fixP->fx_line,
22022                         _("undefined symbol %s used as an immediate value"),
22023                         S_GET_NAME (fixP->fx_addsy));
22024           break;
22025         }
22026
22027       newval = md_chars_to_number (buf, THUMB_SIZE);
22028       newval <<= 16;
22029       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
22030
22031       newimm = FAIL;
22032       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
22033           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
22034         {
22035           newimm = encode_thumb32_immediate (value);
22036           if (newimm == (unsigned int) FAIL)
22037             newimm = thumb32_negate_data_op (&newval, value);
22038         }
22039       if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
22040           && newimm == (unsigned int) FAIL)
22041         {
22042           /* Turn add/sum into addw/subw.  */
22043           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
22044             newval = (newval & 0xfeffffff) | 0x02000000;
22045           /* No flat 12-bit imm encoding for addsw/subsw.  */
22046           if ((newval & 0x00100000) == 0)
22047             {
22048               /* 12 bit immediate for addw/subw.  */
22049               if (value < 0)
22050                 {
22051                   value = -value;
22052                   newval ^= 0x00a00000;
22053                 }
22054               if (value > 0xfff)
22055                 newimm = (unsigned int) FAIL;
22056               else
22057                 newimm = value;
22058             }
22059         }
22060
22061       if (newimm == (unsigned int)FAIL)
22062         {
22063           as_bad_where (fixP->fx_file, fixP->fx_line,
22064                         _("invalid constant (%lx) after fixup"),
22065                         (unsigned long) value);
22066           break;
22067         }
22068
22069       newval |= (newimm & 0x800) << 15;
22070       newval |= (newimm & 0x700) << 4;
22071       newval |= (newimm & 0x0ff);
22072
22073       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
22074       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
22075       break;
22076
22077     case BFD_RELOC_ARM_SMC:
22078       if (((unsigned long) value) > 0xffff)
22079         as_bad_where (fixP->fx_file, fixP->fx_line,
22080                       _("invalid smc expression"));
22081       newval = md_chars_to_number (buf, INSN_SIZE);
22082       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
22083       md_number_to_chars (buf, newval, INSN_SIZE);
22084       break;
22085
22086     case BFD_RELOC_ARM_HVC:
22087       if (((unsigned long) value) > 0xffff)
22088         as_bad_where (fixP->fx_file, fixP->fx_line,
22089                       _("invalid hvc expression"));
22090       newval = md_chars_to_number (buf, INSN_SIZE);
22091       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
22092       md_number_to_chars (buf, newval, INSN_SIZE);
22093       break;
22094
22095     case BFD_RELOC_ARM_SWI:
22096       if (fixP->tc_fix_data != 0)
22097         {
22098           if (((unsigned long) value) > 0xff)
22099             as_bad_where (fixP->fx_file, fixP->fx_line,
22100                           _("invalid swi expression"));
22101           newval = md_chars_to_number (buf, THUMB_SIZE);
22102           newval |= value;
22103           md_number_to_chars (buf, newval, THUMB_SIZE);
22104         }
22105       else
22106         {
22107           if (((unsigned long) value) > 0x00ffffff)
22108             as_bad_where (fixP->fx_file, fixP->fx_line,
22109                           _("invalid swi expression"));
22110           newval = md_chars_to_number (buf, INSN_SIZE);
22111           newval |= value;
22112           md_number_to_chars (buf, newval, INSN_SIZE);
22113         }
22114       break;
22115
22116     case BFD_RELOC_ARM_MULTI:
22117       if (((unsigned long) value) > 0xffff)
22118         as_bad_where (fixP->fx_file, fixP->fx_line,
22119                       _("invalid expression in load/store multiple"));
22120       newval = value | md_chars_to_number (buf, INSN_SIZE);
22121       md_number_to_chars (buf, newval, INSN_SIZE);
22122       break;
22123
22124 #ifdef OBJ_ELF
22125     case BFD_RELOC_ARM_PCREL_CALL:
22126
22127       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22128           && fixP->fx_addsy
22129           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22130           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22131           && THUMB_IS_FUNC (fixP->fx_addsy))
22132         /* Flip the bl to blx. This is a simple flip
22133            bit here because we generate PCREL_CALL for
22134            unconditional bls.  */
22135         {
22136           newval = md_chars_to_number (buf, INSN_SIZE);
22137           newval = newval | 0x10000000;
22138           md_number_to_chars (buf, newval, INSN_SIZE);
22139           temp = 1;
22140           fixP->fx_done = 1;
22141         }
22142       else
22143         temp = 3;
22144       goto arm_branch_common;
22145
22146     case BFD_RELOC_ARM_PCREL_JUMP:
22147       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22148           && fixP->fx_addsy
22149           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22150           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22151           && THUMB_IS_FUNC (fixP->fx_addsy))
22152         {
22153           /* This would map to a bl<cond>, b<cond>,
22154              b<always> to a Thumb function. We
22155              need to force a relocation for this particular
22156              case.  */
22157           newval = md_chars_to_number (buf, INSN_SIZE);
22158           fixP->fx_done = 0;
22159         }
22160
22161     case BFD_RELOC_ARM_PLT32:
22162 #endif
22163     case BFD_RELOC_ARM_PCREL_BRANCH:
22164       temp = 3;
22165       goto arm_branch_common;
22166
22167     case BFD_RELOC_ARM_PCREL_BLX:
22168
22169       temp = 1;
22170       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22171           && fixP->fx_addsy
22172           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22173           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22174           && ARM_IS_FUNC (fixP->fx_addsy))
22175         {
22176           /* Flip the blx to a bl and warn.  */
22177           const char *name = S_GET_NAME (fixP->fx_addsy);
22178           newval = 0xeb000000;
22179           as_warn_where (fixP->fx_file, fixP->fx_line,
22180                          _("blx to '%s' an ARM ISA state function changed to bl"),
22181                           name);
22182           md_number_to_chars (buf, newval, INSN_SIZE);
22183           temp = 3;
22184           fixP->fx_done = 1;
22185         }
22186
22187 #ifdef OBJ_ELF
22188        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22189          fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
22190 #endif
22191
22192     arm_branch_common:
22193       /* We are going to store value (shifted right by two) in the
22194          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
22195          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
22196          also be be clear.  */
22197       if (value & temp)
22198         as_bad_where (fixP->fx_file, fixP->fx_line,
22199                       _("misaligned branch destination"));
22200       if ((value & (offsetT)0xfe000000) != (offsetT)0
22201           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
22202         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22203
22204       if (fixP->fx_done || !seg->use_rela_p)
22205         {
22206           newval = md_chars_to_number (buf, INSN_SIZE);
22207           newval |= (value >> 2) & 0x00ffffff;
22208           /* Set the H bit on BLX instructions.  */
22209           if (temp == 1)
22210             {
22211               if (value & 2)
22212                 newval |= 0x01000000;
22213               else
22214                 newval &= ~0x01000000;
22215             }
22216           md_number_to_chars (buf, newval, INSN_SIZE);
22217         }
22218       break;
22219
22220     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
22221       /* CBZ can only branch forward.  */
22222
22223       /* Attempts to use CBZ to branch to the next instruction
22224          (which, strictly speaking, are prohibited) will be turned into
22225          no-ops.
22226
22227          FIXME: It may be better to remove the instruction completely and
22228          perform relaxation.  */
22229       if (value == -2)
22230         {
22231           newval = md_chars_to_number (buf, THUMB_SIZE);
22232           newval = 0xbf00; /* NOP encoding T1 */
22233           md_number_to_chars (buf, newval, THUMB_SIZE);
22234         }
22235       else
22236         {
22237           if (value & ~0x7e)
22238             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22239
22240           if (fixP->fx_done || !seg->use_rela_p)
22241             {
22242               newval = md_chars_to_number (buf, THUMB_SIZE);
22243               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
22244               md_number_to_chars (buf, newval, THUMB_SIZE);
22245             }
22246         }
22247       break;
22248
22249     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
22250       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
22251         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22252
22253       if (fixP->fx_done || !seg->use_rela_p)
22254         {
22255           newval = md_chars_to_number (buf, THUMB_SIZE);
22256           newval |= (value & 0x1ff) >> 1;
22257           md_number_to_chars (buf, newval, THUMB_SIZE);
22258         }
22259       break;
22260
22261     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
22262       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
22263         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22264
22265       if (fixP->fx_done || !seg->use_rela_p)
22266         {
22267           newval = md_chars_to_number (buf, THUMB_SIZE);
22268           newval |= (value & 0xfff) >> 1;
22269           md_number_to_chars (buf, newval, THUMB_SIZE);
22270         }
22271       break;
22272
22273     case BFD_RELOC_THUMB_PCREL_BRANCH20:
22274       if (fixP->fx_addsy
22275           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22276           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22277           && ARM_IS_FUNC (fixP->fx_addsy)
22278           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22279         {
22280           /* Force a relocation for a branch 20 bits wide.  */
22281           fixP->fx_done = 0;
22282         }
22283       if ((value & ~0x1fffff) && ((value & ~0x0fffff) != ~0x0fffff))
22284         as_bad_where (fixP->fx_file, fixP->fx_line,
22285                       _("conditional branch out of range"));
22286
22287       if (fixP->fx_done || !seg->use_rela_p)
22288         {
22289           offsetT newval2;
22290           addressT S, J1, J2, lo, hi;
22291
22292           S  = (value & 0x00100000) >> 20;
22293           J2 = (value & 0x00080000) >> 19;
22294           J1 = (value & 0x00040000) >> 18;
22295           hi = (value & 0x0003f000) >> 12;
22296           lo = (value & 0x00000ffe) >> 1;
22297
22298           newval   = md_chars_to_number (buf, THUMB_SIZE);
22299           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22300           newval  |= (S << 10) | hi;
22301           newval2 |= (J1 << 13) | (J2 << 11) | lo;
22302           md_number_to_chars (buf, newval, THUMB_SIZE);
22303           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
22304         }
22305       break;
22306
22307     case BFD_RELOC_THUMB_PCREL_BLX:
22308       /* If there is a blx from a thumb state function to
22309          another thumb function flip this to a bl and warn
22310          about it.  */
22311
22312       if (fixP->fx_addsy
22313           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22314           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22315           && THUMB_IS_FUNC (fixP->fx_addsy))
22316         {
22317           const char *name = S_GET_NAME (fixP->fx_addsy);
22318           as_warn_where (fixP->fx_file, fixP->fx_line,
22319                          _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
22320                          name);
22321           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22322           newval = newval | 0x1000;
22323           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22324           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22325           fixP->fx_done = 1;
22326         }
22327
22328
22329       goto thumb_bl_common;
22330
22331     case BFD_RELOC_THUMB_PCREL_BRANCH23:
22332       /* A bl from Thumb state ISA to an internal ARM state function
22333          is converted to a blx.  */
22334       if (fixP->fx_addsy
22335           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22336           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22337           && ARM_IS_FUNC (fixP->fx_addsy)
22338           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22339         {
22340           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22341           newval = newval & ~0x1000;
22342           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22343           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
22344           fixP->fx_done = 1;
22345         }
22346
22347     thumb_bl_common:
22348
22349       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22350         /* For a BLX instruction, make sure that the relocation is rounded up
22351            to a word boundary.  This follows the semantics of the instruction
22352            which specifies that bit 1 of the target address will come from bit
22353            1 of the base address.  */
22354         value = (value + 3) & ~ 3;
22355
22356 #ifdef OBJ_ELF
22357        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4
22358            && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22359          fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22360 #endif
22361
22362       if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
22363         {
22364           if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
22365             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22366           else if ((value & ~0x1ffffff)
22367                    && ((value & ~0x1ffffff) != ~0x1ffffff))
22368             as_bad_where (fixP->fx_file, fixP->fx_line,
22369                           _("Thumb2 branch out of range"));
22370         }
22371
22372       if (fixP->fx_done || !seg->use_rela_p)
22373         encode_thumb2_b_bl_offset (buf, value);
22374
22375       break;
22376
22377     case BFD_RELOC_THUMB_PCREL_BRANCH25:
22378       if ((value & ~0x0ffffff) && ((value & ~0x0ffffff) != ~0x0ffffff))
22379         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22380
22381       if (fixP->fx_done || !seg->use_rela_p)
22382           encode_thumb2_b_bl_offset (buf, value);
22383
22384       break;
22385
22386     case BFD_RELOC_8:
22387       if (fixP->fx_done || !seg->use_rela_p)
22388         *buf = value;
22389       break;
22390
22391     case BFD_RELOC_16:
22392       if (fixP->fx_done || !seg->use_rela_p)
22393         md_number_to_chars (buf, value, 2);
22394       break;
22395
22396 #ifdef OBJ_ELF
22397     case BFD_RELOC_ARM_TLS_CALL:
22398     case BFD_RELOC_ARM_THM_TLS_CALL:
22399     case BFD_RELOC_ARM_TLS_DESCSEQ:
22400     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
22401     case BFD_RELOC_ARM_TLS_GOTDESC:
22402     case BFD_RELOC_ARM_TLS_GD32:
22403     case BFD_RELOC_ARM_TLS_LE32:
22404     case BFD_RELOC_ARM_TLS_IE32:
22405     case BFD_RELOC_ARM_TLS_LDM32:
22406     case BFD_RELOC_ARM_TLS_LDO32:
22407       S_SET_THREAD_LOCAL (fixP->fx_addsy);
22408       break;
22409
22410     case BFD_RELOC_ARM_GOT32:
22411     case BFD_RELOC_ARM_GOTOFF:
22412       break;
22413
22414     case BFD_RELOC_ARM_GOT_PREL:
22415       if (fixP->fx_done || !seg->use_rela_p)
22416         md_number_to_chars (buf, value, 4);
22417       break;
22418
22419     case BFD_RELOC_ARM_TARGET2:
22420       /* TARGET2 is not partial-inplace, so we need to write the
22421          addend here for REL targets, because it won't be written out
22422          during reloc processing later.  */
22423       if (fixP->fx_done || !seg->use_rela_p)
22424         md_number_to_chars (buf, fixP->fx_offset, 4);
22425       break;
22426 #endif
22427
22428     case BFD_RELOC_RVA:
22429     case BFD_RELOC_32:
22430     case BFD_RELOC_ARM_TARGET1:
22431     case BFD_RELOC_ARM_ROSEGREL32:
22432     case BFD_RELOC_ARM_SBREL32:
22433     case BFD_RELOC_32_PCREL:
22434 #ifdef TE_PE
22435     case BFD_RELOC_32_SECREL:
22436 #endif
22437       if (fixP->fx_done || !seg->use_rela_p)
22438 #ifdef TE_WINCE
22439         /* For WinCE we only do this for pcrel fixups.  */
22440         if (fixP->fx_done || fixP->fx_pcrel)
22441 #endif
22442           md_number_to_chars (buf, value, 4);
22443       break;
22444
22445 #ifdef OBJ_ELF
22446     case BFD_RELOC_ARM_PREL31:
22447       if (fixP->fx_done || !seg->use_rela_p)
22448         {
22449           newval = md_chars_to_number (buf, 4) & 0x80000000;
22450           if ((value ^ (value >> 1)) & 0x40000000)
22451             {
22452               as_bad_where (fixP->fx_file, fixP->fx_line,
22453                             _("rel31 relocation overflow"));
22454             }
22455           newval |= value & 0x7fffffff;
22456           md_number_to_chars (buf, newval, 4);
22457         }
22458       break;
22459 #endif
22460
22461     case BFD_RELOC_ARM_CP_OFF_IMM:
22462     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
22463       if (value < -1023 || value > 1023 || (value & 3))
22464         as_bad_where (fixP->fx_file, fixP->fx_line,
22465                       _("co-processor offset out of range"));
22466     cp_off_common:
22467       sign = value > 0;
22468       if (value < 0)
22469         value = -value;
22470       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22471           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22472         newval = md_chars_to_number (buf, INSN_SIZE);
22473       else
22474         newval = get_thumb32_insn (buf);
22475       if (value == 0)
22476         newval &= 0xffffff00;
22477       else
22478         {
22479           newval &= 0xff7fff00;
22480           newval |= (value >> 2) | (sign ? INDEX_UP : 0);
22481         }
22482       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22483           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22484         md_number_to_chars (buf, newval, INSN_SIZE);
22485       else
22486         put_thumb32_insn (buf, newval);
22487       break;
22488
22489     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
22490     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
22491       if (value < -255 || value > 255)
22492         as_bad_where (fixP->fx_file, fixP->fx_line,
22493                       _("co-processor offset out of range"));
22494       value *= 4;
22495       goto cp_off_common;
22496
22497     case BFD_RELOC_ARM_THUMB_OFFSET:
22498       newval = md_chars_to_number (buf, THUMB_SIZE);
22499       /* Exactly what ranges, and where the offset is inserted depends
22500          on the type of instruction, we can establish this from the
22501          top 4 bits.  */
22502       switch (newval >> 12)
22503         {
22504         case 4: /* PC load.  */
22505           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
22506              forced to zero for these loads; md_pcrel_from has already
22507              compensated for this.  */
22508           if (value & 3)
22509             as_bad_where (fixP->fx_file, fixP->fx_line,
22510                           _("invalid offset, target not word aligned (0x%08lX)"),
22511                           (((unsigned long) fixP->fx_frag->fr_address
22512                             + (unsigned long) fixP->fx_where) & ~3)
22513                           + (unsigned long) value);
22514
22515           if (value & ~0x3fc)
22516             as_bad_where (fixP->fx_file, fixP->fx_line,
22517                           _("invalid offset, value too big (0x%08lX)"),
22518                           (long) value);
22519
22520           newval |= value >> 2;
22521           break;
22522
22523         case 9: /* SP load/store.  */
22524           if (value & ~0x3fc)
22525             as_bad_where (fixP->fx_file, fixP->fx_line,
22526                           _("invalid offset, value too big (0x%08lX)"),
22527                           (long) value);
22528           newval |= value >> 2;
22529           break;
22530
22531         case 6: /* Word load/store.  */
22532           if (value & ~0x7c)
22533             as_bad_where (fixP->fx_file, fixP->fx_line,
22534                           _("invalid offset, value too big (0x%08lX)"),
22535                           (long) value);
22536           newval |= value << 4; /* 6 - 2.  */
22537           break;
22538
22539         case 7: /* Byte load/store.  */
22540           if (value & ~0x1f)
22541             as_bad_where (fixP->fx_file, fixP->fx_line,
22542                           _("invalid offset, value too big (0x%08lX)"),
22543                           (long) value);
22544           newval |= value << 6;
22545           break;
22546
22547         case 8: /* Halfword load/store.  */
22548           if (value & ~0x3e)
22549             as_bad_where (fixP->fx_file, fixP->fx_line,
22550                           _("invalid offset, value too big (0x%08lX)"),
22551                           (long) value);
22552           newval |= value << 5; /* 6 - 1.  */
22553           break;
22554
22555         default:
22556           as_bad_where (fixP->fx_file, fixP->fx_line,
22557                         "Unable to process relocation for thumb opcode: %lx",
22558                         (unsigned long) newval);
22559           break;
22560         }
22561       md_number_to_chars (buf, newval, THUMB_SIZE);
22562       break;
22563
22564     case BFD_RELOC_ARM_THUMB_ADD:
22565       /* This is a complicated relocation, since we use it for all of
22566          the following immediate relocations:
22567
22568             3bit ADD/SUB
22569             8bit ADD/SUB
22570             9bit ADD/SUB SP word-aligned
22571            10bit ADD PC/SP word-aligned
22572
22573          The type of instruction being processed is encoded in the
22574          instruction field:
22575
22576            0x8000  SUB
22577            0x00F0  Rd
22578            0x000F  Rs
22579       */
22580       newval = md_chars_to_number (buf, THUMB_SIZE);
22581       {
22582         int rd = (newval >> 4) & 0xf;
22583         int rs = newval & 0xf;
22584         int subtract = !!(newval & 0x8000);
22585
22586         /* Check for HI regs, only very restricted cases allowed:
22587            Adjusting SP, and using PC or SP to get an address.  */
22588         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
22589             || (rs > 7 && rs != REG_SP && rs != REG_PC))
22590           as_bad_where (fixP->fx_file, fixP->fx_line,
22591                         _("invalid Hi register with immediate"));
22592
22593         /* If value is negative, choose the opposite instruction.  */
22594         if (value < 0)
22595           {
22596             value = -value;
22597             subtract = !subtract;
22598             if (value < 0)
22599               as_bad_where (fixP->fx_file, fixP->fx_line,
22600                             _("immediate value out of range"));
22601           }
22602
22603         if (rd == REG_SP)
22604           {
22605             if (value & ~0x1fc)
22606               as_bad_where (fixP->fx_file, fixP->fx_line,
22607                             _("invalid immediate for stack address calculation"));
22608             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
22609             newval |= value >> 2;
22610           }
22611         else if (rs == REG_PC || rs == REG_SP)
22612           {
22613             if (subtract || value & ~0x3fc)
22614               as_bad_where (fixP->fx_file, fixP->fx_line,
22615                             _("invalid immediate for address calculation (value = 0x%08lX)"),
22616                             (unsigned long) value);
22617             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
22618             newval |= rd << 8;
22619             newval |= value >> 2;
22620           }
22621         else if (rs == rd)
22622           {
22623             if (value & ~0xff)
22624               as_bad_where (fixP->fx_file, fixP->fx_line,
22625                             _("immediate value out of range"));
22626             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
22627             newval |= (rd << 8) | value;
22628           }
22629         else
22630           {
22631             if (value & ~0x7)
22632               as_bad_where (fixP->fx_file, fixP->fx_line,
22633                             _("immediate value out of range"));
22634             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
22635             newval |= rd | (rs << 3) | (value << 6);
22636           }
22637       }
22638       md_number_to_chars (buf, newval, THUMB_SIZE);
22639       break;
22640
22641     case BFD_RELOC_ARM_THUMB_IMM:
22642       newval = md_chars_to_number (buf, THUMB_SIZE);
22643       if (value < 0 || value > 255)
22644         as_bad_where (fixP->fx_file, fixP->fx_line,
22645                       _("invalid immediate: %ld is out of range"),
22646                       (long) value);
22647       newval |= value;
22648       md_number_to_chars (buf, newval, THUMB_SIZE);
22649       break;
22650
22651     case BFD_RELOC_ARM_THUMB_SHIFT:
22652       /* 5bit shift value (0..32).  LSL cannot take 32.  */
22653       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
22654       temp = newval & 0xf800;
22655       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
22656         as_bad_where (fixP->fx_file, fixP->fx_line,
22657                       _("invalid shift value: %ld"), (long) value);
22658       /* Shifts of zero must be encoded as LSL.  */
22659       if (value == 0)
22660         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
22661       /* Shifts of 32 are encoded as zero.  */
22662       else if (value == 32)
22663         value = 0;
22664       newval |= value << 6;
22665       md_number_to_chars (buf, newval, THUMB_SIZE);
22666       break;
22667
22668     case BFD_RELOC_VTABLE_INHERIT:
22669     case BFD_RELOC_VTABLE_ENTRY:
22670       fixP->fx_done = 0;
22671       return;
22672
22673     case BFD_RELOC_ARM_MOVW:
22674     case BFD_RELOC_ARM_MOVT:
22675     case BFD_RELOC_ARM_THUMB_MOVW:
22676     case BFD_RELOC_ARM_THUMB_MOVT:
22677       if (fixP->fx_done || !seg->use_rela_p)
22678         {
22679           /* REL format relocations are limited to a 16-bit addend.  */
22680           if (!fixP->fx_done)
22681             {
22682               if (value < -0x8000 || value > 0x7fff)
22683                   as_bad_where (fixP->fx_file, fixP->fx_line,
22684                                 _("offset out of range"));
22685             }
22686           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
22687                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22688             {
22689               value >>= 16;
22690             }
22691
22692           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
22693               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22694             {
22695               newval = get_thumb32_insn (buf);
22696               newval &= 0xfbf08f00;
22697               newval |= (value & 0xf000) << 4;
22698               newval |= (value & 0x0800) << 15;
22699               newval |= (value & 0x0700) << 4;
22700               newval |= (value & 0x00ff);
22701               put_thumb32_insn (buf, newval);
22702             }
22703           else
22704             {
22705               newval = md_chars_to_number (buf, 4);
22706               newval &= 0xfff0f000;
22707               newval |= value & 0x0fff;
22708               newval |= (value & 0xf000) << 4;
22709               md_number_to_chars (buf, newval, 4);
22710             }
22711         }
22712       return;
22713
22714    case BFD_RELOC_ARM_ALU_PC_G0_NC:
22715    case BFD_RELOC_ARM_ALU_PC_G0:
22716    case BFD_RELOC_ARM_ALU_PC_G1_NC:
22717    case BFD_RELOC_ARM_ALU_PC_G1:
22718    case BFD_RELOC_ARM_ALU_PC_G2:
22719    case BFD_RELOC_ARM_ALU_SB_G0_NC:
22720    case BFD_RELOC_ARM_ALU_SB_G0:
22721    case BFD_RELOC_ARM_ALU_SB_G1_NC:
22722    case BFD_RELOC_ARM_ALU_SB_G1:
22723    case BFD_RELOC_ARM_ALU_SB_G2:
22724      gas_assert (!fixP->fx_done);
22725      if (!seg->use_rela_p)
22726        {
22727          bfd_vma insn;
22728          bfd_vma encoded_addend;
22729          bfd_vma addend_abs = abs (value);
22730
22731          /* Check that the absolute value of the addend can be
22732             expressed as an 8-bit constant plus a rotation.  */
22733          encoded_addend = encode_arm_immediate (addend_abs);
22734          if (encoded_addend == (unsigned int) FAIL)
22735            as_bad_where (fixP->fx_file, fixP->fx_line,
22736                          _("the offset 0x%08lX is not representable"),
22737                          (unsigned long) addend_abs);
22738
22739          /* Extract the instruction.  */
22740          insn = md_chars_to_number (buf, INSN_SIZE);
22741
22742          /* If the addend is positive, use an ADD instruction.
22743             Otherwise use a SUB.  Take care not to destroy the S bit.  */
22744          insn &= 0xff1fffff;
22745          if (value < 0)
22746            insn |= 1 << 22;
22747          else
22748            insn |= 1 << 23;
22749
22750          /* Place the encoded addend into the first 12 bits of the
22751             instruction.  */
22752          insn &= 0xfffff000;
22753          insn |= encoded_addend;
22754
22755          /* Update the instruction.  */
22756          md_number_to_chars (buf, insn, INSN_SIZE);
22757        }
22758      break;
22759
22760     case BFD_RELOC_ARM_LDR_PC_G0:
22761     case BFD_RELOC_ARM_LDR_PC_G1:
22762     case BFD_RELOC_ARM_LDR_PC_G2:
22763     case BFD_RELOC_ARM_LDR_SB_G0:
22764     case BFD_RELOC_ARM_LDR_SB_G1:
22765     case BFD_RELOC_ARM_LDR_SB_G2:
22766       gas_assert (!fixP->fx_done);
22767       if (!seg->use_rela_p)
22768         {
22769           bfd_vma insn;
22770           bfd_vma addend_abs = abs (value);
22771
22772           /* Check that the absolute value of the addend can be
22773              encoded in 12 bits.  */
22774           if (addend_abs >= 0x1000)
22775             as_bad_where (fixP->fx_file, fixP->fx_line,
22776                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
22777                           (unsigned long) addend_abs);
22778
22779           /* Extract the instruction.  */
22780           insn = md_chars_to_number (buf, INSN_SIZE);
22781
22782           /* If the addend is negative, clear bit 23 of the instruction.
22783              Otherwise set it.  */
22784           if (value < 0)
22785             insn &= ~(1 << 23);
22786           else
22787             insn |= 1 << 23;
22788
22789           /* Place the absolute value of the addend into the first 12 bits
22790              of the instruction.  */
22791           insn &= 0xfffff000;
22792           insn |= addend_abs;
22793
22794           /* Update the instruction.  */
22795           md_number_to_chars (buf, insn, INSN_SIZE);
22796         }
22797       break;
22798
22799     case BFD_RELOC_ARM_LDRS_PC_G0:
22800     case BFD_RELOC_ARM_LDRS_PC_G1:
22801     case BFD_RELOC_ARM_LDRS_PC_G2:
22802     case BFD_RELOC_ARM_LDRS_SB_G0:
22803     case BFD_RELOC_ARM_LDRS_SB_G1:
22804     case BFD_RELOC_ARM_LDRS_SB_G2:
22805       gas_assert (!fixP->fx_done);
22806       if (!seg->use_rela_p)
22807         {
22808           bfd_vma insn;
22809           bfd_vma addend_abs = abs (value);
22810
22811           /* Check that the absolute value of the addend can be
22812              encoded in 8 bits.  */
22813           if (addend_abs >= 0x100)
22814             as_bad_where (fixP->fx_file, fixP->fx_line,
22815                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
22816                           (unsigned long) addend_abs);
22817
22818           /* Extract the instruction.  */
22819           insn = md_chars_to_number (buf, INSN_SIZE);
22820
22821           /* If the addend is negative, clear bit 23 of the instruction.
22822              Otherwise set it.  */
22823           if (value < 0)
22824             insn &= ~(1 << 23);
22825           else
22826             insn |= 1 << 23;
22827
22828           /* Place the first four bits of the absolute value of the addend
22829              into the first 4 bits of the instruction, and the remaining
22830              four into bits 8 .. 11.  */
22831           insn &= 0xfffff0f0;
22832           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
22833
22834           /* Update the instruction.  */
22835           md_number_to_chars (buf, insn, INSN_SIZE);
22836         }
22837       break;
22838
22839     case BFD_RELOC_ARM_LDC_PC_G0:
22840     case BFD_RELOC_ARM_LDC_PC_G1:
22841     case BFD_RELOC_ARM_LDC_PC_G2:
22842     case BFD_RELOC_ARM_LDC_SB_G0:
22843     case BFD_RELOC_ARM_LDC_SB_G1:
22844     case BFD_RELOC_ARM_LDC_SB_G2:
22845       gas_assert (!fixP->fx_done);
22846       if (!seg->use_rela_p)
22847         {
22848           bfd_vma insn;
22849           bfd_vma addend_abs = abs (value);
22850
22851           /* Check that the absolute value of the addend is a multiple of
22852              four and, when divided by four, fits in 8 bits.  */
22853           if (addend_abs & 0x3)
22854             as_bad_where (fixP->fx_file, fixP->fx_line,
22855                           _("bad offset 0x%08lX (must be word-aligned)"),
22856                           (unsigned long) addend_abs);
22857
22858           if ((addend_abs >> 2) > 0xff)
22859             as_bad_where (fixP->fx_file, fixP->fx_line,
22860                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
22861                           (unsigned long) addend_abs);
22862
22863           /* Extract the instruction.  */
22864           insn = md_chars_to_number (buf, INSN_SIZE);
22865
22866           /* If the addend is negative, clear bit 23 of the instruction.
22867              Otherwise set it.  */
22868           if (value < 0)
22869             insn &= ~(1 << 23);
22870           else
22871             insn |= 1 << 23;
22872
22873           /* Place the addend (divided by four) into the first eight
22874              bits of the instruction.  */
22875           insn &= 0xfffffff0;
22876           insn |= addend_abs >> 2;
22877
22878           /* Update the instruction.  */
22879           md_number_to_chars (buf, insn, INSN_SIZE);
22880         }
22881       break;
22882
22883     case BFD_RELOC_ARM_V4BX:
22884       /* This will need to go in the object file.  */
22885       fixP->fx_done = 0;
22886       break;
22887
22888     case BFD_RELOC_UNUSED:
22889     default:
22890       as_bad_where (fixP->fx_file, fixP->fx_line,
22891                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
22892     }
22893 }
22894
22895 /* Translate internal representation of relocation info to BFD target
22896    format.  */
22897
22898 arelent *
22899 tc_gen_reloc (asection *section, fixS *fixp)
22900 {
22901   arelent * reloc;
22902   bfd_reloc_code_real_type code;
22903
22904   reloc = (arelent *) xmalloc (sizeof (arelent));
22905
22906   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
22907   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
22908   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
22909
22910   if (fixp->fx_pcrel)
22911     {
22912       if (section->use_rela_p)
22913         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
22914       else
22915         fixp->fx_offset = reloc->address;
22916     }
22917   reloc->addend = fixp->fx_offset;
22918
22919   switch (fixp->fx_r_type)
22920     {
22921     case BFD_RELOC_8:
22922       if (fixp->fx_pcrel)
22923         {
22924           code = BFD_RELOC_8_PCREL;
22925           break;
22926         }
22927
22928     case BFD_RELOC_16:
22929       if (fixp->fx_pcrel)
22930         {
22931           code = BFD_RELOC_16_PCREL;
22932           break;
22933         }
22934
22935     case BFD_RELOC_32:
22936       if (fixp->fx_pcrel)
22937         {
22938           code = BFD_RELOC_32_PCREL;
22939           break;
22940         }
22941
22942     case BFD_RELOC_ARM_MOVW:
22943       if (fixp->fx_pcrel)
22944         {
22945           code = BFD_RELOC_ARM_MOVW_PCREL;
22946           break;
22947         }
22948
22949     case BFD_RELOC_ARM_MOVT:
22950       if (fixp->fx_pcrel)
22951         {
22952           code = BFD_RELOC_ARM_MOVT_PCREL;
22953           break;
22954         }
22955
22956     case BFD_RELOC_ARM_THUMB_MOVW:
22957       if (fixp->fx_pcrel)
22958         {
22959           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
22960           break;
22961         }
22962
22963     case BFD_RELOC_ARM_THUMB_MOVT:
22964       if (fixp->fx_pcrel)
22965         {
22966           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
22967           break;
22968         }
22969
22970     case BFD_RELOC_NONE:
22971     case BFD_RELOC_ARM_PCREL_BRANCH:
22972     case BFD_RELOC_ARM_PCREL_BLX:
22973     case BFD_RELOC_RVA:
22974     case BFD_RELOC_THUMB_PCREL_BRANCH7:
22975     case BFD_RELOC_THUMB_PCREL_BRANCH9:
22976     case BFD_RELOC_THUMB_PCREL_BRANCH12:
22977     case BFD_RELOC_THUMB_PCREL_BRANCH20:
22978     case BFD_RELOC_THUMB_PCREL_BRANCH23:
22979     case BFD_RELOC_THUMB_PCREL_BRANCH25:
22980     case BFD_RELOC_VTABLE_ENTRY:
22981     case BFD_RELOC_VTABLE_INHERIT:
22982 #ifdef TE_PE
22983     case BFD_RELOC_32_SECREL:
22984 #endif
22985       code = fixp->fx_r_type;
22986       break;
22987
22988     case BFD_RELOC_THUMB_PCREL_BLX:
22989 #ifdef OBJ_ELF
22990       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22991         code = BFD_RELOC_THUMB_PCREL_BRANCH23;
22992       else
22993 #endif
22994         code = BFD_RELOC_THUMB_PCREL_BLX;
22995       break;
22996
22997     case BFD_RELOC_ARM_LITERAL:
22998     case BFD_RELOC_ARM_HWLITERAL:
22999       /* If this is called then the a literal has
23000          been referenced across a section boundary.  */
23001       as_bad_where (fixp->fx_file, fixp->fx_line,
23002                     _("literal referenced across section boundary"));
23003       return NULL;
23004
23005 #ifdef OBJ_ELF
23006     case BFD_RELOC_ARM_TLS_CALL:
23007     case BFD_RELOC_ARM_THM_TLS_CALL:
23008     case BFD_RELOC_ARM_TLS_DESCSEQ:
23009     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
23010     case BFD_RELOC_ARM_GOT32:
23011     case BFD_RELOC_ARM_GOTOFF:
23012     case BFD_RELOC_ARM_GOT_PREL:
23013     case BFD_RELOC_ARM_PLT32:
23014     case BFD_RELOC_ARM_TARGET1:
23015     case BFD_RELOC_ARM_ROSEGREL32:
23016     case BFD_RELOC_ARM_SBREL32:
23017     case BFD_RELOC_ARM_PREL31:
23018     case BFD_RELOC_ARM_TARGET2:
23019     case BFD_RELOC_ARM_TLS_LE32:
23020     case BFD_RELOC_ARM_TLS_LDO32:
23021     case BFD_RELOC_ARM_PCREL_CALL:
23022     case BFD_RELOC_ARM_PCREL_JUMP:
23023     case BFD_RELOC_ARM_ALU_PC_G0_NC:
23024     case BFD_RELOC_ARM_ALU_PC_G0:
23025     case BFD_RELOC_ARM_ALU_PC_G1_NC:
23026     case BFD_RELOC_ARM_ALU_PC_G1:
23027     case BFD_RELOC_ARM_ALU_PC_G2:
23028     case BFD_RELOC_ARM_LDR_PC_G0:
23029     case BFD_RELOC_ARM_LDR_PC_G1:
23030     case BFD_RELOC_ARM_LDR_PC_G2:
23031     case BFD_RELOC_ARM_LDRS_PC_G0:
23032     case BFD_RELOC_ARM_LDRS_PC_G1:
23033     case BFD_RELOC_ARM_LDRS_PC_G2:
23034     case BFD_RELOC_ARM_LDC_PC_G0:
23035     case BFD_RELOC_ARM_LDC_PC_G1:
23036     case BFD_RELOC_ARM_LDC_PC_G2:
23037     case BFD_RELOC_ARM_ALU_SB_G0_NC:
23038     case BFD_RELOC_ARM_ALU_SB_G0:
23039     case BFD_RELOC_ARM_ALU_SB_G1_NC:
23040     case BFD_RELOC_ARM_ALU_SB_G1:
23041     case BFD_RELOC_ARM_ALU_SB_G2:
23042     case BFD_RELOC_ARM_LDR_SB_G0:
23043     case BFD_RELOC_ARM_LDR_SB_G1:
23044     case BFD_RELOC_ARM_LDR_SB_G2:
23045     case BFD_RELOC_ARM_LDRS_SB_G0:
23046     case BFD_RELOC_ARM_LDRS_SB_G1:
23047     case BFD_RELOC_ARM_LDRS_SB_G2:
23048     case BFD_RELOC_ARM_LDC_SB_G0:
23049     case BFD_RELOC_ARM_LDC_SB_G1:
23050     case BFD_RELOC_ARM_LDC_SB_G2:
23051     case BFD_RELOC_ARM_V4BX:
23052       code = fixp->fx_r_type;
23053       break;
23054
23055     case BFD_RELOC_ARM_TLS_GOTDESC:
23056     case BFD_RELOC_ARM_TLS_GD32:
23057     case BFD_RELOC_ARM_TLS_IE32:
23058     case BFD_RELOC_ARM_TLS_LDM32:
23059       /* BFD will include the symbol's address in the addend.
23060          But we don't want that, so subtract it out again here.  */
23061       if (!S_IS_COMMON (fixp->fx_addsy))
23062         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
23063       code = fixp->fx_r_type;
23064       break;
23065 #endif
23066
23067     case BFD_RELOC_ARM_IMMEDIATE:
23068       as_bad_where (fixp->fx_file, fixp->fx_line,
23069                     _("internal relocation (type: IMMEDIATE) not fixed up"));
23070       return NULL;
23071
23072     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
23073       as_bad_where (fixp->fx_file, fixp->fx_line,
23074                     _("ADRL used for a symbol not defined in the same file"));
23075       return NULL;
23076
23077     case BFD_RELOC_ARM_OFFSET_IMM:
23078       if (section->use_rela_p)
23079         {
23080           code = fixp->fx_r_type;
23081           break;
23082         }
23083
23084       if (fixp->fx_addsy != NULL
23085           && !S_IS_DEFINED (fixp->fx_addsy)
23086           && S_IS_LOCAL (fixp->fx_addsy))
23087         {
23088           as_bad_where (fixp->fx_file, fixp->fx_line,
23089                         _("undefined local label `%s'"),
23090                         S_GET_NAME (fixp->fx_addsy));
23091           return NULL;
23092         }
23093
23094       as_bad_where (fixp->fx_file, fixp->fx_line,
23095                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
23096       return NULL;
23097
23098     default:
23099       {
23100         char * type;
23101
23102         switch (fixp->fx_r_type)
23103           {
23104           case BFD_RELOC_NONE:             type = "NONE";         break;
23105           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
23106           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
23107           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
23108           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
23109           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
23110           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
23111           case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
23112           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
23113           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
23114           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
23115           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
23116           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
23117           default:                         type = _("<unknown>"); break;
23118           }
23119         as_bad_where (fixp->fx_file, fixp->fx_line,
23120                       _("cannot represent %s relocation in this object file format"),
23121                       type);
23122         return NULL;
23123       }
23124     }
23125
23126 #ifdef OBJ_ELF
23127   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
23128       && GOT_symbol
23129       && fixp->fx_addsy == GOT_symbol)
23130     {
23131       code = BFD_RELOC_ARM_GOTPC;
23132       reloc->addend = fixp->fx_offset = reloc->address;
23133     }
23134 #endif
23135
23136   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
23137
23138   if (reloc->howto == NULL)
23139     {
23140       as_bad_where (fixp->fx_file, fixp->fx_line,
23141                     _("cannot represent %s relocation in this object file format"),
23142                     bfd_get_reloc_code_name (code));
23143       return NULL;
23144     }
23145
23146   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
23147      vtable entry to be used in the relocation's section offset.  */
23148   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
23149     reloc->address = fixp->fx_offset;
23150
23151   return reloc;
23152 }
23153
23154 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
23155
23156 void
23157 cons_fix_new_arm (fragS *       frag,
23158                   int           where,
23159                   int           size,
23160                   expressionS * exp,
23161                   bfd_reloc_code_real_type reloc)
23162 {
23163   int pcrel = 0;
23164
23165   /* Pick a reloc.
23166      FIXME: @@ Should look at CPU word size.  */
23167   switch (size)
23168     {
23169     case 1:
23170       reloc = BFD_RELOC_8;
23171       break;
23172     case 2:
23173       reloc = BFD_RELOC_16;
23174       break;
23175     case 4:
23176     default:
23177       reloc = BFD_RELOC_32;
23178       break;
23179     case 8:
23180       reloc = BFD_RELOC_64;
23181       break;
23182     }
23183
23184 #ifdef TE_PE
23185   if (exp->X_op == O_secrel)
23186   {
23187     exp->X_op = O_symbol;
23188     reloc = BFD_RELOC_32_SECREL;
23189   }
23190 #endif
23191
23192   fix_new_exp (frag, where, size, exp, pcrel, reloc);
23193 }
23194
23195 #if defined (OBJ_COFF)
23196 void
23197 arm_validate_fix (fixS * fixP)
23198 {
23199   /* If the destination of the branch is a defined symbol which does not have
23200      the THUMB_FUNC attribute, then we must be calling a function which has
23201      the (interfacearm) attribute.  We look for the Thumb entry point to that
23202      function and change the branch to refer to that function instead.  */
23203   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
23204       && fixP->fx_addsy != NULL
23205       && S_IS_DEFINED (fixP->fx_addsy)
23206       && ! THUMB_IS_FUNC (fixP->fx_addsy))
23207     {
23208       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
23209     }
23210 }
23211 #endif
23212
23213
23214 int
23215 arm_force_relocation (struct fix * fixp)
23216 {
23217 #if defined (OBJ_COFF) && defined (TE_PE)
23218   if (fixp->fx_r_type == BFD_RELOC_RVA)
23219     return 1;
23220 #endif
23221
23222   /* In case we have a call or a branch to a function in ARM ISA mode from
23223      a thumb function or vice-versa force the relocation. These relocations
23224      are cleared off for some cores that might have blx and simple transformations
23225      are possible.  */
23226
23227 #ifdef OBJ_ELF
23228   switch (fixp->fx_r_type)
23229     {
23230     case BFD_RELOC_ARM_PCREL_JUMP:
23231     case BFD_RELOC_ARM_PCREL_CALL:
23232     case BFD_RELOC_THUMB_PCREL_BLX:
23233       if (THUMB_IS_FUNC (fixp->fx_addsy))
23234         return 1;
23235       break;
23236
23237     case BFD_RELOC_ARM_PCREL_BLX:
23238     case BFD_RELOC_THUMB_PCREL_BRANCH25:
23239     case BFD_RELOC_THUMB_PCREL_BRANCH20:
23240     case BFD_RELOC_THUMB_PCREL_BRANCH23:
23241       if (ARM_IS_FUNC (fixp->fx_addsy))
23242         return 1;
23243       break;
23244
23245     default:
23246       break;
23247     }
23248 #endif
23249
23250   /* Resolve these relocations even if the symbol is extern or weak.
23251      Technically this is probably wrong due to symbol preemption.
23252      In practice these relocations do not have enough range to be useful
23253      at dynamic link time, and some code (e.g. in the Linux kernel)
23254      expects these references to be resolved.  */
23255   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
23256       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
23257       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
23258       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
23259       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
23260       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
23261       || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
23262       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
23263       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
23264       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
23265       || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
23266       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
23267       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
23268       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
23269     return 0;
23270
23271   /* Always leave these relocations for the linker.  */
23272   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23273        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23274       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
23275     return 1;
23276
23277   /* Always generate relocations against function symbols.  */
23278   if (fixp->fx_r_type == BFD_RELOC_32
23279       && fixp->fx_addsy
23280       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
23281     return 1;
23282
23283   return generic_force_reloc (fixp);
23284 }
23285
23286 #if defined (OBJ_ELF) || defined (OBJ_COFF)
23287 /* Relocations against function names must be left unadjusted,
23288    so that the linker can use this information to generate interworking
23289    stubs.  The MIPS version of this function
23290    also prevents relocations that are mips-16 specific, but I do not
23291    know why it does this.
23292
23293    FIXME:
23294    There is one other problem that ought to be addressed here, but
23295    which currently is not:  Taking the address of a label (rather
23296    than a function) and then later jumping to that address.  Such
23297    addresses also ought to have their bottom bit set (assuming that
23298    they reside in Thumb code), but at the moment they will not.  */
23299
23300 bfd_boolean
23301 arm_fix_adjustable (fixS * fixP)
23302 {
23303   if (fixP->fx_addsy == NULL)
23304     return 1;
23305
23306   /* Preserve relocations against symbols with function type.  */
23307   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
23308     return FALSE;
23309
23310   if (THUMB_IS_FUNC (fixP->fx_addsy)
23311       && fixP->fx_subsy == NULL)
23312     return FALSE;
23313
23314   /* We need the symbol name for the VTABLE entries.  */
23315   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
23316       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
23317     return FALSE;
23318
23319   /* Don't allow symbols to be discarded on GOT related relocs.  */
23320   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
23321       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
23322       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
23323       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
23324       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
23325       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
23326       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
23327       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
23328       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
23329       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
23330       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
23331       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
23332       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
23333       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
23334     return FALSE;
23335
23336   /* Similarly for group relocations.  */
23337   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23338        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23339       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
23340     return FALSE;
23341
23342   /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
23343   if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
23344       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
23345       || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
23346       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
23347       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
23348       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
23349       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
23350       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
23351     return FALSE;
23352
23353   return TRUE;
23354 }
23355 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
23356
23357 #ifdef OBJ_ELF
23358
23359 const char *
23360 elf32_arm_target_format (void)
23361 {
23362 #ifdef TE_SYMBIAN
23363   return (target_big_endian
23364           ? "elf32-bigarm-symbian"
23365           : "elf32-littlearm-symbian");
23366 #elif defined (TE_VXWORKS)
23367   return (target_big_endian
23368           ? "elf32-bigarm-vxworks"
23369           : "elf32-littlearm-vxworks");
23370 #elif defined (TE_NACL)
23371   return (target_big_endian
23372           ? "elf32-bigarm-nacl"
23373           : "elf32-littlearm-nacl");
23374 #else
23375   if (target_big_endian)
23376     return "elf32-bigarm";
23377   else
23378     return "elf32-littlearm";
23379 #endif
23380 }
23381
23382 void
23383 armelf_frob_symbol (symbolS * symp,
23384                     int *     puntp)
23385 {
23386   elf_frob_symbol (symp, puntp);
23387 }
23388 #endif
23389
23390 /* MD interface: Finalization.  */
23391
23392 void
23393 arm_cleanup (void)
23394 {
23395   literal_pool * pool;
23396
23397   /* Ensure that all the IT blocks are properly closed.  */
23398   check_it_blocks_finished ();
23399
23400   for (pool = list_of_pools; pool; pool = pool->next)
23401     {
23402       /* Put it at the end of the relevant section.  */
23403       subseg_set (pool->section, pool->sub_section);
23404 #ifdef OBJ_ELF
23405       arm_elf_change_section ();
23406 #endif
23407       s_ltorg (0);
23408     }
23409 }
23410
23411 #ifdef OBJ_ELF
23412 /* Remove any excess mapping symbols generated for alignment frags in
23413    SEC.  We may have created a mapping symbol before a zero byte
23414    alignment; remove it if there's a mapping symbol after the
23415    alignment.  */
23416 static void
23417 check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
23418                        void *dummy ATTRIBUTE_UNUSED)
23419 {
23420   segment_info_type *seginfo = seg_info (sec);
23421   fragS *fragp;
23422
23423   if (seginfo == NULL || seginfo->frchainP == NULL)
23424     return;
23425
23426   for (fragp = seginfo->frchainP->frch_root;
23427        fragp != NULL;
23428        fragp = fragp->fr_next)
23429     {
23430       symbolS *sym = fragp->tc_frag_data.last_map;
23431       fragS *next = fragp->fr_next;
23432
23433       /* Variable-sized frags have been converted to fixed size by
23434          this point.  But if this was variable-sized to start with,
23435          there will be a fixed-size frag after it.  So don't handle
23436          next == NULL.  */
23437       if (sym == NULL || next == NULL)
23438         continue;
23439
23440       if (S_GET_VALUE (sym) < next->fr_address)
23441         /* Not at the end of this frag.  */
23442         continue;
23443       know (S_GET_VALUE (sym) == next->fr_address);
23444
23445       do
23446         {
23447           if (next->tc_frag_data.first_map != NULL)
23448             {
23449               /* Next frag starts with a mapping symbol.  Discard this
23450                  one.  */
23451               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23452               break;
23453             }
23454
23455           if (next->fr_next == NULL)
23456             {
23457               /* This mapping symbol is at the end of the section.  Discard
23458                  it.  */
23459               know (next->fr_fix == 0 && next->fr_var == 0);
23460               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23461               break;
23462             }
23463
23464           /* As long as we have empty frags without any mapping symbols,
23465              keep looking.  */
23466           /* If the next frag is non-empty and does not start with a
23467              mapping symbol, then this mapping symbol is required.  */
23468           if (next->fr_address != next->fr_next->fr_address)
23469             break;
23470
23471           next = next->fr_next;
23472         }
23473       while (next != NULL);
23474     }
23475 }
23476 #endif
23477
23478 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
23479    ARM ones.  */
23480
23481 void
23482 arm_adjust_symtab (void)
23483 {
23484 #ifdef OBJ_COFF
23485   symbolS * sym;
23486
23487   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
23488     {
23489       if (ARM_IS_THUMB (sym))
23490         {
23491           if (THUMB_IS_FUNC (sym))
23492             {
23493               /* Mark the symbol as a Thumb function.  */
23494               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
23495                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
23496                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
23497
23498               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
23499                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
23500               else
23501                 as_bad (_("%s: unexpected function type: %d"),
23502                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
23503             }
23504           else switch (S_GET_STORAGE_CLASS (sym))
23505             {
23506             case C_EXT:
23507               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
23508               break;
23509             case C_STAT:
23510               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
23511               break;
23512             case C_LABEL:
23513               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
23514               break;
23515             default:
23516               /* Do nothing.  */
23517               break;
23518             }
23519         }
23520
23521       if (ARM_IS_INTERWORK (sym))
23522         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
23523     }
23524 #endif
23525 #ifdef OBJ_ELF
23526   symbolS * sym;
23527   char      bind;
23528
23529   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
23530     {
23531       if (ARM_IS_THUMB (sym))
23532         {
23533           elf_symbol_type * elf_sym;
23534
23535           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
23536           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
23537
23538           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
23539                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
23540             {
23541               /* If it's a .thumb_func, declare it as so,
23542                  otherwise tag label as .code 16.  */
23543               if (THUMB_IS_FUNC (sym))
23544                 elf_sym->internal_elf_sym.st_target_internal
23545                   = ST_BRANCH_TO_THUMB;
23546               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
23547                 elf_sym->internal_elf_sym.st_info =
23548                   ELF_ST_INFO (bind, STT_ARM_16BIT);
23549             }
23550         }
23551     }
23552
23553   /* Remove any overlapping mapping symbols generated by alignment frags.  */
23554   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
23555   /* Now do generic ELF adjustments.  */
23556   elf_adjust_symtab ();
23557 #endif
23558 }
23559
23560 /* MD interface: Initialization.  */
23561
23562 static void
23563 set_constant_flonums (void)
23564 {
23565   int i;
23566
23567   for (i = 0; i < NUM_FLOAT_VALS; i++)
23568     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
23569       abort ();
23570 }
23571
23572 /* Auto-select Thumb mode if it's the only available instruction set for the
23573    given architecture.  */
23574
23575 static void
23576 autoselect_thumb_from_cpu_variant (void)
23577 {
23578   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
23579     opcode_select (16);
23580 }
23581
23582 void
23583 md_begin (void)
23584 {
23585   unsigned mach;
23586   unsigned int i;
23587
23588   if (   (arm_ops_hsh = hash_new ()) == NULL
23589       || (arm_cond_hsh = hash_new ()) == NULL
23590       || (arm_shift_hsh = hash_new ()) == NULL
23591       || (arm_psr_hsh = hash_new ()) == NULL
23592       || (arm_v7m_psr_hsh = hash_new ()) == NULL
23593       || (arm_reg_hsh = hash_new ()) == NULL
23594       || (arm_reloc_hsh = hash_new ()) == NULL
23595       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
23596     as_fatal (_("virtual memory exhausted"));
23597
23598   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
23599     hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
23600   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
23601     hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
23602   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
23603     hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
23604   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
23605     hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
23606   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
23607     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
23608                  (void *) (v7m_psrs + i));
23609   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
23610     hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
23611   for (i = 0;
23612        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
23613        i++)
23614     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
23615                  (void *) (barrier_opt_names + i));
23616 #ifdef OBJ_ELF
23617   for (i = 0; i < ARRAY_SIZE (reloc_names); i++)
23618     {
23619       struct reloc_entry * entry = reloc_names + i;
23620
23621       if (arm_is_eabi() && entry->reloc == BFD_RELOC_ARM_PLT32)
23622         /* This makes encode_branch() use the EABI versions of this relocation.  */
23623         entry->reloc = BFD_RELOC_UNUSED;
23624
23625       hash_insert (arm_reloc_hsh, entry->name, (void *) entry);
23626     }
23627 #endif
23628
23629   set_constant_flonums ();
23630
23631   /* Set the cpu variant based on the command-line options.  We prefer
23632      -mcpu= over -march= if both are set (as for GCC); and we prefer
23633      -mfpu= over any other way of setting the floating point unit.
23634      Use of legacy options with new options are faulted.  */
23635   if (legacy_cpu)
23636     {
23637       if (mcpu_cpu_opt || march_cpu_opt)
23638         as_bad (_("use of old and new-style options to set CPU type"));
23639
23640       mcpu_cpu_opt = legacy_cpu;
23641     }
23642   else if (!mcpu_cpu_opt)
23643     mcpu_cpu_opt = march_cpu_opt;
23644
23645   if (legacy_fpu)
23646     {
23647       if (mfpu_opt)
23648         as_bad (_("use of old and new-style options to set FPU type"));
23649
23650       mfpu_opt = legacy_fpu;
23651     }
23652   else if (!mfpu_opt)
23653     {
23654 #if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
23655         || defined (TE_NetBSD) || defined (TE_VXWORKS))
23656       /* Some environments specify a default FPU.  If they don't, infer it
23657          from the processor.  */
23658       if (mcpu_fpu_opt)
23659         mfpu_opt = mcpu_fpu_opt;
23660       else
23661         mfpu_opt = march_fpu_opt;
23662 #else
23663       mfpu_opt = &fpu_default;
23664 #endif
23665     }
23666
23667   if (!mfpu_opt)
23668     {
23669       if (mcpu_cpu_opt != NULL)
23670         mfpu_opt = &fpu_default;
23671       else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
23672         mfpu_opt = &fpu_arch_vfp_v2;
23673       else
23674         mfpu_opt = &fpu_arch_fpa;
23675     }
23676
23677 #ifdef CPU_DEFAULT
23678   if (!mcpu_cpu_opt)
23679     {
23680       mcpu_cpu_opt = &cpu_default;
23681       selected_cpu = cpu_default;
23682     }
23683 #else
23684   if (mcpu_cpu_opt)
23685     selected_cpu = *mcpu_cpu_opt;
23686   else
23687     mcpu_cpu_opt = &arm_arch_any;
23688 #endif
23689
23690   ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23691
23692   autoselect_thumb_from_cpu_variant ();
23693
23694   arm_arch_used = thumb_arch_used = arm_arch_none;
23695
23696 #if defined OBJ_COFF || defined OBJ_ELF
23697   {
23698     unsigned int flags = 0;
23699
23700 #if defined OBJ_ELF
23701     flags = meabi_flags;
23702
23703     switch (meabi_flags)
23704       {
23705       case EF_ARM_EABI_UNKNOWN:
23706 #endif
23707         /* Set the flags in the private structure.  */
23708         if (uses_apcs_26)      flags |= F_APCS26;
23709         if (support_interwork) flags |= F_INTERWORK;
23710         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
23711         if (pic_code)          flags |= F_PIC;
23712         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
23713           flags |= F_SOFT_FLOAT;
23714
23715         switch (mfloat_abi_opt)
23716           {
23717           case ARM_FLOAT_ABI_SOFT:
23718           case ARM_FLOAT_ABI_SOFTFP:
23719             flags |= F_SOFT_FLOAT;
23720             break;
23721
23722           case ARM_FLOAT_ABI_HARD:
23723             if (flags & F_SOFT_FLOAT)
23724               as_bad (_("hard-float conflicts with specified fpu"));
23725             break;
23726           }
23727
23728         /* Using pure-endian doubles (even if soft-float).      */
23729         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
23730           flags |= F_VFP_FLOAT;
23731
23732 #if defined OBJ_ELF
23733         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
23734             flags |= EF_ARM_MAVERICK_FLOAT;
23735         break;
23736
23737       case EF_ARM_EABI_VER4:
23738       case EF_ARM_EABI_VER5:
23739         /* No additional flags to set.  */
23740         break;
23741
23742       default:
23743         abort ();
23744       }
23745 #endif
23746     bfd_set_private_flags (stdoutput, flags);
23747
23748     /* We have run out flags in the COFF header to encode the
23749        status of ATPCS support, so instead we create a dummy,
23750        empty, debug section called .arm.atpcs.  */
23751     if (atpcs)
23752       {
23753         asection * sec;
23754
23755         sec = bfd_make_section (stdoutput, ".arm.atpcs");
23756
23757         if (sec != NULL)
23758           {
23759             bfd_set_section_flags
23760               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
23761             bfd_set_section_size (stdoutput, sec, 0);
23762             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
23763           }
23764       }
23765   }
23766 #endif
23767
23768   /* Record the CPU type as well.  */
23769   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
23770     mach = bfd_mach_arm_iWMMXt2;
23771   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
23772     mach = bfd_mach_arm_iWMMXt;
23773   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
23774     mach = bfd_mach_arm_XScale;
23775   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
23776     mach = bfd_mach_arm_ep9312;
23777   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
23778     mach = bfd_mach_arm_5TE;
23779   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
23780     {
23781       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
23782         mach = bfd_mach_arm_5T;
23783       else
23784         mach = bfd_mach_arm_5;
23785     }
23786   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
23787     {
23788       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
23789         mach = bfd_mach_arm_4T;
23790       else
23791         mach = bfd_mach_arm_4;
23792     }
23793   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
23794     mach = bfd_mach_arm_3M;
23795   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
23796     mach = bfd_mach_arm_3;
23797   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
23798     mach = bfd_mach_arm_2a;
23799   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
23800     mach = bfd_mach_arm_2;
23801   else
23802     mach = bfd_mach_arm_unknown;
23803
23804   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
23805 }
23806
23807 /* Command line processing.  */
23808
23809 /* md_parse_option
23810       Invocation line includes a switch not recognized by the base assembler.
23811       See if it's a processor-specific option.
23812
23813       This routine is somewhat complicated by the need for backwards
23814       compatibility (since older releases of gcc can't be changed).
23815       The new options try to make the interface as compatible as
23816       possible with GCC.
23817
23818       New options (supported) are:
23819
23820               -mcpu=<cpu name>           Assemble for selected processor
23821               -march=<architecture name> Assemble for selected architecture
23822               -mfpu=<fpu architecture>   Assemble for selected FPU.
23823               -EB/-mbig-endian           Big-endian
23824               -EL/-mlittle-endian        Little-endian
23825               -k                         Generate PIC code
23826               -mthumb                    Start in Thumb mode
23827               -mthumb-interwork          Code supports ARM/Thumb interworking
23828
23829               -m[no-]warn-deprecated     Warn about deprecated features
23830
23831       For now we will also provide support for:
23832
23833               -mapcs-32                  32-bit Program counter
23834               -mapcs-26                  26-bit Program counter
23835               -macps-float               Floats passed in FP registers
23836               -mapcs-reentrant           Reentrant code
23837               -matpcs
23838       (sometime these will probably be replaced with -mapcs=<list of options>
23839       and -matpcs=<list of options>)
23840
23841       The remaining options are only supported for back-wards compatibility.
23842       Cpu variants, the arm part is optional:
23843               -m[arm]1                Currently not supported.
23844               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
23845               -m[arm]3                Arm 3 processor
23846               -m[arm]6[xx],           Arm 6 processors
23847               -m[arm]7[xx][t][[d]m]   Arm 7 processors
23848               -m[arm]8[10]            Arm 8 processors
23849               -m[arm]9[20][tdmi]      Arm 9 processors
23850               -mstrongarm[110[0]]     StrongARM processors
23851               -mxscale                XScale processors
23852               -m[arm]v[2345[t[e]]]    Arm architectures
23853               -mall                   All (except the ARM1)
23854       FP variants:
23855               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
23856               -mfpe-old               (No float load/store multiples)
23857               -mvfpxd                 VFP Single precision
23858               -mvfp                   All VFP
23859               -mno-fpu                Disable all floating point instructions
23860
23861       The following CPU names are recognized:
23862               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
23863               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
23864               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
23865               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
23866               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
23867               arm10t arm10e, arm1020t, arm1020e, arm10200e,
23868               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
23869
23870       */
23871
23872 const char * md_shortopts = "m:k";
23873
23874 #ifdef ARM_BI_ENDIAN
23875 #define OPTION_EB (OPTION_MD_BASE + 0)
23876 #define OPTION_EL (OPTION_MD_BASE + 1)
23877 #else
23878 #if TARGET_BYTES_BIG_ENDIAN
23879 #define OPTION_EB (OPTION_MD_BASE + 0)
23880 #else
23881 #define OPTION_EL (OPTION_MD_BASE + 1)
23882 #endif
23883 #endif
23884 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
23885
23886 struct option md_longopts[] =
23887 {
23888 #ifdef OPTION_EB
23889   {"EB", no_argument, NULL, OPTION_EB},
23890 #endif
23891 #ifdef OPTION_EL
23892   {"EL", no_argument, NULL, OPTION_EL},
23893 #endif
23894   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
23895   {NULL, no_argument, NULL, 0}
23896 };
23897
23898 size_t md_longopts_size = sizeof (md_longopts);
23899
23900 struct arm_option_table
23901 {
23902   char *option;         /* Option name to match.  */
23903   char *help;           /* Help information.  */
23904   int  *var;            /* Variable to change.  */
23905   int   value;          /* What to change it to.  */
23906   char *deprecated;     /* If non-null, print this message.  */
23907 };
23908
23909 struct arm_option_table arm_opts[] =
23910 {
23911   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
23912   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
23913   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
23914    &support_interwork, 1, NULL},
23915   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
23916   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
23917   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
23918    1, NULL},
23919   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
23920   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
23921   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
23922   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
23923    NULL},
23924
23925   /* These are recognized by the assembler, but have no affect on code.  */
23926   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
23927   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
23928
23929   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
23930   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
23931    &warn_on_deprecated, 0, NULL},
23932   {NULL, NULL, NULL, 0, NULL}
23933 };
23934
23935 struct arm_legacy_option_table
23936 {
23937   char *option;                         /* Option name to match.  */
23938   const arm_feature_set **var;          /* Variable to change.  */
23939   const arm_feature_set value;          /* What to change it to.  */
23940   char *deprecated;                     /* If non-null, print this message.  */
23941 };
23942
23943 const struct arm_legacy_option_table arm_legacy_opts[] =
23944 {
23945   /* DON'T add any new processors to this list -- we want the whole list
23946      to go away...  Add them to the processors table instead.  */
23947   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
23948   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
23949   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
23950   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
23951   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23952   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23953   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23954   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23955   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
23956   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
23957   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
23958   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
23959   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
23960   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
23961   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
23962   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
23963   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
23964   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
23965   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
23966   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
23967   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
23968   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
23969   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
23970   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
23971   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
23972   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
23973   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
23974   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
23975   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
23976   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
23977   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
23978   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
23979   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
23980   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
23981   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23982   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23983   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23984   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23985   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23986   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23987   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
23988   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
23989   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
23990   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
23991   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
23992   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
23993   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23994   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23995   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23996   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23997   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
23998   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
23999   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
24000   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
24001   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
24002   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
24003   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
24004   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
24005   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
24006   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
24007   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
24008   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
24009   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
24010   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
24011   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
24012   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
24013   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
24014   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
24015   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
24016   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
24017    N_("use -mcpu=strongarm110")},
24018   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
24019    N_("use -mcpu=strongarm1100")},
24020   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
24021    N_("use -mcpu=strongarm1110")},
24022   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
24023   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
24024   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
24025
24026   /* Architecture variants -- don't add any more to this list either.  */
24027   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
24028   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
24029   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
24030   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
24031   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
24032   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
24033   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
24034   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
24035   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
24036   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
24037   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
24038   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
24039   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
24040   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
24041   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
24042   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
24043   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
24044   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
24045
24046   /* Floating point variants -- don't add any more to this list either.  */
24047   {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
24048   {"mfpa10",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
24049   {"mfpa11",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
24050   {"mno-fpu",  &legacy_fpu, ARM_ARCH_NONE,
24051    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
24052
24053   {NULL, NULL, ARM_ARCH_NONE, NULL}
24054 };
24055
24056 struct arm_cpu_option_table
24057 {
24058   char *name;
24059   size_t name_len;
24060   const arm_feature_set value;
24061   /* For some CPUs we assume an FPU unless the user explicitly sets
24062      -mfpu=...  */
24063   const arm_feature_set default_fpu;
24064   /* The canonical name of the CPU, or NULL to use NAME converted to upper
24065      case.  */
24066   const char *canonical_name;
24067 };
24068
24069 /* This list should, at a minimum, contain all the cpu names
24070    recognized by GCC.  */
24071 #define ARM_CPU_OPT(N, V, DF, CN) { N, sizeof (N) - 1, V, DF, CN }
24072 static const struct arm_cpu_option_table arm_cpus[] =
24073 {
24074   ARM_CPU_OPT ("all",           ARM_ANY,         FPU_ARCH_FPA,    NULL),
24075   ARM_CPU_OPT ("arm1",          ARM_ARCH_V1,     FPU_ARCH_FPA,    NULL),
24076   ARM_CPU_OPT ("arm2",          ARM_ARCH_V2,     FPU_ARCH_FPA,    NULL),
24077   ARM_CPU_OPT ("arm250",        ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
24078   ARM_CPU_OPT ("arm3",          ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
24079   ARM_CPU_OPT ("arm6",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24080   ARM_CPU_OPT ("arm60",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24081   ARM_CPU_OPT ("arm600",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24082   ARM_CPU_OPT ("arm610",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24083   ARM_CPU_OPT ("arm620",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24084   ARM_CPU_OPT ("arm7",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24085   ARM_CPU_OPT ("arm7m",         ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
24086   ARM_CPU_OPT ("arm7d",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24087   ARM_CPU_OPT ("arm7dm",        ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
24088   ARM_CPU_OPT ("arm7di",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24089   ARM_CPU_OPT ("arm7dmi",       ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
24090   ARM_CPU_OPT ("arm70",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24091   ARM_CPU_OPT ("arm700",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24092   ARM_CPU_OPT ("arm700i",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24093   ARM_CPU_OPT ("arm710",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24094   ARM_CPU_OPT ("arm710t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24095   ARM_CPU_OPT ("arm720",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24096   ARM_CPU_OPT ("arm720t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24097   ARM_CPU_OPT ("arm740t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24098   ARM_CPU_OPT ("arm710c",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24099   ARM_CPU_OPT ("arm7100",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24100   ARM_CPU_OPT ("arm7500",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24101   ARM_CPU_OPT ("arm7500fe",     ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24102   ARM_CPU_OPT ("arm7t",         ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24103   ARM_CPU_OPT ("arm7tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24104   ARM_CPU_OPT ("arm7tdmi-s",    ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24105   ARM_CPU_OPT ("arm8",          ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24106   ARM_CPU_OPT ("arm810",        ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24107   ARM_CPU_OPT ("strongarm",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24108   ARM_CPU_OPT ("strongarm1",    ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24109   ARM_CPU_OPT ("strongarm110",  ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24110   ARM_CPU_OPT ("strongarm1100", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24111   ARM_CPU_OPT ("strongarm1110", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24112   ARM_CPU_OPT ("arm9",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24113   ARM_CPU_OPT ("arm920",        ARM_ARCH_V4T,    FPU_ARCH_FPA,    "ARM920T"),
24114   ARM_CPU_OPT ("arm920t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24115   ARM_CPU_OPT ("arm922t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24116   ARM_CPU_OPT ("arm940t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24117   ARM_CPU_OPT ("arm9tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24118   ARM_CPU_OPT ("fa526",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24119   ARM_CPU_OPT ("fa626",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24120   /* For V5 or later processors we default to using VFP; but the user
24121      should really set the FPU type explicitly.  */
24122   ARM_CPU_OPT ("arm9e-r0",      ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
24123   ARM_CPU_OPT ("arm9e",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24124   ARM_CPU_OPT ("arm926ej",      ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
24125   ARM_CPU_OPT ("arm926ejs",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
24126   ARM_CPU_OPT ("arm926ej-s",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
24127   ARM_CPU_OPT ("arm946e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
24128   ARM_CPU_OPT ("arm946e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM946E-S"),
24129   ARM_CPU_OPT ("arm946e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24130   ARM_CPU_OPT ("arm966e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
24131   ARM_CPU_OPT ("arm966e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM966E-S"),
24132   ARM_CPU_OPT ("arm966e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24133   ARM_CPU_OPT ("arm968e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24134   ARM_CPU_OPT ("arm10t",        ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
24135   ARM_CPU_OPT ("arm10tdmi",     ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
24136   ARM_CPU_OPT ("arm10e",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24137   ARM_CPU_OPT ("arm1020",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM1020E"),
24138   ARM_CPU_OPT ("arm1020t",      ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
24139   ARM_CPU_OPT ("arm1020e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24140   ARM_CPU_OPT ("arm1022e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24141   ARM_CPU_OPT ("arm1026ejs",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2,
24142                                                                  "ARM1026EJ-S"),
24143   ARM_CPU_OPT ("arm1026ej-s",   ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
24144   ARM_CPU_OPT ("fa606te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24145   ARM_CPU_OPT ("fa616te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24146   ARM_CPU_OPT ("fa626te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24147   ARM_CPU_OPT ("fmp626",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24148   ARM_CPU_OPT ("fa726te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24149   ARM_CPU_OPT ("arm1136js",     ARM_ARCH_V6,     FPU_NONE,        "ARM1136J-S"),
24150   ARM_CPU_OPT ("arm1136j-s",    ARM_ARCH_V6,     FPU_NONE,        NULL),
24151   ARM_CPU_OPT ("arm1136jfs",    ARM_ARCH_V6,     FPU_ARCH_VFP_V2,
24152                                                                  "ARM1136JF-S"),
24153   ARM_CPU_OPT ("arm1136jf-s",   ARM_ARCH_V6,     FPU_ARCH_VFP_V2, NULL),
24154   ARM_CPU_OPT ("mpcore",        ARM_ARCH_V6K,    FPU_ARCH_VFP_V2, "MPCore"),
24155   ARM_CPU_OPT ("mpcorenovfp",   ARM_ARCH_V6K,    FPU_NONE,        "MPCore"),
24156   ARM_CPU_OPT ("arm1156t2-s",   ARM_ARCH_V6T2,   FPU_NONE,        NULL),
24157   ARM_CPU_OPT ("arm1156t2f-s",  ARM_ARCH_V6T2,   FPU_ARCH_VFP_V2, NULL),
24158   ARM_CPU_OPT ("arm1176jz-s",   ARM_ARCH_V6ZK,   FPU_NONE,        NULL),
24159   ARM_CPU_OPT ("arm1176jzf-s",  ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2, NULL),
24160   ARM_CPU_OPT ("cortex-a5",     ARM_ARCH_V7A_MP_SEC,
24161                                                  FPU_NONE,        "Cortex-A5"),
24162   ARM_CPU_OPT ("cortex-a7",     ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24163                                                                   "Cortex-A7"),
24164   ARM_CPU_OPT ("cortex-a8",     ARM_ARCH_V7A_SEC,
24165                                                  ARM_FEATURE (0, FPU_VFP_V3
24166                                                         | FPU_NEON_EXT_V1),
24167                                                                   "Cortex-A8"),
24168   ARM_CPU_OPT ("cortex-a9",     ARM_ARCH_V7A_MP_SEC,
24169                                                  ARM_FEATURE (0, FPU_VFP_V3
24170                                                         | FPU_NEON_EXT_V1),
24171                                                                   "Cortex-A9"),
24172   ARM_CPU_OPT ("cortex-a12",    ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24173                                                                   "Cortex-A12"),
24174   ARM_CPU_OPT ("cortex-a15",    ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24175                                                                   "Cortex-A15"),
24176   ARM_CPU_OPT ("cortex-a53",    ARM_ARCH_V8A,    FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24177                                                                   "Cortex-A53"),
24178   ARM_CPU_OPT ("cortex-a57",    ARM_ARCH_V8A,    FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24179                                                                   "Cortex-A57"),
24180   ARM_CPU_OPT ("cortex-r4",     ARM_ARCH_V7R,    FPU_NONE,        "Cortex-R4"),
24181   ARM_CPU_OPT ("cortex-r4f",    ARM_ARCH_V7R,    FPU_ARCH_VFP_V3D16,
24182                                                                   "Cortex-R4F"),
24183   ARM_CPU_OPT ("cortex-r5",     ARM_ARCH_V7R_IDIV,
24184                                                  FPU_NONE,        "Cortex-R5"),
24185   ARM_CPU_OPT ("cortex-r7",     ARM_ARCH_V7R_IDIV,
24186                                                  FPU_ARCH_VFP_V3D16,
24187                                                                   "Cortex-R7"),
24188   ARM_CPU_OPT ("cortex-m4",     ARM_ARCH_V7EM,   FPU_NONE,        "Cortex-M4"),
24189   ARM_CPU_OPT ("cortex-m3",     ARM_ARCH_V7M,    FPU_NONE,        "Cortex-M3"),
24190   ARM_CPU_OPT ("cortex-m1",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M1"),
24191   ARM_CPU_OPT ("cortex-m0",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0"),
24192   ARM_CPU_OPT ("cortex-m0plus", ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0+"),
24193   /* ??? XSCALE is really an architecture.  */
24194   ARM_CPU_OPT ("xscale",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
24195   /* ??? iwmmxt is not a processor.  */
24196   ARM_CPU_OPT ("iwmmxt",        ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL),
24197   ARM_CPU_OPT ("iwmmxt2",       ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL),
24198   ARM_CPU_OPT ("i80200",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
24199   /* Maverick */
24200   ARM_CPU_OPT ("ep9312",        ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK),
24201                                                  FPU_ARCH_MAVERICK, "ARM920T"),
24202   /* Marvell processors.  */
24203   ARM_CPU_OPT ("marvell-pj4",   ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC, 0),
24204                                                 FPU_ARCH_VFP_V3D16, NULL),
24205
24206   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
24207 };
24208 #undef ARM_CPU_OPT
24209
24210 struct arm_arch_option_table
24211 {
24212   char *name;
24213   size_t name_len;
24214   const arm_feature_set value;
24215   const arm_feature_set default_fpu;
24216 };
24217
24218 /* This list should, at a minimum, contain all the architecture names
24219    recognized by GCC.  */
24220 #define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF }
24221 static const struct arm_arch_option_table arm_archs[] =
24222 {
24223   ARM_ARCH_OPT ("all",          ARM_ANY,         FPU_ARCH_FPA),
24224   ARM_ARCH_OPT ("armv1",        ARM_ARCH_V1,     FPU_ARCH_FPA),
24225   ARM_ARCH_OPT ("armv2",        ARM_ARCH_V2,     FPU_ARCH_FPA),
24226   ARM_ARCH_OPT ("armv2a",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
24227   ARM_ARCH_OPT ("armv2s",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
24228   ARM_ARCH_OPT ("armv3",        ARM_ARCH_V3,     FPU_ARCH_FPA),
24229   ARM_ARCH_OPT ("armv3m",       ARM_ARCH_V3M,    FPU_ARCH_FPA),
24230   ARM_ARCH_OPT ("armv4",        ARM_ARCH_V4,     FPU_ARCH_FPA),
24231   ARM_ARCH_OPT ("armv4xm",      ARM_ARCH_V4xM,   FPU_ARCH_FPA),
24232   ARM_ARCH_OPT ("armv4t",       ARM_ARCH_V4T,    FPU_ARCH_FPA),
24233   ARM_ARCH_OPT ("armv4txm",     ARM_ARCH_V4TxM,  FPU_ARCH_FPA),
24234   ARM_ARCH_OPT ("armv5",        ARM_ARCH_V5,     FPU_ARCH_VFP),
24235   ARM_ARCH_OPT ("armv5t",       ARM_ARCH_V5T,    FPU_ARCH_VFP),
24236   ARM_ARCH_OPT ("armv5txm",     ARM_ARCH_V5TxM,  FPU_ARCH_VFP),
24237   ARM_ARCH_OPT ("armv5te",      ARM_ARCH_V5TE,   FPU_ARCH_VFP),
24238   ARM_ARCH_OPT ("armv5texp",    ARM_ARCH_V5TExP, FPU_ARCH_VFP),
24239   ARM_ARCH_OPT ("armv5tej",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP),
24240   ARM_ARCH_OPT ("armv6",        ARM_ARCH_V6,     FPU_ARCH_VFP),
24241   ARM_ARCH_OPT ("armv6j",       ARM_ARCH_V6,     FPU_ARCH_VFP),
24242   ARM_ARCH_OPT ("armv6k",       ARM_ARCH_V6K,    FPU_ARCH_VFP),
24243   ARM_ARCH_OPT ("armv6z",       ARM_ARCH_V6Z,    FPU_ARCH_VFP),
24244   ARM_ARCH_OPT ("armv6zk",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP),
24245   ARM_ARCH_OPT ("armv6t2",      ARM_ARCH_V6T2,   FPU_ARCH_VFP),
24246   ARM_ARCH_OPT ("armv6kt2",     ARM_ARCH_V6KT2,  FPU_ARCH_VFP),
24247   ARM_ARCH_OPT ("armv6zt2",     ARM_ARCH_V6ZT2,  FPU_ARCH_VFP),
24248   ARM_ARCH_OPT ("armv6zkt2",    ARM_ARCH_V6ZKT2, FPU_ARCH_VFP),
24249   ARM_ARCH_OPT ("armv6-m",      ARM_ARCH_V6M,    FPU_ARCH_VFP),
24250   ARM_ARCH_OPT ("armv6s-m",     ARM_ARCH_V6SM,   FPU_ARCH_VFP),
24251   ARM_ARCH_OPT ("armv7",        ARM_ARCH_V7,     FPU_ARCH_VFP),
24252   /* The official spelling of the ARMv7 profile variants is the dashed form.
24253      Accept the non-dashed form for compatibility with old toolchains.  */
24254   ARM_ARCH_OPT ("armv7a",       ARM_ARCH_V7A,    FPU_ARCH_VFP),
24255   ARM_ARCH_OPT ("armv7ve",      ARM_ARCH_V7VE,   FPU_ARCH_VFP),
24256   ARM_ARCH_OPT ("armv7r",       ARM_ARCH_V7R,    FPU_ARCH_VFP),
24257   ARM_ARCH_OPT ("armv7m",       ARM_ARCH_V7M,    FPU_ARCH_VFP),
24258   ARM_ARCH_OPT ("armv7-a",      ARM_ARCH_V7A,    FPU_ARCH_VFP),
24259   ARM_ARCH_OPT ("armv7-r",      ARM_ARCH_V7R,    FPU_ARCH_VFP),
24260   ARM_ARCH_OPT ("armv7-m",      ARM_ARCH_V7M,    FPU_ARCH_VFP),
24261   ARM_ARCH_OPT ("armv7e-m",     ARM_ARCH_V7EM,   FPU_ARCH_VFP),
24262   ARM_ARCH_OPT ("armv8-a",      ARM_ARCH_V8A,    FPU_ARCH_VFP),
24263   ARM_ARCH_OPT ("xscale",       ARM_ARCH_XSCALE, FPU_ARCH_VFP),
24264   ARM_ARCH_OPT ("iwmmxt",       ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
24265   ARM_ARCH_OPT ("iwmmxt2",      ARM_ARCH_IWMMXT2,FPU_ARCH_VFP),
24266   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
24267 };
24268 #undef ARM_ARCH_OPT
24269
24270 /* ISA extensions in the co-processor and main instruction set space.  */
24271 struct arm_option_extension_value_table
24272 {
24273   char *name;
24274   size_t name_len;
24275   const arm_feature_set value;
24276   const arm_feature_set allowed_archs;
24277 };
24278
24279 /* The following table must be in alphabetical order with a NULL last entry.
24280    */
24281 #define ARM_EXT_OPT(N, V, AA) { N, sizeof (N) - 1, V, AA }
24282 static const struct arm_option_extension_value_table arm_extensions[] =
24283 {
24284   ARM_EXT_OPT ("crc",  ARCH_CRC_ARMV8, ARM_FEATURE (ARM_EXT_V8, 0)),
24285   ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24286                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24287   ARM_EXT_OPT ("fp",     FPU_ARCH_VFP_ARMV8,
24288                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24289   ARM_EXT_OPT ("idiv",  ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
24290                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
24291   ARM_EXT_OPT ("iwmmxt",ARM_FEATURE (0, ARM_CEXT_IWMMXT),       ARM_ANY),
24292   ARM_EXT_OPT ("iwmmxt2",
24293                         ARM_FEATURE (0, ARM_CEXT_IWMMXT2),      ARM_ANY),
24294   ARM_EXT_OPT ("maverick",
24295                         ARM_FEATURE (0, ARM_CEXT_MAVERICK),     ARM_ANY),
24296   ARM_EXT_OPT ("mp",    ARM_FEATURE (ARM_EXT_MP, 0),
24297                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
24298   ARM_EXT_OPT ("simd",   FPU_ARCH_NEON_VFP_ARMV8,
24299                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24300   ARM_EXT_OPT ("os",    ARM_FEATURE (ARM_EXT_OS, 0),
24301                                    ARM_FEATURE (ARM_EXT_V6M, 0)),
24302   ARM_EXT_OPT ("sec",   ARM_FEATURE (ARM_EXT_SEC, 0),
24303                                    ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)),
24304   ARM_EXT_OPT ("virt",  ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV
24305                                      | ARM_EXT_DIV, 0),
24306                                    ARM_FEATURE (ARM_EXT_V7A, 0)),
24307   ARM_EXT_OPT ("xscale",ARM_FEATURE (0, ARM_CEXT_XSCALE),       ARM_ANY),
24308   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
24309 };
24310 #undef ARM_EXT_OPT
24311
24312 /* ISA floating-point and Advanced SIMD extensions.  */
24313 struct arm_option_fpu_value_table
24314 {
24315   char *name;
24316   const arm_feature_set value;
24317 };
24318
24319 /* This list should, at a minimum, contain all the fpu names
24320    recognized by GCC.  */
24321 static const struct arm_option_fpu_value_table arm_fpus[] =
24322 {
24323   {"softfpa",           FPU_NONE},
24324   {"fpe",               FPU_ARCH_FPE},
24325   {"fpe2",              FPU_ARCH_FPE},
24326   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
24327   {"fpa",               FPU_ARCH_FPA},
24328   {"fpa10",             FPU_ARCH_FPA},
24329   {"fpa11",             FPU_ARCH_FPA},
24330   {"arm7500fe",         FPU_ARCH_FPA},
24331   {"softvfp",           FPU_ARCH_VFP},
24332   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
24333   {"vfp",               FPU_ARCH_VFP_V2},
24334   {"vfp9",              FPU_ARCH_VFP_V2},
24335   {"vfp3",              FPU_ARCH_VFP_V3}, /* For backwards compatbility.  */
24336   {"vfp10",             FPU_ARCH_VFP_V2},
24337   {"vfp10-r0",          FPU_ARCH_VFP_V1},
24338   {"vfpxd",             FPU_ARCH_VFP_V1xD},
24339   {"vfpv2",             FPU_ARCH_VFP_V2},
24340   {"vfpv3",             FPU_ARCH_VFP_V3},
24341   {"vfpv3-fp16",        FPU_ARCH_VFP_V3_FP16},
24342   {"vfpv3-d16",         FPU_ARCH_VFP_V3D16},
24343   {"vfpv3-d16-fp16",    FPU_ARCH_VFP_V3D16_FP16},
24344   {"vfpv3xd",           FPU_ARCH_VFP_V3xD},
24345   {"vfpv3xd-fp16",      FPU_ARCH_VFP_V3xD_FP16},
24346   {"arm1020t",          FPU_ARCH_VFP_V1},
24347   {"arm1020e",          FPU_ARCH_VFP_V2},
24348   {"arm1136jfs",        FPU_ARCH_VFP_V2},
24349   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
24350   {"maverick",          FPU_ARCH_MAVERICK},
24351   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
24352   {"neon-fp16",         FPU_ARCH_NEON_FP16},
24353   {"vfpv4",             FPU_ARCH_VFP_V4},
24354   {"vfpv4-d16",         FPU_ARCH_VFP_V4D16},
24355   {"fpv4-sp-d16",       FPU_ARCH_VFP_V4_SP_D16},
24356   {"neon-vfpv4",        FPU_ARCH_NEON_VFP_V4},
24357   {"fp-armv8",          FPU_ARCH_VFP_ARMV8},
24358   {"neon-fp-armv8",     FPU_ARCH_NEON_VFP_ARMV8},
24359   {"crypto-neon-fp-armv8",
24360                         FPU_ARCH_CRYPTO_NEON_VFP_ARMV8},
24361   {NULL,                ARM_ARCH_NONE}
24362 };
24363
24364 struct arm_option_value_table
24365 {
24366   char *name;
24367   long value;
24368 };
24369
24370 static const struct arm_option_value_table arm_float_abis[] =
24371 {
24372   {"hard",      ARM_FLOAT_ABI_HARD},
24373   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
24374   {"soft",      ARM_FLOAT_ABI_SOFT},
24375   {NULL,        0}
24376 };
24377
24378 #ifdef OBJ_ELF
24379 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
24380 static const struct arm_option_value_table arm_eabis[] =
24381 {
24382   {"gnu",       EF_ARM_EABI_UNKNOWN},
24383   {"4",         EF_ARM_EABI_VER4},
24384   {"5",         EF_ARM_EABI_VER5},
24385   {NULL,        0}
24386 };
24387 #endif
24388
24389 struct arm_long_option_table
24390 {
24391   char * option;                /* Substring to match.  */
24392   char * help;                  /* Help information.  */
24393   int (* func) (char * subopt); /* Function to decode sub-option.  */
24394   char * deprecated;            /* If non-null, print this message.  */
24395 };
24396
24397 static bfd_boolean
24398 arm_parse_extension (char *str, const arm_feature_set **opt_p)
24399 {
24400   arm_feature_set *ext_set = (arm_feature_set *)
24401       xmalloc (sizeof (arm_feature_set));
24402
24403   /* We insist on extensions being specified in alphabetical order, and with
24404      extensions being added before being removed.  We achieve this by having
24405      the global ARM_EXTENSIONS table in alphabetical order, and using the
24406      ADDING_VALUE variable to indicate whether we are adding an extension (1)
24407      or removing it (0) and only allowing it to change in the order
24408      -1 -> 1 -> 0.  */
24409   const struct arm_option_extension_value_table * opt = NULL;
24410   int adding_value = -1;
24411
24412   /* Copy the feature set, so that we can modify it.  */
24413   *ext_set = **opt_p;
24414   *opt_p = ext_set;
24415
24416   while (str != NULL && *str != 0)
24417     {
24418       char *ext;
24419       size_t len;
24420
24421       if (*str != '+')
24422         {
24423           as_bad (_("invalid architectural extension"));
24424           return FALSE;
24425         }
24426
24427       str++;
24428       ext = strchr (str, '+');
24429
24430       if (ext != NULL)
24431         len = ext - str;
24432       else
24433         len = strlen (str);
24434
24435       if (len >= 2 && strncmp (str, "no", 2) == 0)
24436         {
24437           if (adding_value != 0)
24438             {
24439               adding_value = 0;
24440               opt = arm_extensions;
24441             }
24442
24443           len -= 2;
24444           str += 2;
24445         }
24446       else if (len > 0)
24447         {
24448           if (adding_value == -1)
24449             {
24450               adding_value = 1;
24451               opt = arm_extensions;
24452             }
24453           else if (adding_value != 1)
24454             {
24455               as_bad (_("must specify extensions to add before specifying "
24456                         "those to remove"));
24457               return FALSE;
24458             }
24459         }
24460
24461       if (len == 0)
24462         {
24463           as_bad (_("missing architectural extension"));
24464           return FALSE;
24465         }
24466
24467       gas_assert (adding_value != -1);
24468       gas_assert (opt != NULL);
24469
24470       /* Scan over the options table trying to find an exact match. */
24471       for (; opt->name != NULL; opt++)
24472         if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24473           {
24474             /* Check we can apply the extension to this architecture.  */
24475             if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
24476               {
24477                 as_bad (_("extension does not apply to the base architecture"));
24478                 return FALSE;
24479               }
24480
24481             /* Add or remove the extension.  */
24482             if (adding_value)
24483               ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
24484             else
24485               ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
24486
24487             break;
24488           }
24489
24490       if (opt->name == NULL)
24491         {
24492           /* Did we fail to find an extension because it wasn't specified in
24493              alphabetical order, or because it does not exist?  */
24494
24495           for (opt = arm_extensions; opt->name != NULL; opt++)
24496             if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24497               break;
24498
24499           if (opt->name == NULL)
24500             as_bad (_("unknown architectural extension `%s'"), str);
24501           else
24502             as_bad (_("architectural extensions must be specified in "
24503                       "alphabetical order"));
24504
24505           return FALSE;
24506         }
24507       else
24508         {
24509           /* We should skip the extension we've just matched the next time
24510              round.  */
24511           opt++;
24512         }
24513
24514       str = ext;
24515     };
24516
24517   return TRUE;
24518 }
24519
24520 static bfd_boolean
24521 arm_parse_cpu (char *str)
24522 {
24523   const struct arm_cpu_option_table *opt;
24524   char *ext = strchr (str, '+');
24525   size_t len;
24526
24527   if (ext != NULL)
24528     len = ext - str;
24529   else
24530     len = strlen (str);
24531
24532   if (len == 0)
24533     {
24534       as_bad (_("missing cpu name `%s'"), str);
24535       return FALSE;
24536     }
24537
24538   for (opt = arm_cpus; opt->name != NULL; opt++)
24539     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24540       {
24541         mcpu_cpu_opt = &opt->value;
24542         mcpu_fpu_opt = &opt->default_fpu;
24543         if (opt->canonical_name)
24544           strcpy (selected_cpu_name, opt->canonical_name);
24545         else
24546           {
24547             size_t i;
24548
24549             for (i = 0; i < len; i++)
24550               selected_cpu_name[i] = TOUPPER (opt->name[i]);
24551             selected_cpu_name[i] = 0;
24552           }
24553
24554         if (ext != NULL)
24555           return arm_parse_extension (ext, &mcpu_cpu_opt);
24556
24557         return TRUE;
24558       }
24559
24560   as_bad (_("unknown cpu `%s'"), str);
24561   return FALSE;
24562 }
24563
24564 static bfd_boolean
24565 arm_parse_arch (char *str)
24566 {
24567   const struct arm_arch_option_table *opt;
24568   char *ext = strchr (str, '+');
24569   size_t len;
24570
24571   if (ext != NULL)
24572     len = ext - str;
24573   else
24574     len = strlen (str);
24575
24576   if (len == 0)
24577     {
24578       as_bad (_("missing architecture name `%s'"), str);
24579       return FALSE;
24580     }
24581
24582   for (opt = arm_archs; opt->name != NULL; opt++)
24583     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24584       {
24585         march_cpu_opt = &opt->value;
24586         march_fpu_opt = &opt->default_fpu;
24587         strcpy (selected_cpu_name, opt->name);
24588
24589         if (ext != NULL)
24590           return arm_parse_extension (ext, &march_cpu_opt);
24591
24592         return TRUE;
24593       }
24594
24595   as_bad (_("unknown architecture `%s'\n"), str);
24596   return FALSE;
24597 }
24598
24599 static bfd_boolean
24600 arm_parse_fpu (char * str)
24601 {
24602   const struct arm_option_fpu_value_table * opt;
24603
24604   for (opt = arm_fpus; opt->name != NULL; opt++)
24605     if (streq (opt->name, str))
24606       {
24607         mfpu_opt = &opt->value;
24608         return TRUE;
24609       }
24610
24611   as_bad (_("unknown floating point format `%s'\n"), str);
24612   return FALSE;
24613 }
24614
24615 static bfd_boolean
24616 arm_parse_float_abi (char * str)
24617 {
24618   const struct arm_option_value_table * opt;
24619
24620   for (opt = arm_float_abis; opt->name != NULL; opt++)
24621     if (streq (opt->name, str))
24622       {
24623         mfloat_abi_opt = opt->value;
24624         return TRUE;
24625       }
24626
24627   as_bad (_("unknown floating point abi `%s'\n"), str);
24628   return FALSE;
24629 }
24630
24631 #ifdef OBJ_ELF
24632 static bfd_boolean
24633 arm_parse_eabi (char * str)
24634 {
24635   const struct arm_option_value_table *opt;
24636
24637   for (opt = arm_eabis; opt->name != NULL; opt++)
24638     if (streq (opt->name, str))
24639       {
24640         meabi_flags = opt->value;
24641         return TRUE;
24642       }
24643   as_bad (_("unknown EABI `%s'\n"), str);
24644   return FALSE;
24645 }
24646 #endif
24647
24648 static bfd_boolean
24649 arm_parse_it_mode (char * str)
24650 {
24651   bfd_boolean ret = TRUE;
24652
24653   if (streq ("arm", str))
24654     implicit_it_mode = IMPLICIT_IT_MODE_ARM;
24655   else if (streq ("thumb", str))
24656     implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
24657   else if (streq ("always", str))
24658     implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
24659   else if (streq ("never", str))
24660     implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
24661   else
24662     {
24663       as_bad (_("unknown implicit IT mode `%s', should be "\
24664                 "arm, thumb, always, or never."), str);
24665       ret = FALSE;
24666     }
24667
24668   return ret;
24669 }
24670
24671 static bfd_boolean
24672 arm_ccs_mode (char * unused ATTRIBUTE_UNUSED)
24673 {
24674   codecomposer_syntax = TRUE;
24675   arm_comment_chars[0] = ';';
24676   arm_line_separator_chars[0] = 0;
24677   return TRUE;
24678 }
24679
24680 struct arm_long_option_table arm_long_opts[] =
24681 {
24682   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
24683    arm_parse_cpu, NULL},
24684   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
24685    arm_parse_arch, NULL},
24686   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
24687    arm_parse_fpu, NULL},
24688   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
24689    arm_parse_float_abi, NULL},
24690 #ifdef OBJ_ELF
24691   {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
24692    arm_parse_eabi, NULL},
24693 #endif
24694   {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
24695    arm_parse_it_mode, NULL},
24696   {"mccs", N_("\t\t\t  TI CodeComposer Studio syntax compatibility mode"),
24697    arm_ccs_mode, NULL},
24698   {NULL, NULL, 0, NULL}
24699 };
24700
24701 int
24702 md_parse_option (int c, char * arg)
24703 {
24704   struct arm_option_table *opt;
24705   const struct arm_legacy_option_table *fopt;
24706   struct arm_long_option_table *lopt;
24707
24708   switch (c)
24709     {
24710 #ifdef OPTION_EB
24711     case OPTION_EB:
24712       target_big_endian = 1;
24713       break;
24714 #endif
24715
24716 #ifdef OPTION_EL
24717     case OPTION_EL:
24718       target_big_endian = 0;
24719       break;
24720 #endif
24721
24722     case OPTION_FIX_V4BX:
24723       fix_v4bx = TRUE;
24724       break;
24725
24726     case 'a':
24727       /* Listing option.  Just ignore these, we don't support additional
24728          ones.  */
24729       return 0;
24730
24731     default:
24732       for (opt = arm_opts; opt->option != NULL; opt++)
24733         {
24734           if (c == opt->option[0]
24735               && ((arg == NULL && opt->option[1] == 0)
24736                   || streq (arg, opt->option + 1)))
24737             {
24738               /* If the option is deprecated, tell the user.  */
24739               if (warn_on_deprecated && opt->deprecated != NULL)
24740                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24741                            arg ? arg : "", _(opt->deprecated));
24742
24743               if (opt->var != NULL)
24744                 *opt->var = opt->value;
24745
24746               return 1;
24747             }
24748         }
24749
24750       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
24751         {
24752           if (c == fopt->option[0]
24753               && ((arg == NULL && fopt->option[1] == 0)
24754                   || streq (arg, fopt->option + 1)))
24755             {
24756               /* If the option is deprecated, tell the user.  */
24757               if (warn_on_deprecated && fopt->deprecated != NULL)
24758                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24759                            arg ? arg : "", _(fopt->deprecated));
24760
24761               if (fopt->var != NULL)
24762                 *fopt->var = &fopt->value;
24763
24764               return 1;
24765             }
24766         }
24767
24768       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24769         {
24770           /* These options are expected to have an argument.  */
24771           if (c == lopt->option[0]
24772               && arg != NULL
24773               && strncmp (arg, lopt->option + 1,
24774                           strlen (lopt->option + 1)) == 0)
24775             {
24776               /* If the option is deprecated, tell the user.  */
24777               if (warn_on_deprecated && lopt->deprecated != NULL)
24778                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
24779                            _(lopt->deprecated));
24780
24781               /* Call the sup-option parser.  */
24782               return lopt->func (arg + strlen (lopt->option) - 1);
24783             }
24784         }
24785
24786       return 0;
24787     }
24788
24789   return 1;
24790 }
24791
24792 void
24793 md_show_usage (FILE * fp)
24794 {
24795   struct arm_option_table *opt;
24796   struct arm_long_option_table *lopt;
24797
24798   fprintf (fp, _(" ARM-specific assembler options:\n"));
24799
24800   for (opt = arm_opts; opt->option != NULL; opt++)
24801     if (opt->help != NULL)
24802       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
24803
24804   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24805     if (lopt->help != NULL)
24806       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
24807
24808 #ifdef OPTION_EB
24809   fprintf (fp, _("\
24810   -EB                     assemble code for a big-endian cpu\n"));
24811 #endif
24812
24813 #ifdef OPTION_EL
24814   fprintf (fp, _("\
24815   -EL                     assemble code for a little-endian cpu\n"));
24816 #endif
24817
24818   fprintf (fp, _("\
24819   --fix-v4bx              Allow BX in ARMv4 code\n"));
24820 }
24821
24822
24823 #ifdef OBJ_ELF
24824 typedef struct
24825 {
24826   int val;
24827   arm_feature_set flags;
24828 } cpu_arch_ver_table;
24829
24830 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
24831    least features first.  */
24832 static const cpu_arch_ver_table cpu_arch_ver[] =
24833 {
24834     {1, ARM_ARCH_V4},
24835     {2, ARM_ARCH_V4T},
24836     {3, ARM_ARCH_V5},
24837     {3, ARM_ARCH_V5T},
24838     {4, ARM_ARCH_V5TE},
24839     {5, ARM_ARCH_V5TEJ},
24840     {6, ARM_ARCH_V6},
24841     {9, ARM_ARCH_V6K},
24842     {7, ARM_ARCH_V6Z},
24843     {11, ARM_ARCH_V6M},
24844     {12, ARM_ARCH_V6SM},
24845     {8, ARM_ARCH_V6T2},
24846     {10, ARM_ARCH_V7VE},
24847     {10, ARM_ARCH_V7R},
24848     {10, ARM_ARCH_V7M},
24849     {14, ARM_ARCH_V8A},
24850     {0, ARM_ARCH_NONE}
24851 };
24852
24853 /* Set an attribute if it has not already been set by the user.  */
24854 static void
24855 aeabi_set_attribute_int (int tag, int value)
24856 {
24857   if (tag < 1
24858       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24859       || !attributes_set_explicitly[tag])
24860     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
24861 }
24862
24863 static void
24864 aeabi_set_attribute_string (int tag, const char *value)
24865 {
24866   if (tag < 1
24867       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24868       || !attributes_set_explicitly[tag])
24869     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
24870 }
24871
24872 /* Set the public EABI object attributes.  */
24873 static void
24874 aeabi_set_public_attributes (void)
24875 {
24876   int arch;
24877   char profile;
24878   int virt_sec = 0;
24879   int fp16_optional = 0;
24880   arm_feature_set flags;
24881   arm_feature_set tmp;
24882   const cpu_arch_ver_table *p;
24883
24884   /* Choose the architecture based on the capabilities of the requested cpu
24885      (if any) and/or the instructions actually used.  */
24886   ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
24887   ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
24888   ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
24889
24890   if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
24891     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
24892
24893   if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
24894     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
24895
24896   /* Allow the user to override the reported architecture.  */
24897   if (object_arch)
24898     {
24899       ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
24900       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
24901     }
24902
24903   /* We need to make sure that the attributes do not identify us as v6S-M
24904      when the only v6S-M feature in use is the Operating System Extensions.  */
24905   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
24906       if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
24907         ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
24908
24909   tmp = flags;
24910   arch = 0;
24911   for (p = cpu_arch_ver; p->val; p++)
24912     {
24913       if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
24914         {
24915           arch = p->val;
24916           ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
24917         }
24918     }
24919
24920   /* The table lookup above finds the last architecture to contribute
24921      a new feature.  Unfortunately, Tag13 is a subset of the union of
24922      v6T2 and v7-M, so it is never seen as contributing a new feature.
24923      We can not search for the last entry which is entirely used,
24924      because if no CPU is specified we build up only those flags
24925      actually used.  Perhaps we should separate out the specified
24926      and implicit cases.  Avoid taking this path for -march=all by
24927      checking for contradictory v7-A / v7-M features.  */
24928   if (arch == 10
24929       && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
24930       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
24931       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
24932     arch = 13;
24933
24934   /* Tag_CPU_name.  */
24935   if (selected_cpu_name[0])
24936     {
24937       char *q;
24938
24939       q = selected_cpu_name;
24940       if (strncmp (q, "armv", 4) == 0)
24941         {
24942           int i;
24943
24944           q += 4;
24945           for (i = 0; q[i]; i++)
24946             q[i] = TOUPPER (q[i]);
24947         }
24948       aeabi_set_attribute_string (Tag_CPU_name, q);
24949     }
24950
24951   /* Tag_CPU_arch.  */
24952   aeabi_set_attribute_int (Tag_CPU_arch, arch);
24953
24954   /* Tag_CPU_arch_profile.  */
24955   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
24956     profile = 'A';
24957   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
24958     profile = 'R';
24959   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
24960     profile = 'M';
24961   else
24962     profile = '\0';
24963
24964   if (profile != '\0')
24965     aeabi_set_attribute_int (Tag_CPU_arch_profile, profile);
24966
24967   /* Tag_ARM_ISA_use.  */
24968   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
24969       || arch == 0)
24970     aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
24971
24972   /* Tag_THUMB_ISA_use.  */
24973   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
24974       || arch == 0)
24975     aeabi_set_attribute_int (Tag_THUMB_ISA_use,
24976         ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
24977
24978   /* Tag_VFP_arch.  */
24979   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_armv8))
24980     aeabi_set_attribute_int (Tag_VFP_arch, 7);
24981   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
24982     aeabi_set_attribute_int (Tag_VFP_arch,
24983                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
24984                              ? 5 : 6);
24985   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
24986     {
24987       fp16_optional = 1;
24988       aeabi_set_attribute_int (Tag_VFP_arch, 3);
24989     }
24990   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
24991     {
24992       aeabi_set_attribute_int (Tag_VFP_arch, 4);
24993       fp16_optional = 1;
24994     }
24995   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
24996     aeabi_set_attribute_int (Tag_VFP_arch, 2);
24997   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
24998            || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
24999     aeabi_set_attribute_int (Tag_VFP_arch, 1);
25000
25001   /* Tag_ABI_HardFP_use.  */
25002   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
25003       && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
25004     aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
25005
25006   /* Tag_WMMX_arch.  */
25007   if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
25008     aeabi_set_attribute_int (Tag_WMMX_arch, 2);
25009   else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
25010     aeabi_set_attribute_int (Tag_WMMX_arch, 1);
25011
25012   /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
25013   if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_armv8))
25014     aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 3);
25015   else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
25016     {
25017       if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma))
25018         {
25019           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 2);
25020         }
25021       else
25022         {
25023           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 1);
25024           fp16_optional = 1;
25025         }
25026     }
25027
25028   /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
25029   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16) && fp16_optional)
25030     aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
25031
25032   /* Tag_DIV_use.
25033
25034      We set Tag_DIV_use to two when integer divide instructions have been used
25035      in ARM state, or when Thumb integer divide instructions have been used,
25036      but we have no architecture profile set, nor have we any ARM instructions.
25037
25038      For ARMv8 we set the tag to 0 as integer divide is implied by the base
25039      architecture.
25040
25041      For new architectures we will have to check these tests.  */
25042   gas_assert (arch <= TAG_CPU_ARCH_V8);
25043   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v8))
25044     aeabi_set_attribute_int (Tag_DIV_use, 0);
25045   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv)
25046            || (profile == '\0'
25047                && ARM_CPU_HAS_FEATURE (flags, arm_ext_div)
25048                && !ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any)))
25049     aeabi_set_attribute_int (Tag_DIV_use, 2);
25050
25051   /* Tag_MP_extension_use.  */
25052   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
25053     aeabi_set_attribute_int (Tag_MPextension_use, 1);
25054
25055   /* Tag Virtualization_use.  */
25056   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
25057     virt_sec |= 1;
25058   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
25059     virt_sec |= 2;
25060   if (virt_sec != 0)
25061     aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
25062 }
25063
25064 /* Add the default contents for the .ARM.attributes section.  */
25065 void
25066 arm_md_end (void)
25067 {
25068   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
25069     return;
25070
25071   aeabi_set_public_attributes ();
25072 }
25073 #endif /* OBJ_ELF */
25074
25075
25076 /* Parse a .cpu directive.  */
25077
25078 static void
25079 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
25080 {
25081   const struct arm_cpu_option_table *opt;
25082   char *name;
25083   char saved_char;
25084
25085   name = input_line_pointer;
25086   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25087     input_line_pointer++;
25088   saved_char = *input_line_pointer;
25089   *input_line_pointer = 0;
25090
25091   /* Skip the first "all" entry.  */
25092   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
25093     if (streq (opt->name, name))
25094       {
25095         mcpu_cpu_opt = &opt->value;
25096         selected_cpu = opt->value;
25097         if (opt->canonical_name)
25098           strcpy (selected_cpu_name, opt->canonical_name);
25099         else
25100           {
25101             int i;
25102             for (i = 0; opt->name[i]; i++)
25103               selected_cpu_name[i] = TOUPPER (opt->name[i]);
25104
25105             selected_cpu_name[i] = 0;
25106           }
25107         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25108         *input_line_pointer = saved_char;
25109         demand_empty_rest_of_line ();
25110         return;
25111       }
25112   as_bad (_("unknown cpu `%s'"), name);
25113   *input_line_pointer = saved_char;
25114   ignore_rest_of_line ();
25115 }
25116
25117
25118 /* Parse a .arch directive.  */
25119
25120 static void
25121 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
25122 {
25123   const struct arm_arch_option_table *opt;
25124   char saved_char;
25125   char *name;
25126
25127   name = input_line_pointer;
25128   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25129     input_line_pointer++;
25130   saved_char = *input_line_pointer;
25131   *input_line_pointer = 0;
25132
25133   /* Skip the first "all" entry.  */
25134   for (opt = arm_archs + 1; opt->name != NULL; opt++)
25135     if (streq (opt->name, name))
25136       {
25137         mcpu_cpu_opt = &opt->value;
25138         selected_cpu = opt->value;
25139         strcpy (selected_cpu_name, opt->name);
25140         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25141         *input_line_pointer = saved_char;
25142         demand_empty_rest_of_line ();
25143         return;
25144       }
25145
25146   as_bad (_("unknown architecture `%s'\n"), name);
25147   *input_line_pointer = saved_char;
25148   ignore_rest_of_line ();
25149 }
25150
25151
25152 /* Parse a .object_arch directive.  */
25153
25154 static void
25155 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
25156 {
25157   const struct arm_arch_option_table *opt;
25158   char saved_char;
25159   char *name;
25160
25161   name = input_line_pointer;
25162   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25163     input_line_pointer++;
25164   saved_char = *input_line_pointer;
25165   *input_line_pointer = 0;
25166
25167   /* Skip the first "all" entry.  */
25168   for (opt = arm_archs + 1; opt->name != NULL; opt++)
25169     if (streq (opt->name, name))
25170       {
25171         object_arch = &opt->value;
25172         *input_line_pointer = saved_char;
25173         demand_empty_rest_of_line ();
25174         return;
25175       }
25176
25177   as_bad (_("unknown architecture `%s'\n"), name);
25178   *input_line_pointer = saved_char;
25179   ignore_rest_of_line ();
25180 }
25181
25182 /* Parse a .arch_extension directive.  */
25183
25184 static void
25185 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
25186 {
25187   const struct arm_option_extension_value_table *opt;
25188   char saved_char;
25189   char *name;
25190   int adding_value = 1;
25191
25192   name = input_line_pointer;
25193   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25194     input_line_pointer++;
25195   saved_char = *input_line_pointer;
25196   *input_line_pointer = 0;
25197
25198   if (strlen (name) >= 2
25199       && strncmp (name, "no", 2) == 0)
25200     {
25201       adding_value = 0;
25202       name += 2;
25203     }
25204
25205   for (opt = arm_extensions; opt->name != NULL; opt++)
25206     if (streq (opt->name, name))
25207       {
25208         if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
25209           {
25210             as_bad (_("architectural extension `%s' is not allowed for the "
25211                       "current base architecture"), name);
25212             break;
25213           }
25214
25215         if (adding_value)
25216           ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
25217         else
25218           ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
25219
25220         mcpu_cpu_opt = &selected_cpu;
25221         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25222         *input_line_pointer = saved_char;
25223         demand_empty_rest_of_line ();
25224         return;
25225       }
25226
25227   if (opt->name == NULL)
25228     as_bad (_("unknown architecture extension `%s'\n"), name);
25229
25230   *input_line_pointer = saved_char;
25231   ignore_rest_of_line ();
25232 }
25233
25234 /* Parse a .fpu directive.  */
25235
25236 static void
25237 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
25238 {
25239   const struct arm_option_fpu_value_table *opt;
25240   char saved_char;
25241   char *name;
25242
25243   name = input_line_pointer;
25244   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25245     input_line_pointer++;
25246   saved_char = *input_line_pointer;
25247   *input_line_pointer = 0;
25248
25249   for (opt = arm_fpus; opt->name != NULL; opt++)
25250     if (streq (opt->name, name))
25251       {
25252         mfpu_opt = &opt->value;
25253         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25254         *input_line_pointer = saved_char;
25255         demand_empty_rest_of_line ();
25256         return;
25257       }
25258
25259   as_bad (_("unknown floating point format `%s'\n"), name);
25260   *input_line_pointer = saved_char;
25261   ignore_rest_of_line ();
25262 }
25263
25264 /* Copy symbol information.  */
25265
25266 void
25267 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
25268 {
25269   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
25270 }
25271
25272 #ifdef OBJ_ELF
25273 /* Given a symbolic attribute NAME, return the proper integer value.
25274    Returns -1 if the attribute is not known.  */
25275
25276 int
25277 arm_convert_symbolic_attribute (const char *name)
25278 {
25279   static const struct
25280   {
25281     const char * name;
25282     const int    tag;
25283   }
25284   attribute_table[] =
25285     {
25286       /* When you modify this table you should
25287          also modify the list in doc/c-arm.texi.  */
25288 #define T(tag) {#tag, tag}
25289       T (Tag_CPU_raw_name),
25290       T (Tag_CPU_name),
25291       T (Tag_CPU_arch),
25292       T (Tag_CPU_arch_profile),
25293       T (Tag_ARM_ISA_use),
25294       T (Tag_THUMB_ISA_use),
25295       T (Tag_FP_arch),
25296       T (Tag_VFP_arch),
25297       T (Tag_WMMX_arch),
25298       T (Tag_Advanced_SIMD_arch),
25299       T (Tag_PCS_config),
25300       T (Tag_ABI_PCS_R9_use),
25301       T (Tag_ABI_PCS_RW_data),
25302       T (Tag_ABI_PCS_RO_data),
25303       T (Tag_ABI_PCS_GOT_use),
25304       T (Tag_ABI_PCS_wchar_t),
25305       T (Tag_ABI_FP_rounding),
25306       T (Tag_ABI_FP_denormal),
25307       T (Tag_ABI_FP_exceptions),
25308       T (Tag_ABI_FP_user_exceptions),
25309       T (Tag_ABI_FP_number_model),
25310       T (Tag_ABI_align_needed),
25311       T (Tag_ABI_align8_needed),
25312       T (Tag_ABI_align_preserved),
25313       T (Tag_ABI_align8_preserved),
25314       T (Tag_ABI_enum_size),
25315       T (Tag_ABI_HardFP_use),
25316       T (Tag_ABI_VFP_args),
25317       T (Tag_ABI_WMMX_args),
25318       T (Tag_ABI_optimization_goals),
25319       T (Tag_ABI_FP_optimization_goals),
25320       T (Tag_compatibility),
25321       T (Tag_CPU_unaligned_access),
25322       T (Tag_FP_HP_extension),
25323       T (Tag_VFP_HP_extension),
25324       T (Tag_ABI_FP_16bit_format),
25325       T (Tag_MPextension_use),
25326       T (Tag_DIV_use),
25327       T (Tag_nodefaults),
25328       T (Tag_also_compatible_with),
25329       T (Tag_conformance),
25330       T (Tag_T2EE_use),
25331       T (Tag_Virtualization_use),
25332       /* We deliberately do not include Tag_MPextension_use_legacy.  */
25333 #undef T
25334     };
25335   unsigned int i;
25336
25337   if (name == NULL)
25338     return -1;
25339
25340   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
25341     if (streq (name, attribute_table[i].name))
25342       return attribute_table[i].tag;
25343
25344   return -1;
25345 }
25346
25347
25348 /* Apply sym value for relocations only in the case that
25349    they are for local symbols and you have the respective
25350    architectural feature for blx and simple switches.  */
25351 int
25352 arm_apply_sym_value (struct fix * fixP)
25353 {
25354   if (fixP->fx_addsy
25355       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
25356       && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
25357     {
25358       switch (fixP->fx_r_type)
25359         {
25360         case BFD_RELOC_ARM_PCREL_BLX:
25361         case BFD_RELOC_THUMB_PCREL_BRANCH23:
25362           if (ARM_IS_FUNC (fixP->fx_addsy))
25363             return 1;
25364           break;
25365
25366         case BFD_RELOC_ARM_PCREL_CALL:
25367         case BFD_RELOC_THUMB_PCREL_BLX:
25368           if (THUMB_IS_FUNC (fixP->fx_addsy))
25369               return 1;
25370           break;
25371
25372         default:
25373           break;
25374         }
25375
25376     }
25377   return 0;
25378 }
25379 #endif /* OBJ_ELF */