gas/ARM: Misses deprecated IT instruction warning for ARMv8
[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   /* NOTE: 0x00dd is not the real encoding, instead, it is the 'tvalue'
17270      field in asm_opcode. 'tvalue' is used at the stage this check happen.  */
17271   { 0x00dd, 0x7fff, N_("ADD/SUB sp, sp #imm") },
17272   { 0, 0, NULL }
17273 };
17274
17275 static void
17276 it_fsm_post_encode (void)
17277 {
17278   int is_last;
17279
17280   if (!now_it.state_handled)
17281     handle_it_state ();
17282
17283   if (now_it.insn_cond
17284       && !now_it.warn_deprecated
17285       && warn_on_deprecated
17286       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
17287     {
17288       if (inst.instruction >= 0x10000)
17289         {
17290           as_warn (_("IT blocks containing 32-bit Thumb instructions are "
17291                      "deprecated in ARMv8"));
17292           now_it.warn_deprecated = TRUE;
17293         }
17294       else
17295         {
17296           const struct depr_insn_mask *p = depr_it_insns;
17297
17298           while (p->mask != 0)
17299             {
17300               if ((inst.instruction & p->mask) == p->pattern)
17301                 {
17302                   as_warn (_("IT blocks containing 16-bit Thumb instructions "
17303                              "of the following class are deprecated in ARMv8: "
17304                              "%s"), p->description);
17305                   now_it.warn_deprecated = TRUE;
17306                   break;
17307                 }
17308
17309               ++p;
17310             }
17311         }
17312
17313       if (now_it.block_length > 1)
17314         {
17315           as_warn (_("IT blocks containing more than one conditional "
17316                      "instruction are deprecated in ARMv8"));
17317           now_it.warn_deprecated = TRUE;
17318         }
17319     }
17320
17321   is_last = (now_it.mask == 0x10);
17322   if (is_last)
17323     {
17324       now_it.state = OUTSIDE_IT_BLOCK;
17325       now_it.mask = 0;
17326     }
17327 }
17328
17329 static void
17330 force_automatic_it_block_close (void)
17331 {
17332   if (now_it.state == AUTOMATIC_IT_BLOCK)
17333     {
17334       close_automatic_it_block ();
17335       now_it.state = OUTSIDE_IT_BLOCK;
17336       now_it.mask = 0;
17337     }
17338 }
17339
17340 static int
17341 in_it_block (void)
17342 {
17343   if (!now_it.state_handled)
17344     handle_it_state ();
17345
17346   return now_it.state != OUTSIDE_IT_BLOCK;
17347 }
17348
17349 void
17350 md_assemble (char *str)
17351 {
17352   char *p = str;
17353   const struct asm_opcode * opcode;
17354
17355   /* Align the previous label if needed.  */
17356   if (last_label_seen != NULL)
17357     {
17358       symbol_set_frag (last_label_seen, frag_now);
17359       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
17360       S_SET_SEGMENT (last_label_seen, now_seg);
17361     }
17362
17363   memset (&inst, '\0', sizeof (inst));
17364   inst.reloc.type = BFD_RELOC_UNUSED;
17365
17366   opcode = opcode_lookup (&p);
17367   if (!opcode)
17368     {
17369       /* It wasn't an instruction, but it might be a register alias of
17370          the form alias .req reg, or a Neon .dn/.qn directive.  */
17371       if (! create_register_alias (str, p)
17372           && ! create_neon_reg_alias (str, p))
17373         as_bad (_("bad instruction `%s'"), str);
17374
17375       return;
17376     }
17377
17378   if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
17379     as_warn (_("s suffix on comparison instruction is deprecated"));
17380
17381   /* The value which unconditional instructions should have in place of the
17382      condition field.  */
17383   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
17384
17385   if (thumb_mode)
17386     {
17387       arm_feature_set variant;
17388
17389       variant = cpu_variant;
17390       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
17391       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
17392         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
17393       /* Check that this instruction is supported for this CPU.  */
17394       if (!opcode->tvariant
17395           || (thumb_mode == 1
17396               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
17397         {
17398           as_bad (_("selected processor does not support Thumb mode `%s'"), str);
17399           return;
17400         }
17401       if (inst.cond != COND_ALWAYS && !unified_syntax
17402           && opcode->tencode != do_t_branch)
17403         {
17404           as_bad (_("Thumb does not support conditional execution"));
17405           return;
17406         }
17407
17408       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
17409         {
17410           if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
17411               && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
17412                    || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
17413             {
17414               /* Two things are addressed here.
17415                  1) Implicit require narrow instructions on Thumb-1.
17416                     This avoids relaxation accidentally introducing Thumb-2
17417                      instructions.
17418                  2) Reject wide instructions in non Thumb-2 cores.  */
17419               if (inst.size_req == 0)
17420                 inst.size_req = 2;
17421               else if (inst.size_req == 4)
17422                 {
17423                   as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
17424                   return;
17425                 }
17426             }
17427         }
17428
17429       inst.instruction = opcode->tvalue;
17430
17431       if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
17432         {
17433           /* Prepare the it_insn_type for those encodings that don't set
17434              it.  */
17435           it_fsm_pre_encode ();
17436
17437           opcode->tencode ();
17438
17439           it_fsm_post_encode ();
17440         }
17441
17442       if (!(inst.error || inst.relax))
17443         {
17444           gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
17445           inst.size = (inst.instruction > 0xffff ? 4 : 2);
17446           if (inst.size_req && inst.size_req != inst.size)
17447             {
17448               as_bad (_("cannot honor width suffix -- `%s'"), str);
17449               return;
17450             }
17451         }
17452
17453       /* Something has gone badly wrong if we try to relax a fixed size
17454          instruction.  */
17455       gas_assert (inst.size_req == 0 || !inst.relax);
17456
17457       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17458                               *opcode->tvariant);
17459       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
17460          set those bits when Thumb-2 32-bit instructions are seen.  ie.
17461          anything other than bl/blx and v6-M instructions.
17462          This is overly pessimistic for relaxable instructions.  */
17463       if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
17464            || inst.relax)
17465           && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
17466                || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
17467         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
17468                                 arm_ext_v6t2);
17469
17470       check_neon_suffixes;
17471
17472       if (!inst.error)
17473         {
17474           mapping_state (MAP_THUMB);
17475         }
17476     }
17477   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
17478     {
17479       bfd_boolean is_bx;
17480
17481       /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
17482       is_bx = (opcode->aencode == do_bx);
17483
17484       /* Check that this instruction is supported for this CPU.  */
17485       if (!(is_bx && fix_v4bx)
17486           && !(opcode->avariant &&
17487                ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
17488         {
17489           as_bad (_("selected processor does not support ARM mode `%s'"), str);
17490           return;
17491         }
17492       if (inst.size_req)
17493         {
17494           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
17495           return;
17496         }
17497
17498       inst.instruction = opcode->avalue;
17499       if (opcode->tag == OT_unconditionalF)
17500         inst.instruction |= 0xF << 28;
17501       else
17502         inst.instruction |= inst.cond << 28;
17503       inst.size = INSN_SIZE;
17504       if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
17505         {
17506           it_fsm_pre_encode ();
17507           opcode->aencode ();
17508           it_fsm_post_encode ();
17509         }
17510       /* Arm mode bx is marked as both v4T and v5 because it's still required
17511          on a hypothetical non-thumb v5 core.  */
17512       if (is_bx)
17513         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
17514       else
17515         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
17516                                 *opcode->avariant);
17517
17518       check_neon_suffixes;
17519
17520       if (!inst.error)
17521         {
17522           mapping_state (MAP_ARM);
17523         }
17524     }
17525   else
17526     {
17527       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
17528                 "-- `%s'"), str);
17529       return;
17530     }
17531   output_inst (str);
17532 }
17533
17534 static void
17535 check_it_blocks_finished (void)
17536 {
17537 #ifdef OBJ_ELF
17538   asection *sect;
17539
17540   for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
17541     if (seg_info (sect)->tc_segment_info_data.current_it.state
17542         == MANUAL_IT_BLOCK)
17543       {
17544         as_warn (_("section '%s' finished with an open IT block."),
17545                  sect->name);
17546       }
17547 #else
17548   if (now_it.state == MANUAL_IT_BLOCK)
17549     as_warn (_("file finished with an open IT block."));
17550 #endif
17551 }
17552
17553 /* Various frobbings of labels and their addresses.  */
17554
17555 void
17556 arm_start_line_hook (void)
17557 {
17558   last_label_seen = NULL;
17559 }
17560
17561 void
17562 arm_frob_label (symbolS * sym)
17563 {
17564   last_label_seen = sym;
17565
17566   ARM_SET_THUMB (sym, thumb_mode);
17567
17568 #if defined OBJ_COFF || defined OBJ_ELF
17569   ARM_SET_INTERWORK (sym, support_interwork);
17570 #endif
17571
17572   force_automatic_it_block_close ();
17573
17574   /* Note - do not allow local symbols (.Lxxx) to be labelled
17575      as Thumb functions.  This is because these labels, whilst
17576      they exist inside Thumb code, are not the entry points for
17577      possible ARM->Thumb calls.  Also, these labels can be used
17578      as part of a computed goto or switch statement.  eg gcc
17579      can generate code that looks like this:
17580
17581                 ldr  r2, [pc, .Laaa]
17582                 lsl  r3, r3, #2
17583                 ldr  r2, [r3, r2]
17584                 mov  pc, r2
17585
17586        .Lbbb:  .word .Lxxx
17587        .Lccc:  .word .Lyyy
17588        ..etc...
17589        .Laaa:   .word Lbbb
17590
17591      The first instruction loads the address of the jump table.
17592      The second instruction converts a table index into a byte offset.
17593      The third instruction gets the jump address out of the table.
17594      The fourth instruction performs the jump.
17595
17596      If the address stored at .Laaa is that of a symbol which has the
17597      Thumb_Func bit set, then the linker will arrange for this address
17598      to have the bottom bit set, which in turn would mean that the
17599      address computation performed by the third instruction would end
17600      up with the bottom bit set.  Since the ARM is capable of unaligned
17601      word loads, the instruction would then load the incorrect address
17602      out of the jump table, and chaos would ensue.  */
17603   if (label_is_thumb_function_name
17604       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
17605       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
17606     {
17607       /* When the address of a Thumb function is taken the bottom
17608          bit of that address should be set.  This will allow
17609          interworking between Arm and Thumb functions to work
17610          correctly.  */
17611
17612       THUMB_SET_FUNC (sym, 1);
17613
17614       label_is_thumb_function_name = FALSE;
17615     }
17616
17617   dwarf2_emit_label (sym);
17618 }
17619
17620 bfd_boolean
17621 arm_data_in_code (void)
17622 {
17623   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
17624     {
17625       *input_line_pointer = '/';
17626       input_line_pointer += 5;
17627       *input_line_pointer = 0;
17628       return TRUE;
17629     }
17630
17631   return FALSE;
17632 }
17633
17634 char *
17635 arm_canonicalize_symbol_name (char * name)
17636 {
17637   int len;
17638
17639   if (thumb_mode && (len = strlen (name)) > 5
17640       && streq (name + len - 5, "/data"))
17641     *(name + len - 5) = 0;
17642
17643   return name;
17644 }
17645 \f
17646 /* Table of all register names defined by default.  The user can
17647    define additional names with .req.  Note that all register names
17648    should appear in both upper and lowercase variants.  Some registers
17649    also have mixed-case names.  */
17650
17651 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
17652 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
17653 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
17654 #define REGSET(p,t) \
17655   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
17656   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
17657   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
17658   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
17659 #define REGSETH(p,t) \
17660   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
17661   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
17662   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
17663   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
17664 #define REGSET2(p,t) \
17665   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
17666   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
17667   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
17668   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
17669 #define SPLRBANK(base,bank,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   REGDEF(LR_##bank, 768|((base+0)<<16), t), \
17674   REGDEF(SP_##bank, 768|((base+1)<<16), t), \
17675   REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
17676
17677 static const struct reg_entry reg_names[] =
17678 {
17679   /* ARM integer registers.  */
17680   REGSET(r, RN), REGSET(R, RN),
17681
17682   /* ATPCS synonyms.  */
17683   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
17684   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
17685   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
17686
17687   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
17688   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
17689   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
17690
17691   /* Well-known aliases.  */
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   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
17696   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
17697
17698   /* Coprocessor numbers.  */
17699   REGSET(p, CP), REGSET(P, CP),
17700
17701   /* Coprocessor register numbers.  The "cr" variants are for backward
17702      compatibility.  */
17703   REGSET(c,  CN), REGSET(C, CN),
17704   REGSET(cr, CN), REGSET(CR, CN),
17705
17706   /* ARM banked registers.  */
17707   REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
17708   REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
17709   REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
17710   REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
17711   REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
17712   REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
17713   REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
17714
17715   REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
17716   REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
17717   REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
17718   REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
17719   REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
17720   REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(sp_fiq,512|(13<<16),RNB),
17721   REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
17722   REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
17723
17724   SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
17725   SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
17726   SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
17727   SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
17728   SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
17729   REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
17730   REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
17731   REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
17732   REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
17733
17734   /* FPA registers.  */
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   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
17739   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
17740
17741   /* VFP SP registers.  */
17742   REGSET(s,VFS),  REGSET(S,VFS),
17743   REGSETH(s,VFS), REGSETH(S,VFS),
17744
17745   /* VFP DP Registers.  */
17746   REGSET(d,VFD),  REGSET(D,VFD),
17747   /* Extra Neon DP registers.  */
17748   REGSETH(d,VFD), REGSETH(D,VFD),
17749
17750   /* Neon QP registers.  */
17751   REGSET2(q,NQ),  REGSET2(Q,NQ),
17752
17753   /* VFP control registers.  */
17754   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
17755   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
17756   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
17757   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
17758   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
17759   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
17760
17761   /* Maverick DSP coprocessor registers.  */
17762   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
17763   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
17764
17765   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
17766   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
17767   REGDEF(dspsc,0,DSPSC),
17768
17769   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
17770   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
17771   REGDEF(DSPSC,0,DSPSC),
17772
17773   /* iWMMXt data registers - p0, c0-15.  */
17774   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
17775
17776   /* iWMMXt control registers - p1, c0-3.  */
17777   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
17778   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
17779   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
17780   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
17781
17782   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
17783   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
17784   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
17785   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
17786   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
17787
17788   /* XScale accumulator registers.  */
17789   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
17790 };
17791 #undef REGDEF
17792 #undef REGNUM
17793 #undef REGSET
17794
17795 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
17796    within psr_required_here.  */
17797 static const struct asm_psr psrs[] =
17798 {
17799   /* Backward compatibility notation.  Note that "all" is no longer
17800      truly all possible PSR bits.  */
17801   {"all",  PSR_c | PSR_f},
17802   {"flg",  PSR_f},
17803   {"ctl",  PSR_c},
17804
17805   /* Individual flags.  */
17806   {"f",    PSR_f},
17807   {"c",    PSR_c},
17808   {"x",    PSR_x},
17809   {"s",    PSR_s},
17810
17811   /* Combinations of flags.  */
17812   {"fs",   PSR_f | PSR_s},
17813   {"fx",   PSR_f | PSR_x},
17814   {"fc",   PSR_f | PSR_c},
17815   {"sf",   PSR_s | PSR_f},
17816   {"sx",   PSR_s | PSR_x},
17817   {"sc",   PSR_s | PSR_c},
17818   {"xf",   PSR_x | PSR_f},
17819   {"xs",   PSR_x | PSR_s},
17820   {"xc",   PSR_x | PSR_c},
17821   {"cf",   PSR_c | PSR_f},
17822   {"cs",   PSR_c | PSR_s},
17823   {"cx",   PSR_c | PSR_x},
17824   {"fsx",  PSR_f | PSR_s | PSR_x},
17825   {"fsc",  PSR_f | PSR_s | PSR_c},
17826   {"fxs",  PSR_f | PSR_x | PSR_s},
17827   {"fxc",  PSR_f | PSR_x | PSR_c},
17828   {"fcs",  PSR_f | PSR_c | PSR_s},
17829   {"fcx",  PSR_f | PSR_c | PSR_x},
17830   {"sfx",  PSR_s | PSR_f | PSR_x},
17831   {"sfc",  PSR_s | PSR_f | PSR_c},
17832   {"sxf",  PSR_s | PSR_x | PSR_f},
17833   {"sxc",  PSR_s | PSR_x | PSR_c},
17834   {"scf",  PSR_s | PSR_c | PSR_f},
17835   {"scx",  PSR_s | PSR_c | PSR_x},
17836   {"xfs",  PSR_x | PSR_f | PSR_s},
17837   {"xfc",  PSR_x | PSR_f | PSR_c},
17838   {"xsf",  PSR_x | PSR_s | PSR_f},
17839   {"xsc",  PSR_x | PSR_s | PSR_c},
17840   {"xcf",  PSR_x | PSR_c | PSR_f},
17841   {"xcs",  PSR_x | PSR_c | PSR_s},
17842   {"cfs",  PSR_c | PSR_f | PSR_s},
17843   {"cfx",  PSR_c | PSR_f | PSR_x},
17844   {"csf",  PSR_c | PSR_s | PSR_f},
17845   {"csx",  PSR_c | PSR_s | PSR_x},
17846   {"cxf",  PSR_c | PSR_x | PSR_f},
17847   {"cxs",  PSR_c | PSR_x | PSR_s},
17848   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
17849   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
17850   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
17851   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
17852   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
17853   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
17854   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
17855   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
17856   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
17857   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
17858   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
17859   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
17860   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
17861   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
17862   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
17863   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
17864   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
17865   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
17866   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
17867   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
17868   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
17869   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
17870   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
17871   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
17872 };
17873
17874 /* Table of V7M psr names.  */
17875 static const struct asm_psr v7m_psrs[] =
17876 {
17877   {"apsr",        0 }, {"APSR",         0 },
17878   {"iapsr",       1 }, {"IAPSR",        1 },
17879   {"eapsr",       2 }, {"EAPSR",        2 },
17880   {"psr",         3 }, {"PSR",          3 },
17881   {"xpsr",        3 }, {"XPSR",         3 }, {"xPSR",     3 },
17882   {"ipsr",        5 }, {"IPSR",         5 },
17883   {"epsr",        6 }, {"EPSR",         6 },
17884   {"iepsr",       7 }, {"IEPSR",        7 },
17885   {"msp",         8 }, {"MSP",          8 },
17886   {"psp",         9 }, {"PSP",          9 },
17887   {"primask",     16}, {"PRIMASK",      16},
17888   {"basepri",     17}, {"BASEPRI",      17},
17889   {"basepri_max", 18}, {"BASEPRI_MAX",  18},
17890   {"basepri_max", 18}, {"BASEPRI_MASK", 18}, /* Typo, preserved for backwards compatibility.  */
17891   {"faultmask",   19}, {"FAULTMASK",    19},
17892   {"control",     20}, {"CONTROL",      20}
17893 };
17894
17895 /* Table of all shift-in-operand names.  */
17896 static const struct asm_shift_name shift_names [] =
17897 {
17898   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
17899   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
17900   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
17901   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
17902   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
17903   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
17904 };
17905
17906 /* Table of all explicit relocation names.  */
17907 #ifdef OBJ_ELF
17908 static struct reloc_entry reloc_names[] =
17909 {
17910   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
17911   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
17912   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
17913   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
17914   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
17915   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
17916   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
17917   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
17918   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
17919   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
17920   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32},
17921   { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
17922   { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
17923         { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
17924   { "tlscall", BFD_RELOC_ARM_TLS_CALL},
17925         { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
17926   { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
17927         { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
17928 };
17929 #endif
17930
17931 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
17932 static const struct asm_cond conds[] =
17933 {
17934   {"eq", 0x0},
17935   {"ne", 0x1},
17936   {"cs", 0x2}, {"hs", 0x2},
17937   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
17938   {"mi", 0x4},
17939   {"pl", 0x5},
17940   {"vs", 0x6},
17941   {"vc", 0x7},
17942   {"hi", 0x8},
17943   {"ls", 0x9},
17944   {"ge", 0xa},
17945   {"lt", 0xb},
17946   {"gt", 0xc},
17947   {"le", 0xd},
17948   {"al", 0xe}
17949 };
17950
17951 #define UL_BARRIER(L,U,CODE,FEAT) \
17952   { L, CODE, ARM_FEATURE (FEAT, 0) }, \
17953   { U, CODE, ARM_FEATURE (FEAT, 0) }
17954
17955 static struct asm_barrier_opt barrier_opt_names[] =
17956 {
17957   UL_BARRIER ("sy",     "SY",    0xf, ARM_EXT_BARRIER),
17958   UL_BARRIER ("st",     "ST",    0xe, ARM_EXT_BARRIER),
17959   UL_BARRIER ("ld",     "LD",    0xd, ARM_EXT_V8),
17960   UL_BARRIER ("ish",    "ISH",   0xb, ARM_EXT_BARRIER),
17961   UL_BARRIER ("sh",     "SH",    0xb, ARM_EXT_BARRIER),
17962   UL_BARRIER ("ishst",  "ISHST", 0xa, ARM_EXT_BARRIER),
17963   UL_BARRIER ("shst",   "SHST",  0xa, ARM_EXT_BARRIER),
17964   UL_BARRIER ("ishld",  "ISHLD", 0x9, ARM_EXT_V8),
17965   UL_BARRIER ("un",     "UN",    0x7, ARM_EXT_BARRIER),
17966   UL_BARRIER ("nsh",    "NSH",   0x7, ARM_EXT_BARRIER),
17967   UL_BARRIER ("unst",   "UNST",  0x6, ARM_EXT_BARRIER),
17968   UL_BARRIER ("nshst",  "NSHST", 0x6, ARM_EXT_BARRIER),
17969   UL_BARRIER ("nshld",  "NSHLD", 0x5, ARM_EXT_V8),
17970   UL_BARRIER ("osh",    "OSH",   0x3, ARM_EXT_BARRIER),
17971   UL_BARRIER ("oshst",  "OSHST", 0x2, ARM_EXT_BARRIER),
17972   UL_BARRIER ("oshld",  "OSHLD", 0x1, ARM_EXT_V8)
17973 };
17974
17975 #undef UL_BARRIER
17976
17977 /* Table of ARM-format instructions.    */
17978
17979 /* Macros for gluing together operand strings.  N.B. In all cases
17980    other than OPS0, the trailing OP_stop comes from default
17981    zero-initialization of the unspecified elements of the array.  */
17982 #define OPS0()            { OP_stop, }
17983 #define OPS1(a)           { OP_##a, }
17984 #define OPS2(a,b)         { OP_##a,OP_##b, }
17985 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
17986 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
17987 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
17988 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
17989
17990 /* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
17991    This is useful when mixing operands for ARM and THUMB, i.e. using the
17992    MIX_ARM_THUMB_OPERANDS macro.
17993    In order to use these macros, prefix the number of operands with _
17994    e.g. _3.  */
17995 #define OPS_1(a)           { a, }
17996 #define OPS_2(a,b)         { a,b, }
17997 #define OPS_3(a,b,c)       { a,b,c, }
17998 #define OPS_4(a,b,c,d)     { a,b,c,d, }
17999 #define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
18000 #define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
18001
18002 /* These macros abstract out the exact format of the mnemonic table and
18003    save some repeated characters.  */
18004
18005 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
18006 #define TxCE(mnem, op, top, nops, ops, ae, te) \
18007   { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
18008     THUMB_VARIANT, do_##ae, do_##te }
18009
18010 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
18011    a T_MNEM_xyz enumerator.  */
18012 #define TCE(mnem, aop, top, nops, ops, ae, te) \
18013       TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
18014 #define tCE(mnem, aop, top, nops, ops, ae, te) \
18015       TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
18016
18017 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
18018    infix after the third character.  */
18019 #define TxC3(mnem, op, top, nops, ops, ae, te) \
18020   { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
18021     THUMB_VARIANT, do_##ae, do_##te }
18022 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
18023   { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
18024     THUMB_VARIANT, do_##ae, do_##te }
18025 #define TC3(mnem, aop, top, nops, ops, ae, te) \
18026       TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
18027 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
18028       TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
18029 #define tC3(mnem, aop, top, nops, ops, ae, te) \
18030       TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
18031 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
18032       TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
18033
18034 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
18035    field is still 0xE.  Many of the Thumb variants can be executed
18036    conditionally, so this is checked separately.  */
18037 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
18038   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
18039     THUMB_VARIANT, do_##ae, do_##te }
18040
18041 /* Same as TUE but the encoding function for ARM and Thumb modes is the same.
18042    Used by mnemonics that have very minimal differences in the encoding for
18043    ARM and Thumb variants and can be handled in a common function.  */
18044 #define TUEc(mnem, op, top, nops, ops, en) \
18045   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
18046     THUMB_VARIANT, do_##en, do_##en }
18047
18048 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
18049    condition code field.  */
18050 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
18051   { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
18052     THUMB_VARIANT, do_##ae, do_##te }
18053
18054 /* ARM-only variants of all the above.  */
18055 #define CE(mnem,  op, nops, ops, ae)    \
18056   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18057
18058 #define C3(mnem, op, nops, ops, ae)     \
18059   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18060
18061 /* Legacy mnemonics that always have conditional infix after the third
18062    character.  */
18063 #define CL(mnem, op, nops, ops, ae)     \
18064   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
18065     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18066
18067 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
18068 #define cCE(mnem,  op, nops, ops, ae)   \
18069   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
18070
18071 /* Legacy coprocessor instructions where conditional infix and conditional
18072    suffix are ambiguous.  For consistency this includes all FPA instructions,
18073    not just the potentially ambiguous ones.  */
18074 #define cCL(mnem, op, nops, ops, ae)    \
18075   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
18076     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
18077
18078 /* Coprocessor, takes either a suffix or a position-3 infix
18079    (for an FPA corner case). */
18080 #define C3E(mnem, op, nops, ops, ae) \
18081   { mnem, OPS##nops ops, OT_csuf_or_in3, \
18082     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
18083
18084 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
18085   { m1 #m2 m3, OPS##nops ops, \
18086     sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
18087     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
18088
18089 #define CM(m1, m2, op, nops, ops, ae)   \
18090   xCM_ (m1,   , m2, op, nops, ops, ae), \
18091   xCM_ (m1, eq, m2, op, nops, ops, ae), \
18092   xCM_ (m1, ne, m2, op, nops, ops, ae), \
18093   xCM_ (m1, cs, m2, op, nops, ops, ae), \
18094   xCM_ (m1, hs, m2, op, nops, ops, ae), \
18095   xCM_ (m1, cc, m2, op, nops, ops, ae), \
18096   xCM_ (m1, ul, m2, op, nops, ops, ae), \
18097   xCM_ (m1, lo, m2, op, nops, ops, ae), \
18098   xCM_ (m1, mi, m2, op, nops, ops, ae), \
18099   xCM_ (m1, pl, m2, op, nops, ops, ae), \
18100   xCM_ (m1, vs, m2, op, nops, ops, ae), \
18101   xCM_ (m1, vc, m2, op, nops, ops, ae), \
18102   xCM_ (m1, hi, m2, op, nops, ops, ae), \
18103   xCM_ (m1, ls, m2, op, nops, ops, ae), \
18104   xCM_ (m1, ge, m2, op, nops, ops, ae), \
18105   xCM_ (m1, lt, m2, op, nops, ops, ae), \
18106   xCM_ (m1, gt, m2, op, nops, ops, ae), \
18107   xCM_ (m1, le, m2, op, nops, ops, ae), \
18108   xCM_ (m1, al, m2, op, nops, ops, ae)
18109
18110 #define UE(mnem, op, nops, ops, ae)     \
18111   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
18112
18113 #define UF(mnem, op, nops, ops, ae)     \
18114   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
18115
18116 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
18117    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
18118    use the same encoding function for each.  */
18119 #define NUF(mnem, op, nops, ops, enc)                                   \
18120   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
18121     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
18122
18123 /* Neon data processing, version which indirects through neon_enc_tab for
18124    the various overloaded versions of opcodes.  */
18125 #define nUF(mnem, op, nops, ops, enc)                                   \
18126   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
18127     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
18128
18129 /* Neon insn with conditional suffix for the ARM version, non-overloaded
18130    version.  */
18131 #define NCE_tag(mnem, op, nops, ops, enc, tag)                          \
18132   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
18133     THUMB_VARIANT, do_##enc, do_##enc }
18134
18135 #define NCE(mnem, op, nops, ops, enc)                                   \
18136    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
18137
18138 #define NCEF(mnem, op, nops, ops, enc)                                  \
18139     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
18140
18141 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
18142 #define nCE_tag(mnem, op, nops, ops, enc, tag)                          \
18143   { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,          \
18144     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
18145
18146 #define nCE(mnem, op, nops, ops, enc)                                   \
18147    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
18148
18149 #define nCEF(mnem, op, nops, ops, enc)                                  \
18150     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
18151
18152 #define do_0 0
18153
18154 static const struct asm_opcode insns[] =
18155 {
18156 #define ARM_VARIANT    & arm_ext_v1 /* Core ARM Instructions.  */
18157 #define THUMB_VARIANT  & arm_ext_v4t
18158  tCE("and",     0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
18159  tC3("ands",    0100000, _ands,    3, (RR, oRR, SH), arit, t_arit3c),
18160  tCE("eor",     0200000, _eor,     3, (RR, oRR, SH), arit, t_arit3c),
18161  tC3("eors",    0300000, _eors,    3, (RR, oRR, SH), arit, t_arit3c),
18162  tCE("sub",     0400000, _sub,     3, (RR, oRR, SH), arit, t_add_sub),
18163  tC3("subs",    0500000, _subs,    3, (RR, oRR, SH), arit, t_add_sub),
18164  tCE("add",     0800000, _add,     3, (RR, oRR, SHG), arit, t_add_sub),
18165  tC3("adds",    0900000, _adds,    3, (RR, oRR, SHG), arit, t_add_sub),
18166  tCE("adc",     0a00000, _adc,     3, (RR, oRR, SH), arit, t_arit3c),
18167  tC3("adcs",    0b00000, _adcs,    3, (RR, oRR, SH), arit, t_arit3c),
18168  tCE("sbc",     0c00000, _sbc,     3, (RR, oRR, SH), arit, t_arit3),
18169  tC3("sbcs",    0d00000, _sbcs,    3, (RR, oRR, SH), arit, t_arit3),
18170  tCE("orr",     1800000, _orr,     3, (RR, oRR, SH), arit, t_arit3c),
18171  tC3("orrs",    1900000, _orrs,    3, (RR, oRR, SH), arit, t_arit3c),
18172  tCE("bic",     1c00000, _bic,     3, (RR, oRR, SH), arit, t_arit3),
18173  tC3("bics",    1d00000, _bics,    3, (RR, oRR, SH), arit, t_arit3),
18174
18175  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
18176     for setting PSR flag bits.  They are obsolete in V6 and do not
18177     have Thumb equivalents. */
18178  tCE("tst",     1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
18179  tC3w("tsts",   1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
18180   CL("tstp",    110f000,           2, (RR, SH),      cmp),
18181  tCE("cmp",     1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
18182  tC3w("cmps",   1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
18183   CL("cmpp",    150f000,           2, (RR, SH),      cmp),
18184  tCE("cmn",     1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
18185  tC3w("cmns",   1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
18186   CL("cmnp",    170f000,           2, (RR, SH),      cmp),
18187
18188  tCE("mov",     1a00000, _mov,     2, (RR, SH),      mov,  t_mov_cmp),
18189  tC3("movs",    1b00000, _movs,    2, (RR, SH),      mov,  t_mov_cmp),
18190  tCE("mvn",     1e00000, _mvn,     2, (RR, SH),      mov,  t_mvn_tst),
18191  tC3("mvns",    1f00000, _mvns,    2, (RR, SH),      mov,  t_mvn_tst),
18192
18193  tCE("ldr",     4100000, _ldr,     2, (RR, ADDRGLDR),ldst, t_ldst),
18194  tC3("ldrb",    4500000, _ldrb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
18195  tCE("str",     4000000, _str,     _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
18196                                                                 OP_RRnpc),
18197                                         OP_ADDRGLDR),ldst, t_ldst),
18198  tC3("strb",    4400000, _strb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
18199
18200  tCE("stm",     8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18201  tC3("stmia",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18202  tC3("stmea",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18203  tCE("ldm",     8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18204  tC3("ldmia",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18205  tC3("ldmfd",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
18206
18207  TCE("swi",     f000000, df00,     1, (EXPi),        swi, t_swi),
18208  TCE("svc",     f000000, df00,     1, (EXPi),        swi, t_swi),
18209  tCE("b",       a000000, _b,       1, (EXPr),        branch, t_branch),
18210  TCE("bl",      b000000, f000f800, 1, (EXPr),        bl, t_branch23),
18211
18212   /* Pseudo ops.  */
18213  tCE("adr",     28f0000, _adr,     2, (RR, EXP),     adr,  t_adr),
18214   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
18215  tCE("nop",     1a00000, _nop,     1, (oI255c),      nop,  t_nop),
18216  tCE("udf",     7f000f0, _udf,     1, (oIffffb),     bkpt, t_udf),
18217
18218   /* Thumb-compatibility pseudo ops.  */
18219  tCE("lsl",     1a00000, _lsl,     3, (RR, oRR, SH), shift, t_shift),
18220  tC3("lsls",    1b00000, _lsls,    3, (RR, oRR, SH), shift, t_shift),
18221  tCE("lsr",     1a00020, _lsr,     3, (RR, oRR, SH), shift, t_shift),
18222  tC3("lsrs",    1b00020, _lsrs,    3, (RR, oRR, SH), shift, t_shift),
18223  tCE("asr",     1a00040, _asr,     3, (RR, oRR, SH), shift, t_shift),
18224  tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
18225  tCE("ror",     1a00060, _ror,     3, (RR, oRR, SH), shift, t_shift),
18226  tC3("rors",    1b00060, _rors,    3, (RR, oRR, SH), shift, t_shift),
18227  tCE("neg",     2600000, _neg,     2, (RR, RR),      rd_rn, t_neg),
18228  tC3("negs",    2700000, _negs,    2, (RR, RR),      rd_rn, t_neg),
18229  tCE("push",    92d0000, _push,     1, (REGLST),             push_pop, t_push_pop),
18230  tCE("pop",     8bd0000, _pop,     1, (REGLST),      push_pop, t_push_pop),
18231
18232  /* These may simplify to neg.  */
18233  TCE("rsb",     0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
18234  TC3("rsbs",    0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
18235
18236 #undef  THUMB_VARIANT
18237 #define THUMB_VARIANT  & arm_ext_v6
18238
18239  TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
18240
18241  /* V1 instructions with no Thumb analogue prior to V6T2.  */
18242 #undef  THUMB_VARIANT
18243 #define THUMB_VARIANT  & arm_ext_v6t2
18244
18245  TCE("teq",     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
18246  TC3w("teqs",   1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
18247   CL("teqp",    130f000,           2, (RR, SH),      cmp),
18248
18249  TC3("ldrt",    4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18250  TC3("ldrbt",   4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18251  TC3("strt",    4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
18252  TC3("strbt",   4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
18253
18254  TC3("stmdb",   9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18255  TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18256
18257  TC3("ldmdb",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18258  TC3("ldmea",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
18259
18260  /* V1 instructions with no Thumb analogue at all.  */
18261   CE("rsc",     0e00000,           3, (RR, oRR, SH), arit),
18262   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
18263
18264   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
18265   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
18266   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
18267   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
18268   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
18269   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
18270   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
18271   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
18272
18273 #undef  ARM_VARIANT
18274 #define ARM_VARIANT    & arm_ext_v2     /* ARM 2 - multiplies.  */
18275 #undef  THUMB_VARIANT
18276 #define THUMB_VARIANT  & arm_ext_v4t
18277
18278  tCE("mul",     0000090, _mul,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
18279  tC3("muls",    0100090, _muls,    3, (RRnpc, RRnpc, oRR), mul, t_mul),
18280
18281 #undef  THUMB_VARIANT
18282 #define THUMB_VARIANT  & arm_ext_v6t2
18283
18284  TCE("mla",     0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
18285   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
18286
18287   /* Generic coprocessor instructions.  */
18288  TCE("cdp",     e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
18289  TCE("ldc",     c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18290  TC3("ldcl",    c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18291  TCE("stc",     c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18292  TC3("stcl",    c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18293  TCE("mcr",     e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18294  TCE("mrc",     e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b),   co_reg, co_reg),
18295
18296 #undef  ARM_VARIANT
18297 #define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
18298
18299   CE("swp",     1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
18300   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
18301
18302 #undef  ARM_VARIANT
18303 #define ARM_VARIANT    & arm_ext_v3     /* ARM 6 Status register instructions.  */
18304 #undef  THUMB_VARIANT
18305 #define THUMB_VARIANT  & arm_ext_msr
18306
18307  TCE("mrs",     1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
18308  TCE("msr",     120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
18309
18310 #undef  ARM_VARIANT
18311 #define ARM_VARIANT    & arm_ext_v3m     /* ARM 7M long multiplies.  */
18312 #undef  THUMB_VARIANT
18313 #define THUMB_VARIANT  & arm_ext_v6t2
18314
18315  TCE("smull",   0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18316   CM("smull","s",       0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18317  TCE("umull",   0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18318   CM("umull","s",       0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18319  TCE("smlal",   0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18320   CM("smlal","s",       0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18321  TCE("umlal",   0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
18322   CM("umlal","s",       0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
18323
18324 #undef  ARM_VARIANT
18325 #define ARM_VARIANT    & arm_ext_v4     /* ARM Architecture 4.  */
18326 #undef  THUMB_VARIANT
18327 #define THUMB_VARIANT  & arm_ext_v4t
18328
18329  tC3("ldrh",    01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18330  tC3("strh",    00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18331  tC3("ldrsh",   01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18332  tC3("ldrsb",   01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18333  tC3("ldsh",    01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18334  tC3("ldsb",    01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
18335
18336 #undef  ARM_VARIANT
18337 #define ARM_VARIANT  & arm_ext_v4t_5
18338
18339   /* ARM Architecture 4T.  */
18340   /* Note: bx (and blx) are required on V5, even if the processor does
18341      not support Thumb.  */
18342  TCE("bx",      12fff10, 4700, 1, (RR), bx, t_bx),
18343
18344 #undef  ARM_VARIANT
18345 #define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.     */
18346 #undef  THUMB_VARIANT
18347 #define THUMB_VARIANT  & arm_ext_v5t
18348
18349   /* Note: blx has 2 variants; the .value coded here is for
18350      BLX(2).  Only this variant has conditional execution.  */
18351  TCE("blx",     12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
18352  TUE("bkpt",    1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
18353
18354 #undef  THUMB_VARIANT
18355 #define THUMB_VARIANT  & arm_ext_v6t2
18356
18357  TCE("clz",     16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
18358  TUF("ldc2",    c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18359  TUF("ldc2l",   c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
18360  TUF("stc2",    c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
18361  TUF("stc2l",   c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
18362  TUF("cdp2",    e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
18363  TUF("mcr2",    e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18364  TUF("mrc2",    e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
18365
18366 #undef  ARM_VARIANT
18367 #define ARM_VARIANT    & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
18368 #undef  THUMB_VARIANT
18369 #define THUMB_VARIANT  & arm_ext_v5exp
18370
18371  TCE("smlabb",  1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18372  TCE("smlatb",  10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18373  TCE("smlabt",  10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18374  TCE("smlatt",  10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18375
18376  TCE("smlawb",  1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18377  TCE("smlawt",  12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
18378
18379  TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18380  TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18381  TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18382  TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
18383
18384  TCE("smulbb",  1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18385  TCE("smultb",  16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18386  TCE("smulbt",  16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18387  TCE("smultt",  16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18388
18389  TCE("smulwb",  12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18390  TCE("smulwt",  12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
18391
18392  TCE("qadd",    1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18393  TCE("qdadd",   1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18394  TCE("qsub",    1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18395  TCE("qdsub",   1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
18396
18397 #undef  ARM_VARIANT
18398 #define ARM_VARIANT    & arm_ext_v5e /*  ARM Architecture 5TE.  */
18399 #undef  THUMB_VARIANT
18400 #define THUMB_VARIANT  & arm_ext_v6t2
18401
18402  TUF("pld",     450f000, f810f000, 1, (ADDR),                pld,  t_pld),
18403  TC3("ldrd",    00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
18404      ldrd, t_ldstd),
18405  TC3("strd",    00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
18406                                        ADDRGLDRS), ldrd, t_ldstd),
18407
18408  TCE("mcrr",    c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18409  TCE("mrrc",    c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18410
18411 #undef  ARM_VARIANT
18412 #define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
18413
18414  TCE("bxj",     12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
18415
18416 #undef  ARM_VARIANT
18417 #define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
18418 #undef  THUMB_VARIANT
18419 #define THUMB_VARIANT  & arm_ext_v6
18420
18421  TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
18422  TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
18423  tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18424  tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18425  tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
18426  tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18427  tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18428  tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18429  tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
18430  TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
18431
18432 #undef  THUMB_VARIANT
18433 #define THUMB_VARIANT  & arm_ext_v6t2
18434
18435  TCE("ldrex",   1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),        ldrex, t_ldrex),
18436  TCE("strex",   1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18437                                       strex,  t_strex),
18438  TUF("mcrr2",   c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18439  TUF("mrrc2",   c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
18440
18441  TCE("ssat",    6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
18442  TCE("usat",    6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
18443
18444 /*  ARM V6 not included in V7M.  */
18445 #undef  THUMB_VARIANT
18446 #define THUMB_VARIANT  & arm_ext_v6_notm
18447  TUF("rfeia",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18448  TUF("rfe",     8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18449   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
18450   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
18451  TUF("rfedb",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
18452  TUF("rfefd",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
18453   UF(rfefa,     8100a00,           1, (RRw),                       rfe),
18454  TUF("rfeea",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
18455   UF(rfeed,     9900a00,           1, (RRw),                       rfe),
18456  TUF("srsia",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18457  TUF("srs",     8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18458  TUF("srsea",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
18459   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
18460   UF(srsfa,     9c00500,           2, (oRRw, I31w),                srs),
18461   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
18462   UF(srsed,     8400500,           2, (oRRw, I31w),                srs),
18463  TUF("srsdb",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
18464  TUF("srsfd",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
18465
18466 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
18467 #undef  THUMB_VARIANT
18468 #define THUMB_VARIANT  & arm_ext_v6_dsp
18469  TUF("cps",     1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
18470  TCE("pkhbt",   6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
18471  TCE("pkhtb",   6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
18472  TCE("qadd16",  6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18473  TCE("qadd8",   6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18474  TCE("qasx",    6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18475  /* Old name for QASX.  */
18476  TCE("qaddsubx",6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18477  TCE("qsax",    6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18478  /* Old name for QSAX.  */
18479  TCE("qsubaddx",6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18480  TCE("qsub16",  6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18481  TCE("qsub8",   6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18482  TCE("sadd16",  6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18483  TCE("sadd8",   6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18484  TCE("sasx",    6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18485  /* Old name for SASX.  */
18486  TCE("saddsubx",6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18487  TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18488  TCE("shadd8",  6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18489  TCE("shasx",   6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18490  /* Old name for SHASX.  */
18491  TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18492  TCE("shsax",     6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18493  /* Old name for SHSAX.  */
18494  TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18495  TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18496  TCE("shsub8",  6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18497  TCE("ssax",    6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18498  /* Old name for SSAX.  */
18499  TCE("ssubaddx",6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18500  TCE("ssub16",  6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18501  TCE("ssub8",   6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18502  TCE("uadd16",  6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18503  TCE("uadd8",   6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18504  TCE("uasx",    6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18505  /* Old name for UASX.  */
18506  TCE("uaddsubx",6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18507  TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18508  TCE("uhadd8",  6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18509  TCE("uhasx",   6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18510  /* Old name for UHASX.  */
18511  TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18512  TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18513  /* Old name for UHSAX.  */
18514  TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18515  TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18516  TCE("uhsub8",  6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18517  TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18518  TCE("uqadd8",  6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18519  TCE("uqasx",   6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18520  /* Old name for UQASX.  */
18521  TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18522  TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18523  /* Old name for UQSAX.  */
18524  TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
18525  TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18526  TCE("uqsub8",  6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18527  TCE("usub16",  6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18528  TCE("usax",    6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18529  /* Old name for USAX.  */
18530  TCE("usubaddx",6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18531  TCE("usub8",   6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18532  TCE("sxtah",   6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18533  TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18534  TCE("sxtab",   6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18535  TCE("sxtb16",  68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
18536  TCE("uxtah",   6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18537  TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18538  TCE("uxtab",   6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
18539  TCE("uxtb16",  6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
18540  TCE("sel",     6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
18541  TCE("smlad",   7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18542  TCE("smladx",  7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18543  TCE("smlald",  7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18544  TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18545  TCE("smlsd",   7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18546  TCE("smlsdx",  7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18547  TCE("smlsld",  7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18548  TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
18549  TCE("smmla",   7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18550  TCE("smmlar",  7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18551  TCE("smmls",   75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18552  TCE("smmlsr",  75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
18553  TCE("smmul",   750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18554  TCE("smmulr",  750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18555  TCE("smuad",   700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18556  TCE("smuadx",  700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18557  TCE("smusd",   700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18558  TCE("smusdx",  700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
18559  TCE("ssat16",  6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
18560  TCE("umaal",   0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
18561  TCE("usad8",   780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
18562  TCE("usada8",  7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
18563  TCE("usat16",  6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
18564
18565 #undef  ARM_VARIANT
18566 #define ARM_VARIANT   & arm_ext_v6k
18567 #undef  THUMB_VARIANT
18568 #define THUMB_VARIANT & arm_ext_v6k
18569
18570  tCE("yield",   320f001, _yield,    0, (), noargs, t_hint),
18571  tCE("wfe",     320f002, _wfe,      0, (), noargs, t_hint),
18572  tCE("wfi",     320f003, _wfi,      0, (), noargs, t_hint),
18573  tCE("sev",     320f004, _sev,      0, (), noargs, t_hint),
18574
18575 #undef  THUMB_VARIANT
18576 #define THUMB_VARIANT  & arm_ext_v6_notm
18577  TCE("ldrexd",  1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
18578                                       ldrexd, t_ldrexd),
18579  TCE("strexd",  1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
18580                                        RRnpcb), strexd, t_strexd),
18581
18582 #undef  THUMB_VARIANT
18583 #define THUMB_VARIANT  & arm_ext_v6t2
18584  TCE("ldrexb",  1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
18585      rd_rn,  rd_rn),
18586  TCE("ldrexh",  1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
18587      rd_rn,  rd_rn),
18588  TCE("strexb",  1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18589      strex, t_strexbh),
18590  TCE("strexh",  1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
18591      strex, t_strexbh),
18592  TUF("clrex",   57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
18593
18594 #undef  ARM_VARIANT
18595 #define ARM_VARIANT    & arm_ext_sec
18596 #undef  THUMB_VARIANT
18597 #define THUMB_VARIANT  & arm_ext_sec
18598
18599  TCE("smc",     1600070, f7f08000, 1, (EXPi), smc, t_smc),
18600
18601 #undef  ARM_VARIANT
18602 #define ARM_VARIANT    & arm_ext_virt
18603 #undef  THUMB_VARIANT
18604 #define THUMB_VARIANT    & arm_ext_virt
18605
18606  TCE("hvc",     1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
18607  TCE("eret",    160006e, f3de8f00, 0, (), noargs, noargs),
18608
18609 #undef  ARM_VARIANT
18610 #define ARM_VARIANT    & arm_ext_v6t2
18611 #undef  THUMB_VARIANT
18612 #define THUMB_VARIANT  & arm_ext_v6t2
18613
18614  TCE("bfc",     7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
18615  TCE("bfi",     7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
18616  TCE("sbfx",    7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
18617  TCE("ubfx",    7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
18618
18619  TCE("mls",     0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
18620  TCE("movw",    3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
18621  TCE("movt",    3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
18622  TCE("rbit",    6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
18623
18624  TC3("ldrht",   03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18625  TC3("ldrsht",  03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18626  TC3("ldrsbt",  03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18627  TC3("strht",   02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
18628
18629  /* Thumb-only instructions.  */
18630 #undef  ARM_VARIANT
18631 #define ARM_VARIANT NULL
18632   TUE("cbnz",     0,           b900,     2, (RR, EXP), 0, t_cbz),
18633   TUE("cbz",      0,           b100,     2, (RR, EXP), 0, t_cbz),
18634
18635  /* ARM does not really have an IT instruction, so always allow it.
18636     The opcode is copied from Thumb in order to allow warnings in
18637     -mimplicit-it=[never | arm] modes.  */
18638 #undef  ARM_VARIANT
18639 #define ARM_VARIANT  & arm_ext_v1
18640
18641  TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
18642  TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
18643  TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
18644  TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
18645  TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
18646  TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
18647  TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
18648  TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
18649  TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
18650  TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
18651  TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
18652  TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
18653  TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
18654  TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
18655  TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
18656  /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
18657  TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
18658  TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
18659
18660  /* Thumb2 only instructions.  */
18661 #undef  ARM_VARIANT
18662 #define ARM_VARIANT  NULL
18663
18664  TCE("addw",    0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18665  TCE("subw",    0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
18666  TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
18667  TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
18668  TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
18669  TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
18670
18671  /* Hardware division instructions.  */
18672 #undef  ARM_VARIANT
18673 #define ARM_VARIANT    & arm_ext_adiv
18674 #undef  THUMB_VARIANT
18675 #define THUMB_VARIANT  & arm_ext_div
18676
18677  TCE("sdiv",    710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
18678  TCE("udiv",    730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
18679
18680  /* ARM V6M/V7 instructions.  */
18681 #undef  ARM_VARIANT
18682 #define ARM_VARIANT    & arm_ext_barrier
18683 #undef  THUMB_VARIANT
18684 #define THUMB_VARIANT  & arm_ext_barrier
18685
18686  TUF("dmb",     57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, barrier),
18687  TUF("dsb",     57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, barrier),
18688  TUF("isb",     57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, barrier),
18689
18690  /* ARM V7 instructions.  */
18691 #undef  ARM_VARIANT
18692 #define ARM_VARIANT    & arm_ext_v7
18693 #undef  THUMB_VARIANT
18694 #define THUMB_VARIANT  & arm_ext_v7
18695
18696  TUF("pli",     450f000, f910f000, 1, (ADDR),     pli,      t_pld),
18697  TCE("dbg",     320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
18698
18699 #undef  ARM_VARIANT
18700 #define ARM_VARIANT    & arm_ext_mp
18701 #undef  THUMB_VARIANT
18702 #define THUMB_VARIANT  & arm_ext_mp
18703
18704  TUF("pldw",    410f000, f830f000, 1, (ADDR),   pld,    t_pld),
18705
18706  /* AArchv8 instructions.  */
18707 #undef  ARM_VARIANT
18708 #define ARM_VARIANT   & arm_ext_v8
18709 #undef  THUMB_VARIANT
18710 #define THUMB_VARIANT & arm_ext_v8
18711
18712  tCE("sevl",    320f005, _sevl,    0, (),               noargs, t_hint),
18713  TUE("hlt",     1000070, ba80,     1, (oIffffb),        bkpt,   t_hlt),
18714  TCE("ldaex",   1900e9f, e8d00fef, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18715  TCE("ldaexd",  1b00e9f, e8d000ff, 3, (RRnpc, oRRnpc, RRnpcb),
18716                                                         ldrexd, t_ldrexd),
18717  TCE("ldaexb",  1d00e9f, e8d00fcf, 2, (RRnpc,RRnpcb),   rd_rn,  rd_rn),
18718  TCE("ldaexh",  1f00e9f, e8d00fdf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18719  TCE("stlex",   1800e90, e8c00fe0, 3, (RRnpc, RRnpc, RRnpcb),
18720                                                         stlex,  t_stlex),
18721  TCE("stlexd",  1a00e90, e8c000f0, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb),
18722                                                         strexd, t_strexd),
18723  TCE("stlexb",  1c00e90, e8c00fc0, 3, (RRnpc, RRnpc, RRnpcb),
18724                                                         stlex, t_stlex),
18725  TCE("stlexh",  1e00e90, e8c00fd0, 3, (RRnpc, RRnpc, RRnpcb),
18726                                                         stlex, t_stlex),
18727  TCE("lda",     1900c9f, e8d00faf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18728  TCE("ldab",    1d00c9f, e8d00f8f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18729  TCE("ldah",    1f00c9f, e8d00f9f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
18730  TCE("stl",     180fc90, e8c00faf, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18731  TCE("stlb",    1c0fc90, e8c00f8f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18732  TCE("stlh",    1e0fc90, e8c00f9f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
18733
18734  /* ARMv8 T32 only.  */
18735 #undef  ARM_VARIANT
18736 #define ARM_VARIANT  NULL
18737  TUF("dcps1",   0,       f78f8001, 0, (),       noargs, noargs),
18738  TUF("dcps2",   0,       f78f8002, 0, (),       noargs, noargs),
18739  TUF("dcps3",   0,       f78f8003, 0, (),       noargs, noargs),
18740
18741   /* FP for ARMv8.  */
18742 #undef  ARM_VARIANT
18743 #define ARM_VARIANT   & fpu_vfp_ext_armv8
18744 #undef  THUMB_VARIANT
18745 #define THUMB_VARIANT & fpu_vfp_ext_armv8
18746
18747   nUF(vseleq, _vseleq, 3, (RVSD, RVSD, RVSD),           vsel),
18748   nUF(vselvs, _vselvs, 3, (RVSD, RVSD, RVSD),           vsel),
18749   nUF(vselge, _vselge, 3, (RVSD, RVSD, RVSD),           vsel),
18750   nUF(vselgt, _vselgt, 3, (RVSD, RVSD, RVSD),           vsel),
18751   nUF(vmaxnm, _vmaxnm, 3, (RNSDQ, oRNSDQ, RNSDQ),       vmaxnm),
18752   nUF(vminnm, _vminnm, 3, (RNSDQ, oRNSDQ, RNSDQ),       vmaxnm),
18753   nUF(vcvta,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvta),
18754   nUF(vcvtn,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtn),
18755   nUF(vcvtp,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtp),
18756   nUF(vcvtm,  _vcvta,  2, (RNSDQ, oRNSDQ),              neon_cvtm),
18757   nCE(vrintr, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintr),
18758   nCE(vrintz, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintz),
18759   nCE(vrintx, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintx),
18760   nUF(vrinta, _vrinta, 2, (RNSDQ, oRNSDQ),              vrinta),
18761   nUF(vrintn, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintn),
18762   nUF(vrintp, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintp),
18763   nUF(vrintm, _vrinta, 2, (RNSDQ, oRNSDQ),              vrintm),
18764
18765   /* Crypto v1 extensions.  */
18766 #undef  ARM_VARIANT
18767 #define ARM_VARIANT & fpu_crypto_ext_armv8
18768 #undef  THUMB_VARIANT
18769 #define THUMB_VARIANT & fpu_crypto_ext_armv8
18770
18771   nUF(aese, _aes, 2, (RNQ, RNQ), aese),
18772   nUF(aesd, _aes, 2, (RNQ, RNQ), aesd),
18773   nUF(aesmc, _aes, 2, (RNQ, RNQ), aesmc),
18774   nUF(aesimc, _aes, 2, (RNQ, RNQ), aesimc),
18775   nUF(sha1c, _sha3op, 3, (RNQ, RNQ, RNQ), sha1c),
18776   nUF(sha1p, _sha3op, 3, (RNQ, RNQ, RNQ), sha1p),
18777   nUF(sha1m, _sha3op, 3, (RNQ, RNQ, RNQ), sha1m),
18778   nUF(sha1su0, _sha3op, 3, (RNQ, RNQ, RNQ), sha1su0),
18779   nUF(sha256h, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h),
18780   nUF(sha256h2, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h2),
18781   nUF(sha256su1, _sha3op, 3, (RNQ, RNQ, RNQ), sha256su1),
18782   nUF(sha1h, _sha1h, 2, (RNQ, RNQ), sha1h),
18783   nUF(sha1su1, _sha2op, 2, (RNQ, RNQ), sha1su1),
18784   nUF(sha256su0, _sha2op, 2, (RNQ, RNQ), sha256su0),
18785
18786 #undef  ARM_VARIANT
18787 #define ARM_VARIANT   & crc_ext_armv8
18788 #undef  THUMB_VARIANT
18789 #define THUMB_VARIANT & crc_ext_armv8
18790   TUEc("crc32b", 1000040, fac0f080, 3, (RR, oRR, RR), crc32b),
18791   TUEc("crc32h", 1200040, fac0f090, 3, (RR, oRR, RR), crc32h),
18792   TUEc("crc32w", 1400040, fac0f0a0, 3, (RR, oRR, RR), crc32w),
18793   TUEc("crc32cb",1000240, fad0f080, 3, (RR, oRR, RR), crc32cb),
18794   TUEc("crc32ch",1200240, fad0f090, 3, (RR, oRR, RR), crc32ch),
18795   TUEc("crc32cw",1400240, fad0f0a0, 3, (RR, oRR, RR), crc32cw),
18796
18797 #undef  ARM_VARIANT
18798 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
18799 #undef  THUMB_VARIANT
18800 #define THUMB_VARIANT NULL
18801
18802  cCE("wfs",     e200110, 1, (RR),            rd),
18803  cCE("rfs",     e300110, 1, (RR),            rd),
18804  cCE("wfc",     e400110, 1, (RR),            rd),
18805  cCE("rfc",     e500110, 1, (RR),            rd),
18806
18807  cCL("ldfs",    c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18808  cCL("ldfd",    c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18809  cCL("ldfe",    c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18810  cCL("ldfp",    c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18811
18812  cCL("stfs",    c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18813  cCL("stfd",    c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18814  cCL("stfe",    c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18815  cCL("stfp",    c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
18816
18817  cCL("mvfs",    e008100, 2, (RF, RF_IF),     rd_rm),
18818  cCL("mvfsp",   e008120, 2, (RF, RF_IF),     rd_rm),
18819  cCL("mvfsm",   e008140, 2, (RF, RF_IF),     rd_rm),
18820  cCL("mvfsz",   e008160, 2, (RF, RF_IF),     rd_rm),
18821  cCL("mvfd",    e008180, 2, (RF, RF_IF),     rd_rm),
18822  cCL("mvfdp",   e0081a0, 2, (RF, RF_IF),     rd_rm),
18823  cCL("mvfdm",   e0081c0, 2, (RF, RF_IF),     rd_rm),
18824  cCL("mvfdz",   e0081e0, 2, (RF, RF_IF),     rd_rm),
18825  cCL("mvfe",    e088100, 2, (RF, RF_IF),     rd_rm),
18826  cCL("mvfep",   e088120, 2, (RF, RF_IF),     rd_rm),
18827  cCL("mvfem",   e088140, 2, (RF, RF_IF),     rd_rm),
18828  cCL("mvfez",   e088160, 2, (RF, RF_IF),     rd_rm),
18829
18830  cCL("mnfs",    e108100, 2, (RF, RF_IF),     rd_rm),
18831  cCL("mnfsp",   e108120, 2, (RF, RF_IF),     rd_rm),
18832  cCL("mnfsm",   e108140, 2, (RF, RF_IF),     rd_rm),
18833  cCL("mnfsz",   e108160, 2, (RF, RF_IF),     rd_rm),
18834  cCL("mnfd",    e108180, 2, (RF, RF_IF),     rd_rm),
18835  cCL("mnfdp",   e1081a0, 2, (RF, RF_IF),     rd_rm),
18836  cCL("mnfdm",   e1081c0, 2, (RF, RF_IF),     rd_rm),
18837  cCL("mnfdz",   e1081e0, 2, (RF, RF_IF),     rd_rm),
18838  cCL("mnfe",    e188100, 2, (RF, RF_IF),     rd_rm),
18839  cCL("mnfep",   e188120, 2, (RF, RF_IF),     rd_rm),
18840  cCL("mnfem",   e188140, 2, (RF, RF_IF),     rd_rm),
18841  cCL("mnfez",   e188160, 2, (RF, RF_IF),     rd_rm),
18842
18843  cCL("abss",    e208100, 2, (RF, RF_IF),     rd_rm),
18844  cCL("abssp",   e208120, 2, (RF, RF_IF),     rd_rm),
18845  cCL("abssm",   e208140, 2, (RF, RF_IF),     rd_rm),
18846  cCL("abssz",   e208160, 2, (RF, RF_IF),     rd_rm),
18847  cCL("absd",    e208180, 2, (RF, RF_IF),     rd_rm),
18848  cCL("absdp",   e2081a0, 2, (RF, RF_IF),     rd_rm),
18849  cCL("absdm",   e2081c0, 2, (RF, RF_IF),     rd_rm),
18850  cCL("absdz",   e2081e0, 2, (RF, RF_IF),     rd_rm),
18851  cCL("abse",    e288100, 2, (RF, RF_IF),     rd_rm),
18852  cCL("absep",   e288120, 2, (RF, RF_IF),     rd_rm),
18853  cCL("absem",   e288140, 2, (RF, RF_IF),     rd_rm),
18854  cCL("absez",   e288160, 2, (RF, RF_IF),     rd_rm),
18855
18856  cCL("rnds",    e308100, 2, (RF, RF_IF),     rd_rm),
18857  cCL("rndsp",   e308120, 2, (RF, RF_IF),     rd_rm),
18858  cCL("rndsm",   e308140, 2, (RF, RF_IF),     rd_rm),
18859  cCL("rndsz",   e308160, 2, (RF, RF_IF),     rd_rm),
18860  cCL("rndd",    e308180, 2, (RF, RF_IF),     rd_rm),
18861  cCL("rnddp",   e3081a0, 2, (RF, RF_IF),     rd_rm),
18862  cCL("rnddm",   e3081c0, 2, (RF, RF_IF),     rd_rm),
18863  cCL("rnddz",   e3081e0, 2, (RF, RF_IF),     rd_rm),
18864  cCL("rnde",    e388100, 2, (RF, RF_IF),     rd_rm),
18865  cCL("rndep",   e388120, 2, (RF, RF_IF),     rd_rm),
18866  cCL("rndem",   e388140, 2, (RF, RF_IF),     rd_rm),
18867  cCL("rndez",   e388160, 2, (RF, RF_IF),     rd_rm),
18868
18869  cCL("sqts",    e408100, 2, (RF, RF_IF),     rd_rm),
18870  cCL("sqtsp",   e408120, 2, (RF, RF_IF),     rd_rm),
18871  cCL("sqtsm",   e408140, 2, (RF, RF_IF),     rd_rm),
18872  cCL("sqtsz",   e408160, 2, (RF, RF_IF),     rd_rm),
18873  cCL("sqtd",    e408180, 2, (RF, RF_IF),     rd_rm),
18874  cCL("sqtdp",   e4081a0, 2, (RF, RF_IF),     rd_rm),
18875  cCL("sqtdm",   e4081c0, 2, (RF, RF_IF),     rd_rm),
18876  cCL("sqtdz",   e4081e0, 2, (RF, RF_IF),     rd_rm),
18877  cCL("sqte",    e488100, 2, (RF, RF_IF),     rd_rm),
18878  cCL("sqtep",   e488120, 2, (RF, RF_IF),     rd_rm),
18879  cCL("sqtem",   e488140, 2, (RF, RF_IF),     rd_rm),
18880  cCL("sqtez",   e488160, 2, (RF, RF_IF),     rd_rm),
18881
18882  cCL("logs",    e508100, 2, (RF, RF_IF),     rd_rm),
18883  cCL("logsp",   e508120, 2, (RF, RF_IF),     rd_rm),
18884  cCL("logsm",   e508140, 2, (RF, RF_IF),     rd_rm),
18885  cCL("logsz",   e508160, 2, (RF, RF_IF),     rd_rm),
18886  cCL("logd",    e508180, 2, (RF, RF_IF),     rd_rm),
18887  cCL("logdp",   e5081a0, 2, (RF, RF_IF),     rd_rm),
18888  cCL("logdm",   e5081c0, 2, (RF, RF_IF),     rd_rm),
18889  cCL("logdz",   e5081e0, 2, (RF, RF_IF),     rd_rm),
18890  cCL("loge",    e588100, 2, (RF, RF_IF),     rd_rm),
18891  cCL("logep",   e588120, 2, (RF, RF_IF),     rd_rm),
18892  cCL("logem",   e588140, 2, (RF, RF_IF),     rd_rm),
18893  cCL("logez",   e588160, 2, (RF, RF_IF),     rd_rm),
18894
18895  cCL("lgns",    e608100, 2, (RF, RF_IF),     rd_rm),
18896  cCL("lgnsp",   e608120, 2, (RF, RF_IF),     rd_rm),
18897  cCL("lgnsm",   e608140, 2, (RF, RF_IF),     rd_rm),
18898  cCL("lgnsz",   e608160, 2, (RF, RF_IF),     rd_rm),
18899  cCL("lgnd",    e608180, 2, (RF, RF_IF),     rd_rm),
18900  cCL("lgndp",   e6081a0, 2, (RF, RF_IF),     rd_rm),
18901  cCL("lgndm",   e6081c0, 2, (RF, RF_IF),     rd_rm),
18902  cCL("lgndz",   e6081e0, 2, (RF, RF_IF),     rd_rm),
18903  cCL("lgne",    e688100, 2, (RF, RF_IF),     rd_rm),
18904  cCL("lgnep",   e688120, 2, (RF, RF_IF),     rd_rm),
18905  cCL("lgnem",   e688140, 2, (RF, RF_IF),     rd_rm),
18906  cCL("lgnez",   e688160, 2, (RF, RF_IF),     rd_rm),
18907
18908  cCL("exps",    e708100, 2, (RF, RF_IF),     rd_rm),
18909  cCL("expsp",   e708120, 2, (RF, RF_IF),     rd_rm),
18910  cCL("expsm",   e708140, 2, (RF, RF_IF),     rd_rm),
18911  cCL("expsz",   e708160, 2, (RF, RF_IF),     rd_rm),
18912  cCL("expd",    e708180, 2, (RF, RF_IF),     rd_rm),
18913  cCL("expdp",   e7081a0, 2, (RF, RF_IF),     rd_rm),
18914  cCL("expdm",   e7081c0, 2, (RF, RF_IF),     rd_rm),
18915  cCL("expdz",   e7081e0, 2, (RF, RF_IF),     rd_rm),
18916  cCL("expe",    e788100, 2, (RF, RF_IF),     rd_rm),
18917  cCL("expep",   e788120, 2, (RF, RF_IF),     rd_rm),
18918  cCL("expem",   e788140, 2, (RF, RF_IF),     rd_rm),
18919  cCL("expdz",   e788160, 2, (RF, RF_IF),     rd_rm),
18920
18921  cCL("sins",    e808100, 2, (RF, RF_IF),     rd_rm),
18922  cCL("sinsp",   e808120, 2, (RF, RF_IF),     rd_rm),
18923  cCL("sinsm",   e808140, 2, (RF, RF_IF),     rd_rm),
18924  cCL("sinsz",   e808160, 2, (RF, RF_IF),     rd_rm),
18925  cCL("sind",    e808180, 2, (RF, RF_IF),     rd_rm),
18926  cCL("sindp",   e8081a0, 2, (RF, RF_IF),     rd_rm),
18927  cCL("sindm",   e8081c0, 2, (RF, RF_IF),     rd_rm),
18928  cCL("sindz",   e8081e0, 2, (RF, RF_IF),     rd_rm),
18929  cCL("sine",    e888100, 2, (RF, RF_IF),     rd_rm),
18930  cCL("sinep",   e888120, 2, (RF, RF_IF),     rd_rm),
18931  cCL("sinem",   e888140, 2, (RF, RF_IF),     rd_rm),
18932  cCL("sinez",   e888160, 2, (RF, RF_IF),     rd_rm),
18933
18934  cCL("coss",    e908100, 2, (RF, RF_IF),     rd_rm),
18935  cCL("cossp",   e908120, 2, (RF, RF_IF),     rd_rm),
18936  cCL("cossm",   e908140, 2, (RF, RF_IF),     rd_rm),
18937  cCL("cossz",   e908160, 2, (RF, RF_IF),     rd_rm),
18938  cCL("cosd",    e908180, 2, (RF, RF_IF),     rd_rm),
18939  cCL("cosdp",   e9081a0, 2, (RF, RF_IF),     rd_rm),
18940  cCL("cosdm",   e9081c0, 2, (RF, RF_IF),     rd_rm),
18941  cCL("cosdz",   e9081e0, 2, (RF, RF_IF),     rd_rm),
18942  cCL("cose",    e988100, 2, (RF, RF_IF),     rd_rm),
18943  cCL("cosep",   e988120, 2, (RF, RF_IF),     rd_rm),
18944  cCL("cosem",   e988140, 2, (RF, RF_IF),     rd_rm),
18945  cCL("cosez",   e988160, 2, (RF, RF_IF),     rd_rm),
18946
18947  cCL("tans",    ea08100, 2, (RF, RF_IF),     rd_rm),
18948  cCL("tansp",   ea08120, 2, (RF, RF_IF),     rd_rm),
18949  cCL("tansm",   ea08140, 2, (RF, RF_IF),     rd_rm),
18950  cCL("tansz",   ea08160, 2, (RF, RF_IF),     rd_rm),
18951  cCL("tand",    ea08180, 2, (RF, RF_IF),     rd_rm),
18952  cCL("tandp",   ea081a0, 2, (RF, RF_IF),     rd_rm),
18953  cCL("tandm",   ea081c0, 2, (RF, RF_IF),     rd_rm),
18954  cCL("tandz",   ea081e0, 2, (RF, RF_IF),     rd_rm),
18955  cCL("tane",    ea88100, 2, (RF, RF_IF),     rd_rm),
18956  cCL("tanep",   ea88120, 2, (RF, RF_IF),     rd_rm),
18957  cCL("tanem",   ea88140, 2, (RF, RF_IF),     rd_rm),
18958  cCL("tanez",   ea88160, 2, (RF, RF_IF),     rd_rm),
18959
18960  cCL("asns",    eb08100, 2, (RF, RF_IF),     rd_rm),
18961  cCL("asnsp",   eb08120, 2, (RF, RF_IF),     rd_rm),
18962  cCL("asnsm",   eb08140, 2, (RF, RF_IF),     rd_rm),
18963  cCL("asnsz",   eb08160, 2, (RF, RF_IF),     rd_rm),
18964  cCL("asnd",    eb08180, 2, (RF, RF_IF),     rd_rm),
18965  cCL("asndp",   eb081a0, 2, (RF, RF_IF),     rd_rm),
18966  cCL("asndm",   eb081c0, 2, (RF, RF_IF),     rd_rm),
18967  cCL("asndz",   eb081e0, 2, (RF, RF_IF),     rd_rm),
18968  cCL("asne",    eb88100, 2, (RF, RF_IF),     rd_rm),
18969  cCL("asnep",   eb88120, 2, (RF, RF_IF),     rd_rm),
18970  cCL("asnem",   eb88140, 2, (RF, RF_IF),     rd_rm),
18971  cCL("asnez",   eb88160, 2, (RF, RF_IF),     rd_rm),
18972
18973  cCL("acss",    ec08100, 2, (RF, RF_IF),     rd_rm),
18974  cCL("acssp",   ec08120, 2, (RF, RF_IF),     rd_rm),
18975  cCL("acssm",   ec08140, 2, (RF, RF_IF),     rd_rm),
18976  cCL("acssz",   ec08160, 2, (RF, RF_IF),     rd_rm),
18977  cCL("acsd",    ec08180, 2, (RF, RF_IF),     rd_rm),
18978  cCL("acsdp",   ec081a0, 2, (RF, RF_IF),     rd_rm),
18979  cCL("acsdm",   ec081c0, 2, (RF, RF_IF),     rd_rm),
18980  cCL("acsdz",   ec081e0, 2, (RF, RF_IF),     rd_rm),
18981  cCL("acse",    ec88100, 2, (RF, RF_IF),     rd_rm),
18982  cCL("acsep",   ec88120, 2, (RF, RF_IF),     rd_rm),
18983  cCL("acsem",   ec88140, 2, (RF, RF_IF),     rd_rm),
18984  cCL("acsez",   ec88160, 2, (RF, RF_IF),     rd_rm),
18985
18986  cCL("atns",    ed08100, 2, (RF, RF_IF),     rd_rm),
18987  cCL("atnsp",   ed08120, 2, (RF, RF_IF),     rd_rm),
18988  cCL("atnsm",   ed08140, 2, (RF, RF_IF),     rd_rm),
18989  cCL("atnsz",   ed08160, 2, (RF, RF_IF),     rd_rm),
18990  cCL("atnd",    ed08180, 2, (RF, RF_IF),     rd_rm),
18991  cCL("atndp",   ed081a0, 2, (RF, RF_IF),     rd_rm),
18992  cCL("atndm",   ed081c0, 2, (RF, RF_IF),     rd_rm),
18993  cCL("atndz",   ed081e0, 2, (RF, RF_IF),     rd_rm),
18994  cCL("atne",    ed88100, 2, (RF, RF_IF),     rd_rm),
18995  cCL("atnep",   ed88120, 2, (RF, RF_IF),     rd_rm),
18996  cCL("atnem",   ed88140, 2, (RF, RF_IF),     rd_rm),
18997  cCL("atnez",   ed88160, 2, (RF, RF_IF),     rd_rm),
18998
18999  cCL("urds",    ee08100, 2, (RF, RF_IF),     rd_rm),
19000  cCL("urdsp",   ee08120, 2, (RF, RF_IF),     rd_rm),
19001  cCL("urdsm",   ee08140, 2, (RF, RF_IF),     rd_rm),
19002  cCL("urdsz",   ee08160, 2, (RF, RF_IF),     rd_rm),
19003  cCL("urdd",    ee08180, 2, (RF, RF_IF),     rd_rm),
19004  cCL("urddp",   ee081a0, 2, (RF, RF_IF),     rd_rm),
19005  cCL("urddm",   ee081c0, 2, (RF, RF_IF),     rd_rm),
19006  cCL("urddz",   ee081e0, 2, (RF, RF_IF),     rd_rm),
19007  cCL("urde",    ee88100, 2, (RF, RF_IF),     rd_rm),
19008  cCL("urdep",   ee88120, 2, (RF, RF_IF),     rd_rm),
19009  cCL("urdem",   ee88140, 2, (RF, RF_IF),     rd_rm),
19010  cCL("urdez",   ee88160, 2, (RF, RF_IF),     rd_rm),
19011
19012  cCL("nrms",    ef08100, 2, (RF, RF_IF),     rd_rm),
19013  cCL("nrmsp",   ef08120, 2, (RF, RF_IF),     rd_rm),
19014  cCL("nrmsm",   ef08140, 2, (RF, RF_IF),     rd_rm),
19015  cCL("nrmsz",   ef08160, 2, (RF, RF_IF),     rd_rm),
19016  cCL("nrmd",    ef08180, 2, (RF, RF_IF),     rd_rm),
19017  cCL("nrmdp",   ef081a0, 2, (RF, RF_IF),     rd_rm),
19018  cCL("nrmdm",   ef081c0, 2, (RF, RF_IF),     rd_rm),
19019  cCL("nrmdz",   ef081e0, 2, (RF, RF_IF),     rd_rm),
19020  cCL("nrme",    ef88100, 2, (RF, RF_IF),     rd_rm),
19021  cCL("nrmep",   ef88120, 2, (RF, RF_IF),     rd_rm),
19022  cCL("nrmem",   ef88140, 2, (RF, RF_IF),     rd_rm),
19023  cCL("nrmez",   ef88160, 2, (RF, RF_IF),     rd_rm),
19024
19025  cCL("adfs",    e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
19026  cCL("adfsp",   e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
19027  cCL("adfsm",   e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
19028  cCL("adfsz",   e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
19029  cCL("adfd",    e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
19030  cCL("adfdp",   e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19031  cCL("adfdm",   e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19032  cCL("adfdz",   e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19033  cCL("adfe",    e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
19034  cCL("adfep",   e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
19035  cCL("adfem",   e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
19036  cCL("adfez",   e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
19037
19038  cCL("sufs",    e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
19039  cCL("sufsp",   e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
19040  cCL("sufsm",   e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
19041  cCL("sufsz",   e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
19042  cCL("sufd",    e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
19043  cCL("sufdp",   e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19044  cCL("sufdm",   e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19045  cCL("sufdz",   e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19046  cCL("sufe",    e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
19047  cCL("sufep",   e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
19048  cCL("sufem",   e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
19049  cCL("sufez",   e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
19050
19051  cCL("rsfs",    e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
19052  cCL("rsfsp",   e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
19053  cCL("rsfsm",   e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
19054  cCL("rsfsz",   e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
19055  cCL("rsfd",    e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
19056  cCL("rsfdp",   e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19057  cCL("rsfdm",   e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19058  cCL("rsfdz",   e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19059  cCL("rsfe",    e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
19060  cCL("rsfep",   e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
19061  cCL("rsfem",   e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
19062  cCL("rsfez",   e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
19063
19064  cCL("mufs",    e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
19065  cCL("mufsp",   e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
19066  cCL("mufsm",   e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
19067  cCL("mufsz",   e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
19068  cCL("mufd",    e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
19069  cCL("mufdp",   e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19070  cCL("mufdm",   e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19071  cCL("mufdz",   e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19072  cCL("mufe",    e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
19073  cCL("mufep",   e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
19074  cCL("mufem",   e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
19075  cCL("mufez",   e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
19076
19077  cCL("dvfs",    e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
19078  cCL("dvfsp",   e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
19079  cCL("dvfsm",   e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
19080  cCL("dvfsz",   e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
19081  cCL("dvfd",    e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
19082  cCL("dvfdp",   e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19083  cCL("dvfdm",   e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19084  cCL("dvfdz",   e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19085  cCL("dvfe",    e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
19086  cCL("dvfep",   e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
19087  cCL("dvfem",   e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
19088  cCL("dvfez",   e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
19089
19090  cCL("rdfs",    e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
19091  cCL("rdfsp",   e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
19092  cCL("rdfsm",   e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
19093  cCL("rdfsz",   e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
19094  cCL("rdfd",    e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
19095  cCL("rdfdp",   e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19096  cCL("rdfdm",   e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19097  cCL("rdfdz",   e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19098  cCL("rdfe",    e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
19099  cCL("rdfep",   e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
19100  cCL("rdfem",   e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
19101  cCL("rdfez",   e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
19102
19103  cCL("pows",    e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
19104  cCL("powsp",   e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
19105  cCL("powsm",   e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
19106  cCL("powsz",   e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
19107  cCL("powd",    e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
19108  cCL("powdp",   e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19109  cCL("powdm",   e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19110  cCL("powdz",   e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19111  cCL("powe",    e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
19112  cCL("powep",   e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
19113  cCL("powem",   e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
19114  cCL("powez",   e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
19115
19116  cCL("rpws",    e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
19117  cCL("rpwsp",   e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
19118  cCL("rpwsm",   e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
19119  cCL("rpwsz",   e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
19120  cCL("rpwd",    e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
19121  cCL("rpwdp",   e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19122  cCL("rpwdm",   e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19123  cCL("rpwdz",   e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19124  cCL("rpwe",    e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
19125  cCL("rpwep",   e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
19126  cCL("rpwem",   e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
19127  cCL("rpwez",   e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
19128
19129  cCL("rmfs",    e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
19130  cCL("rmfsp",   e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
19131  cCL("rmfsm",   e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
19132  cCL("rmfsz",   e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
19133  cCL("rmfd",    e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
19134  cCL("rmfdp",   e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19135  cCL("rmfdm",   e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19136  cCL("rmfdz",   e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19137  cCL("rmfe",    e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
19138  cCL("rmfep",   e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
19139  cCL("rmfem",   e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
19140  cCL("rmfez",   e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
19141
19142  cCL("fmls",    e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
19143  cCL("fmlsp",   e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
19144  cCL("fmlsm",   e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
19145  cCL("fmlsz",   e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
19146  cCL("fmld",    e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
19147  cCL("fmldp",   e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19148  cCL("fmldm",   e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19149  cCL("fmldz",   e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19150  cCL("fmle",    e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
19151  cCL("fmlep",   e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
19152  cCL("fmlem",   e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
19153  cCL("fmlez",   e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
19154
19155  cCL("fdvs",    ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19156  cCL("fdvsp",   ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19157  cCL("fdvsm",   ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19158  cCL("fdvsz",   ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19159  cCL("fdvd",    ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19160  cCL("fdvdp",   ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19161  cCL("fdvdm",   ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19162  cCL("fdvdz",   ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19163  cCL("fdve",    ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19164  cCL("fdvep",   ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19165  cCL("fdvem",   ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19166  cCL("fdvez",   ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19167
19168  cCL("frds",    eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19169  cCL("frdsp",   eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19170  cCL("frdsm",   eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19171  cCL("frdsz",   eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19172  cCL("frdd",    eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19173  cCL("frddp",   eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19174  cCL("frddm",   eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19175  cCL("frddz",   eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19176  cCL("frde",    eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19177  cCL("frdep",   eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19178  cCL("frdem",   eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19179  cCL("frdez",   eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19180
19181  cCL("pols",    ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
19182  cCL("polsp",   ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
19183  cCL("polsm",   ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
19184  cCL("polsz",   ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
19185  cCL("pold",    ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
19186  cCL("poldp",   ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
19187  cCL("poldm",   ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
19188  cCL("poldz",   ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
19189  cCL("pole",    ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
19190  cCL("polep",   ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
19191  cCL("polem",   ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
19192  cCL("polez",   ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
19193
19194  cCE("cmf",     e90f110, 2, (RF, RF_IF),     fpa_cmp),
19195  C3E("cmfe",    ed0f110, 2, (RF, RF_IF),     fpa_cmp),
19196  cCE("cnf",     eb0f110, 2, (RF, RF_IF),     fpa_cmp),
19197  C3E("cnfe",    ef0f110, 2, (RF, RF_IF),     fpa_cmp),
19198
19199  cCL("flts",    e000110, 2, (RF, RR),        rn_rd),
19200  cCL("fltsp",   e000130, 2, (RF, RR),        rn_rd),
19201  cCL("fltsm",   e000150, 2, (RF, RR),        rn_rd),
19202  cCL("fltsz",   e000170, 2, (RF, RR),        rn_rd),
19203  cCL("fltd",    e000190, 2, (RF, RR),        rn_rd),
19204  cCL("fltdp",   e0001b0, 2, (RF, RR),        rn_rd),
19205  cCL("fltdm",   e0001d0, 2, (RF, RR),        rn_rd),
19206  cCL("fltdz",   e0001f0, 2, (RF, RR),        rn_rd),
19207  cCL("flte",    e080110, 2, (RF, RR),        rn_rd),
19208  cCL("fltep",   e080130, 2, (RF, RR),        rn_rd),
19209  cCL("fltem",   e080150, 2, (RF, RR),        rn_rd),
19210  cCL("fltez",   e080170, 2, (RF, RR),        rn_rd),
19211
19212   /* The implementation of the FIX instruction is broken on some
19213      assemblers, in that it accepts a precision specifier as well as a
19214      rounding specifier, despite the fact that this is meaningless.
19215      To be more compatible, we accept it as well, though of course it
19216      does not set any bits.  */
19217  cCE("fix",     e100110, 2, (RR, RF),        rd_rm),
19218  cCL("fixp",    e100130, 2, (RR, RF),        rd_rm),
19219  cCL("fixm",    e100150, 2, (RR, RF),        rd_rm),
19220  cCL("fixz",    e100170, 2, (RR, RF),        rd_rm),
19221  cCL("fixsp",   e100130, 2, (RR, RF),        rd_rm),
19222  cCL("fixsm",   e100150, 2, (RR, RF),        rd_rm),
19223  cCL("fixsz",   e100170, 2, (RR, RF),        rd_rm),
19224  cCL("fixdp",   e100130, 2, (RR, RF),        rd_rm),
19225  cCL("fixdm",   e100150, 2, (RR, RF),        rd_rm),
19226  cCL("fixdz",   e100170, 2, (RR, RF),        rd_rm),
19227  cCL("fixep",   e100130, 2, (RR, RF),        rd_rm),
19228  cCL("fixem",   e100150, 2, (RR, RF),        rd_rm),
19229  cCL("fixez",   e100170, 2, (RR, RF),        rd_rm),
19230
19231   /* Instructions that were new with the real FPA, call them V2.  */
19232 #undef  ARM_VARIANT
19233 #define ARM_VARIANT  & fpu_fpa_ext_v2
19234
19235  cCE("lfm",     c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19236  cCL("lfmfd",   c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19237  cCL("lfmea",   d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19238  cCE("sfm",     c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19239  cCL("sfmfd",   d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19240  cCL("sfmea",   c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
19241
19242 #undef  ARM_VARIANT
19243 #define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
19244
19245   /* Moves and type conversions.  */
19246  cCE("fcpys",   eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
19247  cCE("fmrs",    e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
19248  cCE("fmsr",    e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
19249  cCE("fmstat",  ef1fa10, 0, (),               noargs),
19250  cCE("vmrs",    ef00a10, 2, (APSR_RR, RVC),   vmrs),
19251  cCE("vmsr",    ee00a10, 2, (RVC, RR),        vmsr),
19252  cCE("fsitos",  eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19253  cCE("fuitos",  eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
19254  cCE("ftosis",  ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
19255  cCE("ftosizs", ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19256  cCE("ftouis",  ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
19257  cCE("ftouizs", ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19258  cCE("fmrx",    ef00a10, 2, (RR, RVC),        rd_rn),
19259  cCE("fmxr",    ee00a10, 2, (RVC, RR),        rn_rd),
19260
19261   /* Memory operations.  */
19262  cCE("flds",    d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
19263  cCE("fsts",    d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
19264  cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19265  cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19266  cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19267  cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19268  cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19269  cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19270  cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19271  cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19272  cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19273  cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
19274  cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19275  cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
19276  cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19277  cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
19278  cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19279  cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
19280
19281   /* Monadic operations.  */
19282  cCE("fabss",   eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19283  cCE("fnegs",   eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
19284  cCE("fsqrts",  eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19285
19286   /* Dyadic operations.  */
19287  cCE("fadds",   e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19288  cCE("fsubs",   e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19289  cCE("fmuls",   e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19290  cCE("fdivs",   e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19291  cCE("fmacs",   e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19292  cCE("fmscs",   e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19293  cCE("fnmuls",  e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19294  cCE("fnmacs",  e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19295  cCE("fnmscs",  e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19296
19297   /* Comparisons.  */
19298  cCE("fcmps",   eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
19299  cCE("fcmpzs",  eb50a40, 1, (RVS),            vfp_sp_compare_z),
19300  cCE("fcmpes",  eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
19301  cCE("fcmpezs", eb50ac0, 1, (RVS),            vfp_sp_compare_z),
19302
19303  /* Double precision load/store are still present on single precision
19304     implementations.  */
19305  cCE("fldd",    d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
19306  cCE("fstd",    d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
19307  cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19308  cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19309  cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19310  cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19311  cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19312  cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
19313  cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19314  cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
19315
19316 #undef  ARM_VARIANT
19317 #define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
19318
19319   /* Moves and type conversions.  */
19320  cCE("fcpyd",   eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19321  cCE("fcvtds",  eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19322  cCE("fcvtsd",  eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19323  cCE("fmdhr",   e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
19324  cCE("fmdlr",   e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
19325  cCE("fmrdh",   e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
19326  cCE("fmrdl",   e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
19327  cCE("fsitod",  eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19328  cCE("fuitod",  eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
19329  cCE("ftosid",  ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19330  cCE("ftosizd", ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19331  cCE("ftouid",  ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19332  cCE("ftouizd", ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
19333
19334   /* Monadic operations.  */
19335  cCE("fabsd",   eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19336  cCE("fnegd",   eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19337  cCE("fsqrtd",  eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19338
19339   /* Dyadic operations.  */
19340  cCE("faddd",   e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19341  cCE("fsubd",   e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19342  cCE("fmuld",   e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19343  cCE("fdivd",   e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19344  cCE("fmacd",   e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19345  cCE("fmscd",   e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19346  cCE("fnmuld",  e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19347  cCE("fnmacd",  e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19348  cCE("fnmscd",  e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19349
19350   /* Comparisons.  */
19351  cCE("fcmpd",   eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
19352  cCE("fcmpzd",  eb50b40, 1, (RVD),            vfp_dp_rd),
19353  cCE("fcmped",  eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
19354  cCE("fcmpezd", eb50bc0, 1, (RVD),            vfp_dp_rd),
19355
19356 #undef  ARM_VARIANT
19357 #define ARM_VARIANT  & fpu_vfp_ext_v2
19358
19359  cCE("fmsrr",   c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
19360  cCE("fmrrs",   c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
19361  cCE("fmdrr",   c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
19362  cCE("fmrrd",   c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
19363
19364 /* Instructions which may belong to either the Neon or VFP instruction sets.
19365    Individual encoder functions perform additional architecture checks.  */
19366 #undef  ARM_VARIANT
19367 #define ARM_VARIANT    & fpu_vfp_ext_v1xd
19368 #undef  THUMB_VARIANT
19369 #define THUMB_VARIANT  & fpu_vfp_ext_v1xd
19370
19371   /* These mnemonics are unique to VFP.  */
19372  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
19373  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
19374  nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19375  nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19376  nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19377  nCE(vcmp,      _vcmp,    2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
19378  nCE(vcmpe,     _vcmpe,   2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
19379  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
19380  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
19381  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
19382
19383   /* Mnemonics shared by Neon and VFP.  */
19384  nCEF(vmul,     _vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
19385  nCEF(vmla,     _vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
19386  nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
19387
19388  nCEF(vadd,     _vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
19389  nCEF(vsub,     _vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
19390
19391  NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19392  NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
19393
19394  NCE(vldm,      c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19395  NCE(vldmia,    c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19396  NCE(vldmdb,    d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19397  NCE(vstm,      c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19398  NCE(vstmia,    c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19399  NCE(vstmdb,    d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
19400  NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
19401  NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
19402
19403  nCEF(vcvt,     _vcvt,   3, (RNSDQ, RNSDQ, oI32z), neon_cvt),
19404  nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
19405  NCEF(vcvtb,    eb20a40, 2, (RVSD, RVSD), neon_cvtb),
19406  NCEF(vcvtt,    eb20a40, 2, (RVSD, RVSD), neon_cvtt),
19407
19408
19409   /* NOTE: All VMOV encoding is special-cased!  */
19410  NCE(vmov,      0,       1, (VMOV), neon_mov),
19411  NCE(vmovq,     0,       1, (VMOV), neon_mov),
19412
19413 #undef  THUMB_VARIANT
19414 #define THUMB_VARIANT  & fpu_neon_ext_v1
19415 #undef  ARM_VARIANT
19416 #define ARM_VARIANT    & fpu_neon_ext_v1
19417
19418   /* Data processing with three registers of the same length.  */
19419   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
19420  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
19421  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
19422  NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19423  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19424  NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19425  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19426  NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
19427  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
19428   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
19429  NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19430  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
19431  NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
19432  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
19433  NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19434  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
19435  NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
19436  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
19437   /* If not immediate, fall back to neon_dyadic_i64_su.
19438      shl_imm should accept I8 I16 I32 I64,
19439      qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
19440  nUF(vshl,      _vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
19441  nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
19442  nUF(vqshl,     _vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
19443  nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
19444   /* Logic ops, types optional & ignored.  */
19445  nUF(vand,      _vand,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19446  nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19447  nUF(vbic,      _vbic,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19448  nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19449  nUF(vorr,      _vorr,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19450  nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19451  nUF(vorn,      _vorn,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
19452  nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
19453  nUF(veor,      _veor,    3, (RNDQ, oRNDQ, RNDQ),      neon_logic),
19454  nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
19455   /* Bitfield ops, untyped.  */
19456  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19457  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19458  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19459  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19460  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
19461  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
19462   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32.  */
19463  nUF(vabd,      _vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19464  nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19465  nUF(vmax,      _vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19466  nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19467  nUF(vmin,      _vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
19468  nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
19469   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
19470      back to neon_dyadic_if_su.  */
19471  nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19472  nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
19473  nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
19474  nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
19475  nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19476  nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
19477  nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
19478  nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
19479   /* Comparison. Type I8 I16 I32 F32.  */
19480  nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
19481  nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
19482   /* As above, D registers only.  */
19483  nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
19484  nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
19485   /* Int and float variants, signedness unimportant.  */
19486  nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
19487  nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
19488  nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
19489   /* Add/sub take types I8 I16 I32 I64 F32.  */
19490  nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
19491  nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
19492   /* vtst takes sizes 8, 16, 32.  */
19493  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
19494  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
19495   /* VMUL takes I8 I16 I32 F32 P8.  */
19496  nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
19497   /* VQD{R}MULH takes S16 S32.  */
19498  nUF(vqdmulh,   _vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19499  nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
19500  nUF(vqrdmulh,  _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
19501  nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
19502  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19503  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
19504  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
19505  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
19506  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19507  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
19508  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
19509  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
19510  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
19511  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
19512  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
19513  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
19514
19515   /* Two address, int/float. Types S8 S16 S32 F32.  */
19516  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
19517  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
19518
19519   /* Data processing with two registers and a shift amount.  */
19520   /* Right shifts, and variants with rounding.
19521      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
19522  NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19523  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
19524  NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
19525  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
19526  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
19527  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
19528  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
19529  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
19530   /* Shift and insert. Sizes accepted 8 16 32 64.  */
19531  NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
19532  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
19533  NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
19534  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
19535   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
19536  NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
19537  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
19538   /* Right shift immediate, saturating & narrowing, with rounding variants.
19539      Types accepted S16 S32 S64 U16 U32 U64.  */
19540  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19541  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
19542   /* As above, unsigned. Types accepted S16 S32 S64.  */
19543  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19544  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
19545   /* Right shift narrowing. Types accepted I16 I32 I64.  */
19546  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19547  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
19548   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
19549  nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
19550   /* CVT with optional immediate for fixed-point variant.  */
19551  nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
19552
19553  nUF(vmvn,      _vmvn,    2, (RNDQ, RNDQ_Ibig), neon_mvn),
19554  nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
19555
19556   /* Data processing, three registers of different lengths.  */
19557   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
19558  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
19559  NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
19560  NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
19561  NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
19562   /* If not scalar, fall back to neon_dyadic_long.
19563      Vector types as above, scalar types S16 S32 U16 U32.  */
19564  nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
19565  nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
19566   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
19567  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19568  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
19569   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
19570  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19571  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19572  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19573  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
19574   /* Saturating doubling multiplies. Types S16 S32.  */
19575  nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19576  nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19577  nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
19578   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
19579      S16 S32 U16 U32.  */
19580  nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
19581
19582   /* Extract. Size 8.  */
19583  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
19584  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
19585
19586   /* Two registers, miscellaneous.  */
19587   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
19588  NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
19589  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
19590  NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
19591  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
19592  NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
19593  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
19594   /* Vector replicate. Sizes 8 16 32.  */
19595  nCE(vdup,      _vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
19596  nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
19597   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
19598  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
19599   /* VMOVN. Types I16 I32 I64.  */
19600  nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
19601   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
19602  nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
19603   /* VQMOVUN. Types S16 S32 S64.  */
19604  nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
19605   /* VZIP / VUZP. Sizes 8 16 32.  */
19606  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
19607  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
19608  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
19609  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
19610   /* VQABS / VQNEG. Types S8 S16 S32.  */
19611  NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
19612  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
19613  NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
19614  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
19615   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
19616  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
19617  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
19618  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
19619  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
19620   /* Reciprocal estimates. Types U32 F32.  */
19621  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
19622  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
19623  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
19624  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
19625   /* VCLS. Types S8 S16 S32.  */
19626  NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
19627  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
19628   /* VCLZ. Types I8 I16 I32.  */
19629  NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
19630  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
19631   /* VCNT. Size 8.  */
19632  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
19633  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
19634   /* Two address, untyped.  */
19635  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
19636  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
19637   /* VTRN. Sizes 8 16 32.  */
19638  nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
19639  nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
19640
19641   /* Table lookup. Size 8.  */
19642  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19643  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
19644
19645 #undef  THUMB_VARIANT
19646 #define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
19647 #undef  ARM_VARIANT
19648 #define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
19649
19650   /* Neon element/structure load/store.  */
19651  nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19652  nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19653  nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19654  nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19655  nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19656  nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19657  nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19658  nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
19659
19660 #undef  THUMB_VARIANT
19661 #define THUMB_VARIANT & fpu_vfp_ext_v3xd
19662 #undef  ARM_VARIANT
19663 #define ARM_VARIANT   & fpu_vfp_ext_v3xd
19664  cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
19665  cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19666  cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19667  cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19668  cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19669  cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19670  cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19671  cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
19672  cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
19673
19674 #undef  THUMB_VARIANT
19675 #define THUMB_VARIANT  & fpu_vfp_ext_v3
19676 #undef  ARM_VARIANT
19677 #define ARM_VARIANT    & fpu_vfp_ext_v3
19678
19679  cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
19680  cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19681  cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19682  cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19683  cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19684  cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19685  cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19686  cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
19687  cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
19688
19689 #undef  ARM_VARIANT
19690 #define ARM_VARIANT    & fpu_vfp_ext_fma
19691 #undef  THUMB_VARIANT
19692 #define THUMB_VARIANT  & fpu_vfp_ext_fma
19693  /* Mnemonics shared by Neon and VFP.  These are included in the
19694     VFP FMA variant; NEON and VFP FMA always includes the NEON
19695     FMA instructions.  */
19696  nCEF(vfma,     _vfma,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19697  nCEF(vfms,     _vfms,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
19698  /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
19699     the v form should always be used.  */
19700  cCE("ffmas",   ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19701  cCE("ffnmas",  ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
19702  cCE("ffmad",   ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19703  cCE("ffnmad",  ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
19704  nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19705  nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
19706
19707 #undef THUMB_VARIANT
19708 #undef  ARM_VARIANT
19709 #define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
19710
19711  cCE("mia",     e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19712  cCE("miaph",   e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19713  cCE("miabb",   e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19714  cCE("miabt",   e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19715  cCE("miatb",   e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19716  cCE("miatt",   e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
19717  cCE("mar",     c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
19718  cCE("mra",     c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
19719
19720 #undef  ARM_VARIANT
19721 #define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
19722
19723  cCE("tandcb",  e13f130, 1, (RR),                   iwmmxt_tandorc),
19724  cCE("tandch",  e53f130, 1, (RR),                   iwmmxt_tandorc),
19725  cCE("tandcw",  e93f130, 1, (RR),                   iwmmxt_tandorc),
19726  cCE("tbcstb",  e400010, 2, (RIWR, RR),             rn_rd),
19727  cCE("tbcsth",  e400050, 2, (RIWR, RR),             rn_rd),
19728  cCE("tbcstw",  e400090, 2, (RIWR, RR),             rn_rd),
19729  cCE("textrcb", e130170, 2, (RR, I7),               iwmmxt_textrc),
19730  cCE("textrch", e530170, 2, (RR, I7),               iwmmxt_textrc),
19731  cCE("textrcw", e930170, 2, (RR, I7),               iwmmxt_textrc),
19732  cCE("textrmub",e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19733  cCE("textrmuh",e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19734  cCE("textrmuw",e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19735  cCE("textrmsb",e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19736  cCE("textrmsh",e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19737  cCE("textrmsw",e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
19738  cCE("tinsrb",  e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19739  cCE("tinsrh",  e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19740  cCE("tinsrw",  e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
19741  cCE("tmcr",    e000110, 2, (RIWC_RIWG, RR),        rn_rd),
19742  cCE("tmcrr",   c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
19743  cCE("tmia",    e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19744  cCE("tmiaph",  e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19745  cCE("tmiabb",  e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19746  cCE("tmiabt",  e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19747  cCE("tmiatb",  e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19748  cCE("tmiatt",  e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
19749  cCE("tmovmskb",e100030, 2, (RR, RIWR),             rd_rn),
19750  cCE("tmovmskh",e500030, 2, (RR, RIWR),             rd_rn),
19751  cCE("tmovmskw",e900030, 2, (RR, RIWR),             rd_rn),
19752  cCE("tmrc",    e100110, 2, (RR, RIWC_RIWG),        rd_rn),
19753  cCE("tmrrc",   c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
19754  cCE("torcb",   e13f150, 1, (RR),                   iwmmxt_tandorc),
19755  cCE("torch",   e53f150, 1, (RR),                   iwmmxt_tandorc),
19756  cCE("torcw",   e93f150, 1, (RR),                   iwmmxt_tandorc),
19757  cCE("waccb",   e0001c0, 2, (RIWR, RIWR),           rd_rn),
19758  cCE("wacch",   e4001c0, 2, (RIWR, RIWR),           rd_rn),
19759  cCE("waccw",   e8001c0, 2, (RIWR, RIWR),           rd_rn),
19760  cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19761  cCE("waddb",   e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19762  cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19763  cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19764  cCE("waddh",   e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19765  cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19766  cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19767  cCE("waddw",   e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19768  cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19769  cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
19770  cCE("walignr0",e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19771  cCE("walignr1",e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19772  cCE("walignr2",ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19773  cCE("walignr3",eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19774  cCE("wand",    e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19775  cCE("wandn",   e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19776  cCE("wavg2b",  e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19777  cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19778  cCE("wavg2h",  ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19779  cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19780  cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19781  cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19782  cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19783  cCE("wcmpgtub",e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19784  cCE("wcmpgtuh",e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19785  cCE("wcmpgtuw",e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19786  cCE("wcmpgtsb",e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19787  cCE("wcmpgtsh",e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19788  cCE("wcmpgtsw",eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19789  cCE("wldrb",   c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19790  cCE("wldrh",   c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19791  cCE("wldrw",   c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
19792  cCE("wldrd",   c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
19793  cCE("wmacs",   e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19794  cCE("wmacsz",  e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19795  cCE("wmacu",   e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19796  cCE("wmacuz",  e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19797  cCE("wmadds",  ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19798  cCE("wmaddu",  e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19799  cCE("wmaxsb",  e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19800  cCE("wmaxsh",  e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19801  cCE("wmaxsw",  ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19802  cCE("wmaxub",  e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19803  cCE("wmaxuh",  e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19804  cCE("wmaxuw",  e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19805  cCE("wminsb",  e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19806  cCE("wminsh",  e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19807  cCE("wminsw",  eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19808  cCE("wminub",  e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19809  cCE("wminuh",  e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19810  cCE("wminuw",  e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19811  cCE("wmov",    e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
19812  cCE("wmulsm",  e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19813  cCE("wmulsl",  e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19814  cCE("wmulum",  e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19815  cCE("wmulul",  e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19816  cCE("wor",     e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19817  cCE("wpackhss",e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19818  cCE("wpackhus",e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19819  cCE("wpackwss",eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19820  cCE("wpackwus",e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19821  cCE("wpackdss",ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19822  cCE("wpackdus",ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19823  cCE("wrorh",   e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19824  cCE("wrorhg",  e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19825  cCE("wrorw",   eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19826  cCE("wrorwg",  eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19827  cCE("wrord",   ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19828  cCE("wrordg",  ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19829  cCE("wsadb",   e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19830  cCE("wsadbz",  e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19831  cCE("wsadh",   e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19832  cCE("wsadhz",  e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19833  cCE("wshufh",  e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
19834  cCE("wsllh",   e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19835  cCE("wsllhg",  e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19836  cCE("wsllw",   e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19837  cCE("wsllwg",  e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19838  cCE("wslld",   ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19839  cCE("wslldg",  ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19840  cCE("wsrah",   e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19841  cCE("wsrahg",  e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19842  cCE("wsraw",   e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19843  cCE("wsrawg",  e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19844  cCE("wsrad",   ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19845  cCE("wsradg",  ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19846  cCE("wsrlh",   e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19847  cCE("wsrlhg",  e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19848  cCE("wsrlw",   ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19849  cCE("wsrlwg",  ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19850  cCE("wsrld",   ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
19851  cCE("wsrldg",  ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
19852  cCE("wstrb",   c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19853  cCE("wstrh",   c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
19854  cCE("wstrw",   c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
19855  cCE("wstrd",   c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
19856  cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19857  cCE("wsubb",   e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19858  cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19859  cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19860  cCE("wsubh",   e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19861  cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19862  cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19863  cCE("wsubw",   e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19864  cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19865  cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),         rd_rn),
19866  cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),         rd_rn),
19867  cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),         rd_rn),
19868  cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),         rd_rn),
19869  cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),         rd_rn),
19870  cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),         rd_rn),
19871  cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19872  cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19873  cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19874  cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),         rd_rn),
19875  cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),         rd_rn),
19876  cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),         rd_rn),
19877  cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),         rd_rn),
19878  cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),         rd_rn),
19879  cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),         rd_rn),
19880  cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19881  cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19882  cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
19883  cCE("wxor",    e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19884  cCE("wzero",   e300000, 1, (RIWR),                 iwmmxt_wzero),
19885
19886 #undef  ARM_VARIANT
19887 #define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
19888
19889  cCE("torvscb",   e12f190, 1, (RR),                 iwmmxt_tandorc),
19890  cCE("torvsch",   e52f190, 1, (RR),                 iwmmxt_tandorc),
19891  cCE("torvscw",   e92f190, 1, (RR),                 iwmmxt_tandorc),
19892  cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
19893  cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
19894  cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
19895  cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19896  cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19897  cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19898  cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19899  cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19900  cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19901  cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19902  cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19903  cCE("wavg4",   e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19904  cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19905  cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19906  cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19907  cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19908  cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19909  cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
19910  cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19911  cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19912  cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19913  cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19914  cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19915  cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19916  cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19917  cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19918  cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19919  cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19920  cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19921  cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19922  cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19923  cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19924  cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19925  cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19926  cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19927  cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19928  cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19929  cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19930  cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19931  cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19932  cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19933  cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19934  cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19935  cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19936  cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19937  cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19938  cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19939  cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19940  cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19941  cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19942  cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19943  cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19944  cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19945  cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
19946
19947 #undef  ARM_VARIANT
19948 #define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
19949
19950  cCE("cfldrs",  c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
19951  cCE("cfldrd",  c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
19952  cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
19953  cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
19954  cCE("cfstrs",  c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
19955  cCE("cfstrd",  c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
19956  cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
19957  cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
19958  cCE("cfmvsr",  e000450, 2, (RMF, RR),                rn_rd),
19959  cCE("cfmvrs",  e100450, 2, (RR, RMF),                rd_rn),
19960  cCE("cfmvdlr", e000410, 2, (RMD, RR),                rn_rd),
19961  cCE("cfmvrdl", e100410, 2, (RR, RMD),                rd_rn),
19962  cCE("cfmvdhr", e000430, 2, (RMD, RR),                rn_rd),
19963  cCE("cfmvrdh", e100430, 2, (RR, RMD),                rd_rn),
19964  cCE("cfmv64lr",e000510, 2, (RMDX, RR),               rn_rd),
19965  cCE("cfmvr64l",e100510, 2, (RR, RMDX),               rd_rn),
19966  cCE("cfmv64hr",e000530, 2, (RMDX, RR),               rn_rd),
19967  cCE("cfmvr64h",e100530, 2, (RR, RMDX),               rd_rn),
19968  cCE("cfmval32",e200440, 2, (RMAX, RMFX),             rd_rn),
19969  cCE("cfmv32al",e100440, 2, (RMFX, RMAX),             rd_rn),
19970  cCE("cfmvam32",e200460, 2, (RMAX, RMFX),             rd_rn),
19971  cCE("cfmv32am",e100460, 2, (RMFX, RMAX),             rd_rn),
19972  cCE("cfmvah32",e200480, 2, (RMAX, RMFX),             rd_rn),
19973  cCE("cfmv32ah",e100480, 2, (RMFX, RMAX),             rd_rn),
19974  cCE("cfmva32", e2004a0, 2, (RMAX, RMFX),             rd_rn),
19975  cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX),             rd_rn),
19976  cCE("cfmva64", e2004c0, 2, (RMAX, RMDX),             rd_rn),
19977  cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX),             rd_rn),
19978  cCE("cfmvsc32",e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
19979  cCE("cfmv32sc",e1004e0, 2, (RMDX, RMDS),             rd),
19980  cCE("cfcpys",  e000400, 2, (RMF, RMF),               rd_rn),
19981  cCE("cfcpyd",  e000420, 2, (RMD, RMD),               rd_rn),
19982  cCE("cfcvtsd", e000460, 2, (RMD, RMF),               rd_rn),
19983  cCE("cfcvtds", e000440, 2, (RMF, RMD),               rd_rn),
19984  cCE("cfcvt32s",e000480, 2, (RMF, RMFX),              rd_rn),
19985  cCE("cfcvt32d",e0004a0, 2, (RMD, RMFX),              rd_rn),
19986  cCE("cfcvt64s",e0004c0, 2, (RMF, RMDX),              rd_rn),
19987  cCE("cfcvt64d",e0004e0, 2, (RMD, RMDX),              rd_rn),
19988  cCE("cfcvts32",e100580, 2, (RMFX, RMF),              rd_rn),
19989  cCE("cfcvtd32",e1005a0, 2, (RMFX, RMD),              rd_rn),
19990  cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),            rd_rn),
19991  cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),            rd_rn),
19992  cCE("cfrshl32",e000550, 3, (RMFX, RMFX, RR),         mav_triple),
19993  cCE("cfrshl64",e000570, 3, (RMDX, RMDX, RR),         mav_triple),
19994  cCE("cfsh32",  e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
19995  cCE("cfsh64",  e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
19996  cCE("cfcmps",  e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
19997  cCE("cfcmpd",  e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
19998  cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
19999  cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
20000  cCE("cfabss",  e300400, 2, (RMF, RMF),               rd_rn),
20001  cCE("cfabsd",  e300420, 2, (RMD, RMD),               rd_rn),
20002  cCE("cfnegs",  e300440, 2, (RMF, RMF),               rd_rn),
20003  cCE("cfnegd",  e300460, 2, (RMD, RMD),               rd_rn),
20004  cCE("cfadds",  e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
20005  cCE("cfaddd",  e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
20006  cCE("cfsubs",  e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
20007  cCE("cfsubd",  e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
20008  cCE("cfmuls",  e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
20009  cCE("cfmuld",  e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
20010  cCE("cfabs32", e300500, 2, (RMFX, RMFX),             rd_rn),
20011  cCE("cfabs64", e300520, 2, (RMDX, RMDX),             rd_rn),
20012  cCE("cfneg32", e300540, 2, (RMFX, RMFX),             rd_rn),
20013  cCE("cfneg64", e300560, 2, (RMDX, RMDX),             rd_rn),
20014  cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20015  cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
20016  cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20017  cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
20018  cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20019  cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
20020  cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20021  cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
20022  cCE("cfmadd32",e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
20023  cCE("cfmsub32",e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
20024  cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
20025  cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
20026 };
20027 #undef ARM_VARIANT
20028 #undef THUMB_VARIANT
20029 #undef TCE
20030 #undef TUE
20031 #undef TUF
20032 #undef TCC
20033 #undef cCE
20034 #undef cCL
20035 #undef C3E
20036 #undef CE
20037 #undef CM
20038 #undef UE
20039 #undef UF
20040 #undef UT
20041 #undef NUF
20042 #undef nUF
20043 #undef NCE
20044 #undef nCE
20045 #undef OPS0
20046 #undef OPS1
20047 #undef OPS2
20048 #undef OPS3
20049 #undef OPS4
20050 #undef OPS5
20051 #undef OPS6
20052 #undef do_0
20053 \f
20054 /* MD interface: bits in the object file.  */
20055
20056 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
20057    for use in the a.out file, and stores them in the array pointed to by buf.
20058    This knows about the endian-ness of the target machine and does
20059    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
20060    2 (short) and 4 (long)  Floating numbers are put out as a series of
20061    LITTLENUMS (shorts, here at least).  */
20062
20063 void
20064 md_number_to_chars (char * buf, valueT val, int n)
20065 {
20066   if (target_big_endian)
20067     number_to_chars_bigendian (buf, val, n);
20068   else
20069     number_to_chars_littleendian (buf, val, n);
20070 }
20071
20072 static valueT
20073 md_chars_to_number (char * buf, int n)
20074 {
20075   valueT result = 0;
20076   unsigned char * where = (unsigned char *) buf;
20077
20078   if (target_big_endian)
20079     {
20080       while (n--)
20081         {
20082           result <<= 8;
20083           result |= (*where++ & 255);
20084         }
20085     }
20086   else
20087     {
20088       while (n--)
20089         {
20090           result <<= 8;
20091           result |= (where[n] & 255);
20092         }
20093     }
20094
20095   return result;
20096 }
20097
20098 /* MD interface: Sections.  */
20099
20100 /* Calculate the maximum variable size (i.e., excluding fr_fix)
20101    that an rs_machine_dependent frag may reach.  */
20102
20103 unsigned int
20104 arm_frag_max_var (fragS *fragp)
20105 {
20106   /* We only use rs_machine_dependent for variable-size Thumb instructions,
20107      which are either THUMB_SIZE (2) or INSN_SIZE (4).
20108
20109      Note that we generate relaxable instructions even for cases that don't
20110      really need it, like an immediate that's a trivial constant.  So we're
20111      overestimating the instruction size for some of those cases.  Rather
20112      than putting more intelligence here, it would probably be better to
20113      avoid generating a relaxation frag in the first place when it can be
20114      determined up front that a short instruction will suffice.  */
20115
20116   gas_assert (fragp->fr_type == rs_machine_dependent);
20117   return INSN_SIZE;
20118 }
20119
20120 /* Estimate the size of a frag before relaxing.  Assume everything fits in
20121    2 bytes.  */
20122
20123 int
20124 md_estimate_size_before_relax (fragS * fragp,
20125                                segT    segtype ATTRIBUTE_UNUSED)
20126 {
20127   fragp->fr_var = 2;
20128   return 2;
20129 }
20130
20131 /* Convert a machine dependent frag.  */
20132
20133 void
20134 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
20135 {
20136   unsigned long insn;
20137   unsigned long old_op;
20138   char *buf;
20139   expressionS exp;
20140   fixS *fixp;
20141   int reloc_type;
20142   int pc_rel;
20143   int opcode;
20144
20145   buf = fragp->fr_literal + fragp->fr_fix;
20146
20147   old_op = bfd_get_16(abfd, buf);
20148   if (fragp->fr_symbol)
20149     {
20150       exp.X_op = O_symbol;
20151       exp.X_add_symbol = fragp->fr_symbol;
20152     }
20153   else
20154     {
20155       exp.X_op = O_constant;
20156     }
20157   exp.X_add_number = fragp->fr_offset;
20158   opcode = fragp->fr_subtype;
20159   switch (opcode)
20160     {
20161     case T_MNEM_ldr_pc:
20162     case T_MNEM_ldr_pc2:
20163     case T_MNEM_ldr_sp:
20164     case T_MNEM_str_sp:
20165     case T_MNEM_ldr:
20166     case T_MNEM_ldrb:
20167     case T_MNEM_ldrh:
20168     case T_MNEM_str:
20169     case T_MNEM_strb:
20170     case T_MNEM_strh:
20171       if (fragp->fr_var == 4)
20172         {
20173           insn = THUMB_OP32 (opcode);
20174           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
20175             {
20176               insn |= (old_op & 0x700) << 4;
20177             }
20178           else
20179             {
20180               insn |= (old_op & 7) << 12;
20181               insn |= (old_op & 0x38) << 13;
20182             }
20183           insn |= 0x00000c00;
20184           put_thumb32_insn (buf, insn);
20185           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
20186         }
20187       else
20188         {
20189           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
20190         }
20191       pc_rel = (opcode == T_MNEM_ldr_pc2);
20192       break;
20193     case T_MNEM_adr:
20194       if (fragp->fr_var == 4)
20195         {
20196           insn = THUMB_OP32 (opcode);
20197           insn |= (old_op & 0xf0) << 4;
20198           put_thumb32_insn (buf, insn);
20199           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
20200         }
20201       else
20202         {
20203           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20204           exp.X_add_number -= 4;
20205         }
20206       pc_rel = 1;
20207       break;
20208     case T_MNEM_mov:
20209     case T_MNEM_movs:
20210     case T_MNEM_cmp:
20211     case T_MNEM_cmn:
20212       if (fragp->fr_var == 4)
20213         {
20214           int r0off = (opcode == T_MNEM_mov
20215                        || opcode == T_MNEM_movs) ? 0 : 8;
20216           insn = THUMB_OP32 (opcode);
20217           insn = (insn & 0xe1ffffff) | 0x10000000;
20218           insn |= (old_op & 0x700) << r0off;
20219           put_thumb32_insn (buf, insn);
20220           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
20221         }
20222       else
20223         {
20224           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
20225         }
20226       pc_rel = 0;
20227       break;
20228     case T_MNEM_b:
20229       if (fragp->fr_var == 4)
20230         {
20231           insn = THUMB_OP32(opcode);
20232           put_thumb32_insn (buf, insn);
20233           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
20234         }
20235       else
20236         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
20237       pc_rel = 1;
20238       break;
20239     case T_MNEM_bcond:
20240       if (fragp->fr_var == 4)
20241         {
20242           insn = THUMB_OP32(opcode);
20243           insn |= (old_op & 0xf00) << 14;
20244           put_thumb32_insn (buf, insn);
20245           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
20246         }
20247       else
20248         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
20249       pc_rel = 1;
20250       break;
20251     case T_MNEM_add_sp:
20252     case T_MNEM_add_pc:
20253     case T_MNEM_inc_sp:
20254     case T_MNEM_dec_sp:
20255       if (fragp->fr_var == 4)
20256         {
20257           /* ??? Choose between add and addw.  */
20258           insn = THUMB_OP32 (opcode);
20259           insn |= (old_op & 0xf0) << 4;
20260           put_thumb32_insn (buf, insn);
20261           if (opcode == T_MNEM_add_pc)
20262             reloc_type = BFD_RELOC_ARM_T32_IMM12;
20263           else
20264             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
20265         }
20266       else
20267         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20268       pc_rel = 0;
20269       break;
20270
20271     case T_MNEM_addi:
20272     case T_MNEM_addis:
20273     case T_MNEM_subi:
20274     case T_MNEM_subis:
20275       if (fragp->fr_var == 4)
20276         {
20277           insn = THUMB_OP32 (opcode);
20278           insn |= (old_op & 0xf0) << 4;
20279           insn |= (old_op & 0xf) << 16;
20280           put_thumb32_insn (buf, insn);
20281           if (insn & (1 << 20))
20282             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
20283           else
20284             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
20285         }
20286       else
20287         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
20288       pc_rel = 0;
20289       break;
20290     default:
20291       abort ();
20292     }
20293   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
20294                       (enum bfd_reloc_code_real) reloc_type);
20295   fixp->fx_file = fragp->fr_file;
20296   fixp->fx_line = fragp->fr_line;
20297   fragp->fr_fix += fragp->fr_var;
20298 }
20299
20300 /* Return the size of a relaxable immediate operand instruction.
20301    SHIFT and SIZE specify the form of the allowable immediate.  */
20302 static int
20303 relax_immediate (fragS *fragp, int size, int shift)
20304 {
20305   offsetT offset;
20306   offsetT mask;
20307   offsetT low;
20308
20309   /* ??? Should be able to do better than this.  */
20310   if (fragp->fr_symbol)
20311     return 4;
20312
20313   low = (1 << shift) - 1;
20314   mask = (1 << (shift + size)) - (1 << shift);
20315   offset = fragp->fr_offset;
20316   /* Force misaligned offsets to 32-bit variant.  */
20317   if (offset & low)
20318     return 4;
20319   if (offset & ~mask)
20320     return 4;
20321   return 2;
20322 }
20323
20324 /* Get the address of a symbol during relaxation.  */
20325 static addressT
20326 relaxed_symbol_addr (fragS *fragp, long stretch)
20327 {
20328   fragS *sym_frag;
20329   addressT addr;
20330   symbolS *sym;
20331
20332   sym = fragp->fr_symbol;
20333   sym_frag = symbol_get_frag (sym);
20334   know (S_GET_SEGMENT (sym) != absolute_section
20335         || sym_frag == &zero_address_frag);
20336   addr = S_GET_VALUE (sym) + fragp->fr_offset;
20337
20338   /* If frag has yet to be reached on this pass, assume it will
20339      move by STRETCH just as we did.  If this is not so, it will
20340      be because some frag between grows, and that will force
20341      another pass.  */
20342
20343   if (stretch != 0
20344       && sym_frag->relax_marker != fragp->relax_marker)
20345     {
20346       fragS *f;
20347
20348       /* Adjust stretch for any alignment frag.  Note that if have
20349          been expanding the earlier code, the symbol may be
20350          defined in what appears to be an earlier frag.  FIXME:
20351          This doesn't handle the fr_subtype field, which specifies
20352          a maximum number of bytes to skip when doing an
20353          alignment.  */
20354       for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
20355         {
20356           if (f->fr_type == rs_align || f->fr_type == rs_align_code)
20357             {
20358               if (stretch < 0)
20359                 stretch = - ((- stretch)
20360                              & ~ ((1 << (int) f->fr_offset) - 1));
20361               else
20362                 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
20363               if (stretch == 0)
20364                 break;
20365             }
20366         }
20367       if (f != NULL)
20368         addr += stretch;
20369     }
20370
20371   return addr;
20372 }
20373
20374 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
20375    load.  */
20376 static int
20377 relax_adr (fragS *fragp, asection *sec, long stretch)
20378 {
20379   addressT addr;
20380   offsetT val;
20381
20382   /* Assume worst case for symbols not known to be in the same section.  */
20383   if (fragp->fr_symbol == NULL
20384       || !S_IS_DEFINED (fragp->fr_symbol)
20385       || sec != S_GET_SEGMENT (fragp->fr_symbol)
20386       || S_IS_WEAK (fragp->fr_symbol))
20387     return 4;
20388
20389   val = relaxed_symbol_addr (fragp, stretch);
20390   addr = fragp->fr_address + fragp->fr_fix;
20391   addr = (addr + 4) & ~3;
20392   /* Force misaligned targets to 32-bit variant.  */
20393   if (val & 3)
20394     return 4;
20395   val -= addr;
20396   if (val < 0 || val > 1020)
20397     return 4;
20398   return 2;
20399 }
20400
20401 /* Return the size of a relaxable add/sub immediate instruction.  */
20402 static int
20403 relax_addsub (fragS *fragp, asection *sec)
20404 {
20405   char *buf;
20406   int op;
20407
20408   buf = fragp->fr_literal + fragp->fr_fix;
20409   op = bfd_get_16(sec->owner, buf);
20410   if ((op & 0xf) == ((op >> 4) & 0xf))
20411     return relax_immediate (fragp, 8, 0);
20412   else
20413     return relax_immediate (fragp, 3, 0);
20414 }
20415
20416 /* Return TRUE iff the definition of symbol S could be pre-empted
20417    (overridden) at link or load time.  */
20418 static bfd_boolean
20419 symbol_preemptible (symbolS *s)
20420 {
20421   /* Weak symbols can always be pre-empted.  */
20422   if (S_IS_WEAK (s))
20423     return TRUE;
20424
20425   /* Non-global symbols cannot be pre-empted. */
20426   if (! S_IS_EXTERNAL (s))
20427     return FALSE;
20428
20429 #ifdef OBJ_ELF
20430   /* In ELF, a global symbol can be marked protected, or private.  In that
20431      case it can't be pre-empted (other definitions in the same link unit
20432      would violate the ODR).  */
20433   if (ELF_ST_VISIBILITY (S_GET_OTHER (s)) > STV_DEFAULT)
20434     return FALSE;
20435 #endif
20436
20437   /* Other global symbols might be pre-empted.  */
20438   return TRUE;
20439 }
20440
20441 /* Return the size of a relaxable branch instruction.  BITS is the
20442    size of the offset field in the narrow instruction.  */
20443
20444 static int
20445 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
20446 {
20447   addressT addr;
20448   offsetT val;
20449   offsetT limit;
20450
20451   /* Assume worst case for symbols not known to be in the same section.  */
20452   if (!S_IS_DEFINED (fragp->fr_symbol)
20453       || sec != S_GET_SEGMENT (fragp->fr_symbol)
20454       || S_IS_WEAK (fragp->fr_symbol))
20455     return 4;
20456
20457 #ifdef OBJ_ELF
20458   /* A branch to a function in ARM state will require interworking.  */
20459   if (S_IS_DEFINED (fragp->fr_symbol)
20460       && ARM_IS_FUNC (fragp->fr_symbol))
20461       return 4;
20462 #endif
20463
20464   if (symbol_preemptible (fragp->fr_symbol))
20465     return 4;
20466
20467   val = relaxed_symbol_addr (fragp, stretch);
20468   addr = fragp->fr_address + fragp->fr_fix + 4;
20469   val -= addr;
20470
20471   /* Offset is a signed value *2 */
20472   limit = 1 << bits;
20473   if (val >= limit || val < -limit)
20474     return 4;
20475   return 2;
20476 }
20477
20478
20479 /* Relax a machine dependent frag.  This returns the amount by which
20480    the current size of the frag should change.  */
20481
20482 int
20483 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
20484 {
20485   int oldsize;
20486   int newsize;
20487
20488   oldsize = fragp->fr_var;
20489   switch (fragp->fr_subtype)
20490     {
20491     case T_MNEM_ldr_pc2:
20492       newsize = relax_adr (fragp, sec, stretch);
20493       break;
20494     case T_MNEM_ldr_pc:
20495     case T_MNEM_ldr_sp:
20496     case T_MNEM_str_sp:
20497       newsize = relax_immediate (fragp, 8, 2);
20498       break;
20499     case T_MNEM_ldr:
20500     case T_MNEM_str:
20501       newsize = relax_immediate (fragp, 5, 2);
20502       break;
20503     case T_MNEM_ldrh:
20504     case T_MNEM_strh:
20505       newsize = relax_immediate (fragp, 5, 1);
20506       break;
20507     case T_MNEM_ldrb:
20508     case T_MNEM_strb:
20509       newsize = relax_immediate (fragp, 5, 0);
20510       break;
20511     case T_MNEM_adr:
20512       newsize = relax_adr (fragp, sec, stretch);
20513       break;
20514     case T_MNEM_mov:
20515     case T_MNEM_movs:
20516     case T_MNEM_cmp:
20517     case T_MNEM_cmn:
20518       newsize = relax_immediate (fragp, 8, 0);
20519       break;
20520     case T_MNEM_b:
20521       newsize = relax_branch (fragp, sec, 11, stretch);
20522       break;
20523     case T_MNEM_bcond:
20524       newsize = relax_branch (fragp, sec, 8, stretch);
20525       break;
20526     case T_MNEM_add_sp:
20527     case T_MNEM_add_pc:
20528       newsize = relax_immediate (fragp, 8, 2);
20529       break;
20530     case T_MNEM_inc_sp:
20531     case T_MNEM_dec_sp:
20532       newsize = relax_immediate (fragp, 7, 2);
20533       break;
20534     case T_MNEM_addi:
20535     case T_MNEM_addis:
20536     case T_MNEM_subi:
20537     case T_MNEM_subis:
20538       newsize = relax_addsub (fragp, sec);
20539       break;
20540     default:
20541       abort ();
20542     }
20543
20544   fragp->fr_var = newsize;
20545   /* Freeze wide instructions that are at or before the same location as
20546      in the previous pass.  This avoids infinite loops.
20547      Don't freeze them unconditionally because targets may be artificially
20548      misaligned by the expansion of preceding frags.  */
20549   if (stretch <= 0 && newsize > 2)
20550     {
20551       md_convert_frag (sec->owner, sec, fragp);
20552       frag_wane (fragp);
20553     }
20554
20555   return newsize - oldsize;
20556 }
20557
20558 /* Round up a section size to the appropriate boundary.  */
20559
20560 valueT
20561 md_section_align (segT   segment ATTRIBUTE_UNUSED,
20562                   valueT size)
20563 {
20564 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
20565   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
20566     {
20567       /* For a.out, force the section size to be aligned.  If we don't do
20568          this, BFD will align it for us, but it will not write out the
20569          final bytes of the section.  This may be a bug in BFD, but it is
20570          easier to fix it here since that is how the other a.out targets
20571          work.  */
20572       int align;
20573
20574       align = bfd_get_section_alignment (stdoutput, segment);
20575       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
20576     }
20577 #endif
20578
20579   return size;
20580 }
20581
20582 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
20583    of an rs_align_code fragment.  */
20584
20585 void
20586 arm_handle_align (fragS * fragP)
20587 {
20588   static char const arm_noop[2][2][4] =
20589     {
20590       {  /* ARMv1 */
20591         {0x00, 0x00, 0xa0, 0xe1},  /* LE */
20592         {0xe1, 0xa0, 0x00, 0x00},  /* BE */
20593       },
20594       {  /* ARMv6k */
20595         {0x00, 0xf0, 0x20, 0xe3},  /* LE */
20596         {0xe3, 0x20, 0xf0, 0x00},  /* BE */
20597       },
20598     };
20599   static char const thumb_noop[2][2][2] =
20600     {
20601       {  /* Thumb-1 */
20602         {0xc0, 0x46},  /* LE */
20603         {0x46, 0xc0},  /* BE */
20604       },
20605       {  /* Thumb-2 */
20606         {0x00, 0xbf},  /* LE */
20607         {0xbf, 0x00}   /* BE */
20608       }
20609     };
20610   static char const wide_thumb_noop[2][4] =
20611     {  /* Wide Thumb-2 */
20612       {0xaf, 0xf3, 0x00, 0x80},  /* LE */
20613       {0xf3, 0xaf, 0x80, 0x00},  /* BE */
20614     };
20615
20616   unsigned bytes, fix, noop_size;
20617   char * p;
20618   const char * noop;
20619   const char *narrow_noop = NULL;
20620 #ifdef OBJ_ELF
20621   enum mstate state;
20622 #endif
20623
20624   if (fragP->fr_type != rs_align_code)
20625     return;
20626
20627   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
20628   p = fragP->fr_literal + fragP->fr_fix;
20629   fix = 0;
20630
20631   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
20632     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
20633
20634   gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
20635
20636   if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
20637     {
20638       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
20639         {
20640           narrow_noop = thumb_noop[1][target_big_endian];
20641           noop = wide_thumb_noop[target_big_endian];
20642         }
20643       else
20644         noop = thumb_noop[0][target_big_endian];
20645       noop_size = 2;
20646 #ifdef OBJ_ELF
20647       state = MAP_THUMB;
20648 #endif
20649     }
20650   else
20651     {
20652       noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
20653                      [target_big_endian];
20654       noop_size = 4;
20655 #ifdef OBJ_ELF
20656       state = MAP_ARM;
20657 #endif
20658     }
20659
20660   fragP->fr_var = noop_size;
20661
20662   if (bytes & (noop_size - 1))
20663     {
20664       fix = bytes & (noop_size - 1);
20665 #ifdef OBJ_ELF
20666       insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
20667 #endif
20668       memset (p, 0, fix);
20669       p += fix;
20670       bytes -= fix;
20671     }
20672
20673   if (narrow_noop)
20674     {
20675       if (bytes & noop_size)
20676         {
20677           /* Insert a narrow noop.  */
20678           memcpy (p, narrow_noop, noop_size);
20679           p += noop_size;
20680           bytes -= noop_size;
20681           fix += noop_size;
20682         }
20683
20684       /* Use wide noops for the remainder */
20685       noop_size = 4;
20686     }
20687
20688   while (bytes >= noop_size)
20689     {
20690       memcpy (p, noop, noop_size);
20691       p += noop_size;
20692       bytes -= noop_size;
20693       fix += noop_size;
20694     }
20695
20696   fragP->fr_fix += fix;
20697 }
20698
20699 /* Called from md_do_align.  Used to create an alignment
20700    frag in a code section.  */
20701
20702 void
20703 arm_frag_align_code (int n, int max)
20704 {
20705   char * p;
20706
20707   /* We assume that there will never be a requirement
20708      to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
20709   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
20710     {
20711       char err_msg[128];
20712
20713       sprintf (err_msg,
20714         _("alignments greater than %d bytes not supported in .text sections."),
20715         MAX_MEM_FOR_RS_ALIGN_CODE + 1);
20716       as_fatal ("%s", err_msg);
20717     }
20718
20719   p = frag_var (rs_align_code,
20720                 MAX_MEM_FOR_RS_ALIGN_CODE,
20721                 1,
20722                 (relax_substateT) max,
20723                 (symbolS *) NULL,
20724                 (offsetT) n,
20725                 (char *) NULL);
20726   *p = 0;
20727 }
20728
20729 /* Perform target specific initialisation of a frag.
20730    Note - despite the name this initialisation is not done when the frag
20731    is created, but only when its type is assigned.  A frag can be created
20732    and used a long time before its type is set, so beware of assuming that
20733    this initialisationis performed first.  */
20734
20735 #ifndef OBJ_ELF
20736 void
20737 arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
20738 {
20739   /* Record whether this frag is in an ARM or a THUMB area.  */
20740   fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
20741 }
20742
20743 #else /* OBJ_ELF is defined.  */
20744 void
20745 arm_init_frag (fragS * fragP, int max_chars)
20746 {
20747   /* If the current ARM vs THUMB mode has not already
20748      been recorded into this frag then do so now.  */
20749   if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
20750     {
20751       fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
20752
20753       /* Record a mapping symbol for alignment frags.  We will delete this
20754          later if the alignment ends up empty.  */
20755       switch (fragP->fr_type)
20756         {
20757           case rs_align:
20758           case rs_align_test:
20759           case rs_fill:
20760             mapping_state_2 (MAP_DATA, max_chars);
20761             break;
20762           case rs_align_code:
20763             mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
20764             break;
20765           default:
20766             break;
20767         }
20768     }
20769 }
20770
20771 /* When we change sections we need to issue a new mapping symbol.  */
20772
20773 void
20774 arm_elf_change_section (void)
20775 {
20776   /* Link an unlinked unwind index table section to the .text section.  */
20777   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
20778       && elf_linked_to_section (now_seg) == NULL)
20779     elf_linked_to_section (now_seg) = text_section;
20780 }
20781
20782 int
20783 arm_elf_section_type (const char * str, size_t len)
20784 {
20785   if (len == 5 && strncmp (str, "exidx", 5) == 0)
20786     return SHT_ARM_EXIDX;
20787
20788   return -1;
20789 }
20790 \f
20791 /* Code to deal with unwinding tables.  */
20792
20793 static void add_unwind_adjustsp (offsetT);
20794
20795 /* Generate any deferred unwind frame offset.  */
20796
20797 static void
20798 flush_pending_unwind (void)
20799 {
20800   offsetT offset;
20801
20802   offset = unwind.pending_offset;
20803   unwind.pending_offset = 0;
20804   if (offset != 0)
20805     add_unwind_adjustsp (offset);
20806 }
20807
20808 /* Add an opcode to this list for this function.  Two-byte opcodes should
20809    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
20810    order.  */
20811
20812 static void
20813 add_unwind_opcode (valueT op, int length)
20814 {
20815   /* Add any deferred stack adjustment.  */
20816   if (unwind.pending_offset)
20817     flush_pending_unwind ();
20818
20819   unwind.sp_restored = 0;
20820
20821   if (unwind.opcode_count + length > unwind.opcode_alloc)
20822     {
20823       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
20824       if (unwind.opcodes)
20825         unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
20826                                                      unwind.opcode_alloc);
20827       else
20828         unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
20829     }
20830   while (length > 0)
20831     {
20832       length--;
20833       unwind.opcodes[unwind.opcode_count] = op & 0xff;
20834       op >>= 8;
20835       unwind.opcode_count++;
20836     }
20837 }
20838
20839 /* Add unwind opcodes to adjust the stack pointer.  */
20840
20841 static void
20842 add_unwind_adjustsp (offsetT offset)
20843 {
20844   valueT op;
20845
20846   if (offset > 0x200)
20847     {
20848       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
20849       char bytes[5];
20850       int n;
20851       valueT o;
20852
20853       /* Long form: 0xb2, uleb128.  */
20854       /* This might not fit in a word so add the individual bytes,
20855          remembering the list is built in reverse order.  */
20856       o = (valueT) ((offset - 0x204) >> 2);
20857       if (o == 0)
20858         add_unwind_opcode (0, 1);
20859
20860       /* Calculate the uleb128 encoding of the offset.  */
20861       n = 0;
20862       while (o)
20863         {
20864           bytes[n] = o & 0x7f;
20865           o >>= 7;
20866           if (o)
20867             bytes[n] |= 0x80;
20868           n++;
20869         }
20870       /* Add the insn.  */
20871       for (; n; n--)
20872         add_unwind_opcode (bytes[n - 1], 1);
20873       add_unwind_opcode (0xb2, 1);
20874     }
20875   else if (offset > 0x100)
20876     {
20877       /* Two short opcodes.  */
20878       add_unwind_opcode (0x3f, 1);
20879       op = (offset - 0x104) >> 2;
20880       add_unwind_opcode (op, 1);
20881     }
20882   else if (offset > 0)
20883     {
20884       /* Short opcode.  */
20885       op = (offset - 4) >> 2;
20886       add_unwind_opcode (op, 1);
20887     }
20888   else if (offset < 0)
20889     {
20890       offset = -offset;
20891       while (offset > 0x100)
20892         {
20893           add_unwind_opcode (0x7f, 1);
20894           offset -= 0x100;
20895         }
20896       op = ((offset - 4) >> 2) | 0x40;
20897       add_unwind_opcode (op, 1);
20898     }
20899 }
20900
20901 /* Finish the list of unwind opcodes for this function.  */
20902 static void
20903 finish_unwind_opcodes (void)
20904 {
20905   valueT op;
20906
20907   if (unwind.fp_used)
20908     {
20909       /* Adjust sp as necessary.  */
20910       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
20911       flush_pending_unwind ();
20912
20913       /* After restoring sp from the frame pointer.  */
20914       op = 0x90 | unwind.fp_reg;
20915       add_unwind_opcode (op, 1);
20916     }
20917   else
20918     flush_pending_unwind ();
20919 }
20920
20921
20922 /* Start an exception table entry.  If idx is nonzero this is an index table
20923    entry.  */
20924
20925 static void
20926 start_unwind_section (const segT text_seg, int idx)
20927 {
20928   const char * text_name;
20929   const char * prefix;
20930   const char * prefix_once;
20931   const char * group_name;
20932   size_t prefix_len;
20933   size_t text_len;
20934   char * sec_name;
20935   size_t sec_name_len;
20936   int type;
20937   int flags;
20938   int linkonce;
20939
20940   if (idx)
20941     {
20942       prefix = ELF_STRING_ARM_unwind;
20943       prefix_once = ELF_STRING_ARM_unwind_once;
20944       type = SHT_ARM_EXIDX;
20945     }
20946   else
20947     {
20948       prefix = ELF_STRING_ARM_unwind_info;
20949       prefix_once = ELF_STRING_ARM_unwind_info_once;
20950       type = SHT_PROGBITS;
20951     }
20952
20953   text_name = segment_name (text_seg);
20954   if (streq (text_name, ".text"))
20955     text_name = "";
20956
20957   if (strncmp (text_name, ".gnu.linkonce.t.",
20958                strlen (".gnu.linkonce.t.")) == 0)
20959     {
20960       prefix = prefix_once;
20961       text_name += strlen (".gnu.linkonce.t.");
20962     }
20963
20964   prefix_len = strlen (prefix);
20965   text_len = strlen (text_name);
20966   sec_name_len = prefix_len + text_len;
20967   sec_name = (char *) xmalloc (sec_name_len + 1);
20968   memcpy (sec_name, prefix, prefix_len);
20969   memcpy (sec_name + prefix_len, text_name, text_len);
20970   sec_name[prefix_len + text_len] = '\0';
20971
20972   flags = SHF_ALLOC;
20973   linkonce = 0;
20974   group_name = 0;
20975
20976   /* Handle COMDAT group.  */
20977   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
20978     {
20979       group_name = elf_group_name (text_seg);
20980       if (group_name == NULL)
20981         {
20982           as_bad (_("Group section `%s' has no group signature"),
20983                   segment_name (text_seg));
20984           ignore_rest_of_line ();
20985           return;
20986         }
20987       flags |= SHF_GROUP;
20988       linkonce = 1;
20989     }
20990
20991   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
20992
20993   /* Set the section link for index tables.  */
20994   if (idx)
20995     elf_linked_to_section (now_seg) = text_seg;
20996 }
20997
20998
20999 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
21000    personality routine data.  Returns zero, or the index table value for
21001    an inline entry.  */
21002
21003 static valueT
21004 create_unwind_entry (int have_data)
21005 {
21006   int size;
21007   addressT where;
21008   char *ptr;
21009   /* The current word of data.  */
21010   valueT data;
21011   /* The number of bytes left in this word.  */
21012   int n;
21013
21014   finish_unwind_opcodes ();
21015
21016   /* Remember the current text section.  */
21017   unwind.saved_seg = now_seg;
21018   unwind.saved_subseg = now_subseg;
21019
21020   start_unwind_section (now_seg, 0);
21021
21022   if (unwind.personality_routine == NULL)
21023     {
21024       if (unwind.personality_index == -2)
21025         {
21026           if (have_data)
21027             as_bad (_("handlerdata in cantunwind frame"));
21028           return 1; /* EXIDX_CANTUNWIND.  */
21029         }
21030
21031       /* Use a default personality routine if none is specified.  */
21032       if (unwind.personality_index == -1)
21033         {
21034           if (unwind.opcode_count > 3)
21035             unwind.personality_index = 1;
21036           else
21037             unwind.personality_index = 0;
21038         }
21039
21040       /* Space for the personality routine entry.  */
21041       if (unwind.personality_index == 0)
21042         {
21043           if (unwind.opcode_count > 3)
21044             as_bad (_("too many unwind opcodes for personality routine 0"));
21045
21046           if (!have_data)
21047             {
21048               /* All the data is inline in the index table.  */
21049               data = 0x80;
21050               n = 3;
21051               while (unwind.opcode_count > 0)
21052                 {
21053                   unwind.opcode_count--;
21054                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
21055                   n--;
21056                 }
21057
21058               /* Pad with "finish" opcodes.  */
21059               while (n--)
21060                 data = (data << 8) | 0xb0;
21061
21062               return data;
21063             }
21064           size = 0;
21065         }
21066       else
21067         /* We get two opcodes "free" in the first word.  */
21068         size = unwind.opcode_count - 2;
21069     }
21070   else
21071     {
21072       /* PR 16765: Missing or misplaced unwind directives can trigger this.  */
21073       if (unwind.personality_index != -1)
21074         {
21075           as_bad (_("attempt to recreate an unwind entry"));
21076           return 1;
21077         }
21078
21079       /* An extra byte is required for the opcode count.        */
21080       size = unwind.opcode_count + 1;
21081     }
21082
21083   size = (size + 3) >> 2;
21084   if (size > 0xff)
21085     as_bad (_("too many unwind opcodes"));
21086
21087   frag_align (2, 0, 0);
21088   record_alignment (now_seg, 2);
21089   unwind.table_entry = expr_build_dot ();
21090
21091   /* Allocate the table entry.  */
21092   ptr = frag_more ((size << 2) + 4);
21093   /* PR 13449: Zero the table entries in case some of them are not used.  */
21094   memset (ptr, 0, (size << 2) + 4);
21095   where = frag_now_fix () - ((size << 2) + 4);
21096
21097   switch (unwind.personality_index)
21098     {
21099     case -1:
21100       /* ??? Should this be a PLT generating relocation?  */
21101       /* Custom personality routine.  */
21102       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
21103                BFD_RELOC_ARM_PREL31);
21104
21105       where += 4;
21106       ptr += 4;
21107
21108       /* Set the first byte to the number of additional words.  */
21109       data = size > 0 ? size - 1 : 0;
21110       n = 3;
21111       break;
21112
21113     /* ABI defined personality routines.  */
21114     case 0:
21115       /* Three opcodes bytes are packed into the first word.  */
21116       data = 0x80;
21117       n = 3;
21118       break;
21119
21120     case 1:
21121     case 2:
21122       /* The size and first two opcode bytes go in the first word.  */
21123       data = ((0x80 + unwind.personality_index) << 8) | size;
21124       n = 2;
21125       break;
21126
21127     default:
21128       /* Should never happen.  */
21129       abort ();
21130     }
21131
21132   /* Pack the opcodes into words (MSB first), reversing the list at the same
21133      time.  */
21134   while (unwind.opcode_count > 0)
21135     {
21136       if (n == 0)
21137         {
21138           md_number_to_chars (ptr, data, 4);
21139           ptr += 4;
21140           n = 4;
21141           data = 0;
21142         }
21143       unwind.opcode_count--;
21144       n--;
21145       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
21146     }
21147
21148   /* Finish off the last word.  */
21149   if (n < 4)
21150     {
21151       /* Pad with "finish" opcodes.  */
21152       while (n--)
21153         data = (data << 8) | 0xb0;
21154
21155       md_number_to_chars (ptr, data, 4);
21156     }
21157
21158   if (!have_data)
21159     {
21160       /* Add an empty descriptor if there is no user-specified data.   */
21161       ptr = frag_more (4);
21162       md_number_to_chars (ptr, 0, 4);
21163     }
21164
21165   return 0;
21166 }
21167
21168
21169 /* Initialize the DWARF-2 unwind information for this procedure.  */
21170
21171 void
21172 tc_arm_frame_initial_instructions (void)
21173 {
21174   cfi_add_CFA_def_cfa (REG_SP, 0);
21175 }
21176 #endif /* OBJ_ELF */
21177
21178 /* Convert REGNAME to a DWARF-2 register number.  */
21179
21180 int
21181 tc_arm_regname_to_dw2regnum (char *regname)
21182 {
21183   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
21184   if (reg != FAIL)
21185     return reg;
21186
21187   /* PR 16694: Allow VFP registers as well.  */
21188   reg = arm_reg_parse (&regname, REG_TYPE_VFS);
21189   if (reg != FAIL)
21190     return 64 + reg;
21191
21192   reg = arm_reg_parse (&regname, REG_TYPE_VFD);
21193   if (reg != FAIL)
21194     return reg + 256;
21195
21196   return -1;
21197 }
21198
21199 #ifdef TE_PE
21200 void
21201 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
21202 {
21203   expressionS exp;
21204
21205   exp.X_op = O_secrel;
21206   exp.X_add_symbol = symbol;
21207   exp.X_add_number = 0;
21208   emit_expr (&exp, size);
21209 }
21210 #endif
21211
21212 /* MD interface: Symbol and relocation handling.  */
21213
21214 /* Return the address within the segment that a PC-relative fixup is
21215    relative to.  For ARM, PC-relative fixups applied to instructions
21216    are generally relative to the location of the fixup plus 8 bytes.
21217    Thumb branches are offset by 4, and Thumb loads relative to PC
21218    require special handling.  */
21219
21220 long
21221 md_pcrel_from_section (fixS * fixP, segT seg)
21222 {
21223   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
21224
21225   /* If this is pc-relative and we are going to emit a relocation
21226      then we just want to put out any pipeline compensation that the linker
21227      will need.  Otherwise we want to use the calculated base.
21228      For WinCE we skip the bias for externals as well, since this
21229      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
21230   if (fixP->fx_pcrel
21231       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
21232           || (arm_force_relocation (fixP)
21233 #ifdef TE_WINCE
21234               && !S_IS_EXTERNAL (fixP->fx_addsy)
21235 #endif
21236               )))
21237     base = 0;
21238
21239
21240   switch (fixP->fx_r_type)
21241     {
21242       /* PC relative addressing on the Thumb is slightly odd as the
21243          bottom two bits of the PC are forced to zero for the
21244          calculation.  This happens *after* application of the
21245          pipeline offset.  However, Thumb adrl already adjusts for
21246          this, so we need not do it again.  */
21247     case BFD_RELOC_ARM_THUMB_ADD:
21248       return base & ~3;
21249
21250     case BFD_RELOC_ARM_THUMB_OFFSET:
21251     case BFD_RELOC_ARM_T32_OFFSET_IMM:
21252     case BFD_RELOC_ARM_T32_ADD_PC12:
21253     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
21254       return (base + 4) & ~3;
21255
21256       /* Thumb branches are simply offset by +4.  */
21257     case BFD_RELOC_THUMB_PCREL_BRANCH7:
21258     case BFD_RELOC_THUMB_PCREL_BRANCH9:
21259     case BFD_RELOC_THUMB_PCREL_BRANCH12:
21260     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21261     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21262       return base + 4;
21263
21264     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21265       if (fixP->fx_addsy
21266           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21267           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21268           && ARM_IS_FUNC (fixP->fx_addsy)
21269           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21270         base = fixP->fx_where + fixP->fx_frag->fr_address;
21271        return base + 4;
21272
21273       /* BLX is like branches above, but forces the low two bits of PC to
21274          zero.  */
21275     case BFD_RELOC_THUMB_PCREL_BLX:
21276       if (fixP->fx_addsy
21277           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21278           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21279           && THUMB_IS_FUNC (fixP->fx_addsy)
21280           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21281         base = fixP->fx_where + fixP->fx_frag->fr_address;
21282       return (base + 4) & ~3;
21283
21284       /* ARM mode branches are offset by +8.  However, the Windows CE
21285          loader expects the relocation not to take this into account.  */
21286     case BFD_RELOC_ARM_PCREL_BLX:
21287       if (fixP->fx_addsy
21288           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21289           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21290           && ARM_IS_FUNC (fixP->fx_addsy)
21291           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21292         base = fixP->fx_where + fixP->fx_frag->fr_address;
21293       return base + 8;
21294
21295     case BFD_RELOC_ARM_PCREL_CALL:
21296       if (fixP->fx_addsy
21297           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21298           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21299           && THUMB_IS_FUNC (fixP->fx_addsy)
21300           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21301         base = fixP->fx_where + fixP->fx_frag->fr_address;
21302       return base + 8;
21303
21304     case BFD_RELOC_ARM_PCREL_BRANCH:
21305     case BFD_RELOC_ARM_PCREL_JUMP:
21306     case BFD_RELOC_ARM_PLT32:
21307 #ifdef TE_WINCE
21308       /* When handling fixups immediately, because we have already
21309          discovered the value of a symbol, or the address of the frag involved
21310          we must account for the offset by +8, as the OS loader will never see the reloc.
21311          see fixup_segment() in write.c
21312          The S_IS_EXTERNAL test handles the case of global symbols.
21313          Those need the calculated base, not just the pipe compensation the linker will need.  */
21314       if (fixP->fx_pcrel
21315           && fixP->fx_addsy != NULL
21316           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21317           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
21318         return base + 8;
21319       return base;
21320 #else
21321       return base + 8;
21322 #endif
21323
21324
21325       /* ARM mode loads relative to PC are also offset by +8.  Unlike
21326          branches, the Windows CE loader *does* expect the relocation
21327          to take this into account.  */
21328     case BFD_RELOC_ARM_OFFSET_IMM:
21329     case BFD_RELOC_ARM_OFFSET_IMM8:
21330     case BFD_RELOC_ARM_HWLITERAL:
21331     case BFD_RELOC_ARM_LITERAL:
21332     case BFD_RELOC_ARM_CP_OFF_IMM:
21333       return base + 8;
21334
21335
21336       /* Other PC-relative relocations are un-offset.  */
21337     default:
21338       return base;
21339     }
21340 }
21341
21342 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
21343    Otherwise we have no need to default values of symbols.  */
21344
21345 symbolS *
21346 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
21347 {
21348 #ifdef OBJ_ELF
21349   if (name[0] == '_' && name[1] == 'G'
21350       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
21351     {
21352       if (!GOT_symbol)
21353         {
21354           if (symbol_find (name))
21355             as_bad (_("GOT already in the symbol table"));
21356
21357           GOT_symbol = symbol_new (name, undefined_section,
21358                                    (valueT) 0, & zero_address_frag);
21359         }
21360
21361       return GOT_symbol;
21362     }
21363 #endif
21364
21365   return NULL;
21366 }
21367
21368 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
21369    computed as two separate immediate values, added together.  We
21370    already know that this value cannot be computed by just one ARM
21371    instruction.  */
21372
21373 static unsigned int
21374 validate_immediate_twopart (unsigned int   val,
21375                             unsigned int * highpart)
21376 {
21377   unsigned int a;
21378   unsigned int i;
21379
21380   for (i = 0; i < 32; i += 2)
21381     if (((a = rotate_left (val, i)) & 0xff) != 0)
21382       {
21383         if (a & 0xff00)
21384           {
21385             if (a & ~ 0xffff)
21386               continue;
21387             * highpart = (a  >> 8) | ((i + 24) << 7);
21388           }
21389         else if (a & 0xff0000)
21390           {
21391             if (a & 0xff000000)
21392               continue;
21393             * highpart = (a >> 16) | ((i + 16) << 7);
21394           }
21395         else
21396           {
21397             gas_assert (a & 0xff000000);
21398             * highpart = (a >> 24) | ((i + 8) << 7);
21399           }
21400
21401         return (a & 0xff) | (i << 7);
21402       }
21403
21404   return FAIL;
21405 }
21406
21407 static int
21408 validate_offset_imm (unsigned int val, int hwse)
21409 {
21410   if ((hwse && val > 255) || val > 4095)
21411     return FAIL;
21412   return val;
21413 }
21414
21415 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
21416    negative immediate constant by altering the instruction.  A bit of
21417    a hack really.
21418         MOV <-> MVN
21419         AND <-> BIC
21420         ADC <-> SBC
21421         by inverting the second operand, and
21422         ADD <-> SUB
21423         CMP <-> CMN
21424         by negating the second operand.  */
21425
21426 static int
21427 negate_data_op (unsigned long * instruction,
21428                 unsigned long   value)
21429 {
21430   int op, new_inst;
21431   unsigned long negated, inverted;
21432
21433   negated = encode_arm_immediate (-value);
21434   inverted = encode_arm_immediate (~value);
21435
21436   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
21437   switch (op)
21438     {
21439       /* First negates.  */
21440     case OPCODE_SUB:             /* ADD <-> SUB  */
21441       new_inst = OPCODE_ADD;
21442       value = negated;
21443       break;
21444
21445     case OPCODE_ADD:
21446       new_inst = OPCODE_SUB;
21447       value = negated;
21448       break;
21449
21450     case OPCODE_CMP:             /* CMP <-> CMN  */
21451       new_inst = OPCODE_CMN;
21452       value = negated;
21453       break;
21454
21455     case OPCODE_CMN:
21456       new_inst = OPCODE_CMP;
21457       value = negated;
21458       break;
21459
21460       /* Now Inverted ops.  */
21461     case OPCODE_MOV:             /* MOV <-> MVN  */
21462       new_inst = OPCODE_MVN;
21463       value = inverted;
21464       break;
21465
21466     case OPCODE_MVN:
21467       new_inst = OPCODE_MOV;
21468       value = inverted;
21469       break;
21470
21471     case OPCODE_AND:             /* AND <-> BIC  */
21472       new_inst = OPCODE_BIC;
21473       value = inverted;
21474       break;
21475
21476     case OPCODE_BIC:
21477       new_inst = OPCODE_AND;
21478       value = inverted;
21479       break;
21480
21481     case OPCODE_ADC:              /* ADC <-> SBC  */
21482       new_inst = OPCODE_SBC;
21483       value = inverted;
21484       break;
21485
21486     case OPCODE_SBC:
21487       new_inst = OPCODE_ADC;
21488       value = inverted;
21489       break;
21490
21491       /* We cannot do anything.  */
21492     default:
21493       return FAIL;
21494     }
21495
21496   if (value == (unsigned) FAIL)
21497     return FAIL;
21498
21499   *instruction &= OPCODE_MASK;
21500   *instruction |= new_inst << DATA_OP_SHIFT;
21501   return value;
21502 }
21503
21504 /* Like negate_data_op, but for Thumb-2.   */
21505
21506 static unsigned int
21507 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
21508 {
21509   int op, new_inst;
21510   int rd;
21511   unsigned int negated, inverted;
21512
21513   negated = encode_thumb32_immediate (-value);
21514   inverted = encode_thumb32_immediate (~value);
21515
21516   rd = (*instruction >> 8) & 0xf;
21517   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
21518   switch (op)
21519     {
21520       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
21521     case T2_OPCODE_SUB:
21522       new_inst = T2_OPCODE_ADD;
21523       value = negated;
21524       break;
21525
21526     case T2_OPCODE_ADD:
21527       new_inst = T2_OPCODE_SUB;
21528       value = negated;
21529       break;
21530
21531       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
21532     case T2_OPCODE_ORR:
21533       new_inst = T2_OPCODE_ORN;
21534       value = inverted;
21535       break;
21536
21537     case T2_OPCODE_ORN:
21538       new_inst = T2_OPCODE_ORR;
21539       value = inverted;
21540       break;
21541
21542       /* AND <-> BIC.  TST has no inverted equivalent.  */
21543     case T2_OPCODE_AND:
21544       new_inst = T2_OPCODE_BIC;
21545       if (rd == 15)
21546         value = FAIL;
21547       else
21548         value = inverted;
21549       break;
21550
21551     case T2_OPCODE_BIC:
21552       new_inst = T2_OPCODE_AND;
21553       value = inverted;
21554       break;
21555
21556       /* ADC <-> SBC  */
21557     case T2_OPCODE_ADC:
21558       new_inst = T2_OPCODE_SBC;
21559       value = inverted;
21560       break;
21561
21562     case T2_OPCODE_SBC:
21563       new_inst = T2_OPCODE_ADC;
21564       value = inverted;
21565       break;
21566
21567       /* We cannot do anything.  */
21568     default:
21569       return FAIL;
21570     }
21571
21572   if (value == (unsigned int)FAIL)
21573     return FAIL;
21574
21575   *instruction &= T2_OPCODE_MASK;
21576   *instruction |= new_inst << T2_DATA_OP_SHIFT;
21577   return value;
21578 }
21579
21580 /* Read a 32-bit thumb instruction from buf.  */
21581 static unsigned long
21582 get_thumb32_insn (char * buf)
21583 {
21584   unsigned long insn;
21585   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
21586   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21587
21588   return insn;
21589 }
21590
21591
21592 /* We usually want to set the low bit on the address of thumb function
21593    symbols.  In particular .word foo - . should have the low bit set.
21594    Generic code tries to fold the difference of two symbols to
21595    a constant.  Prevent this and force a relocation when the first symbols
21596    is a thumb function.  */
21597
21598 bfd_boolean
21599 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
21600 {
21601   if (op == O_subtract
21602       && l->X_op == O_symbol
21603       && r->X_op == O_symbol
21604       && THUMB_IS_FUNC (l->X_add_symbol))
21605     {
21606       l->X_op = O_subtract;
21607       l->X_op_symbol = r->X_add_symbol;
21608       l->X_add_number -= r->X_add_number;
21609       return TRUE;
21610     }
21611
21612   /* Process as normal.  */
21613   return FALSE;
21614 }
21615
21616 /* Encode Thumb2 unconditional branches and calls. The encoding
21617    for the 2 are identical for the immediate values.  */
21618
21619 static void
21620 encode_thumb2_b_bl_offset (char * buf, offsetT value)
21621 {
21622 #define T2I1I2MASK  ((1 << 13) | (1 << 11))
21623   offsetT newval;
21624   offsetT newval2;
21625   addressT S, I1, I2, lo, hi;
21626
21627   S = (value >> 24) & 0x01;
21628   I1 = (value >> 23) & 0x01;
21629   I2 = (value >> 22) & 0x01;
21630   hi = (value >> 12) & 0x3ff;
21631   lo = (value >> 1) & 0x7ff;
21632   newval   = md_chars_to_number (buf, THUMB_SIZE);
21633   newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21634   newval  |= (S << 10) | hi;
21635   newval2 &=  ~T2I1I2MASK;
21636   newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
21637   md_number_to_chars (buf, newval, THUMB_SIZE);
21638   md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
21639 }
21640
21641 void
21642 md_apply_fix (fixS *    fixP,
21643                valueT * valP,
21644                segT     seg)
21645 {
21646   offsetT        value = * valP;
21647   offsetT        newval;
21648   unsigned int   newimm;
21649   unsigned long  temp;
21650   int            sign;
21651   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
21652
21653   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
21654
21655   /* Note whether this will delete the relocation.  */
21656
21657   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
21658     fixP->fx_done = 1;
21659
21660   /* On a 64-bit host, silently truncate 'value' to 32 bits for
21661      consistency with the behaviour on 32-bit hosts.  Remember value
21662      for emit_reloc.  */
21663   value &= 0xffffffff;
21664   value ^= 0x80000000;
21665   value -= 0x80000000;
21666
21667   *valP = value;
21668   fixP->fx_addnumber = value;
21669
21670   /* Same treatment for fixP->fx_offset.  */
21671   fixP->fx_offset &= 0xffffffff;
21672   fixP->fx_offset ^= 0x80000000;
21673   fixP->fx_offset -= 0x80000000;
21674
21675   switch (fixP->fx_r_type)
21676     {
21677     case BFD_RELOC_NONE:
21678       /* This will need to go in the object file.  */
21679       fixP->fx_done = 0;
21680       break;
21681
21682     case BFD_RELOC_ARM_IMMEDIATE:
21683       /* We claim that this fixup has been processed here,
21684          even if in fact we generate an error because we do
21685          not have a reloc for it, so tc_gen_reloc will reject it.  */
21686       fixP->fx_done = 1;
21687
21688       if (fixP->fx_addsy)
21689         {
21690           const char *msg = 0;
21691
21692           if (! S_IS_DEFINED (fixP->fx_addsy))
21693             msg = _("undefined symbol %s used as an immediate value");
21694           else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21695             msg = _("symbol %s is in a different section");
21696           else if (S_IS_WEAK (fixP->fx_addsy))
21697             msg = _("symbol %s is weak and may be overridden later");
21698
21699           if (msg)
21700             {
21701               as_bad_where (fixP->fx_file, fixP->fx_line,
21702                             msg, S_GET_NAME (fixP->fx_addsy));
21703               break;
21704             }
21705         }
21706
21707       temp = md_chars_to_number (buf, INSN_SIZE);
21708
21709       /* If the offset is negative, we should use encoding A2 for ADR.  */
21710       if ((temp & 0xfff0000) == 0x28f0000 && value < 0)
21711         newimm = negate_data_op (&temp, value);
21712       else
21713         {
21714           newimm = encode_arm_immediate (value);
21715
21716           /* If the instruction will fail, see if we can fix things up by
21717              changing the opcode.  */
21718           if (newimm == (unsigned int) FAIL)
21719             newimm = negate_data_op (&temp, value);
21720         }
21721
21722       if (newimm == (unsigned int) FAIL)
21723         {
21724           as_bad_where (fixP->fx_file, fixP->fx_line,
21725                         _("invalid constant (%lx) after fixup"),
21726                         (unsigned long) value);
21727           break;
21728         }
21729
21730       newimm |= (temp & 0xfffff000);
21731       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
21732       break;
21733
21734     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21735       {
21736         unsigned int highpart = 0;
21737         unsigned int newinsn  = 0xe1a00000; /* nop.  */
21738
21739         if (fixP->fx_addsy)
21740           {
21741             const char *msg = 0;
21742
21743             if (! S_IS_DEFINED (fixP->fx_addsy))
21744               msg = _("undefined symbol %s used as an immediate value");
21745             else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
21746               msg = _("symbol %s is in a different section");
21747             else if (S_IS_WEAK (fixP->fx_addsy))
21748               msg = _("symbol %s is weak and may be overridden later");
21749
21750             if (msg)
21751               {
21752                 as_bad_where (fixP->fx_file, fixP->fx_line,
21753                               msg, S_GET_NAME (fixP->fx_addsy));
21754                 break;
21755               }
21756           }
21757
21758         newimm = encode_arm_immediate (value);
21759         temp = md_chars_to_number (buf, INSN_SIZE);
21760
21761         /* If the instruction will fail, see if we can fix things up by
21762            changing the opcode.  */
21763         if (newimm == (unsigned int) FAIL
21764             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
21765           {
21766             /* No ?  OK - try using two ADD instructions to generate
21767                the value.  */
21768             newimm = validate_immediate_twopart (value, & highpart);
21769
21770             /* Yes - then make sure that the second instruction is
21771                also an add.  */
21772             if (newimm != (unsigned int) FAIL)
21773               newinsn = temp;
21774             /* Still No ?  Try using a negated value.  */
21775             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
21776               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
21777             /* Otherwise - give up.  */
21778             else
21779               {
21780                 as_bad_where (fixP->fx_file, fixP->fx_line,
21781                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
21782                               (long) value);
21783                 break;
21784               }
21785
21786             /* Replace the first operand in the 2nd instruction (which
21787                is the PC) with the destination register.  We have
21788                already added in the PC in the first instruction and we
21789                do not want to do it again.  */
21790             newinsn &= ~ 0xf0000;
21791             newinsn |= ((newinsn & 0x0f000) << 4);
21792           }
21793
21794         newimm |= (temp & 0xfffff000);
21795         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
21796
21797         highpart |= (newinsn & 0xfffff000);
21798         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
21799       }
21800       break;
21801
21802     case BFD_RELOC_ARM_OFFSET_IMM:
21803       if (!fixP->fx_done && seg->use_rela_p)
21804         value = 0;
21805
21806     case BFD_RELOC_ARM_LITERAL:
21807       sign = value > 0;
21808
21809       if (value < 0)
21810         value = - value;
21811
21812       if (validate_offset_imm (value, 0) == FAIL)
21813         {
21814           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
21815             as_bad_where (fixP->fx_file, fixP->fx_line,
21816                           _("invalid literal constant: pool needs to be closer"));
21817           else
21818             as_bad_where (fixP->fx_file, fixP->fx_line,
21819                           _("bad immediate value for offset (%ld)"),
21820                           (long) value);
21821           break;
21822         }
21823
21824       newval = md_chars_to_number (buf, INSN_SIZE);
21825       if (value == 0)
21826         newval &= 0xfffff000;
21827       else
21828         {
21829           newval &= 0xff7ff000;
21830           newval |= value | (sign ? INDEX_UP : 0);
21831         }
21832       md_number_to_chars (buf, newval, INSN_SIZE);
21833       break;
21834
21835     case BFD_RELOC_ARM_OFFSET_IMM8:
21836     case BFD_RELOC_ARM_HWLITERAL:
21837       sign = value > 0;
21838
21839       if (value < 0)
21840         value = - value;
21841
21842       if (validate_offset_imm (value, 1) == FAIL)
21843         {
21844           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
21845             as_bad_where (fixP->fx_file, fixP->fx_line,
21846                           _("invalid literal constant: pool needs to be closer"));
21847           else
21848             as_bad_where (fixP->fx_file, fixP->fx_line,
21849                           _("bad immediate value for 8-bit offset (%ld)"),
21850                           (long) value);
21851           break;
21852         }
21853
21854       newval = md_chars_to_number (buf, INSN_SIZE);
21855       if (value == 0)
21856         newval &= 0xfffff0f0;
21857       else
21858         {
21859           newval &= 0xff7ff0f0;
21860           newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
21861         }
21862       md_number_to_chars (buf, newval, INSN_SIZE);
21863       break;
21864
21865     case BFD_RELOC_ARM_T32_OFFSET_U8:
21866       if (value < 0 || value > 1020 || value % 4 != 0)
21867         as_bad_where (fixP->fx_file, fixP->fx_line,
21868                       _("bad immediate value for offset (%ld)"), (long) value);
21869       value /= 4;
21870
21871       newval = md_chars_to_number (buf+2, THUMB_SIZE);
21872       newval |= value;
21873       md_number_to_chars (buf+2, newval, THUMB_SIZE);
21874       break;
21875
21876     case BFD_RELOC_ARM_T32_OFFSET_IMM:
21877       /* This is a complicated relocation used for all varieties of Thumb32
21878          load/store instruction with immediate offset:
21879
21880          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
21881                                                    *4, optional writeback(W)
21882                                                    (doubleword load/store)
21883
21884          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
21885          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
21886          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
21887          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
21888          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
21889
21890          Uppercase letters indicate bits that are already encoded at
21891          this point.  Lowercase letters are our problem.  For the
21892          second block of instructions, the secondary opcode nybble
21893          (bits 8..11) is present, and bit 23 is zero, even if this is
21894          a PC-relative operation.  */
21895       newval = md_chars_to_number (buf, THUMB_SIZE);
21896       newval <<= 16;
21897       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
21898
21899       if ((newval & 0xf0000000) == 0xe0000000)
21900         {
21901           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
21902           if (value >= 0)
21903             newval |= (1 << 23);
21904           else
21905             value = -value;
21906           if (value % 4 != 0)
21907             {
21908               as_bad_where (fixP->fx_file, fixP->fx_line,
21909                             _("offset not a multiple of 4"));
21910               break;
21911             }
21912           value /= 4;
21913           if (value > 0xff)
21914             {
21915               as_bad_where (fixP->fx_file, fixP->fx_line,
21916                             _("offset out of range"));
21917               break;
21918             }
21919           newval &= ~0xff;
21920         }
21921       else if ((newval & 0x000f0000) == 0x000f0000)
21922         {
21923           /* PC-relative, 12-bit offset.  */
21924           if (value >= 0)
21925             newval |= (1 << 23);
21926           else
21927             value = -value;
21928           if (value > 0xfff)
21929             {
21930               as_bad_where (fixP->fx_file, fixP->fx_line,
21931                             _("offset out of range"));
21932               break;
21933             }
21934           newval &= ~0xfff;
21935         }
21936       else if ((newval & 0x00000100) == 0x00000100)
21937         {
21938           /* Writeback: 8-bit, +/- offset.  */
21939           if (value >= 0)
21940             newval |= (1 << 9);
21941           else
21942             value = -value;
21943           if (value > 0xff)
21944             {
21945               as_bad_where (fixP->fx_file, fixP->fx_line,
21946                             _("offset out of range"));
21947               break;
21948             }
21949           newval &= ~0xff;
21950         }
21951       else if ((newval & 0x00000f00) == 0x00000e00)
21952         {
21953           /* T-instruction: positive 8-bit offset.  */
21954           if (value < 0 || value > 0xff)
21955             {
21956               as_bad_where (fixP->fx_file, fixP->fx_line,
21957                             _("offset out of range"));
21958               break;
21959             }
21960           newval &= ~0xff;
21961           newval |= value;
21962         }
21963       else
21964         {
21965           /* Positive 12-bit or negative 8-bit offset.  */
21966           int limit;
21967           if (value >= 0)
21968             {
21969               newval |= (1 << 23);
21970               limit = 0xfff;
21971             }
21972           else
21973             {
21974               value = -value;
21975               limit = 0xff;
21976             }
21977           if (value > limit)
21978             {
21979               as_bad_where (fixP->fx_file, fixP->fx_line,
21980                             _("offset out of range"));
21981               break;
21982             }
21983           newval &= ~limit;
21984         }
21985
21986       newval |= value;
21987       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
21988       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
21989       break;
21990
21991     case BFD_RELOC_ARM_SHIFT_IMM:
21992       newval = md_chars_to_number (buf, INSN_SIZE);
21993       if (((unsigned long) value) > 32
21994           || (value == 32
21995               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
21996         {
21997           as_bad_where (fixP->fx_file, fixP->fx_line,
21998                         _("shift expression is too large"));
21999           break;
22000         }
22001
22002       if (value == 0)
22003         /* Shifts of zero must be done as lsl.  */
22004         newval &= ~0x60;
22005       else if (value == 32)
22006         value = 0;
22007       newval &= 0xfffff07f;
22008       newval |= (value & 0x1f) << 7;
22009       md_number_to_chars (buf, newval, INSN_SIZE);
22010       break;
22011
22012     case BFD_RELOC_ARM_T32_IMMEDIATE:
22013     case BFD_RELOC_ARM_T32_ADD_IMM:
22014     case BFD_RELOC_ARM_T32_IMM12:
22015     case BFD_RELOC_ARM_T32_ADD_PC12:
22016       /* We claim that this fixup has been processed here,
22017          even if in fact we generate an error because we do
22018          not have a reloc for it, so tc_gen_reloc will reject it.  */
22019       fixP->fx_done = 1;
22020
22021       if (fixP->fx_addsy
22022           && ! S_IS_DEFINED (fixP->fx_addsy))
22023         {
22024           as_bad_where (fixP->fx_file, fixP->fx_line,
22025                         _("undefined symbol %s used as an immediate value"),
22026                         S_GET_NAME (fixP->fx_addsy));
22027           break;
22028         }
22029
22030       newval = md_chars_to_number (buf, THUMB_SIZE);
22031       newval <<= 16;
22032       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
22033
22034       newimm = FAIL;
22035       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
22036           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
22037         {
22038           newimm = encode_thumb32_immediate (value);
22039           if (newimm == (unsigned int) FAIL)
22040             newimm = thumb32_negate_data_op (&newval, value);
22041         }
22042       if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
22043           && newimm == (unsigned int) FAIL)
22044         {
22045           /* Turn add/sum into addw/subw.  */
22046           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
22047             newval = (newval & 0xfeffffff) | 0x02000000;
22048           /* No flat 12-bit imm encoding for addsw/subsw.  */
22049           if ((newval & 0x00100000) == 0)
22050             {
22051               /* 12 bit immediate for addw/subw.  */
22052               if (value < 0)
22053                 {
22054                   value = -value;
22055                   newval ^= 0x00a00000;
22056                 }
22057               if (value > 0xfff)
22058                 newimm = (unsigned int) FAIL;
22059               else
22060                 newimm = value;
22061             }
22062         }
22063
22064       if (newimm == (unsigned int)FAIL)
22065         {
22066           as_bad_where (fixP->fx_file, fixP->fx_line,
22067                         _("invalid constant (%lx) after fixup"),
22068                         (unsigned long) value);
22069           break;
22070         }
22071
22072       newval |= (newimm & 0x800) << 15;
22073       newval |= (newimm & 0x700) << 4;
22074       newval |= (newimm & 0x0ff);
22075
22076       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
22077       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
22078       break;
22079
22080     case BFD_RELOC_ARM_SMC:
22081       if (((unsigned long) value) > 0xffff)
22082         as_bad_where (fixP->fx_file, fixP->fx_line,
22083                       _("invalid smc expression"));
22084       newval = md_chars_to_number (buf, INSN_SIZE);
22085       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
22086       md_number_to_chars (buf, newval, INSN_SIZE);
22087       break;
22088
22089     case BFD_RELOC_ARM_HVC:
22090       if (((unsigned long) value) > 0xffff)
22091         as_bad_where (fixP->fx_file, fixP->fx_line,
22092                       _("invalid hvc expression"));
22093       newval = md_chars_to_number (buf, INSN_SIZE);
22094       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
22095       md_number_to_chars (buf, newval, INSN_SIZE);
22096       break;
22097
22098     case BFD_RELOC_ARM_SWI:
22099       if (fixP->tc_fix_data != 0)
22100         {
22101           if (((unsigned long) value) > 0xff)
22102             as_bad_where (fixP->fx_file, fixP->fx_line,
22103                           _("invalid swi expression"));
22104           newval = md_chars_to_number (buf, THUMB_SIZE);
22105           newval |= value;
22106           md_number_to_chars (buf, newval, THUMB_SIZE);
22107         }
22108       else
22109         {
22110           if (((unsigned long) value) > 0x00ffffff)
22111             as_bad_where (fixP->fx_file, fixP->fx_line,
22112                           _("invalid swi expression"));
22113           newval = md_chars_to_number (buf, INSN_SIZE);
22114           newval |= value;
22115           md_number_to_chars (buf, newval, INSN_SIZE);
22116         }
22117       break;
22118
22119     case BFD_RELOC_ARM_MULTI:
22120       if (((unsigned long) value) > 0xffff)
22121         as_bad_where (fixP->fx_file, fixP->fx_line,
22122                       _("invalid expression in load/store multiple"));
22123       newval = value | md_chars_to_number (buf, INSN_SIZE);
22124       md_number_to_chars (buf, newval, INSN_SIZE);
22125       break;
22126
22127 #ifdef OBJ_ELF
22128     case BFD_RELOC_ARM_PCREL_CALL:
22129
22130       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22131           && fixP->fx_addsy
22132           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22133           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22134           && THUMB_IS_FUNC (fixP->fx_addsy))
22135         /* Flip the bl to blx. This is a simple flip
22136            bit here because we generate PCREL_CALL for
22137            unconditional bls.  */
22138         {
22139           newval = md_chars_to_number (buf, INSN_SIZE);
22140           newval = newval | 0x10000000;
22141           md_number_to_chars (buf, newval, INSN_SIZE);
22142           temp = 1;
22143           fixP->fx_done = 1;
22144         }
22145       else
22146         temp = 3;
22147       goto arm_branch_common;
22148
22149     case BFD_RELOC_ARM_PCREL_JUMP:
22150       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22151           && fixP->fx_addsy
22152           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22153           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22154           && THUMB_IS_FUNC (fixP->fx_addsy))
22155         {
22156           /* This would map to a bl<cond>, b<cond>,
22157              b<always> to a Thumb function. We
22158              need to force a relocation for this particular
22159              case.  */
22160           newval = md_chars_to_number (buf, INSN_SIZE);
22161           fixP->fx_done = 0;
22162         }
22163
22164     case BFD_RELOC_ARM_PLT32:
22165 #endif
22166     case BFD_RELOC_ARM_PCREL_BRANCH:
22167       temp = 3;
22168       goto arm_branch_common;
22169
22170     case BFD_RELOC_ARM_PCREL_BLX:
22171
22172       temp = 1;
22173       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
22174           && fixP->fx_addsy
22175           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22176           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22177           && ARM_IS_FUNC (fixP->fx_addsy))
22178         {
22179           /* Flip the blx to a bl and warn.  */
22180           const char *name = S_GET_NAME (fixP->fx_addsy);
22181           newval = 0xeb000000;
22182           as_warn_where (fixP->fx_file, fixP->fx_line,
22183                          _("blx to '%s' an ARM ISA state function changed to bl"),
22184                           name);
22185           md_number_to_chars (buf, newval, INSN_SIZE);
22186           temp = 3;
22187           fixP->fx_done = 1;
22188         }
22189
22190 #ifdef OBJ_ELF
22191        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22192          fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
22193 #endif
22194
22195     arm_branch_common:
22196       /* We are going to store value (shifted right by two) in the
22197          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
22198          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
22199          also be be clear.  */
22200       if (value & temp)
22201         as_bad_where (fixP->fx_file, fixP->fx_line,
22202                       _("misaligned branch destination"));
22203       if ((value & (offsetT)0xfe000000) != (offsetT)0
22204           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
22205         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22206
22207       if (fixP->fx_done || !seg->use_rela_p)
22208         {
22209           newval = md_chars_to_number (buf, INSN_SIZE);
22210           newval |= (value >> 2) & 0x00ffffff;
22211           /* Set the H bit on BLX instructions.  */
22212           if (temp == 1)
22213             {
22214               if (value & 2)
22215                 newval |= 0x01000000;
22216               else
22217                 newval &= ~0x01000000;
22218             }
22219           md_number_to_chars (buf, newval, INSN_SIZE);
22220         }
22221       break;
22222
22223     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
22224       /* CBZ can only branch forward.  */
22225
22226       /* Attempts to use CBZ to branch to the next instruction
22227          (which, strictly speaking, are prohibited) will be turned into
22228          no-ops.
22229
22230          FIXME: It may be better to remove the instruction completely and
22231          perform relaxation.  */
22232       if (value == -2)
22233         {
22234           newval = md_chars_to_number (buf, THUMB_SIZE);
22235           newval = 0xbf00; /* NOP encoding T1 */
22236           md_number_to_chars (buf, newval, THUMB_SIZE);
22237         }
22238       else
22239         {
22240           if (value & ~0x7e)
22241             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22242
22243           if (fixP->fx_done || !seg->use_rela_p)
22244             {
22245               newval = md_chars_to_number (buf, THUMB_SIZE);
22246               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
22247               md_number_to_chars (buf, newval, THUMB_SIZE);
22248             }
22249         }
22250       break;
22251
22252     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
22253       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
22254         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22255
22256       if (fixP->fx_done || !seg->use_rela_p)
22257         {
22258           newval = md_chars_to_number (buf, THUMB_SIZE);
22259           newval |= (value & 0x1ff) >> 1;
22260           md_number_to_chars (buf, newval, THUMB_SIZE);
22261         }
22262       break;
22263
22264     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
22265       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
22266         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22267
22268       if (fixP->fx_done || !seg->use_rela_p)
22269         {
22270           newval = md_chars_to_number (buf, THUMB_SIZE);
22271           newval |= (value & 0xfff) >> 1;
22272           md_number_to_chars (buf, newval, THUMB_SIZE);
22273         }
22274       break;
22275
22276     case BFD_RELOC_THUMB_PCREL_BRANCH20:
22277       if (fixP->fx_addsy
22278           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22279           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22280           && ARM_IS_FUNC (fixP->fx_addsy)
22281           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22282         {
22283           /* Force a relocation for a branch 20 bits wide.  */
22284           fixP->fx_done = 0;
22285         }
22286       if ((value & ~0x1fffff) && ((value & ~0x0fffff) != ~0x0fffff))
22287         as_bad_where (fixP->fx_file, fixP->fx_line,
22288                       _("conditional branch out of range"));
22289
22290       if (fixP->fx_done || !seg->use_rela_p)
22291         {
22292           offsetT newval2;
22293           addressT S, J1, J2, lo, hi;
22294
22295           S  = (value & 0x00100000) >> 20;
22296           J2 = (value & 0x00080000) >> 19;
22297           J1 = (value & 0x00040000) >> 18;
22298           hi = (value & 0x0003f000) >> 12;
22299           lo = (value & 0x00000ffe) >> 1;
22300
22301           newval   = md_chars_to_number (buf, THUMB_SIZE);
22302           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22303           newval  |= (S << 10) | hi;
22304           newval2 |= (J1 << 13) | (J2 << 11) | lo;
22305           md_number_to_chars (buf, newval, THUMB_SIZE);
22306           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
22307         }
22308       break;
22309
22310     case BFD_RELOC_THUMB_PCREL_BLX:
22311       /* If there is a blx from a thumb state function to
22312          another thumb function flip this to a bl and warn
22313          about it.  */
22314
22315       if (fixP->fx_addsy
22316           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22317           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22318           && THUMB_IS_FUNC (fixP->fx_addsy))
22319         {
22320           const char *name = S_GET_NAME (fixP->fx_addsy);
22321           as_warn_where (fixP->fx_file, fixP->fx_line,
22322                          _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
22323                          name);
22324           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22325           newval = newval | 0x1000;
22326           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22327           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22328           fixP->fx_done = 1;
22329         }
22330
22331
22332       goto thumb_bl_common;
22333
22334     case BFD_RELOC_THUMB_PCREL_BRANCH23:
22335       /* A bl from Thumb state ISA to an internal ARM state function
22336          is converted to a blx.  */
22337       if (fixP->fx_addsy
22338           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22339           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22340           && ARM_IS_FUNC (fixP->fx_addsy)
22341           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22342         {
22343           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
22344           newval = newval & ~0x1000;
22345           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
22346           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
22347           fixP->fx_done = 1;
22348         }
22349
22350     thumb_bl_common:
22351
22352       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22353         /* For a BLX instruction, make sure that the relocation is rounded up
22354            to a word boundary.  This follows the semantics of the instruction
22355            which specifies that bit 1 of the target address will come from bit
22356            1 of the base address.  */
22357         value = (value + 3) & ~ 3;
22358
22359 #ifdef OBJ_ELF
22360        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4
22361            && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
22362          fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
22363 #endif
22364
22365       if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
22366         {
22367           if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
22368             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22369           else if ((value & ~0x1ffffff)
22370                    && ((value & ~0x1ffffff) != ~0x1ffffff))
22371             as_bad_where (fixP->fx_file, fixP->fx_line,
22372                           _("Thumb2 branch out of range"));
22373         }
22374
22375       if (fixP->fx_done || !seg->use_rela_p)
22376         encode_thumb2_b_bl_offset (buf, value);
22377
22378       break;
22379
22380     case BFD_RELOC_THUMB_PCREL_BRANCH25:
22381       if ((value & ~0x0ffffff) && ((value & ~0x0ffffff) != ~0x0ffffff))
22382         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
22383
22384       if (fixP->fx_done || !seg->use_rela_p)
22385           encode_thumb2_b_bl_offset (buf, value);
22386
22387       break;
22388
22389     case BFD_RELOC_8:
22390       if (fixP->fx_done || !seg->use_rela_p)
22391         *buf = value;
22392       break;
22393
22394     case BFD_RELOC_16:
22395       if (fixP->fx_done || !seg->use_rela_p)
22396         md_number_to_chars (buf, value, 2);
22397       break;
22398
22399 #ifdef OBJ_ELF
22400     case BFD_RELOC_ARM_TLS_CALL:
22401     case BFD_RELOC_ARM_THM_TLS_CALL:
22402     case BFD_RELOC_ARM_TLS_DESCSEQ:
22403     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
22404     case BFD_RELOC_ARM_TLS_GOTDESC:
22405     case BFD_RELOC_ARM_TLS_GD32:
22406     case BFD_RELOC_ARM_TLS_LE32:
22407     case BFD_RELOC_ARM_TLS_IE32:
22408     case BFD_RELOC_ARM_TLS_LDM32:
22409     case BFD_RELOC_ARM_TLS_LDO32:
22410       S_SET_THREAD_LOCAL (fixP->fx_addsy);
22411       break;
22412
22413     case BFD_RELOC_ARM_GOT32:
22414     case BFD_RELOC_ARM_GOTOFF:
22415       break;
22416
22417     case BFD_RELOC_ARM_GOT_PREL:
22418       if (fixP->fx_done || !seg->use_rela_p)
22419         md_number_to_chars (buf, value, 4);
22420       break;
22421
22422     case BFD_RELOC_ARM_TARGET2:
22423       /* TARGET2 is not partial-inplace, so we need to write the
22424          addend here for REL targets, because it won't be written out
22425          during reloc processing later.  */
22426       if (fixP->fx_done || !seg->use_rela_p)
22427         md_number_to_chars (buf, fixP->fx_offset, 4);
22428       break;
22429 #endif
22430
22431     case BFD_RELOC_RVA:
22432     case BFD_RELOC_32:
22433     case BFD_RELOC_ARM_TARGET1:
22434     case BFD_RELOC_ARM_ROSEGREL32:
22435     case BFD_RELOC_ARM_SBREL32:
22436     case BFD_RELOC_32_PCREL:
22437 #ifdef TE_PE
22438     case BFD_RELOC_32_SECREL:
22439 #endif
22440       if (fixP->fx_done || !seg->use_rela_p)
22441 #ifdef TE_WINCE
22442         /* For WinCE we only do this for pcrel fixups.  */
22443         if (fixP->fx_done || fixP->fx_pcrel)
22444 #endif
22445           md_number_to_chars (buf, value, 4);
22446       break;
22447
22448 #ifdef OBJ_ELF
22449     case BFD_RELOC_ARM_PREL31:
22450       if (fixP->fx_done || !seg->use_rela_p)
22451         {
22452           newval = md_chars_to_number (buf, 4) & 0x80000000;
22453           if ((value ^ (value >> 1)) & 0x40000000)
22454             {
22455               as_bad_where (fixP->fx_file, fixP->fx_line,
22456                             _("rel31 relocation overflow"));
22457             }
22458           newval |= value & 0x7fffffff;
22459           md_number_to_chars (buf, newval, 4);
22460         }
22461       break;
22462 #endif
22463
22464     case BFD_RELOC_ARM_CP_OFF_IMM:
22465     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
22466       if (value < -1023 || value > 1023 || (value & 3))
22467         as_bad_where (fixP->fx_file, fixP->fx_line,
22468                       _("co-processor offset out of range"));
22469     cp_off_common:
22470       sign = value > 0;
22471       if (value < 0)
22472         value = -value;
22473       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22474           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22475         newval = md_chars_to_number (buf, INSN_SIZE);
22476       else
22477         newval = get_thumb32_insn (buf);
22478       if (value == 0)
22479         newval &= 0xffffff00;
22480       else
22481         {
22482           newval &= 0xff7fff00;
22483           newval |= (value >> 2) | (sign ? INDEX_UP : 0);
22484         }
22485       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22486           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
22487         md_number_to_chars (buf, newval, INSN_SIZE);
22488       else
22489         put_thumb32_insn (buf, newval);
22490       break;
22491
22492     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
22493     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
22494       if (value < -255 || value > 255)
22495         as_bad_where (fixP->fx_file, fixP->fx_line,
22496                       _("co-processor offset out of range"));
22497       value *= 4;
22498       goto cp_off_common;
22499
22500     case BFD_RELOC_ARM_THUMB_OFFSET:
22501       newval = md_chars_to_number (buf, THUMB_SIZE);
22502       /* Exactly what ranges, and where the offset is inserted depends
22503          on the type of instruction, we can establish this from the
22504          top 4 bits.  */
22505       switch (newval >> 12)
22506         {
22507         case 4: /* PC load.  */
22508           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
22509              forced to zero for these loads; md_pcrel_from has already
22510              compensated for this.  */
22511           if (value & 3)
22512             as_bad_where (fixP->fx_file, fixP->fx_line,
22513                           _("invalid offset, target not word aligned (0x%08lX)"),
22514                           (((unsigned long) fixP->fx_frag->fr_address
22515                             + (unsigned long) fixP->fx_where) & ~3)
22516                           + (unsigned long) value);
22517
22518           if (value & ~0x3fc)
22519             as_bad_where (fixP->fx_file, fixP->fx_line,
22520                           _("invalid offset, value too big (0x%08lX)"),
22521                           (long) value);
22522
22523           newval |= value >> 2;
22524           break;
22525
22526         case 9: /* SP load/store.  */
22527           if (value & ~0x3fc)
22528             as_bad_where (fixP->fx_file, fixP->fx_line,
22529                           _("invalid offset, value too big (0x%08lX)"),
22530                           (long) value);
22531           newval |= value >> 2;
22532           break;
22533
22534         case 6: /* Word load/store.  */
22535           if (value & ~0x7c)
22536             as_bad_where (fixP->fx_file, fixP->fx_line,
22537                           _("invalid offset, value too big (0x%08lX)"),
22538                           (long) value);
22539           newval |= value << 4; /* 6 - 2.  */
22540           break;
22541
22542         case 7: /* Byte load/store.  */
22543           if (value & ~0x1f)
22544             as_bad_where (fixP->fx_file, fixP->fx_line,
22545                           _("invalid offset, value too big (0x%08lX)"),
22546                           (long) value);
22547           newval |= value << 6;
22548           break;
22549
22550         case 8: /* Halfword load/store.  */
22551           if (value & ~0x3e)
22552             as_bad_where (fixP->fx_file, fixP->fx_line,
22553                           _("invalid offset, value too big (0x%08lX)"),
22554                           (long) value);
22555           newval |= value << 5; /* 6 - 1.  */
22556           break;
22557
22558         default:
22559           as_bad_where (fixP->fx_file, fixP->fx_line,
22560                         "Unable to process relocation for thumb opcode: %lx",
22561                         (unsigned long) newval);
22562           break;
22563         }
22564       md_number_to_chars (buf, newval, THUMB_SIZE);
22565       break;
22566
22567     case BFD_RELOC_ARM_THUMB_ADD:
22568       /* This is a complicated relocation, since we use it for all of
22569          the following immediate relocations:
22570
22571             3bit ADD/SUB
22572             8bit ADD/SUB
22573             9bit ADD/SUB SP word-aligned
22574            10bit ADD PC/SP word-aligned
22575
22576          The type of instruction being processed is encoded in the
22577          instruction field:
22578
22579            0x8000  SUB
22580            0x00F0  Rd
22581            0x000F  Rs
22582       */
22583       newval = md_chars_to_number (buf, THUMB_SIZE);
22584       {
22585         int rd = (newval >> 4) & 0xf;
22586         int rs = newval & 0xf;
22587         int subtract = !!(newval & 0x8000);
22588
22589         /* Check for HI regs, only very restricted cases allowed:
22590            Adjusting SP, and using PC or SP to get an address.  */
22591         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
22592             || (rs > 7 && rs != REG_SP && rs != REG_PC))
22593           as_bad_where (fixP->fx_file, fixP->fx_line,
22594                         _("invalid Hi register with immediate"));
22595
22596         /* If value is negative, choose the opposite instruction.  */
22597         if (value < 0)
22598           {
22599             value = -value;
22600             subtract = !subtract;
22601             if (value < 0)
22602               as_bad_where (fixP->fx_file, fixP->fx_line,
22603                             _("immediate value out of range"));
22604           }
22605
22606         if (rd == REG_SP)
22607           {
22608             if (value & ~0x1fc)
22609               as_bad_where (fixP->fx_file, fixP->fx_line,
22610                             _("invalid immediate for stack address calculation"));
22611             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
22612             newval |= value >> 2;
22613           }
22614         else if (rs == REG_PC || rs == REG_SP)
22615           {
22616             if (subtract || value & ~0x3fc)
22617               as_bad_where (fixP->fx_file, fixP->fx_line,
22618                             _("invalid immediate for address calculation (value = 0x%08lX)"),
22619                             (unsigned long) value);
22620             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
22621             newval |= rd << 8;
22622             newval |= value >> 2;
22623           }
22624         else if (rs == rd)
22625           {
22626             if (value & ~0xff)
22627               as_bad_where (fixP->fx_file, fixP->fx_line,
22628                             _("immediate value out of range"));
22629             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
22630             newval |= (rd << 8) | value;
22631           }
22632         else
22633           {
22634             if (value & ~0x7)
22635               as_bad_where (fixP->fx_file, fixP->fx_line,
22636                             _("immediate value out of range"));
22637             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
22638             newval |= rd | (rs << 3) | (value << 6);
22639           }
22640       }
22641       md_number_to_chars (buf, newval, THUMB_SIZE);
22642       break;
22643
22644     case BFD_RELOC_ARM_THUMB_IMM:
22645       newval = md_chars_to_number (buf, THUMB_SIZE);
22646       if (value < 0 || value > 255)
22647         as_bad_where (fixP->fx_file, fixP->fx_line,
22648                       _("invalid immediate: %ld is out of range"),
22649                       (long) value);
22650       newval |= value;
22651       md_number_to_chars (buf, newval, THUMB_SIZE);
22652       break;
22653
22654     case BFD_RELOC_ARM_THUMB_SHIFT:
22655       /* 5bit shift value (0..32).  LSL cannot take 32.  */
22656       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
22657       temp = newval & 0xf800;
22658       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
22659         as_bad_where (fixP->fx_file, fixP->fx_line,
22660                       _("invalid shift value: %ld"), (long) value);
22661       /* Shifts of zero must be encoded as LSL.  */
22662       if (value == 0)
22663         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
22664       /* Shifts of 32 are encoded as zero.  */
22665       else if (value == 32)
22666         value = 0;
22667       newval |= value << 6;
22668       md_number_to_chars (buf, newval, THUMB_SIZE);
22669       break;
22670
22671     case BFD_RELOC_VTABLE_INHERIT:
22672     case BFD_RELOC_VTABLE_ENTRY:
22673       fixP->fx_done = 0;
22674       return;
22675
22676     case BFD_RELOC_ARM_MOVW:
22677     case BFD_RELOC_ARM_MOVT:
22678     case BFD_RELOC_ARM_THUMB_MOVW:
22679     case BFD_RELOC_ARM_THUMB_MOVT:
22680       if (fixP->fx_done || !seg->use_rela_p)
22681         {
22682           /* REL format relocations are limited to a 16-bit addend.  */
22683           if (!fixP->fx_done)
22684             {
22685               if (value < -0x8000 || value > 0x7fff)
22686                   as_bad_where (fixP->fx_file, fixP->fx_line,
22687                                 _("offset out of range"));
22688             }
22689           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
22690                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22691             {
22692               value >>= 16;
22693             }
22694
22695           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
22696               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
22697             {
22698               newval = get_thumb32_insn (buf);
22699               newval &= 0xfbf08f00;
22700               newval |= (value & 0xf000) << 4;
22701               newval |= (value & 0x0800) << 15;
22702               newval |= (value & 0x0700) << 4;
22703               newval |= (value & 0x00ff);
22704               put_thumb32_insn (buf, newval);
22705             }
22706           else
22707             {
22708               newval = md_chars_to_number (buf, 4);
22709               newval &= 0xfff0f000;
22710               newval |= value & 0x0fff;
22711               newval |= (value & 0xf000) << 4;
22712               md_number_to_chars (buf, newval, 4);
22713             }
22714         }
22715       return;
22716
22717    case BFD_RELOC_ARM_ALU_PC_G0_NC:
22718    case BFD_RELOC_ARM_ALU_PC_G0:
22719    case BFD_RELOC_ARM_ALU_PC_G1_NC:
22720    case BFD_RELOC_ARM_ALU_PC_G1:
22721    case BFD_RELOC_ARM_ALU_PC_G2:
22722    case BFD_RELOC_ARM_ALU_SB_G0_NC:
22723    case BFD_RELOC_ARM_ALU_SB_G0:
22724    case BFD_RELOC_ARM_ALU_SB_G1_NC:
22725    case BFD_RELOC_ARM_ALU_SB_G1:
22726    case BFD_RELOC_ARM_ALU_SB_G2:
22727      gas_assert (!fixP->fx_done);
22728      if (!seg->use_rela_p)
22729        {
22730          bfd_vma insn;
22731          bfd_vma encoded_addend;
22732          bfd_vma addend_abs = abs (value);
22733
22734          /* Check that the absolute value of the addend can be
22735             expressed as an 8-bit constant plus a rotation.  */
22736          encoded_addend = encode_arm_immediate (addend_abs);
22737          if (encoded_addend == (unsigned int) FAIL)
22738            as_bad_where (fixP->fx_file, fixP->fx_line,
22739                          _("the offset 0x%08lX is not representable"),
22740                          (unsigned long) addend_abs);
22741
22742          /* Extract the instruction.  */
22743          insn = md_chars_to_number (buf, INSN_SIZE);
22744
22745          /* If the addend is positive, use an ADD instruction.
22746             Otherwise use a SUB.  Take care not to destroy the S bit.  */
22747          insn &= 0xff1fffff;
22748          if (value < 0)
22749            insn |= 1 << 22;
22750          else
22751            insn |= 1 << 23;
22752
22753          /* Place the encoded addend into the first 12 bits of the
22754             instruction.  */
22755          insn &= 0xfffff000;
22756          insn |= encoded_addend;
22757
22758          /* Update the instruction.  */
22759          md_number_to_chars (buf, insn, INSN_SIZE);
22760        }
22761      break;
22762
22763     case BFD_RELOC_ARM_LDR_PC_G0:
22764     case BFD_RELOC_ARM_LDR_PC_G1:
22765     case BFD_RELOC_ARM_LDR_PC_G2:
22766     case BFD_RELOC_ARM_LDR_SB_G0:
22767     case BFD_RELOC_ARM_LDR_SB_G1:
22768     case BFD_RELOC_ARM_LDR_SB_G2:
22769       gas_assert (!fixP->fx_done);
22770       if (!seg->use_rela_p)
22771         {
22772           bfd_vma insn;
22773           bfd_vma addend_abs = abs (value);
22774
22775           /* Check that the absolute value of the addend can be
22776              encoded in 12 bits.  */
22777           if (addend_abs >= 0x1000)
22778             as_bad_where (fixP->fx_file, fixP->fx_line,
22779                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
22780                           (unsigned long) addend_abs);
22781
22782           /* Extract the instruction.  */
22783           insn = md_chars_to_number (buf, INSN_SIZE);
22784
22785           /* If the addend is negative, clear bit 23 of the instruction.
22786              Otherwise set it.  */
22787           if (value < 0)
22788             insn &= ~(1 << 23);
22789           else
22790             insn |= 1 << 23;
22791
22792           /* Place the absolute value of the addend into the first 12 bits
22793              of the instruction.  */
22794           insn &= 0xfffff000;
22795           insn |= addend_abs;
22796
22797           /* Update the instruction.  */
22798           md_number_to_chars (buf, insn, INSN_SIZE);
22799         }
22800       break;
22801
22802     case BFD_RELOC_ARM_LDRS_PC_G0:
22803     case BFD_RELOC_ARM_LDRS_PC_G1:
22804     case BFD_RELOC_ARM_LDRS_PC_G2:
22805     case BFD_RELOC_ARM_LDRS_SB_G0:
22806     case BFD_RELOC_ARM_LDRS_SB_G1:
22807     case BFD_RELOC_ARM_LDRS_SB_G2:
22808       gas_assert (!fixP->fx_done);
22809       if (!seg->use_rela_p)
22810         {
22811           bfd_vma insn;
22812           bfd_vma addend_abs = abs (value);
22813
22814           /* Check that the absolute value of the addend can be
22815              encoded in 8 bits.  */
22816           if (addend_abs >= 0x100)
22817             as_bad_where (fixP->fx_file, fixP->fx_line,
22818                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
22819                           (unsigned long) addend_abs);
22820
22821           /* Extract the instruction.  */
22822           insn = md_chars_to_number (buf, INSN_SIZE);
22823
22824           /* If the addend is negative, clear bit 23 of the instruction.
22825              Otherwise set it.  */
22826           if (value < 0)
22827             insn &= ~(1 << 23);
22828           else
22829             insn |= 1 << 23;
22830
22831           /* Place the first four bits of the absolute value of the addend
22832              into the first 4 bits of the instruction, and the remaining
22833              four into bits 8 .. 11.  */
22834           insn &= 0xfffff0f0;
22835           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
22836
22837           /* Update the instruction.  */
22838           md_number_to_chars (buf, insn, INSN_SIZE);
22839         }
22840       break;
22841
22842     case BFD_RELOC_ARM_LDC_PC_G0:
22843     case BFD_RELOC_ARM_LDC_PC_G1:
22844     case BFD_RELOC_ARM_LDC_PC_G2:
22845     case BFD_RELOC_ARM_LDC_SB_G0:
22846     case BFD_RELOC_ARM_LDC_SB_G1:
22847     case BFD_RELOC_ARM_LDC_SB_G2:
22848       gas_assert (!fixP->fx_done);
22849       if (!seg->use_rela_p)
22850         {
22851           bfd_vma insn;
22852           bfd_vma addend_abs = abs (value);
22853
22854           /* Check that the absolute value of the addend is a multiple of
22855              four and, when divided by four, fits in 8 bits.  */
22856           if (addend_abs & 0x3)
22857             as_bad_where (fixP->fx_file, fixP->fx_line,
22858                           _("bad offset 0x%08lX (must be word-aligned)"),
22859                           (unsigned long) addend_abs);
22860
22861           if ((addend_abs >> 2) > 0xff)
22862             as_bad_where (fixP->fx_file, fixP->fx_line,
22863                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
22864                           (unsigned long) addend_abs);
22865
22866           /* Extract the instruction.  */
22867           insn = md_chars_to_number (buf, INSN_SIZE);
22868
22869           /* If the addend is negative, clear bit 23 of the instruction.
22870              Otherwise set it.  */
22871           if (value < 0)
22872             insn &= ~(1 << 23);
22873           else
22874             insn |= 1 << 23;
22875
22876           /* Place the addend (divided by four) into the first eight
22877              bits of the instruction.  */
22878           insn &= 0xfffffff0;
22879           insn |= addend_abs >> 2;
22880
22881           /* Update the instruction.  */
22882           md_number_to_chars (buf, insn, INSN_SIZE);
22883         }
22884       break;
22885
22886     case BFD_RELOC_ARM_V4BX:
22887       /* This will need to go in the object file.  */
22888       fixP->fx_done = 0;
22889       break;
22890
22891     case BFD_RELOC_UNUSED:
22892     default:
22893       as_bad_where (fixP->fx_file, fixP->fx_line,
22894                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
22895     }
22896 }
22897
22898 /* Translate internal representation of relocation info to BFD target
22899    format.  */
22900
22901 arelent *
22902 tc_gen_reloc (asection *section, fixS *fixp)
22903 {
22904   arelent * reloc;
22905   bfd_reloc_code_real_type code;
22906
22907   reloc = (arelent *) xmalloc (sizeof (arelent));
22908
22909   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
22910   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
22911   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
22912
22913   if (fixp->fx_pcrel)
22914     {
22915       if (section->use_rela_p)
22916         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
22917       else
22918         fixp->fx_offset = reloc->address;
22919     }
22920   reloc->addend = fixp->fx_offset;
22921
22922   switch (fixp->fx_r_type)
22923     {
22924     case BFD_RELOC_8:
22925       if (fixp->fx_pcrel)
22926         {
22927           code = BFD_RELOC_8_PCREL;
22928           break;
22929         }
22930
22931     case BFD_RELOC_16:
22932       if (fixp->fx_pcrel)
22933         {
22934           code = BFD_RELOC_16_PCREL;
22935           break;
22936         }
22937
22938     case BFD_RELOC_32:
22939       if (fixp->fx_pcrel)
22940         {
22941           code = BFD_RELOC_32_PCREL;
22942           break;
22943         }
22944
22945     case BFD_RELOC_ARM_MOVW:
22946       if (fixp->fx_pcrel)
22947         {
22948           code = BFD_RELOC_ARM_MOVW_PCREL;
22949           break;
22950         }
22951
22952     case BFD_RELOC_ARM_MOVT:
22953       if (fixp->fx_pcrel)
22954         {
22955           code = BFD_RELOC_ARM_MOVT_PCREL;
22956           break;
22957         }
22958
22959     case BFD_RELOC_ARM_THUMB_MOVW:
22960       if (fixp->fx_pcrel)
22961         {
22962           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
22963           break;
22964         }
22965
22966     case BFD_RELOC_ARM_THUMB_MOVT:
22967       if (fixp->fx_pcrel)
22968         {
22969           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
22970           break;
22971         }
22972
22973     case BFD_RELOC_NONE:
22974     case BFD_RELOC_ARM_PCREL_BRANCH:
22975     case BFD_RELOC_ARM_PCREL_BLX:
22976     case BFD_RELOC_RVA:
22977     case BFD_RELOC_THUMB_PCREL_BRANCH7:
22978     case BFD_RELOC_THUMB_PCREL_BRANCH9:
22979     case BFD_RELOC_THUMB_PCREL_BRANCH12:
22980     case BFD_RELOC_THUMB_PCREL_BRANCH20:
22981     case BFD_RELOC_THUMB_PCREL_BRANCH23:
22982     case BFD_RELOC_THUMB_PCREL_BRANCH25:
22983     case BFD_RELOC_VTABLE_ENTRY:
22984     case BFD_RELOC_VTABLE_INHERIT:
22985 #ifdef TE_PE
22986     case BFD_RELOC_32_SECREL:
22987 #endif
22988       code = fixp->fx_r_type;
22989       break;
22990
22991     case BFD_RELOC_THUMB_PCREL_BLX:
22992 #ifdef OBJ_ELF
22993       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22994         code = BFD_RELOC_THUMB_PCREL_BRANCH23;
22995       else
22996 #endif
22997         code = BFD_RELOC_THUMB_PCREL_BLX;
22998       break;
22999
23000     case BFD_RELOC_ARM_LITERAL:
23001     case BFD_RELOC_ARM_HWLITERAL:
23002       /* If this is called then the a literal has
23003          been referenced across a section boundary.  */
23004       as_bad_where (fixp->fx_file, fixp->fx_line,
23005                     _("literal referenced across section boundary"));
23006       return NULL;
23007
23008 #ifdef OBJ_ELF
23009     case BFD_RELOC_ARM_TLS_CALL:
23010     case BFD_RELOC_ARM_THM_TLS_CALL:
23011     case BFD_RELOC_ARM_TLS_DESCSEQ:
23012     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
23013     case BFD_RELOC_ARM_GOT32:
23014     case BFD_RELOC_ARM_GOTOFF:
23015     case BFD_RELOC_ARM_GOT_PREL:
23016     case BFD_RELOC_ARM_PLT32:
23017     case BFD_RELOC_ARM_TARGET1:
23018     case BFD_RELOC_ARM_ROSEGREL32:
23019     case BFD_RELOC_ARM_SBREL32:
23020     case BFD_RELOC_ARM_PREL31:
23021     case BFD_RELOC_ARM_TARGET2:
23022     case BFD_RELOC_ARM_TLS_LE32:
23023     case BFD_RELOC_ARM_TLS_LDO32:
23024     case BFD_RELOC_ARM_PCREL_CALL:
23025     case BFD_RELOC_ARM_PCREL_JUMP:
23026     case BFD_RELOC_ARM_ALU_PC_G0_NC:
23027     case BFD_RELOC_ARM_ALU_PC_G0:
23028     case BFD_RELOC_ARM_ALU_PC_G1_NC:
23029     case BFD_RELOC_ARM_ALU_PC_G1:
23030     case BFD_RELOC_ARM_ALU_PC_G2:
23031     case BFD_RELOC_ARM_LDR_PC_G0:
23032     case BFD_RELOC_ARM_LDR_PC_G1:
23033     case BFD_RELOC_ARM_LDR_PC_G2:
23034     case BFD_RELOC_ARM_LDRS_PC_G0:
23035     case BFD_RELOC_ARM_LDRS_PC_G1:
23036     case BFD_RELOC_ARM_LDRS_PC_G2:
23037     case BFD_RELOC_ARM_LDC_PC_G0:
23038     case BFD_RELOC_ARM_LDC_PC_G1:
23039     case BFD_RELOC_ARM_LDC_PC_G2:
23040     case BFD_RELOC_ARM_ALU_SB_G0_NC:
23041     case BFD_RELOC_ARM_ALU_SB_G0:
23042     case BFD_RELOC_ARM_ALU_SB_G1_NC:
23043     case BFD_RELOC_ARM_ALU_SB_G1:
23044     case BFD_RELOC_ARM_ALU_SB_G2:
23045     case BFD_RELOC_ARM_LDR_SB_G0:
23046     case BFD_RELOC_ARM_LDR_SB_G1:
23047     case BFD_RELOC_ARM_LDR_SB_G2:
23048     case BFD_RELOC_ARM_LDRS_SB_G0:
23049     case BFD_RELOC_ARM_LDRS_SB_G1:
23050     case BFD_RELOC_ARM_LDRS_SB_G2:
23051     case BFD_RELOC_ARM_LDC_SB_G0:
23052     case BFD_RELOC_ARM_LDC_SB_G1:
23053     case BFD_RELOC_ARM_LDC_SB_G2:
23054     case BFD_RELOC_ARM_V4BX:
23055       code = fixp->fx_r_type;
23056       break;
23057
23058     case BFD_RELOC_ARM_TLS_GOTDESC:
23059     case BFD_RELOC_ARM_TLS_GD32:
23060     case BFD_RELOC_ARM_TLS_IE32:
23061     case BFD_RELOC_ARM_TLS_LDM32:
23062       /* BFD will include the symbol's address in the addend.
23063          But we don't want that, so subtract it out again here.  */
23064       if (!S_IS_COMMON (fixp->fx_addsy))
23065         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
23066       code = fixp->fx_r_type;
23067       break;
23068 #endif
23069
23070     case BFD_RELOC_ARM_IMMEDIATE:
23071       as_bad_where (fixp->fx_file, fixp->fx_line,
23072                     _("internal relocation (type: IMMEDIATE) not fixed up"));
23073       return NULL;
23074
23075     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
23076       as_bad_where (fixp->fx_file, fixp->fx_line,
23077                     _("ADRL used for a symbol not defined in the same file"));
23078       return NULL;
23079
23080     case BFD_RELOC_ARM_OFFSET_IMM:
23081       if (section->use_rela_p)
23082         {
23083           code = fixp->fx_r_type;
23084           break;
23085         }
23086
23087       if (fixp->fx_addsy != NULL
23088           && !S_IS_DEFINED (fixp->fx_addsy)
23089           && S_IS_LOCAL (fixp->fx_addsy))
23090         {
23091           as_bad_where (fixp->fx_file, fixp->fx_line,
23092                         _("undefined local label `%s'"),
23093                         S_GET_NAME (fixp->fx_addsy));
23094           return NULL;
23095         }
23096
23097       as_bad_where (fixp->fx_file, fixp->fx_line,
23098                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
23099       return NULL;
23100
23101     default:
23102       {
23103         char * type;
23104
23105         switch (fixp->fx_r_type)
23106           {
23107           case BFD_RELOC_NONE:             type = "NONE";         break;
23108           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
23109           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
23110           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
23111           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
23112           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
23113           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
23114           case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
23115           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
23116           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
23117           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
23118           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
23119           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
23120           default:                         type = _("<unknown>"); break;
23121           }
23122         as_bad_where (fixp->fx_file, fixp->fx_line,
23123                       _("cannot represent %s relocation in this object file format"),
23124                       type);
23125         return NULL;
23126       }
23127     }
23128
23129 #ifdef OBJ_ELF
23130   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
23131       && GOT_symbol
23132       && fixp->fx_addsy == GOT_symbol)
23133     {
23134       code = BFD_RELOC_ARM_GOTPC;
23135       reloc->addend = fixp->fx_offset = reloc->address;
23136     }
23137 #endif
23138
23139   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
23140
23141   if (reloc->howto == NULL)
23142     {
23143       as_bad_where (fixp->fx_file, fixp->fx_line,
23144                     _("cannot represent %s relocation in this object file format"),
23145                     bfd_get_reloc_code_name (code));
23146       return NULL;
23147     }
23148
23149   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
23150      vtable entry to be used in the relocation's section offset.  */
23151   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
23152     reloc->address = fixp->fx_offset;
23153
23154   return reloc;
23155 }
23156
23157 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
23158
23159 void
23160 cons_fix_new_arm (fragS *       frag,
23161                   int           where,
23162                   int           size,
23163                   expressionS * exp,
23164                   bfd_reloc_code_real_type reloc)
23165 {
23166   int pcrel = 0;
23167
23168   /* Pick a reloc.
23169      FIXME: @@ Should look at CPU word size.  */
23170   switch (size)
23171     {
23172     case 1:
23173       reloc = BFD_RELOC_8;
23174       break;
23175     case 2:
23176       reloc = BFD_RELOC_16;
23177       break;
23178     case 4:
23179     default:
23180       reloc = BFD_RELOC_32;
23181       break;
23182     case 8:
23183       reloc = BFD_RELOC_64;
23184       break;
23185     }
23186
23187 #ifdef TE_PE
23188   if (exp->X_op == O_secrel)
23189   {
23190     exp->X_op = O_symbol;
23191     reloc = BFD_RELOC_32_SECREL;
23192   }
23193 #endif
23194
23195   fix_new_exp (frag, where, size, exp, pcrel, reloc);
23196 }
23197
23198 #if defined (OBJ_COFF)
23199 void
23200 arm_validate_fix (fixS * fixP)
23201 {
23202   /* If the destination of the branch is a defined symbol which does not have
23203      the THUMB_FUNC attribute, then we must be calling a function which has
23204      the (interfacearm) attribute.  We look for the Thumb entry point to that
23205      function and change the branch to refer to that function instead.  */
23206   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
23207       && fixP->fx_addsy != NULL
23208       && S_IS_DEFINED (fixP->fx_addsy)
23209       && ! THUMB_IS_FUNC (fixP->fx_addsy))
23210     {
23211       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
23212     }
23213 }
23214 #endif
23215
23216
23217 int
23218 arm_force_relocation (struct fix * fixp)
23219 {
23220 #if defined (OBJ_COFF) && defined (TE_PE)
23221   if (fixp->fx_r_type == BFD_RELOC_RVA)
23222     return 1;
23223 #endif
23224
23225   /* In case we have a call or a branch to a function in ARM ISA mode from
23226      a thumb function or vice-versa force the relocation. These relocations
23227      are cleared off for some cores that might have blx and simple transformations
23228      are possible.  */
23229
23230 #ifdef OBJ_ELF
23231   switch (fixp->fx_r_type)
23232     {
23233     case BFD_RELOC_ARM_PCREL_JUMP:
23234     case BFD_RELOC_ARM_PCREL_CALL:
23235     case BFD_RELOC_THUMB_PCREL_BLX:
23236       if (THUMB_IS_FUNC (fixp->fx_addsy))
23237         return 1;
23238       break;
23239
23240     case BFD_RELOC_ARM_PCREL_BLX:
23241     case BFD_RELOC_THUMB_PCREL_BRANCH25:
23242     case BFD_RELOC_THUMB_PCREL_BRANCH20:
23243     case BFD_RELOC_THUMB_PCREL_BRANCH23:
23244       if (ARM_IS_FUNC (fixp->fx_addsy))
23245         return 1;
23246       break;
23247
23248     default:
23249       break;
23250     }
23251 #endif
23252
23253   /* Resolve these relocations even if the symbol is extern or weak.
23254      Technically this is probably wrong due to symbol preemption.
23255      In practice these relocations do not have enough range to be useful
23256      at dynamic link time, and some code (e.g. in the Linux kernel)
23257      expects these references to be resolved.  */
23258   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
23259       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
23260       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
23261       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
23262       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
23263       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
23264       || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
23265       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
23266       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
23267       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
23268       || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
23269       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
23270       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
23271       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
23272     return 0;
23273
23274   /* Always leave these relocations for the linker.  */
23275   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23276        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23277       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
23278     return 1;
23279
23280   /* Always generate relocations against function symbols.  */
23281   if (fixp->fx_r_type == BFD_RELOC_32
23282       && fixp->fx_addsy
23283       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
23284     return 1;
23285
23286   return generic_force_reloc (fixp);
23287 }
23288
23289 #if defined (OBJ_ELF) || defined (OBJ_COFF)
23290 /* Relocations against function names must be left unadjusted,
23291    so that the linker can use this information to generate interworking
23292    stubs.  The MIPS version of this function
23293    also prevents relocations that are mips-16 specific, but I do not
23294    know why it does this.
23295
23296    FIXME:
23297    There is one other problem that ought to be addressed here, but
23298    which currently is not:  Taking the address of a label (rather
23299    than a function) and then later jumping to that address.  Such
23300    addresses also ought to have their bottom bit set (assuming that
23301    they reside in Thumb code), but at the moment they will not.  */
23302
23303 bfd_boolean
23304 arm_fix_adjustable (fixS * fixP)
23305 {
23306   if (fixP->fx_addsy == NULL)
23307     return 1;
23308
23309   /* Preserve relocations against symbols with function type.  */
23310   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
23311     return FALSE;
23312
23313   if (THUMB_IS_FUNC (fixP->fx_addsy)
23314       && fixP->fx_subsy == NULL)
23315     return FALSE;
23316
23317   /* We need the symbol name for the VTABLE entries.  */
23318   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
23319       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
23320     return FALSE;
23321
23322   /* Don't allow symbols to be discarded on GOT related relocs.  */
23323   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
23324       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
23325       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
23326       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
23327       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
23328       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
23329       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
23330       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
23331       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
23332       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
23333       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
23334       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
23335       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
23336       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
23337     return FALSE;
23338
23339   /* Similarly for group relocations.  */
23340   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
23341        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
23342       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
23343     return FALSE;
23344
23345   /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
23346   if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
23347       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
23348       || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
23349       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
23350       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
23351       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
23352       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
23353       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
23354     return FALSE;
23355
23356   return TRUE;
23357 }
23358 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
23359
23360 #ifdef OBJ_ELF
23361
23362 const char *
23363 elf32_arm_target_format (void)
23364 {
23365 #ifdef TE_SYMBIAN
23366   return (target_big_endian
23367           ? "elf32-bigarm-symbian"
23368           : "elf32-littlearm-symbian");
23369 #elif defined (TE_VXWORKS)
23370   return (target_big_endian
23371           ? "elf32-bigarm-vxworks"
23372           : "elf32-littlearm-vxworks");
23373 #elif defined (TE_NACL)
23374   return (target_big_endian
23375           ? "elf32-bigarm-nacl"
23376           : "elf32-littlearm-nacl");
23377 #else
23378   if (target_big_endian)
23379     return "elf32-bigarm";
23380   else
23381     return "elf32-littlearm";
23382 #endif
23383 }
23384
23385 void
23386 armelf_frob_symbol (symbolS * symp,
23387                     int *     puntp)
23388 {
23389   elf_frob_symbol (symp, puntp);
23390 }
23391 #endif
23392
23393 /* MD interface: Finalization.  */
23394
23395 void
23396 arm_cleanup (void)
23397 {
23398   literal_pool * pool;
23399
23400   /* Ensure that all the IT blocks are properly closed.  */
23401   check_it_blocks_finished ();
23402
23403   for (pool = list_of_pools; pool; pool = pool->next)
23404     {
23405       /* Put it at the end of the relevant section.  */
23406       subseg_set (pool->section, pool->sub_section);
23407 #ifdef OBJ_ELF
23408       arm_elf_change_section ();
23409 #endif
23410       s_ltorg (0);
23411     }
23412 }
23413
23414 #ifdef OBJ_ELF
23415 /* Remove any excess mapping symbols generated for alignment frags in
23416    SEC.  We may have created a mapping symbol before a zero byte
23417    alignment; remove it if there's a mapping symbol after the
23418    alignment.  */
23419 static void
23420 check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
23421                        void *dummy ATTRIBUTE_UNUSED)
23422 {
23423   segment_info_type *seginfo = seg_info (sec);
23424   fragS *fragp;
23425
23426   if (seginfo == NULL || seginfo->frchainP == NULL)
23427     return;
23428
23429   for (fragp = seginfo->frchainP->frch_root;
23430        fragp != NULL;
23431        fragp = fragp->fr_next)
23432     {
23433       symbolS *sym = fragp->tc_frag_data.last_map;
23434       fragS *next = fragp->fr_next;
23435
23436       /* Variable-sized frags have been converted to fixed size by
23437          this point.  But if this was variable-sized to start with,
23438          there will be a fixed-size frag after it.  So don't handle
23439          next == NULL.  */
23440       if (sym == NULL || next == NULL)
23441         continue;
23442
23443       if (S_GET_VALUE (sym) < next->fr_address)
23444         /* Not at the end of this frag.  */
23445         continue;
23446       know (S_GET_VALUE (sym) == next->fr_address);
23447
23448       do
23449         {
23450           if (next->tc_frag_data.first_map != NULL)
23451             {
23452               /* Next frag starts with a mapping symbol.  Discard this
23453                  one.  */
23454               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23455               break;
23456             }
23457
23458           if (next->fr_next == NULL)
23459             {
23460               /* This mapping symbol is at the end of the section.  Discard
23461                  it.  */
23462               know (next->fr_fix == 0 && next->fr_var == 0);
23463               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
23464               break;
23465             }
23466
23467           /* As long as we have empty frags without any mapping symbols,
23468              keep looking.  */
23469           /* If the next frag is non-empty and does not start with a
23470              mapping symbol, then this mapping symbol is required.  */
23471           if (next->fr_address != next->fr_next->fr_address)
23472             break;
23473
23474           next = next->fr_next;
23475         }
23476       while (next != NULL);
23477     }
23478 }
23479 #endif
23480
23481 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
23482    ARM ones.  */
23483
23484 void
23485 arm_adjust_symtab (void)
23486 {
23487 #ifdef OBJ_COFF
23488   symbolS * sym;
23489
23490   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
23491     {
23492       if (ARM_IS_THUMB (sym))
23493         {
23494           if (THUMB_IS_FUNC (sym))
23495             {
23496               /* Mark the symbol as a Thumb function.  */
23497               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
23498                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
23499                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
23500
23501               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
23502                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
23503               else
23504                 as_bad (_("%s: unexpected function type: %d"),
23505                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
23506             }
23507           else switch (S_GET_STORAGE_CLASS (sym))
23508             {
23509             case C_EXT:
23510               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
23511               break;
23512             case C_STAT:
23513               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
23514               break;
23515             case C_LABEL:
23516               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
23517               break;
23518             default:
23519               /* Do nothing.  */
23520               break;
23521             }
23522         }
23523
23524       if (ARM_IS_INTERWORK (sym))
23525         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
23526     }
23527 #endif
23528 #ifdef OBJ_ELF
23529   symbolS * sym;
23530   char      bind;
23531
23532   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
23533     {
23534       if (ARM_IS_THUMB (sym))
23535         {
23536           elf_symbol_type * elf_sym;
23537
23538           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
23539           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
23540
23541           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
23542                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
23543             {
23544               /* If it's a .thumb_func, declare it as so,
23545                  otherwise tag label as .code 16.  */
23546               if (THUMB_IS_FUNC (sym))
23547                 elf_sym->internal_elf_sym.st_target_internal
23548                   = ST_BRANCH_TO_THUMB;
23549               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
23550                 elf_sym->internal_elf_sym.st_info =
23551                   ELF_ST_INFO (bind, STT_ARM_16BIT);
23552             }
23553         }
23554     }
23555
23556   /* Remove any overlapping mapping symbols generated by alignment frags.  */
23557   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
23558   /* Now do generic ELF adjustments.  */
23559   elf_adjust_symtab ();
23560 #endif
23561 }
23562
23563 /* MD interface: Initialization.  */
23564
23565 static void
23566 set_constant_flonums (void)
23567 {
23568   int i;
23569
23570   for (i = 0; i < NUM_FLOAT_VALS; i++)
23571     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
23572       abort ();
23573 }
23574
23575 /* Auto-select Thumb mode if it's the only available instruction set for the
23576    given architecture.  */
23577
23578 static void
23579 autoselect_thumb_from_cpu_variant (void)
23580 {
23581   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
23582     opcode_select (16);
23583 }
23584
23585 void
23586 md_begin (void)
23587 {
23588   unsigned mach;
23589   unsigned int i;
23590
23591   if (   (arm_ops_hsh = hash_new ()) == NULL
23592       || (arm_cond_hsh = hash_new ()) == NULL
23593       || (arm_shift_hsh = hash_new ()) == NULL
23594       || (arm_psr_hsh = hash_new ()) == NULL
23595       || (arm_v7m_psr_hsh = hash_new ()) == NULL
23596       || (arm_reg_hsh = hash_new ()) == NULL
23597       || (arm_reloc_hsh = hash_new ()) == NULL
23598       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
23599     as_fatal (_("virtual memory exhausted"));
23600
23601   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
23602     hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
23603   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
23604     hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
23605   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
23606     hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
23607   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
23608     hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
23609   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
23610     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
23611                  (void *) (v7m_psrs + i));
23612   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
23613     hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
23614   for (i = 0;
23615        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
23616        i++)
23617     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
23618                  (void *) (barrier_opt_names + i));
23619 #ifdef OBJ_ELF
23620   for (i = 0; i < ARRAY_SIZE (reloc_names); i++)
23621     {
23622       struct reloc_entry * entry = reloc_names + i;
23623
23624       if (arm_is_eabi() && entry->reloc == BFD_RELOC_ARM_PLT32)
23625         /* This makes encode_branch() use the EABI versions of this relocation.  */
23626         entry->reloc = BFD_RELOC_UNUSED;
23627
23628       hash_insert (arm_reloc_hsh, entry->name, (void *) entry);
23629     }
23630 #endif
23631
23632   set_constant_flonums ();
23633
23634   /* Set the cpu variant based on the command-line options.  We prefer
23635      -mcpu= over -march= if both are set (as for GCC); and we prefer
23636      -mfpu= over any other way of setting the floating point unit.
23637      Use of legacy options with new options are faulted.  */
23638   if (legacy_cpu)
23639     {
23640       if (mcpu_cpu_opt || march_cpu_opt)
23641         as_bad (_("use of old and new-style options to set CPU type"));
23642
23643       mcpu_cpu_opt = legacy_cpu;
23644     }
23645   else if (!mcpu_cpu_opt)
23646     mcpu_cpu_opt = march_cpu_opt;
23647
23648   if (legacy_fpu)
23649     {
23650       if (mfpu_opt)
23651         as_bad (_("use of old and new-style options to set FPU type"));
23652
23653       mfpu_opt = legacy_fpu;
23654     }
23655   else if (!mfpu_opt)
23656     {
23657 #if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
23658         || defined (TE_NetBSD) || defined (TE_VXWORKS))
23659       /* Some environments specify a default FPU.  If they don't, infer it
23660          from the processor.  */
23661       if (mcpu_fpu_opt)
23662         mfpu_opt = mcpu_fpu_opt;
23663       else
23664         mfpu_opt = march_fpu_opt;
23665 #else
23666       mfpu_opt = &fpu_default;
23667 #endif
23668     }
23669
23670   if (!mfpu_opt)
23671     {
23672       if (mcpu_cpu_opt != NULL)
23673         mfpu_opt = &fpu_default;
23674       else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
23675         mfpu_opt = &fpu_arch_vfp_v2;
23676       else
23677         mfpu_opt = &fpu_arch_fpa;
23678     }
23679
23680 #ifdef CPU_DEFAULT
23681   if (!mcpu_cpu_opt)
23682     {
23683       mcpu_cpu_opt = &cpu_default;
23684       selected_cpu = cpu_default;
23685     }
23686 #else
23687   if (mcpu_cpu_opt)
23688     selected_cpu = *mcpu_cpu_opt;
23689   else
23690     mcpu_cpu_opt = &arm_arch_any;
23691 #endif
23692
23693   ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23694
23695   autoselect_thumb_from_cpu_variant ();
23696
23697   arm_arch_used = thumb_arch_used = arm_arch_none;
23698
23699 #if defined OBJ_COFF || defined OBJ_ELF
23700   {
23701     unsigned int flags = 0;
23702
23703 #if defined OBJ_ELF
23704     flags = meabi_flags;
23705
23706     switch (meabi_flags)
23707       {
23708       case EF_ARM_EABI_UNKNOWN:
23709 #endif
23710         /* Set the flags in the private structure.  */
23711         if (uses_apcs_26)      flags |= F_APCS26;
23712         if (support_interwork) flags |= F_INTERWORK;
23713         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
23714         if (pic_code)          flags |= F_PIC;
23715         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
23716           flags |= F_SOFT_FLOAT;
23717
23718         switch (mfloat_abi_opt)
23719           {
23720           case ARM_FLOAT_ABI_SOFT:
23721           case ARM_FLOAT_ABI_SOFTFP:
23722             flags |= F_SOFT_FLOAT;
23723             break;
23724
23725           case ARM_FLOAT_ABI_HARD:
23726             if (flags & F_SOFT_FLOAT)
23727               as_bad (_("hard-float conflicts with specified fpu"));
23728             break;
23729           }
23730
23731         /* Using pure-endian doubles (even if soft-float).      */
23732         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
23733           flags |= F_VFP_FLOAT;
23734
23735 #if defined OBJ_ELF
23736         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
23737             flags |= EF_ARM_MAVERICK_FLOAT;
23738         break;
23739
23740       case EF_ARM_EABI_VER4:
23741       case EF_ARM_EABI_VER5:
23742         /* No additional flags to set.  */
23743         break;
23744
23745       default:
23746         abort ();
23747       }
23748 #endif
23749     bfd_set_private_flags (stdoutput, flags);
23750
23751     /* We have run out flags in the COFF header to encode the
23752        status of ATPCS support, so instead we create a dummy,
23753        empty, debug section called .arm.atpcs.  */
23754     if (atpcs)
23755       {
23756         asection * sec;
23757
23758         sec = bfd_make_section (stdoutput, ".arm.atpcs");
23759
23760         if (sec != NULL)
23761           {
23762             bfd_set_section_flags
23763               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
23764             bfd_set_section_size (stdoutput, sec, 0);
23765             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
23766           }
23767       }
23768   }
23769 #endif
23770
23771   /* Record the CPU type as well.  */
23772   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
23773     mach = bfd_mach_arm_iWMMXt2;
23774   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
23775     mach = bfd_mach_arm_iWMMXt;
23776   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
23777     mach = bfd_mach_arm_XScale;
23778   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
23779     mach = bfd_mach_arm_ep9312;
23780   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
23781     mach = bfd_mach_arm_5TE;
23782   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
23783     {
23784       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
23785         mach = bfd_mach_arm_5T;
23786       else
23787         mach = bfd_mach_arm_5;
23788     }
23789   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
23790     {
23791       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
23792         mach = bfd_mach_arm_4T;
23793       else
23794         mach = bfd_mach_arm_4;
23795     }
23796   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
23797     mach = bfd_mach_arm_3M;
23798   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
23799     mach = bfd_mach_arm_3;
23800   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
23801     mach = bfd_mach_arm_2a;
23802   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
23803     mach = bfd_mach_arm_2;
23804   else
23805     mach = bfd_mach_arm_unknown;
23806
23807   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
23808 }
23809
23810 /* Command line processing.  */
23811
23812 /* md_parse_option
23813       Invocation line includes a switch not recognized by the base assembler.
23814       See if it's a processor-specific option.
23815
23816       This routine is somewhat complicated by the need for backwards
23817       compatibility (since older releases of gcc can't be changed).
23818       The new options try to make the interface as compatible as
23819       possible with GCC.
23820
23821       New options (supported) are:
23822
23823               -mcpu=<cpu name>           Assemble for selected processor
23824               -march=<architecture name> Assemble for selected architecture
23825               -mfpu=<fpu architecture>   Assemble for selected FPU.
23826               -EB/-mbig-endian           Big-endian
23827               -EL/-mlittle-endian        Little-endian
23828               -k                         Generate PIC code
23829               -mthumb                    Start in Thumb mode
23830               -mthumb-interwork          Code supports ARM/Thumb interworking
23831
23832               -m[no-]warn-deprecated     Warn about deprecated features
23833
23834       For now we will also provide support for:
23835
23836               -mapcs-32                  32-bit Program counter
23837               -mapcs-26                  26-bit Program counter
23838               -macps-float               Floats passed in FP registers
23839               -mapcs-reentrant           Reentrant code
23840               -matpcs
23841       (sometime these will probably be replaced with -mapcs=<list of options>
23842       and -matpcs=<list of options>)
23843
23844       The remaining options are only supported for back-wards compatibility.
23845       Cpu variants, the arm part is optional:
23846               -m[arm]1                Currently not supported.
23847               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
23848               -m[arm]3                Arm 3 processor
23849               -m[arm]6[xx],           Arm 6 processors
23850               -m[arm]7[xx][t][[d]m]   Arm 7 processors
23851               -m[arm]8[10]            Arm 8 processors
23852               -m[arm]9[20][tdmi]      Arm 9 processors
23853               -mstrongarm[110[0]]     StrongARM processors
23854               -mxscale                XScale processors
23855               -m[arm]v[2345[t[e]]]    Arm architectures
23856               -mall                   All (except the ARM1)
23857       FP variants:
23858               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
23859               -mfpe-old               (No float load/store multiples)
23860               -mvfpxd                 VFP Single precision
23861               -mvfp                   All VFP
23862               -mno-fpu                Disable all floating point instructions
23863
23864       The following CPU names are recognized:
23865               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
23866               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
23867               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
23868               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
23869               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
23870               arm10t arm10e, arm1020t, arm1020e, arm10200e,
23871               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
23872
23873       */
23874
23875 const char * md_shortopts = "m:k";
23876
23877 #ifdef ARM_BI_ENDIAN
23878 #define OPTION_EB (OPTION_MD_BASE + 0)
23879 #define OPTION_EL (OPTION_MD_BASE + 1)
23880 #else
23881 #if TARGET_BYTES_BIG_ENDIAN
23882 #define OPTION_EB (OPTION_MD_BASE + 0)
23883 #else
23884 #define OPTION_EL (OPTION_MD_BASE + 1)
23885 #endif
23886 #endif
23887 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
23888
23889 struct option md_longopts[] =
23890 {
23891 #ifdef OPTION_EB
23892   {"EB", no_argument, NULL, OPTION_EB},
23893 #endif
23894 #ifdef OPTION_EL
23895   {"EL", no_argument, NULL, OPTION_EL},
23896 #endif
23897   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
23898   {NULL, no_argument, NULL, 0}
23899 };
23900
23901 size_t md_longopts_size = sizeof (md_longopts);
23902
23903 struct arm_option_table
23904 {
23905   char *option;         /* Option name to match.  */
23906   char *help;           /* Help information.  */
23907   int  *var;            /* Variable to change.  */
23908   int   value;          /* What to change it to.  */
23909   char *deprecated;     /* If non-null, print this message.  */
23910 };
23911
23912 struct arm_option_table arm_opts[] =
23913 {
23914   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
23915   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
23916   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
23917    &support_interwork, 1, NULL},
23918   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
23919   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
23920   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
23921    1, NULL},
23922   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
23923   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
23924   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
23925   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
23926    NULL},
23927
23928   /* These are recognized by the assembler, but have no affect on code.  */
23929   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
23930   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
23931
23932   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
23933   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
23934    &warn_on_deprecated, 0, NULL},
23935   {NULL, NULL, NULL, 0, NULL}
23936 };
23937
23938 struct arm_legacy_option_table
23939 {
23940   char *option;                         /* Option name to match.  */
23941   const arm_feature_set **var;          /* Variable to change.  */
23942   const arm_feature_set value;          /* What to change it to.  */
23943   char *deprecated;                     /* If non-null, print this message.  */
23944 };
23945
23946 const struct arm_legacy_option_table arm_legacy_opts[] =
23947 {
23948   /* DON'T add any new processors to this list -- we want the whole list
23949      to go away...  Add them to the processors table instead.  */
23950   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
23951   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
23952   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
23953   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
23954   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23955   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23956   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23957   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23958   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
23959   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
23960   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
23961   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
23962   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
23963   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
23964   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
23965   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
23966   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
23967   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
23968   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
23969   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
23970   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
23971   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
23972   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
23973   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
23974   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
23975   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
23976   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
23977   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
23978   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
23979   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
23980   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
23981   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
23982   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
23983   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
23984   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23985   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23986   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23987   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23988   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23989   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23990   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
23991   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
23992   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
23993   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
23994   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
23995   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
23996   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23997   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23998   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23999   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
24000   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
24001   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
24002   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
24003   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
24004   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
24005   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
24006   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
24007   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
24008   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
24009   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
24010   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
24011   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
24012   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
24013   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
24014   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
24015   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
24016   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
24017   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
24018   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
24019   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
24020    N_("use -mcpu=strongarm110")},
24021   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
24022    N_("use -mcpu=strongarm1100")},
24023   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
24024    N_("use -mcpu=strongarm1110")},
24025   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
24026   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
24027   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
24028
24029   /* Architecture variants -- don't add any more to this list either.  */
24030   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
24031   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
24032   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
24033   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
24034   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
24035   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
24036   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
24037   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
24038   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
24039   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
24040   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
24041   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
24042   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
24043   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
24044   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
24045   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
24046   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
24047   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
24048
24049   /* Floating point variants -- don't add any more to this list either.  */
24050   {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
24051   {"mfpa10",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
24052   {"mfpa11",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
24053   {"mno-fpu",  &legacy_fpu, ARM_ARCH_NONE,
24054    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
24055
24056   {NULL, NULL, ARM_ARCH_NONE, NULL}
24057 };
24058
24059 struct arm_cpu_option_table
24060 {
24061   char *name;
24062   size_t name_len;
24063   const arm_feature_set value;
24064   /* For some CPUs we assume an FPU unless the user explicitly sets
24065      -mfpu=...  */
24066   const arm_feature_set default_fpu;
24067   /* The canonical name of the CPU, or NULL to use NAME converted to upper
24068      case.  */
24069   const char *canonical_name;
24070 };
24071
24072 /* This list should, at a minimum, contain all the cpu names
24073    recognized by GCC.  */
24074 #define ARM_CPU_OPT(N, V, DF, CN) { N, sizeof (N) - 1, V, DF, CN }
24075 static const struct arm_cpu_option_table arm_cpus[] =
24076 {
24077   ARM_CPU_OPT ("all",           ARM_ANY,         FPU_ARCH_FPA,    NULL),
24078   ARM_CPU_OPT ("arm1",          ARM_ARCH_V1,     FPU_ARCH_FPA,    NULL),
24079   ARM_CPU_OPT ("arm2",          ARM_ARCH_V2,     FPU_ARCH_FPA,    NULL),
24080   ARM_CPU_OPT ("arm250",        ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
24081   ARM_CPU_OPT ("arm3",          ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
24082   ARM_CPU_OPT ("arm6",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24083   ARM_CPU_OPT ("arm60",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24084   ARM_CPU_OPT ("arm600",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24085   ARM_CPU_OPT ("arm610",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24086   ARM_CPU_OPT ("arm620",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24087   ARM_CPU_OPT ("arm7",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24088   ARM_CPU_OPT ("arm7m",         ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
24089   ARM_CPU_OPT ("arm7d",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24090   ARM_CPU_OPT ("arm7dm",        ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
24091   ARM_CPU_OPT ("arm7di",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24092   ARM_CPU_OPT ("arm7dmi",       ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
24093   ARM_CPU_OPT ("arm70",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24094   ARM_CPU_OPT ("arm700",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24095   ARM_CPU_OPT ("arm700i",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24096   ARM_CPU_OPT ("arm710",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24097   ARM_CPU_OPT ("arm710t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24098   ARM_CPU_OPT ("arm720",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24099   ARM_CPU_OPT ("arm720t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24100   ARM_CPU_OPT ("arm740t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24101   ARM_CPU_OPT ("arm710c",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24102   ARM_CPU_OPT ("arm7100",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24103   ARM_CPU_OPT ("arm7500",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24104   ARM_CPU_OPT ("arm7500fe",     ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
24105   ARM_CPU_OPT ("arm7t",         ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24106   ARM_CPU_OPT ("arm7tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24107   ARM_CPU_OPT ("arm7tdmi-s",    ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24108   ARM_CPU_OPT ("arm8",          ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24109   ARM_CPU_OPT ("arm810",        ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24110   ARM_CPU_OPT ("strongarm",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24111   ARM_CPU_OPT ("strongarm1",    ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24112   ARM_CPU_OPT ("strongarm110",  ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24113   ARM_CPU_OPT ("strongarm1100", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24114   ARM_CPU_OPT ("strongarm1110", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24115   ARM_CPU_OPT ("arm9",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24116   ARM_CPU_OPT ("arm920",        ARM_ARCH_V4T,    FPU_ARCH_FPA,    "ARM920T"),
24117   ARM_CPU_OPT ("arm920t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24118   ARM_CPU_OPT ("arm922t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24119   ARM_CPU_OPT ("arm940t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24120   ARM_CPU_OPT ("arm9tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
24121   ARM_CPU_OPT ("fa526",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24122   ARM_CPU_OPT ("fa626",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
24123   /* For V5 or later processors we default to using VFP; but the user
24124      should really set the FPU type explicitly.  */
24125   ARM_CPU_OPT ("arm9e-r0",      ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
24126   ARM_CPU_OPT ("arm9e",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24127   ARM_CPU_OPT ("arm926ej",      ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
24128   ARM_CPU_OPT ("arm926ejs",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
24129   ARM_CPU_OPT ("arm926ej-s",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
24130   ARM_CPU_OPT ("arm946e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
24131   ARM_CPU_OPT ("arm946e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM946E-S"),
24132   ARM_CPU_OPT ("arm946e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24133   ARM_CPU_OPT ("arm966e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
24134   ARM_CPU_OPT ("arm966e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM966E-S"),
24135   ARM_CPU_OPT ("arm966e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24136   ARM_CPU_OPT ("arm968e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24137   ARM_CPU_OPT ("arm10t",        ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
24138   ARM_CPU_OPT ("arm10tdmi",     ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
24139   ARM_CPU_OPT ("arm10e",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24140   ARM_CPU_OPT ("arm1020",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM1020E"),
24141   ARM_CPU_OPT ("arm1020t",      ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
24142   ARM_CPU_OPT ("arm1020e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24143   ARM_CPU_OPT ("arm1022e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24144   ARM_CPU_OPT ("arm1026ejs",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2,
24145                                                                  "ARM1026EJ-S"),
24146   ARM_CPU_OPT ("arm1026ej-s",   ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
24147   ARM_CPU_OPT ("fa606te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24148   ARM_CPU_OPT ("fa616te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24149   ARM_CPU_OPT ("fa626te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24150   ARM_CPU_OPT ("fmp626",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24151   ARM_CPU_OPT ("fa726te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
24152   ARM_CPU_OPT ("arm1136js",     ARM_ARCH_V6,     FPU_NONE,        "ARM1136J-S"),
24153   ARM_CPU_OPT ("arm1136j-s",    ARM_ARCH_V6,     FPU_NONE,        NULL),
24154   ARM_CPU_OPT ("arm1136jfs",    ARM_ARCH_V6,     FPU_ARCH_VFP_V2,
24155                                                                  "ARM1136JF-S"),
24156   ARM_CPU_OPT ("arm1136jf-s",   ARM_ARCH_V6,     FPU_ARCH_VFP_V2, NULL),
24157   ARM_CPU_OPT ("mpcore",        ARM_ARCH_V6K,    FPU_ARCH_VFP_V2, "MPCore"),
24158   ARM_CPU_OPT ("mpcorenovfp",   ARM_ARCH_V6K,    FPU_NONE,        "MPCore"),
24159   ARM_CPU_OPT ("arm1156t2-s",   ARM_ARCH_V6T2,   FPU_NONE,        NULL),
24160   ARM_CPU_OPT ("arm1156t2f-s",  ARM_ARCH_V6T2,   FPU_ARCH_VFP_V2, NULL),
24161   ARM_CPU_OPT ("arm1176jz-s",   ARM_ARCH_V6ZK,   FPU_NONE,        NULL),
24162   ARM_CPU_OPT ("arm1176jzf-s",  ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2, NULL),
24163   ARM_CPU_OPT ("cortex-a5",     ARM_ARCH_V7A_MP_SEC,
24164                                                  FPU_NONE,        "Cortex-A5"),
24165   ARM_CPU_OPT ("cortex-a7",     ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24166                                                                   "Cortex-A7"),
24167   ARM_CPU_OPT ("cortex-a8",     ARM_ARCH_V7A_SEC,
24168                                                  ARM_FEATURE (0, FPU_VFP_V3
24169                                                         | FPU_NEON_EXT_V1),
24170                                                                   "Cortex-A8"),
24171   ARM_CPU_OPT ("cortex-a9",     ARM_ARCH_V7A_MP_SEC,
24172                                                  ARM_FEATURE (0, FPU_VFP_V3
24173                                                         | FPU_NEON_EXT_V1),
24174                                                                   "Cortex-A9"),
24175   ARM_CPU_OPT ("cortex-a12",    ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24176                                                                   "Cortex-A12"),
24177   ARM_CPU_OPT ("cortex-a15",    ARM_ARCH_V7VE,   FPU_ARCH_NEON_VFP_V4,
24178                                                                   "Cortex-A15"),
24179   ARM_CPU_OPT ("cortex-a53",    ARM_ARCH_V8A,    FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24180                                                                   "Cortex-A53"),
24181   ARM_CPU_OPT ("cortex-a57",    ARM_ARCH_V8A,    FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24182                                                                   "Cortex-A57"),
24183   ARM_CPU_OPT ("cortex-r4",     ARM_ARCH_V7R,    FPU_NONE,        "Cortex-R4"),
24184   ARM_CPU_OPT ("cortex-r4f",    ARM_ARCH_V7R,    FPU_ARCH_VFP_V3D16,
24185                                                                   "Cortex-R4F"),
24186   ARM_CPU_OPT ("cortex-r5",     ARM_ARCH_V7R_IDIV,
24187                                                  FPU_NONE,        "Cortex-R5"),
24188   ARM_CPU_OPT ("cortex-r7",     ARM_ARCH_V7R_IDIV,
24189                                                  FPU_ARCH_VFP_V3D16,
24190                                                                   "Cortex-R7"),
24191   ARM_CPU_OPT ("cortex-m4",     ARM_ARCH_V7EM,   FPU_NONE,        "Cortex-M4"),
24192   ARM_CPU_OPT ("cortex-m3",     ARM_ARCH_V7M,    FPU_NONE,        "Cortex-M3"),
24193   ARM_CPU_OPT ("cortex-m1",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M1"),
24194   ARM_CPU_OPT ("cortex-m0",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0"),
24195   ARM_CPU_OPT ("cortex-m0plus", ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0+"),
24196   /* ??? XSCALE is really an architecture.  */
24197   ARM_CPU_OPT ("xscale",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
24198   /* ??? iwmmxt is not a processor.  */
24199   ARM_CPU_OPT ("iwmmxt",        ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL),
24200   ARM_CPU_OPT ("iwmmxt2",       ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL),
24201   ARM_CPU_OPT ("i80200",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
24202   /* Maverick */
24203   ARM_CPU_OPT ("ep9312",        ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK),
24204                                                  FPU_ARCH_MAVERICK, "ARM920T"),
24205   /* Marvell processors.  */
24206   ARM_CPU_OPT ("marvell-pj4",   ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC, 0),
24207                                                 FPU_ARCH_VFP_V3D16, NULL),
24208
24209   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
24210 };
24211 #undef ARM_CPU_OPT
24212
24213 struct arm_arch_option_table
24214 {
24215   char *name;
24216   size_t name_len;
24217   const arm_feature_set value;
24218   const arm_feature_set default_fpu;
24219 };
24220
24221 /* This list should, at a minimum, contain all the architecture names
24222    recognized by GCC.  */
24223 #define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF }
24224 static const struct arm_arch_option_table arm_archs[] =
24225 {
24226   ARM_ARCH_OPT ("all",          ARM_ANY,         FPU_ARCH_FPA),
24227   ARM_ARCH_OPT ("armv1",        ARM_ARCH_V1,     FPU_ARCH_FPA),
24228   ARM_ARCH_OPT ("armv2",        ARM_ARCH_V2,     FPU_ARCH_FPA),
24229   ARM_ARCH_OPT ("armv2a",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
24230   ARM_ARCH_OPT ("armv2s",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
24231   ARM_ARCH_OPT ("armv3",        ARM_ARCH_V3,     FPU_ARCH_FPA),
24232   ARM_ARCH_OPT ("armv3m",       ARM_ARCH_V3M,    FPU_ARCH_FPA),
24233   ARM_ARCH_OPT ("armv4",        ARM_ARCH_V4,     FPU_ARCH_FPA),
24234   ARM_ARCH_OPT ("armv4xm",      ARM_ARCH_V4xM,   FPU_ARCH_FPA),
24235   ARM_ARCH_OPT ("armv4t",       ARM_ARCH_V4T,    FPU_ARCH_FPA),
24236   ARM_ARCH_OPT ("armv4txm",     ARM_ARCH_V4TxM,  FPU_ARCH_FPA),
24237   ARM_ARCH_OPT ("armv5",        ARM_ARCH_V5,     FPU_ARCH_VFP),
24238   ARM_ARCH_OPT ("armv5t",       ARM_ARCH_V5T,    FPU_ARCH_VFP),
24239   ARM_ARCH_OPT ("armv5txm",     ARM_ARCH_V5TxM,  FPU_ARCH_VFP),
24240   ARM_ARCH_OPT ("armv5te",      ARM_ARCH_V5TE,   FPU_ARCH_VFP),
24241   ARM_ARCH_OPT ("armv5texp",    ARM_ARCH_V5TExP, FPU_ARCH_VFP),
24242   ARM_ARCH_OPT ("armv5tej",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP),
24243   ARM_ARCH_OPT ("armv6",        ARM_ARCH_V6,     FPU_ARCH_VFP),
24244   ARM_ARCH_OPT ("armv6j",       ARM_ARCH_V6,     FPU_ARCH_VFP),
24245   ARM_ARCH_OPT ("armv6k",       ARM_ARCH_V6K,    FPU_ARCH_VFP),
24246   ARM_ARCH_OPT ("armv6z",       ARM_ARCH_V6Z,    FPU_ARCH_VFP),
24247   ARM_ARCH_OPT ("armv6zk",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP),
24248   ARM_ARCH_OPT ("armv6t2",      ARM_ARCH_V6T2,   FPU_ARCH_VFP),
24249   ARM_ARCH_OPT ("armv6kt2",     ARM_ARCH_V6KT2,  FPU_ARCH_VFP),
24250   ARM_ARCH_OPT ("armv6zt2",     ARM_ARCH_V6ZT2,  FPU_ARCH_VFP),
24251   ARM_ARCH_OPT ("armv6zkt2",    ARM_ARCH_V6ZKT2, FPU_ARCH_VFP),
24252   ARM_ARCH_OPT ("armv6-m",      ARM_ARCH_V6M,    FPU_ARCH_VFP),
24253   ARM_ARCH_OPT ("armv6s-m",     ARM_ARCH_V6SM,   FPU_ARCH_VFP),
24254   ARM_ARCH_OPT ("armv7",        ARM_ARCH_V7,     FPU_ARCH_VFP),
24255   /* The official spelling of the ARMv7 profile variants is the dashed form.
24256      Accept the non-dashed form for compatibility with old toolchains.  */
24257   ARM_ARCH_OPT ("armv7a",       ARM_ARCH_V7A,    FPU_ARCH_VFP),
24258   ARM_ARCH_OPT ("armv7ve",      ARM_ARCH_V7VE,   FPU_ARCH_VFP),
24259   ARM_ARCH_OPT ("armv7r",       ARM_ARCH_V7R,    FPU_ARCH_VFP),
24260   ARM_ARCH_OPT ("armv7m",       ARM_ARCH_V7M,    FPU_ARCH_VFP),
24261   ARM_ARCH_OPT ("armv7-a",      ARM_ARCH_V7A,    FPU_ARCH_VFP),
24262   ARM_ARCH_OPT ("armv7-r",      ARM_ARCH_V7R,    FPU_ARCH_VFP),
24263   ARM_ARCH_OPT ("armv7-m",      ARM_ARCH_V7M,    FPU_ARCH_VFP),
24264   ARM_ARCH_OPT ("armv7e-m",     ARM_ARCH_V7EM,   FPU_ARCH_VFP),
24265   ARM_ARCH_OPT ("armv8-a",      ARM_ARCH_V8A,    FPU_ARCH_VFP),
24266   ARM_ARCH_OPT ("xscale",       ARM_ARCH_XSCALE, FPU_ARCH_VFP),
24267   ARM_ARCH_OPT ("iwmmxt",       ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
24268   ARM_ARCH_OPT ("iwmmxt2",      ARM_ARCH_IWMMXT2,FPU_ARCH_VFP),
24269   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
24270 };
24271 #undef ARM_ARCH_OPT
24272
24273 /* ISA extensions in the co-processor and main instruction set space.  */
24274 struct arm_option_extension_value_table
24275 {
24276   char *name;
24277   size_t name_len;
24278   const arm_feature_set value;
24279   const arm_feature_set allowed_archs;
24280 };
24281
24282 /* The following table must be in alphabetical order with a NULL last entry.
24283    */
24284 #define ARM_EXT_OPT(N, V, AA) { N, sizeof (N) - 1, V, AA }
24285 static const struct arm_option_extension_value_table arm_extensions[] =
24286 {
24287   ARM_EXT_OPT ("crc",  ARCH_CRC_ARMV8, ARM_FEATURE (ARM_EXT_V8, 0)),
24288   ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
24289                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24290   ARM_EXT_OPT ("fp",     FPU_ARCH_VFP_ARMV8,
24291                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24292   ARM_EXT_OPT ("idiv",  ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
24293                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
24294   ARM_EXT_OPT ("iwmmxt",ARM_FEATURE (0, ARM_CEXT_IWMMXT),       ARM_ANY),
24295   ARM_EXT_OPT ("iwmmxt2",
24296                         ARM_FEATURE (0, ARM_CEXT_IWMMXT2),      ARM_ANY),
24297   ARM_EXT_OPT ("maverick",
24298                         ARM_FEATURE (0, ARM_CEXT_MAVERICK),     ARM_ANY),
24299   ARM_EXT_OPT ("mp",    ARM_FEATURE (ARM_EXT_MP, 0),
24300                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
24301   ARM_EXT_OPT ("simd",   FPU_ARCH_NEON_VFP_ARMV8,
24302                                    ARM_FEATURE (ARM_EXT_V8, 0)),
24303   ARM_EXT_OPT ("os",    ARM_FEATURE (ARM_EXT_OS, 0),
24304                                    ARM_FEATURE (ARM_EXT_V6M, 0)),
24305   ARM_EXT_OPT ("sec",   ARM_FEATURE (ARM_EXT_SEC, 0),
24306                                    ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)),
24307   ARM_EXT_OPT ("virt",  ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV
24308                                      | ARM_EXT_DIV, 0),
24309                                    ARM_FEATURE (ARM_EXT_V7A, 0)),
24310   ARM_EXT_OPT ("xscale",ARM_FEATURE (0, ARM_CEXT_XSCALE),       ARM_ANY),
24311   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
24312 };
24313 #undef ARM_EXT_OPT
24314
24315 /* ISA floating-point and Advanced SIMD extensions.  */
24316 struct arm_option_fpu_value_table
24317 {
24318   char *name;
24319   const arm_feature_set value;
24320 };
24321
24322 /* This list should, at a minimum, contain all the fpu names
24323    recognized by GCC.  */
24324 static const struct arm_option_fpu_value_table arm_fpus[] =
24325 {
24326   {"softfpa",           FPU_NONE},
24327   {"fpe",               FPU_ARCH_FPE},
24328   {"fpe2",              FPU_ARCH_FPE},
24329   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
24330   {"fpa",               FPU_ARCH_FPA},
24331   {"fpa10",             FPU_ARCH_FPA},
24332   {"fpa11",             FPU_ARCH_FPA},
24333   {"arm7500fe",         FPU_ARCH_FPA},
24334   {"softvfp",           FPU_ARCH_VFP},
24335   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
24336   {"vfp",               FPU_ARCH_VFP_V2},
24337   {"vfp9",              FPU_ARCH_VFP_V2},
24338   {"vfp3",              FPU_ARCH_VFP_V3}, /* For backwards compatbility.  */
24339   {"vfp10",             FPU_ARCH_VFP_V2},
24340   {"vfp10-r0",          FPU_ARCH_VFP_V1},
24341   {"vfpxd",             FPU_ARCH_VFP_V1xD},
24342   {"vfpv2",             FPU_ARCH_VFP_V2},
24343   {"vfpv3",             FPU_ARCH_VFP_V3},
24344   {"vfpv3-fp16",        FPU_ARCH_VFP_V3_FP16},
24345   {"vfpv3-d16",         FPU_ARCH_VFP_V3D16},
24346   {"vfpv3-d16-fp16",    FPU_ARCH_VFP_V3D16_FP16},
24347   {"vfpv3xd",           FPU_ARCH_VFP_V3xD},
24348   {"vfpv3xd-fp16",      FPU_ARCH_VFP_V3xD_FP16},
24349   {"arm1020t",          FPU_ARCH_VFP_V1},
24350   {"arm1020e",          FPU_ARCH_VFP_V2},
24351   {"arm1136jfs",        FPU_ARCH_VFP_V2},
24352   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
24353   {"maverick",          FPU_ARCH_MAVERICK},
24354   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
24355   {"neon-fp16",         FPU_ARCH_NEON_FP16},
24356   {"vfpv4",             FPU_ARCH_VFP_V4},
24357   {"vfpv4-d16",         FPU_ARCH_VFP_V4D16},
24358   {"fpv4-sp-d16",       FPU_ARCH_VFP_V4_SP_D16},
24359   {"neon-vfpv4",        FPU_ARCH_NEON_VFP_V4},
24360   {"fp-armv8",          FPU_ARCH_VFP_ARMV8},
24361   {"neon-fp-armv8",     FPU_ARCH_NEON_VFP_ARMV8},
24362   {"crypto-neon-fp-armv8",
24363                         FPU_ARCH_CRYPTO_NEON_VFP_ARMV8},
24364   {NULL,                ARM_ARCH_NONE}
24365 };
24366
24367 struct arm_option_value_table
24368 {
24369   char *name;
24370   long value;
24371 };
24372
24373 static const struct arm_option_value_table arm_float_abis[] =
24374 {
24375   {"hard",      ARM_FLOAT_ABI_HARD},
24376   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
24377   {"soft",      ARM_FLOAT_ABI_SOFT},
24378   {NULL,        0}
24379 };
24380
24381 #ifdef OBJ_ELF
24382 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
24383 static const struct arm_option_value_table arm_eabis[] =
24384 {
24385   {"gnu",       EF_ARM_EABI_UNKNOWN},
24386   {"4",         EF_ARM_EABI_VER4},
24387   {"5",         EF_ARM_EABI_VER5},
24388   {NULL,        0}
24389 };
24390 #endif
24391
24392 struct arm_long_option_table
24393 {
24394   char * option;                /* Substring to match.  */
24395   char * help;                  /* Help information.  */
24396   int (* func) (char * subopt); /* Function to decode sub-option.  */
24397   char * deprecated;            /* If non-null, print this message.  */
24398 };
24399
24400 static bfd_boolean
24401 arm_parse_extension (char *str, const arm_feature_set **opt_p)
24402 {
24403   arm_feature_set *ext_set = (arm_feature_set *)
24404       xmalloc (sizeof (arm_feature_set));
24405
24406   /* We insist on extensions being specified in alphabetical order, and with
24407      extensions being added before being removed.  We achieve this by having
24408      the global ARM_EXTENSIONS table in alphabetical order, and using the
24409      ADDING_VALUE variable to indicate whether we are adding an extension (1)
24410      or removing it (0) and only allowing it to change in the order
24411      -1 -> 1 -> 0.  */
24412   const struct arm_option_extension_value_table * opt = NULL;
24413   int adding_value = -1;
24414
24415   /* Copy the feature set, so that we can modify it.  */
24416   *ext_set = **opt_p;
24417   *opt_p = ext_set;
24418
24419   while (str != NULL && *str != 0)
24420     {
24421       char *ext;
24422       size_t len;
24423
24424       if (*str != '+')
24425         {
24426           as_bad (_("invalid architectural extension"));
24427           return FALSE;
24428         }
24429
24430       str++;
24431       ext = strchr (str, '+');
24432
24433       if (ext != NULL)
24434         len = ext - str;
24435       else
24436         len = strlen (str);
24437
24438       if (len >= 2 && strncmp (str, "no", 2) == 0)
24439         {
24440           if (adding_value != 0)
24441             {
24442               adding_value = 0;
24443               opt = arm_extensions;
24444             }
24445
24446           len -= 2;
24447           str += 2;
24448         }
24449       else if (len > 0)
24450         {
24451           if (adding_value == -1)
24452             {
24453               adding_value = 1;
24454               opt = arm_extensions;
24455             }
24456           else if (adding_value != 1)
24457             {
24458               as_bad (_("must specify extensions to add before specifying "
24459                         "those to remove"));
24460               return FALSE;
24461             }
24462         }
24463
24464       if (len == 0)
24465         {
24466           as_bad (_("missing architectural extension"));
24467           return FALSE;
24468         }
24469
24470       gas_assert (adding_value != -1);
24471       gas_assert (opt != NULL);
24472
24473       /* Scan over the options table trying to find an exact match. */
24474       for (; opt->name != NULL; opt++)
24475         if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24476           {
24477             /* Check we can apply the extension to this architecture.  */
24478             if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
24479               {
24480                 as_bad (_("extension does not apply to the base architecture"));
24481                 return FALSE;
24482               }
24483
24484             /* Add or remove the extension.  */
24485             if (adding_value)
24486               ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
24487             else
24488               ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
24489
24490             break;
24491           }
24492
24493       if (opt->name == NULL)
24494         {
24495           /* Did we fail to find an extension because it wasn't specified in
24496              alphabetical order, or because it does not exist?  */
24497
24498           for (opt = arm_extensions; opt->name != NULL; opt++)
24499             if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24500               break;
24501
24502           if (opt->name == NULL)
24503             as_bad (_("unknown architectural extension `%s'"), str);
24504           else
24505             as_bad (_("architectural extensions must be specified in "
24506                       "alphabetical order"));
24507
24508           return FALSE;
24509         }
24510       else
24511         {
24512           /* We should skip the extension we've just matched the next time
24513              round.  */
24514           opt++;
24515         }
24516
24517       str = ext;
24518     };
24519
24520   return TRUE;
24521 }
24522
24523 static bfd_boolean
24524 arm_parse_cpu (char *str)
24525 {
24526   const struct arm_cpu_option_table *opt;
24527   char *ext = strchr (str, '+');
24528   size_t len;
24529
24530   if (ext != NULL)
24531     len = ext - str;
24532   else
24533     len = strlen (str);
24534
24535   if (len == 0)
24536     {
24537       as_bad (_("missing cpu name `%s'"), str);
24538       return FALSE;
24539     }
24540
24541   for (opt = arm_cpus; opt->name != NULL; opt++)
24542     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24543       {
24544         mcpu_cpu_opt = &opt->value;
24545         mcpu_fpu_opt = &opt->default_fpu;
24546         if (opt->canonical_name)
24547           strcpy (selected_cpu_name, opt->canonical_name);
24548         else
24549           {
24550             size_t i;
24551
24552             for (i = 0; i < len; i++)
24553               selected_cpu_name[i] = TOUPPER (opt->name[i]);
24554             selected_cpu_name[i] = 0;
24555           }
24556
24557         if (ext != NULL)
24558           return arm_parse_extension (ext, &mcpu_cpu_opt);
24559
24560         return TRUE;
24561       }
24562
24563   as_bad (_("unknown cpu `%s'"), str);
24564   return FALSE;
24565 }
24566
24567 static bfd_boolean
24568 arm_parse_arch (char *str)
24569 {
24570   const struct arm_arch_option_table *opt;
24571   char *ext = strchr (str, '+');
24572   size_t len;
24573
24574   if (ext != NULL)
24575     len = ext - str;
24576   else
24577     len = strlen (str);
24578
24579   if (len == 0)
24580     {
24581       as_bad (_("missing architecture name `%s'"), str);
24582       return FALSE;
24583     }
24584
24585   for (opt = arm_archs; opt->name != NULL; opt++)
24586     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
24587       {
24588         march_cpu_opt = &opt->value;
24589         march_fpu_opt = &opt->default_fpu;
24590         strcpy (selected_cpu_name, opt->name);
24591
24592         if (ext != NULL)
24593           return arm_parse_extension (ext, &march_cpu_opt);
24594
24595         return TRUE;
24596       }
24597
24598   as_bad (_("unknown architecture `%s'\n"), str);
24599   return FALSE;
24600 }
24601
24602 static bfd_boolean
24603 arm_parse_fpu (char * str)
24604 {
24605   const struct arm_option_fpu_value_table * opt;
24606
24607   for (opt = arm_fpus; opt->name != NULL; opt++)
24608     if (streq (opt->name, str))
24609       {
24610         mfpu_opt = &opt->value;
24611         return TRUE;
24612       }
24613
24614   as_bad (_("unknown floating point format `%s'\n"), str);
24615   return FALSE;
24616 }
24617
24618 static bfd_boolean
24619 arm_parse_float_abi (char * str)
24620 {
24621   const struct arm_option_value_table * opt;
24622
24623   for (opt = arm_float_abis; opt->name != NULL; opt++)
24624     if (streq (opt->name, str))
24625       {
24626         mfloat_abi_opt = opt->value;
24627         return TRUE;
24628       }
24629
24630   as_bad (_("unknown floating point abi `%s'\n"), str);
24631   return FALSE;
24632 }
24633
24634 #ifdef OBJ_ELF
24635 static bfd_boolean
24636 arm_parse_eabi (char * str)
24637 {
24638   const struct arm_option_value_table *opt;
24639
24640   for (opt = arm_eabis; opt->name != NULL; opt++)
24641     if (streq (opt->name, str))
24642       {
24643         meabi_flags = opt->value;
24644         return TRUE;
24645       }
24646   as_bad (_("unknown EABI `%s'\n"), str);
24647   return FALSE;
24648 }
24649 #endif
24650
24651 static bfd_boolean
24652 arm_parse_it_mode (char * str)
24653 {
24654   bfd_boolean ret = TRUE;
24655
24656   if (streq ("arm", str))
24657     implicit_it_mode = IMPLICIT_IT_MODE_ARM;
24658   else if (streq ("thumb", str))
24659     implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
24660   else if (streq ("always", str))
24661     implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
24662   else if (streq ("never", str))
24663     implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
24664   else
24665     {
24666       as_bad (_("unknown implicit IT mode `%s', should be "\
24667                 "arm, thumb, always, or never."), str);
24668       ret = FALSE;
24669     }
24670
24671   return ret;
24672 }
24673
24674 static bfd_boolean
24675 arm_ccs_mode (char * unused ATTRIBUTE_UNUSED)
24676 {
24677   codecomposer_syntax = TRUE;
24678   arm_comment_chars[0] = ';';
24679   arm_line_separator_chars[0] = 0;
24680   return TRUE;
24681 }
24682
24683 struct arm_long_option_table arm_long_opts[] =
24684 {
24685   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
24686    arm_parse_cpu, NULL},
24687   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
24688    arm_parse_arch, NULL},
24689   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
24690    arm_parse_fpu, NULL},
24691   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
24692    arm_parse_float_abi, NULL},
24693 #ifdef OBJ_ELF
24694   {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
24695    arm_parse_eabi, NULL},
24696 #endif
24697   {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
24698    arm_parse_it_mode, NULL},
24699   {"mccs", N_("\t\t\t  TI CodeComposer Studio syntax compatibility mode"),
24700    arm_ccs_mode, NULL},
24701   {NULL, NULL, 0, NULL}
24702 };
24703
24704 int
24705 md_parse_option (int c, char * arg)
24706 {
24707   struct arm_option_table *opt;
24708   const struct arm_legacy_option_table *fopt;
24709   struct arm_long_option_table *lopt;
24710
24711   switch (c)
24712     {
24713 #ifdef OPTION_EB
24714     case OPTION_EB:
24715       target_big_endian = 1;
24716       break;
24717 #endif
24718
24719 #ifdef OPTION_EL
24720     case OPTION_EL:
24721       target_big_endian = 0;
24722       break;
24723 #endif
24724
24725     case OPTION_FIX_V4BX:
24726       fix_v4bx = TRUE;
24727       break;
24728
24729     case 'a':
24730       /* Listing option.  Just ignore these, we don't support additional
24731          ones.  */
24732       return 0;
24733
24734     default:
24735       for (opt = arm_opts; opt->option != NULL; opt++)
24736         {
24737           if (c == opt->option[0]
24738               && ((arg == NULL && opt->option[1] == 0)
24739                   || streq (arg, opt->option + 1)))
24740             {
24741               /* If the option is deprecated, tell the user.  */
24742               if (warn_on_deprecated && opt->deprecated != NULL)
24743                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24744                            arg ? arg : "", _(opt->deprecated));
24745
24746               if (opt->var != NULL)
24747                 *opt->var = opt->value;
24748
24749               return 1;
24750             }
24751         }
24752
24753       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
24754         {
24755           if (c == fopt->option[0]
24756               && ((arg == NULL && fopt->option[1] == 0)
24757                   || streq (arg, fopt->option + 1)))
24758             {
24759               /* If the option is deprecated, tell the user.  */
24760               if (warn_on_deprecated && fopt->deprecated != NULL)
24761                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
24762                            arg ? arg : "", _(fopt->deprecated));
24763
24764               if (fopt->var != NULL)
24765                 *fopt->var = &fopt->value;
24766
24767               return 1;
24768             }
24769         }
24770
24771       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24772         {
24773           /* These options are expected to have an argument.  */
24774           if (c == lopt->option[0]
24775               && arg != NULL
24776               && strncmp (arg, lopt->option + 1,
24777                           strlen (lopt->option + 1)) == 0)
24778             {
24779               /* If the option is deprecated, tell the user.  */
24780               if (warn_on_deprecated && lopt->deprecated != NULL)
24781                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
24782                            _(lopt->deprecated));
24783
24784               /* Call the sup-option parser.  */
24785               return lopt->func (arg + strlen (lopt->option) - 1);
24786             }
24787         }
24788
24789       return 0;
24790     }
24791
24792   return 1;
24793 }
24794
24795 void
24796 md_show_usage (FILE * fp)
24797 {
24798   struct arm_option_table *opt;
24799   struct arm_long_option_table *lopt;
24800
24801   fprintf (fp, _(" ARM-specific assembler options:\n"));
24802
24803   for (opt = arm_opts; opt->option != NULL; opt++)
24804     if (opt->help != NULL)
24805       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
24806
24807   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
24808     if (lopt->help != NULL)
24809       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
24810
24811 #ifdef OPTION_EB
24812   fprintf (fp, _("\
24813   -EB                     assemble code for a big-endian cpu\n"));
24814 #endif
24815
24816 #ifdef OPTION_EL
24817   fprintf (fp, _("\
24818   -EL                     assemble code for a little-endian cpu\n"));
24819 #endif
24820
24821   fprintf (fp, _("\
24822   --fix-v4bx              Allow BX in ARMv4 code\n"));
24823 }
24824
24825
24826 #ifdef OBJ_ELF
24827 typedef struct
24828 {
24829   int val;
24830   arm_feature_set flags;
24831 } cpu_arch_ver_table;
24832
24833 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
24834    least features first.  */
24835 static const cpu_arch_ver_table cpu_arch_ver[] =
24836 {
24837     {1, ARM_ARCH_V4},
24838     {2, ARM_ARCH_V4T},
24839     {3, ARM_ARCH_V5},
24840     {3, ARM_ARCH_V5T},
24841     {4, ARM_ARCH_V5TE},
24842     {5, ARM_ARCH_V5TEJ},
24843     {6, ARM_ARCH_V6},
24844     {9, ARM_ARCH_V6K},
24845     {7, ARM_ARCH_V6Z},
24846     {11, ARM_ARCH_V6M},
24847     {12, ARM_ARCH_V6SM},
24848     {8, ARM_ARCH_V6T2},
24849     {10, ARM_ARCH_V7VE},
24850     {10, ARM_ARCH_V7R},
24851     {10, ARM_ARCH_V7M},
24852     {14, ARM_ARCH_V8A},
24853     {0, ARM_ARCH_NONE}
24854 };
24855
24856 /* Set an attribute if it has not already been set by the user.  */
24857 static void
24858 aeabi_set_attribute_int (int tag, int value)
24859 {
24860   if (tag < 1
24861       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24862       || !attributes_set_explicitly[tag])
24863     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
24864 }
24865
24866 static void
24867 aeabi_set_attribute_string (int tag, const char *value)
24868 {
24869   if (tag < 1
24870       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
24871       || !attributes_set_explicitly[tag])
24872     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
24873 }
24874
24875 /* Set the public EABI object attributes.  */
24876 static void
24877 aeabi_set_public_attributes (void)
24878 {
24879   int arch;
24880   char profile;
24881   int virt_sec = 0;
24882   int fp16_optional = 0;
24883   arm_feature_set flags;
24884   arm_feature_set tmp;
24885   const cpu_arch_ver_table *p;
24886
24887   /* Choose the architecture based on the capabilities of the requested cpu
24888      (if any) and/or the instructions actually used.  */
24889   ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
24890   ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
24891   ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
24892
24893   if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
24894     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
24895
24896   if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
24897     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
24898
24899   /* Allow the user to override the reported architecture.  */
24900   if (object_arch)
24901     {
24902       ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
24903       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
24904     }
24905
24906   /* We need to make sure that the attributes do not identify us as v6S-M
24907      when the only v6S-M feature in use is the Operating System Extensions.  */
24908   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
24909       if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
24910         ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
24911
24912   tmp = flags;
24913   arch = 0;
24914   for (p = cpu_arch_ver; p->val; p++)
24915     {
24916       if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
24917         {
24918           arch = p->val;
24919           ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
24920         }
24921     }
24922
24923   /* The table lookup above finds the last architecture to contribute
24924      a new feature.  Unfortunately, Tag13 is a subset of the union of
24925      v6T2 and v7-M, so it is never seen as contributing a new feature.
24926      We can not search for the last entry which is entirely used,
24927      because if no CPU is specified we build up only those flags
24928      actually used.  Perhaps we should separate out the specified
24929      and implicit cases.  Avoid taking this path for -march=all by
24930      checking for contradictory v7-A / v7-M features.  */
24931   if (arch == 10
24932       && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
24933       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
24934       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
24935     arch = 13;
24936
24937   /* Tag_CPU_name.  */
24938   if (selected_cpu_name[0])
24939     {
24940       char *q;
24941
24942       q = selected_cpu_name;
24943       if (strncmp (q, "armv", 4) == 0)
24944         {
24945           int i;
24946
24947           q += 4;
24948           for (i = 0; q[i]; i++)
24949             q[i] = TOUPPER (q[i]);
24950         }
24951       aeabi_set_attribute_string (Tag_CPU_name, q);
24952     }
24953
24954   /* Tag_CPU_arch.  */
24955   aeabi_set_attribute_int (Tag_CPU_arch, arch);
24956
24957   /* Tag_CPU_arch_profile.  */
24958   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
24959     profile = 'A';
24960   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
24961     profile = 'R';
24962   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
24963     profile = 'M';
24964   else
24965     profile = '\0';
24966
24967   if (profile != '\0')
24968     aeabi_set_attribute_int (Tag_CPU_arch_profile, profile);
24969
24970   /* Tag_ARM_ISA_use.  */
24971   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
24972       || arch == 0)
24973     aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
24974
24975   /* Tag_THUMB_ISA_use.  */
24976   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
24977       || arch == 0)
24978     aeabi_set_attribute_int (Tag_THUMB_ISA_use,
24979         ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
24980
24981   /* Tag_VFP_arch.  */
24982   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_armv8))
24983     aeabi_set_attribute_int (Tag_VFP_arch, 7);
24984   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
24985     aeabi_set_attribute_int (Tag_VFP_arch,
24986                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
24987                              ? 5 : 6);
24988   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
24989     {
24990       fp16_optional = 1;
24991       aeabi_set_attribute_int (Tag_VFP_arch, 3);
24992     }
24993   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
24994     {
24995       aeabi_set_attribute_int (Tag_VFP_arch, 4);
24996       fp16_optional = 1;
24997     }
24998   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
24999     aeabi_set_attribute_int (Tag_VFP_arch, 2);
25000   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
25001            || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
25002     aeabi_set_attribute_int (Tag_VFP_arch, 1);
25003
25004   /* Tag_ABI_HardFP_use.  */
25005   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
25006       && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
25007     aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
25008
25009   /* Tag_WMMX_arch.  */
25010   if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
25011     aeabi_set_attribute_int (Tag_WMMX_arch, 2);
25012   else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
25013     aeabi_set_attribute_int (Tag_WMMX_arch, 1);
25014
25015   /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
25016   if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_armv8))
25017     aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 3);
25018   else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
25019     {
25020       if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma))
25021         {
25022           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 2);
25023         }
25024       else
25025         {
25026           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 1);
25027           fp16_optional = 1;
25028         }
25029     }
25030
25031   /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
25032   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16) && fp16_optional)
25033     aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
25034
25035   /* Tag_DIV_use.
25036
25037      We set Tag_DIV_use to two when integer divide instructions have been used
25038      in ARM state, or when Thumb integer divide instructions have been used,
25039      but we have no architecture profile set, nor have we any ARM instructions.
25040
25041      For ARMv8 we set the tag to 0 as integer divide is implied by the base
25042      architecture.
25043
25044      For new architectures we will have to check these tests.  */
25045   gas_assert (arch <= TAG_CPU_ARCH_V8);
25046   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v8))
25047     aeabi_set_attribute_int (Tag_DIV_use, 0);
25048   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv)
25049            || (profile == '\0'
25050                && ARM_CPU_HAS_FEATURE (flags, arm_ext_div)
25051                && !ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any)))
25052     aeabi_set_attribute_int (Tag_DIV_use, 2);
25053
25054   /* Tag_MP_extension_use.  */
25055   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
25056     aeabi_set_attribute_int (Tag_MPextension_use, 1);
25057
25058   /* Tag Virtualization_use.  */
25059   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
25060     virt_sec |= 1;
25061   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
25062     virt_sec |= 2;
25063   if (virt_sec != 0)
25064     aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
25065 }
25066
25067 /* Add the default contents for the .ARM.attributes section.  */
25068 void
25069 arm_md_end (void)
25070 {
25071   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
25072     return;
25073
25074   aeabi_set_public_attributes ();
25075 }
25076 #endif /* OBJ_ELF */
25077
25078
25079 /* Parse a .cpu directive.  */
25080
25081 static void
25082 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
25083 {
25084   const struct arm_cpu_option_table *opt;
25085   char *name;
25086   char saved_char;
25087
25088   name = input_line_pointer;
25089   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25090     input_line_pointer++;
25091   saved_char = *input_line_pointer;
25092   *input_line_pointer = 0;
25093
25094   /* Skip the first "all" entry.  */
25095   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
25096     if (streq (opt->name, name))
25097       {
25098         mcpu_cpu_opt = &opt->value;
25099         selected_cpu = opt->value;
25100         if (opt->canonical_name)
25101           strcpy (selected_cpu_name, opt->canonical_name);
25102         else
25103           {
25104             int i;
25105             for (i = 0; opt->name[i]; i++)
25106               selected_cpu_name[i] = TOUPPER (opt->name[i]);
25107
25108             selected_cpu_name[i] = 0;
25109           }
25110         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25111         *input_line_pointer = saved_char;
25112         demand_empty_rest_of_line ();
25113         return;
25114       }
25115   as_bad (_("unknown cpu `%s'"), name);
25116   *input_line_pointer = saved_char;
25117   ignore_rest_of_line ();
25118 }
25119
25120
25121 /* Parse a .arch directive.  */
25122
25123 static void
25124 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
25125 {
25126   const struct arm_arch_option_table *opt;
25127   char saved_char;
25128   char *name;
25129
25130   name = input_line_pointer;
25131   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25132     input_line_pointer++;
25133   saved_char = *input_line_pointer;
25134   *input_line_pointer = 0;
25135
25136   /* Skip the first "all" entry.  */
25137   for (opt = arm_archs + 1; opt->name != NULL; opt++)
25138     if (streq (opt->name, name))
25139       {
25140         mcpu_cpu_opt = &opt->value;
25141         selected_cpu = opt->value;
25142         strcpy (selected_cpu_name, opt->name);
25143         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25144         *input_line_pointer = saved_char;
25145         demand_empty_rest_of_line ();
25146         return;
25147       }
25148
25149   as_bad (_("unknown architecture `%s'\n"), name);
25150   *input_line_pointer = saved_char;
25151   ignore_rest_of_line ();
25152 }
25153
25154
25155 /* Parse a .object_arch directive.  */
25156
25157 static void
25158 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
25159 {
25160   const struct arm_arch_option_table *opt;
25161   char saved_char;
25162   char *name;
25163
25164   name = input_line_pointer;
25165   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25166     input_line_pointer++;
25167   saved_char = *input_line_pointer;
25168   *input_line_pointer = 0;
25169
25170   /* Skip the first "all" entry.  */
25171   for (opt = arm_archs + 1; opt->name != NULL; opt++)
25172     if (streq (opt->name, name))
25173       {
25174         object_arch = &opt->value;
25175         *input_line_pointer = saved_char;
25176         demand_empty_rest_of_line ();
25177         return;
25178       }
25179
25180   as_bad (_("unknown architecture `%s'\n"), name);
25181   *input_line_pointer = saved_char;
25182   ignore_rest_of_line ();
25183 }
25184
25185 /* Parse a .arch_extension directive.  */
25186
25187 static void
25188 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
25189 {
25190   const struct arm_option_extension_value_table *opt;
25191   char saved_char;
25192   char *name;
25193   int adding_value = 1;
25194
25195   name = input_line_pointer;
25196   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25197     input_line_pointer++;
25198   saved_char = *input_line_pointer;
25199   *input_line_pointer = 0;
25200
25201   if (strlen (name) >= 2
25202       && strncmp (name, "no", 2) == 0)
25203     {
25204       adding_value = 0;
25205       name += 2;
25206     }
25207
25208   for (opt = arm_extensions; opt->name != NULL; opt++)
25209     if (streq (opt->name, name))
25210       {
25211         if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
25212           {
25213             as_bad (_("architectural extension `%s' is not allowed for the "
25214                       "current base architecture"), name);
25215             break;
25216           }
25217
25218         if (adding_value)
25219           ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
25220         else
25221           ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
25222
25223         mcpu_cpu_opt = &selected_cpu;
25224         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25225         *input_line_pointer = saved_char;
25226         demand_empty_rest_of_line ();
25227         return;
25228       }
25229
25230   if (opt->name == NULL)
25231     as_bad (_("unknown architecture extension `%s'\n"), name);
25232
25233   *input_line_pointer = saved_char;
25234   ignore_rest_of_line ();
25235 }
25236
25237 /* Parse a .fpu directive.  */
25238
25239 static void
25240 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
25241 {
25242   const struct arm_option_fpu_value_table *opt;
25243   char saved_char;
25244   char *name;
25245
25246   name = input_line_pointer;
25247   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
25248     input_line_pointer++;
25249   saved_char = *input_line_pointer;
25250   *input_line_pointer = 0;
25251
25252   for (opt = arm_fpus; opt->name != NULL; opt++)
25253     if (streq (opt->name, name))
25254       {
25255         mfpu_opt = &opt->value;
25256         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
25257         *input_line_pointer = saved_char;
25258         demand_empty_rest_of_line ();
25259         return;
25260       }
25261
25262   as_bad (_("unknown floating point format `%s'\n"), name);
25263   *input_line_pointer = saved_char;
25264   ignore_rest_of_line ();
25265 }
25266
25267 /* Copy symbol information.  */
25268
25269 void
25270 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
25271 {
25272   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
25273 }
25274
25275 #ifdef OBJ_ELF
25276 /* Given a symbolic attribute NAME, return the proper integer value.
25277    Returns -1 if the attribute is not known.  */
25278
25279 int
25280 arm_convert_symbolic_attribute (const char *name)
25281 {
25282   static const struct
25283   {
25284     const char * name;
25285     const int    tag;
25286   }
25287   attribute_table[] =
25288     {
25289       /* When you modify this table you should
25290          also modify the list in doc/c-arm.texi.  */
25291 #define T(tag) {#tag, tag}
25292       T (Tag_CPU_raw_name),
25293       T (Tag_CPU_name),
25294       T (Tag_CPU_arch),
25295       T (Tag_CPU_arch_profile),
25296       T (Tag_ARM_ISA_use),
25297       T (Tag_THUMB_ISA_use),
25298       T (Tag_FP_arch),
25299       T (Tag_VFP_arch),
25300       T (Tag_WMMX_arch),
25301       T (Tag_Advanced_SIMD_arch),
25302       T (Tag_PCS_config),
25303       T (Tag_ABI_PCS_R9_use),
25304       T (Tag_ABI_PCS_RW_data),
25305       T (Tag_ABI_PCS_RO_data),
25306       T (Tag_ABI_PCS_GOT_use),
25307       T (Tag_ABI_PCS_wchar_t),
25308       T (Tag_ABI_FP_rounding),
25309       T (Tag_ABI_FP_denormal),
25310       T (Tag_ABI_FP_exceptions),
25311       T (Tag_ABI_FP_user_exceptions),
25312       T (Tag_ABI_FP_number_model),
25313       T (Tag_ABI_align_needed),
25314       T (Tag_ABI_align8_needed),
25315       T (Tag_ABI_align_preserved),
25316       T (Tag_ABI_align8_preserved),
25317       T (Tag_ABI_enum_size),
25318       T (Tag_ABI_HardFP_use),
25319       T (Tag_ABI_VFP_args),
25320       T (Tag_ABI_WMMX_args),
25321       T (Tag_ABI_optimization_goals),
25322       T (Tag_ABI_FP_optimization_goals),
25323       T (Tag_compatibility),
25324       T (Tag_CPU_unaligned_access),
25325       T (Tag_FP_HP_extension),
25326       T (Tag_VFP_HP_extension),
25327       T (Tag_ABI_FP_16bit_format),
25328       T (Tag_MPextension_use),
25329       T (Tag_DIV_use),
25330       T (Tag_nodefaults),
25331       T (Tag_also_compatible_with),
25332       T (Tag_conformance),
25333       T (Tag_T2EE_use),
25334       T (Tag_Virtualization_use),
25335       /* We deliberately do not include Tag_MPextension_use_legacy.  */
25336 #undef T
25337     };
25338   unsigned int i;
25339
25340   if (name == NULL)
25341     return -1;
25342
25343   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
25344     if (streq (name, attribute_table[i].name))
25345       return attribute_table[i].tag;
25346
25347   return -1;
25348 }
25349
25350
25351 /* Apply sym value for relocations only in the case that
25352    they are for local symbols and you have the respective
25353    architectural feature for blx and simple switches.  */
25354 int
25355 arm_apply_sym_value (struct fix * fixP)
25356 {
25357   if (fixP->fx_addsy
25358       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
25359       && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
25360     {
25361       switch (fixP->fx_r_type)
25362         {
25363         case BFD_RELOC_ARM_PCREL_BLX:
25364         case BFD_RELOC_THUMB_PCREL_BRANCH23:
25365           if (ARM_IS_FUNC (fixP->fx_addsy))
25366             return 1;
25367           break;
25368
25369         case BFD_RELOC_ARM_PCREL_CALL:
25370         case BFD_RELOC_THUMB_PCREL_BLX:
25371           if (THUMB_IS_FUNC (fixP->fx_addsy))
25372               return 1;
25373           break;
25374
25375         default:
25376           break;
25377         }
25378
25379     }
25380   return 0;
25381 }
25382 #endif /* OBJ_ELF */