]> Git Repo - binutils.git/blob - gas/config/tc-arm.c
gas/
[binutils.git] / gas / config / tc-arm.c
1 /* tc-arm.c -- Assemble for the ARM
2    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3    2004, 2005, 2006, 2007, 2008, 2009
4    Free Software Foundation, Inc.
5    Contributed by Richard Earnshaw ([email protected])
6         Modified by David Taylor ([email protected])
7         Cirrus coprocessor mods by Aldy Hernandez ([email protected])
8         Cirrus coprocessor fixes by Petko Manolov ([email protected])
9         Cirrus coprocessor fixes by Vladimir Ivanov ([email protected])
10
11    This file is part of GAS, the GNU Assembler.
12
13    GAS is free software; you can redistribute it and/or modify
14    it under the terms of the GNU General Public License as published by
15    the Free Software Foundation; either version 3, or (at your option)
16    any later version.
17
18    GAS is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21    GNU General Public License for more details.
22
23    You should have received a copy of the GNU General Public License
24    along with GAS; see the file COPYING.  If not, write to the Free
25    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
26    02110-1301, USA.  */
27
28 #include "as.h"
29 #include <limits.h>
30 #include <stdarg.h>
31 #define  NO_RELOC 0
32 #include "safe-ctype.h"
33 #include "subsegs.h"
34 #include "obstack.h"
35
36 #include "opcode/arm.h"
37
38 #ifdef OBJ_ELF
39 #include "elf/arm.h"
40 #include "dw2gencfi.h"
41 #endif
42
43 #include "dwarf2dbg.h"
44
45 #ifdef OBJ_ELF
46 /* Must be at least the size of the largest unwind opcode (currently two).  */
47 #define ARM_OPCODE_CHUNK_SIZE 8
48
49 /* This structure holds the unwinding state.  */
50
51 static struct
52 {
53   symbolS *       proc_start;
54   symbolS *       table_entry;
55   symbolS *       personality_routine;
56   int             personality_index;
57   /* The segment containing the function.  */
58   segT            saved_seg;
59   subsegT         saved_subseg;
60   /* Opcodes generated from this function.  */
61   unsigned char * opcodes;
62   int             opcode_count;
63   int             opcode_alloc;
64   /* The number of bytes pushed to the stack.  */
65   offsetT         frame_size;
66   /* We don't add stack adjustment opcodes immediately so that we can merge
67      multiple adjustments.  We can also omit the final adjustment
68      when using a frame pointer.  */
69   offsetT         pending_offset;
70   /* These two fields are set by both unwind_movsp and unwind_setfp.  They
71      hold the reg+offset to use when restoring sp from a frame pointer.  */
72   offsetT         fp_offset;
73   int             fp_reg;
74   /* Nonzero if an unwind_setfp directive has been seen.  */
75   unsigned        fp_used:1;
76   /* Nonzero if the last opcode restores sp from fp_reg.  */
77   unsigned        sp_restored:1;
78 } unwind;
79
80 #endif /* OBJ_ELF */
81
82 /* Results from operand parsing worker functions.  */
83
84 typedef enum
85 {
86   PARSE_OPERAND_SUCCESS,
87   PARSE_OPERAND_FAIL,
88   PARSE_OPERAND_FAIL_NO_BACKTRACK
89 } parse_operand_result;
90
91 enum arm_float_abi
92 {
93   ARM_FLOAT_ABI_HARD,
94   ARM_FLOAT_ABI_SOFTFP,
95   ARM_FLOAT_ABI_SOFT
96 };
97
98 /* Types of processor to assemble for.  */
99 #ifndef CPU_DEFAULT
100 /* The code that was here used to select a default CPU depending on compiler
101    pre-defines which were only present when doing native builds, thus 
102    changing gas' default behaviour depending upon the build host.
103
104    If you have a target that requires a default CPU option then the you
105    should define CPU_DEFAULT here.  */
106 #endif
107
108 #ifndef FPU_DEFAULT
109 # ifdef TE_LINUX
110 #  define FPU_DEFAULT FPU_ARCH_FPA
111 # elif defined (TE_NetBSD)
112 #  ifdef OBJ_ELF
113 #   define FPU_DEFAULT FPU_ARCH_VFP     /* Soft-float, but VFP order.  */
114 #  else
115     /* Legacy a.out format.  */
116 #   define FPU_DEFAULT FPU_ARCH_FPA     /* Soft-float, but FPA order.  */
117 #  endif
118 # elif defined (TE_VXWORKS)
119 #  define FPU_DEFAULT FPU_ARCH_VFP      /* Soft-float, VFP order.  */
120 # else
121    /* For backwards compatibility, default to FPA.  */
122 #  define FPU_DEFAULT FPU_ARCH_FPA
123 # endif
124 #endif /* ifndef FPU_DEFAULT */
125
126 #define streq(a, b)           (strcmp (a, b) == 0)
127
128 static arm_feature_set cpu_variant;
129 static arm_feature_set arm_arch_used;
130 static arm_feature_set thumb_arch_used;
131
132 /* Flags stored in private area of BFD structure.  */
133 static int uses_apcs_26      = FALSE;
134 static int atpcs             = FALSE;
135 static int support_interwork = FALSE;
136 static int uses_apcs_float   = FALSE;
137 static int pic_code          = FALSE;
138 static int fix_v4bx          = FALSE;
139 /* Warn on using deprecated features.  */
140 static int warn_on_deprecated = TRUE;
141
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_v6z = ARM_FEATURE (ARM_EXT_V6Z, 0);
188 static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE (ARM_EXT_V6T2, 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_m =
199   ARM_FEATURE (ARM_EXT_V6M | ARM_EXT_V7M, 0);
200
201 static const arm_feature_set arm_arch_any = ARM_ANY;
202 static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1);
203 static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
204 static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
205
206 static const arm_feature_set arm_cext_iwmmxt2 =
207   ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
208 static const arm_feature_set arm_cext_iwmmxt =
209   ARM_FEATURE (0, ARM_CEXT_IWMMXT);
210 static const arm_feature_set arm_cext_xscale =
211   ARM_FEATURE (0, ARM_CEXT_XSCALE);
212 static const arm_feature_set arm_cext_maverick =
213   ARM_FEATURE (0, ARM_CEXT_MAVERICK);
214 static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
215 static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
216 static const arm_feature_set fpu_vfp_ext_v1xd =
217   ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
218 static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
219 static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
220 static const arm_feature_set fpu_vfp_ext_v3xd = ARM_FEATURE (0, FPU_VFP_EXT_V3xD);
221 static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
222 static const arm_feature_set fpu_vfp_ext_d32 =
223   ARM_FEATURE (0, FPU_VFP_EXT_D32);
224 static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
225 static const arm_feature_set fpu_vfp_v3_or_neon_ext =
226   ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
227 static const arm_feature_set fpu_vfp_fp16 = ARM_FEATURE (0, FPU_VFP_EXT_FP16);
228 static const arm_feature_set fpu_neon_ext_fma = ARM_FEATURE (0, FPU_NEON_EXT_FMA);
229 static const arm_feature_set fpu_vfp_ext_fma = ARM_FEATURE (0, FPU_VFP_EXT_FMA);
230
231 static int mfloat_abi_opt = -1;
232 /* Record user cpu selection for object attributes.  */
233 static arm_feature_set selected_cpu = ARM_ARCH_NONE;
234 /* Must be long enough to hold any of the names in arm_cpus.  */
235 static char selected_cpu_name[16];
236 #ifdef OBJ_ELF
237 # ifdef EABI_DEFAULT
238 static int meabi_flags = EABI_DEFAULT;
239 # else
240 static int meabi_flags = EF_ARM_EABI_UNKNOWN;
241 # endif
242
243 static int attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
244
245 bfd_boolean
246 arm_is_eabi (void)
247 {
248   return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
249 }
250 #endif
251
252 #ifdef OBJ_ELF
253 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
254 symbolS * GOT_symbol;
255 #endif
256
257 /* 0: assemble for ARM,
258    1: assemble for Thumb,
259    2: assemble for Thumb even though target CPU does not support thumb
260       instructions.  */
261 static int thumb_mode = 0;
262 /* A value distinct from the possible values for thumb_mode that we
263    can use to record whether thumb_mode has been copied into the
264    tc_frag_data field of a frag.  */
265 #define MODE_RECORDED (1 << 4)
266
267 /* Specifies the intrinsic IT insn behavior mode.  */
268 enum implicit_it_mode
269 {
270   IMPLICIT_IT_MODE_NEVER  = 0x00,
271   IMPLICIT_IT_MODE_ARM    = 0x01,
272   IMPLICIT_IT_MODE_THUMB  = 0x02,
273   IMPLICIT_IT_MODE_ALWAYS = (IMPLICIT_IT_MODE_ARM | IMPLICIT_IT_MODE_THUMB)
274 };
275 static int implicit_it_mode = IMPLICIT_IT_MODE_ARM;
276
277 /* If unified_syntax is true, we are processing the new unified
278    ARM/Thumb syntax.  Important differences from the old ARM mode:
279
280      - Immediate operands do not require a # prefix.
281      - Conditional affixes always appear at the end of the
282        instruction.  (For backward compatibility, those instructions
283        that formerly had them in the middle, continue to accept them
284        there.)
285      - The IT instruction may appear, and if it does is validated
286        against subsequent conditional affixes.  It does not generate
287        machine code.
288
289    Important differences from the old Thumb mode:
290
291      - Immediate operands do not require a # prefix.
292      - Most of the V6T2 instructions are only available in unified mode.
293      - The .N and .W suffixes are recognized and honored (it is an error
294        if they cannot be honored).
295      - All instructions set the flags if and only if they have an 's' affix.
296      - Conditional affixes may be used.  They are validated against
297        preceding IT instructions.  Unlike ARM mode, you cannot use a
298        conditional affix except in the scope of an IT instruction.  */
299
300 static bfd_boolean unified_syntax = FALSE;
301
302 enum neon_el_type
303 {
304   NT_invtype,
305   NT_untyped,
306   NT_integer,
307   NT_float,
308   NT_poly,
309   NT_signed,
310   NT_unsigned
311 };
312
313 struct neon_type_el
314 {
315   enum neon_el_type type;
316   unsigned size;
317 };
318
319 #define NEON_MAX_TYPE_ELS 4
320
321 struct neon_type
322 {
323   struct neon_type_el el[NEON_MAX_TYPE_ELS];
324   unsigned elems;
325 };
326
327 enum it_instruction_type
328 {
329    OUTSIDE_IT_INSN,
330    INSIDE_IT_INSN,
331    INSIDE_IT_LAST_INSN,
332    IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
333                               if inside, should be the last one.  */
334    NEUTRAL_IT_INSN,        /* This could be either inside or outside,
335                               i.e. BKPT and NOP.  */
336    IT_INSN                 /* The IT insn has been parsed.  */
337 };
338
339 struct arm_it
340 {
341   const char *  error;
342   unsigned long instruction;
343   int           size;
344   int           size_req;
345   int           cond;
346   /* "uncond_value" is set to the value in place of the conditional field in
347      unconditional versions of the instruction, or -1 if nothing is
348      appropriate.  */
349   int           uncond_value;
350   struct neon_type vectype;
351   /* This does not indicate an actual NEON instruction, only that
352      the mnemonic accepts neon-style type suffixes.  */
353   int           is_neon;
354   /* Set to the opcode if the instruction needs relaxation.
355      Zero if the instruction is not relaxed.  */
356   unsigned long relax;
357   struct
358   {
359     bfd_reloc_code_real_type type;
360     expressionS              exp;
361     int                      pc_rel;
362   } reloc;
363
364   enum it_instruction_type it_insn_type;
365
366   struct
367   {
368     unsigned reg;
369     signed int imm;
370     struct neon_type_el vectype;
371     unsigned present    : 1;  /* Operand present.  */
372     unsigned isreg      : 1;  /* Operand was a register.  */
373     unsigned immisreg   : 1;  /* .imm field is a second register.  */
374     unsigned isscalar   : 1;  /* Operand is a (Neon) scalar.  */
375     unsigned immisalign : 1;  /* Immediate is an alignment specifier.  */
376     unsigned immisfloat : 1;  /* Immediate was parsed as a float.  */
377     /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
378        instructions. This allows us to disambiguate ARM <-> vector insns.  */
379     unsigned regisimm   : 1;  /* 64-bit immediate, reg forms high 32 bits.  */
380     unsigned isvec      : 1;  /* Is a single, double or quad VFP/Neon reg.  */
381     unsigned isquad     : 1;  /* Operand is Neon quad-precision register.  */
382     unsigned issingle   : 1;  /* Operand is VFP single-precision register.  */
383     unsigned hasreloc   : 1;  /* Operand has relocation suffix.  */
384     unsigned writeback  : 1;  /* Operand has trailing !  */
385     unsigned preind     : 1;  /* Preindexed address.  */
386     unsigned postind    : 1;  /* Postindexed address.  */
387     unsigned negative   : 1;  /* Index register was negated.  */
388     unsigned shifted    : 1;  /* Shift applied to operation.  */
389     unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
390   } operands[6];
391 };
392
393 static struct arm_it inst;
394
395 #define NUM_FLOAT_VALS 8
396
397 const char * fp_const[] =
398 {
399   "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
400 };
401
402 /* Number of littlenums required to hold an extended precision number.  */
403 #define MAX_LITTLENUMS 6
404
405 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
406
407 #define FAIL    (-1)
408 #define SUCCESS (0)
409
410 #define SUFF_S 1
411 #define SUFF_D 2
412 #define SUFF_E 3
413 #define SUFF_P 4
414
415 #define CP_T_X   0x00008000
416 #define CP_T_Y   0x00400000
417
418 #define CONDS_BIT        0x00100000
419 #define LOAD_BIT         0x00100000
420
421 #define DOUBLE_LOAD_FLAG 0x00000001
422
423 struct asm_cond
424 {
425   const char *   template_name;
426   unsigned long  value;
427 };
428
429 #define COND_ALWAYS 0xE
430
431 struct asm_psr
432 {
433   const char *   template_name;
434   unsigned long  field;
435 };
436
437 struct asm_barrier_opt
438 {
439   const char *   template_name;
440   unsigned long  value;
441 };
442
443 /* The bit that distinguishes CPSR and SPSR.  */
444 #define SPSR_BIT   (1 << 22)
445
446 /* The individual PSR flag bits.  */
447 #define PSR_c   (1 << 16)
448 #define PSR_x   (1 << 17)
449 #define PSR_s   (1 << 18)
450 #define PSR_f   (1 << 19)
451
452 struct reloc_entry
453 {
454   char *                    name;
455   bfd_reloc_code_real_type  reloc;
456 };
457
458 enum vfp_reg_pos
459 {
460   VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
461   VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
462 };
463
464 enum vfp_ldstm_type
465 {
466   VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
467 };
468
469 /* Bits for DEFINED field in neon_typed_alias.  */
470 #define NTA_HASTYPE  1
471 #define NTA_HASINDEX 2
472
473 struct neon_typed_alias
474 {
475   unsigned char        defined;
476   unsigned char        index;
477   struct neon_type_el  eltype;
478 };
479
480 /* ARM register categories.  This includes coprocessor numbers and various
481    architecture extensions' registers.  */
482 enum arm_reg_type
483 {
484   REG_TYPE_RN,
485   REG_TYPE_CP,
486   REG_TYPE_CN,
487   REG_TYPE_FN,
488   REG_TYPE_VFS,
489   REG_TYPE_VFD,
490   REG_TYPE_NQ,
491   REG_TYPE_VFSD,
492   REG_TYPE_NDQ,
493   REG_TYPE_NSDQ,
494   REG_TYPE_VFC,
495   REG_TYPE_MVF,
496   REG_TYPE_MVD,
497   REG_TYPE_MVFX,
498   REG_TYPE_MVDX,
499   REG_TYPE_MVAX,
500   REG_TYPE_DSPSC,
501   REG_TYPE_MMXWR,
502   REG_TYPE_MMXWC,
503   REG_TYPE_MMXWCG,
504   REG_TYPE_XSCALE,
505 };
506
507 /* Structure for a hash table entry for a register.
508    If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
509    information which states whether a vector type or index is specified (for a
510    register alias created with .dn or .qn). Otherwise NEON should be NULL.  */
511 struct reg_entry
512 {
513   const char *               name;
514   unsigned char              number;
515   unsigned char              type;
516   unsigned char              builtin;
517   struct neon_typed_alias *  neon;
518 };
519
520 /* Diagnostics used when we don't get a register of the expected type.  */
521 const char * const reg_expected_msgs[] =
522 {
523   N_("ARM register expected"),
524   N_("bad or missing co-processor number"),
525   N_("co-processor register expected"),
526   N_("FPA register expected"),
527   N_("VFP single precision register expected"),
528   N_("VFP/Neon double precision register expected"),
529   N_("Neon quad precision register expected"),
530   N_("VFP single or double precision register expected"),
531   N_("Neon double or quad precision register expected"),
532   N_("VFP single, double or Neon quad precision register expected"),
533   N_("VFP system register expected"),
534   N_("Maverick MVF register expected"),
535   N_("Maverick MVD register expected"),
536   N_("Maverick MVFX register expected"),
537   N_("Maverick MVDX register expected"),
538   N_("Maverick MVAX register expected"),
539   N_("Maverick DSPSC register expected"),
540   N_("iWMMXt data register expected"),
541   N_("iWMMXt control register expected"),
542   N_("iWMMXt scalar register expected"),
543   N_("XScale accumulator register expected"),
544 };
545
546 /* Some well known registers that we refer to directly elsewhere.  */
547 #define REG_SP  13
548 #define REG_LR  14
549 #define REG_PC  15
550
551 /* ARM instructions take 4bytes in the object file, Thumb instructions
552    take 2:  */
553 #define INSN_SIZE       4
554
555 struct asm_opcode
556 {
557   /* Basic string to match.  */
558   const char * template_name;
559
560   /* Parameters to instruction.  */
561   unsigned int operands[8];
562
563   /* Conditional tag - see opcode_lookup.  */
564   unsigned int tag : 4;
565
566   /* Basic instruction code.  */
567   unsigned int avalue : 28;
568
569   /* Thumb-format instruction code.  */
570   unsigned int tvalue;
571
572   /* Which architecture variant provides this instruction.  */
573   const arm_feature_set * avariant;
574   const arm_feature_set * tvariant;
575
576   /* Function to call to encode instruction in ARM format.  */
577   void (* aencode) (void);
578
579   /* Function to call to encode instruction in Thumb format.  */
580   void (* tencode) (void);
581 };
582
583 /* Defines for various bits that we will want to toggle.  */
584 #define INST_IMMEDIATE  0x02000000
585 #define OFFSET_REG      0x02000000
586 #define HWOFFSET_IMM    0x00400000
587 #define SHIFT_BY_REG    0x00000010
588 #define PRE_INDEX       0x01000000
589 #define INDEX_UP        0x00800000
590 #define WRITE_BACK      0x00200000
591 #define LDM_TYPE_2_OR_3 0x00400000
592 #define CPSI_MMOD       0x00020000
593
594 #define LITERAL_MASK    0xf000f000
595 #define OPCODE_MASK     0xfe1fffff
596 #define V4_STR_BIT      0x00000020
597
598 #define T2_SUBS_PC_LR   0xf3de8f00
599
600 #define DATA_OP_SHIFT   21
601
602 #define T2_OPCODE_MASK  0xfe1fffff
603 #define T2_DATA_OP_SHIFT 21
604
605 /* Codes to distinguish the arithmetic instructions.  */
606 #define OPCODE_AND      0
607 #define OPCODE_EOR      1
608 #define OPCODE_SUB      2
609 #define OPCODE_RSB      3
610 #define OPCODE_ADD      4
611 #define OPCODE_ADC      5
612 #define OPCODE_SBC      6
613 #define OPCODE_RSC      7
614 #define OPCODE_TST      8
615 #define OPCODE_TEQ      9
616 #define OPCODE_CMP      10
617 #define OPCODE_CMN      11
618 #define OPCODE_ORR      12
619 #define OPCODE_MOV      13
620 #define OPCODE_BIC      14
621 #define OPCODE_MVN      15
622
623 #define T2_OPCODE_AND   0
624 #define T2_OPCODE_BIC   1
625 #define T2_OPCODE_ORR   2
626 #define T2_OPCODE_ORN   3
627 #define T2_OPCODE_EOR   4
628 #define T2_OPCODE_ADD   8
629 #define T2_OPCODE_ADC   10
630 #define T2_OPCODE_SBC   11
631 #define T2_OPCODE_SUB   13
632 #define T2_OPCODE_RSB   14
633
634 #define T_OPCODE_MUL 0x4340
635 #define T_OPCODE_TST 0x4200
636 #define T_OPCODE_CMN 0x42c0
637 #define T_OPCODE_NEG 0x4240
638 #define T_OPCODE_MVN 0x43c0
639
640 #define T_OPCODE_ADD_R3 0x1800
641 #define T_OPCODE_SUB_R3 0x1a00
642 #define T_OPCODE_ADD_HI 0x4400
643 #define T_OPCODE_ADD_ST 0xb000
644 #define T_OPCODE_SUB_ST 0xb080
645 #define T_OPCODE_ADD_SP 0xa800
646 #define T_OPCODE_ADD_PC 0xa000
647 #define T_OPCODE_ADD_I8 0x3000
648 #define T_OPCODE_SUB_I8 0x3800
649 #define T_OPCODE_ADD_I3 0x1c00
650 #define T_OPCODE_SUB_I3 0x1e00
651
652 #define T_OPCODE_ASR_R  0x4100
653 #define T_OPCODE_LSL_R  0x4080
654 #define T_OPCODE_LSR_R  0x40c0
655 #define T_OPCODE_ROR_R  0x41c0
656 #define T_OPCODE_ASR_I  0x1000
657 #define T_OPCODE_LSL_I  0x0000
658 #define T_OPCODE_LSR_I  0x0800
659
660 #define T_OPCODE_MOV_I8 0x2000
661 #define T_OPCODE_CMP_I8 0x2800
662 #define T_OPCODE_CMP_LR 0x4280
663 #define T_OPCODE_MOV_HR 0x4600
664 #define T_OPCODE_CMP_HR 0x4500
665
666 #define T_OPCODE_LDR_PC 0x4800
667 #define T_OPCODE_LDR_SP 0x9800
668 #define T_OPCODE_STR_SP 0x9000
669 #define T_OPCODE_LDR_IW 0x6800
670 #define T_OPCODE_STR_IW 0x6000
671 #define T_OPCODE_LDR_IH 0x8800
672 #define T_OPCODE_STR_IH 0x8000
673 #define T_OPCODE_LDR_IB 0x7800
674 #define T_OPCODE_STR_IB 0x7000
675 #define T_OPCODE_LDR_RW 0x5800
676 #define T_OPCODE_STR_RW 0x5000
677 #define T_OPCODE_LDR_RH 0x5a00
678 #define T_OPCODE_STR_RH 0x5200
679 #define T_OPCODE_LDR_RB 0x5c00
680 #define T_OPCODE_STR_RB 0x5400
681
682 #define T_OPCODE_PUSH   0xb400
683 #define T_OPCODE_POP    0xbc00
684
685 #define T_OPCODE_BRANCH 0xe000
686
687 #define THUMB_SIZE      2       /* Size of thumb instruction.  */
688 #define THUMB_PP_PC_LR 0x0100
689 #define THUMB_LOAD_BIT 0x0800
690 #define THUMB2_LOAD_BIT 0x00100000
691
692 #define BAD_ARGS        _("bad arguments to instruction")
693 #define BAD_SP          _("r13 not allowed here")
694 #define BAD_PC          _("r15 not allowed here")
695 #define BAD_COND        _("instruction cannot be conditional")
696 #define BAD_OVERLAP     _("registers may not be the same")
697 #define BAD_HIREG       _("lo register required")
698 #define BAD_THUMB32     _("instruction not supported in Thumb16 mode")
699 #define BAD_ADDR_MODE   _("instruction does not accept this addressing mode");
700 #define BAD_BRANCH      _("branch must be last instruction in IT block")
701 #define BAD_NOT_IT      _("instruction not allowed in IT block")
702 #define BAD_FPU         _("selected FPU does not support instruction")
703 #define BAD_OUT_IT      _("thumb conditional instruction should be in IT block")
704 #define BAD_IT_COND     _("incorrect condition in IT block")
705 #define BAD_IT_IT       _("IT falling in the range of a previous IT block")
706 #define MISSING_FNSTART _("missing .fnstart before unwinding directive")
707 #define BAD_PC_ADDRESSING \
708         _("cannot use register index with PC-relative addressing")
709 #define BAD_PC_WRITEBACK \
710         _("cannot use writeback with PC-relative addressing")
711
712 static struct hash_control * arm_ops_hsh;
713 static struct hash_control * arm_cond_hsh;
714 static struct hash_control * arm_shift_hsh;
715 static struct hash_control * arm_psr_hsh;
716 static struct hash_control * arm_v7m_psr_hsh;
717 static struct hash_control * arm_reg_hsh;
718 static struct hash_control * arm_reloc_hsh;
719 static struct hash_control * arm_barrier_opt_hsh;
720
721 /* Stuff needed to resolve the label ambiguity
722    As:
723      ...
724      label:   <insn>
725    may differ from:
726      ...
727      label:
728               <insn>  */
729
730 symbolS *  last_label_seen;
731 static int label_is_thumb_function_name = FALSE;
732
733 /* Literal pool structure.  Held on a per-section
734    and per-sub-section basis.  */
735
736 #define MAX_LITERAL_POOL_SIZE 1024
737 typedef struct literal_pool
738 {
739   expressionS            literals [MAX_LITERAL_POOL_SIZE];
740   unsigned int           next_free_entry;
741   unsigned int           id;
742   symbolS *              symbol;
743   segT                   section;
744   subsegT                sub_section;
745   struct literal_pool *  next;
746 } literal_pool;
747
748 /* Pointer to a linked list of literal pools.  */
749 literal_pool * list_of_pools = NULL;
750
751 #ifdef OBJ_ELF
752 #  define now_it seg_info (now_seg)->tc_segment_info_data.current_it
753 #else
754 static struct current_it now_it;
755 #endif
756
757 static inline int
758 now_it_compatible (int cond)
759 {
760   return (cond & ~1) == (now_it.cc & ~1);
761 }
762
763 static inline int
764 conditional_insn (void)
765 {
766   return inst.cond != COND_ALWAYS;
767 }
768
769 static int in_it_block (void);
770
771 static int handle_it_state (void);
772
773 static void force_automatic_it_block_close (void);
774
775 static void it_fsm_post_encode (void);
776
777 #define set_it_insn_type(type)                  \
778   do                                            \
779     {                                           \
780       inst.it_insn_type = type;                 \
781       if (handle_it_state () == FAIL)           \
782         return;                                 \
783     }                                           \
784   while (0)
785
786 #define set_it_insn_type_nonvoid(type, failret) \
787   do                                            \
788     {                                           \
789       inst.it_insn_type = type;                 \
790       if (handle_it_state () == FAIL)           \
791         return failret;                         \
792     }                                           \
793   while(0)
794
795 #define set_it_insn_type_last()                         \
796   do                                                    \
797     {                                                   \
798       if (inst.cond == COND_ALWAYS)                     \
799         set_it_insn_type (IF_INSIDE_IT_LAST_INSN);      \
800       else                                              \
801         set_it_insn_type (INSIDE_IT_LAST_INSN);         \
802     }                                                   \
803   while (0)
804
805 /* Pure syntax.  */
806
807 /* This array holds the chars that always start a comment.  If the
808    pre-processor is disabled, these aren't very useful.  */
809 const char comment_chars[] = "@";
810
811 /* This array holds the chars that only start a comment at the beginning of
812    a line.  If the line seems to have the form '# 123 filename'
813    .line and .file directives will appear in the pre-processed output.  */
814 /* Note that input_file.c hand checks for '#' at the beginning of the
815    first line of the input file.  This is because the compiler outputs
816    #NO_APP at the beginning of its output.  */
817 /* Also note that comments like this one will always work.  */
818 const char line_comment_chars[] = "#";
819
820 const char line_separator_chars[] = ";";
821
822 /* Chars that can be used to separate mant
823    from exp in floating point numbers.  */
824 const char EXP_CHARS[] = "eE";
825
826 /* Chars that mean this number is a floating point constant.  */
827 /* As in 0f12.456  */
828 /* or    0d1.2345e12  */
829
830 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
831
832 /* Prefix characters that indicate the start of an immediate
833    value.  */
834 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
835
836 /* Separator character handling.  */
837
838 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
839
840 static inline int
841 skip_past_char (char ** str, char c)
842 {
843   if (**str == c)
844     {
845       (*str)++;
846       return SUCCESS;
847     }
848   else
849     return FAIL;
850 }
851
852 #define skip_past_comma(str) skip_past_char (str, ',')
853
854 /* Arithmetic expressions (possibly involving symbols).  */
855
856 /* Return TRUE if anything in the expression is a bignum.  */
857
858 static int
859 walk_no_bignums (symbolS * sp)
860 {
861   if (symbol_get_value_expression (sp)->X_op == O_big)
862     return 1;
863
864   if (symbol_get_value_expression (sp)->X_add_symbol)
865     {
866       return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
867               || (symbol_get_value_expression (sp)->X_op_symbol
868                   && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
869     }
870
871   return 0;
872 }
873
874 static int in_my_get_expression = 0;
875
876 /* Third argument to my_get_expression.  */
877 #define GE_NO_PREFIX 0
878 #define GE_IMM_PREFIX 1
879 #define GE_OPT_PREFIX 2
880 /* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
881    immediates, as can be used in Neon VMVN and VMOV immediate instructions.  */
882 #define GE_OPT_PREFIX_BIG 3
883
884 static int
885 my_get_expression (expressionS * ep, char ** str, int prefix_mode)
886 {
887   char * save_in;
888   segT   seg;
889
890   /* In unified syntax, all prefixes are optional.  */
891   if (unified_syntax)
892     prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
893                   : GE_OPT_PREFIX;
894
895   switch (prefix_mode)
896     {
897     case GE_NO_PREFIX: break;
898     case GE_IMM_PREFIX:
899       if (!is_immediate_prefix (**str))
900         {
901           inst.error = _("immediate expression requires a # prefix");
902           return FAIL;
903         }
904       (*str)++;
905       break;
906     case GE_OPT_PREFIX:
907     case GE_OPT_PREFIX_BIG:
908       if (is_immediate_prefix (**str))
909         (*str)++;
910       break;
911     default: abort ();
912     }
913
914   memset (ep, 0, sizeof (expressionS));
915
916   save_in = input_line_pointer;
917   input_line_pointer = *str;
918   in_my_get_expression = 1;
919   seg = expression (ep);
920   in_my_get_expression = 0;
921
922   if (ep->X_op == O_illegal || ep->X_op == O_absent)
923     {
924       /* We found a bad or missing expression in md_operand().  */
925       *str = input_line_pointer;
926       input_line_pointer = save_in;
927       if (inst.error == NULL)
928         inst.error = (ep->X_op == O_absent
929                       ? _("missing expression") :_("bad expression"));
930       return 1;
931     }
932
933 #ifdef OBJ_AOUT
934   if (seg != absolute_section
935       && seg != text_section
936       && seg != data_section
937       && seg != bss_section
938       && seg != undefined_section)
939     {
940       inst.error = _("bad segment");
941       *str = input_line_pointer;
942       input_line_pointer = save_in;
943       return 1;
944     }
945 #endif
946
947   /* Get rid of any bignums now, so that we don't generate an error for which
948      we can't establish a line number later on.  Big numbers are never valid
949      in instructions, which is where this routine is always called.  */
950   if (prefix_mode != GE_OPT_PREFIX_BIG
951       && (ep->X_op == O_big
952           || (ep->X_add_symbol
953               && (walk_no_bignums (ep->X_add_symbol)
954                   || (ep->X_op_symbol
955                       && walk_no_bignums (ep->X_op_symbol))))))
956     {
957       inst.error = _("invalid constant");
958       *str = input_line_pointer;
959       input_line_pointer = save_in;
960       return 1;
961     }
962
963   *str = input_line_pointer;
964   input_line_pointer = save_in;
965   return 0;
966 }
967
968 /* Turn a string in input_line_pointer into a floating point constant
969    of type TYPE, and store the appropriate bytes in *LITP.  The number
970    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
971    returned, or NULL on OK.
972
973    Note that fp constants aren't represent in the normal way on the ARM.
974    In big endian mode, things are as expected.  However, in little endian
975    mode fp constants are big-endian word-wise, and little-endian byte-wise
976    within the words.  For example, (double) 1.1 in big endian mode is
977    the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
978    the byte sequence 99 99 f1 3f 9a 99 99 99.
979
980    ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
981
982 char *
983 md_atof (int type, char * litP, int * sizeP)
984 {
985   int prec;
986   LITTLENUM_TYPE words[MAX_LITTLENUMS];
987   char *t;
988   int i;
989
990   switch (type)
991     {
992     case 'f':
993     case 'F':
994     case 's':
995     case 'S':
996       prec = 2;
997       break;
998
999     case 'd':
1000     case 'D':
1001     case 'r':
1002     case 'R':
1003       prec = 4;
1004       break;
1005
1006     case 'x':
1007     case 'X':
1008       prec = 5;
1009       break;
1010
1011     case 'p':
1012     case 'P':
1013       prec = 5;
1014       break;
1015
1016     default:
1017       *sizeP = 0;
1018       return _("Unrecognized or unsupported floating point constant");
1019     }
1020
1021   t = atof_ieee (input_line_pointer, type, words);
1022   if (t)
1023     input_line_pointer = t;
1024   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1025
1026   if (target_big_endian)
1027     {
1028       for (i = 0; i < prec; i++)
1029         {
1030           md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1031           litP += sizeof (LITTLENUM_TYPE);
1032         }
1033     }
1034   else
1035     {
1036       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
1037         for (i = prec - 1; i >= 0; i--)
1038           {
1039             md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1040             litP += sizeof (LITTLENUM_TYPE);
1041           }
1042       else
1043         /* For a 4 byte float the order of elements in `words' is 1 0.
1044            For an 8 byte float the order is 1 0 3 2.  */
1045         for (i = 0; i < prec; i += 2)
1046           {
1047             md_number_to_chars (litP, (valueT) words[i + 1],
1048                                 sizeof (LITTLENUM_TYPE));
1049             md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1050                                 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1051             litP += 2 * sizeof (LITTLENUM_TYPE);
1052           }
1053     }
1054
1055   return NULL;
1056 }
1057
1058 /* We handle all bad expressions here, so that we can report the faulty
1059    instruction in the error message.  */
1060 void
1061 md_operand (expressionS * exp)
1062 {
1063   if (in_my_get_expression)
1064     exp->X_op = O_illegal;
1065 }
1066
1067 /* Immediate values.  */
1068
1069 /* Generic immediate-value read function for use in directives.
1070    Accepts anything that 'expression' can fold to a constant.
1071    *val receives the number.  */
1072 #ifdef OBJ_ELF
1073 static int
1074 immediate_for_directive (int *val)
1075 {
1076   expressionS exp;
1077   exp.X_op = O_illegal;
1078
1079   if (is_immediate_prefix (*input_line_pointer))
1080     {
1081       input_line_pointer++;
1082       expression (&exp);
1083     }
1084
1085   if (exp.X_op != O_constant)
1086     {
1087       as_bad (_("expected #constant"));
1088       ignore_rest_of_line ();
1089       return FAIL;
1090     }
1091   *val = exp.X_add_number;
1092   return SUCCESS;
1093 }
1094 #endif
1095
1096 /* Register parsing.  */
1097
1098 /* Generic register parser.  CCP points to what should be the
1099    beginning of a register name.  If it is indeed a valid register
1100    name, advance CCP over it and return the reg_entry structure;
1101    otherwise return NULL.  Does not issue diagnostics.  */
1102
1103 static struct reg_entry *
1104 arm_reg_parse_multi (char **ccp)
1105 {
1106   char *start = *ccp;
1107   char *p;
1108   struct reg_entry *reg;
1109
1110 #ifdef REGISTER_PREFIX
1111   if (*start != REGISTER_PREFIX)
1112     return NULL;
1113   start++;
1114 #endif
1115 #ifdef OPTIONAL_REGISTER_PREFIX
1116   if (*start == OPTIONAL_REGISTER_PREFIX)
1117     start++;
1118 #endif
1119
1120   p = start;
1121   if (!ISALPHA (*p) || !is_name_beginner (*p))
1122     return NULL;
1123
1124   do
1125     p++;
1126   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1127
1128   reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1129
1130   if (!reg)
1131     return NULL;
1132
1133   *ccp = p;
1134   return reg;
1135 }
1136
1137 static int
1138 arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1139                     enum arm_reg_type type)
1140 {
1141   /* Alternative syntaxes are accepted for a few register classes.  */
1142   switch (type)
1143     {
1144     case REG_TYPE_MVF:
1145     case REG_TYPE_MVD:
1146     case REG_TYPE_MVFX:
1147     case REG_TYPE_MVDX:
1148       /* Generic coprocessor register names are allowed for these.  */
1149       if (reg && reg->type == REG_TYPE_CN)
1150         return reg->number;
1151       break;
1152
1153     case REG_TYPE_CP:
1154       /* For backward compatibility, a bare number is valid here.  */
1155       {
1156         unsigned long processor = strtoul (start, ccp, 10);
1157         if (*ccp != start && processor <= 15)
1158           return processor;
1159       }
1160
1161     case REG_TYPE_MMXWC:
1162       /* WC includes WCG.  ??? I'm not sure this is true for all
1163          instructions that take WC registers.  */
1164       if (reg && reg->type == REG_TYPE_MMXWCG)
1165         return reg->number;
1166       break;
1167
1168     default:
1169       break;
1170     }
1171
1172   return FAIL;
1173 }
1174
1175 /* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1176    return value is the register number or FAIL.  */
1177
1178 static int
1179 arm_reg_parse (char **ccp, enum arm_reg_type type)
1180 {
1181   char *start = *ccp;
1182   struct reg_entry *reg = arm_reg_parse_multi (ccp);
1183   int ret;
1184
1185   /* Do not allow a scalar (reg+index) to parse as a register.  */
1186   if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1187     return FAIL;
1188
1189   if (reg && reg->type == type)
1190     return reg->number;
1191
1192   if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1193     return ret;
1194
1195   *ccp = start;
1196   return FAIL;
1197 }
1198
1199 /* Parse a Neon type specifier. *STR should point at the leading '.'
1200    character. Does no verification at this stage that the type fits the opcode
1201    properly. E.g.,
1202
1203      .i32.i32.s16
1204      .s32.f32
1205      .u16
1206
1207    Can all be legally parsed by this function.
1208
1209    Fills in neon_type struct pointer with parsed information, and updates STR
1210    to point after the parsed type specifier. Returns SUCCESS if this was a legal
1211    type, FAIL if not.  */
1212
1213 static int
1214 parse_neon_type (struct neon_type *type, char **str)
1215 {
1216   char *ptr = *str;
1217
1218   if (type)
1219     type->elems = 0;
1220
1221   while (type->elems < NEON_MAX_TYPE_ELS)
1222     {
1223       enum neon_el_type thistype = NT_untyped;
1224       unsigned thissize = -1u;
1225
1226       if (*ptr != '.')
1227         break;
1228
1229       ptr++;
1230
1231       /* Just a size without an explicit type.  */
1232       if (ISDIGIT (*ptr))
1233         goto parsesize;
1234
1235       switch (TOLOWER (*ptr))
1236         {
1237         case 'i': thistype = NT_integer; break;
1238         case 'f': thistype = NT_float; break;
1239         case 'p': thistype = NT_poly; break;
1240         case 's': thistype = NT_signed; break;
1241         case 'u': thistype = NT_unsigned; break;
1242         case 'd':
1243           thistype = NT_float;
1244           thissize = 64;
1245           ptr++;
1246           goto done;
1247         default:
1248           as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1249           return FAIL;
1250         }
1251
1252       ptr++;
1253
1254       /* .f is an abbreviation for .f32.  */
1255       if (thistype == NT_float && !ISDIGIT (*ptr))
1256         thissize = 32;
1257       else
1258         {
1259         parsesize:
1260           thissize = strtoul (ptr, &ptr, 10);
1261
1262           if (thissize != 8 && thissize != 16 && thissize != 32
1263               && thissize != 64)
1264             {
1265               as_bad (_("bad size %d in type specifier"), thissize);
1266               return FAIL;
1267             }
1268         }
1269
1270       done:
1271       if (type)
1272         {
1273           type->el[type->elems].type = thistype;
1274           type->el[type->elems].size = thissize;
1275           type->elems++;
1276         }
1277     }
1278
1279   /* Empty/missing type is not a successful parse.  */
1280   if (type->elems == 0)
1281     return FAIL;
1282
1283   *str = ptr;
1284
1285   return SUCCESS;
1286 }
1287
1288 /* Errors may be set multiple times during parsing or bit encoding
1289    (particularly in the Neon bits), but usually the earliest error which is set
1290    will be the most meaningful. Avoid overwriting it with later (cascading)
1291    errors by calling this function.  */
1292
1293 static void
1294 first_error (const char *err)
1295 {
1296   if (!inst.error)
1297     inst.error = err;
1298 }
1299
1300 /* Parse a single type, e.g. ".s32", leading period included.  */
1301 static int
1302 parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1303 {
1304   char *str = *ccp;
1305   struct neon_type optype;
1306
1307   if (*str == '.')
1308     {
1309       if (parse_neon_type (&optype, &str) == SUCCESS)
1310         {
1311           if (optype.elems == 1)
1312             *vectype = optype.el[0];
1313           else
1314             {
1315               first_error (_("only one type should be specified for operand"));
1316               return FAIL;
1317             }
1318         }
1319       else
1320         {
1321           first_error (_("vector type expected"));
1322           return FAIL;
1323         }
1324     }
1325   else
1326     return FAIL;
1327
1328   *ccp = str;
1329
1330   return SUCCESS;
1331 }
1332
1333 /* Special meanings for indices (which have a range of 0-7), which will fit into
1334    a 4-bit integer.  */
1335
1336 #define NEON_ALL_LANES          15
1337 #define NEON_INTERLEAVE_LANES   14
1338
1339 /* Parse either a register or a scalar, with an optional type. Return the
1340    register number, and optionally fill in the actual type of the register
1341    when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1342    type/index information in *TYPEINFO.  */
1343
1344 static int
1345 parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1346                            enum arm_reg_type *rtype,
1347                            struct neon_typed_alias *typeinfo)
1348 {
1349   char *str = *ccp;
1350   struct reg_entry *reg = arm_reg_parse_multi (&str);
1351   struct neon_typed_alias atype;
1352   struct neon_type_el parsetype;
1353
1354   atype.defined = 0;
1355   atype.index = -1;
1356   atype.eltype.type = NT_invtype;
1357   atype.eltype.size = -1;
1358
1359   /* Try alternate syntax for some types of register. Note these are mutually
1360      exclusive with the Neon syntax extensions.  */
1361   if (reg == NULL)
1362     {
1363       int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1364       if (altreg != FAIL)
1365         *ccp = str;
1366       if (typeinfo)
1367         *typeinfo = atype;
1368       return altreg;
1369     }
1370
1371   /* Undo polymorphism when a set of register types may be accepted.  */
1372   if ((type == REG_TYPE_NDQ
1373        && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1374       || (type == REG_TYPE_VFSD
1375           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1376       || (type == REG_TYPE_NSDQ
1377           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1378               || reg->type == REG_TYPE_NQ))
1379       || (type == REG_TYPE_MMXWC
1380           && (reg->type == REG_TYPE_MMXWCG)))
1381     type = (enum arm_reg_type) reg->type;
1382
1383   if (type != reg->type)
1384     return FAIL;
1385
1386   if (reg->neon)
1387     atype = *reg->neon;
1388
1389   if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1390     {
1391       if ((atype.defined & NTA_HASTYPE) != 0)
1392         {
1393           first_error (_("can't redefine type for operand"));
1394           return FAIL;
1395         }
1396       atype.defined |= NTA_HASTYPE;
1397       atype.eltype = parsetype;
1398     }
1399
1400   if (skip_past_char (&str, '[') == SUCCESS)
1401     {
1402       if (type != REG_TYPE_VFD)
1403         {
1404           first_error (_("only D registers may be indexed"));
1405           return FAIL;
1406         }
1407
1408       if ((atype.defined & NTA_HASINDEX) != 0)
1409         {
1410           first_error (_("can't change index for operand"));
1411           return FAIL;
1412         }
1413
1414       atype.defined |= NTA_HASINDEX;
1415
1416       if (skip_past_char (&str, ']') == SUCCESS)
1417         atype.index = NEON_ALL_LANES;
1418       else
1419         {
1420           expressionS exp;
1421
1422           my_get_expression (&exp, &str, GE_NO_PREFIX);
1423
1424           if (exp.X_op != O_constant)
1425             {
1426               first_error (_("constant expression required"));
1427               return FAIL;
1428             }
1429
1430           if (skip_past_char (&str, ']') == FAIL)
1431             return FAIL;
1432
1433           atype.index = exp.X_add_number;
1434         }
1435     }
1436
1437   if (typeinfo)
1438     *typeinfo = atype;
1439
1440   if (rtype)
1441     *rtype = type;
1442
1443   *ccp = str;
1444
1445   return reg->number;
1446 }
1447
1448 /* Like arm_reg_parse, but allow allow the following extra features:
1449     - If RTYPE is non-zero, return the (possibly restricted) type of the
1450       register (e.g. Neon double or quad reg when either has been requested).
1451     - If this is a Neon vector type with additional type information, fill
1452       in the struct pointed to by VECTYPE (if non-NULL).
1453    This function will fault on encountering a scalar.  */
1454
1455 static int
1456 arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1457                      enum arm_reg_type *rtype, struct neon_type_el *vectype)
1458 {
1459   struct neon_typed_alias atype;
1460   char *str = *ccp;
1461   int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1462
1463   if (reg == FAIL)
1464     return FAIL;
1465
1466   /* Do not allow a scalar (reg+index) to parse as a register.  */
1467   if ((atype.defined & NTA_HASINDEX) != 0)
1468     {
1469       first_error (_("register operand expected, but got scalar"));
1470       return FAIL;
1471     }
1472
1473   if (vectype)
1474     *vectype = atype.eltype;
1475
1476   *ccp = str;
1477
1478   return reg;
1479 }
1480
1481 #define NEON_SCALAR_REG(X)      ((X) >> 4)
1482 #define NEON_SCALAR_INDEX(X)    ((X) & 15)
1483
1484 /* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1485    have enough information to be able to do a good job bounds-checking. So, we
1486    just do easy checks here, and do further checks later.  */
1487
1488 static int
1489 parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
1490 {
1491   int reg;
1492   char *str = *ccp;
1493   struct neon_typed_alias atype;
1494
1495   reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
1496
1497   if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
1498     return FAIL;
1499
1500   if (atype.index == NEON_ALL_LANES)
1501     {
1502       first_error (_("scalar must have an index"));
1503       return FAIL;
1504     }
1505   else if (atype.index >= 64 / elsize)
1506     {
1507       first_error (_("scalar index out of range"));
1508       return FAIL;
1509     }
1510
1511   if (type)
1512     *type = atype.eltype;
1513
1514   *ccp = str;
1515
1516   return reg * 16 + atype.index;
1517 }
1518
1519 /* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
1520
1521 static long
1522 parse_reg_list (char ** strp)
1523 {
1524   char * str = * strp;
1525   long   range = 0;
1526   int    another_range;
1527
1528   /* We come back here if we get ranges concatenated by '+' or '|'.  */
1529   do
1530     {
1531       another_range = 0;
1532
1533       if (*str == '{')
1534         {
1535           int in_range = 0;
1536           int cur_reg = -1;
1537
1538           str++;
1539           do
1540             {
1541               int reg;
1542
1543               if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
1544                 {
1545                   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
1546                   return FAIL;
1547                 }
1548
1549               if (in_range)
1550                 {
1551                   int i;
1552
1553                   if (reg <= cur_reg)
1554                     {
1555                       first_error (_("bad range in register list"));
1556                       return FAIL;
1557                     }
1558
1559                   for (i = cur_reg + 1; i < reg; i++)
1560                     {
1561                       if (range & (1 << i))
1562                         as_tsktsk
1563                           (_("Warning: duplicated register (r%d) in register list"),
1564                            i);
1565                       else
1566                         range |= 1 << i;
1567                     }
1568                   in_range = 0;
1569                 }
1570
1571               if (range & (1 << reg))
1572                 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1573                            reg);
1574               else if (reg <= cur_reg)
1575                 as_tsktsk (_("Warning: register range not in ascending order"));
1576
1577               range |= 1 << reg;
1578               cur_reg = reg;
1579             }
1580           while (skip_past_comma (&str) != FAIL
1581                  || (in_range = 1, *str++ == '-'));
1582           str--;
1583
1584           if (*str++ != '}')
1585             {
1586               first_error (_("missing `}'"));
1587               return FAIL;
1588             }
1589         }
1590       else
1591         {
1592           expressionS exp;
1593
1594           if (my_get_expression (&exp, &str, GE_NO_PREFIX))
1595             return FAIL;
1596
1597           if (exp.X_op == O_constant)
1598             {
1599               if (exp.X_add_number
1600                   != (exp.X_add_number & 0x0000ffff))
1601                 {
1602                   inst.error = _("invalid register mask");
1603                   return FAIL;
1604                 }
1605
1606               if ((range & exp.X_add_number) != 0)
1607                 {
1608                   int regno = range & exp.X_add_number;
1609
1610                   regno &= -regno;
1611                   regno = (1 << regno) - 1;
1612                   as_tsktsk
1613                     (_("Warning: duplicated register (r%d) in register list"),
1614                      regno);
1615                 }
1616
1617               range |= exp.X_add_number;
1618             }
1619           else
1620             {
1621               if (inst.reloc.type != 0)
1622                 {
1623                   inst.error = _("expression too complex");
1624                   return FAIL;
1625                 }
1626
1627               memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
1628               inst.reloc.type = BFD_RELOC_ARM_MULTI;
1629               inst.reloc.pc_rel = 0;
1630             }
1631         }
1632
1633       if (*str == '|' || *str == '+')
1634         {
1635           str++;
1636           another_range = 1;
1637         }
1638     }
1639   while (another_range);
1640
1641   *strp = str;
1642   return range;
1643 }
1644
1645 /* Types of registers in a list.  */
1646
1647 enum reg_list_els
1648 {
1649   REGLIST_VFP_S,
1650   REGLIST_VFP_D,
1651   REGLIST_NEON_D
1652 };
1653
1654 /* Parse a VFP register list.  If the string is invalid return FAIL.
1655    Otherwise return the number of registers, and set PBASE to the first
1656    register.  Parses registers of type ETYPE.
1657    If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1658      - Q registers can be used to specify pairs of D registers
1659      - { } can be omitted from around a singleton register list
1660          FIXME: This is not implemented, as it would require backtracking in
1661          some cases, e.g.:
1662            vtbl.8 d3,d4,d5
1663          This could be done (the meaning isn't really ambiguous), but doesn't
1664          fit in well with the current parsing framework.
1665      - 32 D registers may be used (also true for VFPv3).
1666    FIXME: Types are ignored in these register lists, which is probably a
1667    bug.  */
1668
1669 static int
1670 parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
1671 {
1672   char *str = *ccp;
1673   int base_reg;
1674   int new_base;
1675   enum arm_reg_type regtype = (enum arm_reg_type) 0;
1676   int max_regs = 0;
1677   int count = 0;
1678   int warned = 0;
1679   unsigned long mask = 0;
1680   int i;
1681
1682   if (*str != '{')
1683     {
1684       inst.error = _("expecting {");
1685       return FAIL;
1686     }
1687
1688   str++;
1689
1690   switch (etype)
1691     {
1692     case REGLIST_VFP_S:
1693       regtype = REG_TYPE_VFS;
1694       max_regs = 32;
1695       break;
1696
1697     case REGLIST_VFP_D:
1698       regtype = REG_TYPE_VFD;
1699       break;
1700
1701     case REGLIST_NEON_D:
1702       regtype = REG_TYPE_NDQ;
1703       break;
1704     }
1705
1706   if (etype != REGLIST_VFP_S)
1707     {
1708       /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant.  */
1709       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
1710         {
1711           max_regs = 32;
1712           if (thumb_mode)
1713             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1714                                     fpu_vfp_ext_d32);
1715           else
1716             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1717                                     fpu_vfp_ext_d32);
1718         }
1719       else
1720         max_regs = 16;
1721     }
1722
1723   base_reg = max_regs;
1724
1725   do
1726     {
1727       int setmask = 1, addregs = 1;
1728
1729       new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
1730
1731       if (new_base == FAIL)
1732         {
1733           first_error (_(reg_expected_msgs[regtype]));
1734           return FAIL;
1735         }
1736
1737       if (new_base >= max_regs)
1738         {
1739           first_error (_("register out of range in list"));
1740           return FAIL;
1741         }
1742
1743       /* Note: a value of 2 * n is returned for the register Q<n>.  */
1744       if (regtype == REG_TYPE_NQ)
1745         {
1746           setmask = 3;
1747           addregs = 2;
1748         }
1749
1750       if (new_base < base_reg)
1751         base_reg = new_base;
1752
1753       if (mask & (setmask << new_base))
1754         {
1755           first_error (_("invalid register list"));
1756           return FAIL;
1757         }
1758
1759       if ((mask >> new_base) != 0 && ! warned)
1760         {
1761           as_tsktsk (_("register list not in ascending order"));
1762           warned = 1;
1763         }
1764
1765       mask |= setmask << new_base;
1766       count += addregs;
1767
1768       if (*str == '-') /* We have the start of a range expression */
1769         {
1770           int high_range;
1771
1772           str++;
1773
1774           if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
1775               == FAIL)
1776             {
1777               inst.error = gettext (reg_expected_msgs[regtype]);
1778               return FAIL;
1779             }
1780
1781           if (high_range >= max_regs)
1782             {
1783               first_error (_("register out of range in list"));
1784               return FAIL;
1785             }
1786
1787           if (regtype == REG_TYPE_NQ)
1788             high_range = high_range + 1;
1789
1790           if (high_range <= new_base)
1791             {
1792               inst.error = _("register range not in ascending order");
1793               return FAIL;
1794             }
1795
1796           for (new_base += addregs; new_base <= high_range; new_base += addregs)
1797             {
1798               if (mask & (setmask << new_base))
1799                 {
1800                   inst.error = _("invalid register list");
1801                   return FAIL;
1802                 }
1803
1804               mask |= setmask << new_base;
1805               count += addregs;
1806             }
1807         }
1808     }
1809   while (skip_past_comma (&str) != FAIL);
1810
1811   str++;
1812
1813   /* Sanity check -- should have raised a parse error above.  */
1814   if (count == 0 || count > max_regs)
1815     abort ();
1816
1817   *pbase = base_reg;
1818
1819   /* Final test -- the registers must be consecutive.  */
1820   mask >>= base_reg;
1821   for (i = 0; i < count; i++)
1822     {
1823       if ((mask & (1u << i)) == 0)
1824         {
1825           inst.error = _("non-contiguous register range");
1826           return FAIL;
1827         }
1828     }
1829
1830   *ccp = str;
1831
1832   return count;
1833 }
1834
1835 /* True if two alias types are the same.  */
1836
1837 static bfd_boolean
1838 neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1839 {
1840   if (!a && !b)
1841     return TRUE;
1842
1843   if (!a || !b)
1844     return FALSE;
1845
1846   if (a->defined != b->defined)
1847     return FALSE;
1848
1849   if ((a->defined & NTA_HASTYPE) != 0
1850       && (a->eltype.type != b->eltype.type
1851           || a->eltype.size != b->eltype.size))
1852     return FALSE;
1853
1854   if ((a->defined & NTA_HASINDEX) != 0
1855       && (a->index != b->index))
1856     return FALSE;
1857
1858   return TRUE;
1859 }
1860
1861 /* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1862    The base register is put in *PBASE.
1863    The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
1864    the return value.
1865    The register stride (minus one) is put in bit 4 of the return value.
1866    Bits [6:5] encode the list length (minus one).
1867    The type of the list elements is put in *ELTYPE, if non-NULL.  */
1868
1869 #define NEON_LANE(X)            ((X) & 0xf)
1870 #define NEON_REG_STRIDE(X)      ((((X) >> 4) & 1) + 1)
1871 #define NEON_REGLIST_LENGTH(X)  ((((X) >> 5) & 3) + 1)
1872
1873 static int
1874 parse_neon_el_struct_list (char **str, unsigned *pbase,
1875                            struct neon_type_el *eltype)
1876 {
1877   char *ptr = *str;
1878   int base_reg = -1;
1879   int reg_incr = -1;
1880   int count = 0;
1881   int lane = -1;
1882   int leading_brace = 0;
1883   enum arm_reg_type rtype = REG_TYPE_NDQ;
1884   int addregs = 1;
1885   const char *const incr_error = _("register stride must be 1 or 2");
1886   const char *const type_error = _("mismatched element/structure types in list");
1887   struct neon_typed_alias firsttype;
1888
1889   if (skip_past_char (&ptr, '{') == SUCCESS)
1890     leading_brace = 1;
1891
1892   do
1893     {
1894       struct neon_typed_alias atype;
1895       int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1896
1897       if (getreg == FAIL)
1898         {
1899           first_error (_(reg_expected_msgs[rtype]));
1900           return FAIL;
1901         }
1902
1903       if (base_reg == -1)
1904         {
1905           base_reg = getreg;
1906           if (rtype == REG_TYPE_NQ)
1907             {
1908               reg_incr = 1;
1909               addregs = 2;
1910             }
1911           firsttype = atype;
1912         }
1913       else if (reg_incr == -1)
1914         {
1915           reg_incr = getreg - base_reg;
1916           if (reg_incr < 1 || reg_incr > 2)
1917             {
1918               first_error (_(incr_error));
1919               return FAIL;
1920             }
1921         }
1922       else if (getreg != base_reg + reg_incr * count)
1923         {
1924           first_error (_(incr_error));
1925           return FAIL;
1926         }
1927
1928       if (! neon_alias_types_same (&atype, &firsttype))
1929         {
1930           first_error (_(type_error));
1931           return FAIL;
1932         }
1933
1934       /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
1935          modes.  */
1936       if (ptr[0] == '-')
1937         {
1938           struct neon_typed_alias htype;
1939           int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1940           if (lane == -1)
1941             lane = NEON_INTERLEAVE_LANES;
1942           else if (lane != NEON_INTERLEAVE_LANES)
1943             {
1944               first_error (_(type_error));
1945               return FAIL;
1946             }
1947           if (reg_incr == -1)
1948             reg_incr = 1;
1949           else if (reg_incr != 1)
1950             {
1951               first_error (_("don't use Rn-Rm syntax with non-unit stride"));
1952               return FAIL;
1953             }
1954           ptr++;
1955           hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
1956           if (hireg == FAIL)
1957             {
1958               first_error (_(reg_expected_msgs[rtype]));
1959               return FAIL;
1960             }
1961           if (! neon_alias_types_same (&htype, &firsttype))
1962             {
1963               first_error (_(type_error));
1964               return FAIL;
1965             }
1966           count += hireg + dregs - getreg;
1967           continue;
1968         }
1969
1970       /* If we're using Q registers, we can't use [] or [n] syntax.  */
1971       if (rtype == REG_TYPE_NQ)
1972         {
1973           count += 2;
1974           continue;
1975         }
1976
1977       if ((atype.defined & NTA_HASINDEX) != 0)
1978         {
1979           if (lane == -1)
1980             lane = atype.index;
1981           else if (lane != atype.index)
1982             {
1983               first_error (_(type_error));
1984               return FAIL;
1985             }
1986         }
1987       else if (lane == -1)
1988         lane = NEON_INTERLEAVE_LANES;
1989       else if (lane != NEON_INTERLEAVE_LANES)
1990         {
1991           first_error (_(type_error));
1992           return FAIL;
1993         }
1994       count++;
1995     }
1996   while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
1997
1998   /* No lane set by [x]. We must be interleaving structures.  */
1999   if (lane == -1)
2000     lane = NEON_INTERLEAVE_LANES;
2001
2002   /* Sanity check.  */
2003   if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2004       || (count > 1 && reg_incr == -1))
2005     {
2006       first_error (_("error parsing element/structure list"));
2007       return FAIL;
2008     }
2009
2010   if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2011     {
2012       first_error (_("expected }"));
2013       return FAIL;
2014     }
2015
2016   if (reg_incr == -1)
2017     reg_incr = 1;
2018
2019   if (eltype)
2020     *eltype = firsttype.eltype;
2021
2022   *pbase = base_reg;
2023   *str = ptr;
2024
2025   return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2026 }
2027
2028 /* Parse an explicit relocation suffix on an expression.  This is
2029    either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
2030    arm_reloc_hsh contains no entries, so this function can only
2031    succeed if there is no () after the word.  Returns -1 on error,
2032    BFD_RELOC_UNUSED if there wasn't any suffix.  */
2033 static int
2034 parse_reloc (char **str)
2035 {
2036   struct reloc_entry *r;
2037   char *p, *q;
2038
2039   if (**str != '(')
2040     return BFD_RELOC_UNUSED;
2041
2042   p = *str + 1;
2043   q = p;
2044
2045   while (*q && *q != ')' && *q != ',')
2046     q++;
2047   if (*q != ')')
2048     return -1;
2049
2050   if ((r = (struct reloc_entry *)
2051        hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
2052     return -1;
2053
2054   *str = q + 1;
2055   return r->reloc;
2056 }
2057
2058 /* Directives: register aliases.  */
2059
2060 static struct reg_entry *
2061 insert_reg_alias (char *str, int number, int type)
2062 {
2063   struct reg_entry *new_reg;
2064   const char *name;
2065
2066   if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
2067     {
2068       if (new_reg->builtin)
2069         as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
2070
2071       /* Only warn about a redefinition if it's not defined as the
2072          same register.  */
2073       else if (new_reg->number != number || new_reg->type != type)
2074         as_warn (_("ignoring redefinition of register alias '%s'"), str);
2075
2076       return NULL;
2077     }
2078
2079   name = xstrdup (str);
2080   new_reg = (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
2081
2082   new_reg->name = name;
2083   new_reg->number = number;
2084   new_reg->type = type;
2085   new_reg->builtin = FALSE;
2086   new_reg->neon = NULL;
2087
2088   if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
2089     abort ();
2090
2091   return new_reg;
2092 }
2093
2094 static void
2095 insert_neon_reg_alias (char *str, int number, int type,
2096                        struct neon_typed_alias *atype)
2097 {
2098   struct reg_entry *reg = insert_reg_alias (str, number, type);
2099
2100   if (!reg)
2101     {
2102       first_error (_("attempt to redefine typed alias"));
2103       return;
2104     }
2105
2106   if (atype)
2107     {
2108       reg->neon = (struct neon_typed_alias *)
2109           xmalloc (sizeof (struct neon_typed_alias));
2110       *reg->neon = *atype;
2111     }
2112 }
2113
2114 /* Look for the .req directive.  This is of the form:
2115
2116         new_register_name .req existing_register_name
2117
2118    If we find one, or if it looks sufficiently like one that we want to
2119    handle any error here, return TRUE.  Otherwise return FALSE.  */
2120
2121 static bfd_boolean
2122 create_register_alias (char * newname, char *p)
2123 {
2124   struct reg_entry *old;
2125   char *oldname, *nbuf;
2126   size_t nlen;
2127
2128   /* The input scrubber ensures that whitespace after the mnemonic is
2129      collapsed to single spaces.  */
2130   oldname = p;
2131   if (strncmp (oldname, " .req ", 6) != 0)
2132     return FALSE;
2133
2134   oldname += 6;
2135   if (*oldname == '\0')
2136     return FALSE;
2137
2138   old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
2139   if (!old)
2140     {
2141       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2142       return TRUE;
2143     }
2144
2145   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2146      the desired alias name, and p points to its end.  If not, then
2147      the desired alias name is in the global original_case_string.  */
2148 #ifdef TC_CASE_SENSITIVE
2149   nlen = p - newname;
2150 #else
2151   newname = original_case_string;
2152   nlen = strlen (newname);
2153 #endif
2154
2155   nbuf = (char *) alloca (nlen + 1);
2156   memcpy (nbuf, newname, nlen);
2157   nbuf[nlen] = '\0';
2158
2159   /* Create aliases under the new name as stated; an all-lowercase
2160      version of the new name; and an all-uppercase version of the new
2161      name.  */
2162   if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2163     {
2164       for (p = nbuf; *p; p++)
2165         *p = TOUPPER (*p);
2166
2167       if (strncmp (nbuf, newname, nlen))
2168         {
2169           /* If this attempt to create an additional alias fails, do not bother
2170              trying to create the all-lower case alias.  We will fail and issue
2171              a second, duplicate error message.  This situation arises when the
2172              programmer does something like:
2173                foo .req r0
2174                Foo .req r1
2175              The second .req creates the "Foo" alias but then fails to create
2176              the artificial FOO alias because it has already been created by the
2177              first .req.  */
2178           if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2179             return TRUE;
2180         }
2181
2182       for (p = nbuf; *p; p++)
2183         *p = TOLOWER (*p);
2184
2185       if (strncmp (nbuf, newname, nlen))
2186         insert_reg_alias (nbuf, old->number, old->type);
2187     }
2188
2189   return TRUE;
2190 }
2191
2192 /* Create a Neon typed/indexed register alias using directives, e.g.:
2193      X .dn d5.s32[1]
2194      Y .qn 6.s16
2195      Z .dn d7
2196      T .dn Z[0]
2197    These typed registers can be used instead of the types specified after the
2198    Neon mnemonic, so long as all operands given have types. Types can also be
2199    specified directly, e.g.:
2200      vadd d0.s32, d1.s32, d2.s32  */
2201
2202 static bfd_boolean
2203 create_neon_reg_alias (char *newname, char *p)
2204 {
2205   enum arm_reg_type basetype;
2206   struct reg_entry *basereg;
2207   struct reg_entry mybasereg;
2208   struct neon_type ntype;
2209   struct neon_typed_alias typeinfo;
2210   char *namebuf, *nameend;
2211   int namelen;
2212
2213   typeinfo.defined = 0;
2214   typeinfo.eltype.type = NT_invtype;
2215   typeinfo.eltype.size = -1;
2216   typeinfo.index = -1;
2217
2218   nameend = p;
2219
2220   if (strncmp (p, " .dn ", 5) == 0)
2221     basetype = REG_TYPE_VFD;
2222   else if (strncmp (p, " .qn ", 5) == 0)
2223     basetype = REG_TYPE_NQ;
2224   else
2225     return FALSE;
2226
2227   p += 5;
2228
2229   if (*p == '\0')
2230     return FALSE;
2231
2232   basereg = arm_reg_parse_multi (&p);
2233
2234   if (basereg && basereg->type != basetype)
2235     {
2236       as_bad (_("bad type for register"));
2237       return FALSE;
2238     }
2239
2240   if (basereg == NULL)
2241     {
2242       expressionS exp;
2243       /* Try parsing as an integer.  */
2244       my_get_expression (&exp, &p, GE_NO_PREFIX);
2245       if (exp.X_op != O_constant)
2246         {
2247           as_bad (_("expression must be constant"));
2248           return FALSE;
2249         }
2250       basereg = &mybasereg;
2251       basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2252                                                   : exp.X_add_number;
2253       basereg->neon = 0;
2254     }
2255
2256   if (basereg->neon)
2257     typeinfo = *basereg->neon;
2258
2259   if (parse_neon_type (&ntype, &p) == SUCCESS)
2260     {
2261       /* We got a type.  */
2262       if (typeinfo.defined & NTA_HASTYPE)
2263         {
2264           as_bad (_("can't redefine the type of a register alias"));
2265           return FALSE;
2266         }
2267
2268       typeinfo.defined |= NTA_HASTYPE;
2269       if (ntype.elems != 1)
2270         {
2271           as_bad (_("you must specify a single type only"));
2272           return FALSE;
2273         }
2274       typeinfo.eltype = ntype.el[0];
2275     }
2276
2277   if (skip_past_char (&p, '[') == SUCCESS)
2278     {
2279       expressionS exp;
2280       /* We got a scalar index.  */
2281
2282       if (typeinfo.defined & NTA_HASINDEX)
2283         {
2284           as_bad (_("can't redefine the index of a scalar alias"));
2285           return FALSE;
2286         }
2287
2288       my_get_expression (&exp, &p, GE_NO_PREFIX);
2289
2290       if (exp.X_op != O_constant)
2291         {
2292           as_bad (_("scalar index must be constant"));
2293           return FALSE;
2294         }
2295
2296       typeinfo.defined |= NTA_HASINDEX;
2297       typeinfo.index = exp.X_add_number;
2298
2299       if (skip_past_char (&p, ']') == FAIL)
2300         {
2301           as_bad (_("expecting ]"));
2302           return FALSE;
2303         }
2304     }
2305
2306   namelen = nameend - newname;
2307   namebuf = (char *) alloca (namelen + 1);
2308   strncpy (namebuf, newname, namelen);
2309   namebuf[namelen] = '\0';
2310
2311   insert_neon_reg_alias (namebuf, basereg->number, basetype,
2312                          typeinfo.defined != 0 ? &typeinfo : NULL);
2313
2314   /* Insert name in all uppercase.  */
2315   for (p = namebuf; *p; p++)
2316     *p = TOUPPER (*p);
2317
2318   if (strncmp (namebuf, newname, namelen))
2319     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2320                            typeinfo.defined != 0 ? &typeinfo : NULL);
2321
2322   /* Insert name in all lowercase.  */
2323   for (p = namebuf; *p; p++)
2324     *p = TOLOWER (*p);
2325
2326   if (strncmp (namebuf, newname, namelen))
2327     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2328                            typeinfo.defined != 0 ? &typeinfo : NULL);
2329
2330   return TRUE;
2331 }
2332
2333 /* Should never be called, as .req goes between the alias and the
2334    register name, not at the beginning of the line.  */
2335
2336 static void
2337 s_req (int a ATTRIBUTE_UNUSED)
2338 {
2339   as_bad (_("invalid syntax for .req directive"));
2340 }
2341
2342 static void
2343 s_dn (int a ATTRIBUTE_UNUSED)
2344 {
2345   as_bad (_("invalid syntax for .dn directive"));
2346 }
2347
2348 static void
2349 s_qn (int a ATTRIBUTE_UNUSED)
2350 {
2351   as_bad (_("invalid syntax for .qn directive"));
2352 }
2353
2354 /* The .unreq directive deletes an alias which was previously defined
2355    by .req.  For example:
2356
2357        my_alias .req r11
2358        .unreq my_alias    */
2359
2360 static void
2361 s_unreq (int a ATTRIBUTE_UNUSED)
2362 {
2363   char * name;
2364   char saved_char;
2365
2366   name = input_line_pointer;
2367
2368   while (*input_line_pointer != 0
2369          && *input_line_pointer != ' '
2370          && *input_line_pointer != '\n')
2371     ++input_line_pointer;
2372
2373   saved_char = *input_line_pointer;
2374   *input_line_pointer = 0;
2375
2376   if (!*name)
2377     as_bad (_("invalid syntax for .unreq directive"));
2378   else
2379     {
2380       struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2381                                                               name);
2382
2383       if (!reg)
2384         as_bad (_("unknown register alias '%s'"), name);
2385       else if (reg->builtin)
2386         as_warn (_("ignoring attempt to undefine built-in register '%s'"),
2387                  name);
2388       else
2389         {
2390           char * p;
2391           char * nbuf;
2392
2393           hash_delete (arm_reg_hsh, name, FALSE);
2394           free ((char *) reg->name);
2395           if (reg->neon)
2396             free (reg->neon);
2397           free (reg);
2398
2399           /* Also locate the all upper case and all lower case versions.
2400              Do not complain if we cannot find one or the other as it
2401              was probably deleted above.  */
2402
2403           nbuf = strdup (name);
2404           for (p = nbuf; *p; p++)
2405             *p = TOUPPER (*p);
2406           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2407           if (reg)
2408             {
2409               hash_delete (arm_reg_hsh, nbuf, FALSE);
2410               free ((char *) reg->name);
2411               if (reg->neon)
2412                 free (reg->neon);
2413               free (reg);
2414             }
2415
2416           for (p = nbuf; *p; p++)
2417             *p = TOLOWER (*p);
2418           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2419           if (reg)
2420             {
2421               hash_delete (arm_reg_hsh, nbuf, FALSE);
2422               free ((char *) reg->name);
2423               if (reg->neon)
2424                 free (reg->neon);
2425               free (reg);
2426             }
2427
2428           free (nbuf);
2429         }
2430     }
2431
2432   *input_line_pointer = saved_char;
2433   demand_empty_rest_of_line ();
2434 }
2435
2436 /* Directives: Instruction set selection.  */
2437
2438 #ifdef OBJ_ELF
2439 /* This code is to handle mapping symbols as defined in the ARM ELF spec.
2440    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2441    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2442    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
2443
2444 /* Create a new mapping symbol for the transition to STATE.  */
2445
2446 static void
2447 make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
2448 {
2449   symbolS * symbolP;
2450   const char * symname;
2451   int type;
2452
2453   switch (state)
2454     {
2455     case MAP_DATA:
2456       symname = "$d";
2457       type = BSF_NO_FLAGS;
2458       break;
2459     case MAP_ARM:
2460       symname = "$a";
2461       type = BSF_NO_FLAGS;
2462       break;
2463     case MAP_THUMB:
2464       symname = "$t";
2465       type = BSF_NO_FLAGS;
2466       break;
2467     default:
2468       abort ();
2469     }
2470
2471   symbolP = symbol_new (symname, now_seg, value, frag);
2472   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2473
2474   switch (state)
2475     {
2476     case MAP_ARM:
2477       THUMB_SET_FUNC (symbolP, 0);
2478       ARM_SET_THUMB (symbolP, 0);
2479       ARM_SET_INTERWORK (symbolP, support_interwork);
2480       break;
2481
2482     case MAP_THUMB:
2483       THUMB_SET_FUNC (symbolP, 1);
2484       ARM_SET_THUMB (symbolP, 1);
2485       ARM_SET_INTERWORK (symbolP, support_interwork);
2486       break;
2487
2488     case MAP_DATA:
2489     default:
2490       break;
2491     }
2492
2493   /* Save the mapping symbols for future reference.  Also check that
2494      we do not place two mapping symbols at the same offset within a
2495      frag.  We'll handle overlap between frags in
2496      check_mapping_symbols.  */
2497   if (value == 0)
2498     {
2499       know (frag->tc_frag_data.first_map == NULL);
2500       frag->tc_frag_data.first_map = symbolP;
2501     }
2502   if (frag->tc_frag_data.last_map != NULL)
2503     know (S_GET_VALUE (frag->tc_frag_data.last_map) < S_GET_VALUE (symbolP));
2504   frag->tc_frag_data.last_map = symbolP;
2505 }
2506
2507 /* We must sometimes convert a region marked as code to data during
2508    code alignment, if an odd number of bytes have to be padded.  The
2509    code mapping symbol is pushed to an aligned address.  */
2510
2511 static void
2512 insert_data_mapping_symbol (enum mstate state,
2513                             valueT value, fragS *frag, offsetT bytes)
2514 {
2515   /* If there was already a mapping symbol, remove it.  */
2516   if (frag->tc_frag_data.last_map != NULL
2517       && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2518     {
2519       symbolS *symp = frag->tc_frag_data.last_map;
2520
2521       if (value == 0)
2522         {
2523           know (frag->tc_frag_data.first_map == symp);
2524           frag->tc_frag_data.first_map = NULL;
2525         }
2526       frag->tc_frag_data.last_map = NULL;
2527       symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2528     }
2529
2530   make_mapping_symbol (MAP_DATA, value, frag);
2531   make_mapping_symbol (state, value + bytes, frag);
2532 }
2533
2534 static void mapping_state_2 (enum mstate state, int max_chars);
2535
2536 /* Set the mapping state to STATE.  Only call this when about to
2537    emit some STATE bytes to the file.  */
2538
2539 void
2540 mapping_state (enum mstate state)
2541 {
2542   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2543
2544 #define TRANSITION(from, to) (mapstate == (from) && state == (to))
2545
2546   if (mapstate == state)
2547     /* The mapping symbol has already been emitted.
2548        There is nothing else to do.  */
2549     return;
2550   else if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
2551     /* This case will be evaluated later in the next else.  */
2552     return;
2553   else if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2554           || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2555     {
2556       /* Only add the symbol if the offset is > 0:
2557          if we're at the first frag, check it's size > 0;
2558          if we're not at the first frag, then for sure
2559             the offset is > 0.  */
2560       struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2561       const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2562
2563       if (add_symbol)
2564         make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2565     }
2566
2567   mapping_state_2 (state, 0);
2568 #undef TRANSITION
2569 }
2570
2571 /* Same as mapping_state, but MAX_CHARS bytes have already been
2572    allocated.  Put the mapping symbol that far back.  */
2573
2574 static void
2575 mapping_state_2 (enum mstate state, int max_chars)
2576 {
2577   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2578
2579   if (!SEG_NORMAL (now_seg))
2580     return;
2581
2582   if (mapstate == state)
2583     /* The mapping symbol has already been emitted.
2584        There is nothing else to do.  */
2585     return;
2586
2587   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2588   make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
2589 }
2590 #else
2591 #define mapping_state(x) ((void)0)
2592 #define mapping_state_2(x, y) ((void)0)
2593 #endif
2594
2595 /* Find the real, Thumb encoded start of a Thumb function.  */
2596
2597 #ifdef OBJ_COFF
2598 static symbolS *
2599 find_real_start (symbolS * symbolP)
2600 {
2601   char *       real_start;
2602   const char * name = S_GET_NAME (symbolP);
2603   symbolS *    new_target;
2604
2605   /* This definition must agree with the one in gcc/config/arm/thumb.c.  */
2606 #define STUB_NAME ".real_start_of"
2607
2608   if (name == NULL)
2609     abort ();
2610
2611   /* The compiler may generate BL instructions to local labels because
2612      it needs to perform a branch to a far away location. These labels
2613      do not have a corresponding ".real_start_of" label.  We check
2614      both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2615      the ".real_start_of" convention for nonlocal branches.  */
2616   if (S_IS_LOCAL (symbolP) || name[0] == '.')
2617     return symbolP;
2618
2619   real_start = ACONCAT ((STUB_NAME, name, NULL));
2620   new_target = symbol_find (real_start);
2621
2622   if (new_target == NULL)
2623     {
2624       as_warn (_("Failed to find real start of function: %s\n"), name);
2625       new_target = symbolP;
2626     }
2627
2628   return new_target;
2629 }
2630 #endif
2631
2632 static void
2633 opcode_select (int width)
2634 {
2635   switch (width)
2636     {
2637     case 16:
2638       if (! thumb_mode)
2639         {
2640           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
2641             as_bad (_("selected processor does not support THUMB opcodes"));
2642
2643           thumb_mode = 1;
2644           /* No need to force the alignment, since we will have been
2645              coming from ARM mode, which is word-aligned.  */
2646           record_alignment (now_seg, 1);
2647         }
2648       break;
2649
2650     case 32:
2651       if (thumb_mode)
2652         {
2653           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
2654             as_bad (_("selected processor does not support ARM opcodes"));
2655
2656           thumb_mode = 0;
2657
2658           if (!need_pass_2)
2659             frag_align (2, 0, 0);
2660
2661           record_alignment (now_seg, 1);
2662         }
2663       break;
2664
2665     default:
2666       as_bad (_("invalid instruction size selected (%d)"), width);
2667     }
2668 }
2669
2670 static void
2671 s_arm (int ignore ATTRIBUTE_UNUSED)
2672 {
2673   opcode_select (32);
2674   demand_empty_rest_of_line ();
2675 }
2676
2677 static void
2678 s_thumb (int ignore ATTRIBUTE_UNUSED)
2679 {
2680   opcode_select (16);
2681   demand_empty_rest_of_line ();
2682 }
2683
2684 static void
2685 s_code (int unused ATTRIBUTE_UNUSED)
2686 {
2687   int temp;
2688
2689   temp = get_absolute_expression ();
2690   switch (temp)
2691     {
2692     case 16:
2693     case 32:
2694       opcode_select (temp);
2695       break;
2696
2697     default:
2698       as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2699     }
2700 }
2701
2702 static void
2703 s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2704 {
2705   /* If we are not already in thumb mode go into it, EVEN if
2706      the target processor does not support thumb instructions.
2707      This is used by gcc/config/arm/lib1funcs.asm for example
2708      to compile interworking support functions even if the
2709      target processor should not support interworking.  */
2710   if (! thumb_mode)
2711     {
2712       thumb_mode = 2;
2713       record_alignment (now_seg, 1);
2714     }
2715
2716   demand_empty_rest_of_line ();
2717 }
2718
2719 static void
2720 s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2721 {
2722   s_thumb (0);
2723
2724   /* The following label is the name/address of the start of a Thumb function.
2725      We need to know this for the interworking support.  */
2726   label_is_thumb_function_name = TRUE;
2727 }
2728
2729 /* Perform a .set directive, but also mark the alias as
2730    being a thumb function.  */
2731
2732 static void
2733 s_thumb_set (int equiv)
2734 {
2735   /* XXX the following is a duplicate of the code for s_set() in read.c
2736      We cannot just call that code as we need to get at the symbol that
2737      is created.  */
2738   char *    name;
2739   char      delim;
2740   char *    end_name;
2741   symbolS * symbolP;
2742
2743   /* Especial apologies for the random logic:
2744      This just grew, and could be parsed much more simply!
2745      Dean - in haste.  */
2746   name      = input_line_pointer;
2747   delim     = get_symbol_end ();
2748   end_name  = input_line_pointer;
2749   *end_name = delim;
2750
2751   if (*input_line_pointer != ',')
2752     {
2753       *end_name = 0;
2754       as_bad (_("expected comma after name \"%s\""), name);
2755       *end_name = delim;
2756       ignore_rest_of_line ();
2757       return;
2758     }
2759
2760   input_line_pointer++;
2761   *end_name = 0;
2762
2763   if (name[0] == '.' && name[1] == '\0')
2764     {
2765       /* XXX - this should not happen to .thumb_set.  */
2766       abort ();
2767     }
2768
2769   if ((symbolP = symbol_find (name)) == NULL
2770       && (symbolP = md_undefined_symbol (name)) == NULL)
2771     {
2772 #ifndef NO_LISTING
2773       /* When doing symbol listings, play games with dummy fragments living
2774          outside the normal fragment chain to record the file and line info
2775          for this symbol.  */
2776       if (listing & LISTING_SYMBOLS)
2777         {
2778           extern struct list_info_struct * listing_tail;
2779           fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
2780
2781           memset (dummy_frag, 0, sizeof (fragS));
2782           dummy_frag->fr_type = rs_fill;
2783           dummy_frag->line = listing_tail;
2784           symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2785           dummy_frag->fr_symbol = symbolP;
2786         }
2787       else
2788 #endif
2789         symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2790
2791 #ifdef OBJ_COFF
2792       /* "set" symbols are local unless otherwise specified.  */
2793       SF_SET_LOCAL (symbolP);
2794 #endif /* OBJ_COFF  */
2795     }                           /* Make a new symbol.  */
2796
2797   symbol_table_insert (symbolP);
2798
2799   * end_name = delim;
2800
2801   if (equiv
2802       && S_IS_DEFINED (symbolP)
2803       && S_GET_SEGMENT (symbolP) != reg_section)
2804     as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2805
2806   pseudo_set (symbolP);
2807
2808   demand_empty_rest_of_line ();
2809
2810   /* XXX Now we come to the Thumb specific bit of code.  */
2811
2812   THUMB_SET_FUNC (symbolP, 1);
2813   ARM_SET_THUMB (symbolP, 1);
2814 #if defined OBJ_ELF || defined OBJ_COFF
2815   ARM_SET_INTERWORK (symbolP, support_interwork);
2816 #endif
2817 }
2818
2819 /* Directives: Mode selection.  */
2820
2821 /* .syntax [unified|divided] - choose the new unified syntax
2822    (same for Arm and Thumb encoding, modulo slight differences in what
2823    can be represented) or the old divergent syntax for each mode.  */
2824 static void
2825 s_syntax (int unused ATTRIBUTE_UNUSED)
2826 {
2827   char *name, delim;
2828
2829   name = input_line_pointer;
2830   delim = get_symbol_end ();
2831
2832   if (!strcasecmp (name, "unified"))
2833     unified_syntax = TRUE;
2834   else if (!strcasecmp (name, "divided"))
2835     unified_syntax = FALSE;
2836   else
2837     {
2838       as_bad (_("unrecognized syntax mode \"%s\""), name);
2839       return;
2840     }
2841   *input_line_pointer = delim;
2842   demand_empty_rest_of_line ();
2843 }
2844
2845 /* Directives: sectioning and alignment.  */
2846
2847 /* Same as s_align_ptwo but align 0 => align 2.  */
2848
2849 static void
2850 s_align (int unused ATTRIBUTE_UNUSED)
2851 {
2852   int temp;
2853   bfd_boolean fill_p;
2854   long temp_fill;
2855   long max_alignment = 15;
2856
2857   temp = get_absolute_expression ();
2858   if (temp > max_alignment)
2859     as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2860   else if (temp < 0)
2861     {
2862       as_bad (_("alignment negative. 0 assumed."));
2863       temp = 0;
2864     }
2865
2866   if (*input_line_pointer == ',')
2867     {
2868       input_line_pointer++;
2869       temp_fill = get_absolute_expression ();
2870       fill_p = TRUE;
2871     }
2872   else
2873     {
2874       fill_p = FALSE;
2875       temp_fill = 0;
2876     }
2877
2878   if (!temp)
2879     temp = 2;
2880
2881   /* Only make a frag if we HAVE to.  */
2882   if (temp && !need_pass_2)
2883     {
2884       if (!fill_p && subseg_text_p (now_seg))
2885         frag_align_code (temp, 0);
2886       else
2887         frag_align (temp, (int) temp_fill, 0);
2888     }
2889   demand_empty_rest_of_line ();
2890
2891   record_alignment (now_seg, temp);
2892 }
2893
2894 static void
2895 s_bss (int ignore ATTRIBUTE_UNUSED)
2896 {
2897   /* We don't support putting frags in the BSS segment, we fake it by
2898      marking in_bss, then looking at s_skip for clues.  */
2899   subseg_set (bss_section, 0);
2900   demand_empty_rest_of_line ();
2901
2902 #ifdef md_elf_section_change_hook
2903   md_elf_section_change_hook ();
2904 #endif
2905 }
2906
2907 static void
2908 s_even (int ignore ATTRIBUTE_UNUSED)
2909 {
2910   /* Never make frag if expect extra pass.  */
2911   if (!need_pass_2)
2912     frag_align (1, 0, 0);
2913
2914   record_alignment (now_seg, 1);
2915
2916   demand_empty_rest_of_line ();
2917 }
2918
2919 /* Directives: Literal pools.  */
2920
2921 static literal_pool *
2922 find_literal_pool (void)
2923 {
2924   literal_pool * pool;
2925
2926   for (pool = list_of_pools; pool != NULL; pool = pool->next)
2927     {
2928       if (pool->section == now_seg
2929           && pool->sub_section == now_subseg)
2930         break;
2931     }
2932
2933   return pool;
2934 }
2935
2936 static literal_pool *
2937 find_or_make_literal_pool (void)
2938 {
2939   /* Next literal pool ID number.  */
2940   static unsigned int latest_pool_num = 1;
2941   literal_pool *      pool;
2942
2943   pool = find_literal_pool ();
2944
2945   if (pool == NULL)
2946     {
2947       /* Create a new pool.  */
2948       pool = (literal_pool *) xmalloc (sizeof (* pool));
2949       if (! pool)
2950         return NULL;
2951
2952       pool->next_free_entry = 0;
2953       pool->section         = now_seg;
2954       pool->sub_section     = now_subseg;
2955       pool->next            = list_of_pools;
2956       pool->symbol          = NULL;
2957
2958       /* Add it to the list.  */
2959       list_of_pools = pool;
2960     }
2961
2962   /* New pools, and emptied pools, will have a NULL symbol.  */
2963   if (pool->symbol == NULL)
2964     {
2965       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
2966                                     (valueT) 0, &zero_address_frag);
2967       pool->id = latest_pool_num ++;
2968     }
2969
2970   /* Done.  */
2971   return pool;
2972 }
2973
2974 /* Add the literal in the global 'inst'
2975    structure to the relevant literal pool.  */
2976
2977 static int
2978 add_to_lit_pool (void)
2979 {
2980   literal_pool * pool;
2981   unsigned int entry;
2982
2983   pool = find_or_make_literal_pool ();
2984
2985   /* Check if this literal value is already in the pool.  */
2986   for (entry = 0; entry < pool->next_free_entry; entry ++)
2987     {
2988       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
2989           && (inst.reloc.exp.X_op == O_constant)
2990           && (pool->literals[entry].X_add_number
2991               == inst.reloc.exp.X_add_number)
2992           && (pool->literals[entry].X_unsigned
2993               == inst.reloc.exp.X_unsigned))
2994         break;
2995
2996       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
2997           && (inst.reloc.exp.X_op == O_symbol)
2998           && (pool->literals[entry].X_add_number
2999               == inst.reloc.exp.X_add_number)
3000           && (pool->literals[entry].X_add_symbol
3001               == inst.reloc.exp.X_add_symbol)
3002           && (pool->literals[entry].X_op_symbol
3003               == inst.reloc.exp.X_op_symbol))
3004         break;
3005     }
3006
3007   /* Do we need to create a new entry?  */
3008   if (entry == pool->next_free_entry)
3009     {
3010       if (entry >= MAX_LITERAL_POOL_SIZE)
3011         {
3012           inst.error = _("literal pool overflow");
3013           return FAIL;
3014         }
3015
3016       pool->literals[entry] = inst.reloc.exp;
3017       pool->next_free_entry += 1;
3018     }
3019
3020   inst.reloc.exp.X_op         = O_symbol;
3021   inst.reloc.exp.X_add_number = ((int) entry) * 4;
3022   inst.reloc.exp.X_add_symbol = pool->symbol;
3023
3024   return SUCCESS;
3025 }
3026
3027 /* Can't use symbol_new here, so have to create a symbol and then at
3028    a later date assign it a value. Thats what these functions do.  */
3029
3030 static void
3031 symbol_locate (symbolS *    symbolP,
3032                const char * name,       /* It is copied, the caller can modify.  */
3033                segT         segment,    /* Segment identifier (SEG_<something>).  */
3034                valueT       valu,       /* Symbol value.  */
3035                fragS *      frag)       /* Associated fragment.  */
3036 {
3037   unsigned int name_length;
3038   char * preserved_copy_of_name;
3039
3040   name_length = strlen (name) + 1;   /* +1 for \0.  */
3041   obstack_grow (&notes, name, name_length);
3042   preserved_copy_of_name = (char *) obstack_finish (&notes);
3043
3044 #ifdef tc_canonicalize_symbol_name
3045   preserved_copy_of_name =
3046     tc_canonicalize_symbol_name (preserved_copy_of_name);
3047 #endif
3048
3049   S_SET_NAME (symbolP, preserved_copy_of_name);
3050
3051   S_SET_SEGMENT (symbolP, segment);
3052   S_SET_VALUE (symbolP, valu);
3053   symbol_clear_list_pointers (symbolP);
3054
3055   symbol_set_frag (symbolP, frag);
3056
3057   /* Link to end of symbol chain.  */
3058   {
3059     extern int symbol_table_frozen;
3060
3061     if (symbol_table_frozen)
3062       abort ();
3063   }
3064
3065   symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
3066
3067   obj_symbol_new_hook (symbolP);
3068
3069 #ifdef tc_symbol_new_hook
3070   tc_symbol_new_hook (symbolP);
3071 #endif
3072
3073 #ifdef DEBUG_SYMS
3074   verify_symbol_chain (symbol_rootP, symbol_lastP);
3075 #endif /* DEBUG_SYMS  */
3076 }
3077
3078
3079 static void
3080 s_ltorg (int ignored ATTRIBUTE_UNUSED)
3081 {
3082   unsigned int entry;
3083   literal_pool * pool;
3084   char sym_name[20];
3085
3086   pool = find_literal_pool ();
3087   if (pool == NULL
3088       || pool->symbol == NULL
3089       || pool->next_free_entry == 0)
3090     return;
3091
3092   mapping_state (MAP_DATA);
3093
3094   /* Align pool as you have word accesses.
3095      Only make a frag if we have to.  */
3096   if (!need_pass_2)
3097     frag_align (2, 0, 0);
3098
3099   record_alignment (now_seg, 2);
3100
3101   sprintf (sym_name, "$$lit_\002%x", pool->id);
3102
3103   symbol_locate (pool->symbol, sym_name, now_seg,
3104                  (valueT) frag_now_fix (), frag_now);
3105   symbol_table_insert (pool->symbol);
3106
3107   ARM_SET_THUMB (pool->symbol, thumb_mode);
3108
3109 #if defined OBJ_COFF || defined OBJ_ELF
3110   ARM_SET_INTERWORK (pool->symbol, support_interwork);
3111 #endif
3112
3113   for (entry = 0; entry < pool->next_free_entry; entry ++)
3114     /* First output the expression in the instruction to the pool.  */
3115     emit_expr (&(pool->literals[entry]), 4); /* .word  */
3116
3117   /* Mark the pool as empty.  */
3118   pool->next_free_entry = 0;
3119   pool->symbol = NULL;
3120 }
3121
3122 #ifdef OBJ_ELF
3123 /* Forward declarations for functions below, in the MD interface
3124    section.  */
3125 static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3126 static valueT create_unwind_entry (int);
3127 static void start_unwind_section (const segT, int);
3128 static void add_unwind_opcode (valueT, int);
3129 static void flush_pending_unwind (void);
3130
3131 /* Directives: Data.  */
3132
3133 static void
3134 s_arm_elf_cons (int nbytes)
3135 {
3136   expressionS exp;
3137
3138 #ifdef md_flush_pending_output
3139   md_flush_pending_output ();
3140 #endif
3141
3142   if (is_it_end_of_statement ())
3143     {
3144       demand_empty_rest_of_line ();
3145       return;
3146     }
3147
3148 #ifdef md_cons_align
3149   md_cons_align (nbytes);
3150 #endif
3151
3152   mapping_state (MAP_DATA);
3153   do
3154     {
3155       int reloc;
3156       char *base = input_line_pointer;
3157
3158       expression (& exp);
3159
3160       if (exp.X_op != O_symbol)
3161         emit_expr (&exp, (unsigned int) nbytes);
3162       else
3163         {
3164           char *before_reloc = input_line_pointer;
3165           reloc = parse_reloc (&input_line_pointer);
3166           if (reloc == -1)
3167             {
3168               as_bad (_("unrecognized relocation suffix"));
3169               ignore_rest_of_line ();
3170               return;
3171             }
3172           else if (reloc == BFD_RELOC_UNUSED)
3173             emit_expr (&exp, (unsigned int) nbytes);
3174           else
3175             {
3176               reloc_howto_type *howto = (reloc_howto_type *)
3177                   bfd_reloc_type_lookup (stdoutput,
3178                                          (bfd_reloc_code_real_type) reloc);
3179               int size = bfd_get_reloc_size (howto);
3180
3181               if (reloc == BFD_RELOC_ARM_PLT32)
3182                 {
3183                   as_bad (_("(plt) is only valid on branch targets"));
3184                   reloc = BFD_RELOC_UNUSED;
3185                   size = 0;
3186                 }
3187
3188               if (size > nbytes)
3189                 as_bad (_("%s relocations do not fit in %d bytes"),
3190                         howto->name, nbytes);
3191               else
3192                 {
3193                   /* We've parsed an expression stopping at O_symbol.
3194                      But there may be more expression left now that we
3195                      have parsed the relocation marker.  Parse it again.
3196                      XXX Surely there is a cleaner way to do this.  */
3197                   char *p = input_line_pointer;
3198                   int offset;
3199                   char *save_buf = (char *) alloca (input_line_pointer - base);
3200                   memcpy (save_buf, base, input_line_pointer - base);
3201                   memmove (base + (input_line_pointer - before_reloc),
3202                            base, before_reloc - base);
3203
3204                   input_line_pointer = base + (input_line_pointer-before_reloc);
3205                   expression (&exp);
3206                   memcpy (base, save_buf, p - base);
3207
3208                   offset = nbytes - size;
3209                   p = frag_more ((int) nbytes);
3210                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
3211                                size, &exp, 0, (enum bfd_reloc_code_real) reloc);
3212                 }
3213             }
3214         }
3215     }
3216   while (*input_line_pointer++ == ',');
3217
3218   /* Put terminator back into stream.  */
3219   input_line_pointer --;
3220   demand_empty_rest_of_line ();
3221 }
3222
3223 /* Emit an expression containing a 32-bit thumb instruction.
3224    Implementation based on put_thumb32_insn.  */
3225
3226 static void
3227 emit_thumb32_expr (expressionS * exp)
3228 {
3229   expressionS exp_high = *exp;
3230
3231   exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3232   emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3233   exp->X_add_number &= 0xffff;
3234   emit_expr (exp, (unsigned int) THUMB_SIZE);
3235 }
3236
3237 /*  Guess the instruction size based on the opcode.  */
3238
3239 static int
3240 thumb_insn_size (int opcode)
3241 {
3242   if ((unsigned int) opcode < 0xe800u)
3243     return 2;
3244   else if ((unsigned int) opcode >= 0xe8000000u)
3245     return 4;
3246   else
3247     return 0;
3248 }
3249
3250 static bfd_boolean
3251 emit_insn (expressionS *exp, int nbytes)
3252 {
3253   int size = 0;
3254
3255   if (exp->X_op == O_constant)
3256     {
3257       size = nbytes;
3258
3259       if (size == 0)
3260         size = thumb_insn_size (exp->X_add_number);
3261
3262       if (size != 0)
3263         {
3264           if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3265             {
3266               as_bad (_(".inst.n operand too big. "\
3267                         "Use .inst.w instead"));
3268               size = 0;
3269             }
3270           else
3271             {
3272               if (now_it.state == AUTOMATIC_IT_BLOCK)
3273                 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3274               else
3275                 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3276
3277               if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3278                 emit_thumb32_expr (exp);
3279               else
3280                 emit_expr (exp, (unsigned int) size);
3281
3282               it_fsm_post_encode ();
3283             }
3284         }
3285       else
3286         as_bad (_("cannot determine Thumb instruction size. "   \
3287                   "Use .inst.n/.inst.w instead"));
3288     }
3289   else
3290     as_bad (_("constant expression required"));
3291
3292   return (size != 0);
3293 }
3294
3295 /* Like s_arm_elf_cons but do not use md_cons_align and
3296    set the mapping state to MAP_ARM/MAP_THUMB.  */
3297
3298 static void
3299 s_arm_elf_inst (int nbytes)
3300 {
3301   if (is_it_end_of_statement ())
3302     {
3303       demand_empty_rest_of_line ();
3304       return;
3305     }
3306
3307   /* Calling mapping_state () here will not change ARM/THUMB,
3308      but will ensure not to be in DATA state.  */
3309
3310   if (thumb_mode)
3311     mapping_state (MAP_THUMB);
3312   else
3313     {
3314       if (nbytes != 0)
3315         {
3316           as_bad (_("width suffixes are invalid in ARM mode"));
3317           ignore_rest_of_line ();
3318           return;
3319         }
3320
3321       nbytes = 4;
3322
3323       mapping_state (MAP_ARM);
3324     }
3325
3326   do
3327     {
3328       expressionS exp;
3329
3330       expression (& exp);
3331
3332       if (! emit_insn (& exp, nbytes))
3333         {
3334           ignore_rest_of_line ();
3335           return;
3336         }
3337     }
3338   while (*input_line_pointer++ == ',');
3339
3340   /* Put terminator back into stream.  */
3341   input_line_pointer --;
3342   demand_empty_rest_of_line ();
3343 }
3344
3345 /* Parse a .rel31 directive.  */
3346
3347 static void
3348 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3349 {
3350   expressionS exp;
3351   char *p;
3352   valueT highbit;
3353
3354   highbit = 0;
3355   if (*input_line_pointer == '1')
3356     highbit = 0x80000000;
3357   else if (*input_line_pointer != '0')
3358     as_bad (_("expected 0 or 1"));
3359
3360   input_line_pointer++;
3361   if (*input_line_pointer != ',')
3362     as_bad (_("missing comma"));
3363   input_line_pointer++;
3364
3365 #ifdef md_flush_pending_output
3366   md_flush_pending_output ();
3367 #endif
3368
3369 #ifdef md_cons_align
3370   md_cons_align (4);
3371 #endif
3372
3373   mapping_state (MAP_DATA);
3374
3375   expression (&exp);
3376
3377   p = frag_more (4);
3378   md_number_to_chars (p, highbit, 4);
3379   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3380                BFD_RELOC_ARM_PREL31);
3381
3382   demand_empty_rest_of_line ();
3383 }
3384
3385 /* Directives: AEABI stack-unwind tables.  */
3386
3387 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
3388
3389 static void
3390 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3391 {
3392   demand_empty_rest_of_line ();
3393   if (unwind.proc_start)
3394     {
3395       as_bad (_("duplicate .fnstart directive"));
3396       return;
3397     }
3398
3399   /* Mark the start of the function.  */
3400   unwind.proc_start = expr_build_dot ();
3401
3402   /* Reset the rest of the unwind info.  */
3403   unwind.opcode_count = 0;
3404   unwind.table_entry = NULL;
3405   unwind.personality_routine = NULL;
3406   unwind.personality_index = -1;
3407   unwind.frame_size = 0;
3408   unwind.fp_offset = 0;
3409   unwind.fp_reg = REG_SP;
3410   unwind.fp_used = 0;
3411   unwind.sp_restored = 0;
3412 }
3413
3414
3415 /* Parse a handlerdata directive.  Creates the exception handling table entry
3416    for the function.  */
3417
3418 static void
3419 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3420 {
3421   demand_empty_rest_of_line ();
3422   if (!unwind.proc_start)
3423     as_bad (MISSING_FNSTART);
3424
3425   if (unwind.table_entry)
3426     as_bad (_("duplicate .handlerdata directive"));
3427
3428   create_unwind_entry (1);
3429 }
3430
3431 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
3432
3433 static void
3434 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3435 {
3436   long where;
3437   char *ptr;
3438   valueT val;
3439   unsigned int marked_pr_dependency;
3440
3441   demand_empty_rest_of_line ();
3442
3443   if (!unwind.proc_start)
3444     {
3445       as_bad (_(".fnend directive without .fnstart"));
3446       return;
3447     }
3448
3449   /* Add eh table entry.  */
3450   if (unwind.table_entry == NULL)
3451     val = create_unwind_entry (0);
3452   else
3453     val = 0;
3454
3455   /* Add index table entry.  This is two words.  */
3456   start_unwind_section (unwind.saved_seg, 1);
3457   frag_align (2, 0, 0);
3458   record_alignment (now_seg, 2);
3459
3460   ptr = frag_more (8);
3461   where = frag_now_fix () - 8;
3462
3463   /* Self relative offset of the function start.  */
3464   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3465            BFD_RELOC_ARM_PREL31);
3466
3467   /* Indicate dependency on EHABI-defined personality routines to the
3468      linker, if it hasn't been done already.  */
3469   marked_pr_dependency
3470     = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
3471   if (unwind.personality_index >= 0 && unwind.personality_index < 3
3472       && !(marked_pr_dependency & (1 << unwind.personality_index)))
3473     {
3474       static const char *const name[] =
3475         {
3476           "__aeabi_unwind_cpp_pr0",
3477           "__aeabi_unwind_cpp_pr1",
3478           "__aeabi_unwind_cpp_pr2"
3479         };
3480       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3481       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3482       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3483         |= 1 << unwind.personality_index;
3484     }
3485
3486   if (val)
3487     /* Inline exception table entry.  */
3488     md_number_to_chars (ptr + 4, val, 4);
3489   else
3490     /* Self relative offset of the table entry.  */
3491     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3492              BFD_RELOC_ARM_PREL31);
3493
3494   /* Restore the original section.  */
3495   subseg_set (unwind.saved_seg, unwind.saved_subseg);
3496
3497   unwind.proc_start = NULL;
3498 }
3499
3500
3501 /* Parse an unwind_cantunwind directive.  */
3502
3503 static void
3504 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3505 {
3506   demand_empty_rest_of_line ();
3507   if (!unwind.proc_start)
3508     as_bad (MISSING_FNSTART);
3509
3510   if (unwind.personality_routine || unwind.personality_index != -1)
3511     as_bad (_("personality routine specified for cantunwind frame"));
3512
3513   unwind.personality_index = -2;
3514 }
3515
3516
3517 /* Parse a personalityindex directive.  */
3518
3519 static void
3520 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3521 {
3522   expressionS exp;
3523
3524   if (!unwind.proc_start)
3525     as_bad (MISSING_FNSTART);
3526
3527   if (unwind.personality_routine || unwind.personality_index != -1)
3528     as_bad (_("duplicate .personalityindex directive"));
3529
3530   expression (&exp);
3531
3532   if (exp.X_op != O_constant
3533       || exp.X_add_number < 0 || exp.X_add_number > 15)
3534     {
3535       as_bad (_("bad personality routine number"));
3536       ignore_rest_of_line ();
3537       return;
3538     }
3539
3540   unwind.personality_index = exp.X_add_number;
3541
3542   demand_empty_rest_of_line ();
3543 }
3544
3545
3546 /* Parse a personality directive.  */
3547
3548 static void
3549 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3550 {
3551   char *name, *p, c;
3552
3553   if (!unwind.proc_start)
3554     as_bad (MISSING_FNSTART);
3555
3556   if (unwind.personality_routine || unwind.personality_index != -1)
3557     as_bad (_("duplicate .personality directive"));
3558
3559   name = input_line_pointer;
3560   c = get_symbol_end ();
3561   p = input_line_pointer;
3562   unwind.personality_routine = symbol_find_or_make (name);
3563   *p = c;
3564   demand_empty_rest_of_line ();
3565 }
3566
3567
3568 /* Parse a directive saving core registers.  */
3569
3570 static void
3571 s_arm_unwind_save_core (void)
3572 {
3573   valueT op;
3574   long range;
3575   int n;
3576
3577   range = parse_reg_list (&input_line_pointer);
3578   if (range == FAIL)
3579     {
3580       as_bad (_("expected register list"));
3581       ignore_rest_of_line ();
3582       return;
3583     }
3584
3585   demand_empty_rest_of_line ();
3586
3587   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3588      into .unwind_save {..., sp...}.  We aren't bothered about the value of
3589      ip because it is clobbered by calls.  */
3590   if (unwind.sp_restored && unwind.fp_reg == 12
3591       && (range & 0x3000) == 0x1000)
3592     {
3593       unwind.opcode_count--;
3594       unwind.sp_restored = 0;
3595       range = (range | 0x2000) & ~0x1000;
3596       unwind.pending_offset = 0;
3597     }
3598
3599   /* Pop r4-r15.  */
3600   if (range & 0xfff0)
3601     {
3602       /* See if we can use the short opcodes.  These pop a block of up to 8
3603          registers starting with r4, plus maybe r14.  */
3604       for (n = 0; n < 8; n++)
3605         {
3606           /* Break at the first non-saved register.      */
3607           if ((range & (1 << (n + 4))) == 0)
3608             break;
3609         }
3610       /* See if there are any other bits set.  */
3611       if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3612         {
3613           /* Use the long form.  */
3614           op = 0x8000 | ((range >> 4) & 0xfff);
3615           add_unwind_opcode (op, 2);
3616         }
3617       else
3618         {
3619           /* Use the short form.  */
3620           if (range & 0x4000)
3621             op = 0xa8; /* Pop r14.      */
3622           else
3623             op = 0xa0; /* Do not pop r14.  */
3624           op |= (n - 1);
3625           add_unwind_opcode (op, 1);
3626         }
3627     }
3628
3629   /* Pop r0-r3.  */
3630   if (range & 0xf)
3631     {
3632       op = 0xb100 | (range & 0xf);
3633       add_unwind_opcode (op, 2);
3634     }
3635
3636   /* Record the number of bytes pushed.  */
3637   for (n = 0; n < 16; n++)
3638     {
3639       if (range & (1 << n))
3640         unwind.frame_size += 4;
3641     }
3642 }
3643
3644
3645 /* Parse a directive saving FPA registers.  */
3646
3647 static void
3648 s_arm_unwind_save_fpa (int reg)
3649 {
3650   expressionS exp;
3651   int num_regs;
3652   valueT op;
3653
3654   /* Get Number of registers to transfer.  */
3655   if (skip_past_comma (&input_line_pointer) != FAIL)
3656     expression (&exp);
3657   else
3658     exp.X_op = O_illegal;
3659
3660   if (exp.X_op != O_constant)
3661     {
3662       as_bad (_("expected , <constant>"));
3663       ignore_rest_of_line ();
3664       return;
3665     }
3666
3667   num_regs = exp.X_add_number;
3668
3669   if (num_regs < 1 || num_regs > 4)
3670     {
3671       as_bad (_("number of registers must be in the range [1:4]"));
3672       ignore_rest_of_line ();
3673       return;
3674     }
3675
3676   demand_empty_rest_of_line ();
3677
3678   if (reg == 4)
3679     {
3680       /* Short form.  */
3681       op = 0xb4 | (num_regs - 1);
3682       add_unwind_opcode (op, 1);
3683     }
3684   else
3685     {
3686       /* Long form.  */
3687       op = 0xc800 | (reg << 4) | (num_regs - 1);
3688       add_unwind_opcode (op, 2);
3689     }
3690   unwind.frame_size += num_regs * 12;
3691 }
3692
3693
3694 /* Parse a directive saving VFP registers for ARMv6 and above.  */
3695
3696 static void
3697 s_arm_unwind_save_vfp_armv6 (void)
3698 {
3699   int count;
3700   unsigned int start;
3701   valueT op;
3702   int num_vfpv3_regs = 0;
3703   int num_regs_below_16;
3704
3705   count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3706   if (count == FAIL)
3707     {
3708       as_bad (_("expected register list"));
3709       ignore_rest_of_line ();
3710       return;
3711     }
3712
3713   demand_empty_rest_of_line ();
3714
3715   /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3716      than FSTMX/FLDMX-style ones).  */
3717
3718   /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
3719   if (start >= 16)
3720     num_vfpv3_regs = count;
3721   else if (start + count > 16)
3722     num_vfpv3_regs = start + count - 16;
3723
3724   if (num_vfpv3_regs > 0)
3725     {
3726       int start_offset = start > 16 ? start - 16 : 0;
3727       op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3728       add_unwind_opcode (op, 2);
3729     }
3730
3731   /* Generate opcode for registers numbered in the range 0 .. 15.  */
3732   num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
3733   gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
3734   if (num_regs_below_16 > 0)
3735     {
3736       op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3737       add_unwind_opcode (op, 2);
3738     }
3739
3740   unwind.frame_size += count * 8;
3741 }
3742
3743
3744 /* Parse a directive saving VFP registers for pre-ARMv6.  */
3745
3746 static void
3747 s_arm_unwind_save_vfp (void)
3748 {
3749   int count;
3750   unsigned int reg;
3751   valueT op;
3752
3753   count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
3754   if (count == FAIL)
3755     {
3756       as_bad (_("expected register list"));
3757       ignore_rest_of_line ();
3758       return;
3759     }
3760
3761   demand_empty_rest_of_line ();
3762
3763   if (reg == 8)
3764     {
3765       /* Short form.  */
3766       op = 0xb8 | (count - 1);
3767       add_unwind_opcode (op, 1);
3768     }
3769   else
3770     {
3771       /* Long form.  */
3772       op = 0xb300 | (reg << 4) | (count - 1);
3773       add_unwind_opcode (op, 2);
3774     }
3775   unwind.frame_size += count * 8 + 4;
3776 }
3777
3778
3779 /* Parse a directive saving iWMMXt data registers.  */
3780
3781 static void
3782 s_arm_unwind_save_mmxwr (void)
3783 {
3784   int reg;
3785   int hi_reg;
3786   int i;
3787   unsigned mask = 0;
3788   valueT op;
3789
3790   if (*input_line_pointer == '{')
3791     input_line_pointer++;
3792
3793   do
3794     {
3795       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3796
3797       if (reg == FAIL)
3798         {
3799           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3800           goto error;
3801         }
3802
3803       if (mask >> reg)
3804         as_tsktsk (_("register list not in ascending order"));
3805       mask |= 1 << reg;
3806
3807       if (*input_line_pointer == '-')
3808         {
3809           input_line_pointer++;
3810           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3811           if (hi_reg == FAIL)
3812             {
3813               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3814               goto error;
3815             }
3816           else if (reg >= hi_reg)
3817             {
3818               as_bad (_("bad register range"));
3819               goto error;
3820             }
3821           for (; reg < hi_reg; reg++)
3822             mask |= 1 << reg;
3823         }
3824     }
3825   while (skip_past_comma (&input_line_pointer) != FAIL);
3826
3827   if (*input_line_pointer == '}')
3828     input_line_pointer++;
3829
3830   demand_empty_rest_of_line ();
3831
3832   /* Generate any deferred opcodes because we're going to be looking at
3833      the list.  */
3834   flush_pending_unwind ();
3835
3836   for (i = 0; i < 16; i++)
3837     {
3838       if (mask & (1 << i))
3839         unwind.frame_size += 8;
3840     }
3841
3842   /* Attempt to combine with a previous opcode.  We do this because gcc
3843      likes to output separate unwind directives for a single block of
3844      registers.  */
3845   if (unwind.opcode_count > 0)
3846     {
3847       i = unwind.opcodes[unwind.opcode_count - 1];
3848       if ((i & 0xf8) == 0xc0)
3849         {
3850           i &= 7;
3851           /* Only merge if the blocks are contiguous.  */
3852           if (i < 6)
3853             {
3854               if ((mask & 0xfe00) == (1 << 9))
3855                 {
3856                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3857                   unwind.opcode_count--;
3858                 }
3859             }
3860           else if (i == 6 && unwind.opcode_count >= 2)
3861             {
3862               i = unwind.opcodes[unwind.opcode_count - 2];
3863               reg = i >> 4;
3864               i &= 0xf;
3865
3866               op = 0xffff << (reg - 1);
3867               if (reg > 0
3868                   && ((mask & op) == (1u << (reg - 1))))
3869                 {
3870                   op = (1 << (reg + i + 1)) - 1;
3871                   op &= ~((1 << reg) - 1);
3872                   mask |= op;
3873                   unwind.opcode_count -= 2;
3874                 }
3875             }
3876         }
3877     }
3878
3879   hi_reg = 15;
3880   /* We want to generate opcodes in the order the registers have been
3881      saved, ie. descending order.  */
3882   for (reg = 15; reg >= -1; reg--)
3883     {
3884       /* Save registers in blocks.  */
3885       if (reg < 0
3886           || !(mask & (1 << reg)))
3887         {
3888           /* We found an unsaved reg.  Generate opcodes to save the
3889              preceding block.   */
3890           if (reg != hi_reg)
3891             {
3892               if (reg == 9)
3893                 {
3894                   /* Short form.  */
3895                   op = 0xc0 | (hi_reg - 10);
3896                   add_unwind_opcode (op, 1);
3897                 }
3898               else
3899                 {
3900                   /* Long form.  */
3901                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
3902                   add_unwind_opcode (op, 2);
3903                 }
3904             }
3905           hi_reg = reg - 1;
3906         }
3907     }
3908
3909   return;
3910 error:
3911   ignore_rest_of_line ();
3912 }
3913
3914 static void
3915 s_arm_unwind_save_mmxwcg (void)
3916 {
3917   int reg;
3918   int hi_reg;
3919   unsigned mask = 0;
3920   valueT op;
3921
3922   if (*input_line_pointer == '{')
3923     input_line_pointer++;
3924
3925   do
3926     {
3927       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
3928
3929       if (reg == FAIL)
3930         {
3931           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
3932           goto error;
3933         }
3934
3935       reg -= 8;
3936       if (mask >> reg)
3937         as_tsktsk (_("register list not in ascending order"));
3938       mask |= 1 << reg;
3939
3940       if (*input_line_pointer == '-')
3941         {
3942           input_line_pointer++;
3943           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
3944           if (hi_reg == FAIL)
3945             {
3946               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
3947               goto error;
3948             }
3949           else if (reg >= hi_reg)
3950             {
3951               as_bad (_("bad register range"));
3952               goto error;
3953             }
3954           for (; reg < hi_reg; reg++)
3955             mask |= 1 << reg;
3956         }
3957     }
3958   while (skip_past_comma (&input_line_pointer) != FAIL);
3959
3960   if (*input_line_pointer == '}')
3961     input_line_pointer++;
3962
3963   demand_empty_rest_of_line ();
3964
3965   /* Generate any deferred opcodes because we're going to be looking at
3966      the list.  */
3967   flush_pending_unwind ();
3968
3969   for (reg = 0; reg < 16; reg++)
3970     {
3971       if (mask & (1 << reg))
3972         unwind.frame_size += 4;
3973     }
3974   op = 0xc700 | mask;
3975   add_unwind_opcode (op, 2);
3976   return;
3977 error:
3978   ignore_rest_of_line ();
3979 }
3980
3981
3982 /* Parse an unwind_save directive.
3983    If the argument is non-zero, this is a .vsave directive.  */
3984
3985 static void
3986 s_arm_unwind_save (int arch_v6)
3987 {
3988   char *peek;
3989   struct reg_entry *reg;
3990   bfd_boolean had_brace = FALSE;
3991
3992   if (!unwind.proc_start)
3993     as_bad (MISSING_FNSTART);
3994
3995   /* Figure out what sort of save we have.  */
3996   peek = input_line_pointer;
3997
3998   if (*peek == '{')
3999     {
4000       had_brace = TRUE;
4001       peek++;
4002     }
4003
4004   reg = arm_reg_parse_multi (&peek);
4005
4006   if (!reg)
4007     {
4008       as_bad (_("register expected"));
4009       ignore_rest_of_line ();
4010       return;
4011     }
4012
4013   switch (reg->type)
4014     {
4015     case REG_TYPE_FN:
4016       if (had_brace)
4017         {
4018           as_bad (_("FPA .unwind_save does not take a register list"));
4019           ignore_rest_of_line ();
4020           return;
4021         }
4022       input_line_pointer = peek;
4023       s_arm_unwind_save_fpa (reg->number);
4024       return;
4025
4026     case REG_TYPE_RN:     s_arm_unwind_save_core ();   return;
4027     case REG_TYPE_VFD:
4028       if (arch_v6)
4029         s_arm_unwind_save_vfp_armv6 ();
4030       else
4031         s_arm_unwind_save_vfp ();
4032       return;
4033     case REG_TYPE_MMXWR:  s_arm_unwind_save_mmxwr ();  return;
4034     case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
4035
4036     default:
4037       as_bad (_(".unwind_save does not support this kind of register"));
4038       ignore_rest_of_line ();
4039     }
4040 }
4041
4042
4043 /* Parse an unwind_movsp directive.  */
4044
4045 static void
4046 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4047 {
4048   int reg;
4049   valueT op;
4050   int offset;
4051
4052   if (!unwind.proc_start)
4053     as_bad (MISSING_FNSTART);
4054
4055   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4056   if (reg == FAIL)
4057     {
4058       as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
4059       ignore_rest_of_line ();
4060       return;
4061     }
4062
4063   /* Optional constant.  */
4064   if (skip_past_comma (&input_line_pointer) != FAIL)
4065     {
4066       if (immediate_for_directive (&offset) == FAIL)
4067         return;
4068     }
4069   else
4070     offset = 0;
4071
4072   demand_empty_rest_of_line ();
4073
4074   if (reg == REG_SP || reg == REG_PC)
4075     {
4076       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
4077       return;
4078     }
4079
4080   if (unwind.fp_reg != REG_SP)
4081     as_bad (_("unexpected .unwind_movsp directive"));
4082
4083   /* Generate opcode to restore the value.  */
4084   op = 0x90 | reg;
4085   add_unwind_opcode (op, 1);
4086
4087   /* Record the information for later.  */
4088   unwind.fp_reg = reg;
4089   unwind.fp_offset = unwind.frame_size - offset;
4090   unwind.sp_restored = 1;
4091 }
4092
4093 /* Parse an unwind_pad directive.  */
4094
4095 static void
4096 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
4097 {
4098   int offset;
4099
4100   if (!unwind.proc_start)
4101     as_bad (MISSING_FNSTART);
4102
4103   if (immediate_for_directive (&offset) == FAIL)
4104     return;
4105
4106   if (offset & 3)
4107     {
4108       as_bad (_("stack increment must be multiple of 4"));
4109       ignore_rest_of_line ();
4110       return;
4111     }
4112
4113   /* Don't generate any opcodes, just record the details for later.  */
4114   unwind.frame_size += offset;
4115   unwind.pending_offset += offset;
4116
4117   demand_empty_rest_of_line ();
4118 }
4119
4120 /* Parse an unwind_setfp directive.  */
4121
4122 static void
4123 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
4124 {
4125   int sp_reg;
4126   int fp_reg;
4127   int offset;
4128
4129   if (!unwind.proc_start)
4130     as_bad (MISSING_FNSTART);
4131
4132   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4133   if (skip_past_comma (&input_line_pointer) == FAIL)
4134     sp_reg = FAIL;
4135   else
4136     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4137
4138   if (fp_reg == FAIL || sp_reg == FAIL)
4139     {
4140       as_bad (_("expected <reg>, <reg>"));
4141       ignore_rest_of_line ();
4142       return;
4143     }
4144
4145   /* Optional constant.  */
4146   if (skip_past_comma (&input_line_pointer) != FAIL)
4147     {
4148       if (immediate_for_directive (&offset) == FAIL)
4149         return;
4150     }
4151   else
4152     offset = 0;
4153
4154   demand_empty_rest_of_line ();
4155
4156   if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4157     {
4158       as_bad (_("register must be either sp or set by a previous"
4159                 "unwind_movsp directive"));
4160       return;
4161     }
4162
4163   /* Don't generate any opcodes, just record the information for later.  */
4164   unwind.fp_reg = fp_reg;
4165   unwind.fp_used = 1;
4166   if (sp_reg == REG_SP)
4167     unwind.fp_offset = unwind.frame_size - offset;
4168   else
4169     unwind.fp_offset -= offset;
4170 }
4171
4172 /* Parse an unwind_raw directive.  */
4173
4174 static void
4175 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
4176 {
4177   expressionS exp;
4178   /* This is an arbitrary limit.         */
4179   unsigned char op[16];
4180   int count;
4181
4182   if (!unwind.proc_start)
4183     as_bad (MISSING_FNSTART);
4184
4185   expression (&exp);
4186   if (exp.X_op == O_constant
4187       && skip_past_comma (&input_line_pointer) != FAIL)
4188     {
4189       unwind.frame_size += exp.X_add_number;
4190       expression (&exp);
4191     }
4192   else
4193     exp.X_op = O_illegal;
4194
4195   if (exp.X_op != O_constant)
4196     {
4197       as_bad (_("expected <offset>, <opcode>"));
4198       ignore_rest_of_line ();
4199       return;
4200     }
4201
4202   count = 0;
4203
4204   /* Parse the opcode.  */
4205   for (;;)
4206     {
4207       if (count >= 16)
4208         {
4209           as_bad (_("unwind opcode too long"));
4210           ignore_rest_of_line ();
4211         }
4212       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
4213         {
4214           as_bad (_("invalid unwind opcode"));
4215           ignore_rest_of_line ();
4216           return;
4217         }
4218       op[count++] = exp.X_add_number;
4219
4220       /* Parse the next byte.  */
4221       if (skip_past_comma (&input_line_pointer) == FAIL)
4222         break;
4223
4224       expression (&exp);
4225     }
4226
4227   /* Add the opcode bytes in reverse order.  */
4228   while (count--)
4229     add_unwind_opcode (op[count], 1);
4230
4231   demand_empty_rest_of_line ();
4232 }
4233
4234
4235 /* Parse a .eabi_attribute directive.  */
4236
4237 static void
4238 s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4239 {
4240   int tag = s_vendor_attribute (OBJ_ATTR_PROC);
4241
4242   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4243     attributes_set_explicitly[tag] = 1;
4244 }
4245 #endif /* OBJ_ELF */
4246
4247 static void s_arm_arch (int);
4248 static void s_arm_object_arch (int);
4249 static void s_arm_cpu (int);
4250 static void s_arm_fpu (int);
4251
4252 #ifdef TE_PE
4253
4254 static void
4255 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
4256 {
4257   expressionS exp;
4258
4259   do
4260     {
4261       expression (&exp);
4262       if (exp.X_op == O_symbol)
4263         exp.X_op = O_secrel;
4264
4265       emit_expr (&exp, 4);
4266     }
4267   while (*input_line_pointer++ == ',');
4268
4269   input_line_pointer--;
4270   demand_empty_rest_of_line ();
4271 }
4272 #endif /* TE_PE */
4273
4274 /* This table describes all the machine specific pseudo-ops the assembler
4275    has to support.  The fields are:
4276      pseudo-op name without dot
4277      function to call to execute this pseudo-op
4278      Integer arg to pass to the function.  */
4279
4280 const pseudo_typeS md_pseudo_table[] =
4281 {
4282   /* Never called because '.req' does not start a line.  */
4283   { "req",         s_req,         0 },
4284   /* Following two are likewise never called.  */
4285   { "dn",          s_dn,          0 },
4286   { "qn",          s_qn,          0 },
4287   { "unreq",       s_unreq,       0 },
4288   { "bss",         s_bss,         0 },
4289   { "align",       s_align,       0 },
4290   { "arm",         s_arm,         0 },
4291   { "thumb",       s_thumb,       0 },
4292   { "code",        s_code,        0 },
4293   { "force_thumb", s_force_thumb, 0 },
4294   { "thumb_func",  s_thumb_func,  0 },
4295   { "thumb_set",   s_thumb_set,   0 },
4296   { "even",        s_even,        0 },
4297   { "ltorg",       s_ltorg,       0 },
4298   { "pool",        s_ltorg,       0 },
4299   { "syntax",      s_syntax,      0 },
4300   { "cpu",         s_arm_cpu,     0 },
4301   { "arch",        s_arm_arch,    0 },
4302   { "object_arch", s_arm_object_arch,   0 },
4303   { "fpu",         s_arm_fpu,     0 },
4304 #ifdef OBJ_ELF
4305   { "word",             s_arm_elf_cons, 4 },
4306   { "long",             s_arm_elf_cons, 4 },
4307   { "inst.n",           s_arm_elf_inst, 2 },
4308   { "inst.w",           s_arm_elf_inst, 4 },
4309   { "inst",             s_arm_elf_inst, 0 },
4310   { "rel31",            s_arm_rel31,      0 },
4311   { "fnstart",          s_arm_unwind_fnstart,   0 },
4312   { "fnend",            s_arm_unwind_fnend,     0 },
4313   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
4314   { "personality",      s_arm_unwind_personality, 0 },
4315   { "personalityindex", s_arm_unwind_personalityindex, 0 },
4316   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
4317   { "save",             s_arm_unwind_save,      0 },
4318   { "vsave",            s_arm_unwind_save,      1 },
4319   { "movsp",            s_arm_unwind_movsp,     0 },
4320   { "pad",              s_arm_unwind_pad,       0 },
4321   { "setfp",            s_arm_unwind_setfp,     0 },
4322   { "unwind_raw",       s_arm_unwind_raw,       0 },
4323   { "eabi_attribute",   s_arm_eabi_attribute,   0 },
4324 #else
4325   { "word",        cons, 4},
4326
4327   /* These are used for dwarf.  */
4328   {"2byte", cons, 2},
4329   {"4byte", cons, 4},
4330   {"8byte", cons, 8},
4331   /* These are used for dwarf2.  */
4332   { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4333   { "loc",  dwarf2_directive_loc,  0 },
4334   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
4335 #endif
4336   { "extend",      float_cons, 'x' },
4337   { "ldouble",     float_cons, 'x' },
4338   { "packed",      float_cons, 'p' },
4339 #ifdef TE_PE
4340   {"secrel32", pe_directive_secrel, 0},
4341 #endif
4342   { 0, 0, 0 }
4343 };
4344 \f
4345 /* Parser functions used exclusively in instruction operands.  */
4346
4347 /* Generic immediate-value read function for use in insn parsing.
4348    STR points to the beginning of the immediate (the leading #);
4349    VAL receives the value; if the value is outside [MIN, MAX]
4350    issue an error.  PREFIX_OPT is true if the immediate prefix is
4351    optional.  */
4352
4353 static int
4354 parse_immediate (char **str, int *val, int min, int max,
4355                  bfd_boolean prefix_opt)
4356 {
4357   expressionS exp;
4358   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4359   if (exp.X_op != O_constant)
4360     {
4361       inst.error = _("constant expression required");
4362       return FAIL;
4363     }
4364
4365   if (exp.X_add_number < min || exp.X_add_number > max)
4366     {
4367       inst.error = _("immediate value out of range");
4368       return FAIL;
4369     }
4370
4371   *val = exp.X_add_number;
4372   return SUCCESS;
4373 }
4374
4375 /* Less-generic immediate-value read function with the possibility of loading a
4376    big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
4377    instructions. Puts the result directly in inst.operands[i].  */
4378
4379 static int
4380 parse_big_immediate (char **str, int i)
4381 {
4382   expressionS exp;
4383   char *ptr = *str;
4384
4385   my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4386
4387   if (exp.X_op == O_constant)
4388     {
4389       inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4390       /* If we're on a 64-bit host, then a 64-bit number can be returned using
4391          O_constant.  We have to be careful not to break compilation for
4392          32-bit X_add_number, though.  */
4393       if ((exp.X_add_number & ~0xffffffffl) != 0)
4394         {
4395           /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4.  */
4396           inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4397           inst.operands[i].regisimm = 1;
4398         }
4399     }
4400   else if (exp.X_op == O_big
4401            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32
4402            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number <= 64)
4403     {
4404       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
4405       /* Bignums have their least significant bits in
4406          generic_bignum[0]. Make sure we put 32 bits in imm and
4407          32 bits in reg,  in a (hopefully) portable way.  */
4408       gas_assert (parts != 0);
4409       inst.operands[i].imm = 0;
4410       for (j = 0; j < parts; j++, idx++)
4411         inst.operands[i].imm |= generic_bignum[idx]
4412                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4413       inst.operands[i].reg = 0;
4414       for (j = 0; j < parts; j++, idx++)
4415         inst.operands[i].reg |= generic_bignum[idx]
4416                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4417       inst.operands[i].regisimm = 1;
4418     }
4419   else
4420     return FAIL;
4421
4422   *str = ptr;
4423
4424   return SUCCESS;
4425 }
4426
4427 /* Returns the pseudo-register number of an FPA immediate constant,
4428    or FAIL if there isn't a valid constant here.  */
4429
4430 static int
4431 parse_fpa_immediate (char ** str)
4432 {
4433   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4434   char *         save_in;
4435   expressionS    exp;
4436   int            i;
4437   int            j;
4438
4439   /* First try and match exact strings, this is to guarantee
4440      that some formats will work even for cross assembly.  */
4441
4442   for (i = 0; fp_const[i]; i++)
4443     {
4444       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
4445         {
4446           char *start = *str;
4447
4448           *str += strlen (fp_const[i]);
4449           if (is_end_of_line[(unsigned char) **str])
4450             return i + 8;
4451           *str = start;
4452         }
4453     }
4454
4455   /* Just because we didn't get a match doesn't mean that the constant
4456      isn't valid, just that it is in a format that we don't
4457      automatically recognize.  Try parsing it with the standard
4458      expression routines.  */
4459
4460   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
4461
4462   /* Look for a raw floating point number.  */
4463   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4464       && is_end_of_line[(unsigned char) *save_in])
4465     {
4466       for (i = 0; i < NUM_FLOAT_VALS; i++)
4467         {
4468           for (j = 0; j < MAX_LITTLENUMS; j++)
4469             {
4470               if (words[j] != fp_values[i][j])
4471                 break;
4472             }
4473
4474           if (j == MAX_LITTLENUMS)
4475             {
4476               *str = save_in;
4477               return i + 8;
4478             }
4479         }
4480     }
4481
4482   /* Try and parse a more complex expression, this will probably fail
4483      unless the code uses a floating point prefix (eg "0f").  */
4484   save_in = input_line_pointer;
4485   input_line_pointer = *str;
4486   if (expression (&exp) == absolute_section
4487       && exp.X_op == O_big
4488       && exp.X_add_number < 0)
4489     {
4490       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4491          Ditto for 15.  */
4492       if (gen_to_words (words, 5, (long) 15) == 0)
4493         {
4494           for (i = 0; i < NUM_FLOAT_VALS; i++)
4495             {
4496               for (j = 0; j < MAX_LITTLENUMS; j++)
4497                 {
4498                   if (words[j] != fp_values[i][j])
4499                     break;
4500                 }
4501
4502               if (j == MAX_LITTLENUMS)
4503                 {
4504                   *str = input_line_pointer;
4505                   input_line_pointer = save_in;
4506                   return i + 8;
4507                 }
4508             }
4509         }
4510     }
4511
4512   *str = input_line_pointer;
4513   input_line_pointer = save_in;
4514   inst.error = _("invalid FPA immediate expression");
4515   return FAIL;
4516 }
4517
4518 /* Returns 1 if a number has "quarter-precision" float format
4519    0baBbbbbbc defgh000 00000000 00000000.  */
4520
4521 static int
4522 is_quarter_float (unsigned imm)
4523 {
4524   int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4525   return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4526 }
4527
4528 /* Parse an 8-bit "quarter-precision" floating point number of the form:
4529    0baBbbbbbc defgh000 00000000 00000000.
4530    The zero and minus-zero cases need special handling, since they can't be
4531    encoded in the "quarter-precision" float format, but can nonetheless be
4532    loaded as integer constants.  */
4533
4534 static unsigned
4535 parse_qfloat_immediate (char **ccp, int *immed)
4536 {
4537   char *str = *ccp;
4538   char *fpnum;
4539   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4540   int found_fpchar = 0;
4541
4542   skip_past_char (&str, '#');
4543
4544   /* We must not accidentally parse an integer as a floating-point number. Make
4545      sure that the value we parse is not an integer by checking for special
4546      characters '.' or 'e'.
4547      FIXME: This is a horrible hack, but doing better is tricky because type
4548      information isn't in a very usable state at parse time.  */
4549   fpnum = str;
4550   skip_whitespace (fpnum);
4551
4552   if (strncmp (fpnum, "0x", 2) == 0)
4553     return FAIL;
4554   else
4555     {
4556       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4557         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4558           {
4559             found_fpchar = 1;
4560             break;
4561           }
4562
4563       if (!found_fpchar)
4564         return FAIL;
4565     }
4566
4567   if ((str = atof_ieee (str, 's', words)) != NULL)
4568     {
4569       unsigned fpword = 0;
4570       int i;
4571
4572       /* Our FP word must be 32 bits (single-precision FP).  */
4573       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4574         {
4575           fpword <<= LITTLENUM_NUMBER_OF_BITS;
4576           fpword |= words[i];
4577         }
4578
4579       if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
4580         *immed = fpword;
4581       else
4582         return FAIL;
4583
4584       *ccp = str;
4585
4586       return SUCCESS;
4587     }
4588
4589   return FAIL;
4590 }
4591
4592 /* Shift operands.  */
4593 enum shift_kind
4594 {
4595   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4596 };
4597
4598 struct asm_shift_name
4599 {
4600   const char      *name;
4601   enum shift_kind  kind;
4602 };
4603
4604 /* Third argument to parse_shift.  */
4605 enum parse_shift_mode
4606 {
4607   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
4608   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
4609   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
4610   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
4611   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
4612 };
4613
4614 /* Parse a <shift> specifier on an ARM data processing instruction.
4615    This has three forms:
4616
4617      (LSL|LSR|ASL|ASR|ROR) Rs
4618      (LSL|LSR|ASL|ASR|ROR) #imm
4619      RRX
4620
4621    Note that ASL is assimilated to LSL in the instruction encoding, and
4622    RRX to ROR #0 (which cannot be written as such).  */
4623
4624 static int
4625 parse_shift (char **str, int i, enum parse_shift_mode mode)
4626 {
4627   const struct asm_shift_name *shift_name;
4628   enum shift_kind shift;
4629   char *s = *str;
4630   char *p = s;
4631   int reg;
4632
4633   for (p = *str; ISALPHA (*p); p++)
4634     ;
4635
4636   if (p == *str)
4637     {
4638       inst.error = _("shift expression expected");
4639       return FAIL;
4640     }
4641
4642   shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
4643                                                             p - *str);
4644
4645   if (shift_name == NULL)
4646     {
4647       inst.error = _("shift expression expected");
4648       return FAIL;
4649     }
4650
4651   shift = shift_name->kind;
4652
4653   switch (mode)
4654     {
4655     case NO_SHIFT_RESTRICT:
4656     case SHIFT_IMMEDIATE:   break;
4657
4658     case SHIFT_LSL_OR_ASR_IMMEDIATE:
4659       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4660         {
4661           inst.error = _("'LSL' or 'ASR' required");
4662           return FAIL;
4663         }
4664       break;
4665
4666     case SHIFT_LSL_IMMEDIATE:
4667       if (shift != SHIFT_LSL)
4668         {
4669           inst.error = _("'LSL' required");
4670           return FAIL;
4671         }
4672       break;
4673
4674     case SHIFT_ASR_IMMEDIATE:
4675       if (shift != SHIFT_ASR)
4676         {
4677           inst.error = _("'ASR' required");
4678           return FAIL;
4679         }
4680       break;
4681
4682     default: abort ();
4683     }
4684
4685   if (shift != SHIFT_RRX)
4686     {
4687       /* Whitespace can appear here if the next thing is a bare digit.  */
4688       skip_whitespace (p);
4689
4690       if (mode == NO_SHIFT_RESTRICT
4691           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
4692         {
4693           inst.operands[i].imm = reg;
4694           inst.operands[i].immisreg = 1;
4695         }
4696       else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4697         return FAIL;
4698     }
4699   inst.operands[i].shift_kind = shift;
4700   inst.operands[i].shifted = 1;
4701   *str = p;
4702   return SUCCESS;
4703 }
4704
4705 /* Parse a <shifter_operand> for an ARM data processing instruction:
4706
4707       #<immediate>
4708       #<immediate>, <rotate>
4709       <Rm>
4710       <Rm>, <shift>
4711
4712    where <shift> is defined by parse_shift above, and <rotate> is a
4713    multiple of 2 between 0 and 30.  Validation of immediate operands
4714    is deferred to md_apply_fix.  */
4715
4716 static int
4717 parse_shifter_operand (char **str, int i)
4718 {
4719   int value;
4720   expressionS exp;
4721
4722   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
4723     {
4724       inst.operands[i].reg = value;
4725       inst.operands[i].isreg = 1;
4726
4727       /* parse_shift will override this if appropriate */
4728       inst.reloc.exp.X_op = O_constant;
4729       inst.reloc.exp.X_add_number = 0;
4730
4731       if (skip_past_comma (str) == FAIL)
4732         return SUCCESS;
4733
4734       /* Shift operation on register.  */
4735       return parse_shift (str, i, NO_SHIFT_RESTRICT);
4736     }
4737
4738   if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4739     return FAIL;
4740
4741   if (skip_past_comma (str) == SUCCESS)
4742     {
4743       /* #x, y -- ie explicit rotation by Y.  */
4744       if (my_get_expression (&exp, str, GE_NO_PREFIX))
4745         return FAIL;
4746
4747       if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
4748         {
4749           inst.error = _("constant expression expected");
4750           return FAIL;
4751         }
4752
4753       value = exp.X_add_number;
4754       if (value < 0 || value > 30 || value % 2 != 0)
4755         {
4756           inst.error = _("invalid rotation");
4757           return FAIL;
4758         }
4759       if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4760         {
4761           inst.error = _("invalid constant");
4762           return FAIL;
4763         }
4764
4765       /* Convert to decoded value.  md_apply_fix will put it back.  */
4766       inst.reloc.exp.X_add_number
4767         = (((inst.reloc.exp.X_add_number << (32 - value))
4768             | (inst.reloc.exp.X_add_number >> value)) & 0xffffffff);
4769     }
4770
4771   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4772   inst.reloc.pc_rel = 0;
4773   return SUCCESS;
4774 }
4775
4776 /* Group relocation information.  Each entry in the table contains the
4777    textual name of the relocation as may appear in assembler source
4778    and must end with a colon.
4779    Along with this textual name are the relocation codes to be used if
4780    the corresponding instruction is an ALU instruction (ADD or SUB only),
4781    an LDR, an LDRS, or an LDC.  */
4782
4783 struct group_reloc_table_entry
4784 {
4785   const char *name;
4786   int alu_code;
4787   int ldr_code;
4788   int ldrs_code;
4789   int ldc_code;
4790 };
4791
4792 typedef enum
4793 {
4794   /* Varieties of non-ALU group relocation.  */
4795
4796   GROUP_LDR,
4797   GROUP_LDRS,
4798   GROUP_LDC
4799 } group_reloc_type;
4800
4801 static struct group_reloc_table_entry group_reloc_table[] =
4802   { /* Program counter relative: */
4803     { "pc_g0_nc",
4804       BFD_RELOC_ARM_ALU_PC_G0_NC,       /* ALU */
4805       0,                                /* LDR */
4806       0,                                /* LDRS */
4807       0 },                              /* LDC */
4808     { "pc_g0",
4809       BFD_RELOC_ARM_ALU_PC_G0,          /* ALU */
4810       BFD_RELOC_ARM_LDR_PC_G0,          /* LDR */
4811       BFD_RELOC_ARM_LDRS_PC_G0,         /* LDRS */
4812       BFD_RELOC_ARM_LDC_PC_G0 },        /* LDC */
4813     { "pc_g1_nc",
4814       BFD_RELOC_ARM_ALU_PC_G1_NC,       /* ALU */
4815       0,                                /* LDR */
4816       0,                                /* LDRS */
4817       0 },                              /* LDC */
4818     { "pc_g1",
4819       BFD_RELOC_ARM_ALU_PC_G1,          /* ALU */
4820       BFD_RELOC_ARM_LDR_PC_G1,          /* LDR */
4821       BFD_RELOC_ARM_LDRS_PC_G1,         /* LDRS */
4822       BFD_RELOC_ARM_LDC_PC_G1 },        /* LDC */
4823     { "pc_g2",
4824       BFD_RELOC_ARM_ALU_PC_G2,          /* ALU */
4825       BFD_RELOC_ARM_LDR_PC_G2,          /* LDR */
4826       BFD_RELOC_ARM_LDRS_PC_G2,         /* LDRS */
4827       BFD_RELOC_ARM_LDC_PC_G2 },        /* LDC */
4828     /* Section base relative */
4829     { "sb_g0_nc",
4830       BFD_RELOC_ARM_ALU_SB_G0_NC,       /* ALU */
4831       0,                                /* LDR */
4832       0,                                /* LDRS */
4833       0 },                              /* LDC */
4834     { "sb_g0",
4835       BFD_RELOC_ARM_ALU_SB_G0,          /* ALU */
4836       BFD_RELOC_ARM_LDR_SB_G0,          /* LDR */
4837       BFD_RELOC_ARM_LDRS_SB_G0,         /* LDRS */
4838       BFD_RELOC_ARM_LDC_SB_G0 },        /* LDC */
4839     { "sb_g1_nc",
4840       BFD_RELOC_ARM_ALU_SB_G1_NC,       /* ALU */
4841       0,                                /* LDR */
4842       0,                                /* LDRS */
4843       0 },                              /* LDC */
4844     { "sb_g1",
4845       BFD_RELOC_ARM_ALU_SB_G1,          /* ALU */
4846       BFD_RELOC_ARM_LDR_SB_G1,          /* LDR */
4847       BFD_RELOC_ARM_LDRS_SB_G1,         /* LDRS */
4848       BFD_RELOC_ARM_LDC_SB_G1 },        /* LDC */
4849     { "sb_g2",
4850       BFD_RELOC_ARM_ALU_SB_G2,          /* ALU */
4851       BFD_RELOC_ARM_LDR_SB_G2,          /* LDR */
4852       BFD_RELOC_ARM_LDRS_SB_G2,         /* LDRS */
4853       BFD_RELOC_ARM_LDC_SB_G2 } };      /* LDC */
4854
4855 /* Given the address of a pointer pointing to the textual name of a group
4856    relocation as may appear in assembler source, attempt to find its details
4857    in group_reloc_table.  The pointer will be updated to the character after
4858    the trailing colon.  On failure, FAIL will be returned; SUCCESS
4859    otherwise.  On success, *entry will be updated to point at the relevant
4860    group_reloc_table entry. */
4861
4862 static int
4863 find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
4864 {
4865   unsigned int i;
4866   for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
4867     {
4868       int length = strlen (group_reloc_table[i].name);
4869
4870       if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
4871           && (*str)[length] == ':')
4872         {
4873           *out = &group_reloc_table[i];
4874           *str += (length + 1);
4875           return SUCCESS;
4876         }
4877     }
4878
4879   return FAIL;
4880 }
4881
4882 /* Parse a <shifter_operand> for an ARM data processing instruction
4883    (as for parse_shifter_operand) where group relocations are allowed:
4884
4885       #<immediate>
4886       #<immediate>, <rotate>
4887       #:<group_reloc>:<expression>
4888       <Rm>
4889       <Rm>, <shift>
4890
4891    where <group_reloc> is one of the strings defined in group_reloc_table.
4892    The hashes are optional.
4893
4894    Everything else is as for parse_shifter_operand.  */
4895
4896 static parse_operand_result
4897 parse_shifter_operand_group_reloc (char **str, int i)
4898 {
4899   /* Determine if we have the sequence of characters #: or just :
4900      coming next.  If we do, then we check for a group relocation.
4901      If we don't, punt the whole lot to parse_shifter_operand.  */
4902
4903   if (((*str)[0] == '#' && (*str)[1] == ':')
4904       || (*str)[0] == ':')
4905     {
4906       struct group_reloc_table_entry *entry;
4907
4908       if ((*str)[0] == '#')
4909         (*str) += 2;
4910       else
4911         (*str)++;
4912
4913       /* Try to parse a group relocation.  Anything else is an error.  */
4914       if (find_group_reloc_table_entry (str, &entry) == FAIL)
4915         {
4916           inst.error = _("unknown group relocation");
4917           return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4918         }
4919
4920       /* We now have the group relocation table entry corresponding to
4921          the name in the assembler source.  Next, we parse the expression.  */
4922       if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
4923         return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4924
4925       /* Record the relocation type (always the ALU variant here).  */
4926       inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
4927       gas_assert (inst.reloc.type != 0);
4928
4929       return PARSE_OPERAND_SUCCESS;
4930     }
4931   else
4932     return parse_shifter_operand (str, i) == SUCCESS
4933            ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
4934
4935   /* Never reached.  */
4936 }
4937
4938 /* Parse all forms of an ARM address expression.  Information is written
4939    to inst.operands[i] and/or inst.reloc.
4940
4941    Preindexed addressing (.preind=1):
4942
4943    [Rn, #offset]       .reg=Rn .reloc.exp=offset
4944    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4945    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4946                        .shift_kind=shift .reloc.exp=shift_imm
4947
4948    These three may have a trailing ! which causes .writeback to be set also.
4949
4950    Postindexed addressing (.postind=1, .writeback=1):
4951
4952    [Rn], #offset       .reg=Rn .reloc.exp=offset
4953    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4954    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4955                        .shift_kind=shift .reloc.exp=shift_imm
4956
4957    Unindexed addressing (.preind=0, .postind=0):
4958
4959    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
4960
4961    Other:
4962
4963    [Rn]{!}             shorthand for [Rn,#0]{!}
4964    =immediate          .isreg=0 .reloc.exp=immediate
4965    label               .reg=PC .reloc.pc_rel=1 .reloc.exp=label
4966
4967   It is the caller's responsibility to check for addressing modes not
4968   supported by the instruction, and to set inst.reloc.type.  */
4969
4970 static parse_operand_result
4971 parse_address_main (char **str, int i, int group_relocations,
4972                     group_reloc_type group_type)
4973 {
4974   char *p = *str;
4975   int reg;
4976
4977   if (skip_past_char (&p, '[') == FAIL)
4978     {
4979       if (skip_past_char (&p, '=') == FAIL)
4980         {
4981           /* Bare address - translate to PC-relative offset.  */
4982           inst.reloc.pc_rel = 1;
4983           inst.operands[i].reg = REG_PC;
4984           inst.operands[i].isreg = 1;
4985           inst.operands[i].preind = 1;
4986         }
4987       /* Otherwise a load-constant pseudo op, no special treatment needed here.  */
4988
4989       if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4990         return PARSE_OPERAND_FAIL;
4991
4992       *str = p;
4993       return PARSE_OPERAND_SUCCESS;
4994     }
4995
4996   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
4997     {
4998       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
4999       return PARSE_OPERAND_FAIL;
5000     }
5001   inst.operands[i].reg = reg;
5002   inst.operands[i].isreg = 1;
5003
5004   if (skip_past_comma (&p) == SUCCESS)
5005     {
5006       inst.operands[i].preind = 1;
5007
5008       if (*p == '+') p++;
5009       else if (*p == '-') p++, inst.operands[i].negative = 1;
5010
5011       if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5012         {
5013           inst.operands[i].imm = reg;
5014           inst.operands[i].immisreg = 1;
5015
5016           if (skip_past_comma (&p) == SUCCESS)
5017             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5018               return PARSE_OPERAND_FAIL;
5019         }
5020       else if (skip_past_char (&p, ':') == SUCCESS)
5021         {
5022           /* FIXME: '@' should be used here, but it's filtered out by generic
5023              code before we get to see it here. This may be subject to
5024              change.  */
5025           expressionS exp;
5026           my_get_expression (&exp, &p, GE_NO_PREFIX);
5027           if (exp.X_op != O_constant)
5028             {
5029               inst.error = _("alignment must be constant");
5030               return PARSE_OPERAND_FAIL;
5031             }
5032           inst.operands[i].imm = exp.X_add_number << 8;
5033           inst.operands[i].immisalign = 1;
5034           /* Alignments are not pre-indexes.  */
5035           inst.operands[i].preind = 0;
5036         }
5037       else
5038         {
5039           if (inst.operands[i].negative)
5040             {
5041               inst.operands[i].negative = 0;
5042               p--;
5043             }
5044
5045           if (group_relocations
5046               && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
5047             {
5048               struct group_reloc_table_entry *entry;
5049
5050               /* Skip over the #: or : sequence.  */
5051               if (*p == '#')
5052                 p += 2;
5053               else
5054                 p++;
5055
5056               /* Try to parse a group relocation.  Anything else is an
5057                  error.  */
5058               if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5059                 {
5060                   inst.error = _("unknown group relocation");
5061                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5062                 }
5063
5064               /* We now have the group relocation table entry corresponding to
5065                  the name in the assembler source.  Next, we parse the
5066                  expression.  */
5067               if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5068                 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5069
5070               /* Record the relocation type.  */
5071               switch (group_type)
5072                 {
5073                   case GROUP_LDR:
5074                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
5075                     break;
5076
5077                   case GROUP_LDRS:
5078                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
5079                     break;
5080
5081                   case GROUP_LDC:
5082                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
5083                     break;
5084
5085                   default:
5086                     gas_assert (0);
5087                 }
5088
5089               if (inst.reloc.type == 0)
5090                 {
5091                   inst.error = _("this group relocation is not allowed on this instruction");
5092                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5093                 }
5094             }
5095           else
5096             if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5097               return PARSE_OPERAND_FAIL;
5098         }
5099     }
5100
5101   if (skip_past_char (&p, ']') == FAIL)
5102     {
5103       inst.error = _("']' expected");
5104       return PARSE_OPERAND_FAIL;
5105     }
5106
5107   if (skip_past_char (&p, '!') == SUCCESS)
5108     inst.operands[i].writeback = 1;
5109
5110   else if (skip_past_comma (&p) == SUCCESS)
5111     {
5112       if (skip_past_char (&p, '{') == SUCCESS)
5113         {
5114           /* [Rn], {expr} - unindexed, with option */
5115           if (parse_immediate (&p, &inst.operands[i].imm,
5116                                0, 255, TRUE) == FAIL)
5117             return PARSE_OPERAND_FAIL;
5118
5119           if (skip_past_char (&p, '}') == FAIL)
5120             {
5121               inst.error = _("'}' expected at end of 'option' field");
5122               return PARSE_OPERAND_FAIL;
5123             }
5124           if (inst.operands[i].preind)
5125             {
5126               inst.error = _("cannot combine index with option");
5127               return PARSE_OPERAND_FAIL;
5128             }
5129           *str = p;
5130           return PARSE_OPERAND_SUCCESS;
5131         }
5132       else
5133         {
5134           inst.operands[i].postind = 1;
5135           inst.operands[i].writeback = 1;
5136
5137           if (inst.operands[i].preind)
5138             {
5139               inst.error = _("cannot combine pre- and post-indexing");
5140               return PARSE_OPERAND_FAIL;
5141             }
5142
5143           if (*p == '+') p++;
5144           else if (*p == '-') p++, inst.operands[i].negative = 1;
5145
5146           if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5147             {
5148               /* We might be using the immediate for alignment already. If we
5149                  are, OR the register number into the low-order bits.  */
5150               if (inst.operands[i].immisalign)
5151                 inst.operands[i].imm |= reg;
5152               else
5153                 inst.operands[i].imm = reg;
5154               inst.operands[i].immisreg = 1;
5155
5156               if (skip_past_comma (&p) == SUCCESS)
5157                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5158                   return PARSE_OPERAND_FAIL;
5159             }
5160           else
5161             {
5162               if (inst.operands[i].negative)
5163                 {
5164                   inst.operands[i].negative = 0;
5165                   p--;
5166                 }
5167               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5168                 return PARSE_OPERAND_FAIL;
5169             }
5170         }
5171     }
5172
5173   /* If at this point neither .preind nor .postind is set, we have a
5174      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
5175   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5176     {
5177       inst.operands[i].preind = 1;
5178       inst.reloc.exp.X_op = O_constant;
5179       inst.reloc.exp.X_add_number = 0;
5180     }
5181   *str = p;
5182   return PARSE_OPERAND_SUCCESS;
5183 }
5184
5185 static int
5186 parse_address (char **str, int i)
5187 {
5188   return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
5189          ? SUCCESS : FAIL;
5190 }
5191
5192 static parse_operand_result
5193 parse_address_group_reloc (char **str, int i, group_reloc_type type)
5194 {
5195   return parse_address_main (str, i, 1, type);
5196 }
5197
5198 /* Parse an operand for a MOVW or MOVT instruction.  */
5199 static int
5200 parse_half (char **str)
5201 {
5202   char * p;
5203
5204   p = *str;
5205   skip_past_char (&p, '#');
5206   if (strncasecmp (p, ":lower16:", 9) == 0)
5207     inst.reloc.type = BFD_RELOC_ARM_MOVW;
5208   else if (strncasecmp (p, ":upper16:", 9) == 0)
5209     inst.reloc.type = BFD_RELOC_ARM_MOVT;
5210
5211   if (inst.reloc.type != BFD_RELOC_UNUSED)
5212     {
5213       p += 9;
5214       skip_whitespace (p);
5215     }
5216
5217   if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5218     return FAIL;
5219
5220   if (inst.reloc.type == BFD_RELOC_UNUSED)
5221     {
5222       if (inst.reloc.exp.X_op != O_constant)
5223         {
5224           inst.error = _("constant expression expected");
5225           return FAIL;
5226         }
5227       if (inst.reloc.exp.X_add_number < 0
5228           || inst.reloc.exp.X_add_number > 0xffff)
5229         {
5230           inst.error = _("immediate value out of range");
5231           return FAIL;
5232         }
5233     }
5234   *str = p;
5235   return SUCCESS;
5236 }
5237
5238 /* Miscellaneous. */
5239
5240 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
5241    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
5242 static int
5243 parse_psr (char **str)
5244 {
5245   char *p;
5246   unsigned long psr_field;
5247   const struct asm_psr *psr;
5248   char *start;
5249
5250   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
5251      feature for ease of use and backwards compatibility.  */
5252   p = *str;
5253   if (strncasecmp (p, "SPSR", 4) == 0)
5254     psr_field = SPSR_BIT;
5255   else if (strncasecmp (p, "CPSR", 4) == 0)
5256     psr_field = 0;
5257   else
5258     {
5259       start = p;
5260       do
5261         p++;
5262       while (ISALNUM (*p) || *p == '_');
5263
5264       psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5265                                                   p - start);
5266       if (!psr)
5267         return FAIL;
5268
5269       *str = p;
5270       return psr->field;
5271     }
5272
5273   p += 4;
5274   if (*p == '_')
5275     {
5276       /* A suffix follows.  */
5277       p++;
5278       start = p;
5279
5280       do
5281         p++;
5282       while (ISALNUM (*p) || *p == '_');
5283
5284       psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5285                                                   p - start);
5286       if (!psr)
5287         goto error;
5288
5289       psr_field |= psr->field;
5290     }
5291   else
5292     {
5293       if (ISALNUM (*p))
5294         goto error;    /* Garbage after "[CS]PSR".  */
5295
5296       psr_field |= (PSR_c | PSR_f);
5297     }
5298   *str = p;
5299   return psr_field;
5300
5301  error:
5302   inst.error = _("flag for {c}psr instruction expected");
5303   return FAIL;
5304 }
5305
5306 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
5307    value suitable for splatting into the AIF field of the instruction.  */
5308
5309 static int
5310 parse_cps_flags (char **str)
5311 {
5312   int val = 0;
5313   int saw_a_flag = 0;
5314   char *s = *str;
5315
5316   for (;;)
5317     switch (*s++)
5318       {
5319       case '\0': case ',':
5320         goto done;
5321
5322       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5323       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5324       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
5325
5326       default:
5327         inst.error = _("unrecognized CPS flag");
5328         return FAIL;
5329       }
5330
5331  done:
5332   if (saw_a_flag == 0)
5333     {
5334       inst.error = _("missing CPS flags");
5335       return FAIL;
5336     }
5337
5338   *str = s - 1;
5339   return val;
5340 }
5341
5342 /* Parse an endian specifier ("BE" or "LE", case insensitive);
5343    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
5344
5345 static int
5346 parse_endian_specifier (char **str)
5347 {
5348   int little_endian;
5349   char *s = *str;
5350
5351   if (strncasecmp (s, "BE", 2))
5352     little_endian = 0;
5353   else if (strncasecmp (s, "LE", 2))
5354     little_endian = 1;
5355   else
5356     {
5357       inst.error = _("valid endian specifiers are be or le");
5358       return FAIL;
5359     }
5360
5361   if (ISALNUM (s[2]) || s[2] == '_')
5362     {
5363       inst.error = _("valid endian specifiers are be or le");
5364       return FAIL;
5365     }
5366
5367   *str = s + 2;
5368   return little_endian;
5369 }
5370
5371 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
5372    value suitable for poking into the rotate field of an sxt or sxta
5373    instruction, or FAIL on error.  */
5374
5375 static int
5376 parse_ror (char **str)
5377 {
5378   int rot;
5379   char *s = *str;
5380
5381   if (strncasecmp (s, "ROR", 3) == 0)
5382     s += 3;
5383   else
5384     {
5385       inst.error = _("missing rotation field after comma");
5386       return FAIL;
5387     }
5388
5389   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5390     return FAIL;
5391
5392   switch (rot)
5393     {
5394     case  0: *str = s; return 0x0;
5395     case  8: *str = s; return 0x1;
5396     case 16: *str = s; return 0x2;
5397     case 24: *str = s; return 0x3;
5398
5399     default:
5400       inst.error = _("rotation can only be 0, 8, 16, or 24");
5401       return FAIL;
5402     }
5403 }
5404
5405 /* Parse a conditional code (from conds[] below).  The value returned is in the
5406    range 0 .. 14, or FAIL.  */
5407 static int
5408 parse_cond (char **str)
5409 {
5410   char *q;
5411   const struct asm_cond *c;
5412   int n;
5413   /* Condition codes are always 2 characters, so matching up to
5414      3 characters is sufficient.  */
5415   char cond[3];
5416
5417   q = *str;
5418   n = 0;
5419   while (ISALPHA (*q) && n < 3)
5420     {
5421       cond[n] = TOLOWER (*q);
5422       q++;
5423       n++;
5424     }
5425
5426   c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
5427   if (!c)
5428     {
5429       inst.error = _("condition required");
5430       return FAIL;
5431     }
5432
5433   *str = q;
5434   return c->value;
5435 }
5436
5437 /* Parse an option for a barrier instruction.  Returns the encoding for the
5438    option, or FAIL.  */
5439 static int
5440 parse_barrier (char **str)
5441 {
5442   char *p, *q;
5443   const struct asm_barrier_opt *o;
5444
5445   p = q = *str;
5446   while (ISALPHA (*q))
5447     q++;
5448
5449   o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
5450                                                     q - p);
5451   if (!o)
5452     return FAIL;
5453
5454   *str = q;
5455   return o->value;
5456 }
5457
5458 /* Parse the operands of a table branch instruction.  Similar to a memory
5459    operand.  */
5460 static int
5461 parse_tb (char **str)
5462 {
5463   char * p = *str;
5464   int reg;
5465
5466   if (skip_past_char (&p, '[') == FAIL)
5467     {
5468       inst.error = _("'[' expected");
5469       return FAIL;
5470     }
5471
5472   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5473     {
5474       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5475       return FAIL;
5476     }
5477   inst.operands[0].reg = reg;
5478
5479   if (skip_past_comma (&p) == FAIL)
5480     {
5481       inst.error = _("',' expected");
5482       return FAIL;
5483     }
5484
5485   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5486     {
5487       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5488       return FAIL;
5489     }
5490   inst.operands[0].imm = reg;
5491
5492   if (skip_past_comma (&p) == SUCCESS)
5493     {
5494       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5495         return FAIL;
5496       if (inst.reloc.exp.X_add_number != 1)
5497         {
5498           inst.error = _("invalid shift");
5499           return FAIL;
5500         }
5501       inst.operands[0].shifted = 1;
5502     }
5503
5504   if (skip_past_char (&p, ']') == FAIL)
5505     {
5506       inst.error = _("']' expected");
5507       return FAIL;
5508     }
5509   *str = p;
5510   return SUCCESS;
5511 }
5512
5513 /* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5514    information on the types the operands can take and how they are encoded.
5515    Up to four operands may be read; this function handles setting the
5516    ".present" field for each read operand itself.
5517    Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5518    else returns FAIL.  */
5519
5520 static int
5521 parse_neon_mov (char **str, int *which_operand)
5522 {
5523   int i = *which_operand, val;
5524   enum arm_reg_type rtype;
5525   char *ptr = *str;
5526   struct neon_type_el optype;
5527
5528   if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5529     {
5530       /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
5531       inst.operands[i].reg = val;
5532       inst.operands[i].isscalar = 1;
5533       inst.operands[i].vectype = optype;
5534       inst.operands[i++].present = 1;
5535
5536       if (skip_past_comma (&ptr) == FAIL)
5537         goto wanted_comma;
5538
5539       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5540         goto wanted_arm;
5541
5542       inst.operands[i].reg = val;
5543       inst.operands[i].isreg = 1;
5544       inst.operands[i].present = 1;
5545     }
5546   else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
5547            != FAIL)
5548     {
5549       /* Cases 0, 1, 2, 3, 5 (D only).  */
5550       if (skip_past_comma (&ptr) == FAIL)
5551         goto wanted_comma;
5552
5553       inst.operands[i].reg = val;
5554       inst.operands[i].isreg = 1;
5555       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5556       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5557       inst.operands[i].isvec = 1;
5558       inst.operands[i].vectype = optype;
5559       inst.operands[i++].present = 1;
5560
5561       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5562         {
5563           /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5564              Case 13: VMOV <Sd>, <Rm>  */
5565           inst.operands[i].reg = val;
5566           inst.operands[i].isreg = 1;
5567           inst.operands[i].present = 1;
5568
5569           if (rtype == REG_TYPE_NQ)
5570             {
5571               first_error (_("can't use Neon quad register here"));
5572               return FAIL;
5573             }
5574           else if (rtype != REG_TYPE_VFS)
5575             {
5576               i++;
5577               if (skip_past_comma (&ptr) == FAIL)
5578                 goto wanted_comma;
5579               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5580                 goto wanted_arm;
5581               inst.operands[i].reg = val;
5582               inst.operands[i].isreg = 1;
5583               inst.operands[i].present = 1;
5584             }
5585         }
5586       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
5587                                            &optype)) != FAIL)
5588         {
5589           /* Case 0: VMOV<c><q> <Qd>, <Qm>
5590              Case 1: VMOV<c><q> <Dd>, <Dm>
5591              Case 8: VMOV.F32 <Sd>, <Sm>
5592              Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
5593
5594           inst.operands[i].reg = val;
5595           inst.operands[i].isreg = 1;
5596           inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5597           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5598           inst.operands[i].isvec = 1;
5599           inst.operands[i].vectype = optype;
5600           inst.operands[i].present = 1;
5601
5602           if (skip_past_comma (&ptr) == SUCCESS)
5603             {
5604               /* Case 15.  */
5605               i++;
5606
5607               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5608                 goto wanted_arm;
5609
5610               inst.operands[i].reg = val;
5611               inst.operands[i].isreg = 1;
5612               inst.operands[i++].present = 1;
5613
5614               if (skip_past_comma (&ptr) == FAIL)
5615                 goto wanted_comma;
5616
5617               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5618                 goto wanted_arm;
5619
5620               inst.operands[i].reg = val;
5621               inst.operands[i].isreg = 1;
5622               inst.operands[i++].present = 1;
5623             }
5624         }
5625       else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
5626           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
5627              Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
5628              Case 10: VMOV.F32 <Sd>, #<imm>
5629              Case 11: VMOV.F64 <Dd>, #<imm>  */
5630         inst.operands[i].immisfloat = 1;
5631       else if (parse_big_immediate (&ptr, i) == SUCCESS)
5632           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
5633              Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
5634         ;
5635       else
5636         {
5637           first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
5638           return FAIL;
5639         }
5640     }
5641   else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5642     {
5643       /* Cases 6, 7.  */
5644       inst.operands[i].reg = val;
5645       inst.operands[i].isreg = 1;
5646       inst.operands[i++].present = 1;
5647
5648       if (skip_past_comma (&ptr) == FAIL)
5649         goto wanted_comma;
5650
5651       if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5652         {
5653           /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
5654           inst.operands[i].reg = val;
5655           inst.operands[i].isscalar = 1;
5656           inst.operands[i].present = 1;
5657           inst.operands[i].vectype = optype;
5658         }
5659       else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5660         {
5661           /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
5662           inst.operands[i].reg = val;
5663           inst.operands[i].isreg = 1;
5664           inst.operands[i++].present = 1;
5665
5666           if (skip_past_comma (&ptr) == FAIL)
5667             goto wanted_comma;
5668
5669           if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
5670               == FAIL)
5671             {
5672               first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
5673               return FAIL;
5674             }
5675
5676           inst.operands[i].reg = val;
5677           inst.operands[i].isreg = 1;
5678           inst.operands[i].isvec = 1;
5679           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5680           inst.operands[i].vectype = optype;
5681           inst.operands[i].present = 1;
5682
5683           if (rtype == REG_TYPE_VFS)
5684             {
5685               /* Case 14.  */
5686               i++;
5687               if (skip_past_comma (&ptr) == FAIL)
5688                 goto wanted_comma;
5689               if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
5690                                               &optype)) == FAIL)
5691                 {
5692                   first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
5693                   return FAIL;
5694                 }
5695               inst.operands[i].reg = val;
5696               inst.operands[i].isreg = 1;
5697               inst.operands[i].isvec = 1;
5698               inst.operands[i].issingle = 1;
5699               inst.operands[i].vectype = optype;
5700               inst.operands[i].present = 1;
5701             }
5702         }
5703       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
5704                != FAIL)
5705         {
5706           /* Case 13.  */
5707           inst.operands[i].reg = val;
5708           inst.operands[i].isreg = 1;
5709           inst.operands[i].isvec = 1;
5710           inst.operands[i].issingle = 1;
5711           inst.operands[i].vectype = optype;
5712           inst.operands[i++].present = 1;
5713         }
5714     }
5715   else
5716     {
5717       first_error (_("parse error"));
5718       return FAIL;
5719     }
5720
5721   /* Successfully parsed the operands. Update args.  */
5722   *which_operand = i;
5723   *str = ptr;
5724   return SUCCESS;
5725
5726  wanted_comma:
5727   first_error (_("expected comma"));
5728   return FAIL;
5729
5730  wanted_arm:
5731   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
5732   return FAIL;
5733 }
5734
5735 /* Use this macro when the operand constraints are different
5736    for ARM and THUMB (e.g. ldrd).  */
5737 #define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
5738         ((arm_operand) | ((thumb_operand) << 16))
5739
5740 /* Matcher codes for parse_operands.  */
5741 enum operand_parse_code
5742 {
5743   OP_stop,      /* end of line */
5744
5745   OP_RR,        /* ARM register */
5746   OP_RRnpc,     /* ARM register, not r15 */
5747   OP_RRnpcsp,   /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
5748   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
5749   OP_RRw,       /* ARM register, not r15, optional trailing ! */
5750   OP_RCP,       /* Coprocessor number */
5751   OP_RCN,       /* Coprocessor register */
5752   OP_RF,        /* FPA register */
5753   OP_RVS,       /* VFP single precision register */
5754   OP_RVD,       /* VFP double precision register (0..15) */
5755   OP_RND,       /* Neon double precision register (0..31) */
5756   OP_RNQ,       /* Neon quad precision register */
5757   OP_RVSD,      /* VFP single or double precision register */
5758   OP_RNDQ,      /* Neon double or quad precision register */
5759   OP_RNSDQ,     /* Neon single, double or quad precision register */
5760   OP_RNSC,      /* Neon scalar D[X] */
5761   OP_RVC,       /* VFP control register */
5762   OP_RMF,       /* Maverick F register */
5763   OP_RMD,       /* Maverick D register */
5764   OP_RMFX,      /* Maverick FX register */
5765   OP_RMDX,      /* Maverick DX register */
5766   OP_RMAX,      /* Maverick AX register */
5767   OP_RMDS,      /* Maverick DSPSC register */
5768   OP_RIWR,      /* iWMMXt wR register */
5769   OP_RIWC,      /* iWMMXt wC register */
5770   OP_RIWG,      /* iWMMXt wCG register */
5771   OP_RXA,       /* XScale accumulator register */
5772
5773   OP_REGLST,    /* ARM register list */
5774   OP_VRSLST,    /* VFP single-precision register list */
5775   OP_VRDLST,    /* VFP double-precision register list */
5776   OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
5777   OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
5778   OP_NSTRLST,   /* Neon element/structure list */
5779
5780   OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
5781   OP_RVSD_I0,   /* VFP S or D reg, or immediate zero.  */
5782   OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
5783   OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
5784   OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
5785   OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
5786   OP_VMOV,      /* Neon VMOV operands.  */
5787   OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN.  */
5788   OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
5789   OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
5790
5791   OP_I0,        /* immediate zero */
5792   OP_I7,        /* immediate value 0 .. 7 */
5793   OP_I15,       /*                 0 .. 15 */
5794   OP_I16,       /*                 1 .. 16 */
5795   OP_I16z,      /*                 0 .. 16 */
5796   OP_I31,       /*                 0 .. 31 */
5797   OP_I31w,      /*                 0 .. 31, optional trailing ! */
5798   OP_I32,       /*                 1 .. 32 */
5799   OP_I32z,      /*                 0 .. 32 */
5800   OP_I63,       /*                 0 .. 63 */
5801   OP_I63s,      /*               -64 .. 63 */
5802   OP_I64,       /*                 1 .. 64 */
5803   OP_I64z,      /*                 0 .. 64 */
5804   OP_I255,      /*                 0 .. 255 */
5805
5806   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
5807   OP_I7b,       /*                             0 .. 7 */
5808   OP_I15b,      /*                             0 .. 15 */
5809   OP_I31b,      /*                             0 .. 31 */
5810
5811   OP_SH,        /* shifter operand */
5812   OP_SHG,       /* shifter operand with possible group relocation */
5813   OP_ADDR,      /* Memory address expression (any mode) */
5814   OP_ADDRGLDR,  /* Mem addr expr (any mode) with possible LDR group reloc */
5815   OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
5816   OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
5817   OP_EXP,       /* arbitrary expression */
5818   OP_EXPi,      /* same, with optional immediate prefix */
5819   OP_EXPr,      /* same, with optional relocation suffix */
5820   OP_HALF,      /* 0 .. 65535 or low/high reloc.  */
5821
5822   OP_CPSF,      /* CPS flags */
5823   OP_ENDI,      /* Endianness specifier */
5824   OP_PSR,       /* CPSR/SPSR mask for msr */
5825   OP_COND,      /* conditional code */
5826   OP_TB,        /* Table branch.  */
5827
5828   OP_RVC_PSR,   /* CPSR/SPSR mask for msr, or VFP control register.  */
5829   OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
5830
5831   OP_RRnpc_I0,  /* ARM register or literal 0 */
5832   OP_RR_EXr,    /* ARM register or expression with opt. reloc suff. */
5833   OP_RR_EXi,    /* ARM register or expression with imm prefix */
5834   OP_RF_IF,     /* FPA register or immediate */
5835   OP_RIWR_RIWC, /* iWMMXt R or C reg */
5836   OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
5837
5838   /* Optional operands.  */
5839   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
5840   OP_oI31b,      /*                             0 .. 31 */
5841   OP_oI32b,      /*                             1 .. 32 */
5842   OP_oIffffb,    /*                             0 .. 65535 */
5843   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
5844
5845   OP_oRR,        /* ARM register */
5846   OP_oRRnpc,     /* ARM register, not the PC */
5847   OP_oRRnpcsp,   /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
5848   OP_oRRw,       /* ARM register, not r15, optional trailing ! */
5849   OP_oRND,       /* Optional Neon double precision register */
5850   OP_oRNQ,       /* Optional Neon quad precision register */
5851   OP_oRNDQ,      /* Optional Neon double or quad precision register */
5852   OP_oRNSDQ,     /* Optional single, double or quad precision vector register */
5853   OP_oSHll,      /* LSL immediate */
5854   OP_oSHar,      /* ASR immediate */
5855   OP_oSHllar,    /* LSL or ASR immediate */
5856   OP_oROR,       /* ROR 0/8/16/24 */
5857   OP_oBARRIER,   /* Option argument for a barrier instruction.  */
5858
5859   /* Some pre-defined mixed (ARM/THUMB) operands.  */
5860   OP_RR_npcsp           = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
5861   OP_RRnpc_npcsp        = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
5862   OP_oRRnpc_npcsp       = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
5863
5864   OP_FIRST_OPTIONAL = OP_oI7b
5865 };
5866
5867 /* Generic instruction operand parser.  This does no encoding and no
5868    semantic validation; it merely squirrels values away in the inst
5869    structure.  Returns SUCCESS or FAIL depending on whether the
5870    specified grammar matched.  */
5871 static int
5872 parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
5873 {
5874   unsigned const int *upat = pattern;
5875   char *backtrack_pos = 0;
5876   const char *backtrack_error = 0;
5877   int i, val, backtrack_index = 0;
5878   enum arm_reg_type rtype;
5879   parse_operand_result result;
5880   unsigned int op_parse_code;
5881
5882 #define po_char_or_fail(chr)                    \
5883   do                                            \
5884     {                                           \
5885       if (skip_past_char (&str, chr) == FAIL)   \
5886         goto bad_args;                          \
5887     }                                           \
5888   while (0)
5889
5890 #define po_reg_or_fail(regtype)                                 \
5891   do                                                            \
5892     {                                                           \
5893       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
5894                                  & inst.operands[i].vectype);   \
5895       if (val == FAIL)                                          \
5896         {                                                       \
5897           first_error (_(reg_expected_msgs[regtype]));          \
5898           goto failure;                                         \
5899         }                                                       \
5900       inst.operands[i].reg = val;                               \
5901       inst.operands[i].isreg = 1;                               \
5902       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
5903       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
5904       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
5905                              || rtype == REG_TYPE_VFD           \
5906                              || rtype == REG_TYPE_NQ);          \
5907     }                                                           \
5908   while (0)
5909
5910 #define po_reg_or_goto(regtype, label)                          \
5911   do                                                            \
5912     {                                                           \
5913       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
5914                                  & inst.operands[i].vectype);   \
5915       if (val == FAIL)                                          \
5916         goto label;                                             \
5917                                                                 \
5918       inst.operands[i].reg = val;                               \
5919       inst.operands[i].isreg = 1;                               \
5920       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
5921       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
5922       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
5923                              || rtype == REG_TYPE_VFD           \
5924                              || rtype == REG_TYPE_NQ);          \
5925     }                                                           \
5926   while (0)
5927
5928 #define po_imm_or_fail(min, max, popt)                          \
5929   do                                                            \
5930     {                                                           \
5931       if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
5932         goto failure;                                           \
5933       inst.operands[i].imm = val;                               \
5934     }                                                           \
5935   while (0)
5936
5937 #define po_scalar_or_goto(elsz, label)                                  \
5938   do                                                                    \
5939     {                                                                   \
5940       val = parse_scalar (& str, elsz, & inst.operands[i].vectype);     \
5941       if (val == FAIL)                                                  \
5942         goto label;                                                     \
5943       inst.operands[i].reg = val;                                       \
5944       inst.operands[i].isscalar = 1;                                    \
5945     }                                                                   \
5946   while (0)
5947
5948 #define po_misc_or_fail(expr)                   \
5949   do                                            \
5950     {                                           \
5951       if (expr)                                 \
5952         goto failure;                           \
5953     }                                           \
5954   while (0)
5955
5956 #define po_misc_or_fail_no_backtrack(expr)              \
5957   do                                                    \
5958     {                                                   \
5959       result = expr;                                    \
5960       if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)    \
5961         backtrack_pos = 0;                              \
5962       if (result != PARSE_OPERAND_SUCCESS)              \
5963         goto failure;                                   \
5964     }                                                   \
5965   while (0)
5966
5967   skip_whitespace (str);
5968
5969   for (i = 0; upat[i] != OP_stop; i++)
5970     {
5971       op_parse_code = upat[i];
5972       if (op_parse_code >= 1<<16)
5973         op_parse_code = thumb ? (op_parse_code >> 16)
5974                                 : (op_parse_code & ((1<<16)-1));
5975
5976       if (op_parse_code >= OP_FIRST_OPTIONAL)
5977         {
5978           /* Remember where we are in case we need to backtrack.  */
5979           gas_assert (!backtrack_pos);
5980           backtrack_pos = str;
5981           backtrack_error = inst.error;
5982           backtrack_index = i;
5983         }
5984
5985       if (i > 0 && (i > 1 || inst.operands[0].present))
5986         po_char_or_fail (',');
5987
5988       switch (op_parse_code)
5989         {
5990           /* Registers */
5991         case OP_oRRnpc:
5992         case OP_oRRnpcsp:
5993         case OP_RRnpc:
5994         case OP_RRnpcsp:
5995         case OP_oRR:
5996         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
5997         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
5998         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
5999         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
6000         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
6001         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
6002         case OP_oRND:
6003         case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);     break;
6004         case OP_RVC:
6005           po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6006           break;
6007           /* Also accept generic coprocessor regs for unknown registers.  */
6008           coproc_reg:
6009           po_reg_or_fail (REG_TYPE_CN);
6010           break;
6011         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
6012         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
6013         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
6014         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
6015         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
6016         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
6017         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
6018         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
6019         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
6020         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
6021         case OP_oRNQ:
6022         case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
6023         case OP_oRNDQ:
6024         case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
6025         case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
6026         case OP_oRNSDQ:
6027         case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
6028
6029         /* Neon scalar. Using an element size of 8 means that some invalid
6030            scalars are accepted here, so deal with those in later code.  */
6031         case OP_RNSC:  po_scalar_or_goto (8, failure);    break;
6032
6033         case OP_RNDQ_I0:
6034           {
6035             po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6036             break;
6037             try_imm0:
6038             po_imm_or_fail (0, 0, TRUE);
6039           }
6040           break;
6041
6042         case OP_RVSD_I0:
6043           po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6044           break;
6045
6046         case OP_RR_RNSC:
6047           {
6048             po_scalar_or_goto (8, try_rr);
6049             break;
6050             try_rr:
6051             po_reg_or_fail (REG_TYPE_RN);
6052           }
6053           break;
6054
6055         case OP_RNSDQ_RNSC:
6056           {
6057             po_scalar_or_goto (8, try_nsdq);
6058             break;
6059             try_nsdq:
6060             po_reg_or_fail (REG_TYPE_NSDQ);
6061           }
6062           break;
6063
6064         case OP_RNDQ_RNSC:
6065           {
6066             po_scalar_or_goto (8, try_ndq);
6067             break;
6068             try_ndq:
6069             po_reg_or_fail (REG_TYPE_NDQ);
6070           }
6071           break;
6072
6073         case OP_RND_RNSC:
6074           {
6075             po_scalar_or_goto (8, try_vfd);
6076             break;
6077             try_vfd:
6078             po_reg_or_fail (REG_TYPE_VFD);
6079           }
6080           break;
6081
6082         case OP_VMOV:
6083           /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6084              not careful then bad things might happen.  */
6085           po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6086           break;
6087
6088         case OP_RNDQ_Ibig:
6089           {
6090             po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
6091             break;
6092             try_immbig:
6093             /* There's a possibility of getting a 64-bit immediate here, so
6094                we need special handling.  */
6095             if (parse_big_immediate (&str, i) == FAIL)
6096               {
6097                 inst.error = _("immediate value is out of range");
6098                 goto failure;
6099               }
6100           }
6101           break;
6102
6103         case OP_RNDQ_I63b:
6104           {
6105             po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6106             break;
6107             try_shimm:
6108             po_imm_or_fail (0, 63, TRUE);
6109           }
6110           break;
6111
6112         case OP_RRnpcb:
6113           po_char_or_fail ('[');
6114           po_reg_or_fail  (REG_TYPE_RN);
6115           po_char_or_fail (']');
6116           break;
6117
6118         case OP_RRw:
6119         case OP_oRRw:
6120           po_reg_or_fail (REG_TYPE_RN);
6121           if (skip_past_char (&str, '!') == SUCCESS)
6122             inst.operands[i].writeback = 1;
6123           break;
6124
6125           /* Immediates */
6126         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
6127         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
6128         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
6129         case OP_I16z:    po_imm_or_fail (  0,     16, FALSE);   break;
6130         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
6131         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
6132         case OP_I32z:    po_imm_or_fail (  0,     32, FALSE);   break;
6133         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
6134         case OP_I63:     po_imm_or_fail (  0,     63, FALSE);   break;
6135         case OP_I64:     po_imm_or_fail (  1,     64, FALSE);   break;
6136         case OP_I64z:    po_imm_or_fail (  0,     64, FALSE);   break;
6137         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
6138
6139         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
6140         case OP_oI7b:
6141         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
6142         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
6143         case OP_oI31b:
6144         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
6145         case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
6146         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
6147
6148           /* Immediate variants */
6149         case OP_oI255c:
6150           po_char_or_fail ('{');
6151           po_imm_or_fail (0, 255, TRUE);
6152           po_char_or_fail ('}');
6153           break;
6154
6155         case OP_I31w:
6156           /* The expression parser chokes on a trailing !, so we have
6157              to find it first and zap it.  */
6158           {
6159             char *s = str;
6160             while (*s && *s != ',')
6161               s++;
6162             if (s[-1] == '!')
6163               {
6164                 s[-1] = '\0';
6165                 inst.operands[i].writeback = 1;
6166               }
6167             po_imm_or_fail (0, 31, TRUE);
6168             if (str == s - 1)
6169               str = s;
6170           }
6171           break;
6172
6173           /* Expressions */
6174         case OP_EXPi:   EXPi:
6175           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6176                                               GE_OPT_PREFIX));
6177           break;
6178
6179         case OP_EXP:
6180           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6181                                               GE_NO_PREFIX));
6182           break;
6183
6184         case OP_EXPr:   EXPr:
6185           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6186                                               GE_NO_PREFIX));
6187           if (inst.reloc.exp.X_op == O_symbol)
6188             {
6189               val = parse_reloc (&str);
6190               if (val == -1)
6191                 {
6192                   inst.error = _("unrecognized relocation suffix");
6193                   goto failure;
6194                 }
6195               else if (val != BFD_RELOC_UNUSED)
6196                 {
6197                   inst.operands[i].imm = val;
6198                   inst.operands[i].hasreloc = 1;
6199                 }
6200             }
6201           break;
6202
6203           /* Operand for MOVW or MOVT.  */
6204         case OP_HALF:
6205           po_misc_or_fail (parse_half (&str));
6206           break;
6207
6208           /* Register or expression.  */
6209         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6210         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
6211
6212           /* Register or immediate.  */
6213         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
6214         I0:               po_imm_or_fail (0, 0, FALSE);       break;
6215
6216         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
6217         IF:
6218           if (!is_immediate_prefix (*str))
6219             goto bad_args;
6220           str++;
6221           val = parse_fpa_immediate (&str);
6222           if (val == FAIL)
6223             goto failure;
6224           /* FPA immediates are encoded as registers 8-15.
6225              parse_fpa_immediate has already applied the offset.  */
6226           inst.operands[i].reg = val;
6227           inst.operands[i].isreg = 1;
6228           break;
6229
6230         case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6231         I32z:             po_imm_or_fail (0, 32, FALSE);          break;
6232
6233           /* Two kinds of register.  */
6234         case OP_RIWR_RIWC:
6235           {
6236             struct reg_entry *rege = arm_reg_parse_multi (&str);
6237             if (!rege
6238                 || (rege->type != REG_TYPE_MMXWR
6239                     && rege->type != REG_TYPE_MMXWC
6240                     && rege->type != REG_TYPE_MMXWCG))
6241               {
6242                 inst.error = _("iWMMXt data or control register expected");
6243                 goto failure;
6244               }
6245             inst.operands[i].reg = rege->number;
6246             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6247           }
6248           break;
6249
6250         case OP_RIWC_RIWG:
6251           {
6252             struct reg_entry *rege = arm_reg_parse_multi (&str);
6253             if (!rege
6254                 || (rege->type != REG_TYPE_MMXWC
6255                     && rege->type != REG_TYPE_MMXWCG))
6256               {
6257                 inst.error = _("iWMMXt control register expected");
6258                 goto failure;
6259               }
6260             inst.operands[i].reg = rege->number;
6261             inst.operands[i].isreg = 1;
6262           }
6263           break;
6264
6265           /* Misc */
6266         case OP_CPSF:    val = parse_cps_flags (&str);          break;
6267         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
6268         case OP_oROR:    val = parse_ror (&str);                break;
6269         case OP_PSR:     val = parse_psr (&str);                break;
6270         case OP_COND:    val = parse_cond (&str);               break;
6271         case OP_oBARRIER:val = parse_barrier (&str);            break;
6272
6273         case OP_RVC_PSR:
6274           po_reg_or_goto (REG_TYPE_VFC, try_psr);
6275           inst.operands[i].isvec = 1;  /* Mark VFP control reg as vector.  */
6276           break;
6277           try_psr:
6278           val = parse_psr (&str);
6279           break;
6280
6281         case OP_APSR_RR:
6282           po_reg_or_goto (REG_TYPE_RN, try_apsr);
6283           break;
6284           try_apsr:
6285           /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6286              instruction).  */
6287           if (strncasecmp (str, "APSR_", 5) == 0)
6288             {
6289               unsigned found = 0;
6290               str += 5;
6291               while (found < 15)
6292                 switch (*str++)
6293                   {
6294                   case 'c': found = (found & 1) ? 16 : found | 1; break;
6295                   case 'n': found = (found & 2) ? 16 : found | 2; break;
6296                   case 'z': found = (found & 4) ? 16 : found | 4; break;
6297                   case 'v': found = (found & 8) ? 16 : found | 8; break;
6298                   default: found = 16;
6299                   }
6300               if (found != 15)
6301                 goto failure;
6302               inst.operands[i].isvec = 1;
6303               /* APSR_nzcv is encoded in instructions as if it were the REG_PC.  */
6304               inst.operands[i].reg = REG_PC;
6305             }
6306           else
6307             goto failure;
6308           break;
6309
6310         case OP_TB:
6311           po_misc_or_fail (parse_tb (&str));
6312           break;
6313
6314           /* Register lists.  */
6315         case OP_REGLST:
6316           val = parse_reg_list (&str);
6317           if (*str == '^')
6318             {
6319               inst.operands[1].writeback = 1;
6320               str++;
6321             }
6322           break;
6323
6324         case OP_VRSLST:
6325           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
6326           break;
6327
6328         case OP_VRDLST:
6329           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
6330           break;
6331
6332         case OP_VRSDLST:
6333           /* Allow Q registers too.  */
6334           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6335                                     REGLIST_NEON_D);
6336           if (val == FAIL)
6337             {
6338               inst.error = NULL;
6339               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6340                                         REGLIST_VFP_S);
6341               inst.operands[i].issingle = 1;
6342             }
6343           break;
6344
6345         case OP_NRDLST:
6346           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6347                                     REGLIST_NEON_D);
6348           break;
6349
6350         case OP_NSTRLST:
6351           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6352                                            &inst.operands[i].vectype);
6353           break;
6354
6355           /* Addressing modes */
6356         case OP_ADDR:
6357           po_misc_or_fail (parse_address (&str, i));
6358           break;
6359
6360         case OP_ADDRGLDR:
6361           po_misc_or_fail_no_backtrack (
6362             parse_address_group_reloc (&str, i, GROUP_LDR));
6363           break;
6364
6365         case OP_ADDRGLDRS:
6366           po_misc_or_fail_no_backtrack (
6367             parse_address_group_reloc (&str, i, GROUP_LDRS));
6368           break;
6369
6370         case OP_ADDRGLDC:
6371           po_misc_or_fail_no_backtrack (
6372             parse_address_group_reloc (&str, i, GROUP_LDC));
6373           break;
6374
6375         case OP_SH:
6376           po_misc_or_fail (parse_shifter_operand (&str, i));
6377           break;
6378
6379         case OP_SHG:
6380           po_misc_or_fail_no_backtrack (
6381             parse_shifter_operand_group_reloc (&str, i));
6382           break;
6383
6384         case OP_oSHll:
6385           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6386           break;
6387
6388         case OP_oSHar:
6389           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6390           break;
6391
6392         case OP_oSHllar:
6393           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6394           break;
6395
6396         default:
6397           as_fatal (_("unhandled operand code %d"), op_parse_code);
6398         }
6399
6400       /* Various value-based sanity checks and shared operations.  We
6401          do not signal immediate failures for the register constraints;
6402          this allows a syntax error to take precedence.  */
6403       switch (op_parse_code)
6404         {
6405         case OP_oRRnpc:
6406         case OP_RRnpc:
6407         case OP_RRnpcb:
6408         case OP_RRw:
6409         case OP_oRRw:
6410         case OP_RRnpc_I0:
6411           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6412             inst.error = BAD_PC;
6413           break;
6414
6415         case OP_oRRnpcsp:
6416         case OP_RRnpcsp:
6417           if (inst.operands[i].isreg)
6418             {
6419               if (inst.operands[i].reg == REG_PC)
6420                 inst.error = BAD_PC;
6421               else if (inst.operands[i].reg == REG_SP)
6422                 inst.error = BAD_SP;
6423             }
6424           break;
6425
6426         case OP_CPSF:
6427         case OP_ENDI:
6428         case OP_oROR:
6429         case OP_PSR:
6430         case OP_RVC_PSR:
6431         case OP_COND:
6432         case OP_oBARRIER:
6433         case OP_REGLST:
6434         case OP_VRSLST:
6435         case OP_VRDLST:
6436         case OP_VRSDLST:
6437         case OP_NRDLST:
6438         case OP_NSTRLST:
6439           if (val == FAIL)
6440             goto failure;
6441           inst.operands[i].imm = val;
6442           break;
6443
6444         default:
6445           break;
6446         }
6447
6448       /* If we get here, this operand was successfully parsed.  */
6449       inst.operands[i].present = 1;
6450       continue;
6451
6452     bad_args:
6453       inst.error = BAD_ARGS;
6454
6455     failure:
6456       if (!backtrack_pos)
6457         {
6458           /* The parse routine should already have set inst.error, but set a
6459              default here just in case.  */
6460           if (!inst.error)
6461             inst.error = _("syntax error");
6462           return FAIL;
6463         }
6464
6465       /* Do not backtrack over a trailing optional argument that
6466          absorbed some text.  We will only fail again, with the
6467          'garbage following instruction' error message, which is
6468          probably less helpful than the current one.  */
6469       if (backtrack_index == i && backtrack_pos != str
6470           && upat[i+1] == OP_stop)
6471         {
6472           if (!inst.error)
6473             inst.error = _("syntax error");
6474           return FAIL;
6475         }
6476
6477       /* Try again, skipping the optional argument at backtrack_pos.  */
6478       str = backtrack_pos;
6479       inst.error = backtrack_error;
6480       inst.operands[backtrack_index].present = 0;
6481       i = backtrack_index;
6482       backtrack_pos = 0;
6483     }
6484
6485   /* Check that we have parsed all the arguments.  */
6486   if (*str != '\0' && !inst.error)
6487     inst.error = _("garbage following instruction");
6488
6489   return inst.error ? FAIL : SUCCESS;
6490 }
6491
6492 #undef po_char_or_fail
6493 #undef po_reg_or_fail
6494 #undef po_reg_or_goto
6495 #undef po_imm_or_fail
6496 #undef po_scalar_or_fail
6497
6498 /* Shorthand macro for instruction encoding functions issuing errors.  */
6499 #define constraint(expr, err)                   \
6500   do                                            \
6501     {                                           \
6502       if (expr)                                 \
6503         {                                       \
6504           inst.error = err;                     \
6505           return;                               \
6506         }                                       \
6507     }                                           \
6508   while (0)
6509
6510 /* Reject "bad registers" for Thumb-2 instructions.  Many Thumb-2
6511    instructions are unpredictable if these registers are used.  This
6512    is the BadReg predicate in ARM's Thumb-2 documentation.  */
6513 #define reject_bad_reg(reg)                             \
6514   do                                                    \
6515    if (reg == REG_SP || reg == REG_PC)                  \
6516      {                                                  \
6517        inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC;  \
6518        return;                                          \
6519      }                                                  \
6520   while (0)
6521
6522 /* If REG is R13 (the stack pointer), warn that its use is
6523    deprecated.  */
6524 #define warn_deprecated_sp(reg)                 \
6525   do                                            \
6526     if (warn_on_deprecated && reg == REG_SP)    \
6527        as_warn (_("use of r13 is deprecated")); \
6528   while (0)
6529
6530 /* Functions for operand encoding.  ARM, then Thumb.  */
6531
6532 #define rotate_left(v, n) (v << n | v >> (32 - n))
6533
6534 /* If VAL can be encoded in the immediate field of an ARM instruction,
6535    return the encoded form.  Otherwise, return FAIL.  */
6536
6537 static unsigned int
6538 encode_arm_immediate (unsigned int val)
6539 {
6540   unsigned int a, i;
6541
6542   for (i = 0; i < 32; i += 2)
6543     if ((a = rotate_left (val, i)) <= 0xff)
6544       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
6545
6546   return FAIL;
6547 }
6548
6549 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6550    return the encoded form.  Otherwise, return FAIL.  */
6551 static unsigned int
6552 encode_thumb32_immediate (unsigned int val)
6553 {
6554   unsigned int a, i;
6555
6556   if (val <= 0xff)
6557     return val;
6558
6559   for (i = 1; i <= 24; i++)
6560     {
6561       a = val >> i;
6562       if ((val & ~(0xff << i)) == 0)
6563         return ((val >> i) & 0x7f) | ((32 - i) << 7);
6564     }
6565
6566   a = val & 0xff;
6567   if (val == ((a << 16) | a))
6568     return 0x100 | a;
6569   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6570     return 0x300 | a;
6571
6572   a = val & 0xff00;
6573   if (val == ((a << 16) | a))
6574     return 0x200 | (a >> 8);
6575
6576   return FAIL;
6577 }
6578 /* Encode a VFP SP or DP register number into inst.instruction.  */
6579
6580 static void
6581 encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6582 {
6583   if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6584       && reg > 15)
6585     {
6586       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
6587         {
6588           if (thumb_mode)
6589             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
6590                                     fpu_vfp_ext_d32);
6591           else
6592             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
6593                                     fpu_vfp_ext_d32);
6594         }
6595       else
6596         {
6597           first_error (_("D register out of range for selected VFP version"));
6598           return;
6599         }
6600     }
6601
6602   switch (pos)
6603     {
6604     case VFP_REG_Sd:
6605       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
6606       break;
6607
6608     case VFP_REG_Sn:
6609       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
6610       break;
6611
6612     case VFP_REG_Sm:
6613       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
6614       break;
6615
6616     case VFP_REG_Dd:
6617       inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
6618       break;
6619
6620     case VFP_REG_Dn:
6621       inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
6622       break;
6623
6624     case VFP_REG_Dm:
6625       inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
6626       break;
6627
6628     default:
6629       abort ();
6630     }
6631 }
6632
6633 /* Encode a <shift> in an ARM-format instruction.  The immediate,
6634    if any, is handled by md_apply_fix.   */
6635 static void
6636 encode_arm_shift (int i)
6637 {
6638   if (inst.operands[i].shift_kind == SHIFT_RRX)
6639     inst.instruction |= SHIFT_ROR << 5;
6640   else
6641     {
6642       inst.instruction |= inst.operands[i].shift_kind << 5;
6643       if (inst.operands[i].immisreg)
6644         {
6645           inst.instruction |= SHIFT_BY_REG;
6646           inst.instruction |= inst.operands[i].imm << 8;
6647         }
6648       else
6649         inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
6650     }
6651 }
6652
6653 static void
6654 encode_arm_shifter_operand (int i)
6655 {
6656   if (inst.operands[i].isreg)
6657     {
6658       inst.instruction |= inst.operands[i].reg;
6659       encode_arm_shift (i);
6660     }
6661   else
6662     inst.instruction |= INST_IMMEDIATE;
6663 }
6664
6665 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
6666 static void
6667 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
6668 {
6669   gas_assert (inst.operands[i].isreg);
6670   inst.instruction |= inst.operands[i].reg << 16;
6671
6672   if (inst.operands[i].preind)
6673     {
6674       if (is_t)
6675         {
6676           inst.error = _("instruction does not accept preindexed addressing");
6677           return;
6678         }
6679       inst.instruction |= PRE_INDEX;
6680       if (inst.operands[i].writeback)
6681         inst.instruction |= WRITE_BACK;
6682
6683     }
6684   else if (inst.operands[i].postind)
6685     {
6686       gas_assert (inst.operands[i].writeback);
6687       if (is_t)
6688         inst.instruction |= WRITE_BACK;
6689     }
6690   else /* unindexed - only for coprocessor */
6691     {
6692       inst.error = _("instruction does not accept unindexed addressing");
6693       return;
6694     }
6695
6696   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
6697       && (((inst.instruction & 0x000f0000) >> 16)
6698           == ((inst.instruction & 0x0000f000) >> 12)))
6699     as_warn ((inst.instruction & LOAD_BIT)
6700              ? _("destination register same as write-back base")
6701              : _("source register same as write-back base"));
6702 }
6703
6704 /* inst.operands[i] was set up by parse_address.  Encode it into an
6705    ARM-format mode 2 load or store instruction.  If is_t is true,
6706    reject forms that cannot be used with a T instruction (i.e. not
6707    post-indexed).  */
6708 static void
6709 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
6710 {
6711   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
6712
6713   encode_arm_addr_mode_common (i, is_t);
6714
6715   if (inst.operands[i].immisreg)
6716     {
6717       constraint ((inst.operands[i].imm == REG_PC
6718                    || (is_pc && inst.operands[i].writeback)),
6719                   BAD_PC_ADDRESSING);
6720       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
6721       inst.instruction |= inst.operands[i].imm;
6722       if (!inst.operands[i].negative)
6723         inst.instruction |= INDEX_UP;
6724       if (inst.operands[i].shifted)
6725         {
6726           if (inst.operands[i].shift_kind == SHIFT_RRX)
6727             inst.instruction |= SHIFT_ROR << 5;
6728           else
6729             {
6730               inst.instruction |= inst.operands[i].shift_kind << 5;
6731               inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
6732             }
6733         }
6734     }
6735   else /* immediate offset in inst.reloc */
6736     {
6737       if (is_pc && !inst.reloc.pc_rel)
6738         {
6739           const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
6740           /* BAD_PC_ADDRESSING Condition =
6741                is_load => is_t
6742              which becomes !is_load || is_t.  */
6743           constraint ((!is_load || is_t),
6744                       BAD_PC_ADDRESSING);
6745         }
6746
6747       if (inst.reloc.type == BFD_RELOC_UNUSED)
6748         inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
6749     }
6750 }
6751
6752 /* inst.operands[i] was set up by parse_address.  Encode it into an
6753    ARM-format mode 3 load or store instruction.  Reject forms that
6754    cannot be used with such instructions.  If is_t is true, reject
6755    forms that cannot be used with a T instruction (i.e. not
6756    post-indexed).  */
6757 static void
6758 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
6759 {
6760   if (inst.operands[i].immisreg && inst.operands[i].shifted)
6761     {
6762       inst.error = _("instruction does not accept scaled register index");
6763       return;
6764     }
6765
6766   encode_arm_addr_mode_common (i, is_t);
6767
6768   if (inst.operands[i].immisreg)
6769     {
6770       constraint ((inst.operands[i].imm == REG_PC
6771                    || inst.operands[i].reg == REG_PC),
6772                   BAD_PC_ADDRESSING);
6773       inst.instruction |= inst.operands[i].imm;
6774       if (!inst.operands[i].negative)
6775         inst.instruction |= INDEX_UP;
6776     }
6777   else /* immediate offset in inst.reloc */
6778     {
6779       constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
6780                    && inst.operands[i].writeback),
6781                   BAD_PC_WRITEBACK);
6782       inst.instruction |= HWOFFSET_IMM;
6783       if (inst.reloc.type == BFD_RELOC_UNUSED)
6784         inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
6785     }
6786 }
6787
6788 /* inst.operands[i] was set up by parse_address.  Encode it into an
6789    ARM-format instruction.  Reject all forms which cannot be encoded
6790    into a coprocessor load/store instruction.  If wb_ok is false,
6791    reject use of writeback; if unind_ok is false, reject use of
6792    unindexed addressing.  If reloc_override is not 0, use it instead
6793    of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
6794    (in which case it is preserved).  */
6795
6796 static int
6797 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
6798 {
6799   inst.instruction |= inst.operands[i].reg << 16;
6800
6801   gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
6802
6803   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
6804     {
6805       gas_assert (!inst.operands[i].writeback);
6806       if (!unind_ok)
6807         {
6808           inst.error = _("instruction does not support unindexed addressing");
6809           return FAIL;
6810         }
6811       inst.instruction |= inst.operands[i].imm;
6812       inst.instruction |= INDEX_UP;
6813       return SUCCESS;
6814     }
6815
6816   if (inst.operands[i].preind)
6817     inst.instruction |= PRE_INDEX;
6818
6819   if (inst.operands[i].writeback)
6820     {
6821       if (inst.operands[i].reg == REG_PC)
6822         {
6823           inst.error = _("pc may not be used with write-back");
6824           return FAIL;
6825         }
6826       if (!wb_ok)
6827         {
6828           inst.error = _("instruction does not support writeback");
6829           return FAIL;
6830         }
6831       inst.instruction |= WRITE_BACK;
6832     }
6833
6834   if (reloc_override)
6835     inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
6836   else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
6837             || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
6838            && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
6839     {
6840       if (thumb_mode)
6841         inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
6842       else
6843         inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
6844     }
6845
6846   return SUCCESS;
6847 }
6848
6849 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
6850    Determine whether it can be performed with a move instruction; if
6851    it can, convert inst.instruction to that move instruction and
6852    return TRUE; if it can't, convert inst.instruction to a literal-pool
6853    load and return FALSE.  If this is not a valid thing to do in the
6854    current context, set inst.error and return TRUE.
6855
6856    inst.operands[i] describes the destination register.  */
6857
6858 static bfd_boolean
6859 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
6860 {
6861   unsigned long tbit;
6862
6863   if (thumb_p)
6864     tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
6865   else
6866     tbit = LOAD_BIT;
6867
6868   if ((inst.instruction & tbit) == 0)
6869     {
6870       inst.error = _("invalid pseudo operation");
6871       return TRUE;
6872     }
6873   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
6874     {
6875       inst.error = _("constant expression expected");
6876       return TRUE;
6877     }
6878   if (inst.reloc.exp.X_op == O_constant)
6879     {
6880       if (thumb_p)
6881         {
6882           if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
6883             {
6884               /* This can be done with a mov(1) instruction.  */
6885               inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
6886               inst.instruction |= inst.reloc.exp.X_add_number;
6887               return TRUE;
6888             }
6889         }
6890       else
6891         {
6892           int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
6893           if (value != FAIL)
6894             {
6895               /* This can be done with a mov instruction.  */
6896               inst.instruction &= LITERAL_MASK;
6897               inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
6898               inst.instruction |= value & 0xfff;
6899               return TRUE;
6900             }
6901
6902           value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
6903           if (value != FAIL)
6904             {
6905               /* This can be done with a mvn instruction.  */
6906               inst.instruction &= LITERAL_MASK;
6907               inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
6908               inst.instruction |= value & 0xfff;
6909               return TRUE;
6910             }
6911         }
6912     }
6913
6914   if (add_to_lit_pool () == FAIL)
6915     {
6916       inst.error = _("literal pool insertion failed");
6917       return TRUE;
6918     }
6919   inst.operands[1].reg = REG_PC;
6920   inst.operands[1].isreg = 1;
6921   inst.operands[1].preind = 1;
6922   inst.reloc.pc_rel = 1;
6923   inst.reloc.type = (thumb_p
6924                      ? BFD_RELOC_ARM_THUMB_OFFSET
6925                      : (mode_3
6926                         ? BFD_RELOC_ARM_HWLITERAL
6927                         : BFD_RELOC_ARM_LITERAL));
6928   return FALSE;
6929 }
6930
6931 /* Functions for instruction encoding, sorted by sub-architecture.
6932    First some generics; their names are taken from the conventional
6933    bit positions for register arguments in ARM format instructions.  */
6934
6935 static void
6936 do_noargs (void)
6937 {
6938 }
6939
6940 static void
6941 do_rd (void)
6942 {
6943   inst.instruction |= inst.operands[0].reg << 12;
6944 }
6945
6946 static void
6947 do_rd_rm (void)
6948 {
6949   inst.instruction |= inst.operands[0].reg << 12;
6950   inst.instruction |= inst.operands[1].reg;
6951 }
6952
6953 static void
6954 do_rd_rn (void)
6955 {
6956   inst.instruction |= inst.operands[0].reg << 12;
6957   inst.instruction |= inst.operands[1].reg << 16;
6958 }
6959
6960 static void
6961 do_rn_rd (void)
6962 {
6963   inst.instruction |= inst.operands[0].reg << 16;
6964   inst.instruction |= inst.operands[1].reg << 12;
6965 }
6966
6967 static void
6968 do_rd_rm_rn (void)
6969 {
6970   unsigned Rn = inst.operands[2].reg;
6971   /* Enforce restrictions on SWP instruction.  */
6972   if ((inst.instruction & 0x0fbfffff) == 0x01000090)
6973     {
6974       constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
6975                   _("Rn must not overlap other operands"));
6976
6977       /* SWP{b} is deprecated for ARMv6* and ARMv7.  */
6978       if (warn_on_deprecated
6979           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
6980         as_warn (_("swp{b} use is deprecated for this architecture"));
6981
6982     }
6983   inst.instruction |= inst.operands[0].reg << 12;
6984   inst.instruction |= inst.operands[1].reg;
6985   inst.instruction |= Rn << 16;
6986 }
6987
6988 static void
6989 do_rd_rn_rm (void)
6990 {
6991   inst.instruction |= inst.operands[0].reg << 12;
6992   inst.instruction |= inst.operands[1].reg << 16;
6993   inst.instruction |= inst.operands[2].reg;
6994 }
6995
6996 static void
6997 do_rm_rd_rn (void)
6998 {
6999   constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7000   constraint (((inst.reloc.exp.X_op != O_constant
7001                 && inst.reloc.exp.X_op != O_illegal)
7002                || inst.reloc.exp.X_add_number != 0),
7003               BAD_ADDR_MODE);
7004   inst.instruction |= inst.operands[0].reg;
7005   inst.instruction |= inst.operands[1].reg << 12;
7006   inst.instruction |= inst.operands[2].reg << 16;
7007 }
7008
7009 static void
7010 do_imm0 (void)
7011 {
7012   inst.instruction |= inst.operands[0].imm;
7013 }
7014
7015 static void
7016 do_rd_cpaddr (void)
7017 {
7018   inst.instruction |= inst.operands[0].reg << 12;
7019   encode_arm_cp_address (1, TRUE, TRUE, 0);
7020 }
7021
7022 /* ARM instructions, in alphabetical order by function name (except
7023    that wrapper functions appear immediately after the function they
7024    wrap).  */
7025
7026 /* This is a pseudo-op of the form "adr rd, label" to be converted
7027    into a relative address of the form "add rd, pc, #label-.-8".  */
7028
7029 static void
7030 do_adr (void)
7031 {
7032   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7033
7034   /* Frag hacking will turn this into a sub instruction if the offset turns
7035      out to be negative.  */
7036   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7037   inst.reloc.pc_rel = 1;
7038   inst.reloc.exp.X_add_number -= 8;
7039 }
7040
7041 /* This is a pseudo-op of the form "adrl rd, label" to be converted
7042    into a relative address of the form:
7043    add rd, pc, #low(label-.-8)"
7044    add rd, rd, #high(label-.-8)"  */
7045
7046 static void
7047 do_adrl (void)
7048 {
7049   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7050
7051   /* Frag hacking will turn this into a sub instruction if the offset turns
7052      out to be negative.  */
7053   inst.reloc.type              = BFD_RELOC_ARM_ADRL_IMMEDIATE;
7054   inst.reloc.pc_rel            = 1;
7055   inst.size                    = INSN_SIZE * 2;
7056   inst.reloc.exp.X_add_number -= 8;
7057 }
7058
7059 static void
7060 do_arit (void)
7061 {
7062   if (!inst.operands[1].present)
7063     inst.operands[1].reg = inst.operands[0].reg;
7064   inst.instruction |= inst.operands[0].reg << 12;
7065   inst.instruction |= inst.operands[1].reg << 16;
7066   encode_arm_shifter_operand (2);
7067 }
7068
7069 static void
7070 do_barrier (void)
7071 {
7072   if (inst.operands[0].present)
7073     {
7074       constraint ((inst.instruction & 0xf0) != 0x40
7075                   && inst.operands[0].imm != 0xf,
7076                   _("bad barrier type"));
7077       inst.instruction |= inst.operands[0].imm;
7078     }
7079   else
7080     inst.instruction |= 0xf;
7081 }
7082
7083 static void
7084 do_bfc (void)
7085 {
7086   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7087   constraint (msb > 32, _("bit-field extends past end of register"));
7088   /* The instruction encoding stores the LSB and MSB,
7089      not the LSB and width.  */
7090   inst.instruction |= inst.operands[0].reg << 12;
7091   inst.instruction |= inst.operands[1].imm << 7;
7092   inst.instruction |= (msb - 1) << 16;
7093 }
7094
7095 static void
7096 do_bfi (void)
7097 {
7098   unsigned int msb;
7099
7100   /* #0 in second position is alternative syntax for bfc, which is
7101      the same instruction but with REG_PC in the Rm field.  */
7102   if (!inst.operands[1].isreg)
7103     inst.operands[1].reg = REG_PC;
7104
7105   msb = inst.operands[2].imm + inst.operands[3].imm;
7106   constraint (msb > 32, _("bit-field extends past end of register"));
7107   /* The instruction encoding stores the LSB and MSB,
7108      not the LSB and width.  */
7109   inst.instruction |= inst.operands[0].reg << 12;
7110   inst.instruction |= inst.operands[1].reg;
7111   inst.instruction |= inst.operands[2].imm << 7;
7112   inst.instruction |= (msb - 1) << 16;
7113 }
7114
7115 static void
7116 do_bfx (void)
7117 {
7118   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7119               _("bit-field extends past end of register"));
7120   inst.instruction |= inst.operands[0].reg << 12;
7121   inst.instruction |= inst.operands[1].reg;
7122   inst.instruction |= inst.operands[2].imm << 7;
7123   inst.instruction |= (inst.operands[3].imm - 1) << 16;
7124 }
7125
7126 /* ARM V5 breakpoint instruction (argument parse)
7127      BKPT <16 bit unsigned immediate>
7128      Instruction is not conditional.
7129         The bit pattern given in insns[] has the COND_ALWAYS condition,
7130         and it is an error if the caller tried to override that.  */
7131
7132 static void
7133 do_bkpt (void)
7134 {
7135   /* Top 12 of 16 bits to bits 19:8.  */
7136   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
7137
7138   /* Bottom 4 of 16 bits to bits 3:0.  */
7139   inst.instruction |= inst.operands[0].imm & 0xf;
7140 }
7141
7142 static void
7143 encode_branch (int default_reloc)
7144 {
7145   if (inst.operands[0].hasreloc)
7146     {
7147       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32,
7148                   _("the only suffix valid here is '(plt)'"));
7149       inst.reloc.type  = BFD_RELOC_ARM_PLT32;
7150     }
7151   else
7152     {
7153       inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
7154     }
7155   inst.reloc.pc_rel = 1;
7156 }
7157
7158 static void
7159 do_branch (void)
7160 {
7161 #ifdef OBJ_ELF
7162   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7163     encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7164   else
7165 #endif
7166     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7167 }
7168
7169 static void
7170 do_bl (void)
7171 {
7172 #ifdef OBJ_ELF
7173   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7174     {
7175       if (inst.cond == COND_ALWAYS)
7176         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7177       else
7178         encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7179     }
7180   else
7181 #endif
7182     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7183 }
7184
7185 /* ARM V5 branch-link-exchange instruction (argument parse)
7186      BLX <target_addr>          ie BLX(1)
7187      BLX{<condition>} <Rm>      ie BLX(2)
7188    Unfortunately, there are two different opcodes for this mnemonic.
7189    So, the insns[].value is not used, and the code here zaps values
7190         into inst.instruction.
7191    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
7192
7193 static void
7194 do_blx (void)
7195 {
7196   if (inst.operands[0].isreg)
7197     {
7198       /* Arg is a register; the opcode provided by insns[] is correct.
7199          It is not illegal to do "blx pc", just useless.  */
7200       if (inst.operands[0].reg == REG_PC)
7201         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
7202
7203       inst.instruction |= inst.operands[0].reg;
7204     }
7205   else
7206     {
7207       /* Arg is an address; this instruction cannot be executed
7208          conditionally, and the opcode must be adjusted.
7209          We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7210          where we generate out a BFD_RELOC_ARM_PCREL_CALL instead.  */
7211       constraint (inst.cond != COND_ALWAYS, BAD_COND);
7212       inst.instruction = 0xfa000000;
7213       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
7214     }
7215 }
7216
7217 static void
7218 do_bx (void)
7219 {
7220   bfd_boolean want_reloc;
7221
7222   if (inst.operands[0].reg == REG_PC)
7223     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
7224
7225   inst.instruction |= inst.operands[0].reg;
7226   /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7227      it is for ARMv4t or earlier.  */
7228   want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7229   if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7230       want_reloc = TRUE;
7231
7232 #ifdef OBJ_ELF
7233   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
7234 #endif
7235     want_reloc = FALSE;
7236
7237   if (want_reloc)
7238     inst.reloc.type = BFD_RELOC_ARM_V4BX;
7239 }
7240
7241
7242 /* ARM v5TEJ.  Jump to Jazelle code.  */
7243
7244 static void
7245 do_bxj (void)
7246 {
7247   if (inst.operands[0].reg == REG_PC)
7248     as_tsktsk (_("use of r15 in bxj is not really useful"));
7249
7250   inst.instruction |= inst.operands[0].reg;
7251 }
7252
7253 /* Co-processor data operation:
7254       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7255       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
7256 static void
7257 do_cdp (void)
7258 {
7259   inst.instruction |= inst.operands[0].reg << 8;
7260   inst.instruction |= inst.operands[1].imm << 20;
7261   inst.instruction |= inst.operands[2].reg << 12;
7262   inst.instruction |= inst.operands[3].reg << 16;
7263   inst.instruction |= inst.operands[4].reg;
7264   inst.instruction |= inst.operands[5].imm << 5;
7265 }
7266
7267 static void
7268 do_cmp (void)
7269 {
7270   inst.instruction |= inst.operands[0].reg << 16;
7271   encode_arm_shifter_operand (1);
7272 }
7273
7274 /* Transfer between coprocessor and ARM registers.
7275    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7276    MRC2
7277    MCR{cond}
7278    MCR2
7279
7280    No special properties.  */
7281
7282 static void
7283 do_co_reg (void)
7284 {
7285   unsigned Rd;
7286
7287   Rd = inst.operands[2].reg;
7288   if (thumb_mode)
7289     {
7290       if (inst.instruction == 0xee000010
7291           || inst.instruction == 0xfe000010)
7292         /* MCR, MCR2  */
7293         reject_bad_reg (Rd);
7294       else
7295         /* MRC, MRC2  */
7296         constraint (Rd == REG_SP, BAD_SP);
7297     }
7298   else
7299     {
7300       /* MCR */
7301       if (inst.instruction == 0xe000010)
7302         constraint (Rd == REG_PC, BAD_PC);
7303     }
7304
7305
7306   inst.instruction |= inst.operands[0].reg << 8;
7307   inst.instruction |= inst.operands[1].imm << 21;
7308   inst.instruction |= Rd << 12;
7309   inst.instruction |= inst.operands[3].reg << 16;
7310   inst.instruction |= inst.operands[4].reg;
7311   inst.instruction |= inst.operands[5].imm << 5;
7312 }
7313
7314 /* Transfer between coprocessor register and pair of ARM registers.
7315    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7316    MCRR2
7317    MRRC{cond}
7318    MRRC2
7319
7320    Two XScale instructions are special cases of these:
7321
7322      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
7323      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
7324
7325    Result unpredictable if Rd or Rn is R15.  */
7326
7327 static void
7328 do_co_reg2c (void)
7329 {
7330   unsigned Rd, Rn;
7331
7332   Rd = inst.operands[2].reg;
7333   Rn = inst.operands[3].reg;
7334
7335   if (thumb_mode)
7336     {
7337       reject_bad_reg (Rd);
7338       reject_bad_reg (Rn);
7339     }
7340   else
7341     {
7342       constraint (Rd == REG_PC, BAD_PC);
7343       constraint (Rn == REG_PC, BAD_PC);
7344     }
7345
7346   inst.instruction |= inst.operands[0].reg << 8;
7347   inst.instruction |= inst.operands[1].imm << 4;
7348   inst.instruction |= Rd << 12;
7349   inst.instruction |= Rn << 16;
7350   inst.instruction |= inst.operands[4].reg;
7351 }
7352
7353 static void
7354 do_cpsi (void)
7355 {
7356   inst.instruction |= inst.operands[0].imm << 6;
7357   if (inst.operands[1].present)
7358     {
7359       inst.instruction |= CPSI_MMOD;
7360       inst.instruction |= inst.operands[1].imm;
7361     }
7362 }
7363
7364 static void
7365 do_dbg (void)
7366 {
7367   inst.instruction |= inst.operands[0].imm;
7368 }
7369
7370 static void
7371 do_it (void)
7372 {
7373   /* There is no IT instruction in ARM mode.  We
7374      process it to do the validation as if in
7375      thumb mode, just in case the code gets
7376      assembled for thumb using the unified syntax.  */
7377
7378   inst.size = 0;
7379   if (unified_syntax)
7380     {
7381       set_it_insn_type (IT_INSN);
7382       now_it.mask = (inst.instruction & 0xf) | 0x10;
7383       now_it.cc = inst.operands[0].imm;
7384     }
7385 }
7386
7387 static void
7388 do_ldmstm (void)
7389 {
7390   int base_reg = inst.operands[0].reg;
7391   int range = inst.operands[1].imm;
7392
7393   inst.instruction |= base_reg << 16;
7394   inst.instruction |= range;
7395
7396   if (inst.operands[1].writeback)
7397     inst.instruction |= LDM_TYPE_2_OR_3;
7398
7399   if (inst.operands[0].writeback)
7400     {
7401       inst.instruction |= WRITE_BACK;
7402       /* Check for unpredictable uses of writeback.  */
7403       if (inst.instruction & LOAD_BIT)
7404         {
7405           /* Not allowed in LDM type 2.  */
7406           if ((inst.instruction & LDM_TYPE_2_OR_3)
7407               && ((range & (1 << REG_PC)) == 0))
7408             as_warn (_("writeback of base register is UNPREDICTABLE"));
7409           /* Only allowed if base reg not in list for other types.  */
7410           else if (range & (1 << base_reg))
7411             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
7412         }
7413       else /* STM.  */
7414         {
7415           /* Not allowed for type 2.  */
7416           if (inst.instruction & LDM_TYPE_2_OR_3)
7417             as_warn (_("writeback of base register is UNPREDICTABLE"));
7418           /* Only allowed if base reg not in list, or first in list.  */
7419           else if ((range & (1 << base_reg))
7420                    && (range & ((1 << base_reg) - 1)))
7421             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
7422         }
7423     }
7424 }
7425
7426 /* ARMv5TE load-consecutive (argument parse)
7427    Mode is like LDRH.
7428
7429      LDRccD R, mode
7430      STRccD R, mode.  */
7431
7432 static void
7433 do_ldrd (void)
7434 {
7435   constraint (inst.operands[0].reg % 2 != 0,
7436               _("first destination register must be even"));
7437   constraint (inst.operands[1].present
7438               && inst.operands[1].reg != inst.operands[0].reg + 1,
7439               _("can only load two consecutive registers"));
7440   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7441   constraint (!inst.operands[2].isreg, _("'[' expected"));
7442
7443   if (!inst.operands[1].present)
7444     inst.operands[1].reg = inst.operands[0].reg + 1;
7445
7446   if (inst.instruction & LOAD_BIT)
7447     {
7448       /* encode_arm_addr_mode_3 will diagnose overlap between the base
7449          register and the first register written; we have to diagnose
7450          overlap between the base and the second register written here.  */
7451
7452       if (inst.operands[2].reg == inst.operands[1].reg
7453           && (inst.operands[2].writeback || inst.operands[2].postind))
7454         as_warn (_("base register written back, and overlaps "
7455                    "second destination register"));
7456
7457       /* For an index-register load, the index register must not overlap the
7458          destination (even if not write-back).  */
7459       else if (inst.operands[2].immisreg
7460                && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
7461                    || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
7462         as_warn (_("index register overlaps destination register"));
7463     }
7464
7465   inst.instruction |= inst.operands[0].reg << 12;
7466   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
7467 }
7468
7469 static void
7470 do_ldrex (void)
7471 {
7472   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
7473               || inst.operands[1].postind || inst.operands[1].writeback
7474               || inst.operands[1].immisreg || inst.operands[1].shifted
7475               || inst.operands[1].negative
7476               /* This can arise if the programmer has written
7477                    strex rN, rM, foo
7478                  or if they have mistakenly used a register name as the last
7479                  operand,  eg:
7480                    strex rN, rM, rX
7481                  It is very difficult to distinguish between these two cases
7482                  because "rX" might actually be a label. ie the register
7483                  name has been occluded by a symbol of the same name. So we
7484                  just generate a general 'bad addressing mode' type error
7485                  message and leave it up to the programmer to discover the
7486                  true cause and fix their mistake.  */
7487               || (inst.operands[1].reg == REG_PC),
7488               BAD_ADDR_MODE);
7489
7490   constraint (inst.reloc.exp.X_op != O_constant
7491               || inst.reloc.exp.X_add_number != 0,
7492               _("offset must be zero in ARM encoding"));
7493
7494   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
7495
7496   inst.instruction |= inst.operands[0].reg << 12;
7497   inst.instruction |= inst.operands[1].reg << 16;
7498   inst.reloc.type = BFD_RELOC_UNUSED;
7499 }
7500
7501 static void
7502 do_ldrexd (void)
7503 {
7504   constraint (inst.operands[0].reg % 2 != 0,
7505               _("even register required"));
7506   constraint (inst.operands[1].present
7507               && inst.operands[1].reg != inst.operands[0].reg + 1,
7508               _("can only load two consecutive registers"));
7509   /* If op 1 were present and equal to PC, this function wouldn't
7510      have been called in the first place.  */
7511   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7512
7513   inst.instruction |= inst.operands[0].reg << 12;
7514   inst.instruction |= inst.operands[2].reg << 16;
7515 }
7516
7517 static void
7518 do_ldst (void)
7519 {
7520   inst.instruction |= inst.operands[0].reg << 12;
7521   if (!inst.operands[1].isreg)
7522     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
7523       return;
7524   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
7525 }
7526
7527 static void
7528 do_ldstt (void)
7529 {
7530   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
7531      reject [Rn,...].  */
7532   if (inst.operands[1].preind)
7533     {
7534       constraint (inst.reloc.exp.X_op != O_constant
7535                   || inst.reloc.exp.X_add_number != 0,
7536                   _("this instruction requires a post-indexed address"));
7537
7538       inst.operands[1].preind = 0;
7539       inst.operands[1].postind = 1;
7540       inst.operands[1].writeback = 1;
7541     }
7542   inst.instruction |= inst.operands[0].reg << 12;
7543   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
7544 }
7545
7546 /* Halfword and signed-byte load/store operations.  */
7547
7548 static void
7549 do_ldstv4 (void)
7550 {
7551   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
7552   inst.instruction |= inst.operands[0].reg << 12;
7553   if (!inst.operands[1].isreg)
7554     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
7555       return;
7556   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
7557 }
7558
7559 static void
7560 do_ldsttv4 (void)
7561 {
7562   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
7563      reject [Rn,...].  */
7564   if (inst.operands[1].preind)
7565     {
7566       constraint (inst.reloc.exp.X_op != O_constant
7567                   || inst.reloc.exp.X_add_number != 0,
7568                   _("this instruction requires a post-indexed address"));
7569
7570       inst.operands[1].preind = 0;
7571       inst.operands[1].postind = 1;
7572       inst.operands[1].writeback = 1;
7573     }
7574   inst.instruction |= inst.operands[0].reg << 12;
7575   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
7576 }
7577
7578 /* Co-processor register load/store.
7579    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
7580 static void
7581 do_lstc (void)
7582 {
7583   inst.instruction |= inst.operands[0].reg << 8;
7584   inst.instruction |= inst.operands[1].reg << 12;
7585   encode_arm_cp_address (2, TRUE, TRUE, 0);
7586 }
7587
7588 static void
7589 do_mlas (void)
7590 {
7591   /* This restriction does not apply to mls (nor to mla in v6 or later).  */
7592   if (inst.operands[0].reg == inst.operands[1].reg
7593       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
7594       && !(inst.instruction & 0x00400000))
7595     as_tsktsk (_("Rd and Rm should be different in mla"));
7596
7597   inst.instruction |= inst.operands[0].reg << 16;
7598   inst.instruction |= inst.operands[1].reg;
7599   inst.instruction |= inst.operands[2].reg << 8;
7600   inst.instruction |= inst.operands[3].reg << 12;
7601 }
7602
7603 static void
7604 do_mov (void)
7605 {
7606   inst.instruction |= inst.operands[0].reg << 12;
7607   encode_arm_shifter_operand (1);
7608 }
7609
7610 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
7611 static void
7612 do_mov16 (void)
7613 {
7614   bfd_vma imm;
7615   bfd_boolean top;
7616
7617   top = (inst.instruction & 0x00400000) != 0;
7618   constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
7619               _(":lower16: not allowed this instruction"));
7620   constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
7621               _(":upper16: not allowed instruction"));
7622   inst.instruction |= inst.operands[0].reg << 12;
7623   if (inst.reloc.type == BFD_RELOC_UNUSED)
7624     {
7625       imm = inst.reloc.exp.X_add_number;
7626       /* The value is in two pieces: 0:11, 16:19.  */
7627       inst.instruction |= (imm & 0x00000fff);
7628       inst.instruction |= (imm & 0x0000f000) << 4;
7629     }
7630 }
7631
7632 static void do_vfp_nsyn_opcode (const char *);
7633
7634 static int
7635 do_vfp_nsyn_mrs (void)
7636 {
7637   if (inst.operands[0].isvec)
7638     {
7639       if (inst.operands[1].reg != 1)
7640         first_error (_("operand 1 must be FPSCR"));
7641       memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
7642       memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
7643       do_vfp_nsyn_opcode ("fmstat");
7644     }
7645   else if (inst.operands[1].isvec)
7646     do_vfp_nsyn_opcode ("fmrx");
7647   else
7648     return FAIL;
7649
7650   return SUCCESS;
7651 }
7652
7653 static int
7654 do_vfp_nsyn_msr (void)
7655 {
7656   if (inst.operands[0].isvec)
7657     do_vfp_nsyn_opcode ("fmxr");
7658   else
7659     return FAIL;
7660
7661   return SUCCESS;
7662 }
7663
7664 static void
7665 do_vmrs (void)
7666 {
7667   unsigned Rt = inst.operands[0].reg;
7668   
7669   if (thumb_mode && inst.operands[0].reg == REG_SP)
7670     {
7671       inst.error = BAD_SP;
7672       return;
7673     }
7674
7675   /* APSR_ sets isvec. All other refs to PC are illegal.  */
7676   if (!inst.operands[0].isvec && inst.operands[0].reg == REG_PC)
7677     {
7678       inst.error = BAD_PC;
7679       return;
7680     }
7681
7682   if (inst.operands[1].reg != 1)
7683     first_error (_("operand 1 must be FPSCR"));
7684
7685   inst.instruction |= (Rt << 12);
7686 }
7687
7688 static void
7689 do_vmsr (void)
7690 {
7691   unsigned Rt = inst.operands[1].reg;
7692   
7693   if (thumb_mode)
7694     reject_bad_reg (Rt);
7695   else if (Rt == REG_PC)
7696     {
7697       inst.error = BAD_PC;
7698       return;
7699     }
7700
7701   if (inst.operands[0].reg != 1)
7702     first_error (_("operand 0 must be FPSCR"));
7703
7704   inst.instruction |= (Rt << 12);
7705 }
7706
7707 static void
7708 do_mrs (void)
7709 {
7710   if (do_vfp_nsyn_mrs () == SUCCESS)
7711     return;
7712
7713   /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
7714   constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
7715               != (PSR_c|PSR_f),
7716               _("'CPSR' or 'SPSR' expected"));
7717   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
7718   inst.instruction |= inst.operands[0].reg << 12;
7719   inst.instruction |= (inst.operands[1].imm & SPSR_BIT);
7720 }
7721
7722 /* Two possible forms:
7723       "{C|S}PSR_<field>, Rm",
7724       "{C|S}PSR_f, #expression".  */
7725
7726 static void
7727 do_msr (void)
7728 {
7729   if (do_vfp_nsyn_msr () == SUCCESS)
7730     return;
7731
7732   inst.instruction |= inst.operands[0].imm;
7733   if (inst.operands[1].isreg)
7734     inst.instruction |= inst.operands[1].reg;
7735   else
7736     {
7737       inst.instruction |= INST_IMMEDIATE;
7738       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7739       inst.reloc.pc_rel = 0;
7740     }
7741 }
7742
7743 static void
7744 do_mul (void)
7745 {
7746   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
7747
7748   if (!inst.operands[2].present)
7749     inst.operands[2].reg = inst.operands[0].reg;
7750   inst.instruction |= inst.operands[0].reg << 16;
7751   inst.instruction |= inst.operands[1].reg;
7752   inst.instruction |= inst.operands[2].reg << 8;
7753
7754   if (inst.operands[0].reg == inst.operands[1].reg
7755       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
7756     as_tsktsk (_("Rd and Rm should be different in mul"));
7757 }
7758
7759 /* Long Multiply Parser
7760    UMULL RdLo, RdHi, Rm, Rs
7761    SMULL RdLo, RdHi, Rm, Rs
7762    UMLAL RdLo, RdHi, Rm, Rs
7763    SMLAL RdLo, RdHi, Rm, Rs.  */
7764
7765 static void
7766 do_mull (void)
7767 {
7768   inst.instruction |= inst.operands[0].reg << 12;
7769   inst.instruction |= inst.operands[1].reg << 16;
7770   inst.instruction |= inst.operands[2].reg;
7771   inst.instruction |= inst.operands[3].reg << 8;
7772
7773   /* rdhi and rdlo must be different.  */
7774   if (inst.operands[0].reg == inst.operands[1].reg)
7775     as_tsktsk (_("rdhi and rdlo must be different"));
7776
7777   /* rdhi, rdlo and rm must all be different before armv6.  */
7778   if ((inst.operands[0].reg == inst.operands[2].reg
7779       || inst.operands[1].reg == inst.operands[2].reg)
7780       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
7781     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
7782 }
7783
7784 static void
7785 do_nop (void)
7786 {
7787   if (inst.operands[0].present
7788       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
7789     {
7790       /* Architectural NOP hints are CPSR sets with no bits selected.  */
7791       inst.instruction &= 0xf0000000;
7792       inst.instruction |= 0x0320f000;
7793       if (inst.operands[0].present)
7794         inst.instruction |= inst.operands[0].imm;
7795     }
7796 }
7797
7798 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
7799    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
7800    Condition defaults to COND_ALWAYS.
7801    Error if Rd, Rn or Rm are R15.  */
7802
7803 static void
7804 do_pkhbt (void)
7805 {
7806   inst.instruction |= inst.operands[0].reg << 12;
7807   inst.instruction |= inst.operands[1].reg << 16;
7808   inst.instruction |= inst.operands[2].reg;
7809   if (inst.operands[3].present)
7810     encode_arm_shift (3);
7811 }
7812
7813 /* ARM V6 PKHTB (Argument Parse).  */
7814
7815 static void
7816 do_pkhtb (void)
7817 {
7818   if (!inst.operands[3].present)
7819     {
7820       /* If the shift specifier is omitted, turn the instruction
7821          into pkhbt rd, rm, rn. */
7822       inst.instruction &= 0xfff00010;
7823       inst.instruction |= inst.operands[0].reg << 12;
7824       inst.instruction |= inst.operands[1].reg;
7825       inst.instruction |= inst.operands[2].reg << 16;
7826     }
7827   else
7828     {
7829       inst.instruction |= inst.operands[0].reg << 12;
7830       inst.instruction |= inst.operands[1].reg << 16;
7831       inst.instruction |= inst.operands[2].reg;
7832       encode_arm_shift (3);
7833     }
7834 }
7835
7836 /* ARMv5TE: Preload-Cache
7837
7838     PLD <addr_mode>
7839
7840   Syntactically, like LDR with B=1, W=0, L=1.  */
7841
7842 static void
7843 do_pld (void)
7844 {
7845   constraint (!inst.operands[0].isreg,
7846               _("'[' expected after PLD mnemonic"));
7847   constraint (inst.operands[0].postind,
7848               _("post-indexed expression used in preload instruction"));
7849   constraint (inst.operands[0].writeback,
7850               _("writeback used in preload instruction"));
7851   constraint (!inst.operands[0].preind,
7852               _("unindexed addressing used in preload instruction"));
7853   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
7854 }
7855
7856 /* ARMv7: PLI <addr_mode>  */
7857 static void
7858 do_pli (void)
7859 {
7860   constraint (!inst.operands[0].isreg,
7861               _("'[' expected after PLI mnemonic"));
7862   constraint (inst.operands[0].postind,
7863               _("post-indexed expression used in preload instruction"));
7864   constraint (inst.operands[0].writeback,
7865               _("writeback used in preload instruction"));
7866   constraint (!inst.operands[0].preind,
7867               _("unindexed addressing used in preload instruction"));
7868   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
7869   inst.instruction &= ~PRE_INDEX;
7870 }
7871
7872 static void
7873 do_push_pop (void)
7874 {
7875   inst.operands[1] = inst.operands[0];
7876   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
7877   inst.operands[0].isreg = 1;
7878   inst.operands[0].writeback = 1;
7879   inst.operands[0].reg = REG_SP;
7880   do_ldmstm ();
7881 }
7882
7883 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
7884    word at the specified address and the following word
7885    respectively.
7886    Unconditionally executed.
7887    Error if Rn is R15.  */
7888
7889 static void
7890 do_rfe (void)
7891 {
7892   inst.instruction |= inst.operands[0].reg << 16;
7893   if (inst.operands[0].writeback)
7894     inst.instruction |= WRITE_BACK;
7895 }
7896
7897 /* ARM V6 ssat (argument parse).  */
7898
7899 static void
7900 do_ssat (void)
7901 {
7902   inst.instruction |= inst.operands[0].reg << 12;
7903   inst.instruction |= (inst.operands[1].imm - 1) << 16;
7904   inst.instruction |= inst.operands[2].reg;
7905
7906   if (inst.operands[3].present)
7907     encode_arm_shift (3);
7908 }
7909
7910 /* ARM V6 usat (argument parse).  */
7911
7912 static void
7913 do_usat (void)
7914 {
7915   inst.instruction |= inst.operands[0].reg << 12;
7916   inst.instruction |= inst.operands[1].imm << 16;
7917   inst.instruction |= inst.operands[2].reg;
7918
7919   if (inst.operands[3].present)
7920     encode_arm_shift (3);
7921 }
7922
7923 /* ARM V6 ssat16 (argument parse).  */
7924
7925 static void
7926 do_ssat16 (void)
7927 {
7928   inst.instruction |= inst.operands[0].reg << 12;
7929   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
7930   inst.instruction |= inst.operands[2].reg;
7931 }
7932
7933 static void
7934 do_usat16 (void)
7935 {
7936   inst.instruction |= inst.operands[0].reg << 12;
7937   inst.instruction |= inst.operands[1].imm << 16;
7938   inst.instruction |= inst.operands[2].reg;
7939 }
7940
7941 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
7942    preserving the other bits.
7943
7944    setend <endian_specifier>, where <endian_specifier> is either
7945    BE or LE.  */
7946
7947 static void
7948 do_setend (void)
7949 {
7950   if (inst.operands[0].imm)
7951     inst.instruction |= 0x200;
7952 }
7953
7954 static void
7955 do_shift (void)
7956 {
7957   unsigned int Rm = (inst.operands[1].present
7958                      ? inst.operands[1].reg
7959                      : inst.operands[0].reg);
7960
7961   inst.instruction |= inst.operands[0].reg << 12;
7962   inst.instruction |= Rm;
7963   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
7964     {
7965       inst.instruction |= inst.operands[2].reg << 8;
7966       inst.instruction |= SHIFT_BY_REG;
7967     }
7968   else
7969     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7970 }
7971
7972 static void
7973 do_smc (void)
7974 {
7975   inst.reloc.type = BFD_RELOC_ARM_SMC;
7976   inst.reloc.pc_rel = 0;
7977 }
7978
7979 static void
7980 do_swi (void)
7981 {
7982   inst.reloc.type = BFD_RELOC_ARM_SWI;
7983   inst.reloc.pc_rel = 0;
7984 }
7985
7986 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
7987    SMLAxy{cond} Rd,Rm,Rs,Rn
7988    SMLAWy{cond} Rd,Rm,Rs,Rn
7989    Error if any register is R15.  */
7990
7991 static void
7992 do_smla (void)
7993 {
7994   inst.instruction |= inst.operands[0].reg << 16;
7995   inst.instruction |= inst.operands[1].reg;
7996   inst.instruction |= inst.operands[2].reg << 8;
7997   inst.instruction |= inst.operands[3].reg << 12;
7998 }
7999
8000 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8001    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8002    Error if any register is R15.
8003    Warning if Rdlo == Rdhi.  */
8004
8005 static void
8006 do_smlal (void)
8007 {
8008   inst.instruction |= inst.operands[0].reg << 12;
8009   inst.instruction |= inst.operands[1].reg << 16;
8010   inst.instruction |= inst.operands[2].reg;
8011   inst.instruction |= inst.operands[3].reg << 8;
8012
8013   if (inst.operands[0].reg == inst.operands[1].reg)
8014     as_tsktsk (_("rdhi and rdlo must be different"));
8015 }
8016
8017 /* ARM V5E (El Segundo) signed-multiply (argument parse)
8018    SMULxy{cond} Rd,Rm,Rs
8019    Error if any register is R15.  */
8020
8021 static void
8022 do_smul (void)
8023 {
8024   inst.instruction |= inst.operands[0].reg << 16;
8025   inst.instruction |= inst.operands[1].reg;
8026   inst.instruction |= inst.operands[2].reg << 8;
8027 }
8028
8029 /* ARM V6 srs (argument parse).  The variable fields in the encoding are
8030    the same for both ARM and Thumb-2.  */
8031
8032 static void
8033 do_srs (void)
8034 {
8035   int reg;
8036
8037   if (inst.operands[0].present)
8038     {
8039       reg = inst.operands[0].reg;
8040       constraint (reg != REG_SP, _("SRS base register must be r13"));
8041     }
8042   else
8043     reg = REG_SP;
8044
8045   inst.instruction |= reg << 16;
8046   inst.instruction |= inst.operands[1].imm;
8047   if (inst.operands[0].writeback || inst.operands[1].writeback)
8048     inst.instruction |= WRITE_BACK;
8049 }
8050
8051 /* ARM V6 strex (argument parse).  */
8052
8053 static void
8054 do_strex (void)
8055 {
8056   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8057               || inst.operands[2].postind || inst.operands[2].writeback
8058               || inst.operands[2].immisreg || inst.operands[2].shifted
8059               || inst.operands[2].negative
8060               /* See comment in do_ldrex().  */
8061               || (inst.operands[2].reg == REG_PC),
8062               BAD_ADDR_MODE);
8063
8064   constraint (inst.operands[0].reg == inst.operands[1].reg
8065               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8066
8067   constraint (inst.reloc.exp.X_op != O_constant
8068               || inst.reloc.exp.X_add_number != 0,
8069               _("offset must be zero in ARM encoding"));
8070
8071   inst.instruction |= inst.operands[0].reg << 12;
8072   inst.instruction |= inst.operands[1].reg;
8073   inst.instruction |= inst.operands[2].reg << 16;
8074   inst.reloc.type = BFD_RELOC_UNUSED;
8075 }
8076
8077 static void
8078 do_strexd (void)
8079 {
8080   constraint (inst.operands[1].reg % 2 != 0,
8081               _("even register required"));
8082   constraint (inst.operands[2].present
8083               && inst.operands[2].reg != inst.operands[1].reg + 1,
8084               _("can only store two consecutive registers"));
8085   /* If op 2 were present and equal to PC, this function wouldn't
8086      have been called in the first place.  */
8087   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
8088
8089   constraint (inst.operands[0].reg == inst.operands[1].reg
8090               || inst.operands[0].reg == inst.operands[1].reg + 1
8091               || inst.operands[0].reg == inst.operands[3].reg,
8092               BAD_OVERLAP);
8093
8094   inst.instruction |= inst.operands[0].reg << 12;
8095   inst.instruction |= inst.operands[1].reg;
8096   inst.instruction |= inst.operands[3].reg << 16;
8097 }
8098
8099 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8100    extends it to 32-bits, and adds the result to a value in another
8101    register.  You can specify a rotation by 0, 8, 16, or 24 bits
8102    before extracting the 16-bit value.
8103    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8104    Condition defaults to COND_ALWAYS.
8105    Error if any register uses R15.  */
8106
8107 static void
8108 do_sxtah (void)
8109 {
8110   inst.instruction |= inst.operands[0].reg << 12;
8111   inst.instruction |= inst.operands[1].reg << 16;
8112   inst.instruction |= inst.operands[2].reg;
8113   inst.instruction |= inst.operands[3].imm << 10;
8114 }
8115
8116 /* ARM V6 SXTH.
8117
8118    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8119    Condition defaults to COND_ALWAYS.
8120    Error if any register uses R15.  */
8121
8122 static void
8123 do_sxth (void)
8124 {
8125   inst.instruction |= inst.operands[0].reg << 12;
8126   inst.instruction |= inst.operands[1].reg;
8127   inst.instruction |= inst.operands[2].imm << 10;
8128 }
8129 \f
8130 /* VFP instructions.  In a logical order: SP variant first, monad
8131    before dyad, arithmetic then move then load/store.  */
8132
8133 static void
8134 do_vfp_sp_monadic (void)
8135 {
8136   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8137   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8138 }
8139
8140 static void
8141 do_vfp_sp_dyadic (void)
8142 {
8143   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8144   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8145   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8146 }
8147
8148 static void
8149 do_vfp_sp_compare_z (void)
8150 {
8151   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8152 }
8153
8154 static void
8155 do_vfp_dp_sp_cvt (void)
8156 {
8157   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8158   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8159 }
8160
8161 static void
8162 do_vfp_sp_dp_cvt (void)
8163 {
8164   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8165   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8166 }
8167
8168 static void
8169 do_vfp_reg_from_sp (void)
8170 {
8171   inst.instruction |= inst.operands[0].reg << 12;
8172   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8173 }
8174
8175 static void
8176 do_vfp_reg2_from_sp2 (void)
8177 {
8178   constraint (inst.operands[2].imm != 2,
8179               _("only two consecutive VFP SP registers allowed here"));
8180   inst.instruction |= inst.operands[0].reg << 12;
8181   inst.instruction |= inst.operands[1].reg << 16;
8182   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8183 }
8184
8185 static void
8186 do_vfp_sp_from_reg (void)
8187 {
8188   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
8189   inst.instruction |= inst.operands[1].reg << 12;
8190 }
8191
8192 static void
8193 do_vfp_sp2_from_reg2 (void)
8194 {
8195   constraint (inst.operands[0].imm != 2,
8196               _("only two consecutive VFP SP registers allowed here"));
8197   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
8198   inst.instruction |= inst.operands[1].reg << 12;
8199   inst.instruction |= inst.operands[2].reg << 16;
8200 }
8201
8202 static void
8203 do_vfp_sp_ldst (void)
8204 {
8205   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8206   encode_arm_cp_address (1, FALSE, TRUE, 0);
8207 }
8208
8209 static void
8210 do_vfp_dp_ldst (void)
8211 {
8212   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8213   encode_arm_cp_address (1, FALSE, TRUE, 0);
8214 }
8215
8216
8217 static void
8218 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
8219 {
8220   if (inst.operands[0].writeback)
8221     inst.instruction |= WRITE_BACK;
8222   else
8223     constraint (ldstm_type != VFP_LDSTMIA,
8224                 _("this addressing mode requires base-register writeback"));
8225   inst.instruction |= inst.operands[0].reg << 16;
8226   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
8227   inst.instruction |= inst.operands[1].imm;
8228 }
8229
8230 static void
8231 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
8232 {
8233   int count;
8234
8235   if (inst.operands[0].writeback)
8236     inst.instruction |= WRITE_BACK;
8237   else
8238     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
8239                 _("this addressing mode requires base-register writeback"));
8240
8241   inst.instruction |= inst.operands[0].reg << 16;
8242   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8243
8244   count = inst.operands[1].imm << 1;
8245   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
8246     count += 1;
8247
8248   inst.instruction |= count;
8249 }
8250
8251 static void
8252 do_vfp_sp_ldstmia (void)
8253 {
8254   vfp_sp_ldstm (VFP_LDSTMIA);
8255 }
8256
8257 static void
8258 do_vfp_sp_ldstmdb (void)
8259 {
8260   vfp_sp_ldstm (VFP_LDSTMDB);
8261 }
8262
8263 static void
8264 do_vfp_dp_ldstmia (void)
8265 {
8266   vfp_dp_ldstm (VFP_LDSTMIA);
8267 }
8268
8269 static void
8270 do_vfp_dp_ldstmdb (void)
8271 {
8272   vfp_dp_ldstm (VFP_LDSTMDB);
8273 }
8274
8275 static void
8276 do_vfp_xp_ldstmia (void)
8277 {
8278   vfp_dp_ldstm (VFP_LDSTMIAX);
8279 }
8280
8281 static void
8282 do_vfp_xp_ldstmdb (void)
8283 {
8284   vfp_dp_ldstm (VFP_LDSTMDBX);
8285 }
8286
8287 static void
8288 do_vfp_dp_rd_rm (void)
8289 {
8290   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8291   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8292 }
8293
8294 static void
8295 do_vfp_dp_rn_rd (void)
8296 {
8297   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
8298   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8299 }
8300
8301 static void
8302 do_vfp_dp_rd_rn (void)
8303 {
8304   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8305   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8306 }
8307
8308 static void
8309 do_vfp_dp_rd_rn_rm (void)
8310 {
8311   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8312   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8313   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
8314 }
8315
8316 static void
8317 do_vfp_dp_rd (void)
8318 {
8319   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8320 }
8321
8322 static void
8323 do_vfp_dp_rm_rd_rn (void)
8324 {
8325   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
8326   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8327   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
8328 }
8329
8330 /* VFPv3 instructions.  */
8331 static void
8332 do_vfp_sp_const (void)
8333 {
8334   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8335   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8336   inst.instruction |= (inst.operands[1].imm & 0x0f);
8337 }
8338
8339 static void
8340 do_vfp_dp_const (void)
8341 {
8342   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8343   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8344   inst.instruction |= (inst.operands[1].imm & 0x0f);
8345 }
8346
8347 static void
8348 vfp_conv (int srcsize)
8349 {
8350   unsigned immbits = srcsize - inst.operands[1].imm;
8351   inst.instruction |= (immbits & 1) << 5;
8352   inst.instruction |= (immbits >> 1);
8353 }
8354
8355 static void
8356 do_vfp_sp_conv_16 (void)
8357 {
8358   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8359   vfp_conv (16);
8360 }
8361
8362 static void
8363 do_vfp_dp_conv_16 (void)
8364 {
8365   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8366   vfp_conv (16);
8367 }
8368
8369 static void
8370 do_vfp_sp_conv_32 (void)
8371 {
8372   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8373   vfp_conv (32);
8374 }
8375
8376 static void
8377 do_vfp_dp_conv_32 (void)
8378 {
8379   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8380   vfp_conv (32);
8381 }
8382 \f
8383 /* FPA instructions.  Also in a logical order.  */
8384
8385 static void
8386 do_fpa_cmp (void)
8387 {
8388   inst.instruction |= inst.operands[0].reg << 16;
8389   inst.instruction |= inst.operands[1].reg;
8390 }
8391
8392 static void
8393 do_fpa_ldmstm (void)
8394 {
8395   inst.instruction |= inst.operands[0].reg << 12;
8396   switch (inst.operands[1].imm)
8397     {
8398     case 1: inst.instruction |= CP_T_X;          break;
8399     case 2: inst.instruction |= CP_T_Y;          break;
8400     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
8401     case 4:                                      break;
8402     default: abort ();
8403     }
8404
8405   if (inst.instruction & (PRE_INDEX | INDEX_UP))
8406     {
8407       /* The instruction specified "ea" or "fd", so we can only accept
8408          [Rn]{!}.  The instruction does not really support stacking or
8409          unstacking, so we have to emulate these by setting appropriate
8410          bits and offsets.  */
8411       constraint (inst.reloc.exp.X_op != O_constant
8412                   || inst.reloc.exp.X_add_number != 0,
8413                   _("this instruction does not support indexing"));
8414
8415       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
8416         inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
8417
8418       if (!(inst.instruction & INDEX_UP))
8419         inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
8420
8421       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
8422         {
8423           inst.operands[2].preind = 0;
8424           inst.operands[2].postind = 1;
8425         }
8426     }
8427
8428   encode_arm_cp_address (2, TRUE, TRUE, 0);
8429 }
8430 \f
8431 /* iWMMXt instructions: strictly in alphabetical order.  */
8432
8433 static void
8434 do_iwmmxt_tandorc (void)
8435 {
8436   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
8437 }
8438
8439 static void
8440 do_iwmmxt_textrc (void)
8441 {
8442   inst.instruction |= inst.operands[0].reg << 12;
8443   inst.instruction |= inst.operands[1].imm;
8444 }
8445
8446 static void
8447 do_iwmmxt_textrm (void)
8448 {
8449   inst.instruction |= inst.operands[0].reg << 12;
8450   inst.instruction |= inst.operands[1].reg << 16;
8451   inst.instruction |= inst.operands[2].imm;
8452 }
8453
8454 static void
8455 do_iwmmxt_tinsr (void)
8456 {
8457   inst.instruction |= inst.operands[0].reg << 16;
8458   inst.instruction |= inst.operands[1].reg << 12;
8459   inst.instruction |= inst.operands[2].imm;
8460 }
8461
8462 static void
8463 do_iwmmxt_tmia (void)
8464 {
8465   inst.instruction |= inst.operands[0].reg << 5;
8466   inst.instruction |= inst.operands[1].reg;
8467   inst.instruction |= inst.operands[2].reg << 12;
8468 }
8469
8470 static void
8471 do_iwmmxt_waligni (void)
8472 {
8473   inst.instruction |= inst.operands[0].reg << 12;
8474   inst.instruction |= inst.operands[1].reg << 16;
8475   inst.instruction |= inst.operands[2].reg;
8476   inst.instruction |= inst.operands[3].imm << 20;
8477 }
8478
8479 static void
8480 do_iwmmxt_wmerge (void)
8481 {
8482   inst.instruction |= inst.operands[0].reg << 12;
8483   inst.instruction |= inst.operands[1].reg << 16;
8484   inst.instruction |= inst.operands[2].reg;
8485   inst.instruction |= inst.operands[3].imm << 21;
8486 }
8487
8488 static void
8489 do_iwmmxt_wmov (void)
8490 {
8491   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
8492   inst.instruction |= inst.operands[0].reg << 12;
8493   inst.instruction |= inst.operands[1].reg << 16;
8494   inst.instruction |= inst.operands[1].reg;
8495 }
8496
8497 static void
8498 do_iwmmxt_wldstbh (void)
8499 {
8500   int reloc;
8501   inst.instruction |= inst.operands[0].reg << 12;
8502   if (thumb_mode)
8503     reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
8504   else
8505     reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
8506   encode_arm_cp_address (1, TRUE, FALSE, reloc);
8507 }
8508
8509 static void
8510 do_iwmmxt_wldstw (void)
8511 {
8512   /* RIWR_RIWC clears .isreg for a control register.  */
8513   if (!inst.operands[0].isreg)
8514     {
8515       constraint (inst.cond != COND_ALWAYS, BAD_COND);
8516       inst.instruction |= 0xf0000000;
8517     }
8518
8519   inst.instruction |= inst.operands[0].reg << 12;
8520   encode_arm_cp_address (1, TRUE, TRUE, 0);
8521 }
8522
8523 static void
8524 do_iwmmxt_wldstd (void)
8525 {
8526   inst.instruction |= inst.operands[0].reg << 12;
8527   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
8528       && inst.operands[1].immisreg)
8529     {
8530       inst.instruction &= ~0x1a000ff;
8531       inst.instruction |= (0xf << 28);
8532       if (inst.operands[1].preind)
8533         inst.instruction |= PRE_INDEX;
8534       if (!inst.operands[1].negative)
8535         inst.instruction |= INDEX_UP;
8536       if (inst.operands[1].writeback)
8537         inst.instruction |= WRITE_BACK;
8538       inst.instruction |= inst.operands[1].reg << 16;
8539       inst.instruction |= inst.reloc.exp.X_add_number << 4;
8540       inst.instruction |= inst.operands[1].imm;
8541     }
8542   else
8543     encode_arm_cp_address (1, TRUE, FALSE, 0);
8544 }
8545
8546 static void
8547 do_iwmmxt_wshufh (void)
8548 {
8549   inst.instruction |= inst.operands[0].reg << 12;
8550   inst.instruction |= inst.operands[1].reg << 16;
8551   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
8552   inst.instruction |= (inst.operands[2].imm & 0x0f);
8553 }
8554
8555 static void
8556 do_iwmmxt_wzero (void)
8557 {
8558   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
8559   inst.instruction |= inst.operands[0].reg;
8560   inst.instruction |= inst.operands[0].reg << 12;
8561   inst.instruction |= inst.operands[0].reg << 16;
8562 }
8563
8564 static void
8565 do_iwmmxt_wrwrwr_or_imm5 (void)
8566 {
8567   if (inst.operands[2].isreg)
8568     do_rd_rn_rm ();
8569   else {
8570     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
8571                 _("immediate operand requires iWMMXt2"));
8572     do_rd_rn ();
8573     if (inst.operands[2].imm == 0)
8574       {
8575         switch ((inst.instruction >> 20) & 0xf)
8576           {
8577           case 4:
8578           case 5:
8579           case 6:
8580           case 7:
8581             /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
8582             inst.operands[2].imm = 16;
8583             inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
8584             break;
8585           case 8:
8586           case 9:
8587           case 10:
8588           case 11:
8589             /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
8590             inst.operands[2].imm = 32;
8591             inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
8592             break;
8593           case 12:
8594           case 13:
8595           case 14:
8596           case 15:
8597             {
8598               /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
8599               unsigned long wrn;
8600               wrn = (inst.instruction >> 16) & 0xf;
8601               inst.instruction &= 0xff0fff0f;
8602               inst.instruction |= wrn;
8603               /* Bail out here; the instruction is now assembled.  */
8604               return;
8605             }
8606           }
8607       }
8608     /* Map 32 -> 0, etc.  */
8609     inst.operands[2].imm &= 0x1f;
8610     inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
8611   }
8612 }
8613 \f
8614 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
8615    operations first, then control, shift, and load/store.  */
8616
8617 /* Insns like "foo X,Y,Z".  */
8618
8619 static void
8620 do_mav_triple (void)
8621 {
8622   inst.instruction |= inst.operands[0].reg << 16;
8623   inst.instruction |= inst.operands[1].reg;
8624   inst.instruction |= inst.operands[2].reg << 12;
8625 }
8626
8627 /* Insns like "foo W,X,Y,Z".
8628     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
8629
8630 static void
8631 do_mav_quad (void)
8632 {
8633   inst.instruction |= inst.operands[0].reg << 5;
8634   inst.instruction |= inst.operands[1].reg << 12;
8635   inst.instruction |= inst.operands[2].reg << 16;
8636   inst.instruction |= inst.operands[3].reg;
8637 }
8638
8639 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
8640 static void
8641 do_mav_dspsc (void)
8642 {
8643   inst.instruction |= inst.operands[1].reg << 12;
8644 }
8645
8646 /* Maverick shift immediate instructions.
8647    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
8648    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
8649
8650 static void
8651 do_mav_shift (void)
8652 {
8653   int imm = inst.operands[2].imm;
8654
8655   inst.instruction |= inst.operands[0].reg << 12;
8656   inst.instruction |= inst.operands[1].reg << 16;
8657
8658   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
8659      Bits 5-7 of the insn should have bits 4-6 of the immediate.
8660      Bit 4 should be 0.  */
8661   imm = (imm & 0xf) | ((imm & 0x70) << 1);
8662
8663   inst.instruction |= imm;
8664 }
8665 \f
8666 /* XScale instructions.  Also sorted arithmetic before move.  */
8667
8668 /* Xscale multiply-accumulate (argument parse)
8669      MIAcc   acc0,Rm,Rs
8670      MIAPHcc acc0,Rm,Rs
8671      MIAxycc acc0,Rm,Rs.  */
8672
8673 static void
8674 do_xsc_mia (void)
8675 {
8676   inst.instruction |= inst.operands[1].reg;
8677   inst.instruction |= inst.operands[2].reg << 12;
8678 }
8679
8680 /* Xscale move-accumulator-register (argument parse)
8681
8682      MARcc   acc0,RdLo,RdHi.  */
8683
8684 static void
8685 do_xsc_mar (void)
8686 {
8687   inst.instruction |= inst.operands[1].reg << 12;
8688   inst.instruction |= inst.operands[2].reg << 16;
8689 }
8690
8691 /* Xscale move-register-accumulator (argument parse)
8692
8693      MRAcc   RdLo,RdHi,acc0.  */
8694
8695 static void
8696 do_xsc_mra (void)
8697 {
8698   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
8699   inst.instruction |= inst.operands[0].reg << 12;
8700   inst.instruction |= inst.operands[1].reg << 16;
8701 }
8702 \f
8703 /* Encoding functions relevant only to Thumb.  */
8704
8705 /* inst.operands[i] is a shifted-register operand; encode
8706    it into inst.instruction in the format used by Thumb32.  */
8707
8708 static void
8709 encode_thumb32_shifted_operand (int i)
8710 {
8711   unsigned int value = inst.reloc.exp.X_add_number;
8712   unsigned int shift = inst.operands[i].shift_kind;
8713
8714   constraint (inst.operands[i].immisreg,
8715               _("shift by register not allowed in thumb mode"));
8716   inst.instruction |= inst.operands[i].reg;
8717   if (shift == SHIFT_RRX)
8718     inst.instruction |= SHIFT_ROR << 4;
8719   else
8720     {
8721       constraint (inst.reloc.exp.X_op != O_constant,
8722                   _("expression too complex"));
8723
8724       constraint (value > 32
8725                   || (value == 32 && (shift == SHIFT_LSL
8726                                       || shift == SHIFT_ROR)),
8727                   _("shift expression is too large"));
8728
8729       if (value == 0)
8730         shift = SHIFT_LSL;
8731       else if (value == 32)
8732         value = 0;
8733
8734       inst.instruction |= shift << 4;
8735       inst.instruction |= (value & 0x1c) << 10;
8736       inst.instruction |= (value & 0x03) << 6;
8737     }
8738 }
8739
8740
8741 /* inst.operands[i] was set up by parse_address.  Encode it into a
8742    Thumb32 format load or store instruction.  Reject forms that cannot
8743    be used with such instructions.  If is_t is true, reject forms that
8744    cannot be used with a T instruction; if is_d is true, reject forms
8745    that cannot be used with a D instruction.  If it is a store insn,
8746    reject PC in Rn.  */
8747
8748 static void
8749 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
8750 {
8751   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
8752
8753   constraint (!inst.operands[i].isreg,
8754               _("Instruction does not support =N addresses"));
8755
8756   inst.instruction |= inst.operands[i].reg << 16;
8757   if (inst.operands[i].immisreg)
8758     {
8759       constraint (is_pc, BAD_PC_ADDRESSING);
8760       constraint (is_t || is_d, _("cannot use register index with this instruction"));
8761       constraint (inst.operands[i].negative,
8762                   _("Thumb does not support negative register indexing"));
8763       constraint (inst.operands[i].postind,
8764                   _("Thumb does not support register post-indexing"));
8765       constraint (inst.operands[i].writeback,
8766                   _("Thumb does not support register indexing with writeback"));
8767       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
8768                   _("Thumb supports only LSL in shifted register indexing"));
8769
8770       inst.instruction |= inst.operands[i].imm;
8771       if (inst.operands[i].shifted)
8772         {
8773           constraint (inst.reloc.exp.X_op != O_constant,
8774                       _("expression too complex"));
8775           constraint (inst.reloc.exp.X_add_number < 0
8776                       || inst.reloc.exp.X_add_number > 3,
8777                       _("shift out of range"));
8778           inst.instruction |= inst.reloc.exp.X_add_number << 4;
8779         }
8780       inst.reloc.type = BFD_RELOC_UNUSED;
8781     }
8782   else if (inst.operands[i].preind)
8783     {
8784       constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
8785       constraint (is_t && inst.operands[i].writeback,
8786                   _("cannot use writeback with this instruction"));
8787       constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0)
8788                   && !inst.reloc.pc_rel, BAD_PC_ADDRESSING);
8789
8790       if (is_d)
8791         {
8792           inst.instruction |= 0x01000000;
8793           if (inst.operands[i].writeback)
8794             inst.instruction |= 0x00200000;
8795         }
8796       else
8797         {
8798           inst.instruction |= 0x00000c00;
8799           if (inst.operands[i].writeback)
8800             inst.instruction |= 0x00000100;
8801         }
8802       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
8803     }
8804   else if (inst.operands[i].postind)
8805     {
8806       gas_assert (inst.operands[i].writeback);
8807       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
8808       constraint (is_t, _("cannot use post-indexing with this instruction"));
8809
8810       if (is_d)
8811         inst.instruction |= 0x00200000;
8812       else
8813         inst.instruction |= 0x00000900;
8814       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
8815     }
8816   else /* unindexed - only for coprocessor */
8817     inst.error = _("instruction does not accept unindexed addressing");
8818 }
8819
8820 /* Table of Thumb instructions which exist in both 16- and 32-bit
8821    encodings (the latter only in post-V6T2 cores).  The index is the
8822    value used in the insns table below.  When there is more than one
8823    possible 16-bit encoding for the instruction, this table always
8824    holds variant (1).
8825    Also contains several pseudo-instructions used during relaxation.  */
8826 #define T16_32_TAB                              \
8827   X(_adc,   4140, eb400000),                    \
8828   X(_adcs,  4140, eb500000),                    \
8829   X(_add,   1c00, eb000000),                    \
8830   X(_adds,  1c00, eb100000),                    \
8831   X(_addi,  0000, f1000000),                    \
8832   X(_addis, 0000, f1100000),                    \
8833   X(_add_pc,000f, f20f0000),                    \
8834   X(_add_sp,000d, f10d0000),                    \
8835   X(_adr,   000f, f20f0000),                    \
8836   X(_and,   4000, ea000000),                    \
8837   X(_ands,  4000, ea100000),                    \
8838   X(_asr,   1000, fa40f000),                    \
8839   X(_asrs,  1000, fa50f000),                    \
8840   X(_b,     e000, f000b000),                    \
8841   X(_bcond, d000, f0008000),                    \
8842   X(_bic,   4380, ea200000),                    \
8843   X(_bics,  4380, ea300000),                    \
8844   X(_cmn,   42c0, eb100f00),                    \
8845   X(_cmp,   2800, ebb00f00),                    \
8846   X(_cpsie, b660, f3af8400),                    \
8847   X(_cpsid, b670, f3af8600),                    \
8848   X(_cpy,   4600, ea4f0000),                    \
8849   X(_dec_sp,80dd, f1ad0d00),                    \
8850   X(_eor,   4040, ea800000),                    \
8851   X(_eors,  4040, ea900000),                    \
8852   X(_inc_sp,00dd, f10d0d00),                    \
8853   X(_ldmia, c800, e8900000),                    \
8854   X(_ldr,   6800, f8500000),                    \
8855   X(_ldrb,  7800, f8100000),                    \
8856   X(_ldrh,  8800, f8300000),                    \
8857   X(_ldrsb, 5600, f9100000),                    \
8858   X(_ldrsh, 5e00, f9300000),                    \
8859   X(_ldr_pc,4800, f85f0000),                    \
8860   X(_ldr_pc2,4800, f85f0000),                   \
8861   X(_ldr_sp,9800, f85d0000),                    \
8862   X(_lsl,   0000, fa00f000),                    \
8863   X(_lsls,  0000, fa10f000),                    \
8864   X(_lsr,   0800, fa20f000),                    \
8865   X(_lsrs,  0800, fa30f000),                    \
8866   X(_mov,   2000, ea4f0000),                    \
8867   X(_movs,  2000, ea5f0000),                    \
8868   X(_mul,   4340, fb00f000),                     \
8869   X(_muls,  4340, ffffffff), /* no 32b muls */  \
8870   X(_mvn,   43c0, ea6f0000),                    \
8871   X(_mvns,  43c0, ea7f0000),                    \
8872   X(_neg,   4240, f1c00000), /* rsb #0 */       \
8873   X(_negs,  4240, f1d00000), /* rsbs #0 */      \
8874   X(_orr,   4300, ea400000),                    \
8875   X(_orrs,  4300, ea500000),                    \
8876   X(_pop,   bc00, e8bd0000), /* ldmia sp!,... */        \
8877   X(_push,  b400, e92d0000), /* stmdb sp!,... */        \
8878   X(_rev,   ba00, fa90f080),                    \
8879   X(_rev16, ba40, fa90f090),                    \
8880   X(_revsh, bac0, fa90f0b0),                    \
8881   X(_ror,   41c0, fa60f000),                    \
8882   X(_rors,  41c0, fa70f000),                    \
8883   X(_sbc,   4180, eb600000),                    \
8884   X(_sbcs,  4180, eb700000),                    \
8885   X(_stmia, c000, e8800000),                    \
8886   X(_str,   6000, f8400000),                    \
8887   X(_strb,  7000, f8000000),                    \
8888   X(_strh,  8000, f8200000),                    \
8889   X(_str_sp,9000, f84d0000),                    \
8890   X(_sub,   1e00, eba00000),                    \
8891   X(_subs,  1e00, ebb00000),                    \
8892   X(_subi,  8000, f1a00000),                    \
8893   X(_subis, 8000, f1b00000),                    \
8894   X(_sxtb,  b240, fa4ff080),                    \
8895   X(_sxth,  b200, fa0ff080),                    \
8896   X(_tst,   4200, ea100f00),                    \
8897   X(_uxtb,  b2c0, fa5ff080),                    \
8898   X(_uxth,  b280, fa1ff080),                    \
8899   X(_nop,   bf00, f3af8000),                    \
8900   X(_yield, bf10, f3af8001),                    \
8901   X(_wfe,   bf20, f3af8002),                    \
8902   X(_wfi,   bf30, f3af8003),                    \
8903   X(_sev,   bf40, f3af8004),
8904
8905 /* To catch errors in encoding functions, the codes are all offset by
8906    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
8907    as 16-bit instructions.  */
8908 #define X(a,b,c) T_MNEM##a
8909 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
8910 #undef X
8911
8912 #define X(a,b,c) 0x##b
8913 static const unsigned short thumb_op16[] = { T16_32_TAB };
8914 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
8915 #undef X
8916
8917 #define X(a,b,c) 0x##c
8918 static const unsigned int thumb_op32[] = { T16_32_TAB };
8919 #define THUMB_OP32(n)        (thumb_op32[(n) - (T16_32_OFFSET + 1)])
8920 #define THUMB_SETS_FLAGS(n)  (THUMB_OP32 (n) & 0x00100000)
8921 #undef X
8922 #undef T16_32_TAB
8923
8924 /* Thumb instruction encoders, in alphabetical order.  */
8925
8926 /* ADDW or SUBW.  */
8927
8928 static void
8929 do_t_add_sub_w (void)
8930 {
8931   int Rd, Rn;
8932
8933   Rd = inst.operands[0].reg;
8934   Rn = inst.operands[1].reg;
8935
8936   /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
8937      is the SP-{plus,minus}-immediate form of the instruction.  */
8938   if (Rn == REG_SP)
8939     constraint (Rd == REG_PC, BAD_PC);
8940   else
8941     reject_bad_reg (Rd);
8942
8943   inst.instruction |= (Rn << 16) | (Rd << 8);
8944   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
8945 }
8946
8947 /* Parse an add or subtract instruction.  We get here with inst.instruction
8948    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
8949
8950 static void
8951 do_t_add_sub (void)
8952 {
8953   int Rd, Rs, Rn;
8954
8955   Rd = inst.operands[0].reg;
8956   Rs = (inst.operands[1].present
8957         ? inst.operands[1].reg    /* Rd, Rs, foo */
8958         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
8959
8960   if (Rd == REG_PC)
8961     set_it_insn_type_last ();
8962
8963   if (unified_syntax)
8964     {
8965       bfd_boolean flags;
8966       bfd_boolean narrow;
8967       int opcode;
8968
8969       flags = (inst.instruction == T_MNEM_adds
8970                || inst.instruction == T_MNEM_subs);
8971       if (flags)
8972         narrow = !in_it_block ();
8973       else
8974         narrow = in_it_block ();
8975       if (!inst.operands[2].isreg)
8976         {
8977           int add;
8978
8979           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
8980
8981           add = (inst.instruction == T_MNEM_add
8982                  || inst.instruction == T_MNEM_adds);
8983           opcode = 0;
8984           if (inst.size_req != 4)
8985             {
8986               /* Attempt to use a narrow opcode, with relaxation if
8987                  appropriate.  */
8988               if (Rd == REG_SP && Rs == REG_SP && !flags)
8989                 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
8990               else if (Rd <= 7 && Rs == REG_SP && add && !flags)
8991                 opcode = T_MNEM_add_sp;
8992               else if (Rd <= 7 && Rs == REG_PC && add && !flags)
8993                 opcode = T_MNEM_add_pc;
8994               else if (Rd <= 7 && Rs <= 7 && narrow)
8995                 {
8996                   if (flags)
8997                     opcode = add ? T_MNEM_addis : T_MNEM_subis;
8998                   else
8999                     opcode = add ? T_MNEM_addi : T_MNEM_subi;
9000                 }
9001               if (opcode)
9002                 {
9003                   inst.instruction = THUMB_OP16(opcode);
9004                   inst.instruction |= (Rd << 4) | Rs;
9005                   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9006                   if (inst.size_req != 2)
9007                     inst.relax = opcode;
9008                 }
9009               else
9010                 constraint (inst.size_req == 2, BAD_HIREG);
9011             }
9012           if (inst.size_req == 4
9013               || (inst.size_req != 2 && !opcode))
9014             {
9015               if (Rd == REG_PC)
9016                 {
9017                   constraint (add, BAD_PC);
9018                   constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9019                              _("only SUBS PC, LR, #const allowed"));
9020                   constraint (inst.reloc.exp.X_op != O_constant,
9021                               _("expression too complex"));
9022                   constraint (inst.reloc.exp.X_add_number < 0
9023                               || inst.reloc.exp.X_add_number > 0xff,
9024                              _("immediate value out of range"));
9025                   inst.instruction = T2_SUBS_PC_LR
9026                                      | inst.reloc.exp.X_add_number;
9027                   inst.reloc.type = BFD_RELOC_UNUSED;
9028                   return;
9029                 }
9030               else if (Rs == REG_PC)
9031                 {
9032                   /* Always use addw/subw.  */
9033                   inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9034                   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9035                 }
9036               else
9037                 {
9038                   inst.instruction = THUMB_OP32 (inst.instruction);
9039                   inst.instruction = (inst.instruction & 0xe1ffffff)
9040                                      | 0x10000000;
9041                   if (flags)
9042                     inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9043                   else
9044                     inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9045                 }
9046               inst.instruction |= Rd << 8;
9047               inst.instruction |= Rs << 16;
9048             }
9049         }
9050       else
9051         {
9052           Rn = inst.operands[2].reg;
9053           /* See if we can do this with a 16-bit instruction.  */
9054           if (!inst.operands[2].shifted && inst.size_req != 4)
9055             {
9056               if (Rd > 7 || Rs > 7 || Rn > 7)
9057                 narrow = FALSE;
9058
9059               if (narrow)
9060                 {
9061                   inst.instruction = ((inst.instruction == T_MNEM_adds
9062                                        || inst.instruction == T_MNEM_add)
9063                                       ? T_OPCODE_ADD_R3
9064                                       : T_OPCODE_SUB_R3);
9065                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9066                   return;
9067                 }
9068
9069               if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
9070                 {
9071                   /* Thumb-1 cores (except v6-M) require at least one high
9072                      register in a narrow non flag setting add.  */
9073                   if (Rd > 7 || Rn > 7
9074                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9075                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
9076                     {
9077                       if (Rd == Rn)
9078                         {
9079                           Rn = Rs;
9080                           Rs = Rd;
9081                         }
9082                       inst.instruction = T_OPCODE_ADD_HI;
9083                       inst.instruction |= (Rd & 8) << 4;
9084                       inst.instruction |= (Rd & 7);
9085                       inst.instruction |= Rn << 3;
9086                       return;
9087                     }
9088                 }
9089             }
9090
9091           constraint (Rd == REG_PC, BAD_PC);
9092           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9093           constraint (Rs == REG_PC, BAD_PC);
9094           reject_bad_reg (Rn);
9095
9096           /* If we get here, it can't be done in 16 bits.  */
9097           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9098                       _("shift must be constant"));
9099           inst.instruction = THUMB_OP32 (inst.instruction);
9100           inst.instruction |= Rd << 8;
9101           inst.instruction |= Rs << 16;
9102           encode_thumb32_shifted_operand (2);
9103         }
9104     }
9105   else
9106     {
9107       constraint (inst.instruction == T_MNEM_adds
9108                   || inst.instruction == T_MNEM_subs,
9109                   BAD_THUMB32);
9110
9111       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
9112         {
9113           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9114                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9115                       BAD_HIREG);
9116
9117           inst.instruction = (inst.instruction == T_MNEM_add
9118                               ? 0x0000 : 0x8000);
9119           inst.instruction |= (Rd << 4) | Rs;
9120           inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9121           return;
9122         }
9123
9124       Rn = inst.operands[2].reg;
9125       constraint (inst.operands[2].shifted, _("unshifted register required"));
9126
9127       /* We now have Rd, Rs, and Rn set to registers.  */
9128       if (Rd > 7 || Rs > 7 || Rn > 7)
9129         {
9130           /* Can't do this for SUB.      */
9131           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9132           inst.instruction = T_OPCODE_ADD_HI;
9133           inst.instruction |= (Rd & 8) << 4;
9134           inst.instruction |= (Rd & 7);
9135           if (Rs == Rd)
9136             inst.instruction |= Rn << 3;
9137           else if (Rn == Rd)
9138             inst.instruction |= Rs << 3;
9139           else
9140             constraint (1, _("dest must overlap one source register"));
9141         }
9142       else
9143         {
9144           inst.instruction = (inst.instruction == T_MNEM_add
9145                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9146           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9147         }
9148     }
9149 }
9150
9151 static void
9152 do_t_adr (void)
9153 {
9154   unsigned Rd;
9155
9156   Rd = inst.operands[0].reg;
9157   reject_bad_reg (Rd);
9158
9159   if (unified_syntax && inst.size_req == 0 && Rd <= 7)
9160     {
9161       /* Defer to section relaxation.  */
9162       inst.relax = inst.instruction;
9163       inst.instruction = THUMB_OP16 (inst.instruction);
9164       inst.instruction |= Rd << 4;
9165     }
9166   else if (unified_syntax && inst.size_req != 2)
9167     {
9168       /* Generate a 32-bit opcode.  */
9169       inst.instruction = THUMB_OP32 (inst.instruction);
9170       inst.instruction |= Rd << 8;
9171       inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9172       inst.reloc.pc_rel = 1;
9173     }
9174   else
9175     {
9176       /* Generate a 16-bit opcode.  */
9177       inst.instruction = THUMB_OP16 (inst.instruction);
9178       inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9179       inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
9180       inst.reloc.pc_rel = 1;
9181
9182       inst.instruction |= Rd << 4;
9183     }
9184 }
9185
9186 /* Arithmetic instructions for which there is just one 16-bit
9187    instruction encoding, and it allows only two low registers.
9188    For maximal compatibility with ARM syntax, we allow three register
9189    operands even when Thumb-32 instructions are not available, as long
9190    as the first two are identical.  For instance, both "sbc r0,r1" and
9191    "sbc r0,r0,r1" are allowed.  */
9192 static void
9193 do_t_arit3 (void)
9194 {
9195   int Rd, Rs, Rn;
9196
9197   Rd = inst.operands[0].reg;
9198   Rs = (inst.operands[1].present
9199         ? inst.operands[1].reg    /* Rd, Rs, foo */
9200         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9201   Rn = inst.operands[2].reg;
9202
9203   reject_bad_reg (Rd);
9204   reject_bad_reg (Rs);
9205   if (inst.operands[2].isreg)
9206     reject_bad_reg (Rn);
9207
9208   if (unified_syntax)
9209     {
9210       if (!inst.operands[2].isreg)
9211         {
9212           /* For an immediate, we always generate a 32-bit opcode;
9213              section relaxation will shrink it later if possible.  */
9214           inst.instruction = THUMB_OP32 (inst.instruction);
9215           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9216           inst.instruction |= Rd << 8;
9217           inst.instruction |= Rs << 16;
9218           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9219         }
9220       else
9221         {
9222           bfd_boolean narrow;
9223
9224           /* See if we can do this with a 16-bit instruction.  */
9225           if (THUMB_SETS_FLAGS (inst.instruction))
9226             narrow = !in_it_block ();
9227           else
9228             narrow = in_it_block ();
9229
9230           if (Rd > 7 || Rn > 7 || Rs > 7)
9231             narrow = FALSE;
9232           if (inst.operands[2].shifted)
9233             narrow = FALSE;
9234           if (inst.size_req == 4)
9235             narrow = FALSE;
9236
9237           if (narrow
9238               && Rd == Rs)
9239             {
9240               inst.instruction = THUMB_OP16 (inst.instruction);
9241               inst.instruction |= Rd;
9242               inst.instruction |= Rn << 3;
9243               return;
9244             }
9245
9246           /* If we get here, it can't be done in 16 bits.  */
9247           constraint (inst.operands[2].shifted
9248                       && inst.operands[2].immisreg,
9249                       _("shift must be constant"));
9250           inst.instruction = THUMB_OP32 (inst.instruction);
9251           inst.instruction |= Rd << 8;
9252           inst.instruction |= Rs << 16;
9253           encode_thumb32_shifted_operand (2);
9254         }
9255     }
9256   else
9257     {
9258       /* On its face this is a lie - the instruction does set the
9259          flags.  However, the only supported mnemonic in this mode
9260          says it doesn't.  */
9261       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9262
9263       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9264                   _("unshifted register required"));
9265       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9266       constraint (Rd != Rs,
9267                   _("dest and source1 must be the same register"));
9268
9269       inst.instruction = THUMB_OP16 (inst.instruction);
9270       inst.instruction |= Rd;
9271       inst.instruction |= Rn << 3;
9272     }
9273 }
9274
9275 /* Similarly, but for instructions where the arithmetic operation is
9276    commutative, so we can allow either of them to be different from
9277    the destination operand in a 16-bit instruction.  For instance, all
9278    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
9279    accepted.  */
9280 static void
9281 do_t_arit3c (void)
9282 {
9283   int Rd, Rs, Rn;
9284
9285   Rd = inst.operands[0].reg;
9286   Rs = (inst.operands[1].present
9287         ? inst.operands[1].reg    /* Rd, Rs, foo */
9288         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9289   Rn = inst.operands[2].reg;
9290
9291   reject_bad_reg (Rd);
9292   reject_bad_reg (Rs);
9293   if (inst.operands[2].isreg)
9294     reject_bad_reg (Rn);
9295
9296   if (unified_syntax)
9297     {
9298       if (!inst.operands[2].isreg)
9299         {
9300           /* For an immediate, we always generate a 32-bit opcode;
9301              section relaxation will shrink it later if possible.  */
9302           inst.instruction = THUMB_OP32 (inst.instruction);
9303           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9304           inst.instruction |= Rd << 8;
9305           inst.instruction |= Rs << 16;
9306           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9307         }
9308       else
9309         {
9310           bfd_boolean narrow;
9311
9312           /* See if we can do this with a 16-bit instruction.  */
9313           if (THUMB_SETS_FLAGS (inst.instruction))
9314             narrow = !in_it_block ();
9315           else
9316             narrow = in_it_block ();
9317
9318           if (Rd > 7 || Rn > 7 || Rs > 7)
9319             narrow = FALSE;
9320           if (inst.operands[2].shifted)
9321             narrow = FALSE;
9322           if (inst.size_req == 4)
9323             narrow = FALSE;
9324
9325           if (narrow)
9326             {
9327               if (Rd == Rs)
9328                 {
9329                   inst.instruction = THUMB_OP16 (inst.instruction);
9330                   inst.instruction |= Rd;
9331                   inst.instruction |= Rn << 3;
9332                   return;
9333                 }
9334               if (Rd == Rn)
9335                 {
9336                   inst.instruction = THUMB_OP16 (inst.instruction);
9337                   inst.instruction |= Rd;
9338                   inst.instruction |= Rs << 3;
9339                   return;
9340                 }
9341             }
9342
9343           /* If we get here, it can't be done in 16 bits.  */
9344           constraint (inst.operands[2].shifted
9345                       && inst.operands[2].immisreg,
9346                       _("shift must be constant"));
9347           inst.instruction = THUMB_OP32 (inst.instruction);
9348           inst.instruction |= Rd << 8;
9349           inst.instruction |= Rs << 16;
9350           encode_thumb32_shifted_operand (2);
9351         }
9352     }
9353   else
9354     {
9355       /* On its face this is a lie - the instruction does set the
9356          flags.  However, the only supported mnemonic in this mode
9357          says it doesn't.  */
9358       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9359
9360       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9361                   _("unshifted register required"));
9362       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9363
9364       inst.instruction = THUMB_OP16 (inst.instruction);
9365       inst.instruction |= Rd;
9366
9367       if (Rd == Rs)
9368         inst.instruction |= Rn << 3;
9369       else if (Rd == Rn)
9370         inst.instruction |= Rs << 3;
9371       else
9372         constraint (1, _("dest must overlap one source register"));
9373     }
9374 }
9375
9376 static void
9377 do_t_barrier (void)
9378 {
9379   if (inst.operands[0].present)
9380     {
9381       constraint ((inst.instruction & 0xf0) != 0x40
9382                   && inst.operands[0].imm != 0xf,
9383                   _("bad barrier type"));
9384       inst.instruction |= inst.operands[0].imm;
9385     }
9386   else
9387     inst.instruction |= 0xf;
9388 }
9389
9390 static void
9391 do_t_bfc (void)
9392 {
9393   unsigned Rd;
9394   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
9395   constraint (msb > 32, _("bit-field extends past end of register"));
9396   /* The instruction encoding stores the LSB and MSB,
9397      not the LSB and width.  */
9398   Rd = inst.operands[0].reg;
9399   reject_bad_reg (Rd);
9400   inst.instruction |= Rd << 8;
9401   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
9402   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
9403   inst.instruction |= msb - 1;
9404 }
9405
9406 static void
9407 do_t_bfi (void)
9408 {
9409   int Rd, Rn;
9410   unsigned int msb;
9411
9412   Rd = inst.operands[0].reg;
9413   reject_bad_reg (Rd);
9414
9415   /* #0 in second position is alternative syntax for bfc, which is
9416      the same instruction but with REG_PC in the Rm field.  */
9417   if (!inst.operands[1].isreg)
9418     Rn = REG_PC;
9419   else
9420     {
9421       Rn = inst.operands[1].reg;
9422       reject_bad_reg (Rn);
9423     }
9424
9425   msb = inst.operands[2].imm + inst.operands[3].imm;
9426   constraint (msb > 32, _("bit-field extends past end of register"));
9427   /* The instruction encoding stores the LSB and MSB,
9428      not the LSB and width.  */
9429   inst.instruction |= Rd << 8;
9430   inst.instruction |= Rn << 16;
9431   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9432   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9433   inst.instruction |= msb - 1;
9434 }
9435
9436 static void
9437 do_t_bfx (void)
9438 {
9439   unsigned Rd, Rn;
9440
9441   Rd = inst.operands[0].reg;
9442   Rn = inst.operands[1].reg;
9443
9444   reject_bad_reg (Rd);
9445   reject_bad_reg (Rn);
9446
9447   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
9448               _("bit-field extends past end of register"));
9449   inst.instruction |= Rd << 8;
9450   inst.instruction |= Rn << 16;
9451   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9452   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9453   inst.instruction |= inst.operands[3].imm - 1;
9454 }
9455
9456 /* ARM V5 Thumb BLX (argument parse)
9457         BLX <target_addr>       which is BLX(1)
9458         BLX <Rm>                which is BLX(2)
9459    Unfortunately, there are two different opcodes for this mnemonic.
9460    So, the insns[].value is not used, and the code here zaps values
9461         into inst.instruction.
9462
9463    ??? How to take advantage of the additional two bits of displacement
9464    available in Thumb32 mode?  Need new relocation?  */
9465
9466 static void
9467 do_t_blx (void)
9468 {
9469   set_it_insn_type_last ();
9470
9471   if (inst.operands[0].isreg)
9472     {
9473       constraint (inst.operands[0].reg == REG_PC, BAD_PC);
9474       /* We have a register, so this is BLX(2).  */
9475       inst.instruction |= inst.operands[0].reg << 3;
9476     }
9477   else
9478     {
9479       /* No register.  This must be BLX(1).  */
9480       inst.instruction = 0xf000e800;
9481       inst.reloc.type = BFD_RELOC_THUMB_PCREL_BLX;
9482       inst.reloc.pc_rel = 1;
9483     }
9484 }
9485
9486 static void
9487 do_t_branch (void)
9488 {
9489   int opcode;
9490   int cond;
9491
9492   cond = inst.cond;
9493   set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
9494
9495   if (in_it_block ())
9496     {
9497       /* Conditional branches inside IT blocks are encoded as unconditional
9498          branches.  */
9499       cond = COND_ALWAYS;
9500     }
9501   else
9502     cond = inst.cond;
9503
9504   if (cond != COND_ALWAYS)
9505     opcode = T_MNEM_bcond;
9506   else
9507     opcode = inst.instruction;
9508
9509   if (unified_syntax && inst.size_req == 4)
9510     {
9511       inst.instruction = THUMB_OP32(opcode);
9512       if (cond == COND_ALWAYS)
9513         inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH25;
9514       else
9515         {
9516           gas_assert (cond != 0xF);
9517           inst.instruction |= cond << 22;
9518           inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH20;
9519         }
9520     }
9521   else
9522     {
9523       inst.instruction = THUMB_OP16(opcode);
9524       if (cond == COND_ALWAYS)
9525         inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12;
9526       else
9527         {
9528           inst.instruction |= cond << 8;
9529           inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9;
9530         }
9531       /* Allow section relaxation.  */
9532       if (unified_syntax && inst.size_req != 2)
9533         inst.relax = opcode;
9534     }
9535
9536   inst.reloc.pc_rel = 1;
9537 }
9538
9539 static void
9540 do_t_bkpt (void)
9541 {
9542   constraint (inst.cond != COND_ALWAYS,
9543               _("instruction is always unconditional"));
9544   if (inst.operands[0].present)
9545     {
9546       constraint (inst.operands[0].imm > 255,
9547                   _("immediate value out of range"));
9548       inst.instruction |= inst.operands[0].imm;
9549       set_it_insn_type (NEUTRAL_IT_INSN);
9550     }
9551 }
9552
9553 static void
9554 do_t_branch23 (void)
9555 {
9556   set_it_insn_type_last ();
9557   inst.reloc.type   = BFD_RELOC_THUMB_PCREL_BRANCH23;
9558   inst.reloc.pc_rel = 1;
9559
9560 #if defined(OBJ_COFF)
9561   /* If the destination of the branch is a defined symbol which does not have
9562      the THUMB_FUNC attribute, then we must be calling a function which has
9563      the (interfacearm) attribute.  We look for the Thumb entry point to that
9564      function and change the branch to refer to that function instead.  */
9565   if (   inst.reloc.exp.X_op == O_symbol
9566       && inst.reloc.exp.X_add_symbol != NULL
9567       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
9568       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
9569     inst.reloc.exp.X_add_symbol =
9570       find_real_start (inst.reloc.exp.X_add_symbol);
9571 #endif
9572 }
9573
9574 static void
9575 do_t_bx (void)
9576 {
9577   set_it_insn_type_last ();
9578   inst.instruction |= inst.operands[0].reg << 3;
9579   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
9580      should cause the alignment to be checked once it is known.  This is
9581      because BX PC only works if the instruction is word aligned.  */
9582 }
9583
9584 static void
9585 do_t_bxj (void)
9586 {
9587   int Rm;
9588
9589   set_it_insn_type_last ();
9590   Rm = inst.operands[0].reg;
9591   reject_bad_reg (Rm);
9592   inst.instruction |= Rm << 16;
9593 }
9594
9595 static void
9596 do_t_clz (void)
9597 {
9598   unsigned Rd;
9599   unsigned Rm;
9600
9601   Rd = inst.operands[0].reg;
9602   Rm = inst.operands[1].reg;
9603
9604   reject_bad_reg (Rd);
9605   reject_bad_reg (Rm);
9606
9607   inst.instruction |= Rd << 8;
9608   inst.instruction |= Rm << 16;
9609   inst.instruction |= Rm;
9610 }
9611
9612 static void
9613 do_t_cps (void)
9614 {
9615   set_it_insn_type (OUTSIDE_IT_INSN);
9616   inst.instruction |= inst.operands[0].imm;
9617 }
9618
9619 static void
9620 do_t_cpsi (void)
9621 {
9622   set_it_insn_type (OUTSIDE_IT_INSN);
9623   if (unified_syntax
9624       && (inst.operands[1].present || inst.size_req == 4)
9625       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
9626     {
9627       unsigned int imod = (inst.instruction & 0x0030) >> 4;
9628       inst.instruction = 0xf3af8000;
9629       inst.instruction |= imod << 9;
9630       inst.instruction |= inst.operands[0].imm << 5;
9631       if (inst.operands[1].present)
9632         inst.instruction |= 0x100 | inst.operands[1].imm;
9633     }
9634   else
9635     {
9636       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
9637                   && (inst.operands[0].imm & 4),
9638                   _("selected processor does not support 'A' form "
9639                     "of this instruction"));
9640       constraint (inst.operands[1].present || inst.size_req == 4,
9641                   _("Thumb does not support the 2-argument "
9642                     "form of this instruction"));
9643       inst.instruction |= inst.operands[0].imm;
9644     }
9645 }
9646
9647 /* THUMB CPY instruction (argument parse).  */
9648
9649 static void
9650 do_t_cpy (void)
9651 {
9652   if (inst.size_req == 4)
9653     {
9654       inst.instruction = THUMB_OP32 (T_MNEM_mov);
9655       inst.instruction |= inst.operands[0].reg << 8;
9656       inst.instruction |= inst.operands[1].reg;
9657     }
9658   else
9659     {
9660       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
9661       inst.instruction |= (inst.operands[0].reg & 0x7);
9662       inst.instruction |= inst.operands[1].reg << 3;
9663     }
9664 }
9665
9666 static void
9667 do_t_cbz (void)
9668 {
9669   set_it_insn_type (OUTSIDE_IT_INSN);
9670   constraint (inst.operands[0].reg > 7, BAD_HIREG);
9671   inst.instruction |= inst.operands[0].reg;
9672   inst.reloc.pc_rel = 1;
9673   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
9674 }
9675
9676 static void
9677 do_t_dbg (void)
9678 {
9679   inst.instruction |= inst.operands[0].imm;
9680 }
9681
9682 static void
9683 do_t_div (void)
9684 {
9685   unsigned Rd, Rn, Rm;
9686
9687   Rd = inst.operands[0].reg;
9688   Rn = (inst.operands[1].present
9689         ? inst.operands[1].reg : Rd);
9690   Rm = inst.operands[2].reg;
9691
9692   reject_bad_reg (Rd);
9693   reject_bad_reg (Rn);
9694   reject_bad_reg (Rm);
9695
9696   inst.instruction |= Rd << 8;
9697   inst.instruction |= Rn << 16;
9698   inst.instruction |= Rm;
9699 }
9700
9701 static void
9702 do_t_hint (void)
9703 {
9704   if (unified_syntax && inst.size_req == 4)
9705     inst.instruction = THUMB_OP32 (inst.instruction);
9706   else
9707     inst.instruction = THUMB_OP16 (inst.instruction);
9708 }
9709
9710 static void
9711 do_t_it (void)
9712 {
9713   unsigned int cond = inst.operands[0].imm;
9714
9715   set_it_insn_type (IT_INSN);
9716   now_it.mask = (inst.instruction & 0xf) | 0x10;
9717   now_it.cc = cond;
9718
9719   /* If the condition is a negative condition, invert the mask.  */
9720   if ((cond & 0x1) == 0x0)
9721     {
9722       unsigned int mask = inst.instruction & 0x000f;
9723
9724       if ((mask & 0x7) == 0)
9725         /* no conversion needed */;
9726       else if ((mask & 0x3) == 0)
9727         mask ^= 0x8;
9728       else if ((mask & 0x1) == 0)
9729         mask ^= 0xC;
9730       else
9731         mask ^= 0xE;
9732
9733       inst.instruction &= 0xfff0;
9734       inst.instruction |= mask;
9735     }
9736
9737   inst.instruction |= cond << 4;
9738 }
9739
9740 /* Helper function used for both push/pop and ldm/stm.  */
9741 static void
9742 encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
9743 {
9744   bfd_boolean load;
9745
9746   load = (inst.instruction & (1 << 20)) != 0;
9747
9748   if (mask & (1 << 13))
9749     inst.error =  _("SP not allowed in register list");
9750   if (load)
9751     {
9752       if (mask & (1 << 15))
9753         {
9754           if (mask & (1 << 14))
9755             inst.error = _("LR and PC should not both be in register list");
9756           else
9757             set_it_insn_type_last ();
9758         }
9759
9760       if ((mask & (1 << base)) != 0
9761           && writeback)
9762         as_warn (_("base register should not be in register list "
9763                    "when written back"));
9764     }
9765   else
9766     {
9767       if (mask & (1 << 15))
9768         inst.error = _("PC not allowed in register list");
9769
9770       if (mask & (1 << base))
9771         as_warn (_("value stored for r%d is UNPREDICTABLE"), base);
9772     }
9773
9774   if ((mask & (mask - 1)) == 0)
9775     {
9776       /* Single register transfers implemented as str/ldr.  */
9777       if (writeback)
9778         {
9779           if (inst.instruction & (1 << 23))
9780             inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
9781           else
9782             inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
9783         }
9784       else
9785         {
9786           if (inst.instruction & (1 << 23))
9787             inst.instruction = 0x00800000; /* ia -> [base] */
9788           else
9789             inst.instruction = 0x00000c04; /* db -> [base, #-4] */
9790         }
9791
9792       inst.instruction |= 0xf8400000;
9793       if (load)
9794         inst.instruction |= 0x00100000;
9795
9796       mask = ffs (mask) - 1;
9797       mask <<= 12;
9798     }
9799   else if (writeback)
9800     inst.instruction |= WRITE_BACK;
9801
9802   inst.instruction |= mask;
9803   inst.instruction |= base << 16;
9804 }
9805
9806 static void
9807 do_t_ldmstm (void)
9808 {
9809   /* This really doesn't seem worth it.  */
9810   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
9811               _("expression too complex"));
9812   constraint (inst.operands[1].writeback,
9813               _("Thumb load/store multiple does not support {reglist}^"));
9814
9815   if (unified_syntax)
9816     {
9817       bfd_boolean narrow;
9818       unsigned mask;
9819
9820       narrow = FALSE;
9821       /* See if we can use a 16-bit instruction.  */
9822       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
9823           && inst.size_req != 4
9824           && !(inst.operands[1].imm & ~0xff))
9825         {
9826           mask = 1 << inst.operands[0].reg;
9827
9828           if (inst.operands[0].reg <= 7
9829               && (inst.instruction == T_MNEM_stmia
9830                   ? inst.operands[0].writeback
9831                   : (inst.operands[0].writeback
9832                      == !(inst.operands[1].imm & mask))))
9833             {
9834               if (inst.instruction == T_MNEM_stmia
9835                   && (inst.operands[1].imm & mask)
9836                   && (inst.operands[1].imm & (mask - 1)))
9837                 as_warn (_("value stored for r%d is UNPREDICTABLE"),
9838                          inst.operands[0].reg);
9839
9840               inst.instruction = THUMB_OP16 (inst.instruction);
9841               inst.instruction |= inst.operands[0].reg << 8;
9842               inst.instruction |= inst.operands[1].imm;
9843               narrow = TRUE;
9844             }
9845           else if (inst.operands[0] .reg == REG_SP
9846                    && inst.operands[0].writeback)
9847             {
9848               inst.instruction = THUMB_OP16 (inst.instruction == T_MNEM_stmia
9849                                              ? T_MNEM_push : T_MNEM_pop);
9850               inst.instruction |= inst.operands[1].imm;
9851               narrow = TRUE;
9852             }
9853         }
9854
9855       if (!narrow)
9856         {
9857           if (inst.instruction < 0xffff)
9858             inst.instruction = THUMB_OP32 (inst.instruction);
9859
9860           encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
9861                                 inst.operands[0].writeback);
9862         }
9863     }
9864   else
9865     {
9866       constraint (inst.operands[0].reg > 7
9867                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
9868       constraint (inst.instruction != T_MNEM_ldmia
9869                   && inst.instruction != T_MNEM_stmia,
9870                   _("Thumb-2 instruction only valid in unified syntax"));
9871       if (inst.instruction == T_MNEM_stmia)
9872         {
9873           if (!inst.operands[0].writeback)
9874             as_warn (_("this instruction will write back the base register"));
9875           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
9876               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
9877             as_warn (_("value stored for r%d is UNPREDICTABLE"),
9878                      inst.operands[0].reg);
9879         }
9880       else
9881         {
9882           if (!inst.operands[0].writeback
9883               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
9884             as_warn (_("this instruction will write back the base register"));
9885           else if (inst.operands[0].writeback
9886                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
9887             as_warn (_("this instruction will not write back the base register"));
9888         }
9889
9890       inst.instruction = THUMB_OP16 (inst.instruction);
9891       inst.instruction |= inst.operands[0].reg << 8;
9892       inst.instruction |= inst.operands[1].imm;
9893     }
9894 }
9895
9896 static void
9897 do_t_ldrex (void)
9898 {
9899   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
9900               || inst.operands[1].postind || inst.operands[1].writeback
9901               || inst.operands[1].immisreg || inst.operands[1].shifted
9902               || inst.operands[1].negative,
9903               BAD_ADDR_MODE);
9904
9905   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
9906
9907   inst.instruction |= inst.operands[0].reg << 12;
9908   inst.instruction |= inst.operands[1].reg << 16;
9909   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
9910 }
9911
9912 static void
9913 do_t_ldrexd (void)
9914 {
9915   if (!inst.operands[1].present)
9916     {
9917       constraint (inst.operands[0].reg == REG_LR,
9918                   _("r14 not allowed as first register "
9919                     "when second register is omitted"));
9920       inst.operands[1].reg = inst.operands[0].reg + 1;
9921     }
9922   constraint (inst.operands[0].reg == inst.operands[1].reg,
9923               BAD_OVERLAP);
9924
9925   inst.instruction |= inst.operands[0].reg << 12;
9926   inst.instruction |= inst.operands[1].reg << 8;
9927   inst.instruction |= inst.operands[2].reg << 16;
9928 }
9929
9930 static void
9931 do_t_ldst (void)
9932 {
9933   unsigned long opcode;
9934   int Rn;
9935
9936   if (inst.operands[0].isreg
9937       && !inst.operands[0].preind
9938       && inst.operands[0].reg == REG_PC)
9939     set_it_insn_type_last ();
9940
9941   opcode = inst.instruction;
9942   if (unified_syntax)
9943     {
9944       if (!inst.operands[1].isreg)
9945         {
9946           if (opcode <= 0xffff)
9947             inst.instruction = THUMB_OP32 (opcode);
9948           if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
9949             return;
9950         }
9951       if (inst.operands[1].isreg
9952           && !inst.operands[1].writeback
9953           && !inst.operands[1].shifted && !inst.operands[1].postind
9954           && !inst.operands[1].negative && inst.operands[0].reg <= 7
9955           && opcode <= 0xffff
9956           && inst.size_req != 4)
9957         {
9958           /* Insn may have a 16-bit form.  */
9959           Rn = inst.operands[1].reg;
9960           if (inst.operands[1].immisreg)
9961             {
9962               inst.instruction = THUMB_OP16 (opcode);
9963               /* [Rn, Rik] */
9964               if (Rn <= 7 && inst.operands[1].imm <= 7)
9965                 goto op16;
9966               else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
9967                 reject_bad_reg (inst.operands[1].imm);
9968             }
9969           else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
9970                     && opcode != T_MNEM_ldrsb)
9971                    || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
9972                    || (Rn == REG_SP && opcode == T_MNEM_str))
9973             {
9974               /* [Rn, #const] */
9975               if (Rn > 7)
9976                 {
9977                   if (Rn == REG_PC)
9978                     {
9979                       if (inst.reloc.pc_rel)
9980                         opcode = T_MNEM_ldr_pc2;
9981                       else
9982                         opcode = T_MNEM_ldr_pc;
9983                     }
9984                   else
9985                     {
9986                       if (opcode == T_MNEM_ldr)
9987                         opcode = T_MNEM_ldr_sp;
9988                       else
9989                         opcode = T_MNEM_str_sp;
9990                     }
9991                   inst.instruction = inst.operands[0].reg << 8;
9992                 }
9993               else
9994                 {
9995                   inst.instruction = inst.operands[0].reg;
9996                   inst.instruction |= inst.operands[1].reg << 3;
9997                 }
9998               inst.instruction |= THUMB_OP16 (opcode);
9999               if (inst.size_req == 2)
10000                 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10001               else
10002                 inst.relax = opcode;
10003               return;
10004             }
10005         }
10006       /* Definitely a 32-bit variant.  */
10007
10008       /* Do some validations regarding addressing modes.  */
10009       if (inst.operands[1].immisreg && opcode != T_MNEM_ldr
10010           && opcode != T_MNEM_str)
10011         reject_bad_reg (inst.operands[1].imm);
10012
10013       inst.instruction = THUMB_OP32 (opcode);
10014       inst.instruction |= inst.operands[0].reg << 12;
10015       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
10016       return;
10017     }
10018
10019   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10020
10021   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
10022     {
10023       /* Only [Rn,Rm] is acceptable.  */
10024       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10025       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10026                   || inst.operands[1].postind || inst.operands[1].shifted
10027                   || inst.operands[1].negative,
10028                   _("Thumb does not support this addressing mode"));
10029       inst.instruction = THUMB_OP16 (inst.instruction);
10030       goto op16;
10031     }
10032
10033   inst.instruction = THUMB_OP16 (inst.instruction);
10034   if (!inst.operands[1].isreg)
10035     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10036       return;
10037
10038   constraint (!inst.operands[1].preind
10039               || inst.operands[1].shifted
10040               || inst.operands[1].writeback,
10041               _("Thumb does not support this addressing mode"));
10042   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
10043     {
10044       constraint (inst.instruction & 0x0600,
10045                   _("byte or halfword not valid for base register"));
10046       constraint (inst.operands[1].reg == REG_PC
10047                   && !(inst.instruction & THUMB_LOAD_BIT),
10048                   _("r15 based store not allowed"));
10049       constraint (inst.operands[1].immisreg,
10050                   _("invalid base register for register offset"));
10051
10052       if (inst.operands[1].reg == REG_PC)
10053         inst.instruction = T_OPCODE_LDR_PC;
10054       else if (inst.instruction & THUMB_LOAD_BIT)
10055         inst.instruction = T_OPCODE_LDR_SP;
10056       else
10057         inst.instruction = T_OPCODE_STR_SP;
10058
10059       inst.instruction |= inst.operands[0].reg << 8;
10060       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10061       return;
10062     }
10063
10064   constraint (inst.operands[1].reg > 7, BAD_HIREG);
10065   if (!inst.operands[1].immisreg)
10066     {
10067       /* Immediate offset.  */
10068       inst.instruction |= inst.operands[0].reg;
10069       inst.instruction |= inst.operands[1].reg << 3;
10070       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10071       return;
10072     }
10073
10074   /* Register offset.  */
10075   constraint (inst.operands[1].imm > 7, BAD_HIREG);
10076   constraint (inst.operands[1].negative,
10077               _("Thumb does not support this addressing mode"));
10078
10079  op16:
10080   switch (inst.instruction)
10081     {
10082     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10083     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10084     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10085     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10086     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10087     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10088     case 0x5600 /* ldrsb */:
10089     case 0x5e00 /* ldrsh */: break;
10090     default: abort ();
10091     }
10092
10093   inst.instruction |= inst.operands[0].reg;
10094   inst.instruction |= inst.operands[1].reg << 3;
10095   inst.instruction |= inst.operands[1].imm << 6;
10096 }
10097
10098 static void
10099 do_t_ldstd (void)
10100 {
10101   if (!inst.operands[1].present)
10102     {
10103       inst.operands[1].reg = inst.operands[0].reg + 1;
10104       constraint (inst.operands[0].reg == REG_LR,
10105                   _("r14 not allowed here"));
10106     }
10107   inst.instruction |= inst.operands[0].reg << 12;
10108   inst.instruction |= inst.operands[1].reg << 8;
10109   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
10110 }
10111
10112 static void
10113 do_t_ldstt (void)
10114 {
10115   inst.instruction |= inst.operands[0].reg << 12;
10116   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
10117 }
10118
10119 static void
10120 do_t_mla (void)
10121 {
10122   unsigned Rd, Rn, Rm, Ra;
10123
10124   Rd = inst.operands[0].reg;
10125   Rn = inst.operands[1].reg;
10126   Rm = inst.operands[2].reg;
10127   Ra = inst.operands[3].reg;
10128
10129   reject_bad_reg (Rd);
10130   reject_bad_reg (Rn);
10131   reject_bad_reg (Rm);
10132   reject_bad_reg (Ra);
10133
10134   inst.instruction |= Rd << 8;
10135   inst.instruction |= Rn << 16;
10136   inst.instruction |= Rm;
10137   inst.instruction |= Ra << 12;
10138 }
10139
10140 static void
10141 do_t_mlal (void)
10142 {
10143   unsigned RdLo, RdHi, Rn, Rm;
10144
10145   RdLo = inst.operands[0].reg;
10146   RdHi = inst.operands[1].reg;
10147   Rn = inst.operands[2].reg;
10148   Rm = inst.operands[3].reg;
10149
10150   reject_bad_reg (RdLo);
10151   reject_bad_reg (RdHi);
10152   reject_bad_reg (Rn);
10153   reject_bad_reg (Rm);
10154
10155   inst.instruction |= RdLo << 12;
10156   inst.instruction |= RdHi << 8;
10157   inst.instruction |= Rn << 16;
10158   inst.instruction |= Rm;
10159 }
10160
10161 static void
10162 do_t_mov_cmp (void)
10163 {
10164   unsigned Rn, Rm;
10165
10166   Rn = inst.operands[0].reg;
10167   Rm = inst.operands[1].reg;
10168
10169   if (Rn == REG_PC)
10170     set_it_insn_type_last ();
10171
10172   if (unified_syntax)
10173     {
10174       int r0off = (inst.instruction == T_MNEM_mov
10175                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
10176       unsigned long opcode;
10177       bfd_boolean narrow;
10178       bfd_boolean low_regs;
10179
10180       low_regs = (Rn <= 7 && Rm <= 7);
10181       opcode = inst.instruction;
10182       if (in_it_block ())
10183         narrow = opcode != T_MNEM_movs;
10184       else
10185         narrow = opcode != T_MNEM_movs || low_regs;
10186       if (inst.size_req == 4
10187           || inst.operands[1].shifted)
10188         narrow = FALSE;
10189
10190       /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
10191       if (opcode == T_MNEM_movs && inst.operands[1].isreg
10192           && !inst.operands[1].shifted
10193           && Rn == REG_PC
10194           && Rm == REG_LR)
10195         {
10196           inst.instruction = T2_SUBS_PC_LR;
10197           return;
10198         }
10199
10200       if (opcode == T_MNEM_cmp)
10201         {
10202           constraint (Rn == REG_PC, BAD_PC);
10203           if (narrow)
10204             {
10205               /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
10206                  but valid.  */
10207               warn_deprecated_sp (Rm);
10208               /* R15 was documented as a valid choice for Rm in ARMv6,
10209                  but as UNPREDICTABLE in ARMv7.  ARM's proprietary
10210                  tools reject R15, so we do too.  */
10211               constraint (Rm == REG_PC, BAD_PC);
10212             }
10213           else
10214             reject_bad_reg (Rm);
10215         }
10216       else if (opcode == T_MNEM_mov
10217                || opcode == T_MNEM_movs)
10218         {
10219           if (inst.operands[1].isreg)
10220             {
10221               if (opcode == T_MNEM_movs)
10222                 {
10223                   reject_bad_reg (Rn);
10224                   reject_bad_reg (Rm);
10225                 }
10226               else if ((Rn == REG_SP || Rn == REG_PC)
10227                        && (Rm == REG_SP || Rm == REG_PC))
10228                 reject_bad_reg (Rm);
10229             }
10230           else
10231             reject_bad_reg (Rn);
10232         }
10233
10234       if (!inst.operands[1].isreg)
10235         {
10236           /* Immediate operand.  */
10237           if (!in_it_block () && opcode == T_MNEM_mov)
10238             narrow = 0;
10239           if (low_regs && narrow)
10240             {
10241               inst.instruction = THUMB_OP16 (opcode);
10242               inst.instruction |= Rn << 8;
10243               if (inst.size_req == 2)
10244                 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10245               else
10246                 inst.relax = opcode;
10247             }
10248           else
10249             {
10250               inst.instruction = THUMB_OP32 (inst.instruction);
10251               inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10252               inst.instruction |= Rn << r0off;
10253               inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10254             }
10255         }
10256       else if (inst.operands[1].shifted && inst.operands[1].immisreg
10257                && (inst.instruction == T_MNEM_mov
10258                    || inst.instruction == T_MNEM_movs))
10259         {
10260           /* Register shifts are encoded as separate shift instructions.  */
10261           bfd_boolean flags = (inst.instruction == T_MNEM_movs);
10262
10263           if (in_it_block ())
10264             narrow = !flags;
10265           else
10266             narrow = flags;
10267
10268           if (inst.size_req == 4)
10269             narrow = FALSE;
10270
10271           if (!low_regs || inst.operands[1].imm > 7)
10272             narrow = FALSE;
10273
10274           if (Rn != Rm)
10275             narrow = FALSE;
10276
10277           switch (inst.operands[1].shift_kind)
10278             {
10279             case SHIFT_LSL:
10280               opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
10281               break;
10282             case SHIFT_ASR:
10283               opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
10284               break;
10285             case SHIFT_LSR:
10286               opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
10287               break;
10288             case SHIFT_ROR:
10289               opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
10290               break;
10291             default:
10292               abort ();
10293             }
10294
10295           inst.instruction = opcode;
10296           if (narrow)
10297             {
10298               inst.instruction |= Rn;
10299               inst.instruction |= inst.operands[1].imm << 3;
10300             }
10301           else
10302             {
10303               if (flags)
10304                 inst.instruction |= CONDS_BIT;
10305
10306               inst.instruction |= Rn << 8;
10307               inst.instruction |= Rm << 16;
10308               inst.instruction |= inst.operands[1].imm;
10309             }
10310         }
10311       else if (!narrow)
10312         {
10313           /* Some mov with immediate shift have narrow variants.
10314              Register shifts are handled above.  */
10315           if (low_regs && inst.operands[1].shifted
10316               && (inst.instruction == T_MNEM_mov
10317                   || inst.instruction == T_MNEM_movs))
10318             {
10319               if (in_it_block ())
10320                 narrow = (inst.instruction == T_MNEM_mov);
10321               else
10322                 narrow = (inst.instruction == T_MNEM_movs);
10323             }
10324
10325           if (narrow)
10326             {
10327               switch (inst.operands[1].shift_kind)
10328                 {
10329                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
10330                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
10331                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
10332                 default: narrow = FALSE; break;
10333                 }
10334             }
10335
10336           if (narrow)
10337             {
10338               inst.instruction |= Rn;
10339               inst.instruction |= Rm << 3;
10340               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
10341             }
10342           else
10343             {
10344               inst.instruction = THUMB_OP32 (inst.instruction);
10345               inst.instruction |= Rn << r0off;
10346               encode_thumb32_shifted_operand (1);
10347             }
10348         }
10349       else
10350         switch (inst.instruction)
10351           {
10352           case T_MNEM_mov:
10353             inst.instruction = T_OPCODE_MOV_HR;
10354             inst.instruction |= (Rn & 0x8) << 4;
10355             inst.instruction |= (Rn & 0x7);
10356             inst.instruction |= Rm << 3;
10357             break;
10358
10359           case T_MNEM_movs:
10360             /* We know we have low registers at this point.
10361                Generate ADD Rd, Rs, #0.  */
10362             inst.instruction = T_OPCODE_ADD_I3;
10363             inst.instruction |= Rn;
10364             inst.instruction |= Rm << 3;
10365             break;
10366
10367           case T_MNEM_cmp:
10368             if (low_regs)
10369               {
10370                 inst.instruction = T_OPCODE_CMP_LR;
10371                 inst.instruction |= Rn;
10372                 inst.instruction |= Rm << 3;
10373               }
10374             else
10375               {
10376                 inst.instruction = T_OPCODE_CMP_HR;
10377                 inst.instruction |= (Rn & 0x8) << 4;
10378                 inst.instruction |= (Rn & 0x7);
10379                 inst.instruction |= Rm << 3;
10380               }
10381             break;
10382           }
10383       return;
10384     }
10385
10386   inst.instruction = THUMB_OP16 (inst.instruction);
10387
10388   /* PR 10443: Do not silently ignore shifted operands.  */
10389   constraint (inst.operands[1].shifted,
10390               _("shifts in CMP/MOV instructions are only supported in unified syntax"));
10391
10392   if (inst.operands[1].isreg)
10393     {
10394       if (Rn < 8 && Rm < 8)
10395         {
10396           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
10397              since a MOV instruction produces unpredictable results.  */
10398           if (inst.instruction == T_OPCODE_MOV_I8)
10399             inst.instruction = T_OPCODE_ADD_I3;
10400           else
10401             inst.instruction = T_OPCODE_CMP_LR;
10402
10403           inst.instruction |= Rn;
10404           inst.instruction |= Rm << 3;
10405         }
10406       else
10407         {
10408           if (inst.instruction == T_OPCODE_MOV_I8)
10409             inst.instruction = T_OPCODE_MOV_HR;
10410           else
10411             inst.instruction = T_OPCODE_CMP_HR;
10412           do_t_cpy ();
10413         }
10414     }
10415   else
10416     {
10417       constraint (Rn > 7,
10418                   _("only lo regs allowed with immediate"));
10419       inst.instruction |= Rn << 8;
10420       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10421     }
10422 }
10423
10424 static void
10425 do_t_mov16 (void)
10426 {
10427   unsigned Rd;
10428   bfd_vma imm;
10429   bfd_boolean top;
10430
10431   top = (inst.instruction & 0x00800000) != 0;
10432   if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
10433     {
10434       constraint (top, _(":lower16: not allowed this instruction"));
10435       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
10436     }
10437   else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
10438     {
10439       constraint (!top, _(":upper16: not allowed this instruction"));
10440       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
10441     }
10442
10443   Rd = inst.operands[0].reg;
10444   reject_bad_reg (Rd);
10445
10446   inst.instruction |= Rd << 8;
10447   if (inst.reloc.type == BFD_RELOC_UNUSED)
10448     {
10449       imm = inst.reloc.exp.X_add_number;
10450       inst.instruction |= (imm & 0xf000) << 4;
10451       inst.instruction |= (imm & 0x0800) << 15;
10452       inst.instruction |= (imm & 0x0700) << 4;
10453       inst.instruction |= (imm & 0x00ff);
10454     }
10455 }
10456
10457 static void
10458 do_t_mvn_tst (void)
10459 {
10460   unsigned Rn, Rm;
10461
10462   Rn = inst.operands[0].reg;
10463   Rm = inst.operands[1].reg;
10464
10465   if (inst.instruction == T_MNEM_cmp
10466       || inst.instruction == T_MNEM_cmn)
10467     constraint (Rn == REG_PC, BAD_PC);
10468   else
10469     reject_bad_reg (Rn);
10470   reject_bad_reg (Rm);
10471
10472   if (unified_syntax)
10473     {
10474       int r0off = (inst.instruction == T_MNEM_mvn
10475                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
10476       bfd_boolean narrow;
10477
10478       if (inst.size_req == 4
10479           || inst.instruction > 0xffff
10480           || inst.operands[1].shifted
10481           || Rn > 7 || Rm > 7)
10482         narrow = FALSE;
10483       else if (inst.instruction == T_MNEM_cmn)
10484         narrow = TRUE;
10485       else if (THUMB_SETS_FLAGS (inst.instruction))
10486         narrow = !in_it_block ();
10487       else
10488         narrow = in_it_block ();
10489
10490       if (!inst.operands[1].isreg)
10491         {
10492           /* For an immediate, we always generate a 32-bit opcode;
10493              section relaxation will shrink it later if possible.  */
10494           if (inst.instruction < 0xffff)
10495             inst.instruction = THUMB_OP32 (inst.instruction);
10496           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10497           inst.instruction |= Rn << r0off;
10498           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10499         }
10500       else
10501         {
10502           /* See if we can do this with a 16-bit instruction.  */
10503           if (narrow)
10504             {
10505               inst.instruction = THUMB_OP16 (inst.instruction);
10506               inst.instruction |= Rn;
10507               inst.instruction |= Rm << 3;
10508             }
10509           else
10510             {
10511               constraint (inst.operands[1].shifted
10512                           && inst.operands[1].immisreg,
10513                           _("shift must be constant"));
10514               if (inst.instruction < 0xffff)
10515                 inst.instruction = THUMB_OP32 (inst.instruction);
10516               inst.instruction |= Rn << r0off;
10517               encode_thumb32_shifted_operand (1);
10518             }
10519         }
10520     }
10521   else
10522     {
10523       constraint (inst.instruction > 0xffff
10524                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
10525       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
10526                   _("unshifted register required"));
10527       constraint (Rn > 7 || Rm > 7,
10528                   BAD_HIREG);
10529
10530       inst.instruction = THUMB_OP16 (inst.instruction);
10531       inst.instruction |= Rn;
10532       inst.instruction |= Rm << 3;
10533     }
10534 }
10535
10536 static void
10537 do_t_mrs (void)
10538 {
10539   unsigned Rd;
10540   int flags;
10541
10542   if (do_vfp_nsyn_mrs () == SUCCESS)
10543     return;
10544
10545   flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
10546   if (flags == 0)
10547     {
10548       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_m),
10549                   _("selected processor does not support "
10550                     "requested special purpose register"));
10551     }
10552   else
10553     {
10554       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
10555                   _("selected processor does not support "
10556                     "requested special purpose register"));
10557       /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
10558       constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
10559                   _("'CPSR' or 'SPSR' expected"));
10560     }
10561
10562   Rd = inst.operands[0].reg;
10563   reject_bad_reg (Rd);
10564
10565   inst.instruction |= Rd << 8;
10566   inst.instruction |= (flags & SPSR_BIT) >> 2;
10567   inst.instruction |= inst.operands[1].imm & 0xff;
10568 }
10569
10570 static void
10571 do_t_msr (void)
10572 {
10573   int flags;
10574   unsigned Rn;
10575
10576   if (do_vfp_nsyn_msr () == SUCCESS)
10577     return;
10578
10579   constraint (!inst.operands[1].isreg,
10580               _("Thumb encoding does not support an immediate here"));
10581   flags = inst.operands[0].imm;
10582   if (flags & ~0xff)
10583     {
10584       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
10585                   _("selected processor does not support "
10586                     "requested special purpose register"));
10587     }
10588   else
10589     {
10590       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_m),
10591                   _("selected processor does not support "
10592                     "requested special purpose register"));
10593       flags |= PSR_f;
10594     }
10595
10596   Rn = inst.operands[1].reg;
10597   reject_bad_reg (Rn);
10598
10599   inst.instruction |= (flags & SPSR_BIT) >> 2;
10600   inst.instruction |= (flags & ~SPSR_BIT) >> 8;
10601   inst.instruction |= (flags & 0xff);
10602   inst.instruction |= Rn << 16;
10603 }
10604
10605 static void
10606 do_t_mul (void)
10607 {
10608   bfd_boolean narrow;
10609   unsigned Rd, Rn, Rm;
10610
10611   if (!inst.operands[2].present)
10612     inst.operands[2].reg = inst.operands[0].reg;
10613
10614   Rd = inst.operands[0].reg;
10615   Rn = inst.operands[1].reg;
10616   Rm = inst.operands[2].reg;
10617
10618   if (unified_syntax)
10619     {
10620       if (inst.size_req == 4
10621           || (Rd != Rn
10622               && Rd != Rm)
10623           || Rn > 7
10624           || Rm > 7)
10625         narrow = FALSE;
10626       else if (inst.instruction == T_MNEM_muls)
10627         narrow = !in_it_block ();
10628       else
10629         narrow = in_it_block ();
10630     }
10631   else
10632     {
10633       constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
10634       constraint (Rn > 7 || Rm > 7,
10635                   BAD_HIREG);
10636       narrow = TRUE;
10637     }
10638
10639   if (narrow)
10640     {
10641       /* 16-bit MULS/Conditional MUL.  */
10642       inst.instruction = THUMB_OP16 (inst.instruction);
10643       inst.instruction |= Rd;
10644
10645       if (Rd == Rn)
10646         inst.instruction |= Rm << 3;
10647       else if (Rd == Rm)
10648         inst.instruction |= Rn << 3;
10649       else
10650         constraint (1, _("dest must overlap one source register"));
10651     }
10652   else
10653     {
10654       constraint (inst.instruction != T_MNEM_mul,
10655                   _("Thumb-2 MUL must not set flags"));
10656       /* 32-bit MUL.  */
10657       inst.instruction = THUMB_OP32 (inst.instruction);
10658       inst.instruction |= Rd << 8;
10659       inst.instruction |= Rn << 16;
10660       inst.instruction |= Rm << 0;
10661
10662       reject_bad_reg (Rd);
10663       reject_bad_reg (Rn);
10664       reject_bad_reg (Rm);
10665     }
10666 }
10667
10668 static void
10669 do_t_mull (void)
10670 {
10671   unsigned RdLo, RdHi, Rn, Rm;
10672
10673   RdLo = inst.operands[0].reg;
10674   RdHi = inst.operands[1].reg;
10675   Rn = inst.operands[2].reg;
10676   Rm = inst.operands[3].reg;
10677
10678   reject_bad_reg (RdLo);
10679   reject_bad_reg (RdHi);
10680   reject_bad_reg (Rn);
10681   reject_bad_reg (Rm);
10682
10683   inst.instruction |= RdLo << 12;
10684   inst.instruction |= RdHi << 8;
10685   inst.instruction |= Rn << 16;
10686   inst.instruction |= Rm;
10687
10688  if (RdLo == RdHi)
10689     as_tsktsk (_("rdhi and rdlo must be different"));
10690 }
10691
10692 static void
10693 do_t_nop (void)
10694 {
10695   set_it_insn_type (NEUTRAL_IT_INSN);
10696
10697   if (unified_syntax)
10698     {
10699       if (inst.size_req == 4 || inst.operands[0].imm > 15)
10700         {
10701           inst.instruction = THUMB_OP32 (inst.instruction);
10702           inst.instruction |= inst.operands[0].imm;
10703         }
10704       else
10705         {
10706           /* PR9722: Check for Thumb2 availability before
10707              generating a thumb2 nop instruction.  */
10708           if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
10709             {
10710               inst.instruction = THUMB_OP16 (inst.instruction);
10711               inst.instruction |= inst.operands[0].imm << 4;
10712             }
10713           else
10714             inst.instruction = 0x46c0;
10715         }
10716     }
10717   else
10718     {
10719       constraint (inst.operands[0].present,
10720                   _("Thumb does not support NOP with hints"));
10721       inst.instruction = 0x46c0;
10722     }
10723 }
10724
10725 static void
10726 do_t_neg (void)
10727 {
10728   if (unified_syntax)
10729     {
10730       bfd_boolean narrow;
10731
10732       if (THUMB_SETS_FLAGS (inst.instruction))
10733         narrow = !in_it_block ();
10734       else
10735         narrow = in_it_block ();
10736       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
10737         narrow = FALSE;
10738       if (inst.size_req == 4)
10739         narrow = FALSE;
10740
10741       if (!narrow)
10742         {
10743           inst.instruction = THUMB_OP32 (inst.instruction);
10744           inst.instruction |= inst.operands[0].reg << 8;
10745           inst.instruction |= inst.operands[1].reg << 16;
10746         }
10747       else
10748         {
10749           inst.instruction = THUMB_OP16 (inst.instruction);
10750           inst.instruction |= inst.operands[0].reg;
10751           inst.instruction |= inst.operands[1].reg << 3;
10752         }
10753     }
10754   else
10755     {
10756       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
10757                   BAD_HIREG);
10758       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
10759
10760       inst.instruction = THUMB_OP16 (inst.instruction);
10761       inst.instruction |= inst.operands[0].reg;
10762       inst.instruction |= inst.operands[1].reg << 3;
10763     }
10764 }
10765
10766 static void
10767 do_t_orn (void)
10768 {
10769   unsigned Rd, Rn;
10770
10771   Rd = inst.operands[0].reg;
10772   Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
10773
10774   reject_bad_reg (Rd);
10775   /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN.  */
10776   reject_bad_reg (Rn);
10777
10778   inst.instruction |= Rd << 8;
10779   inst.instruction |= Rn << 16;
10780
10781   if (!inst.operands[2].isreg)
10782     {
10783       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10784       inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10785     }
10786   else
10787     {
10788       unsigned Rm;
10789
10790       Rm = inst.operands[2].reg;
10791       reject_bad_reg (Rm);
10792
10793       constraint (inst.operands[2].shifted
10794                   && inst.operands[2].immisreg,
10795                   _("shift must be constant"));
10796       encode_thumb32_shifted_operand (2);
10797     }
10798 }
10799
10800 static void
10801 do_t_pkhbt (void)
10802 {
10803   unsigned Rd, Rn, Rm;
10804
10805   Rd = inst.operands[0].reg;
10806   Rn = inst.operands[1].reg;
10807   Rm = inst.operands[2].reg;
10808
10809   reject_bad_reg (Rd);
10810   reject_bad_reg (Rn);
10811   reject_bad_reg (Rm);
10812
10813   inst.instruction |= Rd << 8;
10814   inst.instruction |= Rn << 16;
10815   inst.instruction |= Rm;
10816   if (inst.operands[3].present)
10817     {
10818       unsigned int val = inst.reloc.exp.X_add_number;
10819       constraint (inst.reloc.exp.X_op != O_constant,
10820                   _("expression too complex"));
10821       inst.instruction |= (val & 0x1c) << 10;
10822       inst.instruction |= (val & 0x03) << 6;
10823     }
10824 }
10825
10826 static void
10827 do_t_pkhtb (void)
10828 {
10829   if (!inst.operands[3].present)
10830     {
10831       unsigned Rtmp;
10832
10833       inst.instruction &= ~0x00000020;
10834
10835       /* PR 10168.  Swap the Rm and Rn registers.  */
10836       Rtmp = inst.operands[1].reg;
10837       inst.operands[1].reg = inst.operands[2].reg;
10838       inst.operands[2].reg = Rtmp;
10839     }
10840   do_t_pkhbt ();
10841 }
10842
10843 static void
10844 do_t_pld (void)
10845 {
10846   if (inst.operands[0].immisreg)
10847     reject_bad_reg (inst.operands[0].imm);
10848
10849   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
10850 }
10851
10852 static void
10853 do_t_push_pop (void)
10854 {
10855   unsigned mask;
10856
10857   constraint (inst.operands[0].writeback,
10858               _("push/pop do not support {reglist}^"));
10859   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10860               _("expression too complex"));
10861
10862   mask = inst.operands[0].imm;
10863   if ((mask & ~0xff) == 0)
10864     inst.instruction = THUMB_OP16 (inst.instruction) | mask;
10865   else if ((inst.instruction == T_MNEM_push
10866             && (mask & ~0xff) == 1 << REG_LR)
10867            || (inst.instruction == T_MNEM_pop
10868                && (mask & ~0xff) == 1 << REG_PC))
10869     {
10870       inst.instruction = THUMB_OP16 (inst.instruction);
10871       inst.instruction |= THUMB_PP_PC_LR;
10872       inst.instruction |= mask & 0xff;
10873     }
10874   else if (unified_syntax)
10875     {
10876       inst.instruction = THUMB_OP32 (inst.instruction);
10877       encode_thumb2_ldmstm (13, mask, TRUE);
10878     }
10879   else
10880     {
10881       inst.error = _("invalid register list to push/pop instruction");
10882       return;
10883     }
10884 }
10885
10886 static void
10887 do_t_rbit (void)
10888 {
10889   unsigned Rd, Rm;
10890
10891   Rd = inst.operands[0].reg;
10892   Rm = inst.operands[1].reg;
10893
10894   reject_bad_reg (Rd);
10895   reject_bad_reg (Rm);
10896
10897   inst.instruction |= Rd << 8;
10898   inst.instruction |= Rm << 16;
10899   inst.instruction |= Rm;
10900 }
10901
10902 static void
10903 do_t_rev (void)
10904 {
10905   unsigned Rd, Rm;
10906
10907   Rd = inst.operands[0].reg;
10908   Rm = inst.operands[1].reg;
10909
10910   reject_bad_reg (Rd);
10911   reject_bad_reg (Rm);
10912
10913   if (Rd <= 7 && Rm <= 7
10914       && inst.size_req != 4)
10915     {
10916       inst.instruction = THUMB_OP16 (inst.instruction);
10917       inst.instruction |= Rd;
10918       inst.instruction |= Rm << 3;
10919     }
10920   else if (unified_syntax)
10921     {
10922       inst.instruction = THUMB_OP32 (inst.instruction);
10923       inst.instruction |= Rd << 8;
10924       inst.instruction |= Rm << 16;
10925       inst.instruction |= Rm;
10926     }
10927   else
10928     inst.error = BAD_HIREG;
10929 }
10930
10931 static void
10932 do_t_rrx (void)
10933 {
10934   unsigned Rd, Rm;
10935
10936   Rd = inst.operands[0].reg;
10937   Rm = inst.operands[1].reg;
10938
10939   reject_bad_reg (Rd);
10940   reject_bad_reg (Rm);
10941
10942   inst.instruction |= Rd << 8;
10943   inst.instruction |= Rm;
10944 }
10945
10946 static void
10947 do_t_rsb (void)
10948 {
10949   unsigned Rd, Rs;
10950
10951   Rd = inst.operands[0].reg;
10952   Rs = (inst.operands[1].present
10953         ? inst.operands[1].reg    /* Rd, Rs, foo */
10954         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
10955
10956   reject_bad_reg (Rd);
10957   reject_bad_reg (Rs);
10958   if (inst.operands[2].isreg)
10959     reject_bad_reg (inst.operands[2].reg);
10960
10961   inst.instruction |= Rd << 8;
10962   inst.instruction |= Rs << 16;
10963   if (!inst.operands[2].isreg)
10964     {
10965       bfd_boolean narrow;
10966
10967       if ((inst.instruction & 0x00100000) != 0)
10968         narrow = !in_it_block ();
10969       else
10970         narrow = in_it_block ();
10971
10972       if (Rd > 7 || Rs > 7)
10973         narrow = FALSE;
10974
10975       if (inst.size_req == 4 || !unified_syntax)
10976         narrow = FALSE;
10977
10978       if (inst.reloc.exp.X_op != O_constant
10979           || inst.reloc.exp.X_add_number != 0)
10980         narrow = FALSE;
10981
10982       /* Turn rsb #0 into 16-bit neg.  We should probably do this via
10983          relaxation, but it doesn't seem worth the hassle.  */
10984       if (narrow)
10985         {
10986           inst.reloc.type = BFD_RELOC_UNUSED;
10987           inst.instruction = THUMB_OP16 (T_MNEM_negs);
10988           inst.instruction |= Rs << 3;
10989           inst.instruction |= Rd;
10990         }
10991       else
10992         {
10993           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10994           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10995         }
10996     }
10997   else
10998     encode_thumb32_shifted_operand (2);
10999 }
11000
11001 static void
11002 do_t_setend (void)
11003 {
11004   set_it_insn_type (OUTSIDE_IT_INSN);
11005   if (inst.operands[0].imm)
11006     inst.instruction |= 0x8;
11007 }
11008
11009 static void
11010 do_t_shift (void)
11011 {
11012   if (!inst.operands[1].present)
11013     inst.operands[1].reg = inst.operands[0].reg;
11014
11015   if (unified_syntax)
11016     {
11017       bfd_boolean narrow;
11018       int shift_kind;
11019
11020       switch (inst.instruction)
11021         {
11022         case T_MNEM_asr:
11023         case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11024         case T_MNEM_lsl:
11025         case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11026         case T_MNEM_lsr:
11027         case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11028         case T_MNEM_ror:
11029         case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11030         default: abort ();
11031         }
11032
11033       if (THUMB_SETS_FLAGS (inst.instruction))
11034         narrow = !in_it_block ();
11035       else
11036         narrow = in_it_block ();
11037       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11038         narrow = FALSE;
11039       if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
11040         narrow = FALSE;
11041       if (inst.operands[2].isreg
11042           && (inst.operands[1].reg != inst.operands[0].reg
11043               || inst.operands[2].reg > 7))
11044         narrow = FALSE;
11045       if (inst.size_req == 4)
11046         narrow = FALSE;
11047
11048       reject_bad_reg (inst.operands[0].reg);
11049       reject_bad_reg (inst.operands[1].reg);
11050
11051       if (!narrow)
11052         {
11053           if (inst.operands[2].isreg)
11054             {
11055               reject_bad_reg (inst.operands[2].reg);
11056               inst.instruction = THUMB_OP32 (inst.instruction);
11057               inst.instruction |= inst.operands[0].reg << 8;
11058               inst.instruction |= inst.operands[1].reg << 16;
11059               inst.instruction |= inst.operands[2].reg;
11060             }
11061           else
11062             {
11063               inst.operands[1].shifted = 1;
11064               inst.operands[1].shift_kind = shift_kind;
11065               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
11066                                              ? T_MNEM_movs : T_MNEM_mov);
11067               inst.instruction |= inst.operands[0].reg << 8;
11068               encode_thumb32_shifted_operand (1);
11069               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
11070               inst.reloc.type = BFD_RELOC_UNUSED;
11071             }
11072         }
11073       else
11074         {
11075           if (inst.operands[2].isreg)
11076             {
11077               switch (shift_kind)
11078                 {
11079                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
11080                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
11081                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
11082                 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
11083                 default: abort ();
11084                 }
11085
11086               inst.instruction |= inst.operands[0].reg;
11087               inst.instruction |= inst.operands[2].reg << 3;
11088             }
11089           else
11090             {
11091               switch (shift_kind)
11092                 {
11093                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11094                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11095                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11096                 default: abort ();
11097                 }
11098               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11099               inst.instruction |= inst.operands[0].reg;
11100               inst.instruction |= inst.operands[1].reg << 3;
11101             }
11102         }
11103     }
11104   else
11105     {
11106       constraint (inst.operands[0].reg > 7
11107                   || inst.operands[1].reg > 7, BAD_HIREG);
11108       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11109
11110       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
11111         {
11112           constraint (inst.operands[2].reg > 7, BAD_HIREG);
11113           constraint (inst.operands[0].reg != inst.operands[1].reg,
11114                       _("source1 and dest must be same register"));
11115
11116           switch (inst.instruction)
11117             {
11118             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
11119             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
11120             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
11121             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
11122             default: abort ();
11123             }
11124
11125           inst.instruction |= inst.operands[0].reg;
11126           inst.instruction |= inst.operands[2].reg << 3;
11127         }
11128       else
11129         {
11130           switch (inst.instruction)
11131             {
11132             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
11133             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
11134             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
11135             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
11136             default: abort ();
11137             }
11138           inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11139           inst.instruction |= inst.operands[0].reg;
11140           inst.instruction |= inst.operands[1].reg << 3;
11141         }
11142     }
11143 }
11144
11145 static void
11146 do_t_simd (void)
11147 {
11148   unsigned Rd, Rn, Rm;
11149
11150   Rd = inst.operands[0].reg;
11151   Rn = inst.operands[1].reg;
11152   Rm = inst.operands[2].reg;
11153
11154   reject_bad_reg (Rd);
11155   reject_bad_reg (Rn);
11156   reject_bad_reg (Rm);
11157
11158   inst.instruction |= Rd << 8;
11159   inst.instruction |= Rn << 16;
11160   inst.instruction |= Rm;
11161 }
11162
11163 static void
11164 do_t_simd2 (void)
11165 {
11166   unsigned Rd, Rn, Rm;
11167
11168   Rd = inst.operands[0].reg;
11169   Rm = inst.operands[1].reg;
11170   Rn = inst.operands[2].reg;
11171
11172   reject_bad_reg (Rd);
11173   reject_bad_reg (Rn);
11174   reject_bad_reg (Rm);
11175
11176   inst.instruction |= Rd << 8;
11177   inst.instruction |= Rn << 16;
11178   inst.instruction |= Rm;
11179 }
11180
11181 static void
11182 do_t_smc (void)
11183 {
11184   unsigned int value = inst.reloc.exp.X_add_number;
11185   constraint (inst.reloc.exp.X_op != O_constant,
11186               _("expression too complex"));
11187   inst.reloc.type = BFD_RELOC_UNUSED;
11188   inst.instruction |= (value & 0xf000) >> 12;
11189   inst.instruction |= (value & 0x0ff0);
11190   inst.instruction |= (value & 0x000f) << 16;
11191 }
11192
11193 static void
11194 do_t_ssat_usat (int bias)
11195 {
11196   unsigned Rd, Rn;
11197
11198   Rd = inst.operands[0].reg;
11199   Rn = inst.operands[2].reg;
11200
11201   reject_bad_reg (Rd);
11202   reject_bad_reg (Rn);
11203
11204   inst.instruction |= Rd << 8;
11205   inst.instruction |= inst.operands[1].imm - bias;
11206   inst.instruction |= Rn << 16;
11207
11208   if (inst.operands[3].present)
11209     {
11210       offsetT shift_amount = inst.reloc.exp.X_add_number;
11211
11212       inst.reloc.type = BFD_RELOC_UNUSED;
11213
11214       constraint (inst.reloc.exp.X_op != O_constant,
11215                   _("expression too complex"));
11216
11217       if (shift_amount != 0)
11218         {
11219           constraint (shift_amount > 31,
11220                       _("shift expression is too large"));
11221
11222           if (inst.operands[3].shift_kind == SHIFT_ASR)
11223             inst.instruction |= 0x00200000;  /* sh bit.  */
11224
11225           inst.instruction |= (shift_amount & 0x1c) << 10;
11226           inst.instruction |= (shift_amount & 0x03) << 6;
11227         }
11228     }
11229 }
11230
11231 static void
11232 do_t_ssat (void)
11233 {
11234   do_t_ssat_usat (1);
11235 }
11236
11237 static void
11238 do_t_ssat16 (void)
11239 {
11240   unsigned Rd, Rn;
11241
11242   Rd = inst.operands[0].reg;
11243   Rn = inst.operands[2].reg;
11244
11245   reject_bad_reg (Rd);
11246   reject_bad_reg (Rn);
11247
11248   inst.instruction |= Rd << 8;
11249   inst.instruction |= inst.operands[1].imm - 1;
11250   inst.instruction |= Rn << 16;
11251 }
11252
11253 static void
11254 do_t_strex (void)
11255 {
11256   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
11257               || inst.operands[2].postind || inst.operands[2].writeback
11258               || inst.operands[2].immisreg || inst.operands[2].shifted
11259               || inst.operands[2].negative,
11260               BAD_ADDR_MODE);
11261
11262   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
11263
11264   inst.instruction |= inst.operands[0].reg << 8;
11265   inst.instruction |= inst.operands[1].reg << 12;
11266   inst.instruction |= inst.operands[2].reg << 16;
11267   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
11268 }
11269
11270 static void
11271 do_t_strexd (void)
11272 {
11273   if (!inst.operands[2].present)
11274     inst.operands[2].reg = inst.operands[1].reg + 1;
11275
11276   constraint (inst.operands[0].reg == inst.operands[1].reg
11277               || inst.operands[0].reg == inst.operands[2].reg
11278               || inst.operands[0].reg == inst.operands[3].reg
11279               || inst.operands[1].reg == inst.operands[2].reg,
11280               BAD_OVERLAP);
11281
11282   inst.instruction |= inst.operands[0].reg;
11283   inst.instruction |= inst.operands[1].reg << 12;
11284   inst.instruction |= inst.operands[2].reg << 8;
11285   inst.instruction |= inst.operands[3].reg << 16;
11286 }
11287
11288 static void
11289 do_t_sxtah (void)
11290 {
11291   unsigned Rd, Rn, Rm;
11292
11293   Rd = inst.operands[0].reg;
11294   Rn = inst.operands[1].reg;
11295   Rm = inst.operands[2].reg;
11296
11297   reject_bad_reg (Rd);
11298   reject_bad_reg (Rn);
11299   reject_bad_reg (Rm);
11300
11301   inst.instruction |= Rd << 8;
11302   inst.instruction |= Rn << 16;
11303   inst.instruction |= Rm;
11304   inst.instruction |= inst.operands[3].imm << 4;
11305 }
11306
11307 static void
11308 do_t_sxth (void)
11309 {
11310   unsigned Rd, Rm;
11311
11312   Rd = inst.operands[0].reg;
11313   Rm = inst.operands[1].reg;
11314
11315   reject_bad_reg (Rd);
11316   reject_bad_reg (Rm);
11317
11318   if (inst.instruction <= 0xffff
11319       && inst.size_req != 4
11320       && Rd <= 7 && Rm <= 7
11321       && (!inst.operands[2].present || inst.operands[2].imm == 0))
11322     {
11323       inst.instruction = THUMB_OP16 (inst.instruction);
11324       inst.instruction |= Rd;
11325       inst.instruction |= Rm << 3;
11326     }
11327   else if (unified_syntax)
11328     {
11329       if (inst.instruction <= 0xffff)
11330         inst.instruction = THUMB_OP32 (inst.instruction);
11331       inst.instruction |= Rd << 8;
11332       inst.instruction |= Rm;
11333       inst.instruction |= inst.operands[2].imm << 4;
11334     }
11335   else
11336     {
11337       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
11338                   _("Thumb encoding does not support rotation"));
11339       constraint (1, BAD_HIREG);
11340     }
11341 }
11342
11343 static void
11344 do_t_swi (void)
11345 {
11346   inst.reloc.type = BFD_RELOC_ARM_SWI;
11347 }
11348
11349 static void
11350 do_t_tb (void)
11351 {
11352   unsigned Rn, Rm;
11353   int half;
11354
11355   half = (inst.instruction & 0x10) != 0;
11356   set_it_insn_type_last ();
11357   constraint (inst.operands[0].immisreg,
11358               _("instruction requires register index"));
11359
11360   Rn = inst.operands[0].reg;
11361   Rm = inst.operands[0].imm;
11362
11363   constraint (Rn == REG_SP, BAD_SP);
11364   reject_bad_reg (Rm);
11365
11366   constraint (!half && inst.operands[0].shifted,
11367               _("instruction does not allow shifted index"));
11368   inst.instruction |= (Rn << 16) | Rm;
11369 }
11370
11371 static void
11372 do_t_usat (void)
11373 {
11374   do_t_ssat_usat (0);
11375 }
11376
11377 static void
11378 do_t_usat16 (void)
11379 {
11380   unsigned Rd, Rn;
11381
11382   Rd = inst.operands[0].reg;
11383   Rn = inst.operands[2].reg;
11384
11385   reject_bad_reg (Rd);
11386   reject_bad_reg (Rn);
11387
11388   inst.instruction |= Rd << 8;
11389   inst.instruction |= inst.operands[1].imm;
11390   inst.instruction |= Rn << 16;
11391 }
11392
11393 /* Neon instruction encoder helpers.  */
11394
11395 /* Encodings for the different types for various Neon opcodes.  */
11396
11397 /* An "invalid" code for the following tables.  */
11398 #define N_INV -1u
11399
11400 struct neon_tab_entry
11401 {
11402   unsigned integer;
11403   unsigned float_or_poly;
11404   unsigned scalar_or_imm;
11405 };
11406
11407 /* Map overloaded Neon opcodes to their respective encodings.  */
11408 #define NEON_ENC_TAB                                    \
11409   X(vabd,       0x0000700, 0x1200d00, N_INV),           \
11410   X(vmax,       0x0000600, 0x0000f00, N_INV),           \
11411   X(vmin,       0x0000610, 0x0200f00, N_INV),           \
11412   X(vpadd,      0x0000b10, 0x1000d00, N_INV),           \
11413   X(vpmax,      0x0000a00, 0x1000f00, N_INV),           \
11414   X(vpmin,      0x0000a10, 0x1200f00, N_INV),           \
11415   X(vadd,       0x0000800, 0x0000d00, N_INV),           \
11416   X(vsub,       0x1000800, 0x0200d00, N_INV),           \
11417   X(vceq,       0x1000810, 0x0000e00, 0x1b10100),       \
11418   X(vcge,       0x0000310, 0x1000e00, 0x1b10080),       \
11419   X(vcgt,       0x0000300, 0x1200e00, 0x1b10000),       \
11420   /* Register variants of the following two instructions are encoded as
11421      vcge / vcgt with the operands reversed.  */        \
11422   X(vclt,       0x0000300, 0x1200e00, 0x1b10200),       \
11423   X(vcle,       0x0000310, 0x1000e00, 0x1b10180),       \
11424   X(vfma,       N_INV, 0x0000c10, N_INV),               \
11425   X(vfms,       N_INV, 0x0200c10, N_INV),               \
11426   X(vmla,       0x0000900, 0x0000d10, 0x0800040),       \
11427   X(vmls,       0x1000900, 0x0200d10, 0x0800440),       \
11428   X(vmul,       0x0000910, 0x1000d10, 0x0800840),       \
11429   X(vmull,      0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
11430   X(vmlal,      0x0800800, N_INV,     0x0800240),       \
11431   X(vmlsl,      0x0800a00, N_INV,     0x0800640),       \
11432   X(vqdmlal,    0x0800900, N_INV,     0x0800340),       \
11433   X(vqdmlsl,    0x0800b00, N_INV,     0x0800740),       \
11434   X(vqdmull,    0x0800d00, N_INV,     0x0800b40),       \
11435   X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),       \
11436   X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),       \
11437   X(vshl,       0x0000400, N_INV,     0x0800510),       \
11438   X(vqshl,      0x0000410, N_INV,     0x0800710),       \
11439   X(vand,       0x0000110, N_INV,     0x0800030),       \
11440   X(vbic,       0x0100110, N_INV,     0x0800030),       \
11441   X(veor,       0x1000110, N_INV,     N_INV),           \
11442   X(vorn,       0x0300110, N_INV,     0x0800010),       \
11443   X(vorr,       0x0200110, N_INV,     0x0800010),       \
11444   X(vmvn,       0x1b00580, N_INV,     0x0800030),       \
11445   X(vshll,      0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
11446   X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
11447   X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
11448   X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
11449   X(vst1,       0x0000000, 0x0800000, N_INV),           \
11450   X(vld2,       0x0200100, 0x0a00100, 0x0a00d00),       \
11451   X(vst2,       0x0000100, 0x0800100, N_INV),           \
11452   X(vld3,       0x0200200, 0x0a00200, 0x0a00e00),       \
11453   X(vst3,       0x0000200, 0x0800200, N_INV),           \
11454   X(vld4,       0x0200300, 0x0a00300, 0x0a00f00),       \
11455   X(vst4,       0x0000300, 0x0800300, N_INV),           \
11456   X(vmovn,      0x1b20200, N_INV,     N_INV),           \
11457   X(vtrn,       0x1b20080, N_INV,     N_INV),           \
11458   X(vqmovn,     0x1b20200, N_INV,     N_INV),           \
11459   X(vqmovun,    0x1b20240, N_INV,     N_INV),           \
11460   X(vnmul,      0xe200a40, 0xe200b40, N_INV),           \
11461   X(vnmla,      0xe100a40, 0xe100b40, N_INV),           \
11462   X(vnmls,      0xe100a00, 0xe100b00, N_INV),           \
11463   X(vfnma,      0xe900a40, 0xe900b40, N_INV),           \
11464   X(vfnms,      0xe900a00, 0xe900b00, N_INV),           \
11465   X(vcmp,       0xeb40a40, 0xeb40b40, N_INV),           \
11466   X(vcmpz,      0xeb50a40, 0xeb50b40, N_INV),           \
11467   X(vcmpe,      0xeb40ac0, 0xeb40bc0, N_INV),           \
11468   X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV)
11469
11470 enum neon_opc
11471 {
11472 #define X(OPC,I,F,S) N_MNEM_##OPC
11473 NEON_ENC_TAB
11474 #undef X
11475 };
11476
11477 static const struct neon_tab_entry neon_enc_tab[] =
11478 {
11479 #define X(OPC,I,F,S) { (I), (F), (S) }
11480 NEON_ENC_TAB
11481 #undef X
11482 };
11483
11484 /* Do not use these macros; instead, use NEON_ENCODE defined below.  */
11485 #define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
11486 #define NEON_ENC_ARMREG_(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
11487 #define NEON_ENC_POLY_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11488 #define NEON_ENC_FLOAT_(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11489 #define NEON_ENC_SCALAR_(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11490 #define NEON_ENC_IMMED_(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11491 #define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
11492 #define NEON_ENC_LANE_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11493 #define NEON_ENC_DUP_(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11494 #define NEON_ENC_SINGLE_(X) \
11495   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
11496 #define NEON_ENC_DOUBLE_(X) \
11497   ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
11498
11499 #define NEON_ENCODE(type, inst)                                 \
11500   do                                                            \
11501     {                                                           \
11502       inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
11503       inst.is_neon = 1;                                         \
11504     }                                                           \
11505   while (0)
11506
11507 #define check_neon_suffixes                                             \
11508   do                                                                    \
11509     {                                                                   \
11510       if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon)       \
11511         {                                                               \
11512           as_bad (_("invalid neon suffix for non neon instruction"));   \
11513           return;                                                       \
11514         }                                                               \
11515     }                                                                   \
11516   while (0)
11517
11518 /* Define shapes for instruction operands. The following mnemonic characters
11519    are used in this table:
11520
11521      F - VFP S<n> register
11522      D - Neon D<n> register
11523      Q - Neon Q<n> register
11524      I - Immediate
11525      S - Scalar
11526      R - ARM register
11527      L - D<n> register list
11528
11529    This table is used to generate various data:
11530      - enumerations of the form NS_DDR to be used as arguments to
11531        neon_select_shape.
11532      - a table classifying shapes into single, double, quad, mixed.
11533      - a table used to drive neon_select_shape.  */
11534
11535 #define NEON_SHAPE_DEF                  \
11536   X(3, (D, D, D), DOUBLE),              \
11537   X(3, (Q, Q, Q), QUAD),                \
11538   X(3, (D, D, I), DOUBLE),              \
11539   X(3, (Q, Q, I), QUAD),                \
11540   X(3, (D, D, S), DOUBLE),              \
11541   X(3, (Q, Q, S), QUAD),                \
11542   X(2, (D, D), DOUBLE),                 \
11543   X(2, (Q, Q), QUAD),                   \
11544   X(2, (D, S), DOUBLE),                 \
11545   X(2, (Q, S), QUAD),                   \
11546   X(2, (D, R), DOUBLE),                 \
11547   X(2, (Q, R), QUAD),                   \
11548   X(2, (D, I), DOUBLE),                 \
11549   X(2, (Q, I), QUAD),                   \
11550   X(3, (D, L, D), DOUBLE),              \
11551   X(2, (D, Q), MIXED),                  \
11552   X(2, (Q, D), MIXED),                  \
11553   X(3, (D, Q, I), MIXED),               \
11554   X(3, (Q, D, I), MIXED),               \
11555   X(3, (Q, D, D), MIXED),               \
11556   X(3, (D, Q, Q), MIXED),               \
11557   X(3, (Q, Q, D), MIXED),               \
11558   X(3, (Q, D, S), MIXED),               \
11559   X(3, (D, Q, S), MIXED),               \
11560   X(4, (D, D, D, I), DOUBLE),           \
11561   X(4, (Q, Q, Q, I), QUAD),             \
11562   X(2, (F, F), SINGLE),                 \
11563   X(3, (F, F, F), SINGLE),              \
11564   X(2, (F, I), SINGLE),                 \
11565   X(2, (F, D), MIXED),                  \
11566   X(2, (D, F), MIXED),                  \
11567   X(3, (F, F, I), MIXED),               \
11568   X(4, (R, R, F, F), SINGLE),           \
11569   X(4, (F, F, R, R), SINGLE),           \
11570   X(3, (D, R, R), DOUBLE),              \
11571   X(3, (R, R, D), DOUBLE),              \
11572   X(2, (S, R), SINGLE),                 \
11573   X(2, (R, S), SINGLE),                 \
11574   X(2, (F, R), SINGLE),                 \
11575   X(2, (R, F), SINGLE)
11576
11577 #define S2(A,B)         NS_##A##B
11578 #define S3(A,B,C)       NS_##A##B##C
11579 #define S4(A,B,C,D)     NS_##A##B##C##D
11580
11581 #define X(N, L, C) S##N L
11582
11583 enum neon_shape
11584 {
11585   NEON_SHAPE_DEF,
11586   NS_NULL
11587 };
11588
11589 #undef X
11590 #undef S2
11591 #undef S3
11592 #undef S4
11593
11594 enum neon_shape_class
11595 {
11596   SC_SINGLE,
11597   SC_DOUBLE,
11598   SC_QUAD,
11599   SC_MIXED
11600 };
11601
11602 #define X(N, L, C) SC_##C
11603
11604 static enum neon_shape_class neon_shape_class[] =
11605 {
11606   NEON_SHAPE_DEF
11607 };
11608
11609 #undef X
11610
11611 enum neon_shape_el
11612 {
11613   SE_F,
11614   SE_D,
11615   SE_Q,
11616   SE_I,
11617   SE_S,
11618   SE_R,
11619   SE_L
11620 };
11621
11622 /* Register widths of above.  */
11623 static unsigned neon_shape_el_size[] =
11624 {
11625   32,
11626   64,
11627   128,
11628   0,
11629   32,
11630   32,
11631   0
11632 };
11633
11634 struct neon_shape_info
11635 {
11636   unsigned els;
11637   enum neon_shape_el el[NEON_MAX_TYPE_ELS];
11638 };
11639
11640 #define S2(A,B)         { SE_##A, SE_##B }
11641 #define S3(A,B,C)       { SE_##A, SE_##B, SE_##C }
11642 #define S4(A,B,C,D)     { SE_##A, SE_##B, SE_##C, SE_##D }
11643
11644 #define X(N, L, C) { N, S##N L }
11645
11646 static struct neon_shape_info neon_shape_tab[] =
11647 {
11648   NEON_SHAPE_DEF
11649 };
11650
11651 #undef X
11652 #undef S2
11653 #undef S3
11654 #undef S4
11655
11656 /* Bit masks used in type checking given instructions.
11657   'N_EQK' means the type must be the same as (or based on in some way) the key
11658    type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
11659    set, various other bits can be set as well in order to modify the meaning of
11660    the type constraint.  */
11661
11662 enum neon_type_mask
11663 {
11664   N_S8   = 0x0000001,
11665   N_S16  = 0x0000002,
11666   N_S32  = 0x0000004,
11667   N_S64  = 0x0000008,
11668   N_U8   = 0x0000010,
11669   N_U16  = 0x0000020,
11670   N_U32  = 0x0000040,
11671   N_U64  = 0x0000080,
11672   N_I8   = 0x0000100,
11673   N_I16  = 0x0000200,
11674   N_I32  = 0x0000400,
11675   N_I64  = 0x0000800,
11676   N_8    = 0x0001000,
11677   N_16   = 0x0002000,
11678   N_32   = 0x0004000,
11679   N_64   = 0x0008000,
11680   N_P8   = 0x0010000,
11681   N_P16  = 0x0020000,
11682   N_F16  = 0x0040000,
11683   N_F32  = 0x0080000,
11684   N_F64  = 0x0100000,
11685   N_KEY  = 0x1000000, /* Key element (main type specifier).  */
11686   N_EQK  = 0x2000000, /* Given operand has the same type & size as the key.  */
11687   N_VFP  = 0x4000000, /* VFP mode: operand size must match register width.  */
11688   N_DBL  = 0x0000001, /* If N_EQK, this operand is twice the size.  */
11689   N_HLF  = 0x0000002, /* If N_EQK, this operand is half the size.  */
11690   N_SGN  = 0x0000004, /* If N_EQK, this operand is forced to be signed.  */
11691   N_UNS  = 0x0000008, /* If N_EQK, this operand is forced to be unsigned.  */
11692   N_INT  = 0x0000010, /* If N_EQK, this operand is forced to be integer.  */
11693   N_FLT  = 0x0000020, /* If N_EQK, this operand is forced to be float.  */
11694   N_SIZ  = 0x0000040, /* If N_EQK, this operand is forced to be size-only.  */
11695   N_UTYP = 0,
11696   N_MAX_NONSPECIAL = N_F64
11697 };
11698
11699 #define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
11700
11701 #define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
11702 #define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
11703 #define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
11704 #define N_SUF_32   (N_SU_32 | N_F32)
11705 #define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
11706 #define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F32)
11707
11708 /* Pass this as the first type argument to neon_check_type to ignore types
11709    altogether.  */
11710 #define N_IGNORE_TYPE (N_KEY | N_EQK)
11711
11712 /* Select a "shape" for the current instruction (describing register types or
11713    sizes) from a list of alternatives. Return NS_NULL if the current instruction
11714    doesn't fit. For non-polymorphic shapes, checking is usually done as a
11715    function of operand parsing, so this function doesn't need to be called.
11716    Shapes should be listed in order of decreasing length.  */
11717
11718 static enum neon_shape
11719 neon_select_shape (enum neon_shape shape, ...)
11720 {
11721   va_list ap;
11722   enum neon_shape first_shape = shape;
11723
11724   /* Fix missing optional operands. FIXME: we don't know at this point how
11725      many arguments we should have, so this makes the assumption that we have
11726      > 1. This is true of all current Neon opcodes, I think, but may not be
11727      true in the future.  */
11728   if (!inst.operands[1].present)
11729     inst.operands[1] = inst.operands[0];
11730
11731   va_start (ap, shape);
11732
11733   for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
11734     {
11735       unsigned j;
11736       int matches = 1;
11737
11738       for (j = 0; j < neon_shape_tab[shape].els; j++)
11739         {
11740           if (!inst.operands[j].present)
11741             {
11742               matches = 0;
11743               break;
11744             }
11745
11746           switch (neon_shape_tab[shape].el[j])
11747             {
11748             case SE_F:
11749               if (!(inst.operands[j].isreg
11750                     && inst.operands[j].isvec
11751                     && inst.operands[j].issingle
11752                     && !inst.operands[j].isquad))
11753                 matches = 0;
11754               break;
11755
11756             case SE_D:
11757               if (!(inst.operands[j].isreg
11758                     && inst.operands[j].isvec
11759                     && !inst.operands[j].isquad
11760                     && !inst.operands[j].issingle))
11761                 matches = 0;
11762               break;
11763
11764             case SE_R:
11765               if (!(inst.operands[j].isreg
11766                     && !inst.operands[j].isvec))
11767                 matches = 0;
11768               break;
11769
11770             case SE_Q:
11771               if (!(inst.operands[j].isreg
11772                     && inst.operands[j].isvec
11773                     && inst.operands[j].isquad
11774                     && !inst.operands[j].issingle))
11775                 matches = 0;
11776               break;
11777
11778             case SE_I:
11779               if (!(!inst.operands[j].isreg
11780                     && !inst.operands[j].isscalar))
11781                 matches = 0;
11782               break;
11783
11784             case SE_S:
11785               if (!(!inst.operands[j].isreg
11786                     && inst.operands[j].isscalar))
11787                 matches = 0;
11788               break;
11789
11790             case SE_L:
11791               break;
11792             }
11793         }
11794       if (matches)
11795         break;
11796     }
11797
11798   va_end (ap);
11799
11800   if (shape == NS_NULL && first_shape != NS_NULL)
11801     first_error (_("invalid instruction shape"));
11802
11803   return shape;
11804 }
11805
11806 /* True if SHAPE is predominantly a quadword operation (most of the time, this
11807    means the Q bit should be set).  */
11808
11809 static int
11810 neon_quad (enum neon_shape shape)
11811 {
11812   return neon_shape_class[shape] == SC_QUAD;
11813 }
11814
11815 static void
11816 neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
11817                        unsigned *g_size)
11818 {
11819   /* Allow modification to be made to types which are constrained to be
11820      based on the key element, based on bits set alongside N_EQK.  */
11821   if ((typebits & N_EQK) != 0)
11822     {
11823       if ((typebits & N_HLF) != 0)
11824         *g_size /= 2;
11825       else if ((typebits & N_DBL) != 0)
11826         *g_size *= 2;
11827       if ((typebits & N_SGN) != 0)
11828         *g_type = NT_signed;
11829       else if ((typebits & N_UNS) != 0)
11830         *g_type = NT_unsigned;
11831       else if ((typebits & N_INT) != 0)
11832         *g_type = NT_integer;
11833       else if ((typebits & N_FLT) != 0)
11834         *g_type = NT_float;
11835       else if ((typebits & N_SIZ) != 0)
11836         *g_type = NT_untyped;
11837     }
11838 }
11839
11840 /* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
11841    operand type, i.e. the single type specified in a Neon instruction when it
11842    is the only one given.  */
11843
11844 static struct neon_type_el
11845 neon_type_promote (struct neon_type_el *key, unsigned thisarg)
11846 {
11847   struct neon_type_el dest = *key;
11848
11849   gas_assert ((thisarg & N_EQK) != 0);
11850
11851   neon_modify_type_size (thisarg, &dest.type, &dest.size);
11852
11853   return dest;
11854 }
11855
11856 /* Convert Neon type and size into compact bitmask representation.  */
11857
11858 static enum neon_type_mask
11859 type_chk_of_el_type (enum neon_el_type type, unsigned size)
11860 {
11861   switch (type)
11862     {
11863     case NT_untyped:
11864       switch (size)
11865         {
11866         case 8:  return N_8;
11867         case 16: return N_16;
11868         case 32: return N_32;
11869         case 64: return N_64;
11870         default: ;
11871         }
11872       break;
11873
11874     case NT_integer:
11875       switch (size)
11876         {
11877         case 8:  return N_I8;
11878         case 16: return N_I16;
11879         case 32: return N_I32;
11880         case 64: return N_I64;
11881         default: ;
11882         }
11883       break;
11884
11885     case NT_float:
11886       switch (size)
11887         {
11888         case 16: return N_F16;
11889         case 32: return N_F32;
11890         case 64: return N_F64;
11891         default: ;
11892         }
11893       break;
11894
11895     case NT_poly:
11896       switch (size)
11897         {
11898         case 8:  return N_P8;
11899         case 16: return N_P16;
11900         default: ;
11901         }
11902       break;
11903
11904     case NT_signed:
11905       switch (size)
11906         {
11907         case 8:  return N_S8;
11908         case 16: return N_S16;
11909         case 32: return N_S32;
11910         case 64: return N_S64;
11911         default: ;
11912         }
11913       break;
11914
11915     case NT_unsigned:
11916       switch (size)
11917         {
11918         case 8:  return N_U8;
11919         case 16: return N_U16;
11920         case 32: return N_U32;
11921         case 64: return N_U64;
11922         default: ;
11923         }
11924       break;
11925
11926     default: ;
11927     }
11928
11929   return N_UTYP;
11930 }
11931
11932 /* Convert compact Neon bitmask type representation to a type and size. Only
11933    handles the case where a single bit is set in the mask.  */
11934
11935 static int
11936 el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
11937                      enum neon_type_mask mask)
11938 {
11939   if ((mask & N_EQK) != 0)
11940     return FAIL;
11941
11942   if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
11943     *size = 8;
11944   else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_P16)) != 0)
11945     *size = 16;
11946   else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
11947     *size = 32;
11948   else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64)) != 0)
11949     *size = 64;
11950   else
11951     return FAIL;
11952
11953   if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
11954     *type = NT_signed;
11955   else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
11956     *type = NT_unsigned;
11957   else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
11958     *type = NT_integer;
11959   else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
11960     *type = NT_untyped;
11961   else if ((mask & (N_P8 | N_P16)) != 0)
11962     *type = NT_poly;
11963   else if ((mask & (N_F32 | N_F64)) != 0)
11964     *type = NT_float;
11965   else
11966     return FAIL;
11967
11968   return SUCCESS;
11969 }
11970
11971 /* Modify a bitmask of allowed types. This is only needed for type
11972    relaxation.  */
11973
11974 static unsigned
11975 modify_types_allowed (unsigned allowed, unsigned mods)
11976 {
11977   unsigned size;
11978   enum neon_el_type type;
11979   unsigned destmask;
11980   int i;
11981
11982   destmask = 0;
11983
11984   for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
11985     {
11986       if (el_type_of_type_chk (&type, &size,
11987                                (enum neon_type_mask) (allowed & i)) == SUCCESS)
11988         {
11989           neon_modify_type_size (mods, &type, &size);
11990           destmask |= type_chk_of_el_type (type, size);
11991         }
11992     }
11993
11994   return destmask;
11995 }
11996
11997 /* Check type and return type classification.
11998    The manual states (paraphrase): If one datatype is given, it indicates the
11999    type given in:
12000     - the second operand, if there is one
12001     - the operand, if there is no second operand
12002     - the result, if there are no operands.
12003    This isn't quite good enough though, so we use a concept of a "key" datatype
12004    which is set on a per-instruction basis, which is the one which matters when
12005    only one data type is written.
12006    Note: this function has side-effects (e.g. filling in missing operands). All
12007    Neon instructions should call it before performing bit encoding.  */
12008
12009 static struct neon_type_el
12010 neon_check_type (unsigned els, enum neon_shape ns, ...)
12011 {
12012   va_list ap;
12013   unsigned i, pass, key_el = 0;
12014   unsigned types[NEON_MAX_TYPE_ELS];
12015   enum neon_el_type k_type = NT_invtype;
12016   unsigned k_size = -1u;
12017   struct neon_type_el badtype = {NT_invtype, -1};
12018   unsigned key_allowed = 0;
12019
12020   /* Optional registers in Neon instructions are always (not) in operand 1.
12021      Fill in the missing operand here, if it was omitted.  */
12022   if (els > 1 && !inst.operands[1].present)
12023     inst.operands[1] = inst.operands[0];
12024
12025   /* Suck up all the varargs.  */
12026   va_start (ap, ns);
12027   for (i = 0; i < els; i++)
12028     {
12029       unsigned thisarg = va_arg (ap, unsigned);
12030       if (thisarg == N_IGNORE_TYPE)
12031         {
12032           va_end (ap);
12033           return badtype;
12034         }
12035       types[i] = thisarg;
12036       if ((thisarg & N_KEY) != 0)
12037         key_el = i;
12038     }
12039   va_end (ap);
12040
12041   if (inst.vectype.elems > 0)
12042     for (i = 0; i < els; i++)
12043       if (inst.operands[i].vectype.type != NT_invtype)
12044         {
12045           first_error (_("types specified in both the mnemonic and operands"));
12046           return badtype;
12047         }
12048
12049   /* Duplicate inst.vectype elements here as necessary.
12050      FIXME: No idea if this is exactly the same as the ARM assembler,
12051      particularly when an insn takes one register and one non-register
12052      operand. */
12053   if (inst.vectype.elems == 1 && els > 1)
12054     {
12055       unsigned j;
12056       inst.vectype.elems = els;
12057       inst.vectype.el[key_el] = inst.vectype.el[0];
12058       for (j = 0; j < els; j++)
12059         if (j != key_el)
12060           inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12061                                                   types[j]);
12062     }
12063   else if (inst.vectype.elems == 0 && els > 0)
12064     {
12065       unsigned j;
12066       /* No types were given after the mnemonic, so look for types specified
12067          after each operand. We allow some flexibility here; as long as the
12068          "key" operand has a type, we can infer the others.  */
12069       for (j = 0; j < els; j++)
12070         if (inst.operands[j].vectype.type != NT_invtype)
12071           inst.vectype.el[j] = inst.operands[j].vectype;
12072
12073       if (inst.operands[key_el].vectype.type != NT_invtype)
12074         {
12075           for (j = 0; j < els; j++)
12076             if (inst.operands[j].vectype.type == NT_invtype)
12077               inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12078                                                       types[j]);
12079         }
12080       else
12081         {
12082           first_error (_("operand types can't be inferred"));
12083           return badtype;
12084         }
12085     }
12086   else if (inst.vectype.elems != els)
12087     {
12088       first_error (_("type specifier has the wrong number of parts"));
12089       return badtype;
12090     }
12091
12092   for (pass = 0; pass < 2; pass++)
12093     {
12094       for (i = 0; i < els; i++)
12095         {
12096           unsigned thisarg = types[i];
12097           unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
12098             ? modify_types_allowed (key_allowed, thisarg) : thisarg;
12099           enum neon_el_type g_type = inst.vectype.el[i].type;
12100           unsigned g_size = inst.vectype.el[i].size;
12101
12102           /* Decay more-specific signed & unsigned types to sign-insensitive
12103              integer types if sign-specific variants are unavailable.  */
12104           if ((g_type == NT_signed || g_type == NT_unsigned)
12105               && (types_allowed & N_SU_ALL) == 0)
12106             g_type = NT_integer;
12107
12108           /* If only untyped args are allowed, decay any more specific types to
12109              them. Some instructions only care about signs for some element
12110              sizes, so handle that properly.  */
12111           if ((g_size == 8 && (types_allowed & N_8) != 0)
12112               || (g_size == 16 && (types_allowed & N_16) != 0)
12113               || (g_size == 32 && (types_allowed & N_32) != 0)
12114               || (g_size == 64 && (types_allowed & N_64) != 0))
12115             g_type = NT_untyped;
12116
12117           if (pass == 0)
12118             {
12119               if ((thisarg & N_KEY) != 0)
12120                 {
12121                   k_type = g_type;
12122                   k_size = g_size;
12123                   key_allowed = thisarg & ~N_KEY;
12124                 }
12125             }
12126           else
12127             {
12128               if ((thisarg & N_VFP) != 0)
12129                 {
12130                   enum neon_shape_el regshape;
12131                   unsigned regwidth, match;
12132
12133                   /* PR 11136: Catch the case where we are passed a shape of NS_NULL.  */
12134                   if (ns == NS_NULL)
12135                     {
12136                       first_error (_("invalid instruction shape"));
12137                       return badtype;
12138                     }
12139                   regshape = neon_shape_tab[ns].el[i];
12140                   regwidth = neon_shape_el_size[regshape];
12141
12142                   /* In VFP mode, operands must match register widths. If we
12143                      have a key operand, use its width, else use the width of
12144                      the current operand.  */
12145                   if (k_size != -1u)
12146                     match = k_size;
12147                   else
12148                     match = g_size;
12149
12150                   if (regwidth != match)
12151                     {
12152                       first_error (_("operand size must match register width"));
12153                       return badtype;
12154                     }
12155                 }
12156
12157               if ((thisarg & N_EQK) == 0)
12158                 {
12159                   unsigned given_type = type_chk_of_el_type (g_type, g_size);
12160
12161                   if ((given_type & types_allowed) == 0)
12162                     {
12163                       first_error (_("bad type in Neon instruction"));
12164                       return badtype;
12165                     }
12166                 }
12167               else
12168                 {
12169                   enum neon_el_type mod_k_type = k_type;
12170                   unsigned mod_k_size = k_size;
12171                   neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
12172                   if (g_type != mod_k_type || g_size != mod_k_size)
12173                     {
12174                       first_error (_("inconsistent types in Neon instruction"));
12175                       return badtype;
12176                     }
12177                 }
12178             }
12179         }
12180     }
12181
12182   return inst.vectype.el[key_el];
12183 }
12184
12185 /* Neon-style VFP instruction forwarding.  */
12186
12187 /* Thumb VFP instructions have 0xE in the condition field.  */
12188
12189 static void
12190 do_vfp_cond_or_thumb (void)
12191 {
12192   inst.is_neon = 1;
12193
12194   if (thumb_mode)
12195     inst.instruction |= 0xe0000000;
12196   else
12197     inst.instruction |= inst.cond << 28;
12198 }
12199
12200 /* Look up and encode a simple mnemonic, for use as a helper function for the
12201    Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
12202    etc.  It is assumed that operand parsing has already been done, and that the
12203    operands are in the form expected by the given opcode (this isn't necessarily
12204    the same as the form in which they were parsed, hence some massaging must
12205    take place before this function is called).
12206    Checks current arch version against that in the looked-up opcode.  */
12207
12208 static void
12209 do_vfp_nsyn_opcode (const char *opname)
12210 {
12211   const struct asm_opcode *opcode;
12212
12213   opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
12214
12215   if (!opcode)
12216     abort ();
12217
12218   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
12219                 thumb_mode ? *opcode->tvariant : *opcode->avariant),
12220               _(BAD_FPU));
12221
12222   inst.is_neon = 1;
12223
12224   if (thumb_mode)
12225     {
12226       inst.instruction = opcode->tvalue;
12227       opcode->tencode ();
12228     }
12229   else
12230     {
12231       inst.instruction = (inst.cond << 28) | opcode->avalue;
12232       opcode->aencode ();
12233     }
12234 }
12235
12236 static void
12237 do_vfp_nsyn_add_sub (enum neon_shape rs)
12238 {
12239   int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
12240
12241   if (rs == NS_FFF)
12242     {
12243       if (is_add)
12244         do_vfp_nsyn_opcode ("fadds");
12245       else
12246         do_vfp_nsyn_opcode ("fsubs");
12247     }
12248   else
12249     {
12250       if (is_add)
12251         do_vfp_nsyn_opcode ("faddd");
12252       else
12253         do_vfp_nsyn_opcode ("fsubd");
12254     }
12255 }
12256
12257 /* Check operand types to see if this is a VFP instruction, and if so call
12258    PFN ().  */
12259
12260 static int
12261 try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
12262 {
12263   enum neon_shape rs;
12264   struct neon_type_el et;
12265
12266   switch (args)
12267     {
12268     case 2:
12269       rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12270       et = neon_check_type (2, rs,
12271         N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12272       break;
12273
12274     case 3:
12275       rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12276       et = neon_check_type (3, rs,
12277         N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12278       break;
12279
12280     default:
12281       abort ();
12282     }
12283
12284   if (et.type != NT_invtype)
12285     {
12286       pfn (rs);
12287       return SUCCESS;
12288     }
12289
12290   inst.error = NULL;
12291   return FAIL;
12292 }
12293
12294 static void
12295 do_vfp_nsyn_mla_mls (enum neon_shape rs)
12296 {
12297   int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
12298
12299   if (rs == NS_FFF)
12300     {
12301       if (is_mla)
12302         do_vfp_nsyn_opcode ("fmacs");
12303       else
12304         do_vfp_nsyn_opcode ("fnmacs");
12305     }
12306   else
12307     {
12308       if (is_mla)
12309         do_vfp_nsyn_opcode ("fmacd");
12310       else
12311         do_vfp_nsyn_opcode ("fnmacd");
12312     }
12313 }
12314
12315 static void
12316 do_vfp_nsyn_fma_fms (enum neon_shape rs)
12317 {
12318   int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
12319
12320   if (rs == NS_FFF)
12321     {
12322       if (is_fma)
12323         do_vfp_nsyn_opcode ("ffmas");
12324       else
12325         do_vfp_nsyn_opcode ("ffnmas");
12326     }
12327   else
12328     {
12329       if (is_fma)
12330         do_vfp_nsyn_opcode ("ffmad");
12331       else
12332         do_vfp_nsyn_opcode ("ffnmad");
12333     }
12334 }
12335
12336 static void
12337 do_vfp_nsyn_mul (enum neon_shape rs)
12338 {
12339   if (rs == NS_FFF)
12340     do_vfp_nsyn_opcode ("fmuls");
12341   else
12342     do_vfp_nsyn_opcode ("fmuld");
12343 }
12344
12345 static void
12346 do_vfp_nsyn_abs_neg (enum neon_shape rs)
12347 {
12348   int is_neg = (inst.instruction & 0x80) != 0;
12349   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
12350
12351   if (rs == NS_FF)
12352     {
12353       if (is_neg)
12354         do_vfp_nsyn_opcode ("fnegs");
12355       else
12356         do_vfp_nsyn_opcode ("fabss");
12357     }
12358   else
12359     {
12360       if (is_neg)
12361         do_vfp_nsyn_opcode ("fnegd");
12362       else
12363         do_vfp_nsyn_opcode ("fabsd");
12364     }
12365 }
12366
12367 /* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
12368    insns belong to Neon, and are handled elsewhere.  */
12369
12370 static void
12371 do_vfp_nsyn_ldm_stm (int is_dbmode)
12372 {
12373   int is_ldm = (inst.instruction & (1 << 20)) != 0;
12374   if (is_ldm)
12375     {
12376       if (is_dbmode)
12377         do_vfp_nsyn_opcode ("fldmdbs");
12378       else
12379         do_vfp_nsyn_opcode ("fldmias");
12380     }
12381   else
12382     {
12383       if (is_dbmode)
12384         do_vfp_nsyn_opcode ("fstmdbs");
12385       else
12386         do_vfp_nsyn_opcode ("fstmias");
12387     }
12388 }
12389
12390 static void
12391 do_vfp_nsyn_sqrt (void)
12392 {
12393   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12394   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12395
12396   if (rs == NS_FF)
12397     do_vfp_nsyn_opcode ("fsqrts");
12398   else
12399     do_vfp_nsyn_opcode ("fsqrtd");
12400 }
12401
12402 static void
12403 do_vfp_nsyn_div (void)
12404 {
12405   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12406   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
12407     N_F32 | N_F64 | N_KEY | N_VFP);
12408
12409   if (rs == NS_FFF)
12410     do_vfp_nsyn_opcode ("fdivs");
12411   else
12412     do_vfp_nsyn_opcode ("fdivd");
12413 }
12414
12415 static void
12416 do_vfp_nsyn_nmul (void)
12417 {
12418   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12419   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
12420     N_F32 | N_F64 | N_KEY | N_VFP);
12421
12422   if (rs == NS_FFF)
12423     {
12424       NEON_ENCODE (SINGLE, inst);
12425       do_vfp_sp_dyadic ();
12426     }
12427   else
12428     {
12429       NEON_ENCODE (DOUBLE, inst);
12430       do_vfp_dp_rd_rn_rm ();
12431     }
12432   do_vfp_cond_or_thumb ();
12433 }
12434
12435 static void
12436 do_vfp_nsyn_cmp (void)
12437 {
12438   if (inst.operands[1].isreg)
12439     {
12440       enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12441       neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12442
12443       if (rs == NS_FF)
12444         {
12445           NEON_ENCODE (SINGLE, inst);
12446           do_vfp_sp_monadic ();
12447         }
12448       else
12449         {
12450           NEON_ENCODE (DOUBLE, inst);
12451           do_vfp_dp_rd_rm ();
12452         }
12453     }
12454   else
12455     {
12456       enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
12457       neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
12458
12459       switch (inst.instruction & 0x0fffffff)
12460         {
12461         case N_MNEM_vcmp:
12462           inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
12463           break;
12464         case N_MNEM_vcmpe:
12465           inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
12466           break;
12467         default:
12468           abort ();
12469         }
12470
12471       if (rs == NS_FI)
12472         {
12473           NEON_ENCODE (SINGLE, inst);
12474           do_vfp_sp_compare_z ();
12475         }
12476       else
12477         {
12478           NEON_ENCODE (DOUBLE, inst);
12479           do_vfp_dp_rd ();
12480         }
12481     }
12482   do_vfp_cond_or_thumb ();
12483 }
12484
12485 static void
12486 nsyn_insert_sp (void)
12487 {
12488   inst.operands[1] = inst.operands[0];
12489   memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
12490   inst.operands[0].reg = REG_SP;
12491   inst.operands[0].isreg = 1;
12492   inst.operands[0].writeback = 1;
12493   inst.operands[0].present = 1;
12494 }
12495
12496 static void
12497 do_vfp_nsyn_push (void)
12498 {
12499   nsyn_insert_sp ();
12500   if (inst.operands[1].issingle)
12501     do_vfp_nsyn_opcode ("fstmdbs");
12502   else
12503     do_vfp_nsyn_opcode ("fstmdbd");
12504 }
12505
12506 static void
12507 do_vfp_nsyn_pop (void)
12508 {
12509   nsyn_insert_sp ();
12510   if (inst.operands[1].issingle)
12511     do_vfp_nsyn_opcode ("fldmias");
12512   else
12513     do_vfp_nsyn_opcode ("fldmiad");
12514 }
12515
12516 /* Fix up Neon data-processing instructions, ORing in the correct bits for
12517    ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
12518
12519 static void
12520 neon_dp_fixup (struct arm_it* insn)
12521 {
12522   unsigned int i = insn->instruction;
12523   insn->is_neon = 1;
12524
12525   if (thumb_mode)
12526     {
12527       /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
12528       if (i & (1 << 24))
12529         i |= 1 << 28;
12530
12531       i &= ~(1 << 24);
12532
12533       i |= 0xef000000;
12534     }
12535   else
12536     i |= 0xf2000000;
12537
12538   insn->instruction = i;
12539 }
12540
12541 /* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
12542    (0, 1, 2, 3).  */
12543
12544 static unsigned
12545 neon_logbits (unsigned x)
12546 {
12547   return ffs (x) - 4;
12548 }
12549
12550 #define LOW4(R) ((R) & 0xf)
12551 #define HI1(R) (((R) >> 4) & 1)
12552
12553 /* Encode insns with bit pattern:
12554
12555   |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
12556   |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
12557
12558   SIZE is passed in bits. -1 means size field isn't changed, in case it has a
12559   different meaning for some instruction.  */
12560
12561 static void
12562 neon_three_same (int isquad, int ubit, int size)
12563 {
12564   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12565   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12566   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
12567   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
12568   inst.instruction |= LOW4 (inst.operands[2].reg);
12569   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
12570   inst.instruction |= (isquad != 0) << 6;
12571   inst.instruction |= (ubit != 0) << 24;
12572   if (size != -1)
12573     inst.instruction |= neon_logbits (size) << 20;
12574
12575   neon_dp_fixup (&inst);
12576 }
12577
12578 /* Encode instructions of the form:
12579
12580   |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
12581   |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
12582
12583   Don't write size if SIZE == -1.  */
12584
12585 static void
12586 neon_two_same (int qbit, int ubit, int size)
12587 {
12588   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12589   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12590   inst.instruction |= LOW4 (inst.operands[1].reg);
12591   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12592   inst.instruction |= (qbit != 0) << 6;
12593   inst.instruction |= (ubit != 0) << 24;
12594
12595   if (size != -1)
12596     inst.instruction |= neon_logbits (size) << 18;
12597
12598   neon_dp_fixup (&inst);
12599 }
12600
12601 /* Neon instruction encoders, in approximate order of appearance.  */
12602
12603 static void
12604 do_neon_dyadic_i_su (void)
12605 {
12606   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12607   struct neon_type_el et = neon_check_type (3, rs,
12608     N_EQK, N_EQK, N_SU_32 | N_KEY);
12609   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12610 }
12611
12612 static void
12613 do_neon_dyadic_i64_su (void)
12614 {
12615   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12616   struct neon_type_el et = neon_check_type (3, rs,
12617     N_EQK, N_EQK, N_SU_ALL | N_KEY);
12618   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12619 }
12620
12621 static void
12622 neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
12623                 unsigned immbits)
12624 {
12625   unsigned size = et.size >> 3;
12626   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12627   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12628   inst.instruction |= LOW4 (inst.operands[1].reg);
12629   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12630   inst.instruction |= (isquad != 0) << 6;
12631   inst.instruction |= immbits << 16;
12632   inst.instruction |= (size >> 3) << 7;
12633   inst.instruction |= (size & 0x7) << 19;
12634   if (write_ubit)
12635     inst.instruction |= (uval != 0) << 24;
12636
12637   neon_dp_fixup (&inst);
12638 }
12639
12640 static void
12641 do_neon_shl_imm (void)
12642 {
12643   if (!inst.operands[2].isreg)
12644     {
12645       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
12646       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
12647       NEON_ENCODE (IMMED, inst);
12648       neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
12649     }
12650   else
12651     {
12652       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12653       struct neon_type_el et = neon_check_type (3, rs,
12654         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
12655       unsigned int tmp;
12656
12657       /* VSHL/VQSHL 3-register variants have syntax such as:
12658            vshl.xx Dd, Dm, Dn
12659          whereas other 3-register operations encoded by neon_three_same have
12660          syntax like:
12661            vadd.xx Dd, Dn, Dm
12662          (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
12663          here.  */
12664       tmp = inst.operands[2].reg;
12665       inst.operands[2].reg = inst.operands[1].reg;
12666       inst.operands[1].reg = tmp;
12667       NEON_ENCODE (INTEGER, inst);
12668       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12669     }
12670 }
12671
12672 static void
12673 do_neon_qshl_imm (void)
12674 {
12675   if (!inst.operands[2].isreg)
12676     {
12677       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
12678       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
12679
12680       NEON_ENCODE (IMMED, inst);
12681       neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
12682                       inst.operands[2].imm);
12683     }
12684   else
12685     {
12686       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12687       struct neon_type_el et = neon_check_type (3, rs,
12688         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
12689       unsigned int tmp;
12690
12691       /* See note in do_neon_shl_imm.  */
12692       tmp = inst.operands[2].reg;
12693       inst.operands[2].reg = inst.operands[1].reg;
12694       inst.operands[1].reg = tmp;
12695       NEON_ENCODE (INTEGER, inst);
12696       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12697     }
12698 }
12699
12700 static void
12701 do_neon_rshl (void)
12702 {
12703   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12704   struct neon_type_el et = neon_check_type (3, rs,
12705     N_EQK, N_EQK, N_SU_ALL | N_KEY);
12706   unsigned int tmp;
12707
12708   tmp = inst.operands[2].reg;
12709   inst.operands[2].reg = inst.operands[1].reg;
12710   inst.operands[1].reg = tmp;
12711   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12712 }
12713
12714 static int
12715 neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
12716 {
12717   /* Handle .I8 pseudo-instructions.  */
12718   if (size == 8)
12719     {
12720       /* Unfortunately, this will make everything apart from zero out-of-range.
12721          FIXME is this the intended semantics? There doesn't seem much point in
12722          accepting .I8 if so.  */
12723       immediate |= immediate << 8;
12724       size = 16;
12725     }
12726
12727   if (size >= 32)
12728     {
12729       if (immediate == (immediate & 0x000000ff))
12730         {
12731           *immbits = immediate;
12732           return 0x1;
12733         }
12734       else if (immediate == (immediate & 0x0000ff00))
12735         {
12736           *immbits = immediate >> 8;
12737           return 0x3;
12738         }
12739       else if (immediate == (immediate & 0x00ff0000))
12740         {
12741           *immbits = immediate >> 16;
12742           return 0x5;
12743         }
12744       else if (immediate == (immediate & 0xff000000))
12745         {
12746           *immbits = immediate >> 24;
12747           return 0x7;
12748         }
12749       if ((immediate & 0xffff) != (immediate >> 16))
12750         goto bad_immediate;
12751       immediate &= 0xffff;
12752     }
12753
12754   if (immediate == (immediate & 0x000000ff))
12755     {
12756       *immbits = immediate;
12757       return 0x9;
12758     }
12759   else if (immediate == (immediate & 0x0000ff00))
12760     {
12761       *immbits = immediate >> 8;
12762       return 0xb;
12763     }
12764
12765   bad_immediate:
12766   first_error (_("immediate value out of range"));
12767   return FAIL;
12768 }
12769
12770 /* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
12771    A, B, C, D.  */
12772
12773 static int
12774 neon_bits_same_in_bytes (unsigned imm)
12775 {
12776   return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
12777          && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
12778          && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
12779          && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
12780 }
12781
12782 /* For immediate of above form, return 0bABCD.  */
12783
12784 static unsigned
12785 neon_squash_bits (unsigned imm)
12786 {
12787   return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
12788          | ((imm & 0x01000000) >> 21);
12789 }
12790
12791 /* Compress quarter-float representation to 0b...000 abcdefgh.  */
12792
12793 static unsigned
12794 neon_qfloat_bits (unsigned imm)
12795 {
12796   return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
12797 }
12798
12799 /* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
12800    the instruction. *OP is passed as the initial value of the op field, and
12801    may be set to a different value depending on the constant (i.e.
12802    "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
12803    MVN).  If the immediate looks like a repeated pattern then also
12804    try smaller element sizes.  */
12805
12806 static int
12807 neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
12808                          unsigned *immbits, int *op, int size,
12809                          enum neon_el_type type)
12810 {
12811   /* Only permit float immediates (including 0.0/-0.0) if the operand type is
12812      float.  */
12813   if (type == NT_float && !float_p)
12814     return FAIL;
12815
12816   if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
12817     {
12818       if (size != 32 || *op == 1)
12819         return FAIL;
12820       *immbits = neon_qfloat_bits (immlo);
12821       return 0xf;
12822     }
12823
12824   if (size == 64)
12825     {
12826       if (neon_bits_same_in_bytes (immhi)
12827           && neon_bits_same_in_bytes (immlo))
12828         {
12829           if (*op == 1)
12830             return FAIL;
12831           *immbits = (neon_squash_bits (immhi) << 4)
12832                      | neon_squash_bits (immlo);
12833           *op = 1;
12834           return 0xe;
12835         }
12836
12837       if (immhi != immlo)
12838         return FAIL;
12839     }
12840
12841   if (size >= 32)
12842     {
12843       if (immlo == (immlo & 0x000000ff))
12844         {
12845           *immbits = immlo;
12846           return 0x0;
12847         }
12848       else if (immlo == (immlo & 0x0000ff00))
12849         {
12850           *immbits = immlo >> 8;
12851           return 0x2;
12852         }
12853       else if (immlo == (immlo & 0x00ff0000))
12854         {
12855           *immbits = immlo >> 16;
12856           return 0x4;
12857         }
12858       else if (immlo == (immlo & 0xff000000))
12859         {
12860           *immbits = immlo >> 24;
12861           return 0x6;
12862         }
12863       else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
12864         {
12865           *immbits = (immlo >> 8) & 0xff;
12866           return 0xc;
12867         }
12868       else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
12869         {
12870           *immbits = (immlo >> 16) & 0xff;
12871           return 0xd;
12872         }
12873
12874       if ((immlo & 0xffff) != (immlo >> 16))
12875         return FAIL;
12876       immlo &= 0xffff;
12877     }
12878
12879   if (size >= 16)
12880     {
12881       if (immlo == (immlo & 0x000000ff))
12882         {
12883           *immbits = immlo;
12884           return 0x8;
12885         }
12886       else if (immlo == (immlo & 0x0000ff00))
12887         {
12888           *immbits = immlo >> 8;
12889           return 0xa;
12890         }
12891
12892       if ((immlo & 0xff) != (immlo >> 8))
12893         return FAIL;
12894       immlo &= 0xff;
12895     }
12896
12897   if (immlo == (immlo & 0x000000ff))
12898     {
12899       /* Don't allow MVN with 8-bit immediate.  */
12900       if (*op == 1)
12901         return FAIL;
12902       *immbits = immlo;
12903       return 0xe;
12904     }
12905
12906   return FAIL;
12907 }
12908
12909 /* Write immediate bits [7:0] to the following locations:
12910
12911   |28/24|23     19|18 16|15                    4|3     0|
12912   |  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|
12913
12914   This function is used by VMOV/VMVN/VORR/VBIC.  */
12915
12916 static void
12917 neon_write_immbits (unsigned immbits)
12918 {
12919   inst.instruction |= immbits & 0xf;
12920   inst.instruction |= ((immbits >> 4) & 0x7) << 16;
12921   inst.instruction |= ((immbits >> 7) & 0x1) << 24;
12922 }
12923
12924 /* Invert low-order SIZE bits of XHI:XLO.  */
12925
12926 static void
12927 neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
12928 {
12929   unsigned immlo = xlo ? *xlo : 0;
12930   unsigned immhi = xhi ? *xhi : 0;
12931
12932   switch (size)
12933     {
12934     case 8:
12935       immlo = (~immlo) & 0xff;
12936       break;
12937
12938     case 16:
12939       immlo = (~immlo) & 0xffff;
12940       break;
12941
12942     case 64:
12943       immhi = (~immhi) & 0xffffffff;
12944       /* fall through.  */
12945
12946     case 32:
12947       immlo = (~immlo) & 0xffffffff;
12948       break;
12949
12950     default:
12951       abort ();
12952     }
12953
12954   if (xlo)
12955     *xlo = immlo;
12956
12957   if (xhi)
12958     *xhi = immhi;
12959 }
12960
12961 static void
12962 do_neon_logic (void)
12963 {
12964   if (inst.operands[2].present && inst.operands[2].isreg)
12965     {
12966       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12967       neon_check_type (3, rs, N_IGNORE_TYPE);
12968       /* U bit and size field were set as part of the bitmask.  */
12969       NEON_ENCODE (INTEGER, inst);
12970       neon_three_same (neon_quad (rs), 0, -1);
12971     }
12972   else
12973     {
12974       const int three_ops_form = (inst.operands[2].present
12975                                   && !inst.operands[2].isreg);
12976       const int immoperand = (three_ops_form ? 2 : 1);
12977       enum neon_shape rs = (three_ops_form
12978                             ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
12979                             : neon_select_shape (NS_DI, NS_QI, NS_NULL));
12980       struct neon_type_el et = neon_check_type (2, rs,
12981         N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
12982       enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
12983       unsigned immbits;
12984       int cmode;
12985
12986       if (et.type == NT_invtype)
12987         return;
12988
12989       if (three_ops_form)
12990         constraint (inst.operands[0].reg != inst.operands[1].reg,
12991                     _("first and second operands shall be the same register"));
12992
12993       NEON_ENCODE (IMMED, inst);
12994
12995       immbits = inst.operands[immoperand].imm;
12996       if (et.size == 64)
12997         {
12998           /* .i64 is a pseudo-op, so the immediate must be a repeating
12999              pattern.  */
13000           if (immbits != (inst.operands[immoperand].regisimm ?
13001                           inst.operands[immoperand].reg : 0))
13002             {
13003               /* Set immbits to an invalid constant.  */
13004               immbits = 0xdeadbeef;
13005             }
13006         }
13007
13008       switch (opcode)
13009         {
13010         case N_MNEM_vbic:
13011           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13012           break;
13013
13014         case N_MNEM_vorr:
13015           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13016           break;
13017
13018         case N_MNEM_vand:
13019           /* Pseudo-instruction for VBIC.  */
13020           neon_invert_size (&immbits, 0, et.size);
13021           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13022           break;
13023
13024         case N_MNEM_vorn:
13025           /* Pseudo-instruction for VORR.  */
13026           neon_invert_size (&immbits, 0, et.size);
13027           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13028           break;
13029
13030         default:
13031           abort ();
13032         }
13033
13034       if (cmode == FAIL)
13035         return;
13036
13037       inst.instruction |= neon_quad (rs) << 6;
13038       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13039       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13040       inst.instruction |= cmode << 8;
13041       neon_write_immbits (immbits);
13042
13043       neon_dp_fixup (&inst);
13044     }
13045 }
13046
13047 static void
13048 do_neon_bitfield (void)
13049 {
13050   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13051   neon_check_type (3, rs, N_IGNORE_TYPE);
13052   neon_three_same (neon_quad (rs), 0, -1);
13053 }
13054
13055 static void
13056 neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
13057                   unsigned destbits)
13058 {
13059   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13060   struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
13061                                             types | N_KEY);
13062   if (et.type == NT_float)
13063     {
13064       NEON_ENCODE (FLOAT, inst);
13065       neon_three_same (neon_quad (rs), 0, -1);
13066     }
13067   else
13068     {
13069       NEON_ENCODE (INTEGER, inst);
13070       neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
13071     }
13072 }
13073
13074 static void
13075 do_neon_dyadic_if_su (void)
13076 {
13077   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13078 }
13079
13080 static void
13081 do_neon_dyadic_if_su_d (void)
13082 {
13083   /* This version only allow D registers, but that constraint is enforced during
13084      operand parsing so we don't need to do anything extra here.  */
13085   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13086 }
13087
13088 static void
13089 do_neon_dyadic_if_i_d (void)
13090 {
13091   /* The "untyped" case can't happen. Do this to stop the "U" bit being
13092      affected if we specify unsigned args.  */
13093   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13094 }
13095
13096 enum vfp_or_neon_is_neon_bits
13097 {
13098   NEON_CHECK_CC = 1,
13099   NEON_CHECK_ARCH = 2
13100 };
13101
13102 /* Call this function if an instruction which may have belonged to the VFP or
13103    Neon instruction sets, but turned out to be a Neon instruction (due to the
13104    operand types involved, etc.). We have to check and/or fix-up a couple of
13105    things:
13106
13107      - Make sure the user hasn't attempted to make a Neon instruction
13108        conditional.
13109      - Alter the value in the condition code field if necessary.
13110      - Make sure that the arch supports Neon instructions.
13111
13112    Which of these operations take place depends on bits from enum
13113    vfp_or_neon_is_neon_bits.
13114
13115    WARNING: This function has side effects! If NEON_CHECK_CC is used and the
13116    current instruction's condition is COND_ALWAYS, the condition field is
13117    changed to inst.uncond_value. This is necessary because instructions shared
13118    between VFP and Neon may be conditional for the VFP variants only, and the
13119    unconditional Neon version must have, e.g., 0xF in the condition field.  */
13120
13121 static int
13122 vfp_or_neon_is_neon (unsigned check)
13123 {
13124   /* Conditions are always legal in Thumb mode (IT blocks).  */
13125   if (!thumb_mode && (check & NEON_CHECK_CC))
13126     {
13127       if (inst.cond != COND_ALWAYS)
13128         {
13129           first_error (_(BAD_COND));
13130           return FAIL;
13131         }
13132       if (inst.uncond_value != -1)
13133         inst.instruction |= inst.uncond_value << 28;
13134     }
13135
13136   if ((check & NEON_CHECK_ARCH)
13137       && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
13138     {
13139       first_error (_(BAD_FPU));
13140       return FAIL;
13141     }
13142
13143   return SUCCESS;
13144 }
13145
13146 static void
13147 do_neon_addsub_if_i (void)
13148 {
13149   if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
13150     return;
13151
13152   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13153     return;
13154
13155   /* The "untyped" case can't happen. Do this to stop the "U" bit being
13156      affected if we specify unsigned args.  */
13157   neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
13158 }
13159
13160 /* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
13161    result to be:
13162      V<op> A,B     (A is operand 0, B is operand 2)
13163    to mean:
13164      V<op> A,B,A
13165    not:
13166      V<op> A,B,B
13167    so handle that case specially.  */
13168
13169 static void
13170 neon_exchange_operands (void)
13171 {
13172   void *scratch = alloca (sizeof (inst.operands[0]));
13173   if (inst.operands[1].present)
13174     {
13175       /* Swap operands[1] and operands[2].  */
13176       memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
13177       inst.operands[1] = inst.operands[2];
13178       memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
13179     }
13180   else
13181     {
13182       inst.operands[1] = inst.operands[2];
13183       inst.operands[2] = inst.operands[0];
13184     }
13185 }
13186
13187 static void
13188 neon_compare (unsigned regtypes, unsigned immtypes, int invert)
13189 {
13190   if (inst.operands[2].isreg)
13191     {
13192       if (invert)
13193         neon_exchange_operands ();
13194       neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
13195     }
13196   else
13197     {
13198       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13199       struct neon_type_el et = neon_check_type (2, rs,
13200         N_EQK | N_SIZ, immtypes | N_KEY);
13201
13202       NEON_ENCODE (IMMED, inst);
13203       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13204       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13205       inst.instruction |= LOW4 (inst.operands[1].reg);
13206       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13207       inst.instruction |= neon_quad (rs) << 6;
13208       inst.instruction |= (et.type == NT_float) << 10;
13209       inst.instruction |= neon_logbits (et.size) << 18;
13210
13211       neon_dp_fixup (&inst);
13212     }
13213 }
13214
13215 static void
13216 do_neon_cmp (void)
13217 {
13218   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
13219 }
13220
13221 static void
13222 do_neon_cmp_inv (void)
13223 {
13224   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
13225 }
13226
13227 static void
13228 do_neon_ceq (void)
13229 {
13230   neon_compare (N_IF_32, N_IF_32, FALSE);
13231 }
13232
13233 /* For multiply instructions, we have the possibility of 16-bit or 32-bit
13234    scalars, which are encoded in 5 bits, M : Rm.
13235    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
13236    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
13237    index in M.  */
13238
13239 static unsigned
13240 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
13241 {
13242   unsigned regno = NEON_SCALAR_REG (scalar);
13243   unsigned elno = NEON_SCALAR_INDEX (scalar);
13244
13245   switch (elsize)
13246     {
13247     case 16:
13248       if (regno > 7 || elno > 3)
13249         goto bad_scalar;
13250       return regno | (elno << 3);
13251
13252     case 32:
13253       if (regno > 15 || elno > 1)
13254         goto bad_scalar;
13255       return regno | (elno << 4);
13256
13257     default:
13258     bad_scalar:
13259       first_error (_("scalar out of range for multiply instruction"));
13260     }
13261
13262   return 0;
13263 }
13264
13265 /* Encode multiply / multiply-accumulate scalar instructions.  */
13266
13267 static void
13268 neon_mul_mac (struct neon_type_el et, int ubit)
13269 {
13270   unsigned scalar;
13271
13272   /* Give a more helpful error message if we have an invalid type.  */
13273   if (et.type == NT_invtype)
13274     return;
13275
13276   scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
13277   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13278   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13279   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13280   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13281   inst.instruction |= LOW4 (scalar);
13282   inst.instruction |= HI1 (scalar) << 5;
13283   inst.instruction |= (et.type == NT_float) << 8;
13284   inst.instruction |= neon_logbits (et.size) << 20;
13285   inst.instruction |= (ubit != 0) << 24;
13286
13287   neon_dp_fixup (&inst);
13288 }
13289
13290 static void
13291 do_neon_mac_maybe_scalar (void)
13292 {
13293   if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
13294     return;
13295
13296   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13297     return;
13298
13299   if (inst.operands[2].isscalar)
13300     {
13301       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
13302       struct neon_type_el et = neon_check_type (3, rs,
13303         N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
13304       NEON_ENCODE (SCALAR, inst);
13305       neon_mul_mac (et, neon_quad (rs));
13306     }
13307   else
13308     {
13309       /* The "untyped" case can't happen.  Do this to stop the "U" bit being
13310          affected if we specify unsigned args.  */
13311       neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13312     }
13313 }
13314
13315 static void
13316 do_neon_fmac (void)
13317 {
13318   if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
13319     return;
13320
13321   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13322     return;
13323
13324   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13325 }
13326
13327 static void
13328 do_neon_tst (void)
13329 {
13330   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13331   struct neon_type_el et = neon_check_type (3, rs,
13332     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
13333   neon_three_same (neon_quad (rs), 0, et.size);
13334 }
13335
13336 /* VMUL with 3 registers allows the P8 type. The scalar version supports the
13337    same types as the MAC equivalents. The polynomial type for this instruction
13338    is encoded the same as the integer type.  */
13339
13340 static void
13341 do_neon_mul (void)
13342 {
13343   if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
13344     return;
13345
13346   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13347     return;
13348
13349   if (inst.operands[2].isscalar)
13350     do_neon_mac_maybe_scalar ();
13351   else
13352     neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
13353 }
13354
13355 static void
13356 do_neon_qdmulh (void)
13357 {
13358   if (inst.operands[2].isscalar)
13359     {
13360       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
13361       struct neon_type_el et = neon_check_type (3, rs,
13362         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
13363       NEON_ENCODE (SCALAR, inst);
13364       neon_mul_mac (et, neon_quad (rs));
13365     }
13366   else
13367     {
13368       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13369       struct neon_type_el et = neon_check_type (3, rs,
13370         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
13371       NEON_ENCODE (INTEGER, inst);
13372       /* The U bit (rounding) comes from bit mask.  */
13373       neon_three_same (neon_quad (rs), 0, et.size);
13374     }
13375 }
13376
13377 static void
13378 do_neon_fcmp_absolute (void)
13379 {
13380   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13381   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
13382   /* Size field comes from bit mask.  */
13383   neon_three_same (neon_quad (rs), 1, -1);
13384 }
13385
13386 static void
13387 do_neon_fcmp_absolute_inv (void)
13388 {
13389   neon_exchange_operands ();
13390   do_neon_fcmp_absolute ();
13391 }
13392
13393 static void
13394 do_neon_step (void)
13395 {
13396   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13397   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
13398   neon_three_same (neon_quad (rs), 0, -1);
13399 }
13400
13401 static void
13402 do_neon_abs_neg (void)
13403 {
13404   enum neon_shape rs;
13405   struct neon_type_el et;
13406
13407   if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
13408     return;
13409
13410   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13411     return;
13412
13413   rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13414   et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
13415
13416   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13417   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13418   inst.instruction |= LOW4 (inst.operands[1].reg);
13419   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13420   inst.instruction |= neon_quad (rs) << 6;
13421   inst.instruction |= (et.type == NT_float) << 10;
13422   inst.instruction |= neon_logbits (et.size) << 18;
13423
13424   neon_dp_fixup (&inst);
13425 }
13426
13427 static void
13428 do_neon_sli (void)
13429 {
13430   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13431   struct neon_type_el et = neon_check_type (2, rs,
13432     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
13433   int imm = inst.operands[2].imm;
13434   constraint (imm < 0 || (unsigned)imm >= et.size,
13435               _("immediate out of range for insert"));
13436   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
13437 }
13438
13439 static void
13440 do_neon_sri (void)
13441 {
13442   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13443   struct neon_type_el et = neon_check_type (2, rs,
13444     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
13445   int imm = inst.operands[2].imm;
13446   constraint (imm < 1 || (unsigned)imm > et.size,
13447               _("immediate out of range for insert"));
13448   neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
13449 }
13450
13451 static void
13452 do_neon_qshlu_imm (void)
13453 {
13454   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13455   struct neon_type_el et = neon_check_type (2, rs,
13456     N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
13457   int imm = inst.operands[2].imm;
13458   constraint (imm < 0 || (unsigned)imm >= et.size,
13459               _("immediate out of range for shift"));
13460   /* Only encodes the 'U present' variant of the instruction.
13461      In this case, signed types have OP (bit 8) set to 0.
13462      Unsigned types have OP set to 1.  */
13463   inst.instruction |= (et.type == NT_unsigned) << 8;
13464   /* The rest of the bits are the same as other immediate shifts.  */
13465   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
13466 }
13467
13468 static void
13469 do_neon_qmovn (void)
13470 {
13471   struct neon_type_el et = neon_check_type (2, NS_DQ,
13472     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
13473   /* Saturating move where operands can be signed or unsigned, and the
13474      destination has the same signedness.  */
13475   NEON_ENCODE (INTEGER, inst);
13476   if (et.type == NT_unsigned)
13477     inst.instruction |= 0xc0;
13478   else
13479     inst.instruction |= 0x80;
13480   neon_two_same (0, 1, et.size / 2);
13481 }
13482
13483 static void
13484 do_neon_qmovun (void)
13485 {
13486   struct neon_type_el et = neon_check_type (2, NS_DQ,
13487     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
13488   /* Saturating move with unsigned results. Operands must be signed.  */
13489   NEON_ENCODE (INTEGER, inst);
13490   neon_two_same (0, 1, et.size / 2);
13491 }
13492
13493 static void
13494 do_neon_rshift_sat_narrow (void)
13495 {
13496   /* FIXME: Types for narrowing. If operands are signed, results can be signed
13497      or unsigned. If operands are unsigned, results must also be unsigned.  */
13498   struct neon_type_el et = neon_check_type (2, NS_DQI,
13499     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
13500   int imm = inst.operands[2].imm;
13501   /* This gets the bounds check, size encoding and immediate bits calculation
13502      right.  */
13503   et.size /= 2;
13504
13505   /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
13506      VQMOVN.I<size> <Dd>, <Qm>.  */
13507   if (imm == 0)
13508     {
13509       inst.operands[2].present = 0;
13510       inst.instruction = N_MNEM_vqmovn;
13511       do_neon_qmovn ();
13512       return;
13513     }
13514
13515   constraint (imm < 1 || (unsigned)imm > et.size,
13516               _("immediate out of range"));
13517   neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
13518 }
13519
13520 static void
13521 do_neon_rshift_sat_narrow_u (void)
13522 {
13523   /* FIXME: Types for narrowing. If operands are signed, results can be signed
13524      or unsigned. If operands are unsigned, results must also be unsigned.  */
13525   struct neon_type_el et = neon_check_type (2, NS_DQI,
13526     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
13527   int imm = inst.operands[2].imm;
13528   /* This gets the bounds check, size encoding and immediate bits calculation
13529      right.  */
13530   et.size /= 2;
13531
13532   /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
13533      VQMOVUN.I<size> <Dd>, <Qm>.  */
13534   if (imm == 0)
13535     {
13536       inst.operands[2].present = 0;
13537       inst.instruction = N_MNEM_vqmovun;
13538       do_neon_qmovun ();
13539       return;
13540     }
13541
13542   constraint (imm < 1 || (unsigned)imm > et.size,
13543               _("immediate out of range"));
13544   /* FIXME: The manual is kind of unclear about what value U should have in
13545      VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
13546      must be 1.  */
13547   neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
13548 }
13549
13550 static void
13551 do_neon_movn (void)
13552 {
13553   struct neon_type_el et = neon_check_type (2, NS_DQ,
13554     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
13555   NEON_ENCODE (INTEGER, inst);
13556   neon_two_same (0, 1, et.size / 2);
13557 }
13558
13559 static void
13560 do_neon_rshift_narrow (void)
13561 {
13562   struct neon_type_el et = neon_check_type (2, NS_DQI,
13563     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
13564   int imm = inst.operands[2].imm;
13565   /* This gets the bounds check, size encoding and immediate bits calculation
13566      right.  */
13567   et.size /= 2;
13568
13569   /* If immediate is zero then we are a pseudo-instruction for
13570      VMOVN.I<size> <Dd>, <Qm>  */
13571   if (imm == 0)
13572     {
13573       inst.operands[2].present = 0;
13574       inst.instruction = N_MNEM_vmovn;
13575       do_neon_movn ();
13576       return;
13577     }
13578
13579   constraint (imm < 1 || (unsigned)imm > et.size,
13580               _("immediate out of range for narrowing operation"));
13581   neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
13582 }
13583
13584 static void
13585 do_neon_shll (void)
13586 {
13587   /* FIXME: Type checking when lengthening.  */
13588   struct neon_type_el et = neon_check_type (2, NS_QDI,
13589     N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
13590   unsigned imm = inst.operands[2].imm;
13591
13592   if (imm == et.size)
13593     {
13594       /* Maximum shift variant.  */
13595       NEON_ENCODE (INTEGER, inst);
13596       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13597       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13598       inst.instruction |= LOW4 (inst.operands[1].reg);
13599       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13600       inst.instruction |= neon_logbits (et.size) << 18;
13601
13602       neon_dp_fixup (&inst);
13603     }
13604   else
13605     {
13606       /* A more-specific type check for non-max versions.  */
13607       et = neon_check_type (2, NS_QDI,
13608         N_EQK | N_DBL, N_SU_32 | N_KEY);
13609       NEON_ENCODE (IMMED, inst);
13610       neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
13611     }
13612 }
13613
13614 /* Check the various types for the VCVT instruction, and return which version
13615    the current instruction is.  */
13616
13617 static int
13618 neon_cvt_flavour (enum neon_shape rs)
13619 {
13620 #define CVT_VAR(C,X,Y)                                                  \
13621   et = neon_check_type (2, rs, whole_reg | (X), whole_reg | (Y));       \
13622   if (et.type != NT_invtype)                                            \
13623     {                                                                   \
13624       inst.error = NULL;                                                \
13625       return (C);                                                       \
13626     }
13627   struct neon_type_el et;
13628   unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
13629                         || rs == NS_FF) ? N_VFP : 0;
13630   /* The instruction versions which take an immediate take one register
13631      argument, which is extended to the width of the full register. Thus the
13632      "source" and "destination" registers must have the same width.  Hack that
13633      here by making the size equal to the key (wider, in this case) operand.  */
13634   unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
13635
13636   CVT_VAR (0, N_S32, N_F32);
13637   CVT_VAR (1, N_U32, N_F32);
13638   CVT_VAR (2, N_F32, N_S32);
13639   CVT_VAR (3, N_F32, N_U32);
13640   /* Half-precision conversions.  */
13641   CVT_VAR (4, N_F32, N_F16);
13642   CVT_VAR (5, N_F16, N_F32);
13643
13644   whole_reg = N_VFP;
13645
13646   /* VFP instructions.  */
13647   CVT_VAR (6, N_F32, N_F64);
13648   CVT_VAR (7, N_F64, N_F32);
13649   CVT_VAR (8, N_S32, N_F64 | key);
13650   CVT_VAR (9, N_U32, N_F64 | key);
13651   CVT_VAR (10, N_F64 | key, N_S32);
13652   CVT_VAR (11, N_F64 | key, N_U32);
13653   /* VFP instructions with bitshift.  */
13654   CVT_VAR (12, N_F32 | key, N_S16);
13655   CVT_VAR (13, N_F32 | key, N_U16);
13656   CVT_VAR (14, N_F64 | key, N_S16);
13657   CVT_VAR (15, N_F64 | key, N_U16);
13658   CVT_VAR (16, N_S16, N_F32 | key);
13659   CVT_VAR (17, N_U16, N_F32 | key);
13660   CVT_VAR (18, N_S16, N_F64 | key);
13661   CVT_VAR (19, N_U16, N_F64 | key);
13662
13663   return -1;
13664 #undef CVT_VAR
13665 }
13666
13667 /* Neon-syntax VFP conversions.  */
13668
13669 static void
13670 do_vfp_nsyn_cvt (enum neon_shape rs, int flavour)
13671 {
13672   const char *opname = 0;
13673
13674   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
13675     {
13676       /* Conversions with immediate bitshift.  */
13677       const char *enc[] =
13678         {
13679           "ftosls",
13680           "ftouls",
13681           "fsltos",
13682           "fultos",
13683           NULL,
13684           NULL,
13685           NULL,
13686           NULL,
13687           "ftosld",
13688           "ftould",
13689           "fsltod",
13690           "fultod",
13691           "fshtos",
13692           "fuhtos",
13693           "fshtod",
13694           "fuhtod",
13695           "ftoshs",
13696           "ftouhs",
13697           "ftoshd",
13698           "ftouhd"
13699         };
13700
13701       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
13702         {
13703           opname = enc[flavour];
13704           constraint (inst.operands[0].reg != inst.operands[1].reg,
13705                       _("operands 0 and 1 must be the same register"));
13706           inst.operands[1] = inst.operands[2];
13707           memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
13708         }
13709     }
13710   else
13711     {
13712       /* Conversions without bitshift.  */
13713       const char *enc[] =
13714         {
13715           "ftosis",
13716           "ftouis",
13717           "fsitos",
13718           "fuitos",
13719           "NULL",
13720           "NULL",
13721           "fcvtsd",
13722           "fcvtds",
13723           "ftosid",
13724           "ftouid",
13725           "fsitod",
13726           "fuitod"
13727         };
13728
13729       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
13730         opname = enc[flavour];
13731     }
13732
13733   if (opname)
13734     do_vfp_nsyn_opcode (opname);
13735 }
13736
13737 static void
13738 do_vfp_nsyn_cvtz (void)
13739 {
13740   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
13741   int flavour = neon_cvt_flavour (rs);
13742   const char *enc[] =
13743     {
13744       "ftosizs",
13745       "ftouizs",
13746       NULL,
13747       NULL,
13748       NULL,
13749       NULL,
13750       NULL,
13751       NULL,
13752       "ftosizd",
13753       "ftouizd"
13754     };
13755
13756   if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
13757     do_vfp_nsyn_opcode (enc[flavour]);
13758 }
13759
13760 static void
13761 do_neon_cvt_1 (bfd_boolean round_to_zero ATTRIBUTE_UNUSED)
13762 {
13763   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
13764     NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
13765   int flavour = neon_cvt_flavour (rs);
13766
13767   /* PR11109: Handle round-to-zero for VCVT conversions.  */
13768   if (round_to_zero
13769       && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
13770       && (flavour == 0 || flavour == 1 || flavour == 8 || flavour == 9)
13771       && (rs == NS_FD || rs == NS_FF))
13772     {
13773       do_vfp_nsyn_cvtz ();
13774       return;
13775     }
13776
13777   /* VFP rather than Neon conversions.  */
13778   if (flavour >= 6)
13779     {
13780       do_vfp_nsyn_cvt (rs, flavour);
13781       return;
13782     }
13783
13784   switch (rs)
13785     {
13786     case NS_DDI:
13787     case NS_QQI:
13788       {
13789         unsigned immbits;
13790         unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
13791
13792         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13793           return;
13794
13795         /* Fixed-point conversion with #0 immediate is encoded as an
13796            integer conversion.  */
13797         if (inst.operands[2].present && inst.operands[2].imm == 0)
13798           goto int_encode;
13799        immbits = 32 - inst.operands[2].imm;
13800         NEON_ENCODE (IMMED, inst);
13801         if (flavour != -1)
13802           inst.instruction |= enctab[flavour];
13803         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13804         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13805         inst.instruction |= LOW4 (inst.operands[1].reg);
13806         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13807         inst.instruction |= neon_quad (rs) << 6;
13808         inst.instruction |= 1 << 21;
13809         inst.instruction |= immbits << 16;
13810
13811         neon_dp_fixup (&inst);
13812       }
13813       break;
13814
13815     case NS_DD:
13816     case NS_QQ:
13817     int_encode:
13818       {
13819         unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
13820
13821         NEON_ENCODE (INTEGER, inst);
13822
13823         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13824           return;
13825
13826         if (flavour != -1)
13827           inst.instruction |= enctab[flavour];
13828
13829         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13830         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13831         inst.instruction |= LOW4 (inst.operands[1].reg);
13832         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13833         inst.instruction |= neon_quad (rs) << 6;
13834         inst.instruction |= 2 << 18;
13835
13836         neon_dp_fixup (&inst);
13837       }
13838     break;
13839
13840     /* Half-precision conversions for Advanced SIMD -- neon.  */
13841     case NS_QD:
13842     case NS_DQ:
13843
13844       if ((rs == NS_DQ)
13845           && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
13846           {
13847             as_bad (_("operand size must match register width"));
13848             break;
13849           }
13850
13851       if ((rs == NS_QD)
13852           && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
13853           {
13854             as_bad (_("operand size must match register width"));
13855             break;
13856           }
13857
13858       if (rs == NS_DQ)
13859         inst.instruction = 0x3b60600;
13860       else
13861         inst.instruction = 0x3b60700;
13862
13863       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13864       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13865       inst.instruction |= LOW4 (inst.operands[1].reg);
13866       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13867       neon_dp_fixup (&inst);
13868       break;
13869
13870     default:
13871       /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
13872       do_vfp_nsyn_cvt (rs, flavour);
13873     }
13874 }
13875
13876 static void
13877 do_neon_cvtr (void)
13878 {
13879   do_neon_cvt_1 (FALSE);
13880 }
13881
13882 static void
13883 do_neon_cvt (void)
13884 {
13885   do_neon_cvt_1 (TRUE);
13886 }
13887
13888 static void
13889 do_neon_cvtb (void)
13890 {
13891   inst.instruction = 0xeb20a40;
13892
13893   /* The sizes are attached to the mnemonic.  */
13894   if (inst.vectype.el[0].type != NT_invtype
13895       && inst.vectype.el[0].size == 16)
13896     inst.instruction |= 0x00010000;
13897
13898   /* Programmer's syntax: the sizes are attached to the operands.  */
13899   else if (inst.operands[0].vectype.type != NT_invtype
13900            && inst.operands[0].vectype.size == 16)
13901     inst.instruction |= 0x00010000;
13902
13903   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
13904   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
13905   do_vfp_cond_or_thumb ();
13906 }
13907
13908
13909 static void
13910 do_neon_cvtt (void)
13911 {
13912   do_neon_cvtb ();
13913   inst.instruction |= 0x80;
13914 }
13915
13916 static void
13917 neon_move_immediate (void)
13918 {
13919   enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
13920   struct neon_type_el et = neon_check_type (2, rs,
13921     N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
13922   unsigned immlo, immhi = 0, immbits;
13923   int op, cmode, float_p;
13924
13925   constraint (et.type == NT_invtype,
13926               _("operand size must be specified for immediate VMOV"));
13927
13928   /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
13929   op = (inst.instruction & (1 << 5)) != 0;
13930
13931   immlo = inst.operands[1].imm;
13932   if (inst.operands[1].regisimm)
13933     immhi = inst.operands[1].reg;
13934
13935   constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
13936               _("immediate has bits set outside the operand size"));
13937
13938   float_p = inst.operands[1].immisfloat;
13939
13940   if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
13941                                         et.size, et.type)) == FAIL)
13942     {
13943       /* Invert relevant bits only.  */
13944       neon_invert_size (&immlo, &immhi, et.size);
13945       /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
13946          with one or the other; those cases are caught by
13947          neon_cmode_for_move_imm.  */
13948       op = !op;
13949       if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
13950                                             &op, et.size, et.type)) == FAIL)
13951         {
13952           first_error (_("immediate out of range"));
13953           return;
13954         }
13955     }
13956
13957   inst.instruction &= ~(1 << 5);
13958   inst.instruction |= op << 5;
13959
13960   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13961   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13962   inst.instruction |= neon_quad (rs) << 6;
13963   inst.instruction |= cmode << 8;
13964
13965   neon_write_immbits (immbits);
13966 }
13967
13968 static void
13969 do_neon_mvn (void)
13970 {
13971   if (inst.operands[1].isreg)
13972     {
13973       enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13974
13975       NEON_ENCODE (INTEGER, inst);
13976       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13977       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13978       inst.instruction |= LOW4 (inst.operands[1].reg);
13979       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13980       inst.instruction |= neon_quad (rs) << 6;
13981     }
13982   else
13983     {
13984       NEON_ENCODE (IMMED, inst);
13985       neon_move_immediate ();
13986     }
13987
13988   neon_dp_fixup (&inst);
13989 }
13990
13991 /* Encode instructions of form:
13992
13993   |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
13994   |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |  */
13995
13996 static void
13997 neon_mixed_length (struct neon_type_el et, unsigned size)
13998 {
13999   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14000   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14001   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14002   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14003   inst.instruction |= LOW4 (inst.operands[2].reg);
14004   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14005   inst.instruction |= (et.type == NT_unsigned) << 24;
14006   inst.instruction |= neon_logbits (size) << 20;
14007
14008   neon_dp_fixup (&inst);
14009 }
14010
14011 static void
14012 do_neon_dyadic_long (void)
14013 {
14014   /* FIXME: Type checking for lengthening op.  */
14015   struct neon_type_el et = neon_check_type (3, NS_QDD,
14016     N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
14017   neon_mixed_length (et, et.size);
14018 }
14019
14020 static void
14021 do_neon_abal (void)
14022 {
14023   struct neon_type_el et = neon_check_type (3, NS_QDD,
14024     N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
14025   neon_mixed_length (et, et.size);
14026 }
14027
14028 static void
14029 neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
14030 {
14031   if (inst.operands[2].isscalar)
14032     {
14033       struct neon_type_el et = neon_check_type (3, NS_QDS,
14034         N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
14035       NEON_ENCODE (SCALAR, inst);
14036       neon_mul_mac (et, et.type == NT_unsigned);
14037     }
14038   else
14039     {
14040       struct neon_type_el et = neon_check_type (3, NS_QDD,
14041         N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
14042       NEON_ENCODE (INTEGER, inst);
14043       neon_mixed_length (et, et.size);
14044     }
14045 }
14046
14047 static void
14048 do_neon_mac_maybe_scalar_long (void)
14049 {
14050   neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
14051 }
14052
14053 static void
14054 do_neon_dyadic_wide (void)
14055 {
14056   struct neon_type_el et = neon_check_type (3, NS_QQD,
14057     N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
14058   neon_mixed_length (et, et.size);
14059 }
14060
14061 static void
14062 do_neon_dyadic_narrow (void)
14063 {
14064   struct neon_type_el et = neon_check_type (3, NS_QDD,
14065     N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
14066   /* Operand sign is unimportant, and the U bit is part of the opcode,
14067      so force the operand type to integer.  */
14068   et.type = NT_integer;
14069   neon_mixed_length (et, et.size / 2);
14070 }
14071
14072 static void
14073 do_neon_mul_sat_scalar_long (void)
14074 {
14075   neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
14076 }
14077
14078 static void
14079 do_neon_vmull (void)
14080 {
14081   if (inst.operands[2].isscalar)
14082     do_neon_mac_maybe_scalar_long ();
14083   else
14084     {
14085       struct neon_type_el et = neon_check_type (3, NS_QDD,
14086         N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_KEY);
14087       if (et.type == NT_poly)
14088         NEON_ENCODE (POLY, inst);
14089       else
14090         NEON_ENCODE (INTEGER, inst);
14091       /* For polynomial encoding, size field must be 0b00 and the U bit must be
14092          zero. Should be OK as-is.  */
14093       neon_mixed_length (et, et.size);
14094     }
14095 }
14096
14097 static void
14098 do_neon_ext (void)
14099 {
14100   enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
14101   struct neon_type_el et = neon_check_type (3, rs,
14102     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14103   unsigned imm = (inst.operands[3].imm * et.size) / 8;
14104
14105   constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
14106               _("shift out of range"));
14107   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14108   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14109   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14110   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14111   inst.instruction |= LOW4 (inst.operands[2].reg);
14112   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14113   inst.instruction |= neon_quad (rs) << 6;
14114   inst.instruction |= imm << 8;
14115
14116   neon_dp_fixup (&inst);
14117 }
14118
14119 static void
14120 do_neon_rev (void)
14121 {
14122   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14123   struct neon_type_el et = neon_check_type (2, rs,
14124     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14125   unsigned op = (inst.instruction >> 7) & 3;
14126   /* N (width of reversed regions) is encoded as part of the bitmask. We
14127      extract it here to check the elements to be reversed are smaller.
14128      Otherwise we'd get a reserved instruction.  */
14129   unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
14130   gas_assert (elsize != 0);
14131   constraint (et.size >= elsize,
14132               _("elements must be smaller than reversal region"));
14133   neon_two_same (neon_quad (rs), 1, et.size);
14134 }
14135
14136 static void
14137 do_neon_dup (void)
14138 {
14139   if (inst.operands[1].isscalar)
14140     {
14141       enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
14142       struct neon_type_el et = neon_check_type (2, rs,
14143         N_EQK, N_8 | N_16 | N_32 | N_KEY);
14144       unsigned sizebits = et.size >> 3;
14145       unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
14146       int logsize = neon_logbits (et.size);
14147       unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
14148
14149       if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
14150         return;
14151
14152       NEON_ENCODE (SCALAR, inst);
14153       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14154       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14155       inst.instruction |= LOW4 (dm);
14156       inst.instruction |= HI1 (dm) << 5;
14157       inst.instruction |= neon_quad (rs) << 6;
14158       inst.instruction |= x << 17;
14159       inst.instruction |= sizebits << 16;
14160
14161       neon_dp_fixup (&inst);
14162     }
14163   else
14164     {
14165       enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
14166       struct neon_type_el et = neon_check_type (2, rs,
14167         N_8 | N_16 | N_32 | N_KEY, N_EQK);
14168       /* Duplicate ARM register to lanes of vector.  */
14169       NEON_ENCODE (ARMREG, inst);
14170       switch (et.size)
14171         {
14172         case 8:  inst.instruction |= 0x400000; break;
14173         case 16: inst.instruction |= 0x000020; break;
14174         case 32: inst.instruction |= 0x000000; break;
14175         default: break;
14176         }
14177       inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
14178       inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
14179       inst.instruction |= HI1 (inst.operands[0].reg) << 7;
14180       inst.instruction |= neon_quad (rs) << 21;
14181       /* The encoding for this instruction is identical for the ARM and Thumb
14182          variants, except for the condition field.  */
14183       do_vfp_cond_or_thumb ();
14184     }
14185 }
14186
14187 /* VMOV has particularly many variations. It can be one of:
14188      0. VMOV<c><q> <Qd>, <Qm>
14189      1. VMOV<c><q> <Dd>, <Dm>
14190    (Register operations, which are VORR with Rm = Rn.)
14191      2. VMOV<c><q>.<dt> <Qd>, #<imm>
14192      3. VMOV<c><q>.<dt> <Dd>, #<imm>
14193    (Immediate loads.)
14194      4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
14195    (ARM register to scalar.)
14196      5. VMOV<c><q> <Dm>, <Rd>, <Rn>
14197    (Two ARM registers to vector.)
14198      6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
14199    (Scalar to ARM register.)
14200      7. VMOV<c><q> <Rd>, <Rn>, <Dm>
14201    (Vector to two ARM registers.)
14202      8. VMOV.F32 <Sd>, <Sm>
14203      9. VMOV.F64 <Dd>, <Dm>
14204    (VFP register moves.)
14205     10. VMOV.F32 <Sd>, #imm
14206     11. VMOV.F64 <Dd>, #imm
14207    (VFP float immediate load.)
14208     12. VMOV <Rd>, <Sm>
14209    (VFP single to ARM reg.)
14210     13. VMOV <Sd>, <Rm>
14211    (ARM reg to VFP single.)
14212     14. VMOV <Rd>, <Re>, <Sn>, <Sm>
14213    (Two ARM regs to two VFP singles.)
14214     15. VMOV <Sd>, <Se>, <Rn>, <Rm>
14215    (Two VFP singles to two ARM regs.)
14216
14217    These cases can be disambiguated using neon_select_shape, except cases 1/9
14218    and 3/11 which depend on the operand type too.
14219
14220    All the encoded bits are hardcoded by this function.
14221
14222    Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
14223    Cases 5, 7 may be used with VFPv2 and above.
14224
14225    FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
14226    can specify a type where it doesn't make sense to, and is ignored).  */
14227
14228 static void
14229 do_neon_mov (void)
14230 {
14231   enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
14232     NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
14233     NS_NULL);
14234   struct neon_type_el et;
14235   const char *ldconst = 0;
14236
14237   switch (rs)
14238     {
14239     case NS_DD:  /* case 1/9.  */
14240       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14241       /* It is not an error here if no type is given.  */
14242       inst.error = NULL;
14243       if (et.type == NT_float && et.size == 64)
14244         {
14245           do_vfp_nsyn_opcode ("fcpyd");
14246           break;
14247         }
14248       /* fall through.  */
14249
14250     case NS_QQ:  /* case 0/1.  */
14251       {
14252         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14253           return;
14254         /* The architecture manual I have doesn't explicitly state which
14255            value the U bit should have for register->register moves, but
14256            the equivalent VORR instruction has U = 0, so do that.  */
14257         inst.instruction = 0x0200110;
14258         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14259         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14260         inst.instruction |= LOW4 (inst.operands[1].reg);
14261         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14262         inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14263         inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14264         inst.instruction |= neon_quad (rs) << 6;
14265
14266         neon_dp_fixup (&inst);
14267       }
14268       break;
14269
14270     case NS_DI:  /* case 3/11.  */
14271       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14272       inst.error = NULL;
14273       if (et.type == NT_float && et.size == 64)
14274         {
14275           /* case 11 (fconstd).  */
14276           ldconst = "fconstd";
14277           goto encode_fconstd;
14278         }
14279       /* fall through.  */
14280
14281     case NS_QI:  /* case 2/3.  */
14282       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14283         return;
14284       inst.instruction = 0x0800010;
14285       neon_move_immediate ();
14286       neon_dp_fixup (&inst);
14287       break;
14288
14289     case NS_SR:  /* case 4.  */
14290       {
14291         unsigned bcdebits = 0;
14292         int logsize;
14293         unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
14294         unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
14295
14296         et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
14297         logsize = neon_logbits (et.size);
14298
14299         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
14300                     _(BAD_FPU));
14301         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
14302                     && et.size != 32, _(BAD_FPU));
14303         constraint (et.type == NT_invtype, _("bad type for scalar"));
14304         constraint (x >= 64 / et.size, _("scalar index out of range"));
14305
14306         switch (et.size)
14307           {
14308           case 8:  bcdebits = 0x8; break;
14309           case 16: bcdebits = 0x1; break;
14310           case 32: bcdebits = 0x0; break;
14311           default: ;
14312           }
14313
14314         bcdebits |= x << logsize;
14315
14316         inst.instruction = 0xe000b10;
14317         do_vfp_cond_or_thumb ();
14318         inst.instruction |= LOW4 (dn) << 16;
14319         inst.instruction |= HI1 (dn) << 7;
14320         inst.instruction |= inst.operands[1].reg << 12;
14321         inst.instruction |= (bcdebits & 3) << 5;
14322         inst.instruction |= (bcdebits >> 2) << 21;
14323       }
14324       break;
14325
14326     case NS_DRR:  /* case 5 (fmdrr).  */
14327       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
14328                   _(BAD_FPU));
14329
14330       inst.instruction = 0xc400b10;
14331       do_vfp_cond_or_thumb ();
14332       inst.instruction |= LOW4 (inst.operands[0].reg);
14333       inst.instruction |= HI1 (inst.operands[0].reg) << 5;
14334       inst.instruction |= inst.operands[1].reg << 12;
14335       inst.instruction |= inst.operands[2].reg << 16;
14336       break;
14337
14338     case NS_RS:  /* case 6.  */
14339       {
14340         unsigned logsize;
14341         unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
14342         unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
14343         unsigned abcdebits = 0;
14344
14345         et = neon_check_type (2, NS_NULL,
14346                               N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
14347         logsize = neon_logbits (et.size);
14348
14349         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
14350                     _(BAD_FPU));
14351         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
14352                     && et.size != 32, _(BAD_FPU));
14353         constraint (et.type == NT_invtype, _("bad type for scalar"));
14354         constraint (x >= 64 / et.size, _("scalar index out of range"));
14355
14356         switch (et.size)
14357           {
14358           case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
14359           case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
14360           case 32: abcdebits = 0x00; break;
14361           default: ;
14362           }
14363
14364         abcdebits |= x << logsize;
14365         inst.instruction = 0xe100b10;
14366         do_vfp_cond_or_thumb ();
14367         inst.instruction |= LOW4 (dn) << 16;
14368         inst.instruction |= HI1 (dn) << 7;
14369         inst.instruction |= inst.operands[0].reg << 12;
14370         inst.instruction |= (abcdebits & 3) << 5;
14371         inst.instruction |= (abcdebits >> 2) << 21;
14372       }
14373       break;
14374
14375     case NS_RRD:  /* case 7 (fmrrd).  */
14376       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
14377                   _(BAD_FPU));
14378
14379       inst.instruction = 0xc500b10;
14380       do_vfp_cond_or_thumb ();
14381       inst.instruction |= inst.operands[0].reg << 12;
14382       inst.instruction |= inst.operands[1].reg << 16;
14383       inst.instruction |= LOW4 (inst.operands[2].reg);
14384       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14385       break;
14386
14387     case NS_FF:  /* case 8 (fcpys).  */
14388       do_vfp_nsyn_opcode ("fcpys");
14389       break;
14390
14391     case NS_FI:  /* case 10 (fconsts).  */
14392       ldconst = "fconsts";
14393       encode_fconstd:
14394       if (is_quarter_float (inst.operands[1].imm))
14395         {
14396           inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
14397           do_vfp_nsyn_opcode (ldconst);
14398         }
14399       else
14400         first_error (_("immediate out of range"));
14401       break;
14402
14403     case NS_RF:  /* case 12 (fmrs).  */
14404       do_vfp_nsyn_opcode ("fmrs");
14405       break;
14406
14407     case NS_FR:  /* case 13 (fmsr).  */
14408       do_vfp_nsyn_opcode ("fmsr");
14409       break;
14410
14411     /* The encoders for the fmrrs and fmsrr instructions expect three operands
14412        (one of which is a list), but we have parsed four.  Do some fiddling to
14413        make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
14414        expect.  */
14415     case NS_RRFF:  /* case 14 (fmrrs).  */
14416       constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
14417                   _("VFP registers must be adjacent"));
14418       inst.operands[2].imm = 2;
14419       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
14420       do_vfp_nsyn_opcode ("fmrrs");
14421       break;
14422
14423     case NS_FFRR:  /* case 15 (fmsrr).  */
14424       constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
14425                   _("VFP registers must be adjacent"));
14426       inst.operands[1] = inst.operands[2];
14427       inst.operands[2] = inst.operands[3];
14428       inst.operands[0].imm = 2;
14429       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
14430       do_vfp_nsyn_opcode ("fmsrr");
14431       break;
14432
14433     default:
14434       abort ();
14435     }
14436 }
14437
14438 static void
14439 do_neon_rshift_round_imm (void)
14440 {
14441   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14442   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
14443   int imm = inst.operands[2].imm;
14444
14445   /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
14446   if (imm == 0)
14447     {
14448       inst.operands[2].present = 0;
14449       do_neon_mov ();
14450       return;
14451     }
14452
14453   constraint (imm < 1 || (unsigned)imm > et.size,
14454               _("immediate out of range for shift"));
14455   neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
14456                   et.size - imm);
14457 }
14458
14459 static void
14460 do_neon_movl (void)
14461 {
14462   struct neon_type_el et = neon_check_type (2, NS_QD,
14463     N_EQK | N_DBL, N_SU_32 | N_KEY);
14464   unsigned sizebits = et.size >> 3;
14465   inst.instruction |= sizebits << 19;
14466   neon_two_same (0, et.type == NT_unsigned, -1);
14467 }
14468
14469 static void
14470 do_neon_trn (void)
14471 {
14472   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14473   struct neon_type_el et = neon_check_type (2, rs,
14474     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14475   NEON_ENCODE (INTEGER, inst);
14476   neon_two_same (neon_quad (rs), 1, et.size);
14477 }
14478
14479 static void
14480 do_neon_zip_uzp (void)
14481 {
14482   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14483   struct neon_type_el et = neon_check_type (2, rs,
14484     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14485   if (rs == NS_DD && et.size == 32)
14486     {
14487       /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
14488       inst.instruction = N_MNEM_vtrn;
14489       do_neon_trn ();
14490       return;
14491     }
14492   neon_two_same (neon_quad (rs), 1, et.size);
14493 }
14494
14495 static void
14496 do_neon_sat_abs_neg (void)
14497 {
14498   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14499   struct neon_type_el et = neon_check_type (2, rs,
14500     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
14501   neon_two_same (neon_quad (rs), 1, et.size);
14502 }
14503
14504 static void
14505 do_neon_pair_long (void)
14506 {
14507   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14508   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
14509   /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
14510   inst.instruction |= (et.type == NT_unsigned) << 7;
14511   neon_two_same (neon_quad (rs), 1, et.size);
14512 }
14513
14514 static void
14515 do_neon_recip_est (void)
14516 {
14517   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14518   struct neon_type_el et = neon_check_type (2, rs,
14519     N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
14520   inst.instruction |= (et.type == NT_float) << 8;
14521   neon_two_same (neon_quad (rs), 1, et.size);
14522 }
14523
14524 static void
14525 do_neon_cls (void)
14526 {
14527   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14528   struct neon_type_el et = neon_check_type (2, rs,
14529     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
14530   neon_two_same (neon_quad (rs), 1, et.size);
14531 }
14532
14533 static void
14534 do_neon_clz (void)
14535 {
14536   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14537   struct neon_type_el et = neon_check_type (2, rs,
14538     N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
14539   neon_two_same (neon_quad (rs), 1, et.size);
14540 }
14541
14542 static void
14543 do_neon_cnt (void)
14544 {
14545   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14546   struct neon_type_el et = neon_check_type (2, rs,
14547     N_EQK | N_INT, N_8 | N_KEY);
14548   neon_two_same (neon_quad (rs), 1, et.size);
14549 }
14550
14551 static void
14552 do_neon_swp (void)
14553 {
14554   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14555   neon_two_same (neon_quad (rs), 1, -1);
14556 }
14557
14558 static void
14559 do_neon_tbl_tbx (void)
14560 {
14561   unsigned listlenbits;
14562   neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
14563
14564   if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
14565     {
14566       first_error (_("bad list length for table lookup"));
14567       return;
14568     }
14569
14570   listlenbits = inst.operands[1].imm - 1;
14571   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14572   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14573   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14574   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14575   inst.instruction |= LOW4 (inst.operands[2].reg);
14576   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14577   inst.instruction |= listlenbits << 8;
14578
14579   neon_dp_fixup (&inst);
14580 }
14581
14582 static void
14583 do_neon_ldm_stm (void)
14584 {
14585   /* P, U and L bits are part of bitmask.  */
14586   int is_dbmode = (inst.instruction & (1 << 24)) != 0;
14587   unsigned offsetbits = inst.operands[1].imm * 2;
14588
14589   if (inst.operands[1].issingle)
14590     {
14591       do_vfp_nsyn_ldm_stm (is_dbmode);
14592       return;
14593     }
14594
14595   constraint (is_dbmode && !inst.operands[0].writeback,
14596               _("writeback (!) must be used for VLDMDB and VSTMDB"));
14597
14598   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
14599               _("register list must contain at least 1 and at most 16 "
14600                 "registers"));
14601
14602   inst.instruction |= inst.operands[0].reg << 16;
14603   inst.instruction |= inst.operands[0].writeback << 21;
14604   inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
14605   inst.instruction |= HI1 (inst.operands[1].reg) << 22;
14606
14607   inst.instruction |= offsetbits;
14608
14609   do_vfp_cond_or_thumb ();
14610 }
14611
14612 static void
14613 do_neon_ldr_str (void)
14614 {
14615   int is_ldr = (inst.instruction & (1 << 20)) != 0;
14616
14617   if (inst.operands[0].issingle)
14618     {
14619       if (is_ldr)
14620         do_vfp_nsyn_opcode ("flds");
14621       else
14622         do_vfp_nsyn_opcode ("fsts");
14623     }
14624   else
14625     {
14626       if (is_ldr)
14627         do_vfp_nsyn_opcode ("fldd");
14628       else
14629         do_vfp_nsyn_opcode ("fstd");
14630     }
14631 }
14632
14633 /* "interleave" version also handles non-interleaving register VLD1/VST1
14634    instructions.  */
14635
14636 static void
14637 do_neon_ld_st_interleave (void)
14638 {
14639   struct neon_type_el et = neon_check_type (1, NS_NULL,
14640                                             N_8 | N_16 | N_32 | N_64);
14641   unsigned alignbits = 0;
14642   unsigned idx;
14643   /* The bits in this table go:
14644      0: register stride of one (0) or two (1)
14645      1,2: register list length, minus one (1, 2, 3, 4).
14646      3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
14647      We use -1 for invalid entries.  */
14648   const int typetable[] =
14649     {
14650       0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
14651        -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
14652        -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
14653        -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
14654     };
14655   int typebits;
14656
14657   if (et.type == NT_invtype)
14658     return;
14659
14660   if (inst.operands[1].immisalign)
14661     switch (inst.operands[1].imm >> 8)
14662       {
14663       case 64: alignbits = 1; break;
14664       case 128:
14665         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) == 3)
14666           goto bad_alignment;
14667         alignbits = 2;
14668         break;
14669       case 256:
14670         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) == 3)
14671           goto bad_alignment;
14672         alignbits = 3;
14673         break;
14674       default:
14675       bad_alignment:
14676         first_error (_("bad alignment"));
14677         return;
14678       }
14679
14680   inst.instruction |= alignbits << 4;
14681   inst.instruction |= neon_logbits (et.size) << 6;
14682
14683   /* Bits [4:6] of the immediate in a list specifier encode register stride
14684      (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
14685      VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
14686      up the right value for "type" in a table based on this value and the given
14687      list style, then stick it back.  */
14688   idx = ((inst.operands[0].imm >> 4) & 7)
14689         | (((inst.instruction >> 8) & 3) << 3);
14690
14691   typebits = typetable[idx];
14692
14693   constraint (typebits == -1, _("bad list type for instruction"));
14694
14695   inst.instruction &= ~0xf00;
14696   inst.instruction |= typebits << 8;
14697 }
14698
14699 /* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
14700    *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
14701    otherwise. The variable arguments are a list of pairs of legal (size, align)
14702    values, terminated with -1.  */
14703
14704 static int
14705 neon_alignment_bit (int size, int align, int *do_align, ...)
14706 {
14707   va_list ap;
14708   int result = FAIL, thissize, thisalign;
14709
14710   if (!inst.operands[1].immisalign)
14711     {
14712       *do_align = 0;
14713       return SUCCESS;
14714     }
14715
14716   va_start (ap, do_align);
14717
14718   do
14719     {
14720       thissize = va_arg (ap, int);
14721       if (thissize == -1)
14722         break;
14723       thisalign = va_arg (ap, int);
14724
14725       if (size == thissize && align == thisalign)
14726         result = SUCCESS;
14727     }
14728   while (result != SUCCESS);
14729
14730   va_end (ap);
14731
14732   if (result == SUCCESS)
14733     *do_align = 1;
14734   else
14735     first_error (_("unsupported alignment for instruction"));
14736
14737   return result;
14738 }
14739
14740 static void
14741 do_neon_ld_st_lane (void)
14742 {
14743   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
14744   int align_good, do_align = 0;
14745   int logsize = neon_logbits (et.size);
14746   int align = inst.operands[1].imm >> 8;
14747   int n = (inst.instruction >> 8) & 3;
14748   int max_el = 64 / et.size;
14749
14750   if (et.type == NT_invtype)
14751     return;
14752
14753   constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
14754               _("bad list length"));
14755   constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
14756               _("scalar index out of range"));
14757   constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
14758               && et.size == 8,
14759               _("stride of 2 unavailable when element size is 8"));
14760
14761   switch (n)
14762     {
14763     case 0:  /* VLD1 / VST1.  */
14764       align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
14765                                        32, 32, -1);
14766       if (align_good == FAIL)
14767         return;
14768       if (do_align)
14769         {
14770           unsigned alignbits = 0;
14771           switch (et.size)
14772             {
14773             case 16: alignbits = 0x1; break;
14774             case 32: alignbits = 0x3; break;
14775             default: ;
14776             }
14777           inst.instruction |= alignbits << 4;
14778         }
14779       break;
14780
14781     case 1:  /* VLD2 / VST2.  */
14782       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
14783                                        32, 64, -1);
14784       if (align_good == FAIL)
14785         return;
14786       if (do_align)
14787         inst.instruction |= 1 << 4;
14788       break;
14789
14790     case 2:  /* VLD3 / VST3.  */
14791       constraint (inst.operands[1].immisalign,
14792                   _("can't use alignment with this instruction"));
14793       break;
14794
14795     case 3:  /* VLD4 / VST4.  */
14796       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
14797                                        16, 64, 32, 64, 32, 128, -1);
14798       if (align_good == FAIL)
14799         return;
14800       if (do_align)
14801         {
14802           unsigned alignbits = 0;
14803           switch (et.size)
14804             {
14805             case 8:  alignbits = 0x1; break;
14806             case 16: alignbits = 0x1; break;
14807             case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
14808             default: ;
14809             }
14810           inst.instruction |= alignbits << 4;
14811         }
14812       break;
14813
14814     default: ;
14815     }
14816
14817   /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
14818   if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
14819     inst.instruction |= 1 << (4 + logsize);
14820
14821   inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
14822   inst.instruction |= logsize << 10;
14823 }
14824
14825 /* Encode single n-element structure to all lanes VLD<n> instructions.  */
14826
14827 static void
14828 do_neon_ld_dup (void)
14829 {
14830   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
14831   int align_good, do_align = 0;
14832
14833   if (et.type == NT_invtype)
14834     return;
14835
14836   switch ((inst.instruction >> 8) & 3)
14837     {
14838     case 0:  /* VLD1.  */
14839       gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
14840       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
14841                                        &do_align, 16, 16, 32, 32, -1);
14842       if (align_good == FAIL)
14843         return;
14844       switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
14845         {
14846         case 1: break;
14847         case 2: inst.instruction |= 1 << 5; break;
14848         default: first_error (_("bad list length")); return;
14849         }
14850       inst.instruction |= neon_logbits (et.size) << 6;
14851       break;
14852
14853     case 1:  /* VLD2.  */
14854       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
14855                                        &do_align, 8, 16, 16, 32, 32, 64, -1);
14856       if (align_good == FAIL)
14857         return;
14858       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
14859                   _("bad list length"));
14860       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
14861         inst.instruction |= 1 << 5;
14862       inst.instruction |= neon_logbits (et.size) << 6;
14863       break;
14864
14865     case 2:  /* VLD3.  */
14866       constraint (inst.operands[1].immisalign,
14867                   _("can't use alignment with this instruction"));
14868       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
14869                   _("bad list length"));
14870       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
14871         inst.instruction |= 1 << 5;
14872       inst.instruction |= neon_logbits (et.size) << 6;
14873       break;
14874
14875     case 3:  /* VLD4.  */
14876       {
14877         int align = inst.operands[1].imm >> 8;
14878         align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
14879                                          16, 64, 32, 64, 32, 128, -1);
14880         if (align_good == FAIL)
14881           return;
14882         constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
14883                     _("bad list length"));
14884         if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
14885           inst.instruction |= 1 << 5;
14886         if (et.size == 32 && align == 128)
14887           inst.instruction |= 0x3 << 6;
14888         else
14889           inst.instruction |= neon_logbits (et.size) << 6;
14890       }
14891       break;
14892
14893     default: ;
14894     }
14895
14896   inst.instruction |= do_align << 4;
14897 }
14898
14899 /* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
14900    apart from bits [11:4].  */
14901
14902 static void
14903 do_neon_ldx_stx (void)
14904 {
14905   if (inst.operands[1].isreg)
14906     constraint (inst.operands[1].reg == REG_PC, BAD_PC);
14907
14908   switch (NEON_LANE (inst.operands[0].imm))
14909     {
14910     case NEON_INTERLEAVE_LANES:
14911       NEON_ENCODE (INTERLV, inst);
14912       do_neon_ld_st_interleave ();
14913       break;
14914
14915     case NEON_ALL_LANES:
14916       NEON_ENCODE (DUP, inst);
14917       do_neon_ld_dup ();
14918       break;
14919
14920     default:
14921       NEON_ENCODE (LANE, inst);
14922       do_neon_ld_st_lane ();
14923     }
14924
14925   /* L bit comes from bit mask.  */
14926   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14927   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14928   inst.instruction |= inst.operands[1].reg << 16;
14929
14930   if (inst.operands[1].postind)
14931     {
14932       int postreg = inst.operands[1].imm & 0xf;
14933       constraint (!inst.operands[1].immisreg,
14934                   _("post-index must be a register"));
14935       constraint (postreg == 0xd || postreg == 0xf,
14936                   _("bad register for post-index"));
14937       inst.instruction |= postreg;
14938     }
14939   else if (inst.operands[1].writeback)
14940     {
14941       inst.instruction |= 0xd;
14942     }
14943   else
14944     inst.instruction |= 0xf;
14945
14946   if (thumb_mode)
14947     inst.instruction |= 0xf9000000;
14948   else
14949     inst.instruction |= 0xf4000000;
14950 }
14951 \f
14952 /* Overall per-instruction processing.  */
14953
14954 /* We need to be able to fix up arbitrary expressions in some statements.
14955    This is so that we can handle symbols that are an arbitrary distance from
14956    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
14957    which returns part of an address in a form which will be valid for
14958    a data instruction.  We do this by pushing the expression into a symbol
14959    in the expr_section, and creating a fix for that.  */
14960
14961 static void
14962 fix_new_arm (fragS *       frag,
14963              int           where,
14964              short int     size,
14965              expressionS * exp,
14966              int           pc_rel,
14967              int           reloc)
14968 {
14969   fixS *           new_fix;
14970
14971   switch (exp->X_op)
14972     {
14973     case O_constant:
14974     case O_symbol:
14975     case O_add:
14976     case O_subtract:
14977       new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
14978                              (enum bfd_reloc_code_real) reloc);
14979       break;
14980
14981     default:
14982       new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
14983                                   pc_rel, (enum bfd_reloc_code_real) reloc);
14984       break;
14985     }
14986
14987   /* Mark whether the fix is to a THUMB instruction, or an ARM
14988      instruction.  */
14989   new_fix->tc_fix_data = thumb_mode;
14990 }
14991
14992 /* Create a frg for an instruction requiring relaxation.  */
14993 static void
14994 output_relax_insn (void)
14995 {
14996   char * to;
14997   symbolS *sym;
14998   int offset;
14999
15000   /* The size of the instruction is unknown, so tie the debug info to the
15001      start of the instruction.  */
15002   dwarf2_emit_insn (0);
15003
15004   switch (inst.reloc.exp.X_op)
15005     {
15006     case O_symbol:
15007       sym = inst.reloc.exp.X_add_symbol;
15008       offset = inst.reloc.exp.X_add_number;
15009       break;
15010     case O_constant:
15011       sym = NULL;
15012       offset = inst.reloc.exp.X_add_number;
15013       break;
15014     default:
15015       sym = make_expr_symbol (&inst.reloc.exp);
15016       offset = 0;
15017       break;
15018   }
15019   to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
15020                  inst.relax, sym, offset, NULL/*offset, opcode*/);
15021   md_number_to_chars (to, inst.instruction, THUMB_SIZE);
15022 }
15023
15024 /* Write a 32-bit thumb instruction to buf.  */
15025 static void
15026 put_thumb32_insn (char * buf, unsigned long insn)
15027 {
15028   md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
15029   md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
15030 }
15031
15032 static void
15033 output_inst (const char * str)
15034 {
15035   char * to = NULL;
15036
15037   if (inst.error)
15038     {
15039       as_bad ("%s -- `%s'", inst.error, str);
15040       return;
15041     }
15042   if (inst.relax)
15043     {
15044       output_relax_insn ();
15045       return;
15046     }
15047   if (inst.size == 0)
15048     return;
15049
15050   to = frag_more (inst.size);
15051   /* PR 9814: Record the thumb mode into the current frag so that we know
15052      what type of NOP padding to use, if necessary.  We override any previous
15053      setting so that if the mode has changed then the NOPS that we use will
15054      match the encoding of the last instruction in the frag.  */
15055   frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
15056
15057   if (thumb_mode && (inst.size > THUMB_SIZE))
15058     {
15059       gas_assert (inst.size == (2 * THUMB_SIZE));
15060       put_thumb32_insn (to, inst.instruction);
15061     }
15062   else if (inst.size > INSN_SIZE)
15063     {
15064       gas_assert (inst.size == (2 * INSN_SIZE));
15065       md_number_to_chars (to, inst.instruction, INSN_SIZE);
15066       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
15067     }
15068   else
15069     md_number_to_chars (to, inst.instruction, inst.size);
15070
15071   if (inst.reloc.type != BFD_RELOC_UNUSED)
15072     fix_new_arm (frag_now, to - frag_now->fr_literal,
15073                  inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
15074                  inst.reloc.type);
15075
15076   dwarf2_emit_insn (inst.size);
15077 }
15078
15079 static char *
15080 output_it_inst (int cond, int mask, char * to)
15081 {
15082   unsigned long instruction = 0xbf00;
15083
15084   mask &= 0xf;
15085   instruction |= mask;
15086   instruction |= cond << 4;
15087
15088   if (to == NULL)
15089     {
15090       to = frag_more (2);
15091 #ifdef OBJ_ELF
15092       dwarf2_emit_insn (2);
15093 #endif
15094     }
15095
15096   md_number_to_chars (to, instruction, 2);
15097
15098   return to;
15099 }
15100
15101 /* Tag values used in struct asm_opcode's tag field.  */
15102 enum opcode_tag
15103 {
15104   OT_unconditional,     /* Instruction cannot be conditionalized.
15105                            The ARM condition field is still 0xE.  */
15106   OT_unconditionalF,    /* Instruction cannot be conditionalized
15107                            and carries 0xF in its ARM condition field.  */
15108   OT_csuffix,           /* Instruction takes a conditional suffix.  */
15109   OT_csuffixF,          /* Some forms of the instruction take a conditional
15110                            suffix, others place 0xF where the condition field
15111                            would be.  */
15112   OT_cinfix3,           /* Instruction takes a conditional infix,
15113                            beginning at character index 3.  (In
15114                            unified mode, it becomes a suffix.)  */
15115   OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
15116                             tsts, cmps, cmns, and teqs. */
15117   OT_cinfix3_legacy,    /* Legacy instruction takes a conditional infix at
15118                            character index 3, even in unified mode.  Used for
15119                            legacy instructions where suffix and infix forms
15120                            may be ambiguous.  */
15121   OT_csuf_or_in3,       /* Instruction takes either a conditional
15122                            suffix or an infix at character index 3.  */
15123   OT_odd_infix_unc,     /* This is the unconditional variant of an
15124                            instruction that takes a conditional infix
15125                            at an unusual position.  In unified mode,
15126                            this variant will accept a suffix.  */
15127   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
15128                            are the conditional variants of instructions that
15129                            take conditional infixes in unusual positions.
15130                            The infix appears at character index
15131                            (tag - OT_odd_infix_0).  These are not accepted
15132                            in unified mode.  */
15133 };
15134
15135 /* Subroutine of md_assemble, responsible for looking up the primary
15136    opcode from the mnemonic the user wrote.  STR points to the
15137    beginning of the mnemonic.
15138
15139    This is not simply a hash table lookup, because of conditional
15140    variants.  Most instructions have conditional variants, which are
15141    expressed with a _conditional affix_ to the mnemonic.  If we were
15142    to encode each conditional variant as a literal string in the opcode
15143    table, it would have approximately 20,000 entries.
15144
15145    Most mnemonics take this affix as a suffix, and in unified syntax,
15146    'most' is upgraded to 'all'.  However, in the divided syntax, some
15147    instructions take the affix as an infix, notably the s-variants of
15148    the arithmetic instructions.  Of those instructions, all but six
15149    have the infix appear after the third character of the mnemonic.
15150
15151    Accordingly, the algorithm for looking up primary opcodes given
15152    an identifier is:
15153
15154    1. Look up the identifier in the opcode table.
15155       If we find a match, go to step U.
15156
15157    2. Look up the last two characters of the identifier in the
15158       conditions table.  If we find a match, look up the first N-2
15159       characters of the identifier in the opcode table.  If we
15160       find a match, go to step CE.
15161
15162    3. Look up the fourth and fifth characters of the identifier in
15163       the conditions table.  If we find a match, extract those
15164       characters from the identifier, and look up the remaining
15165       characters in the opcode table.  If we find a match, go
15166       to step CM.
15167
15168    4. Fail.
15169
15170    U. Examine the tag field of the opcode structure, in case this is
15171       one of the six instructions with its conditional infix in an
15172       unusual place.  If it is, the tag tells us where to find the
15173       infix; look it up in the conditions table and set inst.cond
15174       accordingly.  Otherwise, this is an unconditional instruction.
15175       Again set inst.cond accordingly.  Return the opcode structure.
15176
15177   CE. Examine the tag field to make sure this is an instruction that
15178       should receive a conditional suffix.  If it is not, fail.
15179       Otherwise, set inst.cond from the suffix we already looked up,
15180       and return the opcode structure.
15181
15182   CM. Examine the tag field to make sure this is an instruction that
15183       should receive a conditional infix after the third character.
15184       If it is not, fail.  Otherwise, undo the edits to the current
15185       line of input and proceed as for case CE.  */
15186
15187 static const struct asm_opcode *
15188 opcode_lookup (char **str)
15189 {
15190   char *end, *base;
15191   char *affix;
15192   const struct asm_opcode *opcode;
15193   const struct asm_cond *cond;
15194   char save[2];
15195
15196   /* Scan up to the end of the mnemonic, which must end in white space,
15197      '.' (in unified mode, or for Neon/VFP instructions), or end of string.  */
15198   for (base = end = *str; *end != '\0'; end++)
15199     if (*end == ' ' || *end == '.')
15200       break;
15201
15202   if (end == base)
15203     return NULL;
15204
15205   /* Handle a possible width suffix and/or Neon type suffix.  */
15206   if (end[0] == '.')
15207     {
15208       int offset = 2;
15209
15210       /* The .w and .n suffixes are only valid if the unified syntax is in
15211          use.  */
15212       if (unified_syntax && end[1] == 'w')
15213         inst.size_req = 4;
15214       else if (unified_syntax && end[1] == 'n')
15215         inst.size_req = 2;
15216       else
15217         offset = 0;
15218
15219       inst.vectype.elems = 0;
15220
15221       *str = end + offset;
15222
15223       if (end[offset] == '.')
15224         {
15225           /* See if we have a Neon type suffix (possible in either unified or
15226              non-unified ARM syntax mode).  */
15227           if (parse_neon_type (&inst.vectype, str) == FAIL)
15228             return NULL;
15229         }
15230       else if (end[offset] != '\0' && end[offset] != ' ')
15231         return NULL;
15232     }
15233   else
15234     *str = end;
15235
15236   /* Look for unaffixed or special-case affixed mnemonic.  */
15237   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15238                                                     end - base);
15239   if (opcode)
15240     {
15241       /* step U */
15242       if (opcode->tag < OT_odd_infix_0)
15243         {
15244           inst.cond = COND_ALWAYS;
15245           return opcode;
15246         }
15247
15248       if (warn_on_deprecated && unified_syntax)
15249         as_warn (_("conditional infixes are deprecated in unified syntax"));
15250       affix = base + (opcode->tag - OT_odd_infix_0);
15251       cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15252       gas_assert (cond);
15253
15254       inst.cond = cond->value;
15255       return opcode;
15256     }
15257
15258   /* Cannot have a conditional suffix on a mnemonic of less than two
15259      characters.  */
15260   if (end - base < 3)
15261     return NULL;
15262
15263   /* Look for suffixed mnemonic.  */
15264   affix = end - 2;
15265   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15266   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15267                                                     affix - base);
15268   if (opcode && cond)
15269     {
15270       /* step CE */
15271       switch (opcode->tag)
15272         {
15273         case OT_cinfix3_legacy:
15274           /* Ignore conditional suffixes matched on infix only mnemonics.  */
15275           break;
15276
15277         case OT_cinfix3:
15278         case OT_cinfix3_deprecated:
15279         case OT_odd_infix_unc:
15280           if (!unified_syntax)
15281             return 0;
15282           /* else fall through */
15283
15284         case OT_csuffix:
15285         case OT_csuffixF:
15286         case OT_csuf_or_in3:
15287           inst.cond = cond->value;
15288           return opcode;
15289
15290         case OT_unconditional:
15291         case OT_unconditionalF:
15292           if (thumb_mode)
15293             inst.cond = cond->value;
15294           else
15295             {
15296               /* Delayed diagnostic.  */
15297               inst.error = BAD_COND;
15298               inst.cond = COND_ALWAYS;
15299             }
15300           return opcode;
15301
15302         default:
15303           return NULL;
15304         }
15305     }
15306
15307   /* Cannot have a usual-position infix on a mnemonic of less than
15308      six characters (five would be a suffix).  */
15309   if (end - base < 6)
15310     return NULL;
15311
15312   /* Look for infixed mnemonic in the usual position.  */
15313   affix = base + 3;
15314   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15315   if (!cond)
15316     return NULL;
15317
15318   memcpy (save, affix, 2);
15319   memmove (affix, affix + 2, (end - affix) - 2);
15320   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15321                                                     (end - base) - 2);
15322   memmove (affix + 2, affix, (end - affix) - 2);
15323   memcpy (affix, save, 2);
15324
15325   if (opcode
15326       && (opcode->tag == OT_cinfix3
15327           || opcode->tag == OT_cinfix3_deprecated
15328           || opcode->tag == OT_csuf_or_in3
15329           || opcode->tag == OT_cinfix3_legacy))
15330     {
15331       /* Step CM.  */
15332       if (warn_on_deprecated && unified_syntax
15333           && (opcode->tag == OT_cinfix3
15334               || opcode->tag == OT_cinfix3_deprecated))
15335         as_warn (_("conditional infixes are deprecated in unified syntax"));
15336
15337       inst.cond = cond->value;
15338       return opcode;
15339     }
15340
15341   return NULL;
15342 }
15343
15344 /* This function generates an initial IT instruction, leaving its block
15345    virtually open for the new instructions. Eventually,
15346    the mask will be updated by now_it_add_mask () each time
15347    a new instruction needs to be included in the IT block.
15348    Finally, the block is closed with close_automatic_it_block ().
15349    The block closure can be requested either from md_assemble (),
15350    a tencode (), or due to a label hook.  */
15351
15352 static void
15353 new_automatic_it_block (int cond)
15354 {
15355   now_it.state = AUTOMATIC_IT_BLOCK;
15356   now_it.mask = 0x18;
15357   now_it.cc = cond;
15358   now_it.block_length = 1;
15359   mapping_state (MAP_THUMB);
15360   now_it.insn = output_it_inst (cond, now_it.mask, NULL);
15361 }
15362
15363 /* Close an automatic IT block.
15364    See comments in new_automatic_it_block ().  */
15365
15366 static void
15367 close_automatic_it_block (void)
15368 {
15369   now_it.mask = 0x10;
15370   now_it.block_length = 0;
15371 }
15372
15373 /* Update the mask of the current automatically-generated IT
15374    instruction. See comments in new_automatic_it_block ().  */
15375
15376 static void
15377 now_it_add_mask (int cond)
15378 {
15379 #define CLEAR_BIT(value, nbit)  ((value) & ~(1 << (nbit)))
15380 #define SET_BIT_VALUE(value, bitvalue, nbit)  (CLEAR_BIT (value, nbit) \
15381                                               | ((bitvalue) << (nbit)))
15382   const int resulting_bit = (cond & 1);
15383
15384   now_it.mask &= 0xf;
15385   now_it.mask = SET_BIT_VALUE (now_it.mask,
15386                                    resulting_bit,
15387                                   (5 - now_it.block_length));
15388   now_it.mask = SET_BIT_VALUE (now_it.mask,
15389                                    1,
15390                                    ((5 - now_it.block_length) - 1) );
15391   output_it_inst (now_it.cc, now_it.mask, now_it.insn);
15392
15393 #undef CLEAR_BIT
15394 #undef SET_BIT_VALUE
15395 }
15396
15397 /* The IT blocks handling machinery is accessed through the these functions:
15398      it_fsm_pre_encode ()               from md_assemble ()
15399      set_it_insn_type ()                optional, from the tencode functions
15400      set_it_insn_type_last ()           ditto
15401      in_it_block ()                     ditto
15402      it_fsm_post_encode ()              from md_assemble ()
15403      force_automatic_it_block_close ()  from label habdling functions
15404
15405    Rationale:
15406      1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
15407         initializing the IT insn type with a generic initial value depending
15408         on the inst.condition.
15409      2) During the tencode function, two things may happen:
15410         a) The tencode function overrides the IT insn type by
15411            calling either set_it_insn_type (type) or set_it_insn_type_last ().
15412         b) The tencode function queries the IT block state by
15413            calling in_it_block () (i.e. to determine narrow/not narrow mode).
15414
15415         Both set_it_insn_type and in_it_block run the internal FSM state
15416         handling function (handle_it_state), because: a) setting the IT insn
15417         type may incur in an invalid state (exiting the function),
15418         and b) querying the state requires the FSM to be updated.
15419         Specifically we want to avoid creating an IT block for conditional
15420         branches, so it_fsm_pre_encode is actually a guess and we can't
15421         determine whether an IT block is required until the tencode () routine
15422         has decided what type of instruction this actually it.
15423         Because of this, if set_it_insn_type and in_it_block have to be used,
15424         set_it_insn_type has to be called first.
15425
15426         set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
15427         determines the insn IT type depending on the inst.cond code.
15428         When a tencode () routine encodes an instruction that can be
15429         either outside an IT block, or, in the case of being inside, has to be
15430         the last one, set_it_insn_type_last () will determine the proper
15431         IT instruction type based on the inst.cond code. Otherwise,
15432         set_it_insn_type can be called for overriding that logic or
15433         for covering other cases.
15434
15435         Calling handle_it_state () may not transition the IT block state to
15436         OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
15437         still queried. Instead, if the FSM determines that the state should
15438         be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
15439         after the tencode () function: that's what it_fsm_post_encode () does.
15440
15441         Since in_it_block () calls the state handling function to get an
15442         updated state, an error may occur (due to invalid insns combination).
15443         In that case, inst.error is set.
15444         Therefore, inst.error has to be checked after the execution of
15445         the tencode () routine.
15446
15447      3) Back in md_assemble(), it_fsm_post_encode () is called to commit
15448         any pending state change (if any) that didn't take place in
15449         handle_it_state () as explained above.  */
15450
15451 static void
15452 it_fsm_pre_encode (void)
15453 {
15454   if (inst.cond != COND_ALWAYS)
15455     inst.it_insn_type = INSIDE_IT_INSN;
15456   else
15457     inst.it_insn_type = OUTSIDE_IT_INSN;
15458
15459   now_it.state_handled = 0;
15460 }
15461
15462 /* IT state FSM handling function.  */
15463
15464 static int
15465 handle_it_state (void)
15466 {
15467   now_it.state_handled = 1;
15468
15469   switch (now_it.state)
15470     {
15471     case OUTSIDE_IT_BLOCK:
15472       switch (inst.it_insn_type)
15473         {
15474         case OUTSIDE_IT_INSN:
15475           break;
15476
15477         case INSIDE_IT_INSN:
15478         case INSIDE_IT_LAST_INSN:
15479           if (thumb_mode == 0)
15480             {
15481               if (unified_syntax
15482                   && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
15483                 as_tsktsk (_("Warning: conditional outside an IT block"\
15484                              " for Thumb."));
15485             }
15486           else
15487             {
15488               if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
15489                   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
15490                 {
15491                   /* Automatically generate the IT instruction.  */
15492                   new_automatic_it_block (inst.cond);
15493                   if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
15494                     close_automatic_it_block ();
15495                 }
15496               else
15497                 {
15498                   inst.error = BAD_OUT_IT;
15499                   return FAIL;
15500                 }
15501             }
15502           break;
15503
15504         case IF_INSIDE_IT_LAST_INSN:
15505         case NEUTRAL_IT_INSN:
15506           break;
15507
15508         case IT_INSN:
15509           now_it.state = MANUAL_IT_BLOCK;
15510           now_it.block_length = 0;
15511           break;
15512         }
15513       break;
15514
15515     case AUTOMATIC_IT_BLOCK:
15516       /* Three things may happen now:
15517          a) We should increment current it block size;
15518          b) We should close current it block (closing insn or 4 insns);
15519          c) We should close current it block and start a new one (due
15520          to incompatible conditions or
15521          4 insns-length block reached).  */
15522
15523       switch (inst.it_insn_type)
15524         {
15525         case OUTSIDE_IT_INSN:
15526           /* The closure of the block shall happen immediatelly,
15527              so any in_it_block () call reports the block as closed.  */
15528           force_automatic_it_block_close ();
15529           break;
15530
15531         case INSIDE_IT_INSN:
15532         case INSIDE_IT_LAST_INSN:
15533         case IF_INSIDE_IT_LAST_INSN:
15534           now_it.block_length++;
15535
15536           if (now_it.block_length > 4
15537               || !now_it_compatible (inst.cond))
15538             {
15539               force_automatic_it_block_close ();
15540               if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
15541                 new_automatic_it_block (inst.cond);
15542             }
15543           else
15544             {
15545               now_it_add_mask (inst.cond);
15546             }
15547
15548           if (now_it.state == AUTOMATIC_IT_BLOCK
15549               && (inst.it_insn_type == INSIDE_IT_LAST_INSN
15550                   || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
15551             close_automatic_it_block ();
15552           break;
15553
15554         case NEUTRAL_IT_INSN:
15555           now_it.block_length++;
15556
15557           if (now_it.block_length > 4)
15558             force_automatic_it_block_close ();
15559           else
15560             now_it_add_mask (now_it.cc & 1);
15561           break;
15562
15563         case IT_INSN:
15564           close_automatic_it_block ();
15565           now_it.state = MANUAL_IT_BLOCK;
15566           break;
15567         }
15568       break;
15569
15570     case MANUAL_IT_BLOCK:
15571       {
15572         /* Check conditional suffixes.  */
15573         const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
15574         int is_last;
15575         now_it.mask <<= 1;
15576         now_it.mask &= 0x1f;
15577         is_last = (now_it.mask == 0x10);
15578
15579         switch (inst.it_insn_type)
15580           {
15581           case OUTSIDE_IT_INSN:
15582             inst.error = BAD_NOT_IT;
15583             return FAIL;
15584
15585           case INSIDE_IT_INSN:
15586             if (cond != inst.cond)
15587               {
15588                 inst.error = BAD_IT_COND;
15589                 return FAIL;
15590               }
15591             break;
15592
15593           case INSIDE_IT_LAST_INSN:
15594           case IF_INSIDE_IT_LAST_INSN:
15595             if (cond != inst.cond)
15596               {
15597                 inst.error = BAD_IT_COND;
15598                 return FAIL;
15599               }
15600             if (!is_last)
15601               {
15602                 inst.error = BAD_BRANCH;
15603                 return FAIL;
15604               }
15605             break;
15606
15607           case NEUTRAL_IT_INSN:
15608             /* The BKPT instruction is unconditional even in an IT block.  */
15609             break;
15610
15611           case IT_INSN:
15612             inst.error = BAD_IT_IT;
15613             return FAIL;
15614           }
15615       }
15616       break;
15617     }
15618
15619   return SUCCESS;
15620 }
15621
15622 static void
15623 it_fsm_post_encode (void)
15624 {
15625   int is_last;
15626
15627   if (!now_it.state_handled)
15628     handle_it_state ();
15629
15630   is_last = (now_it.mask == 0x10);
15631   if (is_last)
15632     {
15633       now_it.state = OUTSIDE_IT_BLOCK;
15634       now_it.mask = 0;
15635     }
15636 }
15637
15638 static void
15639 force_automatic_it_block_close (void)
15640 {
15641   if (now_it.state == AUTOMATIC_IT_BLOCK)
15642     {
15643       close_automatic_it_block ();
15644       now_it.state = OUTSIDE_IT_BLOCK;
15645       now_it.mask = 0;
15646     }
15647 }
15648
15649 static int
15650 in_it_block (void)
15651 {
15652   if (!now_it.state_handled)
15653     handle_it_state ();
15654
15655   return now_it.state != OUTSIDE_IT_BLOCK;
15656 }
15657
15658 void
15659 md_assemble (char *str)
15660 {
15661   char *p = str;
15662   const struct asm_opcode * opcode;
15663
15664   /* Align the previous label if needed.  */
15665   if (last_label_seen != NULL)
15666     {
15667       symbol_set_frag (last_label_seen, frag_now);
15668       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
15669       S_SET_SEGMENT (last_label_seen, now_seg);
15670     }
15671
15672   memset (&inst, '\0', sizeof (inst));
15673   inst.reloc.type = BFD_RELOC_UNUSED;
15674
15675   opcode = opcode_lookup (&p);
15676   if (!opcode)
15677     {
15678       /* It wasn't an instruction, but it might be a register alias of
15679          the form alias .req reg, or a Neon .dn/.qn directive.  */
15680       if (! create_register_alias (str, p)
15681           && ! create_neon_reg_alias (str, p))
15682         as_bad (_("bad instruction `%s'"), str);
15683
15684       return;
15685     }
15686
15687   if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
15688     as_warn (_("s suffix on comparison instruction is deprecated"));
15689
15690   /* The value which unconditional instructions should have in place of the
15691      condition field.  */
15692   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
15693
15694   if (thumb_mode)
15695     {
15696       arm_feature_set variant;
15697
15698       variant = cpu_variant;
15699       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
15700       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
15701         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
15702       /* Check that this instruction is supported for this CPU.  */
15703       if (!opcode->tvariant
15704           || (thumb_mode == 1
15705               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
15706         {
15707           as_bad (_("selected processor does not support `%s'"), str);
15708           return;
15709         }
15710       if (inst.cond != COND_ALWAYS && !unified_syntax
15711           && opcode->tencode != do_t_branch)
15712         {
15713           as_bad (_("Thumb does not support conditional execution"));
15714           return;
15715         }
15716
15717       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
15718         {
15719           if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
15720               && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
15721                    || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
15722             {
15723               /* Two things are addressed here.
15724                  1) Implicit require narrow instructions on Thumb-1.
15725                     This avoids relaxation accidentally introducing Thumb-2
15726                      instructions.
15727                  2) Reject wide instructions in non Thumb-2 cores.  */
15728               if (inst.size_req == 0)
15729                 inst.size_req = 2;
15730               else if (inst.size_req == 4)
15731                 {
15732                   as_bad (_("selected processor does not support `%s'"), str);
15733                   return;
15734                 }
15735             }
15736         }
15737
15738       inst.instruction = opcode->tvalue;
15739
15740       if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
15741         {
15742           /* Prepare the it_insn_type for those encodings that don't set
15743              it.  */
15744           it_fsm_pre_encode ();
15745
15746           opcode->tencode ();
15747
15748           it_fsm_post_encode ();
15749         }
15750
15751       if (!(inst.error || inst.relax))
15752         {
15753           gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
15754           inst.size = (inst.instruction > 0xffff ? 4 : 2);
15755           if (inst.size_req && inst.size_req != inst.size)
15756             {
15757               as_bad (_("cannot honor width suffix -- `%s'"), str);
15758               return;
15759             }
15760         }
15761
15762       /* Something has gone badly wrong if we try to relax a fixed size
15763          instruction.  */
15764       gas_assert (inst.size_req == 0 || !inst.relax);
15765
15766       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
15767                               *opcode->tvariant);
15768       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
15769          set those bits when Thumb-2 32-bit instructions are seen.  ie.
15770          anything other than bl/blx and v6-M instructions.
15771          This is overly pessimistic for relaxable instructions.  */
15772       if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
15773            || inst.relax)
15774           && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
15775                || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
15776         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
15777                                 arm_ext_v6t2);
15778
15779       check_neon_suffixes;
15780
15781       if (!inst.error)
15782         {
15783           mapping_state (MAP_THUMB);
15784         }
15785     }
15786   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
15787     {
15788       bfd_boolean is_bx;
15789
15790       /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
15791       is_bx = (opcode->aencode == do_bx);
15792
15793       /* Check that this instruction is supported for this CPU.  */
15794       if (!(is_bx && fix_v4bx)
15795           && !(opcode->avariant &&
15796                ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
15797         {
15798           as_bad (_("selected processor does not support `%s'"), str);
15799           return;
15800         }
15801       if (inst.size_req)
15802         {
15803           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
15804           return;
15805         }
15806
15807       inst.instruction = opcode->avalue;
15808       if (opcode->tag == OT_unconditionalF)
15809         inst.instruction |= 0xF << 28;
15810       else
15811         inst.instruction |= inst.cond << 28;
15812       inst.size = INSN_SIZE;
15813       if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
15814         {
15815           it_fsm_pre_encode ();
15816           opcode->aencode ();
15817           it_fsm_post_encode ();
15818         }
15819       /* Arm mode bx is marked as both v4T and v5 because it's still required
15820          on a hypothetical non-thumb v5 core.  */
15821       if (is_bx)
15822         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
15823       else
15824         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
15825                                 *opcode->avariant);
15826
15827       check_neon_suffixes;
15828
15829       if (!inst.error)
15830         {
15831           mapping_state (MAP_ARM);
15832         }
15833     }
15834   else
15835     {
15836       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
15837                 "-- `%s'"), str);
15838       return;
15839     }
15840   output_inst (str);
15841 }
15842
15843 static void
15844 check_it_blocks_finished (void)
15845 {
15846 #ifdef OBJ_ELF
15847   asection *sect;
15848
15849   for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
15850     if (seg_info (sect)->tc_segment_info_data.current_it.state
15851         == MANUAL_IT_BLOCK)
15852       {
15853         as_warn (_("section '%s' finished with an open IT block."),
15854                  sect->name);
15855       }
15856 #else
15857   if (now_it.state == MANUAL_IT_BLOCK)
15858     as_warn (_("file finished with an open IT block."));
15859 #endif
15860 }
15861
15862 /* Various frobbings of labels and their addresses.  */
15863
15864 void
15865 arm_start_line_hook (void)
15866 {
15867   last_label_seen = NULL;
15868 }
15869
15870 void
15871 arm_frob_label (symbolS * sym)
15872 {
15873   last_label_seen = sym;
15874
15875   ARM_SET_THUMB (sym, thumb_mode);
15876
15877 #if defined OBJ_COFF || defined OBJ_ELF
15878   ARM_SET_INTERWORK (sym, support_interwork);
15879 #endif
15880
15881   force_automatic_it_block_close ();
15882
15883   /* Note - do not allow local symbols (.Lxxx) to be labelled
15884      as Thumb functions.  This is because these labels, whilst
15885      they exist inside Thumb code, are not the entry points for
15886      possible ARM->Thumb calls.  Also, these labels can be used
15887      as part of a computed goto or switch statement.  eg gcc
15888      can generate code that looks like this:
15889
15890                 ldr  r2, [pc, .Laaa]
15891                 lsl  r3, r3, #2
15892                 ldr  r2, [r3, r2]
15893                 mov  pc, r2
15894
15895        .Lbbb:  .word .Lxxx
15896        .Lccc:  .word .Lyyy
15897        ..etc...
15898        .Laaa:   .word Lbbb
15899
15900      The first instruction loads the address of the jump table.
15901      The second instruction converts a table index into a byte offset.
15902      The third instruction gets the jump address out of the table.
15903      The fourth instruction performs the jump.
15904
15905      If the address stored at .Laaa is that of a symbol which has the
15906      Thumb_Func bit set, then the linker will arrange for this address
15907      to have the bottom bit set, which in turn would mean that the
15908      address computation performed by the third instruction would end
15909      up with the bottom bit set.  Since the ARM is capable of unaligned
15910      word loads, the instruction would then load the incorrect address
15911      out of the jump table, and chaos would ensue.  */
15912   if (label_is_thumb_function_name
15913       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
15914       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
15915     {
15916       /* When the address of a Thumb function is taken the bottom
15917          bit of that address should be set.  This will allow
15918          interworking between Arm and Thumb functions to work
15919          correctly.  */
15920
15921       THUMB_SET_FUNC (sym, 1);
15922
15923       label_is_thumb_function_name = FALSE;
15924     }
15925
15926   dwarf2_emit_label (sym);
15927 }
15928
15929 bfd_boolean
15930 arm_data_in_code (void)
15931 {
15932   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
15933     {
15934       *input_line_pointer = '/';
15935       input_line_pointer += 5;
15936       *input_line_pointer = 0;
15937       return TRUE;
15938     }
15939
15940   return FALSE;
15941 }
15942
15943 char *
15944 arm_canonicalize_symbol_name (char * name)
15945 {
15946   int len;
15947
15948   if (thumb_mode && (len = strlen (name)) > 5
15949       && streq (name + len - 5, "/data"))
15950     *(name + len - 5) = 0;
15951
15952   return name;
15953 }
15954 \f
15955 /* Table of all register names defined by default.  The user can
15956    define additional names with .req.  Note that all register names
15957    should appear in both upper and lowercase variants.  Some registers
15958    also have mixed-case names.  */
15959
15960 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
15961 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
15962 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
15963 #define REGSET(p,t) \
15964   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
15965   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
15966   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
15967   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
15968 #define REGSETH(p,t) \
15969   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
15970   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
15971   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
15972   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
15973 #define REGSET2(p,t) \
15974   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
15975   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
15976   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
15977   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
15978
15979 static const struct reg_entry reg_names[] =
15980 {
15981   /* ARM integer registers.  */
15982   REGSET(r, RN), REGSET(R, RN),
15983
15984   /* ATPCS synonyms.  */
15985   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
15986   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
15987   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
15988
15989   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
15990   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
15991   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
15992
15993   /* Well-known aliases.  */
15994   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
15995   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
15996
15997   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
15998   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
15999
16000   /* Coprocessor numbers.  */
16001   REGSET(p, CP), REGSET(P, CP),
16002
16003   /* Coprocessor register numbers.  The "cr" variants are for backward
16004      compatibility.  */
16005   REGSET(c,  CN), REGSET(C, CN),
16006   REGSET(cr, CN), REGSET(CR, CN),
16007
16008   /* FPA registers.  */
16009   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
16010   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
16011
16012   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
16013   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
16014
16015   /* VFP SP registers.  */
16016   REGSET(s,VFS),  REGSET(S,VFS),
16017   REGSETH(s,VFS), REGSETH(S,VFS),
16018
16019   /* VFP DP Registers.  */
16020   REGSET(d,VFD),  REGSET(D,VFD),
16021   /* Extra Neon DP registers.  */
16022   REGSETH(d,VFD), REGSETH(D,VFD),
16023
16024   /* Neon QP registers.  */
16025   REGSET2(q,NQ),  REGSET2(Q,NQ),
16026
16027   /* VFP control registers.  */
16028   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
16029   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
16030   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
16031   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
16032   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
16033   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
16034
16035   /* Maverick DSP coprocessor registers.  */
16036   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
16037   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
16038
16039   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
16040   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
16041   REGDEF(dspsc,0,DSPSC),
16042
16043   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
16044   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
16045   REGDEF(DSPSC,0,DSPSC),
16046
16047   /* iWMMXt data registers - p0, c0-15.  */
16048   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
16049
16050   /* iWMMXt control registers - p1, c0-3.  */
16051   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
16052   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
16053   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
16054   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
16055
16056   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
16057   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
16058   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
16059   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
16060   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
16061
16062   /* XScale accumulator registers.  */
16063   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
16064 };
16065 #undef REGDEF
16066 #undef REGNUM
16067 #undef REGSET
16068
16069 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
16070    within psr_required_here.  */
16071 static const struct asm_psr psrs[] =
16072 {
16073   /* Backward compatibility notation.  Note that "all" is no longer
16074      truly all possible PSR bits.  */
16075   {"all",  PSR_c | PSR_f},
16076   {"flg",  PSR_f},
16077   {"ctl",  PSR_c},
16078
16079   /* Individual flags.  */
16080   {"f",    PSR_f},
16081   {"c",    PSR_c},
16082   {"x",    PSR_x},
16083   {"s",    PSR_s},
16084   /* Combinations of flags.  */
16085   {"fs",   PSR_f | PSR_s},
16086   {"fx",   PSR_f | PSR_x},
16087   {"fc",   PSR_f | PSR_c},
16088   {"sf",   PSR_s | PSR_f},
16089   {"sx",   PSR_s | PSR_x},
16090   {"sc",   PSR_s | PSR_c},
16091   {"xf",   PSR_x | PSR_f},
16092   {"xs",   PSR_x | PSR_s},
16093   {"xc",   PSR_x | PSR_c},
16094   {"cf",   PSR_c | PSR_f},
16095   {"cs",   PSR_c | PSR_s},
16096   {"cx",   PSR_c | PSR_x},
16097   {"fsx",  PSR_f | PSR_s | PSR_x},
16098   {"fsc",  PSR_f | PSR_s | PSR_c},
16099   {"fxs",  PSR_f | PSR_x | PSR_s},
16100   {"fxc",  PSR_f | PSR_x | PSR_c},
16101   {"fcs",  PSR_f | PSR_c | PSR_s},
16102   {"fcx",  PSR_f | PSR_c | PSR_x},
16103   {"sfx",  PSR_s | PSR_f | PSR_x},
16104   {"sfc",  PSR_s | PSR_f | PSR_c},
16105   {"sxf",  PSR_s | PSR_x | PSR_f},
16106   {"sxc",  PSR_s | PSR_x | PSR_c},
16107   {"scf",  PSR_s | PSR_c | PSR_f},
16108   {"scx",  PSR_s | PSR_c | PSR_x},
16109   {"xfs",  PSR_x | PSR_f | PSR_s},
16110   {"xfc",  PSR_x | PSR_f | PSR_c},
16111   {"xsf",  PSR_x | PSR_s | PSR_f},
16112   {"xsc",  PSR_x | PSR_s | PSR_c},
16113   {"xcf",  PSR_x | PSR_c | PSR_f},
16114   {"xcs",  PSR_x | PSR_c | PSR_s},
16115   {"cfs",  PSR_c | PSR_f | PSR_s},
16116   {"cfx",  PSR_c | PSR_f | PSR_x},
16117   {"csf",  PSR_c | PSR_s | PSR_f},
16118   {"csx",  PSR_c | PSR_s | PSR_x},
16119   {"cxf",  PSR_c | PSR_x | PSR_f},
16120   {"cxs",  PSR_c | PSR_x | PSR_s},
16121   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
16122   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
16123   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
16124   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
16125   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
16126   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
16127   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
16128   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
16129   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
16130   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
16131   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
16132   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
16133   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
16134   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
16135   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
16136   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
16137   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
16138   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
16139   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
16140   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
16141   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
16142   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
16143   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
16144   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
16145 };
16146
16147 /* Table of V7M psr names.  */
16148 static const struct asm_psr v7m_psrs[] =
16149 {
16150   {"apsr",        0 }, {"APSR",         0 },
16151   {"iapsr",       1 }, {"IAPSR",        1 },
16152   {"eapsr",       2 }, {"EAPSR",        2 },
16153   {"psr",         3 }, {"PSR",          3 },
16154   {"xpsr",        3 }, {"XPSR",         3 }, {"xPSR",     3 },
16155   {"ipsr",        5 }, {"IPSR",         5 },
16156   {"epsr",        6 }, {"EPSR",         6 },
16157   {"iepsr",       7 }, {"IEPSR",        7 },
16158   {"msp",         8 }, {"MSP",          8 },
16159   {"psp",         9 }, {"PSP",          9 },
16160   {"primask",     16}, {"PRIMASK",      16},
16161   {"basepri",     17}, {"BASEPRI",      17},
16162   {"basepri_max", 18}, {"BASEPRI_MAX",  18},
16163   {"faultmask",   19}, {"FAULTMASK",    19},
16164   {"control",     20}, {"CONTROL",      20}
16165 };
16166
16167 /* Table of all shift-in-operand names.  */
16168 static const struct asm_shift_name shift_names [] =
16169 {
16170   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
16171   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
16172   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
16173   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
16174   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
16175   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
16176 };
16177
16178 /* Table of all explicit relocation names.  */
16179 #ifdef OBJ_ELF
16180 static struct reloc_entry reloc_names[] =
16181 {
16182   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
16183   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
16184   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
16185   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
16186   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
16187   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
16188   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
16189   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
16190   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
16191   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
16192   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32}
16193 };
16194 #endif
16195
16196 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
16197 static const struct asm_cond conds[] =
16198 {
16199   {"eq", 0x0},
16200   {"ne", 0x1},
16201   {"cs", 0x2}, {"hs", 0x2},
16202   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
16203   {"mi", 0x4},
16204   {"pl", 0x5},
16205   {"vs", 0x6},
16206   {"vc", 0x7},
16207   {"hi", 0x8},
16208   {"ls", 0x9},
16209   {"ge", 0xa},
16210   {"lt", 0xb},
16211   {"gt", 0xc},
16212   {"le", 0xd},
16213   {"al", 0xe}
16214 };
16215
16216 static struct asm_barrier_opt barrier_opt_names[] =
16217 {
16218   { "sy",   0xf },
16219   { "un",   0x7 },
16220   { "st",   0xe },
16221   { "unst", 0x6 }
16222 };
16223
16224 /* Table of ARM-format instructions.    */
16225
16226 /* Macros for gluing together operand strings.  N.B. In all cases
16227    other than OPS0, the trailing OP_stop comes from default
16228    zero-initialization of the unspecified elements of the array.  */
16229 #define OPS0()            { OP_stop, }
16230 #define OPS1(a)           { OP_##a, }
16231 #define OPS2(a,b)         { OP_##a,OP_##b, }
16232 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
16233 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
16234 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
16235 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
16236
16237 /* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
16238    This is useful when mixing operands for ARM and THUMB, i.e. using the
16239    MIX_ARM_THUMB_OPERANDS macro.
16240    In order to use these macros, prefix the number of operands with _
16241    e.g. _3.  */
16242 #define OPS_1(a)           { a, }
16243 #define OPS_2(a,b)         { a,b, }
16244 #define OPS_3(a,b,c)       { a,b,c, }
16245 #define OPS_4(a,b,c,d)     { a,b,c,d, }
16246 #define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
16247 #define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
16248
16249 /* These macros abstract out the exact format of the mnemonic table and
16250    save some repeated characters.  */
16251
16252 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
16253 #define TxCE(mnem, op, top, nops, ops, ae, te) \
16254   { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
16255     THUMB_VARIANT, do_##ae, do_##te }
16256
16257 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
16258    a T_MNEM_xyz enumerator.  */
16259 #define TCE(mnem, aop, top, nops, ops, ae, te) \
16260       TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
16261 #define tCE(mnem, aop, top, nops, ops, ae, te) \
16262       TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
16263
16264 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
16265    infix after the third character.  */
16266 #define TxC3(mnem, op, top, nops, ops, ae, te) \
16267   { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
16268     THUMB_VARIANT, do_##ae, do_##te }
16269 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
16270   { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
16271     THUMB_VARIANT, do_##ae, do_##te }
16272 #define TC3(mnem, aop, top, nops, ops, ae, te) \
16273       TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
16274 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
16275       TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
16276 #define tC3(mnem, aop, top, nops, ops, ae, te) \
16277       TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
16278 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
16279       TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
16280
16281 /* Mnemonic with a conditional infix in an unusual place.  Each and every variant has to
16282    appear in the condition table.  */
16283 #define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te)   \
16284   { m1 #m2 m3, OPS##nops ops, sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
16285     0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
16286
16287 #define TxCM(m1, m2, op, top, nops, ops, ae, te)        \
16288   TxCM_ (m1,   , m2, op, top, nops, ops, ae, te),       \
16289   TxCM_ (m1, eq, m2, op, top, nops, ops, ae, te),       \
16290   TxCM_ (m1, ne, m2, op, top, nops, ops, ae, te),       \
16291   TxCM_ (m1, cs, m2, op, top, nops, ops, ae, te),       \
16292   TxCM_ (m1, hs, m2, op, top, nops, ops, ae, te),       \
16293   TxCM_ (m1, cc, m2, op, top, nops, ops, ae, te),       \
16294   TxCM_ (m1, ul, m2, op, top, nops, ops, ae, te),       \
16295   TxCM_ (m1, lo, m2, op, top, nops, ops, ae, te),       \
16296   TxCM_ (m1, mi, m2, op, top, nops, ops, ae, te),       \
16297   TxCM_ (m1, pl, m2, op, top, nops, ops, ae, te),       \
16298   TxCM_ (m1, vs, m2, op, top, nops, ops, ae, te),       \
16299   TxCM_ (m1, vc, m2, op, top, nops, ops, ae, te),       \
16300   TxCM_ (m1, hi, m2, op, top, nops, ops, ae, te),       \
16301   TxCM_ (m1, ls, m2, op, top, nops, ops, ae, te),       \
16302   TxCM_ (m1, ge, m2, op, top, nops, ops, ae, te),       \
16303   TxCM_ (m1, lt, m2, op, top, nops, ops, ae, te),       \
16304   TxCM_ (m1, gt, m2, op, top, nops, ops, ae, te),       \
16305   TxCM_ (m1, le, m2, op, top, nops, ops, ae, te),       \
16306   TxCM_ (m1, al, m2, op, top, nops, ops, ae, te)
16307
16308 #define TCM(m1,m2, aop, top, nops, ops, ae, te)         \
16309       TxCM (m1,m2, aop, 0x##top, nops, ops, ae, te)
16310 #define tCM(m1,m2, aop, top, nops, ops, ae, te)         \
16311       TxCM (m1,m2, aop, T_MNEM##top, nops, ops, ae, te)
16312
16313 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
16314    field is still 0xE.  Many of the Thumb variants can be executed
16315    conditionally, so this is checked separately.  */
16316 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
16317   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
16318     THUMB_VARIANT, do_##ae, do_##te }
16319
16320 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
16321    condition code field.  */
16322 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
16323   { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
16324     THUMB_VARIANT, do_##ae, do_##te }
16325
16326 /* ARM-only variants of all the above.  */
16327 #define CE(mnem,  op, nops, ops, ae)    \
16328   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16329
16330 #define C3(mnem, op, nops, ops, ae)     \
16331   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16332
16333 /* Legacy mnemonics that always have conditional infix after the third
16334    character.  */
16335 #define CL(mnem, op, nops, ops, ae)     \
16336   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
16337     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16338
16339 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
16340 #define cCE(mnem,  op, nops, ops, ae)   \
16341   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16342
16343 /* Legacy coprocessor instructions where conditional infix and conditional
16344    suffix are ambiguous.  For consistency this includes all FPA instructions,
16345    not just the potentially ambiguous ones.  */
16346 #define cCL(mnem, op, nops, ops, ae)    \
16347   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
16348     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16349
16350 /* Coprocessor, takes either a suffix or a position-3 infix
16351    (for an FPA corner case). */
16352 #define C3E(mnem, op, nops, ops, ae) \
16353   { mnem, OPS##nops ops, OT_csuf_or_in3, \
16354     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16355
16356 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
16357   { m1 #m2 m3, OPS##nops ops, \
16358     sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
16359     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16360
16361 #define CM(m1, m2, op, nops, ops, ae)   \
16362   xCM_ (m1,   , m2, op, nops, ops, ae), \
16363   xCM_ (m1, eq, m2, op, nops, ops, ae), \
16364   xCM_ (m1, ne, m2, op, nops, ops, ae), \
16365   xCM_ (m1, cs, m2, op, nops, ops, ae), \
16366   xCM_ (m1, hs, m2, op, nops, ops, ae), \
16367   xCM_ (m1, cc, m2, op, nops, ops, ae), \
16368   xCM_ (m1, ul, m2, op, nops, ops, ae), \
16369   xCM_ (m1, lo, m2, op, nops, ops, ae), \
16370   xCM_ (m1, mi, m2, op, nops, ops, ae), \
16371   xCM_ (m1, pl, m2, op, nops, ops, ae), \
16372   xCM_ (m1, vs, m2, op, nops, ops, ae), \
16373   xCM_ (m1, vc, m2, op, nops, ops, ae), \
16374   xCM_ (m1, hi, m2, op, nops, ops, ae), \
16375   xCM_ (m1, ls, m2, op, nops, ops, ae), \
16376   xCM_ (m1, ge, m2, op, nops, ops, ae), \
16377   xCM_ (m1, lt, m2, op, nops, ops, ae), \
16378   xCM_ (m1, gt, m2, op, nops, ops, ae), \
16379   xCM_ (m1, le, m2, op, nops, ops, ae), \
16380   xCM_ (m1, al, m2, op, nops, ops, ae)
16381
16382 #define UE(mnem, op, nops, ops, ae)     \
16383   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
16384
16385 #define UF(mnem, op, nops, ops, ae)     \
16386   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
16387
16388 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
16389    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
16390    use the same encoding function for each.  */
16391 #define NUF(mnem, op, nops, ops, enc)                                   \
16392   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
16393     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16394
16395 /* Neon data processing, version which indirects through neon_enc_tab for
16396    the various overloaded versions of opcodes.  */
16397 #define nUF(mnem, op, nops, ops, enc)                                   \
16398   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
16399     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16400
16401 /* Neon insn with conditional suffix for the ARM version, non-overloaded
16402    version.  */
16403 #define NCE_tag(mnem, op, nops, ops, enc, tag)                          \
16404   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
16405     THUMB_VARIANT, do_##enc, do_##enc }
16406
16407 #define NCE(mnem, op, nops, ops, enc)                                   \
16408    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
16409
16410 #define NCEF(mnem, op, nops, ops, enc)                                  \
16411     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
16412
16413 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
16414 #define nCE_tag(mnem, op, nops, ops, enc, tag)                          \
16415   { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,          \
16416     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16417
16418 #define nCE(mnem, op, nops, ops, enc)                                   \
16419    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
16420
16421 #define nCEF(mnem, op, nops, ops, enc)                                  \
16422     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
16423
16424 #define do_0 0
16425
16426 /* Thumb-only, unconditional.  */
16427 #define UT(mnem,  op, nops, ops, te) TUE (mnem,  0, op, nops, ops, 0, te)
16428
16429 static const struct asm_opcode insns[] =
16430 {
16431 #define ARM_VARIANT &arm_ext_v1 /* Core ARM Instructions.  */
16432 #define THUMB_VARIANT &arm_ext_v4t
16433  tCE("and",     0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
16434  tC3("ands",    0100000, _ands,    3, (RR, oRR, SH), arit, t_arit3c),
16435  tCE("eor",     0200000, _eor,     3, (RR, oRR, SH), arit, t_arit3c),
16436  tC3("eors",    0300000, _eors,    3, (RR, oRR, SH), arit, t_arit3c),
16437  tCE("sub",     0400000, _sub,     3, (RR, oRR, SH), arit, t_add_sub),
16438  tC3("subs",    0500000, _subs,    3, (RR, oRR, SH), arit, t_add_sub),
16439  tCE("add",     0800000, _add,     3, (RR, oRR, SHG), arit, t_add_sub),
16440  tC3("adds",    0900000, _adds,    3, (RR, oRR, SHG), arit, t_add_sub),
16441  tCE("adc",     0a00000, _adc,     3, (RR, oRR, SH), arit, t_arit3c),
16442  tC3("adcs",    0b00000, _adcs,    3, (RR, oRR, SH), arit, t_arit3c),
16443  tCE("sbc",     0c00000, _sbc,     3, (RR, oRR, SH), arit, t_arit3),
16444  tC3("sbcs",    0d00000, _sbcs,    3, (RR, oRR, SH), arit, t_arit3),
16445  tCE("orr",     1800000, _orr,     3, (RR, oRR, SH), arit, t_arit3c),
16446  tC3("orrs",    1900000, _orrs,    3, (RR, oRR, SH), arit, t_arit3c),
16447  tCE("bic",     1c00000, _bic,     3, (RR, oRR, SH), arit, t_arit3),
16448  tC3("bics",    1d00000, _bics,    3, (RR, oRR, SH), arit, t_arit3),
16449
16450  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
16451     for setting PSR flag bits.  They are obsolete in V6 and do not
16452     have Thumb equivalents. */
16453  tCE("tst",     1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
16454  tC3w("tsts",   1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
16455   CL("tstp",    110f000,           2, (RR, SH),      cmp),
16456  tCE("cmp",     1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
16457  tC3w("cmps",   1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
16458   CL("cmpp",    150f000,           2, (RR, SH),      cmp),
16459  tCE("cmn",     1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
16460  tC3w("cmns",   1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
16461   CL("cmnp",    170f000,           2, (RR, SH),      cmp),
16462
16463  tCE("mov",     1a00000, _mov,     2, (RR, SH),      mov,  t_mov_cmp),
16464  tC3("movs",    1b00000, _movs,    2, (RR, SH),      mov,  t_mov_cmp),
16465  tCE("mvn",     1e00000, _mvn,     2, (RR, SH),      mov,  t_mvn_tst),
16466  tC3("mvns",    1f00000, _mvns,    2, (RR, SH),      mov,  t_mvn_tst),
16467
16468  tCE("ldr",     4100000, _ldr,     2, (RR, ADDRGLDR),ldst, t_ldst),
16469  tC3("ldrb",    4500000, _ldrb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
16470  tCE("str",     4000000, _str,     _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
16471                                                                 OP_RRnpc),
16472                                         OP_ADDRGLDR),ldst, t_ldst),
16473  tC3("strb",    4400000, _strb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
16474
16475  tCE("stm",     8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16476  tC3("stmia",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16477  tC3("stmea",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16478  tCE("ldm",     8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16479  tC3("ldmia",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16480  tC3("ldmfd",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16481
16482  TCE("swi",     f000000, df00,     1, (EXPi),        swi, t_swi),
16483  TCE("svc",     f000000, df00,     1, (EXPi),        swi, t_swi),
16484  tCE("b",       a000000, _b,       1, (EXPr),        branch, t_branch),
16485  TCE("bl",      b000000, f000f800, 1, (EXPr),        bl, t_branch23),
16486
16487   /* Pseudo ops.  */
16488  tCE("adr",     28f0000, _adr,     2, (RR, EXP),     adr,  t_adr),
16489   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
16490  tCE("nop",     1a00000, _nop,     1, (oI255c),      nop,  t_nop),
16491
16492   /* Thumb-compatibility pseudo ops.  */
16493  tCE("lsl",     1a00000, _lsl,     3, (RR, oRR, SH), shift, t_shift),
16494  tC3("lsls",    1b00000, _lsls,    3, (RR, oRR, SH), shift, t_shift),
16495  tCE("lsr",     1a00020, _lsr,     3, (RR, oRR, SH), shift, t_shift),
16496  tC3("lsrs",    1b00020, _lsrs,    3, (RR, oRR, SH), shift, t_shift),
16497  tCE("asr",     1a00040, _asr,     3, (RR, oRR, SH), shift, t_shift),
16498  tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
16499  tCE("ror",     1a00060, _ror,     3, (RR, oRR, SH), shift, t_shift),
16500  tC3("rors",    1b00060, _rors,    3, (RR, oRR, SH), shift, t_shift),
16501  tCE("neg",     2600000, _neg,     2, (RR, RR),      rd_rn, t_neg),
16502  tC3("negs",    2700000, _negs,    2, (RR, RR),      rd_rn, t_neg),
16503  tCE("push",    92d0000, _push,     1, (REGLST),             push_pop, t_push_pop),
16504  tCE("pop",     8bd0000, _pop,     1, (REGLST),      push_pop, t_push_pop),
16505
16506  /* These may simplify to neg.  */
16507  TCE("rsb",     0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
16508  TC3("rsbs",    0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
16509
16510 #undef  THUMB_VARIANT
16511 #define THUMB_VARIANT  & arm_ext_v6
16512
16513  TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
16514
16515  /* V1 instructions with no Thumb analogue prior to V6T2.  */
16516 #undef  THUMB_VARIANT
16517 #define THUMB_VARIANT  & arm_ext_v6t2
16518
16519  TCE("teq",     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
16520  TC3w("teqs",   1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
16521   CL("teqp",    130f000,           2, (RR, SH),      cmp),
16522
16523  TC3("ldrt",    4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
16524  TC3("ldrbt",   4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
16525  TC3("strt",    4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
16526  TC3("strbt",   4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
16527
16528  TC3("stmdb",   9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
16529  TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
16530
16531  TC3("ldmdb",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
16532  TC3("ldmea",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
16533
16534  /* V1 instructions with no Thumb analogue at all.  */
16535   CE("rsc",     0e00000,           3, (RR, oRR, SH), arit),
16536   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
16537
16538   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
16539   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
16540   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
16541   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
16542   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
16543   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
16544   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
16545   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
16546
16547 #undef  ARM_VARIANT
16548 #define ARM_VARIANT    & arm_ext_v2     /* ARM 2 - multiplies.  */
16549 #undef  THUMB_VARIANT
16550 #define THUMB_VARIANT  & arm_ext_v4t
16551
16552  tCE("mul",     0000090, _mul,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
16553  tC3("muls",    0100090, _muls,    3, (RRnpc, RRnpc, oRR), mul, t_mul),
16554
16555 #undef  THUMB_VARIANT
16556 #define THUMB_VARIANT  & arm_ext_v6t2
16557
16558  TCE("mla",     0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
16559   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
16560
16561   /* Generic coprocessor instructions.  */
16562  TCE("cdp",     e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
16563  TCE("ldc",     c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16564  TC3("ldcl",    c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16565  TCE("stc",     c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16566  TC3("stcl",    c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16567  TCE("mcr",     e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
16568  TCE("mrc",     e100010, ee100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
16569
16570 #undef  ARM_VARIANT
16571 #define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
16572
16573   CE("swp",     1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
16574   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
16575
16576 #undef  ARM_VARIANT
16577 #define ARM_VARIANT    & arm_ext_v3     /* ARM 6 Status register instructions.  */
16578 #undef  THUMB_VARIANT
16579 #define THUMB_VARIANT  & arm_ext_msr
16580
16581  TCE("mrs",     10f0000, f3ef8000, 2, (APSR_RR, RVC_PSR), mrs, t_mrs),
16582  TCE("msr",     120f000, f3808000, 2, (RVC_PSR, RR_EXi), msr, t_msr),
16583
16584 #undef  ARM_VARIANT
16585 #define ARM_VARIANT    & arm_ext_v3m     /* ARM 7M long multiplies.  */
16586 #undef  THUMB_VARIANT
16587 #define THUMB_VARIANT  & arm_ext_v6t2
16588
16589  TCE("smull",   0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
16590   CM("smull","s",       0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
16591  TCE("umull",   0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
16592   CM("umull","s",       0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
16593  TCE("smlal",   0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
16594   CM("smlal","s",       0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
16595  TCE("umlal",   0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
16596   CM("umlal","s",       0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
16597
16598 #undef  ARM_VARIANT
16599 #define ARM_VARIANT    & arm_ext_v4     /* ARM Architecture 4.  */
16600 #undef  THUMB_VARIANT
16601 #define THUMB_VARIANT  & arm_ext_v4t
16602
16603  tC3("ldrh",    01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16604  tC3("strh",    00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16605  tC3("ldrsh",   01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16606  tC3("ldrsb",   01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16607  tCM("ld","sh", 01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16608  tCM("ld","sb", 01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16609
16610 #undef  ARM_VARIANT
16611 #define ARM_VARIANT  & arm_ext_v4t_5
16612
16613   /* ARM Architecture 4T.  */
16614   /* Note: bx (and blx) are required on V5, even if the processor does
16615      not support Thumb.  */
16616  TCE("bx",      12fff10, 4700, 1, (RR), bx, t_bx),
16617
16618 #undef  ARM_VARIANT
16619 #define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.     */
16620 #undef  THUMB_VARIANT
16621 #define THUMB_VARIANT  & arm_ext_v5t
16622
16623   /* Note: blx has 2 variants; the .value coded here is for
16624      BLX(2).  Only this variant has conditional execution.  */
16625  TCE("blx",     12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
16626  TUE("bkpt",    1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
16627
16628 #undef  THUMB_VARIANT
16629 #define THUMB_VARIANT  & arm_ext_v6t2
16630
16631  TCE("clz",     16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
16632  TUF("ldc2",    c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16633  TUF("ldc2l",   c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
16634  TUF("stc2",    c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16635  TUF("stc2l",   c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
16636  TUF("cdp2",    e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
16637  TUF("mcr2",    e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
16638  TUF("mrc2",    e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
16639
16640 #undef  ARM_VARIANT
16641 #define ARM_VARIANT  & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
16642 #undef THUMB_VARIANT
16643 #define THUMB_VARIANT &arm_ext_v5exp
16644
16645  TCE("smlabb",  1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16646  TCE("smlatb",  10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16647  TCE("smlabt",  10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16648  TCE("smlatt",  10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16649
16650  TCE("smlawb",  1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16651  TCE("smlawt",  12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16652
16653  TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
16654  TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
16655  TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
16656  TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
16657
16658  TCE("smulbb",  1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16659  TCE("smultb",  16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16660  TCE("smulbt",  16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16661  TCE("smultt",  16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16662
16663  TCE("smulwb",  12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16664  TCE("smulwt",  12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16665
16666  TCE("qadd",    1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
16667  TCE("qdadd",   1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
16668  TCE("qsub",    1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
16669  TCE("qdsub",   1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
16670
16671 #undef  ARM_VARIANT
16672 #define ARM_VARIANT  & arm_ext_v5e /*  ARM Architecture 5TE.  */
16673 #undef THUMB_VARIANT
16674 #define THUMB_VARIANT &arm_ext_v6t2
16675
16676  TUF("pld",     450f000, f810f000, 1, (ADDR),                pld,  t_pld),
16677  TC3("ldrd",    00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
16678      ldrd, t_ldstd),
16679  TC3("strd",    00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
16680                                        ADDRGLDRS), ldrd, t_ldstd),
16681
16682  TCE("mcrr",    c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
16683  TCE("mrrc",    c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
16684
16685 #undef  ARM_VARIANT
16686 #define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
16687
16688  TCE("bxj",     12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
16689
16690 #undef  ARM_VARIANT
16691 #define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
16692 #undef  THUMB_VARIANT
16693 #define THUMB_VARIANT  & arm_ext_v6
16694
16695  TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
16696  TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
16697  tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
16698  tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
16699  tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
16700  tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
16701  tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
16702  tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
16703  tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
16704  TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
16705
16706 #undef  THUMB_VARIANT
16707 #define THUMB_VARIANT  & arm_ext_v6t2
16708
16709  TCE("ldrex",   1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),        ldrex, t_ldrex),
16710  TCE("strex",   1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
16711                                       strex,  t_strex),
16712  TUF("mcrr2",   c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
16713  TUF("mrrc2",   c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
16714
16715  TCE("ssat",    6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
16716  TCE("usat",    6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
16717
16718 /*  ARM V6 not included in V7M.  */
16719 #undef  THUMB_VARIANT
16720 #define THUMB_VARIANT  & arm_ext_v6_notm
16721  TUF("rfeia",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
16722   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
16723   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
16724  TUF("rfedb",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
16725  TUF("rfefd",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
16726   UF(rfefa,     9900a00,           1, (RRw),                       rfe),
16727   UF(rfeea,     8100a00,           1, (RRw),                       rfe),
16728  TUF("rfeed",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
16729  TUF("srsia",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
16730   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
16731   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
16732  TUF("srsdb",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
16733
16734 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
16735 #undef  THUMB_VARIANT
16736 #define THUMB_VARIANT  & arm_ext_v6_dsp
16737  TUF("cps",     1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
16738  TCE("pkhbt",   6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
16739  TCE("pkhtb",   6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
16740  TCE("qadd16",  6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16741  TCE("qadd8",   6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16742  TCE("qasx",    6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16743  /* Old name for QASX.  */
16744  TCE("qaddsubx",        6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16745  TCE("qsax",    6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16746  /* Old name for QSAX.  */
16747  TCE("qsubaddx",        6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16748  TCE("qsub16",  6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16749  TCE("qsub8",   6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16750  TCE("sadd16",  6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16751  TCE("sadd8",   6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16752  TCE("sasx",    6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16753  /* Old name for SASX.  */
16754  TCE("saddsubx",        6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16755  TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16756  TCE("shadd8",  6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16757  TCE("shasx",     6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16758  /* Old name for SHASX.  */
16759  TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16760  TCE("shsax",      6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),    rd_rn_rm, t_simd),
16761  /* Old name for SHSAX.  */
16762  TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16763  TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16764  TCE("shsub8",  6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16765  TCE("ssax",    6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16766  /* Old name for SSAX.  */
16767  TCE("ssubaddx",        6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16768  TCE("ssub16",  6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16769  TCE("ssub8",   6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16770  TCE("uadd16",  6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16771  TCE("uadd8",   6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16772  TCE("uasx",    6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16773  /* Old name for UASX.  */
16774  TCE("uaddsubx",        6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16775  TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16776  TCE("uhadd8",  6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16777  TCE("uhasx",     6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16778  /* Old name for UHASX.  */
16779  TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16780  TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16781  /* Old name for UHSAX.  */
16782  TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16783  TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16784  TCE("uhsub8",  6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16785  TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16786  TCE("uqadd8",  6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16787  TCE("uqasx",     6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16788  /* Old name for UQASX.  */
16789  TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16790  TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16791  /* Old name for UQSAX.  */
16792  TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
16793  TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16794  TCE("uqsub8",  6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16795  TCE("usub16",  6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16796  TCE("usax",    6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16797  /* Old name for USAX.  */
16798  TCE("usubaddx",        6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16799  TCE("usub8",   6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16800  TCE("sxtah",   6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
16801  TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
16802  TCE("sxtab",   6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
16803  TCE("sxtb16",  68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
16804  TCE("uxtah",   6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
16805  TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
16806  TCE("uxtab",   6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
16807  TCE("uxtb16",  6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
16808  TCE("sel",     6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
16809  TCE("smlad",   7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
16810  TCE("smladx",  7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
16811  TCE("smlald",  7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
16812  TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
16813  TCE("smlsd",   7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
16814  TCE("smlsdx",  7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
16815  TCE("smlsld",  7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
16816  TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
16817  TCE("smmla",   7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
16818  TCE("smmlar",  7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
16819  TCE("smmls",   75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
16820  TCE("smmlsr",  75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
16821  TCE("smmul",   750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
16822  TCE("smmulr",  750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
16823  TCE("smuad",   700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
16824  TCE("smuadx",  700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
16825  TCE("smusd",   700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
16826  TCE("smusdx",  700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
16827  TCE("ssat16",  6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
16828  TCE("umaal",   0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
16829  TCE("usad8",   780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
16830  TCE("usada8",  7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
16831  TCE("usat16",  6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
16832
16833 #undef  ARM_VARIANT
16834 #define ARM_VARIANT   & arm_ext_v6k
16835 #undef  THUMB_VARIANT
16836 #define THUMB_VARIANT & arm_ext_v6k
16837
16838  tCE("yield",   320f001, _yield,    0, (), noargs, t_hint),
16839  tCE("wfe",     320f002, _wfe,      0, (), noargs, t_hint),
16840  tCE("wfi",     320f003, _wfi,      0, (), noargs, t_hint),
16841  tCE("sev",     320f004, _sev,      0, (), noargs, t_hint),
16842
16843 #undef  THUMB_VARIANT
16844 #define THUMB_VARIANT  & arm_ext_v6_notm
16845  TCE("ldrexd",  1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
16846                                       ldrexd, t_ldrexd),
16847  TCE("strexd",  1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
16848                                        RRnpcb), strexd, t_strexd),
16849
16850 #undef  THUMB_VARIANT
16851 #define THUMB_VARIANT  & arm_ext_v6t2
16852  TCE("ldrexb",  1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
16853      rd_rn,  rd_rn),
16854  TCE("ldrexh",  1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
16855      rd_rn,  rd_rn),
16856  TCE("strexb",  1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
16857      strex, rm_rd_rn),
16858  TCE("strexh",  1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
16859      strex, rm_rd_rn), 
16860  TUF("clrex",   57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
16861
16862 #undef  ARM_VARIANT
16863 #define ARM_VARIANT  & arm_ext_v6z
16864
16865  TCE("smc",     1600070, f7f08000, 1, (EXPi), smc, t_smc),
16866
16867 #undef  ARM_VARIANT
16868 #define ARM_VARIANT  & arm_ext_v6t2
16869
16870  TCE("bfc",     7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
16871  TCE("bfi",     7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
16872  TCE("sbfx",    7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
16873  TCE("ubfx",    7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
16874
16875  TCE("mls",     0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
16876  TCE("movw",    3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
16877  TCE("movt",    3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
16878  TCE("rbit",    6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
16879
16880  TC3("ldrht",   03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
16881  TC3("ldrsht",  03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
16882  TC3("ldrsbt",  03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
16883  TC3("strht",   02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
16884
16885   UT("cbnz",      b900,    2, (RR, EXP), t_cbz),
16886   UT("cbz",       b100,    2, (RR, EXP), t_cbz),
16887
16888  /* ARM does not really have an IT instruction, so always allow it.
16889     The opcode is copied from Thumb in order to allow warnings in
16890     -mimplicit-it=[never | arm] modes.  */
16891 #undef  ARM_VARIANT
16892 #define ARM_VARIANT  & arm_ext_v1
16893
16894  TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
16895  TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
16896  TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
16897  TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
16898  TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
16899  TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
16900  TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
16901  TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
16902  TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
16903  TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
16904  TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
16905  TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
16906  TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
16907  TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
16908  TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
16909  /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
16910  TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
16911  TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
16912
16913  /* Thumb2 only instructions.  */
16914 #undef  ARM_VARIANT
16915 #define ARM_VARIANT  NULL
16916
16917  TCE("addw",    0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
16918  TCE("subw",    0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
16919  TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
16920  TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
16921  TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
16922  TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
16923
16924  /* Thumb-2 hardware division instructions (R and M profiles only).  */
16925 #undef  THUMB_VARIANT
16926 #define THUMB_VARIANT  & arm_ext_div
16927
16928  TCE("sdiv",    0, fb90f0f0, 3, (RR, oRR, RR), 0, t_div),
16929  TCE("udiv",    0, fbb0f0f0, 3, (RR, oRR, RR), 0, t_div),
16930
16931  /* ARM V6M/V7 instructions.  */
16932 #undef  ARM_VARIANT
16933 #define ARM_VARIANT    & arm_ext_barrier
16934 #undef  THUMB_VARIANT
16935 #define THUMB_VARIANT  & arm_ext_barrier
16936
16937  TUF("dmb",     57ff050, f3bf8f50, 1, (oBARRIER), barrier,  t_barrier),
16938  TUF("dsb",     57ff040, f3bf8f40, 1, (oBARRIER), barrier,  t_barrier),
16939  TUF("isb",     57ff060, f3bf8f60, 1, (oBARRIER), barrier,  t_barrier),
16940
16941  /* ARM V7 instructions.  */
16942 #undef  ARM_VARIANT
16943 #define ARM_VARIANT    & arm_ext_v7
16944 #undef  THUMB_VARIANT
16945 #define THUMB_VARIANT  & arm_ext_v7
16946
16947  TUF("pli",     450f000, f910f000, 1, (ADDR),     pli,      t_pld),
16948  TCE("dbg",     320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
16949
16950 #undef  ARM_VARIANT
16951 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
16952
16953  cCE("wfs",     e200110, 1, (RR),            rd),
16954  cCE("rfs",     e300110, 1, (RR),            rd),
16955  cCE("wfc",     e400110, 1, (RR),            rd),
16956  cCE("rfc",     e500110, 1, (RR),            rd),
16957
16958  cCL("ldfs",    c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
16959  cCL("ldfd",    c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
16960  cCL("ldfe",    c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
16961  cCL("ldfp",    c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
16962
16963  cCL("stfs",    c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
16964  cCL("stfd",    c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
16965  cCL("stfe",    c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
16966  cCL("stfp",    c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
16967
16968  cCL("mvfs",    e008100, 2, (RF, RF_IF),     rd_rm),
16969  cCL("mvfsp",   e008120, 2, (RF, RF_IF),     rd_rm),
16970  cCL("mvfsm",   e008140, 2, (RF, RF_IF),     rd_rm),
16971  cCL("mvfsz",   e008160, 2, (RF, RF_IF),     rd_rm),
16972  cCL("mvfd",    e008180, 2, (RF, RF_IF),     rd_rm),
16973  cCL("mvfdp",   e0081a0, 2, (RF, RF_IF),     rd_rm),
16974  cCL("mvfdm",   e0081c0, 2, (RF, RF_IF),     rd_rm),
16975  cCL("mvfdz",   e0081e0, 2, (RF, RF_IF),     rd_rm),
16976  cCL("mvfe",    e088100, 2, (RF, RF_IF),     rd_rm),
16977  cCL("mvfep",   e088120, 2, (RF, RF_IF),     rd_rm),
16978  cCL("mvfem",   e088140, 2, (RF, RF_IF),     rd_rm),
16979  cCL("mvfez",   e088160, 2, (RF, RF_IF),     rd_rm),
16980
16981  cCL("mnfs",    e108100, 2, (RF, RF_IF),     rd_rm),
16982  cCL("mnfsp",   e108120, 2, (RF, RF_IF),     rd_rm),
16983  cCL("mnfsm",   e108140, 2, (RF, RF_IF),     rd_rm),
16984  cCL("mnfsz",   e108160, 2, (RF, RF_IF),     rd_rm),
16985  cCL("mnfd",    e108180, 2, (RF, RF_IF),     rd_rm),
16986  cCL("mnfdp",   e1081a0, 2, (RF, RF_IF),     rd_rm),
16987  cCL("mnfdm",   e1081c0, 2, (RF, RF_IF),     rd_rm),
16988  cCL("mnfdz",   e1081e0, 2, (RF, RF_IF),     rd_rm),
16989  cCL("mnfe",    e188100, 2, (RF, RF_IF),     rd_rm),
16990  cCL("mnfep",   e188120, 2, (RF, RF_IF),     rd_rm),
16991  cCL("mnfem",   e188140, 2, (RF, RF_IF),     rd_rm),
16992  cCL("mnfez",   e188160, 2, (RF, RF_IF),     rd_rm),
16993
16994  cCL("abss",    e208100, 2, (RF, RF_IF),     rd_rm),
16995  cCL("abssp",   e208120, 2, (RF, RF_IF),     rd_rm),
16996  cCL("abssm",   e208140, 2, (RF, RF_IF),     rd_rm),
16997  cCL("abssz",   e208160, 2, (RF, RF_IF),     rd_rm),
16998  cCL("absd",    e208180, 2, (RF, RF_IF),     rd_rm),
16999  cCL("absdp",   e2081a0, 2, (RF, RF_IF),     rd_rm),
17000  cCL("absdm",   e2081c0, 2, (RF, RF_IF),     rd_rm),
17001  cCL("absdz",   e2081e0, 2, (RF, RF_IF),     rd_rm),
17002  cCL("abse",    e288100, 2, (RF, RF_IF),     rd_rm),
17003  cCL("absep",   e288120, 2, (RF, RF_IF),     rd_rm),
17004  cCL("absem",   e288140, 2, (RF, RF_IF),     rd_rm),
17005  cCL("absez",   e288160, 2, (RF, RF_IF),     rd_rm),
17006
17007  cCL("rnds",    e308100, 2, (RF, RF_IF),     rd_rm),
17008  cCL("rndsp",   e308120, 2, (RF, RF_IF),     rd_rm),
17009  cCL("rndsm",   e308140, 2, (RF, RF_IF),     rd_rm),
17010  cCL("rndsz",   e308160, 2, (RF, RF_IF),     rd_rm),
17011  cCL("rndd",    e308180, 2, (RF, RF_IF),     rd_rm),
17012  cCL("rnddp",   e3081a0, 2, (RF, RF_IF),     rd_rm),
17013  cCL("rnddm",   e3081c0, 2, (RF, RF_IF),     rd_rm),
17014  cCL("rnddz",   e3081e0, 2, (RF, RF_IF),     rd_rm),
17015  cCL("rnde",    e388100, 2, (RF, RF_IF),     rd_rm),
17016  cCL("rndep",   e388120, 2, (RF, RF_IF),     rd_rm),
17017  cCL("rndem",   e388140, 2, (RF, RF_IF),     rd_rm),
17018  cCL("rndez",   e388160, 2, (RF, RF_IF),     rd_rm),
17019
17020  cCL("sqts",    e408100, 2, (RF, RF_IF),     rd_rm),
17021  cCL("sqtsp",   e408120, 2, (RF, RF_IF),     rd_rm),
17022  cCL("sqtsm",   e408140, 2, (RF, RF_IF),     rd_rm),
17023  cCL("sqtsz",   e408160, 2, (RF, RF_IF),     rd_rm),
17024  cCL("sqtd",    e408180, 2, (RF, RF_IF),     rd_rm),
17025  cCL("sqtdp",   e4081a0, 2, (RF, RF_IF),     rd_rm),
17026  cCL("sqtdm",   e4081c0, 2, (RF, RF_IF),     rd_rm),
17027  cCL("sqtdz",   e4081e0, 2, (RF, RF_IF),     rd_rm),
17028  cCL("sqte",    e488100, 2, (RF, RF_IF),     rd_rm),
17029  cCL("sqtep",   e488120, 2, (RF, RF_IF),     rd_rm),
17030  cCL("sqtem",   e488140, 2, (RF, RF_IF),     rd_rm),
17031  cCL("sqtez",   e488160, 2, (RF, RF_IF),     rd_rm),
17032
17033  cCL("logs",    e508100, 2, (RF, RF_IF),     rd_rm),
17034  cCL("logsp",   e508120, 2, (RF, RF_IF),     rd_rm),
17035  cCL("logsm",   e508140, 2, (RF, RF_IF),     rd_rm),
17036  cCL("logsz",   e508160, 2, (RF, RF_IF),     rd_rm),
17037  cCL("logd",    e508180, 2, (RF, RF_IF),     rd_rm),
17038  cCL("logdp",   e5081a0, 2, (RF, RF_IF),     rd_rm),
17039  cCL("logdm",   e5081c0, 2, (RF, RF_IF),     rd_rm),
17040  cCL("logdz",   e5081e0, 2, (RF, RF_IF),     rd_rm),
17041  cCL("loge",    e588100, 2, (RF, RF_IF),     rd_rm),
17042  cCL("logep",   e588120, 2, (RF, RF_IF),     rd_rm),
17043  cCL("logem",   e588140, 2, (RF, RF_IF),     rd_rm),
17044  cCL("logez",   e588160, 2, (RF, RF_IF),     rd_rm),
17045
17046  cCL("lgns",    e608100, 2, (RF, RF_IF),     rd_rm),
17047  cCL("lgnsp",   e608120, 2, (RF, RF_IF),     rd_rm),
17048  cCL("lgnsm",   e608140, 2, (RF, RF_IF),     rd_rm),
17049  cCL("lgnsz",   e608160, 2, (RF, RF_IF),     rd_rm),
17050  cCL("lgnd",    e608180, 2, (RF, RF_IF),     rd_rm),
17051  cCL("lgndp",   e6081a0, 2, (RF, RF_IF),     rd_rm),
17052  cCL("lgndm",   e6081c0, 2, (RF, RF_IF),     rd_rm),
17053  cCL("lgndz",   e6081e0, 2, (RF, RF_IF),     rd_rm),
17054  cCL("lgne",    e688100, 2, (RF, RF_IF),     rd_rm),
17055  cCL("lgnep",   e688120, 2, (RF, RF_IF),     rd_rm),
17056  cCL("lgnem",   e688140, 2, (RF, RF_IF),     rd_rm),
17057  cCL("lgnez",   e688160, 2, (RF, RF_IF),     rd_rm),
17058
17059  cCL("exps",    e708100, 2, (RF, RF_IF),     rd_rm),
17060  cCL("expsp",   e708120, 2, (RF, RF_IF),     rd_rm),
17061  cCL("expsm",   e708140, 2, (RF, RF_IF),     rd_rm),
17062  cCL("expsz",   e708160, 2, (RF, RF_IF),     rd_rm),
17063  cCL("expd",    e708180, 2, (RF, RF_IF),     rd_rm),
17064  cCL("expdp",   e7081a0, 2, (RF, RF_IF),     rd_rm),
17065  cCL("expdm",   e7081c0, 2, (RF, RF_IF),     rd_rm),
17066  cCL("expdz",   e7081e0, 2, (RF, RF_IF),     rd_rm),
17067  cCL("expe",    e788100, 2, (RF, RF_IF),     rd_rm),
17068  cCL("expep",   e788120, 2, (RF, RF_IF),     rd_rm),
17069  cCL("expem",   e788140, 2, (RF, RF_IF),     rd_rm),
17070  cCL("expdz",   e788160, 2, (RF, RF_IF),     rd_rm),
17071
17072  cCL("sins",    e808100, 2, (RF, RF_IF),     rd_rm),
17073  cCL("sinsp",   e808120, 2, (RF, RF_IF),     rd_rm),
17074  cCL("sinsm",   e808140, 2, (RF, RF_IF),     rd_rm),
17075  cCL("sinsz",   e808160, 2, (RF, RF_IF),     rd_rm),
17076  cCL("sind",    e808180, 2, (RF, RF_IF),     rd_rm),
17077  cCL("sindp",   e8081a0, 2, (RF, RF_IF),     rd_rm),
17078  cCL("sindm",   e8081c0, 2, (RF, RF_IF),     rd_rm),
17079  cCL("sindz",   e8081e0, 2, (RF, RF_IF),     rd_rm),
17080  cCL("sine",    e888100, 2, (RF, RF_IF),     rd_rm),
17081  cCL("sinep",   e888120, 2, (RF, RF_IF),     rd_rm),
17082  cCL("sinem",   e888140, 2, (RF, RF_IF),     rd_rm),
17083  cCL("sinez",   e888160, 2, (RF, RF_IF),     rd_rm),
17084
17085  cCL("coss",    e908100, 2, (RF, RF_IF),     rd_rm),
17086  cCL("cossp",   e908120, 2, (RF, RF_IF),     rd_rm),
17087  cCL("cossm",   e908140, 2, (RF, RF_IF),     rd_rm),
17088  cCL("cossz",   e908160, 2, (RF, RF_IF),     rd_rm),
17089  cCL("cosd",    e908180, 2, (RF, RF_IF),     rd_rm),
17090  cCL("cosdp",   e9081a0, 2, (RF, RF_IF),     rd_rm),
17091  cCL("cosdm",   e9081c0, 2, (RF, RF_IF),     rd_rm),
17092  cCL("cosdz",   e9081e0, 2, (RF, RF_IF),     rd_rm),
17093  cCL("cose",    e988100, 2, (RF, RF_IF),     rd_rm),
17094  cCL("cosep",   e988120, 2, (RF, RF_IF),     rd_rm),
17095  cCL("cosem",   e988140, 2, (RF, RF_IF),     rd_rm),
17096  cCL("cosez",   e988160, 2, (RF, RF_IF),     rd_rm),
17097
17098  cCL("tans",    ea08100, 2, (RF, RF_IF),     rd_rm),
17099  cCL("tansp",   ea08120, 2, (RF, RF_IF),     rd_rm),
17100  cCL("tansm",   ea08140, 2, (RF, RF_IF),     rd_rm),
17101  cCL("tansz",   ea08160, 2, (RF, RF_IF),     rd_rm),
17102  cCL("tand",    ea08180, 2, (RF, RF_IF),     rd_rm),
17103  cCL("tandp",   ea081a0, 2, (RF, RF_IF),     rd_rm),
17104  cCL("tandm",   ea081c0, 2, (RF, RF_IF),     rd_rm),
17105  cCL("tandz",   ea081e0, 2, (RF, RF_IF),     rd_rm),
17106  cCL("tane",    ea88100, 2, (RF, RF_IF),     rd_rm),
17107  cCL("tanep",   ea88120, 2, (RF, RF_IF),     rd_rm),
17108  cCL("tanem",   ea88140, 2, (RF, RF_IF),     rd_rm),
17109  cCL("tanez",   ea88160, 2, (RF, RF_IF),     rd_rm),
17110
17111  cCL("asns",    eb08100, 2, (RF, RF_IF),     rd_rm),
17112  cCL("asnsp",   eb08120, 2, (RF, RF_IF),     rd_rm),
17113  cCL("asnsm",   eb08140, 2, (RF, RF_IF),     rd_rm),
17114  cCL("asnsz",   eb08160, 2, (RF, RF_IF),     rd_rm),
17115  cCL("asnd",    eb08180, 2, (RF, RF_IF),     rd_rm),
17116  cCL("asndp",   eb081a0, 2, (RF, RF_IF),     rd_rm),
17117  cCL("asndm",   eb081c0, 2, (RF, RF_IF),     rd_rm),
17118  cCL("asndz",   eb081e0, 2, (RF, RF_IF),     rd_rm),
17119  cCL("asne",    eb88100, 2, (RF, RF_IF),     rd_rm),
17120  cCL("asnep",   eb88120, 2, (RF, RF_IF),     rd_rm),
17121  cCL("asnem",   eb88140, 2, (RF, RF_IF),     rd_rm),
17122  cCL("asnez",   eb88160, 2, (RF, RF_IF),     rd_rm),
17123
17124  cCL("acss",    ec08100, 2, (RF, RF_IF),     rd_rm),
17125  cCL("acssp",   ec08120, 2, (RF, RF_IF),     rd_rm),
17126  cCL("acssm",   ec08140, 2, (RF, RF_IF),     rd_rm),
17127  cCL("acssz",   ec08160, 2, (RF, RF_IF),     rd_rm),
17128  cCL("acsd",    ec08180, 2, (RF, RF_IF),     rd_rm),
17129  cCL("acsdp",   ec081a0, 2, (RF, RF_IF),     rd_rm),
17130  cCL("acsdm",   ec081c0, 2, (RF, RF_IF),     rd_rm),
17131  cCL("acsdz",   ec081e0, 2, (RF, RF_IF),     rd_rm),
17132  cCL("acse",    ec88100, 2, (RF, RF_IF),     rd_rm),
17133  cCL("acsep",   ec88120, 2, (RF, RF_IF),     rd_rm),
17134  cCL("acsem",   ec88140, 2, (RF, RF_IF),     rd_rm),
17135  cCL("acsez",   ec88160, 2, (RF, RF_IF),     rd_rm),
17136
17137  cCL("atns",    ed08100, 2, (RF, RF_IF),     rd_rm),
17138  cCL("atnsp",   ed08120, 2, (RF, RF_IF),     rd_rm),
17139  cCL("atnsm",   ed08140, 2, (RF, RF_IF),     rd_rm),
17140  cCL("atnsz",   ed08160, 2, (RF, RF_IF),     rd_rm),
17141  cCL("atnd",    ed08180, 2, (RF, RF_IF),     rd_rm),
17142  cCL("atndp",   ed081a0, 2, (RF, RF_IF),     rd_rm),
17143  cCL("atndm",   ed081c0, 2, (RF, RF_IF),     rd_rm),
17144  cCL("atndz",   ed081e0, 2, (RF, RF_IF),     rd_rm),
17145  cCL("atne",    ed88100, 2, (RF, RF_IF),     rd_rm),
17146  cCL("atnep",   ed88120, 2, (RF, RF_IF),     rd_rm),
17147  cCL("atnem",   ed88140, 2, (RF, RF_IF),     rd_rm),
17148  cCL("atnez",   ed88160, 2, (RF, RF_IF),     rd_rm),
17149
17150  cCL("urds",    ee08100, 2, (RF, RF_IF),     rd_rm),
17151  cCL("urdsp",   ee08120, 2, (RF, RF_IF),     rd_rm),
17152  cCL("urdsm",   ee08140, 2, (RF, RF_IF),     rd_rm),
17153  cCL("urdsz",   ee08160, 2, (RF, RF_IF),     rd_rm),
17154  cCL("urdd",    ee08180, 2, (RF, RF_IF),     rd_rm),
17155  cCL("urddp",   ee081a0, 2, (RF, RF_IF),     rd_rm),
17156  cCL("urddm",   ee081c0, 2, (RF, RF_IF),     rd_rm),
17157  cCL("urddz",   ee081e0, 2, (RF, RF_IF),     rd_rm),
17158  cCL("urde",    ee88100, 2, (RF, RF_IF),     rd_rm),
17159  cCL("urdep",   ee88120, 2, (RF, RF_IF),     rd_rm),
17160  cCL("urdem",   ee88140, 2, (RF, RF_IF),     rd_rm),
17161  cCL("urdez",   ee88160, 2, (RF, RF_IF),     rd_rm),
17162
17163  cCL("nrms",    ef08100, 2, (RF, RF_IF),     rd_rm),
17164  cCL("nrmsp",   ef08120, 2, (RF, RF_IF),     rd_rm),
17165  cCL("nrmsm",   ef08140, 2, (RF, RF_IF),     rd_rm),
17166  cCL("nrmsz",   ef08160, 2, (RF, RF_IF),     rd_rm),
17167  cCL("nrmd",    ef08180, 2, (RF, RF_IF),     rd_rm),
17168  cCL("nrmdp",   ef081a0, 2, (RF, RF_IF),     rd_rm),
17169  cCL("nrmdm",   ef081c0, 2, (RF, RF_IF),     rd_rm),
17170  cCL("nrmdz",   ef081e0, 2, (RF, RF_IF),     rd_rm),
17171  cCL("nrme",    ef88100, 2, (RF, RF_IF),     rd_rm),
17172  cCL("nrmep",   ef88120, 2, (RF, RF_IF),     rd_rm),
17173  cCL("nrmem",   ef88140, 2, (RF, RF_IF),     rd_rm),
17174  cCL("nrmez",   ef88160, 2, (RF, RF_IF),     rd_rm),
17175
17176  cCL("adfs",    e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
17177  cCL("adfsp",   e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
17178  cCL("adfsm",   e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
17179  cCL("adfsz",   e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
17180  cCL("adfd",    e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
17181  cCL("adfdp",   e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17182  cCL("adfdm",   e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17183  cCL("adfdz",   e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17184  cCL("adfe",    e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
17185  cCL("adfep",   e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
17186  cCL("adfem",   e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
17187  cCL("adfez",   e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
17188
17189  cCL("sufs",    e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
17190  cCL("sufsp",   e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
17191  cCL("sufsm",   e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
17192  cCL("sufsz",   e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
17193  cCL("sufd",    e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
17194  cCL("sufdp",   e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17195  cCL("sufdm",   e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17196  cCL("sufdz",   e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17197  cCL("sufe",    e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
17198  cCL("sufep",   e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
17199  cCL("sufem",   e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
17200  cCL("sufez",   e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
17201
17202  cCL("rsfs",    e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
17203  cCL("rsfsp",   e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
17204  cCL("rsfsm",   e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
17205  cCL("rsfsz",   e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
17206  cCL("rsfd",    e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
17207  cCL("rsfdp",   e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17208  cCL("rsfdm",   e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17209  cCL("rsfdz",   e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17210  cCL("rsfe",    e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
17211  cCL("rsfep",   e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
17212  cCL("rsfem",   e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
17213  cCL("rsfez",   e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
17214
17215  cCL("mufs",    e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
17216  cCL("mufsp",   e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
17217  cCL("mufsm",   e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
17218  cCL("mufsz",   e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
17219  cCL("mufd",    e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
17220  cCL("mufdp",   e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17221  cCL("mufdm",   e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17222  cCL("mufdz",   e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17223  cCL("mufe",    e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
17224  cCL("mufep",   e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
17225  cCL("mufem",   e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
17226  cCL("mufez",   e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
17227
17228  cCL("dvfs",    e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
17229  cCL("dvfsp",   e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
17230  cCL("dvfsm",   e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
17231  cCL("dvfsz",   e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
17232  cCL("dvfd",    e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
17233  cCL("dvfdp",   e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17234  cCL("dvfdm",   e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17235  cCL("dvfdz",   e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17236  cCL("dvfe",    e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
17237  cCL("dvfep",   e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
17238  cCL("dvfem",   e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
17239  cCL("dvfez",   e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
17240
17241  cCL("rdfs",    e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
17242  cCL("rdfsp",   e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
17243  cCL("rdfsm",   e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
17244  cCL("rdfsz",   e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
17245  cCL("rdfd",    e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
17246  cCL("rdfdp",   e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17247  cCL("rdfdm",   e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17248  cCL("rdfdz",   e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17249  cCL("rdfe",    e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
17250  cCL("rdfep",   e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
17251  cCL("rdfem",   e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
17252  cCL("rdfez",   e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
17253
17254  cCL("pows",    e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
17255  cCL("powsp",   e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
17256  cCL("powsm",   e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
17257  cCL("powsz",   e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
17258  cCL("powd",    e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
17259  cCL("powdp",   e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17260  cCL("powdm",   e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17261  cCL("powdz",   e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17262  cCL("powe",    e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
17263  cCL("powep",   e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
17264  cCL("powem",   e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
17265  cCL("powez",   e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
17266
17267  cCL("rpws",    e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
17268  cCL("rpwsp",   e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
17269  cCL("rpwsm",   e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
17270  cCL("rpwsz",   e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
17271  cCL("rpwd",    e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
17272  cCL("rpwdp",   e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17273  cCL("rpwdm",   e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17274  cCL("rpwdz",   e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17275  cCL("rpwe",    e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
17276  cCL("rpwep",   e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
17277  cCL("rpwem",   e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
17278  cCL("rpwez",   e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
17279
17280  cCL("rmfs",    e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
17281  cCL("rmfsp",   e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
17282  cCL("rmfsm",   e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
17283  cCL("rmfsz",   e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
17284  cCL("rmfd",    e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
17285  cCL("rmfdp",   e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17286  cCL("rmfdm",   e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17287  cCL("rmfdz",   e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17288  cCL("rmfe",    e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
17289  cCL("rmfep",   e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
17290  cCL("rmfem",   e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
17291  cCL("rmfez",   e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
17292
17293  cCL("fmls",    e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
17294  cCL("fmlsp",   e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
17295  cCL("fmlsm",   e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
17296  cCL("fmlsz",   e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
17297  cCL("fmld",    e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
17298  cCL("fmldp",   e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17299  cCL("fmldm",   e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17300  cCL("fmldz",   e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17301  cCL("fmle",    e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
17302  cCL("fmlep",   e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
17303  cCL("fmlem",   e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
17304  cCL("fmlez",   e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
17305
17306  cCL("fdvs",    ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17307  cCL("fdvsp",   ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17308  cCL("fdvsm",   ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17309  cCL("fdvsz",   ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17310  cCL("fdvd",    ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17311  cCL("fdvdp",   ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17312  cCL("fdvdm",   ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17313  cCL("fdvdz",   ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17314  cCL("fdve",    ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17315  cCL("fdvep",   ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17316  cCL("fdvem",   ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17317  cCL("fdvez",   ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17318
17319  cCL("frds",    eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17320  cCL("frdsp",   eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17321  cCL("frdsm",   eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17322  cCL("frdsz",   eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17323  cCL("frdd",    eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17324  cCL("frddp",   eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17325  cCL("frddm",   eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17326  cCL("frddz",   eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17327  cCL("frde",    eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17328  cCL("frdep",   eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17329  cCL("frdem",   eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17330  cCL("frdez",   eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17331
17332  cCL("pols",    ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17333  cCL("polsp",   ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17334  cCL("polsm",   ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17335  cCL("polsz",   ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17336  cCL("pold",    ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17337  cCL("poldp",   ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17338  cCL("poldm",   ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17339  cCL("poldz",   ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17340  cCL("pole",    ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17341  cCL("polep",   ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17342  cCL("polem",   ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17343  cCL("polez",   ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17344
17345  cCE("cmf",     e90f110, 2, (RF, RF_IF),     fpa_cmp),
17346  C3E("cmfe",    ed0f110, 2, (RF, RF_IF),     fpa_cmp),
17347  cCE("cnf",     eb0f110, 2, (RF, RF_IF),     fpa_cmp),
17348  C3E("cnfe",    ef0f110, 2, (RF, RF_IF),     fpa_cmp),
17349
17350  cCL("flts",    e000110, 2, (RF, RR),        rn_rd),
17351  cCL("fltsp",   e000130, 2, (RF, RR),        rn_rd),
17352  cCL("fltsm",   e000150, 2, (RF, RR),        rn_rd),
17353  cCL("fltsz",   e000170, 2, (RF, RR),        rn_rd),
17354  cCL("fltd",    e000190, 2, (RF, RR),        rn_rd),
17355  cCL("fltdp",   e0001b0, 2, (RF, RR),        rn_rd),
17356  cCL("fltdm",   e0001d0, 2, (RF, RR),        rn_rd),
17357  cCL("fltdz",   e0001f0, 2, (RF, RR),        rn_rd),
17358  cCL("flte",    e080110, 2, (RF, RR),        rn_rd),
17359  cCL("fltep",   e080130, 2, (RF, RR),        rn_rd),
17360  cCL("fltem",   e080150, 2, (RF, RR),        rn_rd),
17361  cCL("fltez",   e080170, 2, (RF, RR),        rn_rd),
17362
17363   /* The implementation of the FIX instruction is broken on some
17364      assemblers, in that it accepts a precision specifier as well as a
17365      rounding specifier, despite the fact that this is meaningless.
17366      To be more compatible, we accept it as well, though of course it
17367      does not set any bits.  */
17368  cCE("fix",     e100110, 2, (RR, RF),        rd_rm),
17369  cCL("fixp",    e100130, 2, (RR, RF),        rd_rm),
17370  cCL("fixm",    e100150, 2, (RR, RF),        rd_rm),
17371  cCL("fixz",    e100170, 2, (RR, RF),        rd_rm),
17372  cCL("fixsp",   e100130, 2, (RR, RF),        rd_rm),
17373  cCL("fixsm",   e100150, 2, (RR, RF),        rd_rm),
17374  cCL("fixsz",   e100170, 2, (RR, RF),        rd_rm),
17375  cCL("fixdp",   e100130, 2, (RR, RF),        rd_rm),
17376  cCL("fixdm",   e100150, 2, (RR, RF),        rd_rm),
17377  cCL("fixdz",   e100170, 2, (RR, RF),        rd_rm),
17378  cCL("fixep",   e100130, 2, (RR, RF),        rd_rm),
17379  cCL("fixem",   e100150, 2, (RR, RF),        rd_rm),
17380  cCL("fixez",   e100170, 2, (RR, RF),        rd_rm),
17381
17382   /* Instructions that were new with the real FPA, call them V2.  */
17383 #undef  ARM_VARIANT
17384 #define ARM_VARIANT  & fpu_fpa_ext_v2
17385
17386  cCE("lfm",     c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17387  cCL("lfmfd",   c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17388  cCL("lfmea",   d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17389  cCE("sfm",     c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17390  cCL("sfmfd",   d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17391  cCL("sfmea",   c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17392
17393 #undef  ARM_VARIANT
17394 #define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
17395
17396   /* Moves and type conversions.  */
17397  cCE("fcpys",   eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
17398  cCE("fmrs",    e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
17399  cCE("fmsr",    e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
17400  cCE("fmstat",  ef1fa10, 0, (),               noargs),
17401  cCE("vmrs",    ef10a10, 2, (APSR_RR, RVC),   vmrs),
17402  cCE("vmsr",    ee10a10, 2, (RVC, RR),        vmsr),
17403  cCE("fsitos",  eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17404  cCE("fuitos",  eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
17405  cCE("ftosis",  ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
17406  cCE("ftosizs", ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17407  cCE("ftouis",  ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
17408  cCE("ftouizs", ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17409  cCE("fmrx",    ef00a10, 2, (RR, RVC),        rd_rn),
17410  cCE("fmxr",    ee00a10, 2, (RVC, RR),        rn_rd),
17411
17412   /* Memory operations.  */
17413  cCE("flds",    d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
17414  cCE("fsts",    d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
17415  cCE("fldmias", c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
17416  cCE("fldmfds", c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
17417  cCE("fldmdbs", d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
17418  cCE("fldmeas", d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
17419  cCE("fldmiax", c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
17420  cCE("fldmfdx", c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
17421  cCE("fldmdbx", d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
17422  cCE("fldmeax", d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
17423  cCE("fstmias", c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
17424  cCE("fstmeas", c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
17425  cCE("fstmdbs", d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
17426  cCE("fstmfds", d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
17427  cCE("fstmiax", c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
17428  cCE("fstmeax", c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
17429  cCE("fstmdbx", d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
17430  cCE("fstmfdx", d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
17431
17432   /* Monadic operations.  */
17433  cCE("fabss",   eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17434  cCE("fnegs",   eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
17435  cCE("fsqrts",  eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17436
17437   /* Dyadic operations.  */
17438  cCE("fadds",   e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17439  cCE("fsubs",   e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17440  cCE("fmuls",   e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17441  cCE("fdivs",   e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17442  cCE("fmacs",   e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17443  cCE("fmscs",   e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17444  cCE("fnmuls",  e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17445  cCE("fnmacs",  e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17446  cCE("fnmscs",  e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17447
17448   /* Comparisons.  */
17449  cCE("fcmps",   eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
17450  cCE("fcmpzs",  eb50a40, 1, (RVS),            vfp_sp_compare_z),
17451  cCE("fcmpes",  eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17452  cCE("fcmpezs", eb50ac0, 1, (RVS),            vfp_sp_compare_z),
17453
17454  /* Double precision load/store are still present on single precision
17455     implementations.  */
17456  cCE("fldd",    d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
17457  cCE("fstd",    d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
17458  cCE("fldmiad", c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
17459  cCE("fldmfdd", c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
17460  cCE("fldmdbd", d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
17461  cCE("fldmead", d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
17462  cCE("fstmiad", c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
17463  cCE("fstmead", c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
17464  cCE("fstmdbd", d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
17465  cCE("fstmfdd", d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
17466
17467 #undef  ARM_VARIANT
17468 #define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
17469
17470   /* Moves and type conversions.  */
17471  cCE("fcpyd",   eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
17472  cCE("fcvtds",  eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
17473  cCE("fcvtsd",  eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17474  cCE("fmdhr",   e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
17475  cCE("fmdlr",   e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
17476  cCE("fmrdh",   e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
17477  cCE("fmrdl",   e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
17478  cCE("fsitod",  eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
17479  cCE("fuitod",  eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
17480  cCE("ftosid",  ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17481  cCE("ftosizd", ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17482  cCE("ftouid",  ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17483  cCE("ftouizd", ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17484
17485   /* Monadic operations.  */
17486  cCE("fabsd",   eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
17487  cCE("fnegd",   eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
17488  cCE("fsqrtd",  eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
17489
17490   /* Dyadic operations.  */
17491  cCE("faddd",   e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17492  cCE("fsubd",   e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17493  cCE("fmuld",   e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17494  cCE("fdivd",   e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17495  cCE("fmacd",   e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17496  cCE("fmscd",   e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17497  cCE("fnmuld",  e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17498  cCE("fnmacd",  e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17499  cCE("fnmscd",  e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17500
17501   /* Comparisons.  */
17502  cCE("fcmpd",   eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
17503  cCE("fcmpzd",  eb50b40, 1, (RVD),            vfp_dp_rd),
17504  cCE("fcmped",  eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
17505  cCE("fcmpezd", eb50bc0, 1, (RVD),            vfp_dp_rd),
17506
17507 #undef  ARM_VARIANT
17508 #define ARM_VARIANT  & fpu_vfp_ext_v2
17509
17510  cCE("fmsrr",   c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
17511  cCE("fmrrs",   c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
17512  cCE("fmdrr",   c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
17513  cCE("fmrrd",   c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
17514
17515 /* Instructions which may belong to either the Neon or VFP instruction sets.
17516    Individual encoder functions perform additional architecture checks.  */
17517 #undef  ARM_VARIANT
17518 #define ARM_VARIANT    & fpu_vfp_ext_v1xd
17519 #undef  THUMB_VARIANT
17520 #define THUMB_VARIANT  & fpu_vfp_ext_v1xd
17521
17522   /* These mnemonics are unique to VFP.  */
17523  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
17524  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
17525  nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
17526  nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
17527  nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
17528  nCE(vcmp,      _vcmp,    2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
17529  nCE(vcmpe,     _vcmpe,   2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
17530  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
17531  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
17532  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
17533
17534   /* Mnemonics shared by Neon and VFP.  */
17535  nCEF(vmul,     _vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
17536  nCEF(vmla,     _vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
17537  nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
17538
17539  nCEF(vadd,     _vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
17540  nCEF(vsub,     _vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
17541
17542  NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
17543  NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
17544
17545  NCE(vldm,      c900b00, 2, (RRw, VRSDLST), neon_ldm_stm),
17546  NCE(vldmia,    c900b00, 2, (RRw, VRSDLST), neon_ldm_stm),
17547  NCE(vldmdb,    d100b00, 2, (RRw, VRSDLST), neon_ldm_stm),
17548  NCE(vstm,      c800b00, 2, (RRw, VRSDLST), neon_ldm_stm),
17549  NCE(vstmia,    c800b00, 2, (RRw, VRSDLST), neon_ldm_stm),
17550  NCE(vstmdb,    d000b00, 2, (RRw, VRSDLST), neon_ldm_stm),
17551  NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
17552  NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
17553
17554  nCEF(vcvt,     _vcvt,   3, (RNSDQ, RNSDQ, oI32b), neon_cvt),
17555  nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
17556  nCEF(vcvtb,    _vcvt,   2, (RVS, RVS), neon_cvtb),
17557  nCEF(vcvtt,    _vcvt,   2, (RVS, RVS), neon_cvtt),
17558
17559
17560   /* NOTE: All VMOV encoding is special-cased!  */
17561  NCE(vmov,      0,       1, (VMOV), neon_mov),
17562  NCE(vmovq,     0,       1, (VMOV), neon_mov),
17563
17564 #undef  THUMB_VARIANT
17565 #define THUMB_VARIANT  & fpu_neon_ext_v1
17566 #undef  ARM_VARIANT
17567 #define ARM_VARIANT    & fpu_neon_ext_v1
17568
17569   /* Data processing with three registers of the same length.  */
17570   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
17571  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
17572  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
17573  NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
17574  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
17575  NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
17576  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
17577  NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
17578  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
17579   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
17580  NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
17581  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
17582  NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
17583  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
17584  NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
17585  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
17586  NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
17587  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
17588   /* If not immediate, fall back to neon_dyadic_i64_su.
17589      shl_imm should accept I8 I16 I32 I64,
17590      qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
17591  nUF(vshl,      _vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
17592  nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
17593  nUF(vqshl,     _vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
17594  nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
17595   /* Logic ops, types optional & ignored.  */
17596  nUF(vand,      _vand,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
17597  nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
17598  nUF(vbic,      _vbic,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
17599  nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
17600  nUF(vorr,      _vorr,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
17601  nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
17602  nUF(vorn,      _vorn,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
17603  nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
17604  nUF(veor,      _veor,    3, (RNDQ, oRNDQ, RNDQ),      neon_logic),
17605  nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
17606   /* Bitfield ops, untyped.  */
17607  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
17608  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
17609  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
17610  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
17611  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
17612  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
17613   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32.  */
17614  nUF(vabd,      _vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
17615  nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
17616  nUF(vmax,      _vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
17617  nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
17618  nUF(vmin,      _vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
17619  nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
17620   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
17621      back to neon_dyadic_if_su.  */
17622  nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
17623  nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
17624  nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
17625  nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
17626  nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
17627  nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
17628  nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
17629  nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
17630   /* Comparison. Type I8 I16 I32 F32.  */
17631  nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
17632  nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
17633   /* As above, D registers only.  */
17634  nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
17635  nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
17636   /* Int and float variants, signedness unimportant.  */
17637  nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
17638  nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
17639  nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
17640   /* Add/sub take types I8 I16 I32 I64 F32.  */
17641  nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
17642  nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
17643   /* vtst takes sizes 8, 16, 32.  */
17644  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
17645  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
17646   /* VMUL takes I8 I16 I32 F32 P8.  */
17647  nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
17648   /* VQD{R}MULH takes S16 S32.  */
17649  nUF(vqdmulh,   _vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
17650  nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
17651  nUF(vqrdmulh,  _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
17652  nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
17653  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
17654  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
17655  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
17656  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
17657  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
17658  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
17659  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
17660  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
17661  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
17662  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
17663  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
17664  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
17665
17666   /* Two address, int/float. Types S8 S16 S32 F32.  */
17667  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
17668  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
17669
17670   /* Data processing with two registers and a shift amount.  */
17671   /* Right shifts, and variants with rounding.
17672      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
17673  NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
17674  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
17675  NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
17676  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
17677  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
17678  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
17679  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
17680  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
17681   /* Shift and insert. Sizes accepted 8 16 32 64.  */
17682  NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
17683  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
17684  NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
17685  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
17686   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
17687  NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
17688  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
17689   /* Right shift immediate, saturating & narrowing, with rounding variants.
17690      Types accepted S16 S32 S64 U16 U32 U64.  */
17691  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
17692  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
17693   /* As above, unsigned. Types accepted S16 S32 S64.  */
17694  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
17695  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
17696   /* Right shift narrowing. Types accepted I16 I32 I64.  */
17697  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
17698  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
17699   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
17700  nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
17701   /* CVT with optional immediate for fixed-point variant.  */
17702  nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
17703
17704  nUF(vmvn,      _vmvn,    2, (RNDQ, RNDQ_Ibig), neon_mvn),
17705  nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
17706
17707   /* Data processing, three registers of different lengths.  */
17708   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
17709  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
17710  NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
17711  NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
17712  NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
17713   /* If not scalar, fall back to neon_dyadic_long.
17714      Vector types as above, scalar types S16 S32 U16 U32.  */
17715  nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
17716  nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
17717   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
17718  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
17719  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
17720   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
17721  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
17722  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
17723  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
17724  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
17725   /* Saturating doubling multiplies. Types S16 S32.  */
17726  nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
17727  nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
17728  nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
17729   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
17730      S16 S32 U16 U32.  */
17731  nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
17732
17733   /* Extract. Size 8.  */
17734  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
17735  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
17736
17737   /* Two registers, miscellaneous.  */
17738   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
17739  NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
17740  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
17741  NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
17742  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
17743  NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
17744  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
17745   /* Vector replicate. Sizes 8 16 32.  */
17746  nCE(vdup,      _vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
17747  nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
17748   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
17749  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
17750   /* VMOVN. Types I16 I32 I64.  */
17751  nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
17752   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
17753  nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
17754   /* VQMOVUN. Types S16 S32 S64.  */
17755  nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
17756   /* VZIP / VUZP. Sizes 8 16 32.  */
17757  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
17758  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
17759  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
17760  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
17761   /* VQABS / VQNEG. Types S8 S16 S32.  */
17762  NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
17763  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
17764  NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
17765  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
17766   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
17767  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
17768  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
17769  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
17770  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
17771   /* Reciprocal estimates. Types U32 F32.  */
17772  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
17773  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
17774  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
17775  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
17776   /* VCLS. Types S8 S16 S32.  */
17777  NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
17778  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
17779   /* VCLZ. Types I8 I16 I32.  */
17780  NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
17781  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
17782   /* VCNT. Size 8.  */
17783  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
17784  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
17785   /* Two address, untyped.  */
17786  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
17787  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
17788   /* VTRN. Sizes 8 16 32.  */
17789  nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
17790  nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
17791
17792   /* Table lookup. Size 8.  */
17793  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
17794  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
17795
17796 #undef  THUMB_VARIANT
17797 #define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
17798 #undef  ARM_VARIANT
17799 #define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
17800
17801   /* Neon element/structure load/store.  */
17802  nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
17803  nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
17804  nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
17805  nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
17806  nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
17807  nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
17808  nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
17809  nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
17810
17811 #undef  THUMB_VARIANT
17812 #define THUMB_VARIANT &fpu_vfp_ext_v3xd
17813 #undef ARM_VARIANT
17814 #define ARM_VARIANT &fpu_vfp_ext_v3xd
17815  cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
17816  cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
17817  cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
17818  cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
17819  cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
17820  cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
17821  cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
17822  cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
17823  cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
17824
17825 #undef THUMB_VARIANT
17826 #define THUMB_VARIANT  & fpu_vfp_ext_v3
17827 #undef  ARM_VARIANT
17828 #define ARM_VARIANT    & fpu_vfp_ext_v3
17829
17830  cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
17831  cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
17832  cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
17833  cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
17834  cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
17835  cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
17836  cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
17837  cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
17838  cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
17839
17840 #undef ARM_VARIANT
17841 #define ARM_VARIANT &fpu_vfp_ext_fma
17842 #undef THUMB_VARIANT
17843 #define THUMB_VARIANT &fpu_vfp_ext_fma
17844  /* Mnemonics shared by Neon and VFP.  These are included in the
17845     VFP FMA variant; NEON and VFP FMA always includes the NEON
17846     FMA instructions.  */
17847  nCEF(vfma,     _vfma,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
17848  nCEF(vfms,     _vfms,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
17849  /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
17850     the v form should always be used.  */
17851  cCE("ffmas",   ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17852  cCE("ffnmas",  ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17853  cCE("ffmad",   ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17854  cCE("ffnmad",  ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17855  nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
17856  nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
17857
17858 #undef THUMB_VARIANT
17859 #undef  ARM_VARIANT
17860 #define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
17861
17862  cCE("mia",     e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
17863  cCE("miaph",   e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
17864  cCE("miabb",   e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
17865  cCE("miabt",   e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
17866  cCE("miatb",   e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
17867  cCE("miatt",   e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
17868  cCE("mar",     c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
17869  cCE("mra",     c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
17870
17871 #undef  ARM_VARIANT
17872 #define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
17873
17874  cCE("tandcb",  e13f130, 1, (RR),                   iwmmxt_tandorc),
17875  cCE("tandch",  e53f130, 1, (RR),                   iwmmxt_tandorc),
17876  cCE("tandcw",  e93f130, 1, (RR),                   iwmmxt_tandorc),
17877  cCE("tbcstb",  e400010, 2, (RIWR, RR),             rn_rd),
17878  cCE("tbcsth",  e400050, 2, (RIWR, RR),             rn_rd),
17879  cCE("tbcstw",  e400090, 2, (RIWR, RR),             rn_rd),
17880  cCE("textrcb", e130170, 2, (RR, I7),               iwmmxt_textrc),
17881  cCE("textrch", e530170, 2, (RR, I7),               iwmmxt_textrc),
17882  cCE("textrcw", e930170, 2, (RR, I7),               iwmmxt_textrc),
17883  cCE("textrmub",        e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
17884  cCE("textrmuh",        e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
17885  cCE("textrmuw",        e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
17886  cCE("textrmsb",        e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
17887  cCE("textrmsh",        e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
17888  cCE("textrmsw",        e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
17889  cCE("tinsrb",  e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
17890  cCE("tinsrh",  e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
17891  cCE("tinsrw",  e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
17892  cCE("tmcr",    e000110, 2, (RIWC_RIWG, RR),        rn_rd),
17893  cCE("tmcrr",   c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
17894  cCE("tmia",    e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
17895  cCE("tmiaph",  e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
17896  cCE("tmiabb",  e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
17897  cCE("tmiabt",  e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
17898  cCE("tmiatb",  e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
17899  cCE("tmiatt",  e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
17900  cCE("tmovmskb",        e100030, 2, (RR, RIWR),             rd_rn),
17901  cCE("tmovmskh",        e500030, 2, (RR, RIWR),             rd_rn),
17902  cCE("tmovmskw",        e900030, 2, (RR, RIWR),             rd_rn),
17903  cCE("tmrc",    e100110, 2, (RR, RIWC_RIWG),        rd_rn),
17904  cCE("tmrrc",   c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
17905  cCE("torcb",   e13f150, 1, (RR),                   iwmmxt_tandorc),
17906  cCE("torch",   e53f150, 1, (RR),                   iwmmxt_tandorc),
17907  cCE("torcw",   e93f150, 1, (RR),                   iwmmxt_tandorc),
17908  cCE("waccb",   e0001c0, 2, (RIWR, RIWR),           rd_rn),
17909  cCE("wacch",   e4001c0, 2, (RIWR, RIWR),           rd_rn),
17910  cCE("waccw",   e8001c0, 2, (RIWR, RIWR),           rd_rn),
17911  cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17912  cCE("waddb",   e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17913  cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17914  cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17915  cCE("waddh",   e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17916  cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17917  cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17918  cCE("waddw",   e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17919  cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17920  cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
17921  cCE("walignr0",        e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17922  cCE("walignr1",        e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17923  cCE("walignr2",        ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17924  cCE("walignr3",        eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17925  cCE("wand",    e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17926  cCE("wandn",   e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17927  cCE("wavg2b",  e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17928  cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17929  cCE("wavg2h",  ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17930  cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17931  cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17932  cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17933  cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17934  cCE("wcmpgtub",        e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17935  cCE("wcmpgtuh",        e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17936  cCE("wcmpgtuw",        e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17937  cCE("wcmpgtsb",        e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17938  cCE("wcmpgtsh",        e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17939  cCE("wcmpgtsw",        eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17940  cCE("wldrb",   c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
17941  cCE("wldrh",   c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
17942  cCE("wldrw",   c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
17943  cCE("wldrd",   c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
17944  cCE("wmacs",   e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17945  cCE("wmacsz",  e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17946  cCE("wmacu",   e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17947  cCE("wmacuz",  e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17948  cCE("wmadds",  ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17949  cCE("wmaddu",  e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17950  cCE("wmaxsb",  e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17951  cCE("wmaxsh",  e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17952  cCE("wmaxsw",  ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17953  cCE("wmaxub",  e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17954  cCE("wmaxuh",  e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17955  cCE("wmaxuw",  e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17956  cCE("wminsb",  e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17957  cCE("wminsh",  e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17958  cCE("wminsw",  eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17959  cCE("wminub",  e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17960  cCE("wminuh",  e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17961  cCE("wminuw",  e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17962  cCE("wmov",    e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
17963  cCE("wmulsm",  e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17964  cCE("wmulsl",  e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17965  cCE("wmulum",  e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17966  cCE("wmulul",  e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17967  cCE("wor",     e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17968  cCE("wpackhss",        e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17969  cCE("wpackhus",        e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17970  cCE("wpackwss",        eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17971  cCE("wpackwus",        e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17972  cCE("wpackdss",        ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17973  cCE("wpackdus",        ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17974  cCE("wrorh",   e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17975  cCE("wrorhg",  e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17976  cCE("wrorw",   eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17977  cCE("wrorwg",  eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17978  cCE("wrord",   ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17979  cCE("wrordg",  ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17980  cCE("wsadb",   e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17981  cCE("wsadbz",  e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17982  cCE("wsadh",   e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17983  cCE("wsadhz",  e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
17984  cCE("wshufh",  e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
17985  cCE("wsllh",   e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17986  cCE("wsllhg",  e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17987  cCE("wsllw",   e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17988  cCE("wsllwg",  e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17989  cCE("wslld",   ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17990  cCE("wslldg",  ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17991  cCE("wsrah",   e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17992  cCE("wsrahg",  e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17993  cCE("wsraw",   e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17994  cCE("wsrawg",  e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17995  cCE("wsrad",   ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17996  cCE("wsradg",  ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17997  cCE("wsrlh",   e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
17998  cCE("wsrlhg",  e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
17999  cCE("wsrlw",   ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18000  cCE("wsrlwg",  ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18001  cCE("wsrld",   ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18002  cCE("wsrldg",  ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18003  cCE("wstrb",   c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18004  cCE("wstrh",   c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18005  cCE("wstrw",   c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
18006  cCE("wstrd",   c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
18007  cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18008  cCE("wsubb",   e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18009  cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18010  cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18011  cCE("wsubh",   e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18012  cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18013  cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18014  cCE("wsubw",   e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18015  cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18016  cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),         rd_rn),
18017  cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),         rd_rn),
18018  cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),         rd_rn),
18019  cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),         rd_rn),
18020  cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),         rd_rn),
18021  cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),         rd_rn),
18022  cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18023  cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18024  cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18025  cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),         rd_rn),
18026  cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),         rd_rn),
18027  cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),         rd_rn),
18028  cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),         rd_rn),
18029  cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),         rd_rn),
18030  cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),         rd_rn),
18031  cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18032  cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18033  cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18034  cCE("wxor",    e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18035  cCE("wzero",   e300000, 1, (RIWR),                 iwmmxt_wzero),
18036
18037 #undef  ARM_VARIANT
18038 #define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
18039
18040  cCE("torvscb",   e12f190, 1, (RR),                 iwmmxt_tandorc),
18041  cCE("torvsch",   e52f190, 1, (RR),                 iwmmxt_tandorc),
18042  cCE("torvscw",   e92f190, 1, (RR),                 iwmmxt_tandorc),
18043  cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
18044  cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
18045  cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
18046  cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18047  cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18048  cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18049  cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18050  cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18051  cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18052  cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18053  cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18054  cCE("wavg4",   e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18055  cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18056  cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18057  cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18058  cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18059  cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18060  cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
18061  cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18062  cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18063  cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18064  cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18065  cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18066  cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18067  cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18068  cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18069  cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18070  cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18071  cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18072  cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18073  cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18074  cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18075  cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18076  cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18077  cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18078  cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18079  cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18080  cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18081  cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18082  cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18083  cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18084  cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18085  cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18086  cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18087  cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18088  cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18089  cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18090  cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18091  cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18092  cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18093  cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18094  cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18095  cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18096  cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18097
18098 #undef  ARM_VARIANT
18099 #define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
18100
18101  cCE("cfldrs",  c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
18102  cCE("cfldrd",  c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
18103  cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
18104  cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
18105  cCE("cfstrs",  c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
18106  cCE("cfstrd",  c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
18107  cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
18108  cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
18109  cCE("cfmvsr",  e000450, 2, (RMF, RR),                rn_rd),
18110  cCE("cfmvrs",  e100450, 2, (RR, RMF),                rd_rn),
18111  cCE("cfmvdlr", e000410, 2, (RMD, RR),                rn_rd),
18112  cCE("cfmvrdl", e100410, 2, (RR, RMD),                rd_rn),
18113  cCE("cfmvdhr", e000430, 2, (RMD, RR),                rn_rd),
18114  cCE("cfmvrdh", e100430, 2, (RR, RMD),                rd_rn),
18115  cCE("cfmv64lr",        e000510, 2, (RMDX, RR),               rn_rd),
18116  cCE("cfmvr64l",        e100510, 2, (RR, RMDX),               rd_rn),
18117  cCE("cfmv64hr",        e000530, 2, (RMDX, RR),               rn_rd),
18118  cCE("cfmvr64h",        e100530, 2, (RR, RMDX),               rd_rn),
18119  cCE("cfmval32",        e200440, 2, (RMAX, RMFX),             rd_rn),
18120  cCE("cfmv32al",        e100440, 2, (RMFX, RMAX),             rd_rn),
18121  cCE("cfmvam32",        e200460, 2, (RMAX, RMFX),             rd_rn),
18122  cCE("cfmv32am",        e100460, 2, (RMFX, RMAX),             rd_rn),
18123  cCE("cfmvah32",        e200480, 2, (RMAX, RMFX),             rd_rn),
18124  cCE("cfmv32ah",        e100480, 2, (RMFX, RMAX),             rd_rn),
18125  cCE("cfmva32", e2004a0, 2, (RMAX, RMFX),             rd_rn),
18126  cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX),             rd_rn),
18127  cCE("cfmva64", e2004c0, 2, (RMAX, RMDX),             rd_rn),
18128  cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX),             rd_rn),
18129  cCE("cfmvsc32",        e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
18130  cCE("cfmv32sc",        e1004e0, 2, (RMDX, RMDS),             rd),
18131  cCE("cfcpys",  e000400, 2, (RMF, RMF),               rd_rn),
18132  cCE("cfcpyd",  e000420, 2, (RMD, RMD),               rd_rn),
18133  cCE("cfcvtsd", e000460, 2, (RMD, RMF),               rd_rn),
18134  cCE("cfcvtds", e000440, 2, (RMF, RMD),               rd_rn),
18135  cCE("cfcvt32s",        e000480, 2, (RMF, RMFX),              rd_rn),
18136  cCE("cfcvt32d",        e0004a0, 2, (RMD, RMFX),              rd_rn),
18137  cCE("cfcvt64s",        e0004c0, 2, (RMF, RMDX),              rd_rn),
18138  cCE("cfcvt64d",        e0004e0, 2, (RMD, RMDX),              rd_rn),
18139  cCE("cfcvts32",        e100580, 2, (RMFX, RMF),              rd_rn),
18140  cCE("cfcvtd32",        e1005a0, 2, (RMFX, RMD),              rd_rn),
18141  cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),            rd_rn),
18142  cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),            rd_rn),
18143  cCE("cfrshl32",        e000550, 3, (RMFX, RMFX, RR),         mav_triple),
18144  cCE("cfrshl64",        e000570, 3, (RMDX, RMDX, RR),         mav_triple),
18145  cCE("cfsh32",  e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
18146  cCE("cfsh64",  e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
18147  cCE("cfcmps",  e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
18148  cCE("cfcmpd",  e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
18149  cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
18150  cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
18151  cCE("cfabss",  e300400, 2, (RMF, RMF),               rd_rn),
18152  cCE("cfabsd",  e300420, 2, (RMD, RMD),               rd_rn),
18153  cCE("cfnegs",  e300440, 2, (RMF, RMF),               rd_rn),
18154  cCE("cfnegd",  e300460, 2, (RMD, RMD),               rd_rn),
18155  cCE("cfadds",  e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
18156  cCE("cfaddd",  e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
18157  cCE("cfsubs",  e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
18158  cCE("cfsubd",  e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
18159  cCE("cfmuls",  e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
18160  cCE("cfmuld",  e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
18161  cCE("cfabs32", e300500, 2, (RMFX, RMFX),             rd_rn),
18162  cCE("cfabs64", e300520, 2, (RMDX, RMDX),             rd_rn),
18163  cCE("cfneg32", e300540, 2, (RMFX, RMFX),             rd_rn),
18164  cCE("cfneg64", e300560, 2, (RMDX, RMDX),             rd_rn),
18165  cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18166  cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18167  cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18168  cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18169  cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18170  cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18171  cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18172  cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18173  cCE("cfmadd32",        e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18174  cCE("cfmsub32",        e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18175  cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
18176  cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
18177 };
18178 #undef ARM_VARIANT
18179 #undef THUMB_VARIANT
18180 #undef TCE
18181 #undef TCM
18182 #undef TUE
18183 #undef TUF
18184 #undef TCC
18185 #undef cCE
18186 #undef cCL
18187 #undef C3E
18188 #undef CE
18189 #undef CM
18190 #undef UE
18191 #undef UF
18192 #undef UT
18193 #undef NUF
18194 #undef nUF
18195 #undef NCE
18196 #undef nCE
18197 #undef OPS0
18198 #undef OPS1
18199 #undef OPS2
18200 #undef OPS3
18201 #undef OPS4
18202 #undef OPS5
18203 #undef OPS6
18204 #undef do_0
18205 \f
18206 /* MD interface: bits in the object file.  */
18207
18208 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
18209    for use in the a.out file, and stores them in the array pointed to by buf.
18210    This knows about the endian-ness of the target machine and does
18211    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
18212    2 (short) and 4 (long)  Floating numbers are put out as a series of
18213    LITTLENUMS (shorts, here at least).  */
18214
18215 void
18216 md_number_to_chars (char * buf, valueT val, int n)
18217 {
18218   if (target_big_endian)
18219     number_to_chars_bigendian (buf, val, n);
18220   else
18221     number_to_chars_littleendian (buf, val, n);
18222 }
18223
18224 static valueT
18225 md_chars_to_number (char * buf, int n)
18226 {
18227   valueT result = 0;
18228   unsigned char * where = (unsigned char *) buf;
18229
18230   if (target_big_endian)
18231     {
18232       while (n--)
18233         {
18234           result <<= 8;
18235           result |= (*where++ & 255);
18236         }
18237     }
18238   else
18239     {
18240       while (n--)
18241         {
18242           result <<= 8;
18243           result |= (where[n] & 255);
18244         }
18245     }
18246
18247   return result;
18248 }
18249
18250 /* MD interface: Sections.  */
18251
18252 /* Estimate the size of a frag before relaxing.  Assume everything fits in
18253    2 bytes.  */
18254
18255 int
18256 md_estimate_size_before_relax (fragS * fragp,
18257                                segT    segtype ATTRIBUTE_UNUSED)
18258 {
18259   fragp->fr_var = 2;
18260   return 2;
18261 }
18262
18263 /* Convert a machine dependent frag.  */
18264
18265 void
18266 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
18267 {
18268   unsigned long insn;
18269   unsigned long old_op;
18270   char *buf;
18271   expressionS exp;
18272   fixS *fixp;
18273   int reloc_type;
18274   int pc_rel;
18275   int opcode;
18276
18277   buf = fragp->fr_literal + fragp->fr_fix;
18278
18279   old_op = bfd_get_16(abfd, buf);
18280   if (fragp->fr_symbol)
18281     {
18282       exp.X_op = O_symbol;
18283       exp.X_add_symbol = fragp->fr_symbol;
18284     }
18285   else
18286     {
18287       exp.X_op = O_constant;
18288     }
18289   exp.X_add_number = fragp->fr_offset;
18290   opcode = fragp->fr_subtype;
18291   switch (opcode)
18292     {
18293     case T_MNEM_ldr_pc:
18294     case T_MNEM_ldr_pc2:
18295     case T_MNEM_ldr_sp:
18296     case T_MNEM_str_sp:
18297     case T_MNEM_ldr:
18298     case T_MNEM_ldrb:
18299     case T_MNEM_ldrh:
18300     case T_MNEM_str:
18301     case T_MNEM_strb:
18302     case T_MNEM_strh:
18303       if (fragp->fr_var == 4)
18304         {
18305           insn = THUMB_OP32 (opcode);
18306           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
18307             {
18308               insn |= (old_op & 0x700) << 4;
18309             }
18310           else
18311             {
18312               insn |= (old_op & 7) << 12;
18313               insn |= (old_op & 0x38) << 13;
18314             }
18315           insn |= 0x00000c00;
18316           put_thumb32_insn (buf, insn);
18317           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
18318         }
18319       else
18320         {
18321           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
18322         }
18323       pc_rel = (opcode == T_MNEM_ldr_pc2);
18324       break;
18325     case T_MNEM_adr:
18326       if (fragp->fr_var == 4)
18327         {
18328           insn = THUMB_OP32 (opcode);
18329           insn |= (old_op & 0xf0) << 4;
18330           put_thumb32_insn (buf, insn);
18331           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
18332         }
18333       else
18334         {
18335           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
18336           exp.X_add_number -= 4;
18337         }
18338       pc_rel = 1;
18339       break;
18340     case T_MNEM_mov:
18341     case T_MNEM_movs:
18342     case T_MNEM_cmp:
18343     case T_MNEM_cmn:
18344       if (fragp->fr_var == 4)
18345         {
18346           int r0off = (opcode == T_MNEM_mov
18347                        || opcode == T_MNEM_movs) ? 0 : 8;
18348           insn = THUMB_OP32 (opcode);
18349           insn = (insn & 0xe1ffffff) | 0x10000000;
18350           insn |= (old_op & 0x700) << r0off;
18351           put_thumb32_insn (buf, insn);
18352           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
18353         }
18354       else
18355         {
18356           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
18357         }
18358       pc_rel = 0;
18359       break;
18360     case T_MNEM_b:
18361       if (fragp->fr_var == 4)
18362         {
18363           insn = THUMB_OP32(opcode);
18364           put_thumb32_insn (buf, insn);
18365           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
18366         }
18367       else
18368         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
18369       pc_rel = 1;
18370       break;
18371     case T_MNEM_bcond:
18372       if (fragp->fr_var == 4)
18373         {
18374           insn = THUMB_OP32(opcode);
18375           insn |= (old_op & 0xf00) << 14;
18376           put_thumb32_insn (buf, insn);
18377           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
18378         }
18379       else
18380         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
18381       pc_rel = 1;
18382       break;
18383     case T_MNEM_add_sp:
18384     case T_MNEM_add_pc:
18385     case T_MNEM_inc_sp:
18386     case T_MNEM_dec_sp:
18387       if (fragp->fr_var == 4)
18388         {
18389           /* ??? Choose between add and addw.  */
18390           insn = THUMB_OP32 (opcode);
18391           insn |= (old_op & 0xf0) << 4;
18392           put_thumb32_insn (buf, insn);
18393           if (opcode == T_MNEM_add_pc)
18394             reloc_type = BFD_RELOC_ARM_T32_IMM12;
18395           else
18396             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
18397         }
18398       else
18399         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
18400       pc_rel = 0;
18401       break;
18402
18403     case T_MNEM_addi:
18404     case T_MNEM_addis:
18405     case T_MNEM_subi:
18406     case T_MNEM_subis:
18407       if (fragp->fr_var == 4)
18408         {
18409           insn = THUMB_OP32 (opcode);
18410           insn |= (old_op & 0xf0) << 4;
18411           insn |= (old_op & 0xf) << 16;
18412           put_thumb32_insn (buf, insn);
18413           if (insn & (1 << 20))
18414             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
18415           else
18416             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
18417         }
18418       else
18419         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
18420       pc_rel = 0;
18421       break;
18422     default:
18423       abort ();
18424     }
18425   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
18426                       (enum bfd_reloc_code_real) reloc_type);
18427   fixp->fx_file = fragp->fr_file;
18428   fixp->fx_line = fragp->fr_line;
18429   fragp->fr_fix += fragp->fr_var;
18430 }
18431
18432 /* Return the size of a relaxable immediate operand instruction.
18433    SHIFT and SIZE specify the form of the allowable immediate.  */
18434 static int
18435 relax_immediate (fragS *fragp, int size, int shift)
18436 {
18437   offsetT offset;
18438   offsetT mask;
18439   offsetT low;
18440
18441   /* ??? Should be able to do better than this.  */
18442   if (fragp->fr_symbol)
18443     return 4;
18444
18445   low = (1 << shift) - 1;
18446   mask = (1 << (shift + size)) - (1 << shift);
18447   offset = fragp->fr_offset;
18448   /* Force misaligned offsets to 32-bit variant.  */
18449   if (offset & low)
18450     return 4;
18451   if (offset & ~mask)
18452     return 4;
18453   return 2;
18454 }
18455
18456 /* Get the address of a symbol during relaxation.  */
18457 static addressT
18458 relaxed_symbol_addr (fragS *fragp, long stretch)
18459 {
18460   fragS *sym_frag;
18461   addressT addr;
18462   symbolS *sym;
18463
18464   sym = fragp->fr_symbol;
18465   sym_frag = symbol_get_frag (sym);
18466   know (S_GET_SEGMENT (sym) != absolute_section
18467         || sym_frag == &zero_address_frag);
18468   addr = S_GET_VALUE (sym) + fragp->fr_offset;
18469
18470   /* If frag has yet to be reached on this pass, assume it will
18471      move by STRETCH just as we did.  If this is not so, it will
18472      be because some frag between grows, and that will force
18473      another pass.  */
18474
18475   if (stretch != 0
18476       && sym_frag->relax_marker != fragp->relax_marker)
18477     {
18478       fragS *f;
18479
18480       /* Adjust stretch for any alignment frag.  Note that if have
18481          been expanding the earlier code, the symbol may be
18482          defined in what appears to be an earlier frag.  FIXME:
18483          This doesn't handle the fr_subtype field, which specifies
18484          a maximum number of bytes to skip when doing an
18485          alignment.  */
18486       for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
18487         {
18488           if (f->fr_type == rs_align || f->fr_type == rs_align_code)
18489             {
18490               if (stretch < 0)
18491                 stretch = - ((- stretch)
18492                              & ~ ((1 << (int) f->fr_offset) - 1));
18493               else
18494                 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
18495               if (stretch == 0)
18496                 break;
18497             }
18498         }
18499       if (f != NULL)
18500         addr += stretch;
18501     }
18502
18503   return addr;
18504 }
18505
18506 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
18507    load.  */
18508 static int
18509 relax_adr (fragS *fragp, asection *sec, long stretch)
18510 {
18511   addressT addr;
18512   offsetT val;
18513
18514   /* Assume worst case for symbols not known to be in the same section.  */
18515   if (fragp->fr_symbol == NULL
18516       || !S_IS_DEFINED (fragp->fr_symbol)
18517       || sec != S_GET_SEGMENT (fragp->fr_symbol))
18518     return 4;
18519
18520   val = relaxed_symbol_addr (fragp, stretch);
18521   addr = fragp->fr_address + fragp->fr_fix;
18522   addr = (addr + 4) & ~3;
18523   /* Force misaligned targets to 32-bit variant.  */
18524   if (val & 3)
18525     return 4;
18526   val -= addr;
18527   if (val < 0 || val > 1020)
18528     return 4;
18529   return 2;
18530 }
18531
18532 /* Return the size of a relaxable add/sub immediate instruction.  */
18533 static int
18534 relax_addsub (fragS *fragp, asection *sec)
18535 {
18536   char *buf;
18537   int op;
18538
18539   buf = fragp->fr_literal + fragp->fr_fix;
18540   op = bfd_get_16(sec->owner, buf);
18541   if ((op & 0xf) == ((op >> 4) & 0xf))
18542     return relax_immediate (fragp, 8, 0);
18543   else
18544     return relax_immediate (fragp, 3, 0);
18545 }
18546
18547
18548 /* Return the size of a relaxable branch instruction.  BITS is the
18549    size of the offset field in the narrow instruction.  */
18550
18551 static int
18552 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
18553 {
18554   addressT addr;
18555   offsetT val;
18556   offsetT limit;
18557
18558   /* Assume worst case for symbols not known to be in the same section.  */
18559   if (!S_IS_DEFINED (fragp->fr_symbol)
18560       || sec != S_GET_SEGMENT (fragp->fr_symbol))
18561     return 4;
18562
18563 #ifdef OBJ_ELF
18564   if (S_IS_DEFINED (fragp->fr_symbol)
18565       && ARM_IS_FUNC (fragp->fr_symbol))
18566       return 4;
18567 #endif
18568
18569   val = relaxed_symbol_addr (fragp, stretch);
18570   addr = fragp->fr_address + fragp->fr_fix + 4;
18571   val -= addr;
18572
18573   /* Offset is a signed value *2 */
18574   limit = 1 << bits;
18575   if (val >= limit || val < -limit)
18576     return 4;
18577   return 2;
18578 }
18579
18580
18581 /* Relax a machine dependent frag.  This returns the amount by which
18582    the current size of the frag should change.  */
18583
18584 int
18585 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
18586 {
18587   int oldsize;
18588   int newsize;
18589
18590   oldsize = fragp->fr_var;
18591   switch (fragp->fr_subtype)
18592     {
18593     case T_MNEM_ldr_pc2:
18594       newsize = relax_adr (fragp, sec, stretch);
18595       break;
18596     case T_MNEM_ldr_pc:
18597     case T_MNEM_ldr_sp:
18598     case T_MNEM_str_sp:
18599       newsize = relax_immediate (fragp, 8, 2);
18600       break;
18601     case T_MNEM_ldr:
18602     case T_MNEM_str:
18603       newsize = relax_immediate (fragp, 5, 2);
18604       break;
18605     case T_MNEM_ldrh:
18606     case T_MNEM_strh:
18607       newsize = relax_immediate (fragp, 5, 1);
18608       break;
18609     case T_MNEM_ldrb:
18610     case T_MNEM_strb:
18611       newsize = relax_immediate (fragp, 5, 0);
18612       break;
18613     case T_MNEM_adr:
18614       newsize = relax_adr (fragp, sec, stretch);
18615       break;
18616     case T_MNEM_mov:
18617     case T_MNEM_movs:
18618     case T_MNEM_cmp:
18619     case T_MNEM_cmn:
18620       newsize = relax_immediate (fragp, 8, 0);
18621       break;
18622     case T_MNEM_b:
18623       newsize = relax_branch (fragp, sec, 11, stretch);
18624       break;
18625     case T_MNEM_bcond:
18626       newsize = relax_branch (fragp, sec, 8, stretch);
18627       break;
18628     case T_MNEM_add_sp:
18629     case T_MNEM_add_pc:
18630       newsize = relax_immediate (fragp, 8, 2);
18631       break;
18632     case T_MNEM_inc_sp:
18633     case T_MNEM_dec_sp:
18634       newsize = relax_immediate (fragp, 7, 2);
18635       break;
18636     case T_MNEM_addi:
18637     case T_MNEM_addis:
18638     case T_MNEM_subi:
18639     case T_MNEM_subis:
18640       newsize = relax_addsub (fragp, sec);
18641       break;
18642     default:
18643       abort ();
18644     }
18645
18646   fragp->fr_var = newsize;
18647   /* Freeze wide instructions that are at or before the same location as
18648      in the previous pass.  This avoids infinite loops.
18649      Don't freeze them unconditionally because targets may be artificially
18650      misaligned by the expansion of preceding frags.  */
18651   if (stretch <= 0 && newsize > 2)
18652     {
18653       md_convert_frag (sec->owner, sec, fragp);
18654       frag_wane (fragp);
18655     }
18656
18657   return newsize - oldsize;
18658 }
18659
18660 /* Round up a section size to the appropriate boundary.  */
18661
18662 valueT
18663 md_section_align (segT   segment ATTRIBUTE_UNUSED,
18664                   valueT size)
18665 {
18666 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
18667   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
18668     {
18669       /* For a.out, force the section size to be aligned.  If we don't do
18670          this, BFD will align it for us, but it will not write out the
18671          final bytes of the section.  This may be a bug in BFD, but it is
18672          easier to fix it here since that is how the other a.out targets
18673          work.  */
18674       int align;
18675
18676       align = bfd_get_section_alignment (stdoutput, segment);
18677       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
18678     }
18679 #endif
18680
18681   return size;
18682 }
18683
18684 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
18685    of an rs_align_code fragment.  */
18686
18687 void
18688 arm_handle_align (fragS * fragP)
18689 {
18690   static char const arm_noop[2][2][4] =
18691     {
18692       {  /* ARMv1 */
18693         {0x00, 0x00, 0xa0, 0xe1},  /* LE */
18694         {0xe1, 0xa0, 0x00, 0x00},  /* BE */
18695       },
18696       {  /* ARMv6k */
18697         {0x00, 0xf0, 0x20, 0xe3},  /* LE */
18698         {0xe3, 0x20, 0xf0, 0x00},  /* BE */
18699       },
18700     };
18701   static char const thumb_noop[2][2][2] =
18702     {
18703       {  /* Thumb-1 */
18704         {0xc0, 0x46},  /* LE */
18705         {0x46, 0xc0},  /* BE */
18706       },
18707       {  /* Thumb-2 */
18708         {0x00, 0xbf},  /* LE */
18709         {0xbf, 0x00}   /* BE */
18710       }
18711     };
18712   static char const wide_thumb_noop[2][4] =
18713     {  /* Wide Thumb-2 */
18714       {0xaf, 0xf3, 0x00, 0x80},  /* LE */
18715       {0xf3, 0xaf, 0x80, 0x00},  /* BE */
18716     };
18717
18718   unsigned bytes, fix, noop_size;
18719   char * p;
18720   const char * noop;
18721   const char *narrow_noop = NULL;
18722 #ifdef OBJ_ELF
18723   enum mstate state;
18724 #endif
18725
18726   if (fragP->fr_type != rs_align_code)
18727     return;
18728
18729   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
18730   p = fragP->fr_literal + fragP->fr_fix;
18731   fix = 0;
18732
18733   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
18734     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
18735
18736   gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
18737
18738   if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
18739     {
18740       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
18741         {
18742           narrow_noop = thumb_noop[1][target_big_endian];
18743           noop = wide_thumb_noop[target_big_endian];
18744         }
18745       else
18746         noop = thumb_noop[0][target_big_endian];
18747       noop_size = 2;
18748 #ifdef OBJ_ELF
18749       state = MAP_THUMB;
18750 #endif
18751     }
18752   else
18753     {
18754       noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
18755                      [target_big_endian];
18756       noop_size = 4;
18757 #ifdef OBJ_ELF
18758       state = MAP_ARM;
18759 #endif
18760     }
18761
18762   fragP->fr_var = noop_size;
18763
18764   if (bytes & (noop_size - 1))
18765     {
18766       fix = bytes & (noop_size - 1);
18767 #ifdef OBJ_ELF
18768       insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
18769 #endif
18770       memset (p, 0, fix);
18771       p += fix;
18772       bytes -= fix;
18773     }
18774
18775   if (narrow_noop)
18776     {
18777       if (bytes & noop_size)
18778         {
18779           /* Insert a narrow noop.  */
18780           memcpy (p, narrow_noop, noop_size);
18781           p += noop_size;
18782           bytes -= noop_size;
18783           fix += noop_size;
18784         }
18785
18786       /* Use wide noops for the remainder */
18787       noop_size = 4;
18788     }
18789
18790   while (bytes >= noop_size)
18791     {
18792       memcpy (p, noop, noop_size);
18793       p += noop_size;
18794       bytes -= noop_size;
18795       fix += noop_size;
18796     }
18797
18798   fragP->fr_fix += fix;
18799 }
18800
18801 /* Called from md_do_align.  Used to create an alignment
18802    frag in a code section.  */
18803
18804 void
18805 arm_frag_align_code (int n, int max)
18806 {
18807   char * p;
18808
18809   /* We assume that there will never be a requirement
18810      to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
18811   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
18812     {
18813       char err_msg[128];
18814
18815       sprintf (err_msg, 
18816         _("alignments greater than %d bytes not supported in .text sections."),
18817         MAX_MEM_FOR_RS_ALIGN_CODE + 1);
18818       as_fatal ("%s", err_msg);
18819     }
18820
18821   p = frag_var (rs_align_code,
18822                 MAX_MEM_FOR_RS_ALIGN_CODE,
18823                 1,
18824                 (relax_substateT) max,
18825                 (symbolS *) NULL,
18826                 (offsetT) n,
18827                 (char *) NULL);
18828   *p = 0;
18829 }
18830
18831 /* Perform target specific initialisation of a frag.
18832    Note - despite the name this initialisation is not done when the frag
18833    is created, but only when its type is assigned.  A frag can be created
18834    and used a long time before its type is set, so beware of assuming that
18835    this initialisationis performed first.  */
18836
18837 #ifndef OBJ_ELF
18838 void
18839 arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
18840 {
18841   /* Record whether this frag is in an ARM or a THUMB area.  */
18842   fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
18843 }
18844
18845 #else /* OBJ_ELF is defined.  */
18846 void
18847 arm_init_frag (fragS * fragP, int max_chars)
18848 {
18849   /* If the current ARM vs THUMB mode has not already
18850      been recorded into this frag then do so now.  */
18851   if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
18852     {
18853       fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
18854
18855       /* Record a mapping symbol for alignment frags.  We will delete this
18856          later if the alignment ends up empty.  */
18857       switch (fragP->fr_type)
18858         {
18859           case rs_align:
18860           case rs_align_test:
18861           case rs_fill:
18862             mapping_state_2 (MAP_DATA, max_chars);
18863             break;
18864           case rs_align_code:
18865             mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
18866             break;
18867           default:
18868             break;
18869         }
18870     }
18871 }
18872
18873 /* When we change sections we need to issue a new mapping symbol.  */
18874
18875 void
18876 arm_elf_change_section (void)
18877 {
18878   /* Link an unlinked unwind index table section to the .text section.  */
18879   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
18880       && elf_linked_to_section (now_seg) == NULL)
18881     elf_linked_to_section (now_seg) = text_section;
18882 }
18883
18884 int
18885 arm_elf_section_type (const char * str, size_t len)
18886 {
18887   if (len == 5 && strncmp (str, "exidx", 5) == 0)
18888     return SHT_ARM_EXIDX;
18889
18890   return -1;
18891 }
18892 \f
18893 /* Code to deal with unwinding tables.  */
18894
18895 static void add_unwind_adjustsp (offsetT);
18896
18897 /* Generate any deferred unwind frame offset.  */
18898
18899 static void
18900 flush_pending_unwind (void)
18901 {
18902   offsetT offset;
18903
18904   offset = unwind.pending_offset;
18905   unwind.pending_offset = 0;
18906   if (offset != 0)
18907     add_unwind_adjustsp (offset);
18908 }
18909
18910 /* Add an opcode to this list for this function.  Two-byte opcodes should
18911    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
18912    order.  */
18913
18914 static void
18915 add_unwind_opcode (valueT op, int length)
18916 {
18917   /* Add any deferred stack adjustment.  */
18918   if (unwind.pending_offset)
18919     flush_pending_unwind ();
18920
18921   unwind.sp_restored = 0;
18922
18923   if (unwind.opcode_count + length > unwind.opcode_alloc)
18924     {
18925       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
18926       if (unwind.opcodes)
18927         unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
18928                                                      unwind.opcode_alloc);
18929       else
18930         unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
18931     }
18932   while (length > 0)
18933     {
18934       length--;
18935       unwind.opcodes[unwind.opcode_count] = op & 0xff;
18936       op >>= 8;
18937       unwind.opcode_count++;
18938     }
18939 }
18940
18941 /* Add unwind opcodes to adjust the stack pointer.  */
18942
18943 static void
18944 add_unwind_adjustsp (offsetT offset)
18945 {
18946   valueT op;
18947
18948   if (offset > 0x200)
18949     {
18950       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
18951       char bytes[5];
18952       int n;
18953       valueT o;
18954
18955       /* Long form: 0xb2, uleb128.  */
18956       /* This might not fit in a word so add the individual bytes,
18957          remembering the list is built in reverse order.  */
18958       o = (valueT) ((offset - 0x204) >> 2);
18959       if (o == 0)
18960         add_unwind_opcode (0, 1);
18961
18962       /* Calculate the uleb128 encoding of the offset.  */
18963       n = 0;
18964       while (o)
18965         {
18966           bytes[n] = o & 0x7f;
18967           o >>= 7;
18968           if (o)
18969             bytes[n] |= 0x80;
18970           n++;
18971         }
18972       /* Add the insn.  */
18973       for (; n; n--)
18974         add_unwind_opcode (bytes[n - 1], 1);
18975       add_unwind_opcode (0xb2, 1);
18976     }
18977   else if (offset > 0x100)
18978     {
18979       /* Two short opcodes.  */
18980       add_unwind_opcode (0x3f, 1);
18981       op = (offset - 0x104) >> 2;
18982       add_unwind_opcode (op, 1);
18983     }
18984   else if (offset > 0)
18985     {
18986       /* Short opcode.  */
18987       op = (offset - 4) >> 2;
18988       add_unwind_opcode (op, 1);
18989     }
18990   else if (offset < 0)
18991     {
18992       offset = -offset;
18993       while (offset > 0x100)
18994         {
18995           add_unwind_opcode (0x7f, 1);
18996           offset -= 0x100;
18997         }
18998       op = ((offset - 4) >> 2) | 0x40;
18999       add_unwind_opcode (op, 1);
19000     }
19001 }
19002
19003 /* Finish the list of unwind opcodes for this function.  */
19004 static void
19005 finish_unwind_opcodes (void)
19006 {
19007   valueT op;
19008
19009   if (unwind.fp_used)
19010     {
19011       /* Adjust sp as necessary.  */
19012       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
19013       flush_pending_unwind ();
19014
19015       /* After restoring sp from the frame pointer.  */
19016       op = 0x90 | unwind.fp_reg;
19017       add_unwind_opcode (op, 1);
19018     }
19019   else
19020     flush_pending_unwind ();
19021 }
19022
19023
19024 /* Start an exception table entry.  If idx is nonzero this is an index table
19025    entry.  */
19026
19027 static void
19028 start_unwind_section (const segT text_seg, int idx)
19029 {
19030   const char * text_name;
19031   const char * prefix;
19032   const char * prefix_once;
19033   const char * group_name;
19034   size_t prefix_len;
19035   size_t text_len;
19036   char * sec_name;
19037   size_t sec_name_len;
19038   int type;
19039   int flags;
19040   int linkonce;
19041
19042   if (idx)
19043     {
19044       prefix = ELF_STRING_ARM_unwind;
19045       prefix_once = ELF_STRING_ARM_unwind_once;
19046       type = SHT_ARM_EXIDX;
19047     }
19048   else
19049     {
19050       prefix = ELF_STRING_ARM_unwind_info;
19051       prefix_once = ELF_STRING_ARM_unwind_info_once;
19052       type = SHT_PROGBITS;
19053     }
19054
19055   text_name = segment_name (text_seg);
19056   if (streq (text_name, ".text"))
19057     text_name = "";
19058
19059   if (strncmp (text_name, ".gnu.linkonce.t.",
19060                strlen (".gnu.linkonce.t.")) == 0)
19061     {
19062       prefix = prefix_once;
19063       text_name += strlen (".gnu.linkonce.t.");
19064     }
19065
19066   prefix_len = strlen (prefix);
19067   text_len = strlen (text_name);
19068   sec_name_len = prefix_len + text_len;
19069   sec_name = (char *) xmalloc (sec_name_len + 1);
19070   memcpy (sec_name, prefix, prefix_len);
19071   memcpy (sec_name + prefix_len, text_name, text_len);
19072   sec_name[prefix_len + text_len] = '\0';
19073
19074   flags = SHF_ALLOC;
19075   linkonce = 0;
19076   group_name = 0;
19077
19078   /* Handle COMDAT group.  */
19079   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
19080     {
19081       group_name = elf_group_name (text_seg);
19082       if (group_name == NULL)
19083         {
19084           as_bad (_("Group section `%s' has no group signature"),
19085                   segment_name (text_seg));
19086           ignore_rest_of_line ();
19087           return;
19088         }
19089       flags |= SHF_GROUP;
19090       linkonce = 1;
19091     }
19092
19093   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
19094
19095   /* Set the section link for index tables.  */
19096   if (idx)
19097     elf_linked_to_section (now_seg) = text_seg;
19098 }
19099
19100
19101 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
19102    personality routine data.  Returns zero, or the index table value for
19103    and inline entry.  */
19104
19105 static valueT
19106 create_unwind_entry (int have_data)
19107 {
19108   int size;
19109   addressT where;
19110   char *ptr;
19111   /* The current word of data.  */
19112   valueT data;
19113   /* The number of bytes left in this word.  */
19114   int n;
19115
19116   finish_unwind_opcodes ();
19117
19118   /* Remember the current text section.  */
19119   unwind.saved_seg = now_seg;
19120   unwind.saved_subseg = now_subseg;
19121
19122   start_unwind_section (now_seg, 0);
19123
19124   if (unwind.personality_routine == NULL)
19125     {
19126       if (unwind.personality_index == -2)
19127         {
19128           if (have_data)
19129             as_bad (_("handlerdata in cantunwind frame"));
19130           return 1; /* EXIDX_CANTUNWIND.  */
19131         }
19132
19133       /* Use a default personality routine if none is specified.  */
19134       if (unwind.personality_index == -1)
19135         {
19136           if (unwind.opcode_count > 3)
19137             unwind.personality_index = 1;
19138           else
19139             unwind.personality_index = 0;
19140         }
19141
19142       /* Space for the personality routine entry.  */
19143       if (unwind.personality_index == 0)
19144         {
19145           if (unwind.opcode_count > 3)
19146             as_bad (_("too many unwind opcodes for personality routine 0"));
19147
19148           if (!have_data)
19149             {
19150               /* All the data is inline in the index table.  */
19151               data = 0x80;
19152               n = 3;
19153               while (unwind.opcode_count > 0)
19154                 {
19155                   unwind.opcode_count--;
19156                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
19157                   n--;
19158                 }
19159
19160               /* Pad with "finish" opcodes.  */
19161               while (n--)
19162                 data = (data << 8) | 0xb0;
19163
19164               return data;
19165             }
19166           size = 0;
19167         }
19168       else
19169         /* We get two opcodes "free" in the first word.  */
19170         size = unwind.opcode_count - 2;
19171     }
19172   else
19173     /* An extra byte is required for the opcode count.  */
19174     size = unwind.opcode_count + 1;
19175
19176   size = (size + 3) >> 2;
19177   if (size > 0xff)
19178     as_bad (_("too many unwind opcodes"));
19179
19180   frag_align (2, 0, 0);
19181   record_alignment (now_seg, 2);
19182   unwind.table_entry = expr_build_dot ();
19183
19184   /* Allocate the table entry.  */
19185   ptr = frag_more ((size << 2) + 4);
19186   where = frag_now_fix () - ((size << 2) + 4);
19187
19188   switch (unwind.personality_index)
19189     {
19190     case -1:
19191       /* ??? Should this be a PLT generating relocation?  */
19192       /* Custom personality routine.  */
19193       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
19194                BFD_RELOC_ARM_PREL31);
19195
19196       where += 4;
19197       ptr += 4;
19198
19199       /* Set the first byte to the number of additional words.  */
19200       data = size - 1;
19201       n = 3;
19202       break;
19203
19204     /* ABI defined personality routines.  */
19205     case 0:
19206       /* Three opcodes bytes are packed into the first word.  */
19207       data = 0x80;
19208       n = 3;
19209       break;
19210
19211     case 1:
19212     case 2:
19213       /* The size and first two opcode bytes go in the first word.  */
19214       data = ((0x80 + unwind.personality_index) << 8) | size;
19215       n = 2;
19216       break;
19217
19218     default:
19219       /* Should never happen.  */
19220       abort ();
19221     }
19222
19223   /* Pack the opcodes into words (MSB first), reversing the list at the same
19224      time.  */
19225   while (unwind.opcode_count > 0)
19226     {
19227       if (n == 0)
19228         {
19229           md_number_to_chars (ptr, data, 4);
19230           ptr += 4;
19231           n = 4;
19232           data = 0;
19233         }
19234       unwind.opcode_count--;
19235       n--;
19236       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
19237     }
19238
19239   /* Finish off the last word.  */
19240   if (n < 4)
19241     {
19242       /* Pad with "finish" opcodes.  */
19243       while (n--)
19244         data = (data << 8) | 0xb0;
19245
19246       md_number_to_chars (ptr, data, 4);
19247     }
19248
19249   if (!have_data)
19250     {
19251       /* Add an empty descriptor if there is no user-specified data.   */
19252       ptr = frag_more (4);
19253       md_number_to_chars (ptr, 0, 4);
19254     }
19255
19256   return 0;
19257 }
19258
19259
19260 /* Initialize the DWARF-2 unwind information for this procedure.  */
19261
19262 void
19263 tc_arm_frame_initial_instructions (void)
19264 {
19265   cfi_add_CFA_def_cfa (REG_SP, 0);
19266 }
19267 #endif /* OBJ_ELF */
19268
19269 /* Convert REGNAME to a DWARF-2 register number.  */
19270
19271 int
19272 tc_arm_regname_to_dw2regnum (char *regname)
19273 {
19274   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
19275
19276   if (reg == FAIL)
19277     return -1;
19278
19279   return reg;
19280 }
19281
19282 #ifdef TE_PE
19283 void
19284 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
19285 {
19286   expressionS exp;
19287
19288   exp.X_op = O_secrel;
19289   exp.X_add_symbol = symbol;
19290   exp.X_add_number = 0;
19291   emit_expr (&exp, size);
19292 }
19293 #endif
19294
19295 /* MD interface: Symbol and relocation handling.  */
19296
19297 /* Return the address within the segment that a PC-relative fixup is
19298    relative to.  For ARM, PC-relative fixups applied to instructions
19299    are generally relative to the location of the fixup plus 8 bytes.
19300    Thumb branches are offset by 4, and Thumb loads relative to PC
19301    require special handling.  */
19302
19303 long
19304 md_pcrel_from_section (fixS * fixP, segT seg)
19305 {
19306   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
19307
19308   /* If this is pc-relative and we are going to emit a relocation
19309      then we just want to put out any pipeline compensation that the linker
19310      will need.  Otherwise we want to use the calculated base.
19311      For WinCE we skip the bias for externals as well, since this
19312      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
19313   if (fixP->fx_pcrel
19314       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
19315           || (arm_force_relocation (fixP)
19316 #ifdef TE_WINCE
19317               && !S_IS_EXTERNAL (fixP->fx_addsy)
19318 #endif
19319               )))
19320     base = 0;
19321
19322
19323   switch (fixP->fx_r_type)
19324     {
19325       /* PC relative addressing on the Thumb is slightly odd as the
19326          bottom two bits of the PC are forced to zero for the
19327          calculation.  This happens *after* application of the
19328          pipeline offset.  However, Thumb adrl already adjusts for
19329          this, so we need not do it again.  */
19330     case BFD_RELOC_ARM_THUMB_ADD:
19331       return base & ~3;
19332
19333     case BFD_RELOC_ARM_THUMB_OFFSET:
19334     case BFD_RELOC_ARM_T32_OFFSET_IMM:
19335     case BFD_RELOC_ARM_T32_ADD_PC12:
19336     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
19337       return (base + 4) & ~3;
19338
19339       /* Thumb branches are simply offset by +4.  */
19340     case BFD_RELOC_THUMB_PCREL_BRANCH7:
19341     case BFD_RELOC_THUMB_PCREL_BRANCH9:
19342     case BFD_RELOC_THUMB_PCREL_BRANCH12:
19343     case BFD_RELOC_THUMB_PCREL_BRANCH20:
19344     case BFD_RELOC_THUMB_PCREL_BRANCH25:
19345       return base + 4;
19346
19347     case BFD_RELOC_THUMB_PCREL_BRANCH23:
19348       if (fixP->fx_addsy
19349           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19350           && (!S_IS_EXTERNAL (fixP->fx_addsy))
19351           && ARM_IS_FUNC (fixP->fx_addsy)
19352           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19353         base = fixP->fx_where + fixP->fx_frag->fr_address;
19354        return base + 4;
19355
19356       /* BLX is like branches above, but forces the low two bits of PC to
19357          zero.  */
19358     case BFD_RELOC_THUMB_PCREL_BLX:
19359       if (fixP->fx_addsy
19360           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19361           && (!S_IS_EXTERNAL (fixP->fx_addsy))
19362           && THUMB_IS_FUNC (fixP->fx_addsy)
19363           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19364         base = fixP->fx_where + fixP->fx_frag->fr_address;
19365       return (base + 4) & ~3;
19366
19367       /* ARM mode branches are offset by +8.  However, the Windows CE
19368          loader expects the relocation not to take this into account.  */
19369     case BFD_RELOC_ARM_PCREL_BLX:
19370       if (fixP->fx_addsy
19371           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19372           && (!S_IS_EXTERNAL (fixP->fx_addsy))
19373           && ARM_IS_FUNC (fixP->fx_addsy)
19374           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19375         base = fixP->fx_where + fixP->fx_frag->fr_address;
19376       return base + 8;
19377
19378     case BFD_RELOC_ARM_PCREL_CALL:
19379       if (fixP->fx_addsy
19380           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19381           && (!S_IS_EXTERNAL (fixP->fx_addsy))
19382           && THUMB_IS_FUNC (fixP->fx_addsy)
19383           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19384         base = fixP->fx_where + fixP->fx_frag->fr_address;
19385       return base + 8;
19386
19387     case BFD_RELOC_ARM_PCREL_BRANCH:
19388     case BFD_RELOC_ARM_PCREL_JUMP:
19389     case BFD_RELOC_ARM_PLT32:
19390 #ifdef TE_WINCE
19391       /* When handling fixups immediately, because we have already
19392          discovered the value of a symbol, or the address of the frag involved
19393          we must account for the offset by +8, as the OS loader will never see the reloc.
19394          see fixup_segment() in write.c
19395          The S_IS_EXTERNAL test handles the case of global symbols.
19396          Those need the calculated base, not just the pipe compensation the linker will need.  */
19397       if (fixP->fx_pcrel
19398           && fixP->fx_addsy != NULL
19399           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19400           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
19401         return base + 8;
19402       return base;
19403 #else
19404       return base + 8;
19405 #endif
19406
19407
19408       /* ARM mode loads relative to PC are also offset by +8.  Unlike
19409          branches, the Windows CE loader *does* expect the relocation
19410          to take this into account.  */
19411     case BFD_RELOC_ARM_OFFSET_IMM:
19412     case BFD_RELOC_ARM_OFFSET_IMM8:
19413     case BFD_RELOC_ARM_HWLITERAL:
19414     case BFD_RELOC_ARM_LITERAL:
19415     case BFD_RELOC_ARM_CP_OFF_IMM:
19416       return base + 8;
19417
19418
19419       /* Other PC-relative relocations are un-offset.  */
19420     default:
19421       return base;
19422     }
19423 }
19424
19425 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
19426    Otherwise we have no need to default values of symbols.  */
19427
19428 symbolS *
19429 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
19430 {
19431 #ifdef OBJ_ELF
19432   if (name[0] == '_' && name[1] == 'G'
19433       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
19434     {
19435       if (!GOT_symbol)
19436         {
19437           if (symbol_find (name))
19438             as_bad (_("GOT already in the symbol table"));
19439
19440           GOT_symbol = symbol_new (name, undefined_section,
19441                                    (valueT) 0, & zero_address_frag);
19442         }
19443
19444       return GOT_symbol;
19445     }
19446 #endif
19447
19448   return NULL;
19449 }
19450
19451 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
19452    computed as two separate immediate values, added together.  We
19453    already know that this value cannot be computed by just one ARM
19454    instruction.  */
19455
19456 static unsigned int
19457 validate_immediate_twopart (unsigned int   val,
19458                             unsigned int * highpart)
19459 {
19460   unsigned int a;
19461   unsigned int i;
19462
19463   for (i = 0; i < 32; i += 2)
19464     if (((a = rotate_left (val, i)) & 0xff) != 0)
19465       {
19466         if (a & 0xff00)
19467           {
19468             if (a & ~ 0xffff)
19469               continue;
19470             * highpart = (a  >> 8) | ((i + 24) << 7);
19471           }
19472         else if (a & 0xff0000)
19473           {
19474             if (a & 0xff000000)
19475               continue;
19476             * highpart = (a >> 16) | ((i + 16) << 7);
19477           }
19478         else
19479           {
19480             gas_assert (a & 0xff000000);
19481             * highpart = (a >> 24) | ((i + 8) << 7);
19482           }
19483
19484         return (a & 0xff) | (i << 7);
19485       }
19486
19487   return FAIL;
19488 }
19489
19490 static int
19491 validate_offset_imm (unsigned int val, int hwse)
19492 {
19493   if ((hwse && val > 255) || val > 4095)
19494     return FAIL;
19495   return val;
19496 }
19497
19498 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
19499    negative immediate constant by altering the instruction.  A bit of
19500    a hack really.
19501         MOV <-> MVN
19502         AND <-> BIC
19503         ADC <-> SBC
19504         by inverting the second operand, and
19505         ADD <-> SUB
19506         CMP <-> CMN
19507         by negating the second operand.  */
19508
19509 static int
19510 negate_data_op (unsigned long * instruction,
19511                 unsigned long   value)
19512 {
19513   int op, new_inst;
19514   unsigned long negated, inverted;
19515
19516   negated = encode_arm_immediate (-value);
19517   inverted = encode_arm_immediate (~value);
19518
19519   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
19520   switch (op)
19521     {
19522       /* First negates.  */
19523     case OPCODE_SUB:             /* ADD <-> SUB  */
19524       new_inst = OPCODE_ADD;
19525       value = negated;
19526       break;
19527
19528     case OPCODE_ADD:
19529       new_inst = OPCODE_SUB;
19530       value = negated;
19531       break;
19532
19533     case OPCODE_CMP:             /* CMP <-> CMN  */
19534       new_inst = OPCODE_CMN;
19535       value = negated;
19536       break;
19537
19538     case OPCODE_CMN:
19539       new_inst = OPCODE_CMP;
19540       value = negated;
19541       break;
19542
19543       /* Now Inverted ops.  */
19544     case OPCODE_MOV:             /* MOV <-> MVN  */
19545       new_inst = OPCODE_MVN;
19546       value = inverted;
19547       break;
19548
19549     case OPCODE_MVN:
19550       new_inst = OPCODE_MOV;
19551       value = inverted;
19552       break;
19553
19554     case OPCODE_AND:             /* AND <-> BIC  */
19555       new_inst = OPCODE_BIC;
19556       value = inverted;
19557       break;
19558
19559     case OPCODE_BIC:
19560       new_inst = OPCODE_AND;
19561       value = inverted;
19562       break;
19563
19564     case OPCODE_ADC:              /* ADC <-> SBC  */
19565       new_inst = OPCODE_SBC;
19566       value = inverted;
19567       break;
19568
19569     case OPCODE_SBC:
19570       new_inst = OPCODE_ADC;
19571       value = inverted;
19572       break;
19573
19574       /* We cannot do anything.  */
19575     default:
19576       return FAIL;
19577     }
19578
19579   if (value == (unsigned) FAIL)
19580     return FAIL;
19581
19582   *instruction &= OPCODE_MASK;
19583   *instruction |= new_inst << DATA_OP_SHIFT;
19584   return value;
19585 }
19586
19587 /* Like negate_data_op, but for Thumb-2.   */
19588
19589 static unsigned int
19590 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
19591 {
19592   int op, new_inst;
19593   int rd;
19594   unsigned int negated, inverted;
19595
19596   negated = encode_thumb32_immediate (-value);
19597   inverted = encode_thumb32_immediate (~value);
19598
19599   rd = (*instruction >> 8) & 0xf;
19600   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
19601   switch (op)
19602     {
19603       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
19604     case T2_OPCODE_SUB:
19605       new_inst = T2_OPCODE_ADD;
19606       value = negated;
19607       break;
19608
19609     case T2_OPCODE_ADD:
19610       new_inst = T2_OPCODE_SUB;
19611       value = negated;
19612       break;
19613
19614       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
19615     case T2_OPCODE_ORR:
19616       new_inst = T2_OPCODE_ORN;
19617       value = inverted;
19618       break;
19619
19620     case T2_OPCODE_ORN:
19621       new_inst = T2_OPCODE_ORR;
19622       value = inverted;
19623       break;
19624
19625       /* AND <-> BIC.  TST has no inverted equivalent.  */
19626     case T2_OPCODE_AND:
19627       new_inst = T2_OPCODE_BIC;
19628       if (rd == 15)
19629         value = FAIL;
19630       else
19631         value = inverted;
19632       break;
19633
19634     case T2_OPCODE_BIC:
19635       new_inst = T2_OPCODE_AND;
19636       value = inverted;
19637       break;
19638
19639       /* ADC <-> SBC  */
19640     case T2_OPCODE_ADC:
19641       new_inst = T2_OPCODE_SBC;
19642       value = inverted;
19643       break;
19644
19645     case T2_OPCODE_SBC:
19646       new_inst = T2_OPCODE_ADC;
19647       value = inverted;
19648       break;
19649
19650       /* We cannot do anything.  */
19651     default:
19652       return FAIL;
19653     }
19654
19655   if (value == (unsigned int)FAIL)
19656     return FAIL;
19657
19658   *instruction &= T2_OPCODE_MASK;
19659   *instruction |= new_inst << T2_DATA_OP_SHIFT;
19660   return value;
19661 }
19662
19663 /* Read a 32-bit thumb instruction from buf.  */
19664 static unsigned long
19665 get_thumb32_insn (char * buf)
19666 {
19667   unsigned long insn;
19668   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
19669   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
19670
19671   return insn;
19672 }
19673
19674
19675 /* We usually want to set the low bit on the address of thumb function
19676    symbols.  In particular .word foo - . should have the low bit set.
19677    Generic code tries to fold the difference of two symbols to
19678    a constant.  Prevent this and force a relocation when the first symbols
19679    is a thumb function.  */
19680
19681 bfd_boolean
19682 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
19683 {
19684   if (op == O_subtract
19685       && l->X_op == O_symbol
19686       && r->X_op == O_symbol
19687       && THUMB_IS_FUNC (l->X_add_symbol))
19688     {
19689       l->X_op = O_subtract;
19690       l->X_op_symbol = r->X_add_symbol;
19691       l->X_add_number -= r->X_add_number;
19692       return TRUE;
19693     }
19694
19695   /* Process as normal.  */
19696   return FALSE;
19697 }
19698
19699 /* Encode Thumb2 unconditional branches and calls. The encoding
19700    for the 2 are identical for the immediate values.  */
19701
19702 static void
19703 encode_thumb2_b_bl_offset (char * buf, offsetT value)
19704 {
19705 #define T2I1I2MASK  ((1 << 13) | (1 << 11))
19706   offsetT newval;
19707   offsetT newval2;
19708   addressT S, I1, I2, lo, hi;
19709
19710   S = (value >> 24) & 0x01;
19711   I1 = (value >> 23) & 0x01;
19712   I2 = (value >> 22) & 0x01;
19713   hi = (value >> 12) & 0x3ff;
19714   lo = (value >> 1) & 0x7ff; 
19715   newval   = md_chars_to_number (buf, THUMB_SIZE);
19716   newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
19717   newval  |= (S << 10) | hi;
19718   newval2 &=  ~T2I1I2MASK;
19719   newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
19720   md_number_to_chars (buf, newval, THUMB_SIZE);
19721   md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
19722 }
19723
19724 void
19725 md_apply_fix (fixS *    fixP,
19726                valueT * valP,
19727                segT     seg)
19728 {
19729   offsetT        value = * valP;
19730   offsetT        newval;
19731   unsigned int   newimm;
19732   unsigned long  temp;
19733   int            sign;
19734   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
19735
19736   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
19737
19738   /* Note whether this will delete the relocation.  */
19739
19740   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
19741     fixP->fx_done = 1;
19742
19743   /* On a 64-bit host, silently truncate 'value' to 32 bits for
19744      consistency with the behaviour on 32-bit hosts.  Remember value
19745      for emit_reloc.  */
19746   value &= 0xffffffff;
19747   value ^= 0x80000000;
19748   value -= 0x80000000;
19749
19750   *valP = value;
19751   fixP->fx_addnumber = value;
19752
19753   /* Same treatment for fixP->fx_offset.  */
19754   fixP->fx_offset &= 0xffffffff;
19755   fixP->fx_offset ^= 0x80000000;
19756   fixP->fx_offset -= 0x80000000;
19757
19758   switch (fixP->fx_r_type)
19759     {
19760     case BFD_RELOC_NONE:
19761       /* This will need to go in the object file.  */
19762       fixP->fx_done = 0;
19763       break;
19764
19765     case BFD_RELOC_ARM_IMMEDIATE:
19766       /* We claim that this fixup has been processed here,
19767          even if in fact we generate an error because we do
19768          not have a reloc for it, so tc_gen_reloc will reject it.  */
19769       fixP->fx_done = 1;
19770
19771       if (fixP->fx_addsy
19772           && ! S_IS_DEFINED (fixP->fx_addsy))
19773         {
19774           as_bad_where (fixP->fx_file, fixP->fx_line,
19775                         _("undefined symbol %s used as an immediate value"),
19776                         S_GET_NAME (fixP->fx_addsy));
19777           break;
19778         }
19779
19780       if (fixP->fx_addsy
19781           && S_GET_SEGMENT (fixP->fx_addsy) != seg)
19782         {
19783           as_bad_where (fixP->fx_file, fixP->fx_line,
19784                         _("symbol %s is in a different section"),
19785                         S_GET_NAME (fixP->fx_addsy));
19786           break;
19787         }
19788
19789       newimm = encode_arm_immediate (value);
19790       temp = md_chars_to_number (buf, INSN_SIZE);
19791
19792       /* If the instruction will fail, see if we can fix things up by
19793          changing the opcode.  */
19794       if (newimm == (unsigned int) FAIL
19795           && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
19796         {
19797           as_bad_where (fixP->fx_file, fixP->fx_line,
19798                         _("invalid constant (%lx) after fixup"),
19799                         (unsigned long) value);
19800           break;
19801         }
19802
19803       newimm |= (temp & 0xfffff000);
19804       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
19805       break;
19806
19807     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
19808       {
19809         unsigned int highpart = 0;
19810         unsigned int newinsn  = 0xe1a00000; /* nop.  */
19811
19812         if (fixP->fx_addsy
19813             && ! S_IS_DEFINED (fixP->fx_addsy))
19814           {
19815             as_bad_where (fixP->fx_file, fixP->fx_line,
19816                           _("undefined symbol %s used as an immediate value"),
19817                           S_GET_NAME (fixP->fx_addsy));
19818             break;
19819           }
19820
19821         if (fixP->fx_addsy
19822             && S_GET_SEGMENT (fixP->fx_addsy) != seg)
19823           {
19824             as_bad_where (fixP->fx_file, fixP->fx_line,
19825                           _("symbol %s is in a different section"),
19826                           S_GET_NAME (fixP->fx_addsy));
19827             break;
19828           }
19829
19830         newimm = encode_arm_immediate (value);
19831         temp = md_chars_to_number (buf, INSN_SIZE);
19832
19833         /* If the instruction will fail, see if we can fix things up by
19834            changing the opcode.  */
19835         if (newimm == (unsigned int) FAIL
19836             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
19837           {
19838             /* No ?  OK - try using two ADD instructions to generate
19839                the value.  */
19840             newimm = validate_immediate_twopart (value, & highpart);
19841
19842             /* Yes - then make sure that the second instruction is
19843                also an add.  */
19844             if (newimm != (unsigned int) FAIL)
19845               newinsn = temp;
19846             /* Still No ?  Try using a negated value.  */
19847             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
19848               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
19849             /* Otherwise - give up.  */
19850             else
19851               {
19852                 as_bad_where (fixP->fx_file, fixP->fx_line,
19853                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
19854                               (long) value);
19855                 break;
19856               }
19857
19858             /* Replace the first operand in the 2nd instruction (which
19859                is the PC) with the destination register.  We have
19860                already added in the PC in the first instruction and we
19861                do not want to do it again.  */
19862             newinsn &= ~ 0xf0000;
19863             newinsn |= ((newinsn & 0x0f000) << 4);
19864           }
19865
19866         newimm |= (temp & 0xfffff000);
19867         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
19868
19869         highpart |= (newinsn & 0xfffff000);
19870         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
19871       }
19872       break;
19873
19874     case BFD_RELOC_ARM_OFFSET_IMM:
19875       if (!fixP->fx_done && seg->use_rela_p)
19876         value = 0;
19877
19878     case BFD_RELOC_ARM_LITERAL:
19879       sign = value >= 0;
19880
19881       if (value < 0)
19882         value = - value;
19883
19884       if (validate_offset_imm (value, 0) == FAIL)
19885         {
19886           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
19887             as_bad_where (fixP->fx_file, fixP->fx_line,
19888                           _("invalid literal constant: pool needs to be closer"));
19889           else
19890             as_bad_where (fixP->fx_file, fixP->fx_line,
19891                           _("bad immediate value for offset (%ld)"),
19892                           (long) value);
19893           break;
19894         }
19895
19896       newval = md_chars_to_number (buf, INSN_SIZE);
19897       newval &= 0xff7ff000;
19898       newval |= value | (sign ? INDEX_UP : 0);
19899       md_number_to_chars (buf, newval, INSN_SIZE);
19900       break;
19901
19902     case BFD_RELOC_ARM_OFFSET_IMM8:
19903     case BFD_RELOC_ARM_HWLITERAL:
19904       sign = value >= 0;
19905
19906       if (value < 0)
19907         value = - value;
19908
19909       if (validate_offset_imm (value, 1) == FAIL)
19910         {
19911           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
19912             as_bad_where (fixP->fx_file, fixP->fx_line,
19913                           _("invalid literal constant: pool needs to be closer"));
19914           else
19915             as_bad (_("bad immediate value for 8-bit offset (%ld)"),
19916                     (long) value);
19917           break;
19918         }
19919
19920       newval = md_chars_to_number (buf, INSN_SIZE);
19921       newval &= 0xff7ff0f0;
19922       newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
19923       md_number_to_chars (buf, newval, INSN_SIZE);
19924       break;
19925
19926     case BFD_RELOC_ARM_T32_OFFSET_U8:
19927       if (value < 0 || value > 1020 || value % 4 != 0)
19928         as_bad_where (fixP->fx_file, fixP->fx_line,
19929                       _("bad immediate value for offset (%ld)"), (long) value);
19930       value /= 4;
19931
19932       newval = md_chars_to_number (buf+2, THUMB_SIZE);
19933       newval |= value;
19934       md_number_to_chars (buf+2, newval, THUMB_SIZE);
19935       break;
19936
19937     case BFD_RELOC_ARM_T32_OFFSET_IMM:
19938       /* This is a complicated relocation used for all varieties of Thumb32
19939          load/store instruction with immediate offset:
19940
19941          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
19942                                                    *4, optional writeback(W)
19943                                                    (doubleword load/store)
19944
19945          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
19946          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
19947          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
19948          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
19949          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
19950
19951          Uppercase letters indicate bits that are already encoded at
19952          this point.  Lowercase letters are our problem.  For the
19953          second block of instructions, the secondary opcode nybble
19954          (bits 8..11) is present, and bit 23 is zero, even if this is
19955          a PC-relative operation.  */
19956       newval = md_chars_to_number (buf, THUMB_SIZE);
19957       newval <<= 16;
19958       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
19959
19960       if ((newval & 0xf0000000) == 0xe0000000)
19961         {
19962           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
19963           if (value >= 0)
19964             newval |= (1 << 23);
19965           else
19966             value = -value;
19967           if (value % 4 != 0)
19968             {
19969               as_bad_where (fixP->fx_file, fixP->fx_line,
19970                             _("offset not a multiple of 4"));
19971               break;
19972             }
19973           value /= 4;
19974           if (value > 0xff)
19975             {
19976               as_bad_where (fixP->fx_file, fixP->fx_line,
19977                             _("offset out of range"));
19978               break;
19979             }
19980           newval &= ~0xff;
19981         }
19982       else if ((newval & 0x000f0000) == 0x000f0000)
19983         {
19984           /* PC-relative, 12-bit offset.  */
19985           if (value >= 0)
19986             newval |= (1 << 23);
19987           else
19988             value = -value;
19989           if (value > 0xfff)
19990             {
19991               as_bad_where (fixP->fx_file, fixP->fx_line,
19992                             _("offset out of range"));
19993               break;
19994             }
19995           newval &= ~0xfff;
19996         }
19997       else if ((newval & 0x00000100) == 0x00000100)
19998         {
19999           /* Writeback: 8-bit, +/- offset.  */
20000           if (value >= 0)
20001             newval |= (1 << 9);
20002           else
20003             value = -value;
20004           if (value > 0xff)
20005             {
20006               as_bad_where (fixP->fx_file, fixP->fx_line,
20007                             _("offset out of range"));
20008               break;
20009             }
20010           newval &= ~0xff;
20011         }
20012       else if ((newval & 0x00000f00) == 0x00000e00)
20013         {
20014           /* T-instruction: positive 8-bit offset.  */
20015           if (value < 0 || value > 0xff)
20016             {
20017               as_bad_where (fixP->fx_file, fixP->fx_line,
20018                             _("offset out of range"));
20019               break;
20020             }
20021           newval &= ~0xff;
20022           newval |= value;
20023         }
20024       else
20025         {
20026           /* Positive 12-bit or negative 8-bit offset.  */
20027           int limit;
20028           if (value >= 0)
20029             {
20030               newval |= (1 << 23);
20031               limit = 0xfff;
20032             }
20033           else
20034             {
20035               value = -value;
20036               limit = 0xff;
20037             }
20038           if (value > limit)
20039             {
20040               as_bad_where (fixP->fx_file, fixP->fx_line,
20041                             _("offset out of range"));
20042               break;
20043             }
20044           newval &= ~limit;
20045         }
20046
20047       newval |= value;
20048       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
20049       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
20050       break;
20051
20052     case BFD_RELOC_ARM_SHIFT_IMM:
20053       newval = md_chars_to_number (buf, INSN_SIZE);
20054       if (((unsigned long) value) > 32
20055           || (value == 32
20056               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
20057         {
20058           as_bad_where (fixP->fx_file, fixP->fx_line,
20059                         _("shift expression is too large"));
20060           break;
20061         }
20062
20063       if (value == 0)
20064         /* Shifts of zero must be done as lsl.  */
20065         newval &= ~0x60;
20066       else if (value == 32)
20067         value = 0;
20068       newval &= 0xfffff07f;
20069       newval |= (value & 0x1f) << 7;
20070       md_number_to_chars (buf, newval, INSN_SIZE);
20071       break;
20072
20073     case BFD_RELOC_ARM_T32_IMMEDIATE:
20074     case BFD_RELOC_ARM_T32_ADD_IMM:
20075     case BFD_RELOC_ARM_T32_IMM12:
20076     case BFD_RELOC_ARM_T32_ADD_PC12:
20077       /* We claim that this fixup has been processed here,
20078          even if in fact we generate an error because we do
20079          not have a reloc for it, so tc_gen_reloc will reject it.  */
20080       fixP->fx_done = 1;
20081
20082       if (fixP->fx_addsy
20083           && ! S_IS_DEFINED (fixP->fx_addsy))
20084         {
20085           as_bad_where (fixP->fx_file, fixP->fx_line,
20086                         _("undefined symbol %s used as an immediate value"),
20087                         S_GET_NAME (fixP->fx_addsy));
20088           break;
20089         }
20090
20091       newval = md_chars_to_number (buf, THUMB_SIZE);
20092       newval <<= 16;
20093       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
20094
20095       newimm = FAIL;
20096       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
20097           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
20098         {
20099           newimm = encode_thumb32_immediate (value);
20100           if (newimm == (unsigned int) FAIL)
20101             newimm = thumb32_negate_data_op (&newval, value);
20102         }
20103       if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
20104           && newimm == (unsigned int) FAIL)
20105         {
20106           /* Turn add/sum into addw/subw.  */
20107           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
20108             newval = (newval & 0xfeffffff) | 0x02000000;
20109
20110           /* 12 bit immediate for addw/subw.  */
20111           if (value < 0)
20112             {
20113               value = -value;
20114               newval ^= 0x00a00000;
20115             }
20116           if (value > 0xfff)
20117             newimm = (unsigned int) FAIL;
20118           else
20119             newimm = value;
20120         }
20121
20122       if (newimm == (unsigned int)FAIL)
20123         {
20124           as_bad_where (fixP->fx_file, fixP->fx_line,
20125                         _("invalid constant (%lx) after fixup"),
20126                         (unsigned long) value);
20127           break;
20128         }
20129
20130       newval |= (newimm & 0x800) << 15;
20131       newval |= (newimm & 0x700) << 4;
20132       newval |= (newimm & 0x0ff);
20133
20134       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
20135       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
20136       break;
20137
20138     case BFD_RELOC_ARM_SMC:
20139       if (((unsigned long) value) > 0xffff)
20140         as_bad_where (fixP->fx_file, fixP->fx_line,
20141                       _("invalid smc expression"));
20142       newval = md_chars_to_number (buf, INSN_SIZE);
20143       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
20144       md_number_to_chars (buf, newval, INSN_SIZE);
20145       break;
20146
20147     case BFD_RELOC_ARM_SWI:
20148       if (fixP->tc_fix_data != 0)
20149         {
20150           if (((unsigned long) value) > 0xff)
20151             as_bad_where (fixP->fx_file, fixP->fx_line,
20152                           _("invalid swi expression"));
20153           newval = md_chars_to_number (buf, THUMB_SIZE);
20154           newval |= value;
20155           md_number_to_chars (buf, newval, THUMB_SIZE);
20156         }
20157       else
20158         {
20159           if (((unsigned long) value) > 0x00ffffff)
20160             as_bad_where (fixP->fx_file, fixP->fx_line,
20161                           _("invalid swi expression"));
20162           newval = md_chars_to_number (buf, INSN_SIZE);
20163           newval |= value;
20164           md_number_to_chars (buf, newval, INSN_SIZE);
20165         }
20166       break;
20167
20168     case BFD_RELOC_ARM_MULTI:
20169       if (((unsigned long) value) > 0xffff)
20170         as_bad_where (fixP->fx_file, fixP->fx_line,
20171                       _("invalid expression in load/store multiple"));
20172       newval = value | md_chars_to_number (buf, INSN_SIZE);
20173       md_number_to_chars (buf, newval, INSN_SIZE);
20174       break;
20175
20176 #ifdef OBJ_ELF
20177     case BFD_RELOC_ARM_PCREL_CALL:
20178
20179       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20180           && fixP->fx_addsy
20181           && !S_IS_EXTERNAL (fixP->fx_addsy)
20182           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20183           && THUMB_IS_FUNC (fixP->fx_addsy))
20184         /* Flip the bl to blx. This is a simple flip
20185            bit here because we generate PCREL_CALL for
20186            unconditional bls.  */
20187         {
20188           newval = md_chars_to_number (buf, INSN_SIZE);
20189           newval = newval | 0x10000000;
20190           md_number_to_chars (buf, newval, INSN_SIZE);
20191           temp = 1;
20192           fixP->fx_done = 1;
20193         }
20194       else
20195         temp = 3;
20196       goto arm_branch_common;
20197
20198     case BFD_RELOC_ARM_PCREL_JUMP:
20199       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20200           && fixP->fx_addsy
20201           && !S_IS_EXTERNAL (fixP->fx_addsy)
20202           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20203           && THUMB_IS_FUNC (fixP->fx_addsy))
20204         {
20205           /* This would map to a bl<cond>, b<cond>,
20206              b<always> to a Thumb function. We
20207              need to force a relocation for this particular
20208              case.  */
20209           newval = md_chars_to_number (buf, INSN_SIZE);
20210           fixP->fx_done = 0;
20211         }
20212
20213     case BFD_RELOC_ARM_PLT32:
20214 #endif
20215     case BFD_RELOC_ARM_PCREL_BRANCH:
20216       temp = 3;
20217       goto arm_branch_common;
20218
20219     case BFD_RELOC_ARM_PCREL_BLX:
20220
20221       temp = 1;
20222       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20223           && fixP->fx_addsy
20224           && !S_IS_EXTERNAL (fixP->fx_addsy)
20225           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20226           && ARM_IS_FUNC (fixP->fx_addsy))
20227         {
20228           /* Flip the blx to a bl and warn.  */
20229           const char *name = S_GET_NAME (fixP->fx_addsy);
20230           newval = 0xeb000000;
20231           as_warn_where (fixP->fx_file, fixP->fx_line,
20232                          _("blx to '%s' an ARM ISA state function changed to bl"),
20233                           name);
20234           md_number_to_chars (buf, newval, INSN_SIZE);
20235           temp = 3;
20236           fixP->fx_done = 1;
20237         }
20238
20239 #ifdef OBJ_ELF
20240        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
20241          fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
20242 #endif
20243
20244     arm_branch_common:
20245       /* We are going to store value (shifted right by two) in the
20246          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
20247          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
20248          also be be clear.  */
20249       if (value & temp)
20250         as_bad_where (fixP->fx_file, fixP->fx_line,
20251                       _("misaligned branch destination"));
20252       if ((value & (offsetT)0xfe000000) != (offsetT)0
20253           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
20254         as_bad_where (fixP->fx_file, fixP->fx_line,
20255                       _("branch out of range"));
20256
20257       if (fixP->fx_done || !seg->use_rela_p)
20258         {
20259           newval = md_chars_to_number (buf, INSN_SIZE);
20260           newval |= (value >> 2) & 0x00ffffff;
20261           /* Set the H bit on BLX instructions.  */
20262           if (temp == 1)
20263             {
20264               if (value & 2)
20265                 newval |= 0x01000000;
20266               else
20267                 newval &= ~0x01000000;
20268             }
20269           md_number_to_chars (buf, newval, INSN_SIZE);
20270         }
20271       break;
20272
20273     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
20274       /* CBZ can only branch forward.  */
20275
20276       /* Attempts to use CBZ to branch to the next instruction
20277          (which, strictly speaking, are prohibited) will be turned into
20278          no-ops.
20279
20280          FIXME: It may be better to remove the instruction completely and
20281          perform relaxation.  */
20282       if (value == -2)
20283         {
20284           newval = md_chars_to_number (buf, THUMB_SIZE);
20285           newval = 0xbf00; /* NOP encoding T1 */
20286           md_number_to_chars (buf, newval, THUMB_SIZE);
20287         }
20288       else
20289         {
20290           if (value & ~0x7e)
20291             as_bad_where (fixP->fx_file, fixP->fx_line,
20292                           _("branch out of range"));
20293
20294           if (fixP->fx_done || !seg->use_rela_p)
20295             {
20296               newval = md_chars_to_number (buf, THUMB_SIZE);
20297               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
20298               md_number_to_chars (buf, newval, THUMB_SIZE);
20299             }
20300         }
20301       break;
20302
20303     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
20304       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
20305         as_bad_where (fixP->fx_file, fixP->fx_line,
20306                       _("branch out of range"));
20307
20308       if (fixP->fx_done || !seg->use_rela_p)
20309         {
20310           newval = md_chars_to_number (buf, THUMB_SIZE);
20311           newval |= (value & 0x1ff) >> 1;
20312           md_number_to_chars (buf, newval, THUMB_SIZE);
20313         }
20314       break;
20315
20316     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
20317       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
20318         as_bad_where (fixP->fx_file, fixP->fx_line,
20319                       _("branch out of range"));
20320
20321       if (fixP->fx_done || !seg->use_rela_p)
20322         {
20323           newval = md_chars_to_number (buf, THUMB_SIZE);
20324           newval |= (value & 0xfff) >> 1;
20325           md_number_to_chars (buf, newval, THUMB_SIZE);
20326         }
20327       break;
20328
20329     case BFD_RELOC_THUMB_PCREL_BRANCH20:
20330       if (fixP->fx_addsy
20331           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20332           && !S_IS_EXTERNAL (fixP->fx_addsy)
20333           && S_IS_DEFINED (fixP->fx_addsy)
20334           && ARM_IS_FUNC (fixP->fx_addsy)
20335           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20336         {
20337           /* Force a relocation for a branch 20 bits wide.  */
20338           fixP->fx_done = 0;
20339         }
20340       if ((value & ~0x1fffff) && ((value & ~0x1fffff) != ~0x1fffff))
20341         as_bad_where (fixP->fx_file, fixP->fx_line,
20342                       _("conditional branch out of range"));
20343
20344       if (fixP->fx_done || !seg->use_rela_p)
20345         {
20346           offsetT newval2;
20347           addressT S, J1, J2, lo, hi;
20348
20349           S  = (value & 0x00100000) >> 20;
20350           J2 = (value & 0x00080000) >> 19;
20351           J1 = (value & 0x00040000) >> 18;
20352           hi = (value & 0x0003f000) >> 12;
20353           lo = (value & 0x00000ffe) >> 1;
20354
20355           newval   = md_chars_to_number (buf, THUMB_SIZE);
20356           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20357           newval  |= (S << 10) | hi;
20358           newval2 |= (J1 << 13) | (J2 << 11) | lo;
20359           md_number_to_chars (buf, newval, THUMB_SIZE);
20360           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
20361         }
20362       break;
20363
20364     case BFD_RELOC_THUMB_PCREL_BLX:
20365
20366       /* If there is a blx from a thumb state function to
20367          another thumb function flip this to a bl and warn
20368          about it.  */
20369
20370       if (fixP->fx_addsy
20371           && S_IS_DEFINED (fixP->fx_addsy)
20372           && !S_IS_EXTERNAL (fixP->fx_addsy)
20373           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20374           && THUMB_IS_FUNC (fixP->fx_addsy))
20375         {
20376           const char *name = S_GET_NAME (fixP->fx_addsy);
20377           as_warn_where (fixP->fx_file, fixP->fx_line,
20378                          _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
20379                          name);
20380           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20381           newval = newval | 0x1000;
20382           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
20383           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
20384           fixP->fx_done = 1;
20385         }
20386
20387
20388       goto thumb_bl_common;
20389
20390     case BFD_RELOC_THUMB_PCREL_BRANCH23:
20391
20392       /* A bl from Thumb state ISA to an internal ARM state function
20393          is converted to a blx.  */
20394       if (fixP->fx_addsy
20395           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20396           && !S_IS_EXTERNAL (fixP->fx_addsy)
20397           && S_IS_DEFINED (fixP->fx_addsy)
20398           && ARM_IS_FUNC (fixP->fx_addsy)
20399           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20400         {
20401           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20402           newval = newval & ~0x1000;
20403           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
20404           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
20405           fixP->fx_done = 1;
20406         }
20407
20408     thumb_bl_common:
20409
20410 #ifdef OBJ_ELF
20411        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4 &&
20412            fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
20413          fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
20414 #endif
20415
20416       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
20417         /* For a BLX instruction, make sure that the relocation is rounded up
20418            to a word boundary.  This follows the semantics of the instruction
20419            which specifies that bit 1 of the target address will come from bit
20420            1 of the base address.  */
20421         value = (value + 1) & ~ 1;
20422
20423
20424        if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
20425         {
20426           if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
20427             {
20428               as_bad_where (fixP->fx_file, fixP->fx_line,
20429                             _("branch out of range"));
20430             }
20431           else if ((value & ~0x1ffffff)
20432                    && ((value & ~0x1ffffff) != ~0x1ffffff))
20433               {
20434                 as_bad_where (fixP->fx_file, fixP->fx_line,
20435                             _("Thumb2 branch out of range"));
20436               }
20437         }
20438
20439       if (fixP->fx_done || !seg->use_rela_p)
20440         encode_thumb2_b_bl_offset (buf, value);
20441
20442       break;
20443
20444     case BFD_RELOC_THUMB_PCREL_BRANCH25:
20445       if ((value & ~0x1ffffff) && ((value & ~0x1ffffff) != ~0x1ffffff))
20446         as_bad_where (fixP->fx_file, fixP->fx_line,
20447                       _("branch out of range"));
20448
20449       if (fixP->fx_done || !seg->use_rela_p)
20450           encode_thumb2_b_bl_offset (buf, value);
20451
20452       break;
20453
20454     case BFD_RELOC_8:
20455       if (fixP->fx_done || !seg->use_rela_p)
20456         md_number_to_chars (buf, value, 1);
20457       break;
20458
20459     case BFD_RELOC_16:
20460       if (fixP->fx_done || !seg->use_rela_p)
20461         md_number_to_chars (buf, value, 2);
20462       break;
20463
20464 #ifdef OBJ_ELF
20465     case BFD_RELOC_ARM_TLS_GD32:
20466     case BFD_RELOC_ARM_TLS_LE32:
20467     case BFD_RELOC_ARM_TLS_IE32:
20468     case BFD_RELOC_ARM_TLS_LDM32:
20469     case BFD_RELOC_ARM_TLS_LDO32:
20470       S_SET_THREAD_LOCAL (fixP->fx_addsy);
20471       /* fall through */
20472
20473     case BFD_RELOC_ARM_GOT32:
20474     case BFD_RELOC_ARM_GOTOFF:
20475       if (fixP->fx_done || !seg->use_rela_p)
20476         md_number_to_chars (buf, 0, 4);
20477       break;
20478       
20479     case BFD_RELOC_ARM_TARGET2:
20480       /* TARGET2 is not partial-inplace, so we need to write the
20481          addend here for REL targets, because it won't be written out
20482          during reloc processing later.  */
20483       if (fixP->fx_done || !seg->use_rela_p)
20484         md_number_to_chars (buf, fixP->fx_offset, 4);
20485       break;
20486 #endif
20487
20488     case BFD_RELOC_RVA:
20489     case BFD_RELOC_32:
20490     case BFD_RELOC_ARM_TARGET1:
20491     case BFD_RELOC_ARM_ROSEGREL32:
20492     case BFD_RELOC_ARM_SBREL32:
20493     case BFD_RELOC_32_PCREL:
20494 #ifdef TE_PE
20495     case BFD_RELOC_32_SECREL:
20496 #endif
20497       if (fixP->fx_done || !seg->use_rela_p)
20498 #ifdef TE_WINCE
20499         /* For WinCE we only do this for pcrel fixups.  */
20500         if (fixP->fx_done || fixP->fx_pcrel)
20501 #endif
20502           md_number_to_chars (buf, value, 4);
20503       break;
20504
20505 #ifdef OBJ_ELF
20506     case BFD_RELOC_ARM_PREL31:
20507       if (fixP->fx_done || !seg->use_rela_p)
20508         {
20509           newval = md_chars_to_number (buf, 4) & 0x80000000;
20510           if ((value ^ (value >> 1)) & 0x40000000)
20511             {
20512               as_bad_where (fixP->fx_file, fixP->fx_line,
20513                             _("rel31 relocation overflow"));
20514             }
20515           newval |= value & 0x7fffffff;
20516           md_number_to_chars (buf, newval, 4);
20517         }
20518       break;
20519 #endif
20520
20521     case BFD_RELOC_ARM_CP_OFF_IMM:
20522     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
20523       if (value < -1023 || value > 1023 || (value & 3))
20524         as_bad_where (fixP->fx_file, fixP->fx_line,
20525                       _("co-processor offset out of range"));
20526     cp_off_common:
20527       sign = value >= 0;
20528       if (value < 0)
20529         value = -value;
20530       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
20531           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
20532         newval = md_chars_to_number (buf, INSN_SIZE);
20533       else
20534         newval = get_thumb32_insn (buf);
20535       newval &= 0xff7fff00;
20536       newval |= (value >> 2) | (sign ? INDEX_UP : 0);
20537       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
20538           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
20539         md_number_to_chars (buf, newval, INSN_SIZE);
20540       else
20541         put_thumb32_insn (buf, newval);
20542       break;
20543
20544     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
20545     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
20546       if (value < -255 || value > 255)
20547         as_bad_where (fixP->fx_file, fixP->fx_line,
20548                       _("co-processor offset out of range"));
20549       value *= 4;
20550       goto cp_off_common;
20551
20552     case BFD_RELOC_ARM_THUMB_OFFSET:
20553       newval = md_chars_to_number (buf, THUMB_SIZE);
20554       /* Exactly what ranges, and where the offset is inserted depends
20555          on the type of instruction, we can establish this from the
20556          top 4 bits.  */
20557       switch (newval >> 12)
20558         {
20559         case 4: /* PC load.  */
20560           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
20561              forced to zero for these loads; md_pcrel_from has already
20562              compensated for this.  */
20563           if (value & 3)
20564             as_bad_where (fixP->fx_file, fixP->fx_line,
20565                           _("invalid offset, target not word aligned (0x%08lX)"),
20566                           (((unsigned long) fixP->fx_frag->fr_address
20567                             + (unsigned long) fixP->fx_where) & ~3)
20568                           + (unsigned long) value);
20569
20570           if (value & ~0x3fc)
20571             as_bad_where (fixP->fx_file, fixP->fx_line,
20572                           _("invalid offset, value too big (0x%08lX)"),
20573                           (long) value);
20574
20575           newval |= value >> 2;
20576           break;
20577
20578         case 9: /* SP load/store.  */
20579           if (value & ~0x3fc)
20580             as_bad_where (fixP->fx_file, fixP->fx_line,
20581                           _("invalid offset, value too big (0x%08lX)"),
20582                           (long) value);
20583           newval |= value >> 2;
20584           break;
20585
20586         case 6: /* Word load/store.  */
20587           if (value & ~0x7c)
20588             as_bad_where (fixP->fx_file, fixP->fx_line,
20589                           _("invalid offset, value too big (0x%08lX)"),
20590                           (long) value);
20591           newval |= value << 4; /* 6 - 2.  */
20592           break;
20593
20594         case 7: /* Byte load/store.  */
20595           if (value & ~0x1f)
20596             as_bad_where (fixP->fx_file, fixP->fx_line,
20597                           _("invalid offset, value too big (0x%08lX)"),
20598                           (long) value);
20599           newval |= value << 6;
20600           break;
20601
20602         case 8: /* Halfword load/store.  */
20603           if (value & ~0x3e)
20604             as_bad_where (fixP->fx_file, fixP->fx_line,
20605                           _("invalid offset, value too big (0x%08lX)"),
20606                           (long) value);
20607           newval |= value << 5; /* 6 - 1.  */
20608           break;
20609
20610         default:
20611           as_bad_where (fixP->fx_file, fixP->fx_line,
20612                         "Unable to process relocation for thumb opcode: %lx",
20613                         (unsigned long) newval);
20614           break;
20615         }
20616       md_number_to_chars (buf, newval, THUMB_SIZE);
20617       break;
20618
20619     case BFD_RELOC_ARM_THUMB_ADD:
20620       /* This is a complicated relocation, since we use it for all of
20621          the following immediate relocations:
20622
20623             3bit ADD/SUB
20624             8bit ADD/SUB
20625             9bit ADD/SUB SP word-aligned
20626            10bit ADD PC/SP word-aligned
20627
20628          The type of instruction being processed is encoded in the
20629          instruction field:
20630
20631            0x8000  SUB
20632            0x00F0  Rd
20633            0x000F  Rs
20634       */
20635       newval = md_chars_to_number (buf, THUMB_SIZE);
20636       {
20637         int rd = (newval >> 4) & 0xf;
20638         int rs = newval & 0xf;
20639         int subtract = !!(newval & 0x8000);
20640
20641         /* Check for HI regs, only very restricted cases allowed:
20642            Adjusting SP, and using PC or SP to get an address.  */
20643         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
20644             || (rs > 7 && rs != REG_SP && rs != REG_PC))
20645           as_bad_where (fixP->fx_file, fixP->fx_line,
20646                         _("invalid Hi register with immediate"));
20647
20648         /* If value is negative, choose the opposite instruction.  */
20649         if (value < 0)
20650           {
20651             value = -value;
20652             subtract = !subtract;
20653             if (value < 0)
20654               as_bad_where (fixP->fx_file, fixP->fx_line,
20655                             _("immediate value out of range"));
20656           }
20657
20658         if (rd == REG_SP)
20659           {
20660             if (value & ~0x1fc)
20661               as_bad_where (fixP->fx_file, fixP->fx_line,
20662                             _("invalid immediate for stack address calculation"));
20663             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
20664             newval |= value >> 2;
20665           }
20666         else if (rs == REG_PC || rs == REG_SP)
20667           {
20668             if (subtract || value & ~0x3fc)
20669               as_bad_where (fixP->fx_file, fixP->fx_line,
20670                             _("invalid immediate for address calculation (value = 0x%08lX)"),
20671                             (unsigned long) value);
20672             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
20673             newval |= rd << 8;
20674             newval |= value >> 2;
20675           }
20676         else if (rs == rd)
20677           {
20678             if (value & ~0xff)
20679               as_bad_where (fixP->fx_file, fixP->fx_line,
20680                             _("immediate value out of range"));
20681             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
20682             newval |= (rd << 8) | value;
20683           }
20684         else
20685           {
20686             if (value & ~0x7)
20687               as_bad_where (fixP->fx_file, fixP->fx_line,
20688                             _("immediate value out of range"));
20689             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
20690             newval |= rd | (rs << 3) | (value << 6);
20691           }
20692       }
20693       md_number_to_chars (buf, newval, THUMB_SIZE);
20694       break;
20695
20696     case BFD_RELOC_ARM_THUMB_IMM:
20697       newval = md_chars_to_number (buf, THUMB_SIZE);
20698       if (value < 0 || value > 255)
20699         as_bad_where (fixP->fx_file, fixP->fx_line,
20700                       _("invalid immediate: %ld is out of range"),
20701                       (long) value);
20702       newval |= value;
20703       md_number_to_chars (buf, newval, THUMB_SIZE);
20704       break;
20705
20706     case BFD_RELOC_ARM_THUMB_SHIFT:
20707       /* 5bit shift value (0..32).  LSL cannot take 32.  */
20708       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
20709       temp = newval & 0xf800;
20710       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
20711         as_bad_where (fixP->fx_file, fixP->fx_line,
20712                       _("invalid shift value: %ld"), (long) value);
20713       /* Shifts of zero must be encoded as LSL.  */
20714       if (value == 0)
20715         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
20716       /* Shifts of 32 are encoded as zero.  */
20717       else if (value == 32)
20718         value = 0;
20719       newval |= value << 6;
20720       md_number_to_chars (buf, newval, THUMB_SIZE);
20721       break;
20722
20723     case BFD_RELOC_VTABLE_INHERIT:
20724     case BFD_RELOC_VTABLE_ENTRY:
20725       fixP->fx_done = 0;
20726       return;
20727
20728     case BFD_RELOC_ARM_MOVW:
20729     case BFD_RELOC_ARM_MOVT:
20730     case BFD_RELOC_ARM_THUMB_MOVW:
20731     case BFD_RELOC_ARM_THUMB_MOVT:
20732       if (fixP->fx_done || !seg->use_rela_p)
20733         {
20734           /* REL format relocations are limited to a 16-bit addend.  */
20735           if (!fixP->fx_done)
20736             {
20737               if (value < -0x8000 || value > 0x7fff)
20738                   as_bad_where (fixP->fx_file, fixP->fx_line,
20739                                 _("offset out of range"));
20740             }
20741           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
20742                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
20743             {
20744               value >>= 16;
20745             }
20746
20747           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
20748               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
20749             {
20750               newval = get_thumb32_insn (buf);
20751               newval &= 0xfbf08f00;
20752               newval |= (value & 0xf000) << 4;
20753               newval |= (value & 0x0800) << 15;
20754               newval |= (value & 0x0700) << 4;
20755               newval |= (value & 0x00ff);
20756               put_thumb32_insn (buf, newval);
20757             }
20758           else
20759             {
20760               newval = md_chars_to_number (buf, 4);
20761               newval &= 0xfff0f000;
20762               newval |= value & 0x0fff;
20763               newval |= (value & 0xf000) << 4;
20764               md_number_to_chars (buf, newval, 4);
20765             }
20766         }
20767       return;
20768
20769    case BFD_RELOC_ARM_ALU_PC_G0_NC:
20770    case BFD_RELOC_ARM_ALU_PC_G0:
20771    case BFD_RELOC_ARM_ALU_PC_G1_NC:
20772    case BFD_RELOC_ARM_ALU_PC_G1:
20773    case BFD_RELOC_ARM_ALU_PC_G2:
20774    case BFD_RELOC_ARM_ALU_SB_G0_NC:
20775    case BFD_RELOC_ARM_ALU_SB_G0:
20776    case BFD_RELOC_ARM_ALU_SB_G1_NC:
20777    case BFD_RELOC_ARM_ALU_SB_G1:
20778    case BFD_RELOC_ARM_ALU_SB_G2:
20779      gas_assert (!fixP->fx_done);
20780      if (!seg->use_rela_p)
20781        {
20782          bfd_vma insn;
20783          bfd_vma encoded_addend;
20784          bfd_vma addend_abs = abs (value);
20785
20786          /* Check that the absolute value of the addend can be
20787             expressed as an 8-bit constant plus a rotation.  */
20788          encoded_addend = encode_arm_immediate (addend_abs);
20789          if (encoded_addend == (unsigned int) FAIL)
20790            as_bad_where (fixP->fx_file, fixP->fx_line,
20791                          _("the offset 0x%08lX is not representable"),
20792                          (unsigned long) addend_abs);
20793
20794          /* Extract the instruction.  */
20795          insn = md_chars_to_number (buf, INSN_SIZE);
20796
20797          /* If the addend is positive, use an ADD instruction.
20798             Otherwise use a SUB.  Take care not to destroy the S bit.  */
20799          insn &= 0xff1fffff;
20800          if (value < 0)
20801            insn |= 1 << 22;
20802          else
20803            insn |= 1 << 23;
20804
20805          /* Place the encoded addend into the first 12 bits of the
20806             instruction.  */
20807          insn &= 0xfffff000;
20808          insn |= encoded_addend;
20809
20810          /* Update the instruction.  */
20811          md_number_to_chars (buf, insn, INSN_SIZE);
20812        }
20813      break;
20814
20815     case BFD_RELOC_ARM_LDR_PC_G0:
20816     case BFD_RELOC_ARM_LDR_PC_G1:
20817     case BFD_RELOC_ARM_LDR_PC_G2:
20818     case BFD_RELOC_ARM_LDR_SB_G0:
20819     case BFD_RELOC_ARM_LDR_SB_G1:
20820     case BFD_RELOC_ARM_LDR_SB_G2:
20821       gas_assert (!fixP->fx_done);
20822       if (!seg->use_rela_p)
20823         {
20824           bfd_vma insn;
20825           bfd_vma addend_abs = abs (value);
20826
20827           /* Check that the absolute value of the addend can be
20828              encoded in 12 bits.  */
20829           if (addend_abs >= 0x1000)
20830             as_bad_where (fixP->fx_file, fixP->fx_line,
20831                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
20832                           (unsigned long) addend_abs);
20833
20834           /* Extract the instruction.  */
20835           insn = md_chars_to_number (buf, INSN_SIZE);
20836
20837           /* If the addend is negative, clear bit 23 of the instruction.
20838              Otherwise set it.  */
20839           if (value < 0)
20840             insn &= ~(1 << 23);
20841           else
20842             insn |= 1 << 23;
20843
20844           /* Place the absolute value of the addend into the first 12 bits
20845              of the instruction.  */
20846           insn &= 0xfffff000;
20847           insn |= addend_abs;
20848
20849           /* Update the instruction.  */
20850           md_number_to_chars (buf, insn, INSN_SIZE);
20851         }
20852       break;
20853
20854     case BFD_RELOC_ARM_LDRS_PC_G0:
20855     case BFD_RELOC_ARM_LDRS_PC_G1:
20856     case BFD_RELOC_ARM_LDRS_PC_G2:
20857     case BFD_RELOC_ARM_LDRS_SB_G0:
20858     case BFD_RELOC_ARM_LDRS_SB_G1:
20859     case BFD_RELOC_ARM_LDRS_SB_G2:
20860       gas_assert (!fixP->fx_done);
20861       if (!seg->use_rela_p)
20862         {
20863           bfd_vma insn;
20864           bfd_vma addend_abs = abs (value);
20865
20866           /* Check that the absolute value of the addend can be
20867              encoded in 8 bits.  */
20868           if (addend_abs >= 0x100)
20869             as_bad_where (fixP->fx_file, fixP->fx_line,
20870                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
20871                           (unsigned long) addend_abs);
20872
20873           /* Extract the instruction.  */
20874           insn = md_chars_to_number (buf, INSN_SIZE);
20875
20876           /* If the addend is negative, clear bit 23 of the instruction.
20877              Otherwise set it.  */
20878           if (value < 0)
20879             insn &= ~(1 << 23);
20880           else
20881             insn |= 1 << 23;
20882
20883           /* Place the first four bits of the absolute value of the addend
20884              into the first 4 bits of the instruction, and the remaining
20885              four into bits 8 .. 11.  */
20886           insn &= 0xfffff0f0;
20887           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
20888
20889           /* Update the instruction.  */
20890           md_number_to_chars (buf, insn, INSN_SIZE);
20891         }
20892       break;
20893
20894     case BFD_RELOC_ARM_LDC_PC_G0:
20895     case BFD_RELOC_ARM_LDC_PC_G1:
20896     case BFD_RELOC_ARM_LDC_PC_G2:
20897     case BFD_RELOC_ARM_LDC_SB_G0:
20898     case BFD_RELOC_ARM_LDC_SB_G1:
20899     case BFD_RELOC_ARM_LDC_SB_G2:
20900       gas_assert (!fixP->fx_done);
20901       if (!seg->use_rela_p)
20902         {
20903           bfd_vma insn;
20904           bfd_vma addend_abs = abs (value);
20905
20906           /* Check that the absolute value of the addend is a multiple of
20907              four and, when divided by four, fits in 8 bits.  */
20908           if (addend_abs & 0x3)
20909             as_bad_where (fixP->fx_file, fixP->fx_line,
20910                           _("bad offset 0x%08lX (must be word-aligned)"),
20911                           (unsigned long) addend_abs);
20912
20913           if ((addend_abs >> 2) > 0xff)
20914             as_bad_where (fixP->fx_file, fixP->fx_line,
20915                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
20916                           (unsigned long) addend_abs);
20917
20918           /* Extract the instruction.  */
20919           insn = md_chars_to_number (buf, INSN_SIZE);
20920
20921           /* If the addend is negative, clear bit 23 of the instruction.
20922              Otherwise set it.  */
20923           if (value < 0)
20924             insn &= ~(1 << 23);
20925           else
20926             insn |= 1 << 23;
20927
20928           /* Place the addend (divided by four) into the first eight
20929              bits of the instruction.  */
20930           insn &= 0xfffffff0;
20931           insn |= addend_abs >> 2;
20932
20933           /* Update the instruction.  */
20934           md_number_to_chars (buf, insn, INSN_SIZE);
20935         }
20936       break;
20937
20938     case BFD_RELOC_ARM_V4BX:
20939       /* This will need to go in the object file.  */
20940       fixP->fx_done = 0;
20941       break;
20942
20943     case BFD_RELOC_UNUSED:
20944     default:
20945       as_bad_where (fixP->fx_file, fixP->fx_line,
20946                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
20947     }
20948 }
20949
20950 /* Translate internal representation of relocation info to BFD target
20951    format.  */
20952
20953 arelent *
20954 tc_gen_reloc (asection *section, fixS *fixp)
20955 {
20956   arelent * reloc;
20957   bfd_reloc_code_real_type code;
20958
20959   reloc = (arelent *) xmalloc (sizeof (arelent));
20960
20961   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
20962   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
20963   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
20964
20965   if (fixp->fx_pcrel)
20966     {
20967       if (section->use_rela_p)
20968         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
20969       else
20970         fixp->fx_offset = reloc->address;
20971     }
20972   reloc->addend = fixp->fx_offset;
20973
20974   switch (fixp->fx_r_type)
20975     {
20976     case BFD_RELOC_8:
20977       if (fixp->fx_pcrel)
20978         {
20979           code = BFD_RELOC_8_PCREL;
20980           break;
20981         }
20982
20983     case BFD_RELOC_16:
20984       if (fixp->fx_pcrel)
20985         {
20986           code = BFD_RELOC_16_PCREL;
20987           break;
20988         }
20989
20990     case BFD_RELOC_32:
20991       if (fixp->fx_pcrel)
20992         {
20993           code = BFD_RELOC_32_PCREL;
20994           break;
20995         }
20996
20997     case BFD_RELOC_ARM_MOVW:
20998       if (fixp->fx_pcrel)
20999         {
21000           code = BFD_RELOC_ARM_MOVW_PCREL;
21001           break;
21002         }
21003
21004     case BFD_RELOC_ARM_MOVT:
21005       if (fixp->fx_pcrel)
21006         {
21007           code = BFD_RELOC_ARM_MOVT_PCREL;
21008           break;
21009         }
21010
21011     case BFD_RELOC_ARM_THUMB_MOVW:
21012       if (fixp->fx_pcrel)
21013         {
21014           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
21015           break;
21016         }
21017
21018     case BFD_RELOC_ARM_THUMB_MOVT:
21019       if (fixp->fx_pcrel)
21020         {
21021           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
21022           break;
21023         }
21024
21025     case BFD_RELOC_NONE:
21026     case BFD_RELOC_ARM_PCREL_BRANCH:
21027     case BFD_RELOC_ARM_PCREL_BLX:
21028     case BFD_RELOC_RVA:
21029     case BFD_RELOC_THUMB_PCREL_BRANCH7:
21030     case BFD_RELOC_THUMB_PCREL_BRANCH9:
21031     case BFD_RELOC_THUMB_PCREL_BRANCH12:
21032     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21033     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21034     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21035     case BFD_RELOC_VTABLE_ENTRY:
21036     case BFD_RELOC_VTABLE_INHERIT:
21037 #ifdef TE_PE
21038     case BFD_RELOC_32_SECREL:
21039 #endif
21040       code = fixp->fx_r_type;
21041       break;
21042
21043     case BFD_RELOC_THUMB_PCREL_BLX:
21044 #ifdef OBJ_ELF
21045       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
21046         code = BFD_RELOC_THUMB_PCREL_BRANCH23;
21047       else
21048 #endif
21049         code = BFD_RELOC_THUMB_PCREL_BLX;
21050       break;
21051
21052     case BFD_RELOC_ARM_LITERAL:
21053     case BFD_RELOC_ARM_HWLITERAL:
21054       /* If this is called then the a literal has
21055          been referenced across a section boundary.  */
21056       as_bad_where (fixp->fx_file, fixp->fx_line,
21057                     _("literal referenced across section boundary"));
21058       return NULL;
21059
21060 #ifdef OBJ_ELF
21061     case BFD_RELOC_ARM_GOT32:
21062     case BFD_RELOC_ARM_GOTOFF:
21063     case BFD_RELOC_ARM_PLT32:
21064     case BFD_RELOC_ARM_TARGET1:
21065     case BFD_RELOC_ARM_ROSEGREL32:
21066     case BFD_RELOC_ARM_SBREL32:
21067     case BFD_RELOC_ARM_PREL31:
21068     case BFD_RELOC_ARM_TARGET2:
21069     case BFD_RELOC_ARM_TLS_LE32:
21070     case BFD_RELOC_ARM_TLS_LDO32:
21071     case BFD_RELOC_ARM_PCREL_CALL:
21072     case BFD_RELOC_ARM_PCREL_JUMP:
21073     case BFD_RELOC_ARM_ALU_PC_G0_NC:
21074     case BFD_RELOC_ARM_ALU_PC_G0:
21075     case BFD_RELOC_ARM_ALU_PC_G1_NC:
21076     case BFD_RELOC_ARM_ALU_PC_G1:
21077     case BFD_RELOC_ARM_ALU_PC_G2:
21078     case BFD_RELOC_ARM_LDR_PC_G0:
21079     case BFD_RELOC_ARM_LDR_PC_G1:
21080     case BFD_RELOC_ARM_LDR_PC_G2:
21081     case BFD_RELOC_ARM_LDRS_PC_G0:
21082     case BFD_RELOC_ARM_LDRS_PC_G1:
21083     case BFD_RELOC_ARM_LDRS_PC_G2:
21084     case BFD_RELOC_ARM_LDC_PC_G0:
21085     case BFD_RELOC_ARM_LDC_PC_G1:
21086     case BFD_RELOC_ARM_LDC_PC_G2:
21087     case BFD_RELOC_ARM_ALU_SB_G0_NC:
21088     case BFD_RELOC_ARM_ALU_SB_G0:
21089     case BFD_RELOC_ARM_ALU_SB_G1_NC:
21090     case BFD_RELOC_ARM_ALU_SB_G1:
21091     case BFD_RELOC_ARM_ALU_SB_G2:
21092     case BFD_RELOC_ARM_LDR_SB_G0:
21093     case BFD_RELOC_ARM_LDR_SB_G1:
21094     case BFD_RELOC_ARM_LDR_SB_G2:
21095     case BFD_RELOC_ARM_LDRS_SB_G0:
21096     case BFD_RELOC_ARM_LDRS_SB_G1:
21097     case BFD_RELOC_ARM_LDRS_SB_G2:
21098     case BFD_RELOC_ARM_LDC_SB_G0:
21099     case BFD_RELOC_ARM_LDC_SB_G1:
21100     case BFD_RELOC_ARM_LDC_SB_G2:
21101     case BFD_RELOC_ARM_V4BX:
21102       code = fixp->fx_r_type;
21103       break;
21104
21105     case BFD_RELOC_ARM_TLS_GD32:
21106     case BFD_RELOC_ARM_TLS_IE32:
21107     case BFD_RELOC_ARM_TLS_LDM32:
21108       /* BFD will include the symbol's address in the addend.
21109          But we don't want that, so subtract it out again here.  */
21110       if (!S_IS_COMMON (fixp->fx_addsy))
21111         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
21112       code = fixp->fx_r_type;
21113       break;
21114 #endif
21115
21116     case BFD_RELOC_ARM_IMMEDIATE:
21117       as_bad_where (fixp->fx_file, fixp->fx_line,
21118                     _("internal relocation (type: IMMEDIATE) not fixed up"));
21119       return NULL;
21120
21121     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21122       as_bad_where (fixp->fx_file, fixp->fx_line,
21123                     _("ADRL used for a symbol not defined in the same file"));
21124       return NULL;
21125
21126     case BFD_RELOC_ARM_OFFSET_IMM:
21127       if (section->use_rela_p)
21128         {
21129           code = fixp->fx_r_type;
21130           break;
21131         }
21132
21133       if (fixp->fx_addsy != NULL
21134           && !S_IS_DEFINED (fixp->fx_addsy)
21135           && S_IS_LOCAL (fixp->fx_addsy))
21136         {
21137           as_bad_where (fixp->fx_file, fixp->fx_line,
21138                         _("undefined local label `%s'"),
21139                         S_GET_NAME (fixp->fx_addsy));
21140           return NULL;
21141         }
21142
21143       as_bad_where (fixp->fx_file, fixp->fx_line,
21144                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
21145       return NULL;
21146
21147     default:
21148       {
21149         char * type;
21150
21151         switch (fixp->fx_r_type)
21152           {
21153           case BFD_RELOC_NONE:             type = "NONE";         break;
21154           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
21155           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
21156           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
21157           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
21158           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
21159           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
21160           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
21161           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
21162           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
21163           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
21164           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
21165           default:                         type = _("<unknown>"); break;
21166           }
21167         as_bad_where (fixp->fx_file, fixp->fx_line,
21168                       _("cannot represent %s relocation in this object file format"),
21169                       type);
21170         return NULL;
21171       }
21172     }
21173
21174 #ifdef OBJ_ELF
21175   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
21176       && GOT_symbol
21177       && fixp->fx_addsy == GOT_symbol)
21178     {
21179       code = BFD_RELOC_ARM_GOTPC;
21180       reloc->addend = fixp->fx_offset = reloc->address;
21181     }
21182 #endif
21183
21184   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
21185
21186   if (reloc->howto == NULL)
21187     {
21188       as_bad_where (fixp->fx_file, fixp->fx_line,
21189                     _("cannot represent %s relocation in this object file format"),
21190                     bfd_get_reloc_code_name (code));
21191       return NULL;
21192     }
21193
21194   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
21195      vtable entry to be used in the relocation's section offset.  */
21196   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
21197     reloc->address = fixp->fx_offset;
21198
21199   return reloc;
21200 }
21201
21202 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
21203
21204 void
21205 cons_fix_new_arm (fragS *       frag,
21206                   int           where,
21207                   int           size,
21208                   expressionS * exp)
21209 {
21210   bfd_reloc_code_real_type type;
21211   int pcrel = 0;
21212
21213   /* Pick a reloc.
21214      FIXME: @@ Should look at CPU word size.  */
21215   switch (size)
21216     {
21217     case 1:
21218       type = BFD_RELOC_8;
21219       break;
21220     case 2:
21221       type = BFD_RELOC_16;
21222       break;
21223     case 4:
21224     default:
21225       type = BFD_RELOC_32;
21226       break;
21227     case 8:
21228       type = BFD_RELOC_64;
21229       break;
21230     }
21231
21232 #ifdef TE_PE
21233   if (exp->X_op == O_secrel)
21234   {
21235     exp->X_op = O_symbol;
21236     type = BFD_RELOC_32_SECREL;
21237   }
21238 #endif
21239
21240   fix_new_exp (frag, where, (int) size, exp, pcrel, type);
21241 }
21242
21243 #if defined (OBJ_COFF)
21244 void
21245 arm_validate_fix (fixS * fixP)
21246 {
21247   /* If the destination of the branch is a defined symbol which does not have
21248      the THUMB_FUNC attribute, then we must be calling a function which has
21249      the (interfacearm) attribute.  We look for the Thumb entry point to that
21250      function and change the branch to refer to that function instead.  */
21251   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
21252       && fixP->fx_addsy != NULL
21253       && S_IS_DEFINED (fixP->fx_addsy)
21254       && ! THUMB_IS_FUNC (fixP->fx_addsy))
21255     {
21256       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
21257     }
21258 }
21259 #endif
21260
21261
21262 int
21263 arm_force_relocation (struct fix * fixp)
21264 {
21265 #if defined (OBJ_COFF) && defined (TE_PE)
21266   if (fixp->fx_r_type == BFD_RELOC_RVA)
21267     return 1;
21268 #endif
21269
21270   /* In case we have a call or a branch to a function in ARM ISA mode from
21271      a thumb function or vice-versa force the relocation. These relocations
21272      are cleared off for some cores that might have blx and simple transformations
21273      are possible.  */
21274
21275 #ifdef OBJ_ELF
21276   switch (fixp->fx_r_type)
21277     {
21278     case BFD_RELOC_ARM_PCREL_JUMP:
21279     case BFD_RELOC_ARM_PCREL_CALL:
21280     case BFD_RELOC_THUMB_PCREL_BLX:
21281       if (THUMB_IS_FUNC (fixp->fx_addsy))
21282         return 1;
21283       break;
21284
21285     case BFD_RELOC_ARM_PCREL_BLX:
21286     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21287     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21288     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21289       if (ARM_IS_FUNC (fixp->fx_addsy))
21290         return 1;
21291       break;
21292
21293     default:
21294       break;
21295     }
21296 #endif
21297
21298   /* Resolve these relocations even if the symbol is extern or weak.  */
21299   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
21300       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
21301       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
21302       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
21303       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
21304       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
21305       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12)
21306     return 0;
21307
21308   /* Always leave these relocations for the linker.  */
21309   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
21310        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
21311       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
21312     return 1;
21313
21314   /* Always generate relocations against function symbols.  */
21315   if (fixp->fx_r_type == BFD_RELOC_32
21316       && fixp->fx_addsy
21317       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
21318     return 1;
21319
21320   return generic_force_reloc (fixp);
21321 }
21322
21323 #if defined (OBJ_ELF) || defined (OBJ_COFF)
21324 /* Relocations against function names must be left unadjusted,
21325    so that the linker can use this information to generate interworking
21326    stubs.  The MIPS version of this function
21327    also prevents relocations that are mips-16 specific, but I do not
21328    know why it does this.
21329
21330    FIXME:
21331    There is one other problem that ought to be addressed here, but
21332    which currently is not:  Taking the address of a label (rather
21333    than a function) and then later jumping to that address.  Such
21334    addresses also ought to have their bottom bit set (assuming that
21335    they reside in Thumb code), but at the moment they will not.  */
21336
21337 bfd_boolean
21338 arm_fix_adjustable (fixS * fixP)
21339 {
21340   if (fixP->fx_addsy == NULL)
21341     return 1;
21342
21343   /* Preserve relocations against symbols with function type.  */
21344   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
21345     return FALSE;
21346
21347   if (THUMB_IS_FUNC (fixP->fx_addsy)
21348       && fixP->fx_subsy == NULL)
21349     return FALSE;
21350
21351   /* We need the symbol name for the VTABLE entries.  */
21352   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
21353       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
21354     return FALSE;
21355
21356   /* Don't allow symbols to be discarded on GOT related relocs.  */
21357   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
21358       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
21359       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
21360       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
21361       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
21362       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
21363       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
21364       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
21365       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
21366     return FALSE;
21367
21368   /* Similarly for group relocations.  */
21369   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
21370        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
21371       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
21372     return FALSE;
21373
21374   /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
21375   if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
21376       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
21377       || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
21378       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
21379       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
21380       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
21381       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
21382       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
21383     return FALSE;
21384
21385   return TRUE;
21386 }
21387 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
21388
21389 #ifdef OBJ_ELF
21390
21391 const char *
21392 elf32_arm_target_format (void)
21393 {
21394 #ifdef TE_SYMBIAN
21395   return (target_big_endian
21396           ? "elf32-bigarm-symbian"
21397           : "elf32-littlearm-symbian");
21398 #elif defined (TE_VXWORKS)
21399   return (target_big_endian
21400           ? "elf32-bigarm-vxworks"
21401           : "elf32-littlearm-vxworks");
21402 #else
21403   if (target_big_endian)
21404     return "elf32-bigarm";
21405   else
21406     return "elf32-littlearm";
21407 #endif
21408 }
21409
21410 void
21411 armelf_frob_symbol (symbolS * symp,
21412                     int *     puntp)
21413 {
21414   elf_frob_symbol (symp, puntp);
21415 }
21416 #endif
21417
21418 /* MD interface: Finalization.  */
21419
21420 void
21421 arm_cleanup (void)
21422 {
21423   literal_pool * pool;
21424
21425   /* Ensure that all the IT blocks are properly closed.  */
21426   check_it_blocks_finished ();
21427
21428   for (pool = list_of_pools; pool; pool = pool->next)
21429     {
21430       /* Put it at the end of the relevant section.  */
21431       subseg_set (pool->section, pool->sub_section);
21432 #ifdef OBJ_ELF
21433       arm_elf_change_section ();
21434 #endif
21435       s_ltorg (0);
21436     }
21437 }
21438
21439 #ifdef OBJ_ELF
21440 /* Remove any excess mapping symbols generated for alignment frags in
21441    SEC.  We may have created a mapping symbol before a zero byte
21442    alignment; remove it if there's a mapping symbol after the
21443    alignment.  */
21444 static void
21445 check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
21446                        void *dummy ATTRIBUTE_UNUSED)
21447 {
21448   segment_info_type *seginfo = seg_info (sec);
21449   fragS *fragp;
21450
21451   if (seginfo == NULL || seginfo->frchainP == NULL)
21452     return;
21453
21454   for (fragp = seginfo->frchainP->frch_root;
21455        fragp != NULL;
21456        fragp = fragp->fr_next)
21457     {
21458       symbolS *sym = fragp->tc_frag_data.last_map;
21459       fragS *next = fragp->fr_next;
21460
21461       /* Variable-sized frags have been converted to fixed size by
21462          this point.  But if this was variable-sized to start with,
21463          there will be a fixed-size frag after it.  So don't handle
21464          next == NULL.  */
21465       if (sym == NULL || next == NULL)
21466         continue;
21467
21468       if (S_GET_VALUE (sym) < next->fr_address)
21469         /* Not at the end of this frag.  */
21470         continue;
21471       know (S_GET_VALUE (sym) == next->fr_address);
21472
21473       do
21474         {
21475           if (next->tc_frag_data.first_map != NULL)
21476             {
21477               /* Next frag starts with a mapping symbol.  Discard this
21478                  one.  */
21479               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
21480               break;
21481             }
21482
21483           if (next->fr_next == NULL)
21484             {
21485               /* This mapping symbol is at the end of the section.  Discard
21486                  it.  */
21487               know (next->fr_fix == 0 && next->fr_var == 0);
21488               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
21489               break;
21490             }
21491
21492           /* As long as we have empty frags without any mapping symbols,
21493              keep looking.  */
21494           /* If the next frag is non-empty and does not start with a
21495              mapping symbol, then this mapping symbol is required.  */
21496           if (next->fr_address != next->fr_next->fr_address)
21497             break;
21498
21499           next = next->fr_next;
21500         }
21501       while (next != NULL);
21502     }
21503 }
21504 #endif
21505
21506 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
21507    ARM ones.  */
21508
21509 void
21510 arm_adjust_symtab (void)
21511 {
21512 #ifdef OBJ_COFF
21513   symbolS * sym;
21514
21515   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
21516     {
21517       if (ARM_IS_THUMB (sym))
21518         {
21519           if (THUMB_IS_FUNC (sym))
21520             {
21521               /* Mark the symbol as a Thumb function.  */
21522               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
21523                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
21524                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
21525
21526               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
21527                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
21528               else
21529                 as_bad (_("%s: unexpected function type: %d"),
21530                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
21531             }
21532           else switch (S_GET_STORAGE_CLASS (sym))
21533             {
21534             case C_EXT:
21535               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
21536               break;
21537             case C_STAT:
21538               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
21539               break;
21540             case C_LABEL:
21541               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
21542               break;
21543             default:
21544               /* Do nothing.  */
21545               break;
21546             }
21547         }
21548
21549       if (ARM_IS_INTERWORK (sym))
21550         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
21551     }
21552 #endif
21553 #ifdef OBJ_ELF
21554   symbolS * sym;
21555   char      bind;
21556
21557   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
21558     {
21559       if (ARM_IS_THUMB (sym))
21560         {
21561           elf_symbol_type * elf_sym;
21562
21563           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
21564           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
21565
21566           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
21567                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
21568             {
21569               /* If it's a .thumb_func, declare it as so,
21570                  otherwise tag label as .code 16.  */
21571               if (THUMB_IS_FUNC (sym))
21572                 elf_sym->internal_elf_sym.st_info =
21573                   ELF_ST_INFO (bind, STT_ARM_TFUNC);
21574               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
21575                 elf_sym->internal_elf_sym.st_info =
21576                   ELF_ST_INFO (bind, STT_ARM_16BIT);
21577             }
21578         }
21579     }
21580
21581   /* Remove any overlapping mapping symbols generated by alignment frags.  */
21582   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
21583 #endif
21584 }
21585
21586 /* MD interface: Initialization.  */
21587
21588 static void
21589 set_constant_flonums (void)
21590 {
21591   int i;
21592
21593   for (i = 0; i < NUM_FLOAT_VALS; i++)
21594     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
21595       abort ();
21596 }
21597
21598 /* Auto-select Thumb mode if it's the only available instruction set for the
21599    given architecture.  */
21600
21601 static void
21602 autoselect_thumb_from_cpu_variant (void)
21603 {
21604   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
21605     opcode_select (16);
21606 }
21607
21608 void
21609 md_begin (void)
21610 {
21611   unsigned mach;
21612   unsigned int i;
21613
21614   if (   (arm_ops_hsh = hash_new ()) == NULL
21615       || (arm_cond_hsh = hash_new ()) == NULL
21616       || (arm_shift_hsh = hash_new ()) == NULL
21617       || (arm_psr_hsh = hash_new ()) == NULL
21618       || (arm_v7m_psr_hsh = hash_new ()) == NULL
21619       || (arm_reg_hsh = hash_new ()) == NULL
21620       || (arm_reloc_hsh = hash_new ()) == NULL
21621       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
21622     as_fatal (_("virtual memory exhausted"));
21623
21624   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
21625     hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
21626   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
21627     hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
21628   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
21629     hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
21630   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
21631     hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
21632   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
21633     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
21634                  (void *) (v7m_psrs + i));
21635   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
21636     hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
21637   for (i = 0;
21638        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
21639        i++)
21640     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
21641                  (void *) (barrier_opt_names + i));
21642 #ifdef OBJ_ELF
21643   for (i = 0; i < sizeof (reloc_names) / sizeof (struct reloc_entry); i++)
21644     hash_insert (arm_reloc_hsh, reloc_names[i].name, (void *) (reloc_names + i));
21645 #endif
21646
21647   set_constant_flonums ();
21648
21649   /* Set the cpu variant based on the command-line options.  We prefer
21650      -mcpu= over -march= if both are set (as for GCC); and we prefer
21651      -mfpu= over any other way of setting the floating point unit.
21652      Use of legacy options with new options are faulted.  */
21653   if (legacy_cpu)
21654     {
21655       if (mcpu_cpu_opt || march_cpu_opt)
21656         as_bad (_("use of old and new-style options to set CPU type"));
21657
21658       mcpu_cpu_opt = legacy_cpu;
21659     }
21660   else if (!mcpu_cpu_opt)
21661     mcpu_cpu_opt = march_cpu_opt;
21662
21663   if (legacy_fpu)
21664     {
21665       if (mfpu_opt)
21666         as_bad (_("use of old and new-style options to set FPU type"));
21667
21668       mfpu_opt = legacy_fpu;
21669     }
21670   else if (!mfpu_opt)
21671     {
21672 #if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
21673         || defined (TE_NetBSD) || defined (TE_VXWORKS))
21674       /* Some environments specify a default FPU.  If they don't, infer it
21675          from the processor.  */
21676       if (mcpu_fpu_opt)
21677         mfpu_opt = mcpu_fpu_opt;
21678       else
21679         mfpu_opt = march_fpu_opt;
21680 #else
21681       mfpu_opt = &fpu_default;
21682 #endif
21683     }
21684
21685   if (!mfpu_opt)
21686     {
21687       if (mcpu_cpu_opt != NULL)
21688         mfpu_opt = &fpu_default;
21689       else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
21690         mfpu_opt = &fpu_arch_vfp_v2;
21691       else
21692         mfpu_opt = &fpu_arch_fpa;
21693     }
21694
21695 #ifdef CPU_DEFAULT
21696   if (!mcpu_cpu_opt)
21697     {
21698       mcpu_cpu_opt = &cpu_default;
21699       selected_cpu = cpu_default;
21700     }
21701 #else
21702   if (mcpu_cpu_opt)
21703     selected_cpu = *mcpu_cpu_opt;
21704   else
21705     mcpu_cpu_opt = &arm_arch_any;
21706 #endif
21707
21708   ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
21709
21710   autoselect_thumb_from_cpu_variant ();
21711
21712   arm_arch_used = thumb_arch_used = arm_arch_none;
21713
21714 #if defined OBJ_COFF || defined OBJ_ELF
21715   {
21716     unsigned int flags = 0;
21717
21718 #if defined OBJ_ELF
21719     flags = meabi_flags;
21720
21721     switch (meabi_flags)
21722       {
21723       case EF_ARM_EABI_UNKNOWN:
21724 #endif
21725         /* Set the flags in the private structure.  */
21726         if (uses_apcs_26)      flags |= F_APCS26;
21727         if (support_interwork) flags |= F_INTERWORK;
21728         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
21729         if (pic_code)          flags |= F_PIC;
21730         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
21731           flags |= F_SOFT_FLOAT;
21732
21733         switch (mfloat_abi_opt)
21734           {
21735           case ARM_FLOAT_ABI_SOFT:
21736           case ARM_FLOAT_ABI_SOFTFP:
21737             flags |= F_SOFT_FLOAT;
21738             break;
21739
21740           case ARM_FLOAT_ABI_HARD:
21741             if (flags & F_SOFT_FLOAT)
21742               as_bad (_("hard-float conflicts with specified fpu"));
21743             break;
21744           }
21745
21746         /* Using pure-endian doubles (even if soft-float).      */
21747         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
21748           flags |= F_VFP_FLOAT;
21749
21750 #if defined OBJ_ELF
21751         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
21752             flags |= EF_ARM_MAVERICK_FLOAT;
21753         break;
21754
21755       case EF_ARM_EABI_VER4:
21756       case EF_ARM_EABI_VER5:
21757         /* No additional flags to set.  */
21758         break;
21759
21760       default:
21761         abort ();
21762       }
21763 #endif
21764     bfd_set_private_flags (stdoutput, flags);
21765
21766     /* We have run out flags in the COFF header to encode the
21767        status of ATPCS support, so instead we create a dummy,
21768        empty, debug section called .arm.atpcs.  */
21769     if (atpcs)
21770       {
21771         asection * sec;
21772
21773         sec = bfd_make_section (stdoutput, ".arm.atpcs");
21774
21775         if (sec != NULL)
21776           {
21777             bfd_set_section_flags
21778               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
21779             bfd_set_section_size (stdoutput, sec, 0);
21780             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
21781           }
21782       }
21783   }
21784 #endif
21785
21786   /* Record the CPU type as well.  */
21787   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
21788     mach = bfd_mach_arm_iWMMXt2;
21789   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
21790     mach = bfd_mach_arm_iWMMXt;
21791   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
21792     mach = bfd_mach_arm_XScale;
21793   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
21794     mach = bfd_mach_arm_ep9312;
21795   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
21796     mach = bfd_mach_arm_5TE;
21797   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
21798     {
21799       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
21800         mach = bfd_mach_arm_5T;
21801       else
21802         mach = bfd_mach_arm_5;
21803     }
21804   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
21805     {
21806       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
21807         mach = bfd_mach_arm_4T;
21808       else
21809         mach = bfd_mach_arm_4;
21810     }
21811   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
21812     mach = bfd_mach_arm_3M;
21813   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
21814     mach = bfd_mach_arm_3;
21815   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
21816     mach = bfd_mach_arm_2a;
21817   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
21818     mach = bfd_mach_arm_2;
21819   else
21820     mach = bfd_mach_arm_unknown;
21821
21822   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
21823 }
21824
21825 /* Command line processing.  */
21826
21827 /* md_parse_option
21828       Invocation line includes a switch not recognized by the base assembler.
21829       See if it's a processor-specific option.
21830
21831       This routine is somewhat complicated by the need for backwards
21832       compatibility (since older releases of gcc can't be changed).
21833       The new options try to make the interface as compatible as
21834       possible with GCC.
21835
21836       New options (supported) are:
21837
21838               -mcpu=<cpu name>           Assemble for selected processor
21839               -march=<architecture name> Assemble for selected architecture
21840               -mfpu=<fpu architecture>   Assemble for selected FPU.
21841               -EB/-mbig-endian           Big-endian
21842               -EL/-mlittle-endian        Little-endian
21843               -k                         Generate PIC code
21844               -mthumb                    Start in Thumb mode
21845               -mthumb-interwork          Code supports ARM/Thumb interworking
21846
21847               -m[no-]warn-deprecated     Warn about deprecated features
21848
21849       For now we will also provide support for:
21850
21851               -mapcs-32                  32-bit Program counter
21852               -mapcs-26                  26-bit Program counter
21853               -macps-float               Floats passed in FP registers
21854               -mapcs-reentrant           Reentrant code
21855               -matpcs
21856       (sometime these will probably be replaced with -mapcs=<list of options>
21857       and -matpcs=<list of options>)
21858
21859       The remaining options are only supported for back-wards compatibility.
21860       Cpu variants, the arm part is optional:
21861               -m[arm]1                Currently not supported.
21862               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
21863               -m[arm]3                Arm 3 processor
21864               -m[arm]6[xx],           Arm 6 processors
21865               -m[arm]7[xx][t][[d]m]   Arm 7 processors
21866               -m[arm]8[10]            Arm 8 processors
21867               -m[arm]9[20][tdmi]      Arm 9 processors
21868               -mstrongarm[110[0]]     StrongARM processors
21869               -mxscale                XScale processors
21870               -m[arm]v[2345[t[e]]]    Arm architectures
21871               -mall                   All (except the ARM1)
21872       FP variants:
21873               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
21874               -mfpe-old               (No float load/store multiples)
21875               -mvfpxd                 VFP Single precision
21876               -mvfp                   All VFP
21877               -mno-fpu                Disable all floating point instructions
21878
21879       The following CPU names are recognized:
21880               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
21881               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
21882               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
21883               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
21884               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
21885               arm10t arm10e, arm1020t, arm1020e, arm10200e,
21886               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
21887
21888       */
21889
21890 const char * md_shortopts = "m:k";
21891
21892 #ifdef ARM_BI_ENDIAN
21893 #define OPTION_EB (OPTION_MD_BASE + 0)
21894 #define OPTION_EL (OPTION_MD_BASE + 1)
21895 #else
21896 #if TARGET_BYTES_BIG_ENDIAN
21897 #define OPTION_EB (OPTION_MD_BASE + 0)
21898 #else
21899 #define OPTION_EL (OPTION_MD_BASE + 1)
21900 #endif
21901 #endif
21902 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
21903
21904 struct option md_longopts[] =
21905 {
21906 #ifdef OPTION_EB
21907   {"EB", no_argument, NULL, OPTION_EB},
21908 #endif
21909 #ifdef OPTION_EL
21910   {"EL", no_argument, NULL, OPTION_EL},
21911 #endif
21912   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
21913   {NULL, no_argument, NULL, 0}
21914 };
21915
21916 size_t md_longopts_size = sizeof (md_longopts);
21917
21918 struct arm_option_table
21919 {
21920   char *option;         /* Option name to match.  */
21921   char *help;           /* Help information.  */
21922   int  *var;            /* Variable to change.  */
21923   int   value;          /* What to change it to.  */
21924   char *deprecated;     /* If non-null, print this message.  */
21925 };
21926
21927 struct arm_option_table arm_opts[] =
21928 {
21929   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
21930   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
21931   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
21932    &support_interwork, 1, NULL},
21933   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
21934   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
21935   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
21936    1, NULL},
21937   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
21938   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
21939   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
21940   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
21941    NULL},
21942
21943   /* These are recognized by the assembler, but have no affect on code.  */
21944   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
21945   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
21946
21947   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
21948   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
21949    &warn_on_deprecated, 0, NULL},
21950   {NULL, NULL, NULL, 0, NULL}
21951 };
21952
21953 struct arm_legacy_option_table
21954 {
21955   char *option;                         /* Option name to match.  */
21956   const arm_feature_set **var;          /* Variable to change.  */
21957   const arm_feature_set value;          /* What to change it to.  */
21958   char *deprecated;                     /* If non-null, print this message.  */
21959 };
21960
21961 const struct arm_legacy_option_table arm_legacy_opts[] =
21962 {
21963   /* DON'T add any new processors to this list -- we want the whole list
21964      to go away...  Add them to the processors table instead.  */
21965   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
21966   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
21967   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
21968   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
21969   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
21970   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
21971   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
21972   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
21973   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
21974   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
21975   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
21976   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
21977   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
21978   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
21979   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
21980   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
21981   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
21982   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
21983   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
21984   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
21985   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
21986   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
21987   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
21988   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
21989   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
21990   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
21991   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
21992   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
21993   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
21994   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
21995   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
21996   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
21997   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
21998   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
21999   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22000   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22001   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22002   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22003   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22004   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22005   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
22006   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
22007   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
22008   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
22009   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
22010   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
22011   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22012   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22013   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22014   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22015   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22016   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22017   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22018   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22019   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22020   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22021   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
22022   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
22023   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
22024   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
22025   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22026   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22027   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22028   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22029   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22030   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22031   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22032   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22033   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
22034   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
22035    N_("use -mcpu=strongarm110")},
22036   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
22037    N_("use -mcpu=strongarm1100")},
22038   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
22039    N_("use -mcpu=strongarm1110")},
22040   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
22041   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
22042   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
22043
22044   /* Architecture variants -- don't add any more to this list either.  */
22045   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
22046   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
22047   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22048   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22049   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
22050   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
22051   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22052   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22053   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
22054   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
22055   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22056   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22057   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
22058   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
22059   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22060   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22061   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
22062   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
22063
22064   /* Floating point variants -- don't add any more to this list either.  */
22065   {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
22066   {"mfpa10",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
22067   {"mfpa11",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
22068   {"mno-fpu",  &legacy_fpu, ARM_ARCH_NONE,
22069    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
22070
22071   {NULL, NULL, ARM_ARCH_NONE, NULL}
22072 };
22073
22074 struct arm_cpu_option_table
22075 {
22076   char *name;
22077   const arm_feature_set value;
22078   /* For some CPUs we assume an FPU unless the user explicitly sets
22079      -mfpu=...  */
22080   const arm_feature_set default_fpu;
22081   /* The canonical name of the CPU, or NULL to use NAME converted to upper
22082      case.  */
22083   const char *canonical_name;
22084 };
22085
22086 /* This list should, at a minimum, contain all the cpu names
22087    recognized by GCC.  */
22088 static const struct arm_cpu_option_table arm_cpus[] =
22089 {
22090   {"all",               ARM_ANY,         FPU_ARCH_FPA,    NULL},
22091   {"arm1",              ARM_ARCH_V1,     FPU_ARCH_FPA,    NULL},
22092   {"arm2",              ARM_ARCH_V2,     FPU_ARCH_FPA,    NULL},
22093   {"arm250",            ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL},
22094   {"arm3",              ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL},
22095   {"arm6",              ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22096   {"arm60",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22097   {"arm600",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22098   {"arm610",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22099   {"arm620",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22100   {"arm7",              ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22101   {"arm7m",             ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
22102   {"arm7d",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22103   {"arm7dm",            ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
22104   {"arm7di",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22105   {"arm7dmi",           ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
22106   {"arm70",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22107   {"arm700",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22108   {"arm700i",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22109   {"arm710",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22110   {"arm710t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22111   {"arm720",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22112   {"arm720t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22113   {"arm740t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22114   {"arm710c",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22115   {"arm7100",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22116   {"arm7500",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22117   {"arm7500fe",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22118   {"arm7t",             ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22119   {"arm7tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22120   {"arm7tdmi-s",        ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22121   {"arm8",              ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22122   {"arm810",            ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22123   {"strongarm",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22124   {"strongarm1",        ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22125   {"strongarm110",      ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22126   {"strongarm1100",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22127   {"strongarm1110",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22128   {"arm9",              ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22129   {"arm920",            ARM_ARCH_V4T,    FPU_ARCH_FPA,    "ARM920T"},
22130   {"arm920t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22131   {"arm922t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22132   {"arm940t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22133   {"arm9tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22134   {"fa526",             ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22135   {"fa626",             ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22136   /* For V5 or later processors we default to using VFP; but the user
22137      should really set the FPU type explicitly.  */
22138   {"arm9e-r0",          ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22139   {"arm9e",             ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22140   {"arm926ej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"},
22141   {"arm926ejs",         ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"},
22142   {"arm926ej-s",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL},
22143   {"arm946e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22144   {"arm946e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM946E-S"},
22145   {"arm946e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22146   {"arm966e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22147   {"arm966e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM966E-S"},
22148   {"arm966e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22149   {"arm968e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22150   {"arm10t",            ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
22151   {"arm10tdmi",         ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
22152   {"arm10e",            ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22153   {"arm1020",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM1020E"},
22154   {"arm1020t",          ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
22155   {"arm1020e",          ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22156   {"arm1022e",          ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22157   {"arm1026ejs",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM1026EJ-S"},
22158   {"arm1026ej-s",       ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL},
22159   {"fa626te",           ARM_ARCH_V5TE,   FPU_NONE,        NULL},
22160   {"fa726te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22161   {"arm1136js",         ARM_ARCH_V6,     FPU_NONE,        "ARM1136J-S"},
22162   {"arm1136j-s",        ARM_ARCH_V6,     FPU_NONE,        NULL},
22163   {"arm1136jfs",        ARM_ARCH_V6,     FPU_ARCH_VFP_V2, "ARM1136JF-S"},
22164   {"arm1136jf-s",       ARM_ARCH_V6,     FPU_ARCH_VFP_V2, NULL},
22165   {"mpcore",            ARM_ARCH_V6K,    FPU_ARCH_VFP_V2, NULL},
22166   {"mpcorenovfp",       ARM_ARCH_V6K,    FPU_NONE,        NULL},
22167   {"arm1156t2-s",       ARM_ARCH_V6T2,   FPU_NONE,        NULL},
22168   {"arm1156t2f-s",      ARM_ARCH_V6T2,   FPU_ARCH_VFP_V2, NULL},
22169   {"arm1176jz-s",       ARM_ARCH_V6ZK,   FPU_NONE,        NULL},
22170   {"arm1176jzf-s",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2, NULL},
22171   {"cortex-a5",         ARM_ARCH_V7A,    FPU_NONE,        NULL},
22172   {"cortex-a8",         ARM_ARCH_V7A,    ARM_FEATURE (0, FPU_VFP_V3
22173                                                         | FPU_NEON_EXT_V1),
22174                                                           NULL},
22175   {"cortex-a9",         ARM_ARCH_V7A,    ARM_FEATURE (0, FPU_VFP_V3
22176                                                         | FPU_NEON_EXT_V1),
22177                                                           NULL},
22178   {"cortex-r4",         ARM_ARCH_V7R,    FPU_NONE,        NULL},
22179   {"cortex-r4f",        ARM_ARCH_V7R,    FPU_ARCH_VFP_V3D16,      NULL},
22180   {"cortex-m3",         ARM_ARCH_V7M,    FPU_NONE,        NULL},
22181   {"cortex-m1",         ARM_ARCH_V6M,    FPU_NONE,        NULL},
22182   {"cortex-m0",         ARM_ARCH_V6M,    FPU_NONE,        NULL},
22183   /* ??? XSCALE is really an architecture.  */
22184   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
22185   /* ??? iwmmxt is not a processor.  */
22186   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL},
22187   {"iwmmxt2",           ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL},
22188   {"i80200",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
22189   /* Maverick */
22190   {"ep9312",    ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK), FPU_ARCH_MAVERICK, "ARM920T"},
22191   {NULL,                ARM_ARCH_NONE,   ARM_ARCH_NONE, NULL}
22192 };
22193
22194 struct arm_arch_option_table
22195 {
22196   char *name;
22197   const arm_feature_set value;
22198   const arm_feature_set default_fpu;
22199 };
22200
22201 /* This list should, at a minimum, contain all the architecture names
22202    recognized by GCC.  */
22203 static const struct arm_arch_option_table arm_archs[] =
22204 {
22205   {"all",               ARM_ANY,         FPU_ARCH_FPA},
22206   {"armv1",             ARM_ARCH_V1,     FPU_ARCH_FPA},
22207   {"armv2",             ARM_ARCH_V2,     FPU_ARCH_FPA},
22208   {"armv2a",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
22209   {"armv2s",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
22210   {"armv3",             ARM_ARCH_V3,     FPU_ARCH_FPA},
22211   {"armv3m",            ARM_ARCH_V3M,    FPU_ARCH_FPA},
22212   {"armv4",             ARM_ARCH_V4,     FPU_ARCH_FPA},
22213   {"armv4xm",           ARM_ARCH_V4xM,   FPU_ARCH_FPA},
22214   {"armv4t",            ARM_ARCH_V4T,    FPU_ARCH_FPA},
22215   {"armv4txm",          ARM_ARCH_V4TxM,  FPU_ARCH_FPA},
22216   {"armv5",             ARM_ARCH_V5,     FPU_ARCH_VFP},
22217   {"armv5t",            ARM_ARCH_V5T,    FPU_ARCH_VFP},
22218   {"armv5txm",          ARM_ARCH_V5TxM,  FPU_ARCH_VFP},
22219   {"armv5te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP},
22220   {"armv5texp",         ARM_ARCH_V5TExP, FPU_ARCH_VFP},
22221   {"armv5tej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP},
22222   {"armv6",             ARM_ARCH_V6,     FPU_ARCH_VFP},
22223   {"armv6j",            ARM_ARCH_V6,     FPU_ARCH_VFP},
22224   {"armv6k",            ARM_ARCH_V6K,    FPU_ARCH_VFP},
22225   {"armv6z",            ARM_ARCH_V6Z,    FPU_ARCH_VFP},
22226   {"armv6zk",           ARM_ARCH_V6ZK,   FPU_ARCH_VFP},
22227   {"armv6t2",           ARM_ARCH_V6T2,   FPU_ARCH_VFP},
22228   {"armv6kt2",          ARM_ARCH_V6KT2,  FPU_ARCH_VFP},
22229   {"armv6zt2",          ARM_ARCH_V6ZT2,  FPU_ARCH_VFP},
22230   {"armv6zkt2",         ARM_ARCH_V6ZKT2, FPU_ARCH_VFP},
22231   {"armv6-m",           ARM_ARCH_V6M,    FPU_ARCH_VFP},
22232   {"armv7",             ARM_ARCH_V7,     FPU_ARCH_VFP},
22233   /* The official spelling of the ARMv7 profile variants is the dashed form.
22234      Accept the non-dashed form for compatibility with old toolchains.  */
22235   {"armv7a",            ARM_ARCH_V7A,    FPU_ARCH_VFP},
22236   {"armv7r",            ARM_ARCH_V7R,    FPU_ARCH_VFP},
22237   {"armv7m",            ARM_ARCH_V7M,    FPU_ARCH_VFP},
22238   {"armv7-a",           ARM_ARCH_V7A,    FPU_ARCH_VFP},
22239   {"armv7-r",           ARM_ARCH_V7R,    FPU_ARCH_VFP},
22240   {"armv7-m",           ARM_ARCH_V7M,    FPU_ARCH_VFP},
22241   {"armv7e-m",          ARM_ARCH_V7EM,   FPU_ARCH_VFP},
22242   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP},
22243   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP},
22244   {"iwmmxt2",           ARM_ARCH_IWMMXT2,FPU_ARCH_VFP},
22245   {NULL,                ARM_ARCH_NONE,   ARM_ARCH_NONE}
22246 };
22247
22248 /* ISA extensions in the co-processor space.  */
22249 struct arm_option_cpu_value_table
22250 {
22251   char *name;
22252   const arm_feature_set value;
22253 };
22254
22255 static const struct arm_option_cpu_value_table arm_extensions[] =
22256 {
22257   {"maverick",          ARM_FEATURE (0, ARM_CEXT_MAVERICK)},
22258   {"xscale",            ARM_FEATURE (0, ARM_CEXT_XSCALE)},
22259   {"iwmmxt",            ARM_FEATURE (0, ARM_CEXT_IWMMXT)},
22260   {"iwmmxt2",           ARM_FEATURE (0, ARM_CEXT_IWMMXT2)},
22261   {NULL,                ARM_ARCH_NONE}
22262 };
22263
22264 /* This list should, at a minimum, contain all the fpu names
22265    recognized by GCC.  */
22266 static const struct arm_option_cpu_value_table arm_fpus[] =
22267 {
22268   {"softfpa",           FPU_NONE},
22269   {"fpe",               FPU_ARCH_FPE},
22270   {"fpe2",              FPU_ARCH_FPE},
22271   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
22272   {"fpa",               FPU_ARCH_FPA},
22273   {"fpa10",             FPU_ARCH_FPA},
22274   {"fpa11",             FPU_ARCH_FPA},
22275   {"arm7500fe",         FPU_ARCH_FPA},
22276   {"softvfp",           FPU_ARCH_VFP},
22277   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
22278   {"vfp",               FPU_ARCH_VFP_V2},
22279   {"vfp9",              FPU_ARCH_VFP_V2},
22280   {"vfp3",              FPU_ARCH_VFP_V3}, /* For backwards compatbility.  */
22281   {"vfp10",             FPU_ARCH_VFP_V2},
22282   {"vfp10-r0",          FPU_ARCH_VFP_V1},
22283   {"vfpxd",             FPU_ARCH_VFP_V1xD},
22284   {"vfpv2",             FPU_ARCH_VFP_V2},
22285   {"vfpv3",             FPU_ARCH_VFP_V3},
22286   {"vfpv3-fp16",        FPU_ARCH_VFP_V3_FP16},
22287   {"vfpv3-d16",         FPU_ARCH_VFP_V3D16},
22288   {"vfpv3-d16-fp16",    FPU_ARCH_VFP_V3D16_FP16},
22289   {"vfpv3xd",           FPU_ARCH_VFP_V3xD},
22290   {"vfpv3xd-fp16",      FPU_ARCH_VFP_V3xD_FP16},
22291   {"arm1020t",          FPU_ARCH_VFP_V1},
22292   {"arm1020e",          FPU_ARCH_VFP_V2},
22293   {"arm1136jfs",        FPU_ARCH_VFP_V2},
22294   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
22295   {"maverick",          FPU_ARCH_MAVERICK},
22296   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
22297   {"neon-fp16",         FPU_ARCH_NEON_FP16},
22298   {"vfpv4",             FPU_ARCH_VFP_V4},
22299   {"vfpv4-d16",         FPU_ARCH_VFP_V4D16},
22300   {"fpv4-sp-d16",       FPU_ARCH_VFP_V4_SP_D16},
22301   {"neon-vfpv4",        FPU_ARCH_NEON_VFP_V4},
22302   {NULL,                ARM_ARCH_NONE}
22303 };
22304
22305 struct arm_option_value_table
22306 {
22307   char *name;
22308   long value;
22309 };
22310
22311 static const struct arm_option_value_table arm_float_abis[] =
22312 {
22313   {"hard",      ARM_FLOAT_ABI_HARD},
22314   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
22315   {"soft",      ARM_FLOAT_ABI_SOFT},
22316   {NULL,        0}
22317 };
22318
22319 #ifdef OBJ_ELF
22320 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
22321 static const struct arm_option_value_table arm_eabis[] =
22322 {
22323   {"gnu",       EF_ARM_EABI_UNKNOWN},
22324   {"4",         EF_ARM_EABI_VER4},
22325   {"5",         EF_ARM_EABI_VER5},
22326   {NULL,        0}
22327 };
22328 #endif
22329
22330 struct arm_long_option_table
22331 {
22332   char * option;                /* Substring to match.  */
22333   char * help;                  /* Help information.  */
22334   int (* func) (char * subopt); /* Function to decode sub-option.  */
22335   char * deprecated;            /* If non-null, print this message.  */
22336 };
22337
22338 static bfd_boolean
22339 arm_parse_extension (char * str, const arm_feature_set **opt_p)
22340 {
22341   arm_feature_set *ext_set = (arm_feature_set *)
22342       xmalloc (sizeof (arm_feature_set));
22343
22344   /* Copy the feature set, so that we can modify it.  */
22345   *ext_set = **opt_p;
22346   *opt_p = ext_set;
22347
22348   while (str != NULL && *str != 0)
22349     {
22350       const struct arm_option_cpu_value_table * opt;
22351       char * ext;
22352       int optlen;
22353
22354       if (*str != '+')
22355         {
22356           as_bad (_("invalid architectural extension"));
22357           return FALSE;
22358         }
22359
22360       str++;
22361       ext = strchr (str, '+');
22362
22363       if (ext != NULL)
22364         optlen = ext - str;
22365       else
22366         optlen = strlen (str);
22367
22368       if (optlen == 0)
22369         {
22370           as_bad (_("missing architectural extension"));
22371           return FALSE;
22372         }
22373
22374       for (opt = arm_extensions; opt->name != NULL; opt++)
22375         if (strncmp (opt->name, str, optlen) == 0)
22376           {
22377             ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
22378             break;
22379           }
22380
22381       if (opt->name == NULL)
22382         {
22383           as_bad (_("unknown architectural extension `%s'"), str);
22384           return FALSE;
22385         }
22386
22387       str = ext;
22388     };
22389
22390   return TRUE;
22391 }
22392
22393 static bfd_boolean
22394 arm_parse_cpu (char * str)
22395 {
22396   const struct arm_cpu_option_table * opt;
22397   char * ext = strchr (str, '+');
22398   int optlen;
22399
22400   if (ext != NULL)
22401     optlen = ext - str;
22402   else
22403     optlen = strlen (str);
22404
22405   if (optlen == 0)
22406     {
22407       as_bad (_("missing cpu name `%s'"), str);
22408       return FALSE;
22409     }
22410
22411   for (opt = arm_cpus; opt->name != NULL; opt++)
22412     if (strncmp (opt->name, str, optlen) == 0)
22413       {
22414         mcpu_cpu_opt = &opt->value;
22415         mcpu_fpu_opt = &opt->default_fpu;
22416         if (opt->canonical_name)
22417           strcpy (selected_cpu_name, opt->canonical_name);
22418         else
22419           {
22420             int i;
22421
22422             for (i = 0; i < optlen; i++)
22423               selected_cpu_name[i] = TOUPPER (opt->name[i]);
22424             selected_cpu_name[i] = 0;
22425           }
22426
22427         if (ext != NULL)
22428           return arm_parse_extension (ext, &mcpu_cpu_opt);
22429
22430         return TRUE;
22431       }
22432
22433   as_bad (_("unknown cpu `%s'"), str);
22434   return FALSE;
22435 }
22436
22437 static bfd_boolean
22438 arm_parse_arch (char * str)
22439 {
22440   const struct arm_arch_option_table *opt;
22441   char *ext = strchr (str, '+');
22442   int optlen;
22443
22444   if (ext != NULL)
22445     optlen = ext - str;
22446   else
22447     optlen = strlen (str);
22448
22449   if (optlen == 0)
22450     {
22451       as_bad (_("missing architecture name `%s'"), str);
22452       return FALSE;
22453     }
22454
22455   for (opt = arm_archs; opt->name != NULL; opt++)
22456     if (streq (opt->name, str))
22457       {
22458         march_cpu_opt = &opt->value;
22459         march_fpu_opt = &opt->default_fpu;
22460         strcpy (selected_cpu_name, opt->name);
22461
22462         if (ext != NULL)
22463           return arm_parse_extension (ext, &march_cpu_opt);
22464
22465         return TRUE;
22466       }
22467
22468   as_bad (_("unknown architecture `%s'\n"), str);
22469   return FALSE;
22470 }
22471
22472 static bfd_boolean
22473 arm_parse_fpu (char * str)
22474 {
22475   const struct arm_option_cpu_value_table * opt;
22476
22477   for (opt = arm_fpus; opt->name != NULL; opt++)
22478     if (streq (opt->name, str))
22479       {
22480         mfpu_opt = &opt->value;
22481         return TRUE;
22482       }
22483
22484   as_bad (_("unknown floating point format `%s'\n"), str);
22485   return FALSE;
22486 }
22487
22488 static bfd_boolean
22489 arm_parse_float_abi (char * str)
22490 {
22491   const struct arm_option_value_table * opt;
22492
22493   for (opt = arm_float_abis; opt->name != NULL; opt++)
22494     if (streq (opt->name, str))
22495       {
22496         mfloat_abi_opt = opt->value;
22497         return TRUE;
22498       }
22499
22500   as_bad (_("unknown floating point abi `%s'\n"), str);
22501   return FALSE;
22502 }
22503
22504 #ifdef OBJ_ELF
22505 static bfd_boolean
22506 arm_parse_eabi (char * str)
22507 {
22508   const struct arm_option_value_table *opt;
22509
22510   for (opt = arm_eabis; opt->name != NULL; opt++)
22511     if (streq (opt->name, str))
22512       {
22513         meabi_flags = opt->value;
22514         return TRUE;
22515       }
22516   as_bad (_("unknown EABI `%s'\n"), str);
22517   return FALSE;
22518 }
22519 #endif
22520
22521 static bfd_boolean
22522 arm_parse_it_mode (char * str)
22523 {
22524   bfd_boolean ret = TRUE;
22525
22526   if (streq ("arm", str))
22527     implicit_it_mode = IMPLICIT_IT_MODE_ARM;
22528   else if (streq ("thumb", str))
22529     implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
22530   else if (streq ("always", str))
22531     implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
22532   else if (streq ("never", str))
22533     implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
22534   else
22535     {
22536       as_bad (_("unknown implicit IT mode `%s', should be "\
22537                 "arm, thumb, always, or never."), str);
22538       ret = FALSE;
22539     }
22540
22541   return ret;
22542 }
22543
22544 struct arm_long_option_table arm_long_opts[] =
22545 {
22546   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
22547    arm_parse_cpu, NULL},
22548   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
22549    arm_parse_arch, NULL},
22550   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
22551    arm_parse_fpu, NULL},
22552   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
22553    arm_parse_float_abi, NULL},
22554 #ifdef OBJ_ELF
22555   {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
22556    arm_parse_eabi, NULL},
22557 #endif
22558   {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
22559    arm_parse_it_mode, NULL},
22560   {NULL, NULL, 0, NULL}
22561 };
22562
22563 int
22564 md_parse_option (int c, char * arg)
22565 {
22566   struct arm_option_table *opt;
22567   const struct arm_legacy_option_table *fopt;
22568   struct arm_long_option_table *lopt;
22569
22570   switch (c)
22571     {
22572 #ifdef OPTION_EB
22573     case OPTION_EB:
22574       target_big_endian = 1;
22575       break;
22576 #endif
22577
22578 #ifdef OPTION_EL
22579     case OPTION_EL:
22580       target_big_endian = 0;
22581       break;
22582 #endif
22583
22584     case OPTION_FIX_V4BX:
22585       fix_v4bx = TRUE;
22586       break;
22587
22588     case 'a':
22589       /* Listing option.  Just ignore these, we don't support additional
22590          ones.  */
22591       return 0;
22592
22593     default:
22594       for (opt = arm_opts; opt->option != NULL; opt++)
22595         {
22596           if (c == opt->option[0]
22597               && ((arg == NULL && opt->option[1] == 0)
22598                   || streq (arg, opt->option + 1)))
22599             {
22600               /* If the option is deprecated, tell the user.  */
22601               if (warn_on_deprecated && opt->deprecated != NULL)
22602                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
22603                            arg ? arg : "", _(opt->deprecated));
22604
22605               if (opt->var != NULL)
22606                 *opt->var = opt->value;
22607
22608               return 1;
22609             }
22610         }
22611
22612       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
22613         {
22614           if (c == fopt->option[0]
22615               && ((arg == NULL && fopt->option[1] == 0)
22616                   || streq (arg, fopt->option + 1)))
22617             {
22618               /* If the option is deprecated, tell the user.  */
22619               if (warn_on_deprecated && fopt->deprecated != NULL)
22620                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
22621                            arg ? arg : "", _(fopt->deprecated));
22622
22623               if (fopt->var != NULL)
22624                 *fopt->var = &fopt->value;
22625
22626               return 1;
22627             }
22628         }
22629
22630       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
22631         {
22632           /* These options are expected to have an argument.  */
22633           if (c == lopt->option[0]
22634               && arg != NULL
22635               && strncmp (arg, lopt->option + 1,
22636                           strlen (lopt->option + 1)) == 0)
22637             {
22638               /* If the option is deprecated, tell the user.  */
22639               if (warn_on_deprecated && lopt->deprecated != NULL)
22640                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
22641                            _(lopt->deprecated));
22642
22643               /* Call the sup-option parser.  */
22644               return lopt->func (arg + strlen (lopt->option) - 1);
22645             }
22646         }
22647
22648       return 0;
22649     }
22650
22651   return 1;
22652 }
22653
22654 void
22655 md_show_usage (FILE * fp)
22656 {
22657   struct arm_option_table *opt;
22658   struct arm_long_option_table *lopt;
22659
22660   fprintf (fp, _(" ARM-specific assembler options:\n"));
22661
22662   for (opt = arm_opts; opt->option != NULL; opt++)
22663     if (opt->help != NULL)
22664       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
22665
22666   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
22667     if (lopt->help != NULL)
22668       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
22669
22670 #ifdef OPTION_EB
22671   fprintf (fp, _("\
22672   -EB                     assemble code for a big-endian cpu\n"));
22673 #endif
22674
22675 #ifdef OPTION_EL
22676   fprintf (fp, _("\
22677   -EL                     assemble code for a little-endian cpu\n"));
22678 #endif
22679
22680   fprintf (fp, _("\
22681   --fix-v4bx              Allow BX in ARMv4 code\n"));
22682 }
22683
22684
22685 #ifdef OBJ_ELF
22686 typedef struct
22687 {
22688   int val;
22689   arm_feature_set flags;
22690 } cpu_arch_ver_table;
22691
22692 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
22693    least features first.  */
22694 static const cpu_arch_ver_table cpu_arch_ver[] =
22695 {
22696     {1, ARM_ARCH_V4},
22697     {2, ARM_ARCH_V4T},
22698     {3, ARM_ARCH_V5},
22699     {3, ARM_ARCH_V5T},
22700     {4, ARM_ARCH_V5TE},
22701     {5, ARM_ARCH_V5TEJ},
22702     {6, ARM_ARCH_V6},
22703     {7, ARM_ARCH_V6Z},
22704     {9, ARM_ARCH_V6K},
22705     {11, ARM_ARCH_V6M},
22706     {8, ARM_ARCH_V6T2},
22707     {10, ARM_ARCH_V7A},
22708     {10, ARM_ARCH_V7R},
22709     {10, ARM_ARCH_V7M},
22710     {0, ARM_ARCH_NONE}
22711 };
22712
22713 /* Set an attribute if it has not already been set by the user.  */
22714 static void
22715 aeabi_set_attribute_int (int tag, int value)
22716 {
22717   if (tag < 1
22718       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
22719       || !attributes_set_explicitly[tag])
22720     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
22721 }
22722
22723 static void
22724 aeabi_set_attribute_string (int tag, const char *value)
22725 {
22726   if (tag < 1
22727       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
22728       || !attributes_set_explicitly[tag])
22729     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
22730 }
22731
22732 /* Set the public EABI object attributes.  */
22733 static void
22734 aeabi_set_public_attributes (void)
22735 {
22736   int arch;
22737   arm_feature_set flags;
22738   arm_feature_set tmp;
22739   const cpu_arch_ver_table *p;
22740
22741   /* Choose the architecture based on the capabilities of the requested cpu
22742      (if any) and/or the instructions actually used.  */
22743   ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
22744   ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
22745   ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
22746   /*Allow the user to override the reported architecture.  */
22747   if (object_arch)
22748     {
22749       ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
22750       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
22751     }
22752
22753   tmp = flags;
22754   arch = 0;
22755   for (p = cpu_arch_ver; p->val; p++)
22756     {
22757       if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
22758         {
22759           arch = p->val;
22760           ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
22761         }
22762     }
22763
22764   /* The table lookup above finds the last architecture to contribute
22765      a new feature.  Unfortunately, Tag13 is a subset of the union of
22766      v6T2 and v7-M, so it is never seen as contributing a new feature.
22767      We can not search for the last entry which is entirely used,
22768      because if no CPU is specified we build up only those flags
22769      actually used.  Perhaps we should separate out the specified
22770      and implicit cases.  Avoid taking this path for -march=all by
22771      checking for contradictory v7-A / v7-M features.  */
22772   if (arch == 10
22773       && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
22774       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
22775       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
22776     arch = 13;
22777
22778   /* Tag_CPU_name.  */
22779   if (selected_cpu_name[0])
22780     {
22781       char *q;
22782
22783       q = selected_cpu_name;
22784       if (strncmp (q, "armv", 4) == 0)
22785         {
22786           int i;
22787
22788           q += 4;
22789           for (i = 0; q[i]; i++)
22790             q[i] = TOUPPER (q[i]);
22791         }
22792       aeabi_set_attribute_string (Tag_CPU_name, q);
22793     }
22794
22795   /* Tag_CPU_arch.  */
22796   aeabi_set_attribute_int (Tag_CPU_arch, arch);
22797
22798   /* Tag_CPU_arch_profile.  */
22799   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
22800     aeabi_set_attribute_int (Tag_CPU_arch_profile, 'A');
22801   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
22802     aeabi_set_attribute_int (Tag_CPU_arch_profile, 'R');
22803   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
22804     aeabi_set_attribute_int (Tag_CPU_arch_profile, 'M');
22805
22806   /* Tag_ARM_ISA_use.  */
22807   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
22808       || arch == 0)
22809     aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
22810
22811   /* Tag_THUMB_ISA_use.  */
22812   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
22813       || arch == 0)
22814     aeabi_set_attribute_int (Tag_THUMB_ISA_use,
22815         ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
22816
22817   /* Tag_VFP_arch.  */
22818   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
22819     aeabi_set_attribute_int (Tag_VFP_arch,
22820                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
22821                              ? 5 : 6);
22822   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
22823     aeabi_set_attribute_int (Tag_VFP_arch, 3);
22824   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
22825     aeabi_set_attribute_int (Tag_VFP_arch, 4);
22826   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
22827     aeabi_set_attribute_int (Tag_VFP_arch, 2);
22828   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
22829            || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
22830     aeabi_set_attribute_int (Tag_VFP_arch, 1);
22831
22832   /* Tag_WMMX_arch.  */
22833   if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
22834     aeabi_set_attribute_int (Tag_WMMX_arch, 2);
22835   else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
22836     aeabi_set_attribute_int (Tag_WMMX_arch, 1);
22837
22838   /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
22839   if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
22840     aeabi_set_attribute_int
22841       (Tag_Advanced_SIMD_arch, (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma)
22842                                 ? 2 : 1));
22843   
22844   /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
22845   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16))
22846     aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
22847 }
22848
22849 /* Add the default contents for the .ARM.attributes section.  */
22850 void
22851 arm_md_end (void)
22852 {
22853   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
22854     return;
22855
22856   aeabi_set_public_attributes ();
22857 }
22858 #endif /* OBJ_ELF */
22859
22860
22861 /* Parse a .cpu directive.  */
22862
22863 static void
22864 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
22865 {
22866   const struct arm_cpu_option_table *opt;
22867   char *name;
22868   char saved_char;
22869
22870   name = input_line_pointer;
22871   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
22872     input_line_pointer++;
22873   saved_char = *input_line_pointer;
22874   *input_line_pointer = 0;
22875
22876   /* Skip the first "all" entry.  */
22877   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
22878     if (streq (opt->name, name))
22879       {
22880         mcpu_cpu_opt = &opt->value;
22881         selected_cpu = opt->value;
22882         if (opt->canonical_name)
22883           strcpy (selected_cpu_name, opt->canonical_name);
22884         else
22885           {
22886             int i;
22887             for (i = 0; opt->name[i]; i++)
22888               selected_cpu_name[i] = TOUPPER (opt->name[i]);
22889             selected_cpu_name[i] = 0;
22890           }
22891         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
22892         *input_line_pointer = saved_char;
22893         demand_empty_rest_of_line ();
22894         return;
22895       }
22896   as_bad (_("unknown cpu `%s'"), name);
22897   *input_line_pointer = saved_char;
22898   ignore_rest_of_line ();
22899 }
22900
22901
22902 /* Parse a .arch directive.  */
22903
22904 static void
22905 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
22906 {
22907   const struct arm_arch_option_table *opt;
22908   char saved_char;
22909   char *name;
22910
22911   name = input_line_pointer;
22912   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
22913     input_line_pointer++;
22914   saved_char = *input_line_pointer;
22915   *input_line_pointer = 0;
22916
22917   /* Skip the first "all" entry.  */
22918   for (opt = arm_archs + 1; opt->name != NULL; opt++)
22919     if (streq (opt->name, name))
22920       {
22921         mcpu_cpu_opt = &opt->value;
22922         selected_cpu = opt->value;
22923         strcpy (selected_cpu_name, opt->name);
22924         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
22925         *input_line_pointer = saved_char;
22926         demand_empty_rest_of_line ();
22927         return;
22928       }
22929
22930   as_bad (_("unknown architecture `%s'\n"), name);
22931   *input_line_pointer = saved_char;
22932   ignore_rest_of_line ();
22933 }
22934
22935
22936 /* Parse a .object_arch directive.  */
22937
22938 static void
22939 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
22940 {
22941   const struct arm_arch_option_table *opt;
22942   char saved_char;
22943   char *name;
22944
22945   name = input_line_pointer;
22946   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
22947     input_line_pointer++;
22948   saved_char = *input_line_pointer;
22949   *input_line_pointer = 0;
22950
22951   /* Skip the first "all" entry.  */
22952   for (opt = arm_archs + 1; opt->name != NULL; opt++)
22953     if (streq (opt->name, name))
22954       {
22955         object_arch = &opt->value;
22956         *input_line_pointer = saved_char;
22957         demand_empty_rest_of_line ();
22958         return;
22959       }
22960
22961   as_bad (_("unknown architecture `%s'\n"), name);
22962   *input_line_pointer = saved_char;
22963   ignore_rest_of_line ();
22964 }
22965
22966 /* Parse a .fpu directive.  */
22967
22968 static void
22969 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
22970 {
22971   const struct arm_option_cpu_value_table *opt;
22972   char saved_char;
22973   char *name;
22974
22975   name = input_line_pointer;
22976   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
22977     input_line_pointer++;
22978   saved_char = *input_line_pointer;
22979   *input_line_pointer = 0;
22980
22981   for (opt = arm_fpus; opt->name != NULL; opt++)
22982     if (streq (opt->name, name))
22983       {
22984         mfpu_opt = &opt->value;
22985         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
22986         *input_line_pointer = saved_char;
22987         demand_empty_rest_of_line ();
22988         return;
22989       }
22990
22991   as_bad (_("unknown floating point format `%s'\n"), name);
22992   *input_line_pointer = saved_char;
22993   ignore_rest_of_line ();
22994 }
22995
22996 /* Copy symbol information.  */
22997
22998 void
22999 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
23000 {
23001   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
23002 }
23003
23004 #ifdef OBJ_ELF
23005 /* Given a symbolic attribute NAME, return the proper integer value.
23006    Returns -1 if the attribute is not known.  */
23007
23008 int
23009 arm_convert_symbolic_attribute (const char *name)
23010 {
23011   static const struct
23012   {
23013     const char * name;
23014     const int    tag;
23015   }
23016   attribute_table[] =
23017     {
23018       /* When you modify this table you should
23019          also modify the list in doc/c-arm.texi.  */
23020 #define T(tag) {#tag, tag}
23021       T (Tag_CPU_raw_name),
23022       T (Tag_CPU_name),
23023       T (Tag_CPU_arch),
23024       T (Tag_CPU_arch_profile),
23025       T (Tag_ARM_ISA_use),
23026       T (Tag_THUMB_ISA_use),
23027       T (Tag_VFP_arch),
23028       T (Tag_WMMX_arch),
23029       T (Tag_Advanced_SIMD_arch),
23030       T (Tag_PCS_config),
23031       T (Tag_ABI_PCS_R9_use),
23032       T (Tag_ABI_PCS_RW_data),
23033       T (Tag_ABI_PCS_RO_data),
23034       T (Tag_ABI_PCS_GOT_use),
23035       T (Tag_ABI_PCS_wchar_t),
23036       T (Tag_ABI_FP_rounding),
23037       T (Tag_ABI_FP_denormal),
23038       T (Tag_ABI_FP_exceptions),
23039       T (Tag_ABI_FP_user_exceptions),
23040       T (Tag_ABI_FP_number_model),
23041       T (Tag_ABI_align8_needed),
23042       T (Tag_ABI_align8_preserved),
23043       T (Tag_ABI_enum_size),
23044       T (Tag_ABI_HardFP_use),
23045       T (Tag_ABI_VFP_args),
23046       T (Tag_ABI_WMMX_args),
23047       T (Tag_ABI_optimization_goals),
23048       T (Tag_ABI_FP_optimization_goals),
23049       T (Tag_compatibility),
23050       T (Tag_CPU_unaligned_access),
23051       T (Tag_VFP_HP_extension),
23052       T (Tag_ABI_FP_16bit_format),
23053       T (Tag_MPextension_use),
23054       T (Tag_DIV_use),
23055       T (Tag_nodefaults),
23056       T (Tag_also_compatible_with),
23057       T (Tag_conformance),
23058       T (Tag_T2EE_use),
23059       T (Tag_Virtualization_use),
23060       /* We deliberately do not include Tag_MPextension_use_legacy.  */
23061 #undef T
23062     };
23063   unsigned int i;
23064
23065   if (name == NULL)
23066     return -1;
23067
23068   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
23069     if (streq (name, attribute_table[i].name))
23070       return attribute_table[i].tag;
23071
23072   return -1;
23073 }
23074
23075
23076 /* Apply sym value for relocations only in the case that
23077    they are for local symbols and you have the respective
23078    architectural feature for blx and simple switches.  */
23079 int
23080 arm_apply_sym_value (struct fix * fixP)
23081 {
23082   if (fixP->fx_addsy
23083       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
23084       && !S_IS_EXTERNAL (fixP->fx_addsy))
23085     {
23086       switch (fixP->fx_r_type)
23087         {
23088         case BFD_RELOC_ARM_PCREL_BLX:
23089         case BFD_RELOC_THUMB_PCREL_BRANCH23:
23090           if (ARM_IS_FUNC (fixP->fx_addsy))
23091             return 1;
23092           break;
23093
23094         case BFD_RELOC_ARM_PCREL_CALL:
23095         case BFD_RELOC_THUMB_PCREL_BLX:
23096           if (THUMB_IS_FUNC (fixP->fx_addsy))
23097               return 1;
23098           break;
23099
23100         default:
23101           break;
23102         }
23103
23104     }
23105   return 0;
23106 }
23107 #endif /* OBJ_ELF */
This page took 1.386745 seconds and 4 git commands to generate.