bfd/
[external/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, 2010
4    Free Software Foundation, Inc.
5    Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
6         Modified by David Taylor (dtaylor@armltd.co.uk)
7         Cirrus coprocessor mods by Aldy Hernandez (aldyh@redhat.com)
8         Cirrus coprocessor fixes by Petko Manolov (petkan@nucleusys.com)
9         Cirrus coprocessor fixes by Vladimir Ivanov (vladitx@nucleusys.com)
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_v6t2 = ARM_FEATURE (ARM_EXT_V6T2, 0);
188 static const arm_feature_set arm_ext_v6m = ARM_FEATURE (ARM_EXT_V6M, 0);
189 static const arm_feature_set arm_ext_v6_notm = ARM_FEATURE (ARM_EXT_V6_NOTM, 0);
190 static const arm_feature_set arm_ext_v6_dsp = ARM_FEATURE (ARM_EXT_V6_DSP, 0);
191 static const arm_feature_set arm_ext_barrier = ARM_FEATURE (ARM_EXT_BARRIER, 0);
192 static const arm_feature_set arm_ext_msr = ARM_FEATURE (ARM_EXT_THUMB_MSR, 0);
193 static const arm_feature_set arm_ext_div = ARM_FEATURE (ARM_EXT_DIV, 0);
194 static const arm_feature_set arm_ext_v7 = ARM_FEATURE (ARM_EXT_V7, 0);
195 static const arm_feature_set arm_ext_v7a = ARM_FEATURE (ARM_EXT_V7A, 0);
196 static const arm_feature_set arm_ext_v7r = ARM_FEATURE (ARM_EXT_V7R, 0);
197 static const arm_feature_set arm_ext_v7m = ARM_FEATURE (ARM_EXT_V7M, 0);
198 static const arm_feature_set arm_ext_m =
199   ARM_FEATURE (ARM_EXT_V6M | ARM_EXT_OS | ARM_EXT_V7M, 0);
200 static const arm_feature_set arm_ext_mp = ARM_FEATURE (ARM_EXT_MP, 0);
201 static const arm_feature_set arm_ext_sec = ARM_FEATURE (ARM_EXT_SEC, 0);
202 static const arm_feature_set arm_ext_os = ARM_FEATURE (ARM_EXT_OS, 0);
203 static const arm_feature_set arm_ext_adiv = ARM_FEATURE (ARM_EXT_ADIV, 0);
204 static const arm_feature_set arm_ext_virt = ARM_FEATURE (ARM_EXT_VIRT, 0);
205
206 static const arm_feature_set arm_arch_any = ARM_ANY;
207 static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1);
208 static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
209 static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
210
211 static const arm_feature_set arm_cext_iwmmxt2 =
212   ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
213 static const arm_feature_set arm_cext_iwmmxt =
214   ARM_FEATURE (0, ARM_CEXT_IWMMXT);
215 static const arm_feature_set arm_cext_xscale =
216   ARM_FEATURE (0, ARM_CEXT_XSCALE);
217 static const arm_feature_set arm_cext_maverick =
218   ARM_FEATURE (0, ARM_CEXT_MAVERICK);
219 static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
220 static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
221 static const arm_feature_set fpu_vfp_ext_v1xd =
222   ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
223 static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
224 static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
225 static const arm_feature_set fpu_vfp_ext_v3xd = ARM_FEATURE (0, FPU_VFP_EXT_V3xD);
226 static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
227 static const arm_feature_set fpu_vfp_ext_d32 =
228   ARM_FEATURE (0, FPU_VFP_EXT_D32);
229 static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
230 static const arm_feature_set fpu_vfp_v3_or_neon_ext =
231   ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
232 static const arm_feature_set fpu_vfp_fp16 = ARM_FEATURE (0, FPU_VFP_EXT_FP16);
233 static const arm_feature_set fpu_neon_ext_fma = ARM_FEATURE (0, FPU_NEON_EXT_FMA);
234 static const arm_feature_set fpu_vfp_ext_fma = ARM_FEATURE (0, FPU_VFP_EXT_FMA);
235
236 static int mfloat_abi_opt = -1;
237 /* Record user cpu selection for object attributes.  */
238 static arm_feature_set selected_cpu = ARM_ARCH_NONE;
239 /* Must be long enough to hold any of the names in arm_cpus.  */
240 static char selected_cpu_name[16];
241 #ifdef OBJ_ELF
242 # ifdef EABI_DEFAULT
243 static int meabi_flags = EABI_DEFAULT;
244 # else
245 static int meabi_flags = EF_ARM_EABI_UNKNOWN;
246 # endif
247
248 static int attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
249
250 bfd_boolean
251 arm_is_eabi (void)
252 {
253   return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
254 }
255 #endif
256
257 #ifdef OBJ_ELF
258 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
259 symbolS * GOT_symbol;
260 #endif
261
262 /* 0: assemble for ARM,
263    1: assemble for Thumb,
264    2: assemble for Thumb even though target CPU does not support thumb
265       instructions.  */
266 static int thumb_mode = 0;
267 /* A value distinct from the possible values for thumb_mode that we
268    can use to record whether thumb_mode has been copied into the
269    tc_frag_data field of a frag.  */
270 #define MODE_RECORDED (1 << 4)
271
272 /* Specifies the intrinsic IT insn behavior mode.  */
273 enum implicit_it_mode
274 {
275   IMPLICIT_IT_MODE_NEVER  = 0x00,
276   IMPLICIT_IT_MODE_ARM    = 0x01,
277   IMPLICIT_IT_MODE_THUMB  = 0x02,
278   IMPLICIT_IT_MODE_ALWAYS = (IMPLICIT_IT_MODE_ARM | IMPLICIT_IT_MODE_THUMB)
279 };
280 static int implicit_it_mode = IMPLICIT_IT_MODE_ARM;
281
282 /* If unified_syntax is true, we are processing the new unified
283    ARM/Thumb syntax.  Important differences from the old ARM mode:
284
285      - Immediate operands do not require a # prefix.
286      - Conditional affixes always appear at the end of the
287        instruction.  (For backward compatibility, those instructions
288        that formerly had them in the middle, continue to accept them
289        there.)
290      - The IT instruction may appear, and if it does is validated
291        against subsequent conditional affixes.  It does not generate
292        machine code.
293
294    Important differences from the old Thumb mode:
295
296      - Immediate operands do not require a # prefix.
297      - Most of the V6T2 instructions are only available in unified mode.
298      - The .N and .W suffixes are recognized and honored (it is an error
299        if they cannot be honored).
300      - All instructions set the flags if and only if they have an 's' affix.
301      - Conditional affixes may be used.  They are validated against
302        preceding IT instructions.  Unlike ARM mode, you cannot use a
303        conditional affix except in the scope of an IT instruction.  */
304
305 static bfd_boolean unified_syntax = FALSE;
306
307 enum neon_el_type
308 {
309   NT_invtype,
310   NT_untyped,
311   NT_integer,
312   NT_float,
313   NT_poly,
314   NT_signed,
315   NT_unsigned
316 };
317
318 struct neon_type_el
319 {
320   enum neon_el_type type;
321   unsigned size;
322 };
323
324 #define NEON_MAX_TYPE_ELS 4
325
326 struct neon_type
327 {
328   struct neon_type_el el[NEON_MAX_TYPE_ELS];
329   unsigned elems;
330 };
331
332 enum it_instruction_type
333 {
334    OUTSIDE_IT_INSN,
335    INSIDE_IT_INSN,
336    INSIDE_IT_LAST_INSN,
337    IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
338                               if inside, should be the last one.  */
339    NEUTRAL_IT_INSN,        /* This could be either inside or outside,
340                               i.e. BKPT and NOP.  */
341    IT_INSN                 /* The IT insn has been parsed.  */
342 };
343
344 struct arm_it
345 {
346   const char *  error;
347   unsigned long instruction;
348   int           size;
349   int           size_req;
350   int           cond;
351   /* "uncond_value" is set to the value in place of the conditional field in
352      unconditional versions of the instruction, or -1 if nothing is
353      appropriate.  */
354   int           uncond_value;
355   struct neon_type vectype;
356   /* This does not indicate an actual NEON instruction, only that
357      the mnemonic accepts neon-style type suffixes.  */
358   int           is_neon;
359   /* Set to the opcode if the instruction needs relaxation.
360      Zero if the instruction is not relaxed.  */
361   unsigned long relax;
362   struct
363   {
364     bfd_reloc_code_real_type type;
365     expressionS              exp;
366     int                      pc_rel;
367   } reloc;
368
369   enum it_instruction_type it_insn_type;
370
371   struct
372   {
373     unsigned reg;
374     signed int imm;
375     struct neon_type_el vectype;
376     unsigned present    : 1;  /* Operand present.  */
377     unsigned isreg      : 1;  /* Operand was a register.  */
378     unsigned immisreg   : 1;  /* .imm field is a second register.  */
379     unsigned isscalar   : 1;  /* Operand is a (Neon) scalar.  */
380     unsigned immisalign : 1;  /* Immediate is an alignment specifier.  */
381     unsigned immisfloat : 1;  /* Immediate was parsed as a float.  */
382     /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
383        instructions. This allows us to disambiguate ARM <-> vector insns.  */
384     unsigned regisimm   : 1;  /* 64-bit immediate, reg forms high 32 bits.  */
385     unsigned isvec      : 1;  /* Is a single, double or quad VFP/Neon reg.  */
386     unsigned isquad     : 1;  /* Operand is Neon quad-precision register.  */
387     unsigned issingle   : 1;  /* Operand is VFP single-precision register.  */
388     unsigned hasreloc   : 1;  /* Operand has relocation suffix.  */
389     unsigned writeback  : 1;  /* Operand has trailing !  */
390     unsigned preind     : 1;  /* Preindexed address.  */
391     unsigned postind    : 1;  /* Postindexed address.  */
392     unsigned negative   : 1;  /* Index register was negated.  */
393     unsigned shifted    : 1;  /* Shift applied to operation.  */
394     unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
395   } operands[6];
396 };
397
398 static struct arm_it inst;
399
400 #define NUM_FLOAT_VALS 8
401
402 const char * fp_const[] =
403 {
404   "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
405 };
406
407 /* Number of littlenums required to hold an extended precision number.  */
408 #define MAX_LITTLENUMS 6
409
410 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
411
412 #define FAIL    (-1)
413 #define SUCCESS (0)
414
415 #define SUFF_S 1
416 #define SUFF_D 2
417 #define SUFF_E 3
418 #define SUFF_P 4
419
420 #define CP_T_X   0x00008000
421 #define CP_T_Y   0x00400000
422
423 #define CONDS_BIT        0x00100000
424 #define LOAD_BIT         0x00100000
425
426 #define DOUBLE_LOAD_FLAG 0x00000001
427
428 struct asm_cond
429 {
430   const char *   template_name;
431   unsigned long  value;
432 };
433
434 #define COND_ALWAYS 0xE
435
436 struct asm_psr
437 {
438   const char *   template_name;
439   unsigned long  field;
440 };
441
442 struct asm_barrier_opt
443 {
444   const char *   template_name;
445   unsigned long  value;
446 };
447
448 /* The bit that distinguishes CPSR and SPSR.  */
449 #define SPSR_BIT   (1 << 22)
450
451 /* The individual PSR flag bits.  */
452 #define PSR_c   (1 << 16)
453 #define PSR_x   (1 << 17)
454 #define PSR_s   (1 << 18)
455 #define PSR_f   (1 << 19)
456
457 struct reloc_entry
458 {
459   char *                    name;
460   bfd_reloc_code_real_type  reloc;
461 };
462
463 enum vfp_reg_pos
464 {
465   VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
466   VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
467 };
468
469 enum vfp_ldstm_type
470 {
471   VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
472 };
473
474 /* Bits for DEFINED field in neon_typed_alias.  */
475 #define NTA_HASTYPE  1
476 #define NTA_HASINDEX 2
477
478 struct neon_typed_alias
479 {
480   unsigned char        defined;
481   unsigned char        index;
482   struct neon_type_el  eltype;
483 };
484
485 /* ARM register categories.  This includes coprocessor numbers and various
486    architecture extensions' registers.  */
487 enum arm_reg_type
488 {
489   REG_TYPE_RN,
490   REG_TYPE_CP,
491   REG_TYPE_CN,
492   REG_TYPE_FN,
493   REG_TYPE_VFS,
494   REG_TYPE_VFD,
495   REG_TYPE_NQ,
496   REG_TYPE_VFSD,
497   REG_TYPE_NDQ,
498   REG_TYPE_NSDQ,
499   REG_TYPE_VFC,
500   REG_TYPE_MVF,
501   REG_TYPE_MVD,
502   REG_TYPE_MVFX,
503   REG_TYPE_MVDX,
504   REG_TYPE_MVAX,
505   REG_TYPE_DSPSC,
506   REG_TYPE_MMXWR,
507   REG_TYPE_MMXWC,
508   REG_TYPE_MMXWCG,
509   REG_TYPE_XSCALE,
510   REG_TYPE_RNB
511 };
512
513 /* Structure for a hash table entry for a register.
514    If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
515    information which states whether a vector type or index is specified (for a
516    register alias created with .dn or .qn). Otherwise NEON should be NULL.  */
517 struct reg_entry
518 {
519   const char *               name;
520   unsigned int               number;
521   unsigned char              type;
522   unsigned char              builtin;
523   struct neon_typed_alias *  neon;
524 };
525
526 /* Diagnostics used when we don't get a register of the expected type.  */
527 const char * const reg_expected_msgs[] =
528 {
529   N_("ARM register expected"),
530   N_("bad or missing co-processor number"),
531   N_("co-processor register expected"),
532   N_("FPA register expected"),
533   N_("VFP single precision register expected"),
534   N_("VFP/Neon double precision register expected"),
535   N_("Neon quad precision register expected"),
536   N_("VFP single or double precision register expected"),
537   N_("Neon double or quad precision register expected"),
538   N_("VFP single, double or Neon quad precision register expected"),
539   N_("VFP system register expected"),
540   N_("Maverick MVF register expected"),
541   N_("Maverick MVD register expected"),
542   N_("Maverick MVFX register expected"),
543   N_("Maverick MVDX register expected"),
544   N_("Maverick MVAX register expected"),
545   N_("Maverick DSPSC register expected"),
546   N_("iWMMXt data register expected"),
547   N_("iWMMXt control register expected"),
548   N_("iWMMXt scalar register expected"),
549   N_("XScale accumulator register expected"),
550 };
551
552 /* Some well known registers that we refer to directly elsewhere.  */
553 #define REG_SP  13
554 #define REG_LR  14
555 #define REG_PC  15
556
557 /* ARM instructions take 4bytes in the object file, Thumb instructions
558    take 2:  */
559 #define INSN_SIZE       4
560
561 struct asm_opcode
562 {
563   /* Basic string to match.  */
564   const char * template_name;
565
566   /* Parameters to instruction.  */
567   unsigned int operands[8];
568
569   /* Conditional tag - see opcode_lookup.  */
570   unsigned int tag : 4;
571
572   /* Basic instruction code.  */
573   unsigned int avalue : 28;
574
575   /* Thumb-format instruction code.  */
576   unsigned int tvalue;
577
578   /* Which architecture variant provides this instruction.  */
579   const arm_feature_set * avariant;
580   const arm_feature_set * tvariant;
581
582   /* Function to call to encode instruction in ARM format.  */
583   void (* aencode) (void);
584
585   /* Function to call to encode instruction in Thumb format.  */
586   void (* tencode) (void);
587 };
588
589 /* Defines for various bits that we will want to toggle.  */
590 #define INST_IMMEDIATE  0x02000000
591 #define OFFSET_REG      0x02000000
592 #define HWOFFSET_IMM    0x00400000
593 #define SHIFT_BY_REG    0x00000010
594 #define PRE_INDEX       0x01000000
595 #define INDEX_UP        0x00800000
596 #define WRITE_BACK      0x00200000
597 #define LDM_TYPE_2_OR_3 0x00400000
598 #define CPSI_MMOD       0x00020000
599
600 #define LITERAL_MASK    0xf000f000
601 #define OPCODE_MASK     0xfe1fffff
602 #define V4_STR_BIT      0x00000020
603
604 #define T2_SUBS_PC_LR   0xf3de8f00
605
606 #define DATA_OP_SHIFT   21
607
608 #define T2_OPCODE_MASK  0xfe1fffff
609 #define T2_DATA_OP_SHIFT 21
610
611 /* Codes to distinguish the arithmetic instructions.  */
612 #define OPCODE_AND      0
613 #define OPCODE_EOR      1
614 #define OPCODE_SUB      2
615 #define OPCODE_RSB      3
616 #define OPCODE_ADD      4
617 #define OPCODE_ADC      5
618 #define OPCODE_SBC      6
619 #define OPCODE_RSC      7
620 #define OPCODE_TST      8
621 #define OPCODE_TEQ      9
622 #define OPCODE_CMP      10
623 #define OPCODE_CMN      11
624 #define OPCODE_ORR      12
625 #define OPCODE_MOV      13
626 #define OPCODE_BIC      14
627 #define OPCODE_MVN      15
628
629 #define T2_OPCODE_AND   0
630 #define T2_OPCODE_BIC   1
631 #define T2_OPCODE_ORR   2
632 #define T2_OPCODE_ORN   3
633 #define T2_OPCODE_EOR   4
634 #define T2_OPCODE_ADD   8
635 #define T2_OPCODE_ADC   10
636 #define T2_OPCODE_SBC   11
637 #define T2_OPCODE_SUB   13
638 #define T2_OPCODE_RSB   14
639
640 #define T_OPCODE_MUL 0x4340
641 #define T_OPCODE_TST 0x4200
642 #define T_OPCODE_CMN 0x42c0
643 #define T_OPCODE_NEG 0x4240
644 #define T_OPCODE_MVN 0x43c0
645
646 #define T_OPCODE_ADD_R3 0x1800
647 #define T_OPCODE_SUB_R3 0x1a00
648 #define T_OPCODE_ADD_HI 0x4400
649 #define T_OPCODE_ADD_ST 0xb000
650 #define T_OPCODE_SUB_ST 0xb080
651 #define T_OPCODE_ADD_SP 0xa800
652 #define T_OPCODE_ADD_PC 0xa000
653 #define T_OPCODE_ADD_I8 0x3000
654 #define T_OPCODE_SUB_I8 0x3800
655 #define T_OPCODE_ADD_I3 0x1c00
656 #define T_OPCODE_SUB_I3 0x1e00
657
658 #define T_OPCODE_ASR_R  0x4100
659 #define T_OPCODE_LSL_R  0x4080
660 #define T_OPCODE_LSR_R  0x40c0
661 #define T_OPCODE_ROR_R  0x41c0
662 #define T_OPCODE_ASR_I  0x1000
663 #define T_OPCODE_LSL_I  0x0000
664 #define T_OPCODE_LSR_I  0x0800
665
666 #define T_OPCODE_MOV_I8 0x2000
667 #define T_OPCODE_CMP_I8 0x2800
668 #define T_OPCODE_CMP_LR 0x4280
669 #define T_OPCODE_MOV_HR 0x4600
670 #define T_OPCODE_CMP_HR 0x4500
671
672 #define T_OPCODE_LDR_PC 0x4800
673 #define T_OPCODE_LDR_SP 0x9800
674 #define T_OPCODE_STR_SP 0x9000
675 #define T_OPCODE_LDR_IW 0x6800
676 #define T_OPCODE_STR_IW 0x6000
677 #define T_OPCODE_LDR_IH 0x8800
678 #define T_OPCODE_STR_IH 0x8000
679 #define T_OPCODE_LDR_IB 0x7800
680 #define T_OPCODE_STR_IB 0x7000
681 #define T_OPCODE_LDR_RW 0x5800
682 #define T_OPCODE_STR_RW 0x5000
683 #define T_OPCODE_LDR_RH 0x5a00
684 #define T_OPCODE_STR_RH 0x5200
685 #define T_OPCODE_LDR_RB 0x5c00
686 #define T_OPCODE_STR_RB 0x5400
687
688 #define T_OPCODE_PUSH   0xb400
689 #define T_OPCODE_POP    0xbc00
690
691 #define T_OPCODE_BRANCH 0xe000
692
693 #define THUMB_SIZE      2       /* Size of thumb instruction.  */
694 #define THUMB_PP_PC_LR 0x0100
695 #define THUMB_LOAD_BIT 0x0800
696 #define THUMB2_LOAD_BIT 0x00100000
697
698 #define BAD_ARGS        _("bad arguments to instruction")
699 #define BAD_SP          _("r13 not allowed here")
700 #define BAD_PC          _("r15 not allowed here")
701 #define BAD_COND        _("instruction cannot be conditional")
702 #define BAD_OVERLAP     _("registers may not be the same")
703 #define BAD_HIREG       _("lo register required")
704 #define BAD_THUMB32     _("instruction not supported in Thumb16 mode")
705 #define BAD_ADDR_MODE   _("instruction does not accept this addressing mode");
706 #define BAD_BRANCH      _("branch must be last instruction in IT block")
707 #define BAD_NOT_IT      _("instruction not allowed in IT block")
708 #define BAD_FPU         _("selected FPU does not support instruction")
709 #define BAD_OUT_IT      _("thumb conditional instruction should be in IT block")
710 #define BAD_IT_COND     _("incorrect condition in IT block")
711 #define BAD_IT_IT       _("IT falling in the range of a previous IT block")
712 #define MISSING_FNSTART _("missing .fnstart before unwinding directive")
713 #define BAD_PC_ADDRESSING \
714         _("cannot use register index with PC-relative addressing")
715 #define BAD_PC_WRITEBACK \
716         _("cannot use writeback with PC-relative addressing")
717
718 static struct hash_control * arm_ops_hsh;
719 static struct hash_control * arm_cond_hsh;
720 static struct hash_control * arm_shift_hsh;
721 static struct hash_control * arm_psr_hsh;
722 static struct hash_control * arm_v7m_psr_hsh;
723 static struct hash_control * arm_reg_hsh;
724 static struct hash_control * arm_reloc_hsh;
725 static struct hash_control * arm_barrier_opt_hsh;
726
727 /* Stuff needed to resolve the label ambiguity
728    As:
729      ...
730      label:   <insn>
731    may differ from:
732      ...
733      label:
734               <insn>  */
735
736 symbolS *  last_label_seen;
737 static int label_is_thumb_function_name = FALSE;
738
739 /* Literal pool structure.  Held on a per-section
740    and per-sub-section basis.  */
741
742 #define MAX_LITERAL_POOL_SIZE 1024
743 typedef struct literal_pool
744 {
745   expressionS            literals [MAX_LITERAL_POOL_SIZE];
746   unsigned int           next_free_entry;
747   unsigned int           id;
748   symbolS *              symbol;
749   segT                   section;
750   subsegT                sub_section;
751   struct literal_pool *  next;
752 } literal_pool;
753
754 /* Pointer to a linked list of literal pools.  */
755 literal_pool * list_of_pools = NULL;
756
757 #ifdef OBJ_ELF
758 #  define now_it seg_info (now_seg)->tc_segment_info_data.current_it
759 #else
760 static struct current_it now_it;
761 #endif
762
763 static inline int
764 now_it_compatible (int cond)
765 {
766   return (cond & ~1) == (now_it.cc & ~1);
767 }
768
769 static inline int
770 conditional_insn (void)
771 {
772   return inst.cond != COND_ALWAYS;
773 }
774
775 static int in_it_block (void);
776
777 static int handle_it_state (void);
778
779 static void force_automatic_it_block_close (void);
780
781 static void it_fsm_post_encode (void);
782
783 #define set_it_insn_type(type)                  \
784   do                                            \
785     {                                           \
786       inst.it_insn_type = type;                 \
787       if (handle_it_state () == FAIL)           \
788         return;                                 \
789     }                                           \
790   while (0)
791
792 #define set_it_insn_type_nonvoid(type, failret) \
793   do                                            \
794     {                                           \
795       inst.it_insn_type = type;                 \
796       if (handle_it_state () == FAIL)           \
797         return failret;                         \
798     }                                           \
799   while(0)
800
801 #define set_it_insn_type_last()                         \
802   do                                                    \
803     {                                                   \
804       if (inst.cond == COND_ALWAYS)                     \
805         set_it_insn_type (IF_INSIDE_IT_LAST_INSN);      \
806       else                                              \
807         set_it_insn_type (INSIDE_IT_LAST_INSN);         \
808     }                                                   \
809   while (0)
810
811 /* Pure syntax.  */
812
813 /* This array holds the chars that always start a comment.  If the
814    pre-processor is disabled, these aren't very useful.  */
815 const char comment_chars[] = "@";
816
817 /* This array holds the chars that only start a comment at the beginning of
818    a line.  If the line seems to have the form '# 123 filename'
819    .line and .file directives will appear in the pre-processed output.  */
820 /* Note that input_file.c hand checks for '#' at the beginning of the
821    first line of the input file.  This is because the compiler outputs
822    #NO_APP at the beginning of its output.  */
823 /* Also note that comments like this one will always work.  */
824 const char line_comment_chars[] = "#";
825
826 const char line_separator_chars[] = ";";
827
828 /* Chars that can be used to separate mant
829    from exp in floating point numbers.  */
830 const char EXP_CHARS[] = "eE";
831
832 /* Chars that mean this number is a floating point constant.  */
833 /* As in 0f12.456  */
834 /* or    0d1.2345e12  */
835
836 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
837
838 /* Prefix characters that indicate the start of an immediate
839    value.  */
840 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
841
842 /* Separator character handling.  */
843
844 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
845
846 static inline int
847 skip_past_char (char ** str, char c)
848 {
849   if (**str == c)
850     {
851       (*str)++;
852       return SUCCESS;
853     }
854   else
855     return FAIL;
856 }
857
858 #define skip_past_comma(str) skip_past_char (str, ',')
859
860 /* Arithmetic expressions (possibly involving symbols).  */
861
862 /* Return TRUE if anything in the expression is a bignum.  */
863
864 static int
865 walk_no_bignums (symbolS * sp)
866 {
867   if (symbol_get_value_expression (sp)->X_op == O_big)
868     return 1;
869
870   if (symbol_get_value_expression (sp)->X_add_symbol)
871     {
872       return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
873               || (symbol_get_value_expression (sp)->X_op_symbol
874                   && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
875     }
876
877   return 0;
878 }
879
880 static int in_my_get_expression = 0;
881
882 /* Third argument to my_get_expression.  */
883 #define GE_NO_PREFIX 0
884 #define GE_IMM_PREFIX 1
885 #define GE_OPT_PREFIX 2
886 /* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
887    immediates, as can be used in Neon VMVN and VMOV immediate instructions.  */
888 #define GE_OPT_PREFIX_BIG 3
889
890 static int
891 my_get_expression (expressionS * ep, char ** str, int prefix_mode)
892 {
893   char * save_in;
894   segT   seg;
895
896   /* In unified syntax, all prefixes are optional.  */
897   if (unified_syntax)
898     prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
899                   : GE_OPT_PREFIX;
900
901   switch (prefix_mode)
902     {
903     case GE_NO_PREFIX: break;
904     case GE_IMM_PREFIX:
905       if (!is_immediate_prefix (**str))
906         {
907           inst.error = _("immediate expression requires a # prefix");
908           return FAIL;
909         }
910       (*str)++;
911       break;
912     case GE_OPT_PREFIX:
913     case GE_OPT_PREFIX_BIG:
914       if (is_immediate_prefix (**str))
915         (*str)++;
916       break;
917     default: abort ();
918     }
919
920   memset (ep, 0, sizeof (expressionS));
921
922   save_in = input_line_pointer;
923   input_line_pointer = *str;
924   in_my_get_expression = 1;
925   seg = expression (ep);
926   in_my_get_expression = 0;
927
928   if (ep->X_op == O_illegal || ep->X_op == O_absent)
929     {
930       /* We found a bad or missing expression in md_operand().  */
931       *str = input_line_pointer;
932       input_line_pointer = save_in;
933       if (inst.error == NULL)
934         inst.error = (ep->X_op == O_absent
935                       ? _("missing expression") :_("bad expression"));
936       return 1;
937     }
938
939 #ifdef OBJ_AOUT
940   if (seg != absolute_section
941       && seg != text_section
942       && seg != data_section
943       && seg != bss_section
944       && seg != undefined_section)
945     {
946       inst.error = _("bad segment");
947       *str = input_line_pointer;
948       input_line_pointer = save_in;
949       return 1;
950     }
951 #else
952   (void) seg;
953 #endif
954
955   /* Get rid of any bignums now, so that we don't generate an error for which
956      we can't establish a line number later on.  Big numbers are never valid
957      in instructions, which is where this routine is always called.  */
958   if (prefix_mode != GE_OPT_PREFIX_BIG
959       && (ep->X_op == O_big
960           || (ep->X_add_symbol
961               && (walk_no_bignums (ep->X_add_symbol)
962                   || (ep->X_op_symbol
963                       && walk_no_bignums (ep->X_op_symbol))))))
964     {
965       inst.error = _("invalid constant");
966       *str = input_line_pointer;
967       input_line_pointer = save_in;
968       return 1;
969     }
970
971   *str = input_line_pointer;
972   input_line_pointer = save_in;
973   return 0;
974 }
975
976 /* Turn a string in input_line_pointer into a floating point constant
977    of type TYPE, and store the appropriate bytes in *LITP.  The number
978    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
979    returned, or NULL on OK.
980
981    Note that fp constants aren't represent in the normal way on the ARM.
982    In big endian mode, things are as expected.  However, in little endian
983    mode fp constants are big-endian word-wise, and little-endian byte-wise
984    within the words.  For example, (double) 1.1 in big endian mode is
985    the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
986    the byte sequence 99 99 f1 3f 9a 99 99 99.
987
988    ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
989
990 char *
991 md_atof (int type, char * litP, int * sizeP)
992 {
993   int prec;
994   LITTLENUM_TYPE words[MAX_LITTLENUMS];
995   char *t;
996   int i;
997
998   switch (type)
999     {
1000     case 'f':
1001     case 'F':
1002     case 's':
1003     case 'S':
1004       prec = 2;
1005       break;
1006
1007     case 'd':
1008     case 'D':
1009     case 'r':
1010     case 'R':
1011       prec = 4;
1012       break;
1013
1014     case 'x':
1015     case 'X':
1016       prec = 5;
1017       break;
1018
1019     case 'p':
1020     case 'P':
1021       prec = 5;
1022       break;
1023
1024     default:
1025       *sizeP = 0;
1026       return _("Unrecognized or unsupported floating point constant");
1027     }
1028
1029   t = atof_ieee (input_line_pointer, type, words);
1030   if (t)
1031     input_line_pointer = t;
1032   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1033
1034   if (target_big_endian)
1035     {
1036       for (i = 0; i < prec; i++)
1037         {
1038           md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1039           litP += sizeof (LITTLENUM_TYPE);
1040         }
1041     }
1042   else
1043     {
1044       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
1045         for (i = prec - 1; i >= 0; i--)
1046           {
1047             md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1048             litP += sizeof (LITTLENUM_TYPE);
1049           }
1050       else
1051         /* For a 4 byte float the order of elements in `words' is 1 0.
1052            For an 8 byte float the order is 1 0 3 2.  */
1053         for (i = 0; i < prec; i += 2)
1054           {
1055             md_number_to_chars (litP, (valueT) words[i + 1],
1056                                 sizeof (LITTLENUM_TYPE));
1057             md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1058                                 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1059             litP += 2 * sizeof (LITTLENUM_TYPE);
1060           }
1061     }
1062
1063   return NULL;
1064 }
1065
1066 /* We handle all bad expressions here, so that we can report the faulty
1067    instruction in the error message.  */
1068 void
1069 md_operand (expressionS * exp)
1070 {
1071   if (in_my_get_expression)
1072     exp->X_op = O_illegal;
1073 }
1074
1075 /* Immediate values.  */
1076
1077 /* Generic immediate-value read function for use in directives.
1078    Accepts anything that 'expression' can fold to a constant.
1079    *val receives the number.  */
1080 #ifdef OBJ_ELF
1081 static int
1082 immediate_for_directive (int *val)
1083 {
1084   expressionS exp;
1085   exp.X_op = O_illegal;
1086
1087   if (is_immediate_prefix (*input_line_pointer))
1088     {
1089       input_line_pointer++;
1090       expression (&exp);
1091     }
1092
1093   if (exp.X_op != O_constant)
1094     {
1095       as_bad (_("expected #constant"));
1096       ignore_rest_of_line ();
1097       return FAIL;
1098     }
1099   *val = exp.X_add_number;
1100   return SUCCESS;
1101 }
1102 #endif
1103
1104 /* Register parsing.  */
1105
1106 /* Generic register parser.  CCP points to what should be the
1107    beginning of a register name.  If it is indeed a valid register
1108    name, advance CCP over it and return the reg_entry structure;
1109    otherwise return NULL.  Does not issue diagnostics.  */
1110
1111 static struct reg_entry *
1112 arm_reg_parse_multi (char **ccp)
1113 {
1114   char *start = *ccp;
1115   char *p;
1116   struct reg_entry *reg;
1117
1118 #ifdef REGISTER_PREFIX
1119   if (*start != REGISTER_PREFIX)
1120     return NULL;
1121   start++;
1122 #endif
1123 #ifdef OPTIONAL_REGISTER_PREFIX
1124   if (*start == OPTIONAL_REGISTER_PREFIX)
1125     start++;
1126 #endif
1127
1128   p = start;
1129   if (!ISALPHA (*p) || !is_name_beginner (*p))
1130     return NULL;
1131
1132   do
1133     p++;
1134   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1135
1136   reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1137
1138   if (!reg)
1139     return NULL;
1140
1141   *ccp = p;
1142   return reg;
1143 }
1144
1145 static int
1146 arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1147                     enum arm_reg_type type)
1148 {
1149   /* Alternative syntaxes are accepted for a few register classes.  */
1150   switch (type)
1151     {
1152     case REG_TYPE_MVF:
1153     case REG_TYPE_MVD:
1154     case REG_TYPE_MVFX:
1155     case REG_TYPE_MVDX:
1156       /* Generic coprocessor register names are allowed for these.  */
1157       if (reg && reg->type == REG_TYPE_CN)
1158         return reg->number;
1159       break;
1160
1161     case REG_TYPE_CP:
1162       /* For backward compatibility, a bare number is valid here.  */
1163       {
1164         unsigned long processor = strtoul (start, ccp, 10);
1165         if (*ccp != start && processor <= 15)
1166           return processor;
1167       }
1168
1169     case REG_TYPE_MMXWC:
1170       /* WC includes WCG.  ??? I'm not sure this is true for all
1171          instructions that take WC registers.  */
1172       if (reg && reg->type == REG_TYPE_MMXWCG)
1173         return reg->number;
1174       break;
1175
1176     default:
1177       break;
1178     }
1179
1180   return FAIL;
1181 }
1182
1183 /* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1184    return value is the register number or FAIL.  */
1185
1186 static int
1187 arm_reg_parse (char **ccp, enum arm_reg_type type)
1188 {
1189   char *start = *ccp;
1190   struct reg_entry *reg = arm_reg_parse_multi (ccp);
1191   int ret;
1192
1193   /* Do not allow a scalar (reg+index) to parse as a register.  */
1194   if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1195     return FAIL;
1196
1197   if (reg && reg->type == type)
1198     return reg->number;
1199
1200   if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1201     return ret;
1202
1203   *ccp = start;
1204   return FAIL;
1205 }
1206
1207 /* Parse a Neon type specifier. *STR should point at the leading '.'
1208    character. Does no verification at this stage that the type fits the opcode
1209    properly. E.g.,
1210
1211      .i32.i32.s16
1212      .s32.f32
1213      .u16
1214
1215    Can all be legally parsed by this function.
1216
1217    Fills in neon_type struct pointer with parsed information, and updates STR
1218    to point after the parsed type specifier. Returns SUCCESS if this was a legal
1219    type, FAIL if not.  */
1220
1221 static int
1222 parse_neon_type (struct neon_type *type, char **str)
1223 {
1224   char *ptr = *str;
1225
1226   if (type)
1227     type->elems = 0;
1228
1229   while (type->elems < NEON_MAX_TYPE_ELS)
1230     {
1231       enum neon_el_type thistype = NT_untyped;
1232       unsigned thissize = -1u;
1233
1234       if (*ptr != '.')
1235         break;
1236
1237       ptr++;
1238
1239       /* Just a size without an explicit type.  */
1240       if (ISDIGIT (*ptr))
1241         goto parsesize;
1242
1243       switch (TOLOWER (*ptr))
1244         {
1245         case 'i': thistype = NT_integer; break;
1246         case 'f': thistype = NT_float; break;
1247         case 'p': thistype = NT_poly; break;
1248         case 's': thistype = NT_signed; break;
1249         case 'u': thistype = NT_unsigned; break;
1250         case 'd':
1251           thistype = NT_float;
1252           thissize = 64;
1253           ptr++;
1254           goto done;
1255         default:
1256           as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1257           return FAIL;
1258         }
1259
1260       ptr++;
1261
1262       /* .f is an abbreviation for .f32.  */
1263       if (thistype == NT_float && !ISDIGIT (*ptr))
1264         thissize = 32;
1265       else
1266         {
1267         parsesize:
1268           thissize = strtoul (ptr, &ptr, 10);
1269
1270           if (thissize != 8 && thissize != 16 && thissize != 32
1271               && thissize != 64)
1272             {
1273               as_bad (_("bad size %d in type specifier"), thissize);
1274               return FAIL;
1275             }
1276         }
1277
1278       done:
1279       if (type)
1280         {
1281           type->el[type->elems].type = thistype;
1282           type->el[type->elems].size = thissize;
1283           type->elems++;
1284         }
1285     }
1286
1287   /* Empty/missing type is not a successful parse.  */
1288   if (type->elems == 0)
1289     return FAIL;
1290
1291   *str = ptr;
1292
1293   return SUCCESS;
1294 }
1295
1296 /* Errors may be set multiple times during parsing or bit encoding
1297    (particularly in the Neon bits), but usually the earliest error which is set
1298    will be the most meaningful. Avoid overwriting it with later (cascading)
1299    errors by calling this function.  */
1300
1301 static void
1302 first_error (const char *err)
1303 {
1304   if (!inst.error)
1305     inst.error = err;
1306 }
1307
1308 /* Parse a single type, e.g. ".s32", leading period included.  */
1309 static int
1310 parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1311 {
1312   char *str = *ccp;
1313   struct neon_type optype;
1314
1315   if (*str == '.')
1316     {
1317       if (parse_neon_type (&optype, &str) == SUCCESS)
1318         {
1319           if (optype.elems == 1)
1320             *vectype = optype.el[0];
1321           else
1322             {
1323               first_error (_("only one type should be specified for operand"));
1324               return FAIL;
1325             }
1326         }
1327       else
1328         {
1329           first_error (_("vector type expected"));
1330           return FAIL;
1331         }
1332     }
1333   else
1334     return FAIL;
1335
1336   *ccp = str;
1337
1338   return SUCCESS;
1339 }
1340
1341 /* Special meanings for indices (which have a range of 0-7), which will fit into
1342    a 4-bit integer.  */
1343
1344 #define NEON_ALL_LANES          15
1345 #define NEON_INTERLEAVE_LANES   14
1346
1347 /* Parse either a register or a scalar, with an optional type. Return the
1348    register number, and optionally fill in the actual type of the register
1349    when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1350    type/index information in *TYPEINFO.  */
1351
1352 static int
1353 parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1354                            enum arm_reg_type *rtype,
1355                            struct neon_typed_alias *typeinfo)
1356 {
1357   char *str = *ccp;
1358   struct reg_entry *reg = arm_reg_parse_multi (&str);
1359   struct neon_typed_alias atype;
1360   struct neon_type_el parsetype;
1361
1362   atype.defined = 0;
1363   atype.index = -1;
1364   atype.eltype.type = NT_invtype;
1365   atype.eltype.size = -1;
1366
1367   /* Try alternate syntax for some types of register. Note these are mutually
1368      exclusive with the Neon syntax extensions.  */
1369   if (reg == NULL)
1370     {
1371       int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1372       if (altreg != FAIL)
1373         *ccp = str;
1374       if (typeinfo)
1375         *typeinfo = atype;
1376       return altreg;
1377     }
1378
1379   /* Undo polymorphism when a set of register types may be accepted.  */
1380   if ((type == REG_TYPE_NDQ
1381        && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1382       || (type == REG_TYPE_VFSD
1383           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1384       || (type == REG_TYPE_NSDQ
1385           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1386               || reg->type == REG_TYPE_NQ))
1387       || (type == REG_TYPE_MMXWC
1388           && (reg->type == REG_TYPE_MMXWCG)))
1389     type = (enum arm_reg_type) reg->type;
1390
1391   if (type != reg->type)
1392     return FAIL;
1393
1394   if (reg->neon)
1395     atype = *reg->neon;
1396
1397   if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1398     {
1399       if ((atype.defined & NTA_HASTYPE) != 0)
1400         {
1401           first_error (_("can't redefine type for operand"));
1402           return FAIL;
1403         }
1404       atype.defined |= NTA_HASTYPE;
1405       atype.eltype = parsetype;
1406     }
1407
1408   if (skip_past_char (&str, '[') == SUCCESS)
1409     {
1410       if (type != REG_TYPE_VFD)
1411         {
1412           first_error (_("only D registers may be indexed"));
1413           return FAIL;
1414         }
1415
1416       if ((atype.defined & NTA_HASINDEX) != 0)
1417         {
1418           first_error (_("can't change index for operand"));
1419           return FAIL;
1420         }
1421
1422       atype.defined |= NTA_HASINDEX;
1423
1424       if (skip_past_char (&str, ']') == SUCCESS)
1425         atype.index = NEON_ALL_LANES;
1426       else
1427         {
1428           expressionS exp;
1429
1430           my_get_expression (&exp, &str, GE_NO_PREFIX);
1431
1432           if (exp.X_op != O_constant)
1433             {
1434               first_error (_("constant expression required"));
1435               return FAIL;
1436             }
1437
1438           if (skip_past_char (&str, ']') == FAIL)
1439             return FAIL;
1440
1441           atype.index = exp.X_add_number;
1442         }
1443     }
1444
1445   if (typeinfo)
1446     *typeinfo = atype;
1447
1448   if (rtype)
1449     *rtype = type;
1450
1451   *ccp = str;
1452
1453   return reg->number;
1454 }
1455
1456 /* Like arm_reg_parse, but allow allow the following extra features:
1457     - If RTYPE is non-zero, return the (possibly restricted) type of the
1458       register (e.g. Neon double or quad reg when either has been requested).
1459     - If this is a Neon vector type with additional type information, fill
1460       in the struct pointed to by VECTYPE (if non-NULL).
1461    This function will fault on encountering a scalar.  */
1462
1463 static int
1464 arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1465                      enum arm_reg_type *rtype, struct neon_type_el *vectype)
1466 {
1467   struct neon_typed_alias atype;
1468   char *str = *ccp;
1469   int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1470
1471   if (reg == FAIL)
1472     return FAIL;
1473
1474   /* Do not allow a scalar (reg+index) to parse as a register.  */
1475   if ((atype.defined & NTA_HASINDEX) != 0)
1476     {
1477       first_error (_("register operand expected, but got scalar"));
1478       return FAIL;
1479     }
1480
1481   if (vectype)
1482     *vectype = atype.eltype;
1483
1484   *ccp = str;
1485
1486   return reg;
1487 }
1488
1489 #define NEON_SCALAR_REG(X)      ((X) >> 4)
1490 #define NEON_SCALAR_INDEX(X)    ((X) & 15)
1491
1492 /* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1493    have enough information to be able to do a good job bounds-checking. So, we
1494    just do easy checks here, and do further checks later.  */
1495
1496 static int
1497 parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
1498 {
1499   int reg;
1500   char *str = *ccp;
1501   struct neon_typed_alias atype;
1502
1503   reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
1504
1505   if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
1506     return FAIL;
1507
1508   if (atype.index == NEON_ALL_LANES)
1509     {
1510       first_error (_("scalar must have an index"));
1511       return FAIL;
1512     }
1513   else if (atype.index >= 64 / elsize)
1514     {
1515       first_error (_("scalar index out of range"));
1516       return FAIL;
1517     }
1518
1519   if (type)
1520     *type = atype.eltype;
1521
1522   *ccp = str;
1523
1524   return reg * 16 + atype.index;
1525 }
1526
1527 /* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
1528
1529 static long
1530 parse_reg_list (char ** strp)
1531 {
1532   char * str = * strp;
1533   long   range = 0;
1534   int    another_range;
1535
1536   /* We come back here if we get ranges concatenated by '+' or '|'.  */
1537   do
1538     {
1539       another_range = 0;
1540
1541       if (*str == '{')
1542         {
1543           int in_range = 0;
1544           int cur_reg = -1;
1545
1546           str++;
1547           do
1548             {
1549               int reg;
1550
1551               if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
1552                 {
1553                   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
1554                   return FAIL;
1555                 }
1556
1557               if (in_range)
1558                 {
1559                   int i;
1560
1561                   if (reg <= cur_reg)
1562                     {
1563                       first_error (_("bad range in register list"));
1564                       return FAIL;
1565                     }
1566
1567                   for (i = cur_reg + 1; i < reg; i++)
1568                     {
1569                       if (range & (1 << i))
1570                         as_tsktsk
1571                           (_("Warning: duplicated register (r%d) in register list"),
1572                            i);
1573                       else
1574                         range |= 1 << i;
1575                     }
1576                   in_range = 0;
1577                 }
1578
1579               if (range & (1 << reg))
1580                 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1581                            reg);
1582               else if (reg <= cur_reg)
1583                 as_tsktsk (_("Warning: register range not in ascending order"));
1584
1585               range |= 1 << reg;
1586               cur_reg = reg;
1587             }
1588           while (skip_past_comma (&str) != FAIL
1589                  || (in_range = 1, *str++ == '-'));
1590           str--;
1591
1592           if (*str++ != '}')
1593             {
1594               first_error (_("missing `}'"));
1595               return FAIL;
1596             }
1597         }
1598       else
1599         {
1600           expressionS exp;
1601
1602           if (my_get_expression (&exp, &str, GE_NO_PREFIX))
1603             return FAIL;
1604
1605           if (exp.X_op == O_constant)
1606             {
1607               if (exp.X_add_number
1608                   != (exp.X_add_number & 0x0000ffff))
1609                 {
1610                   inst.error = _("invalid register mask");
1611                   return FAIL;
1612                 }
1613
1614               if ((range & exp.X_add_number) != 0)
1615                 {
1616                   int regno = range & exp.X_add_number;
1617
1618                   regno &= -regno;
1619                   regno = (1 << regno) - 1;
1620                   as_tsktsk
1621                     (_("Warning: duplicated register (r%d) in register list"),
1622                      regno);
1623                 }
1624
1625               range |= exp.X_add_number;
1626             }
1627           else
1628             {
1629               if (inst.reloc.type != 0)
1630                 {
1631                   inst.error = _("expression too complex");
1632                   return FAIL;
1633                 }
1634
1635               memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
1636               inst.reloc.type = BFD_RELOC_ARM_MULTI;
1637               inst.reloc.pc_rel = 0;
1638             }
1639         }
1640
1641       if (*str == '|' || *str == '+')
1642         {
1643           str++;
1644           another_range = 1;
1645         }
1646     }
1647   while (another_range);
1648
1649   *strp = str;
1650   return range;
1651 }
1652
1653 /* Types of registers in a list.  */
1654
1655 enum reg_list_els
1656 {
1657   REGLIST_VFP_S,
1658   REGLIST_VFP_D,
1659   REGLIST_NEON_D
1660 };
1661
1662 /* Parse a VFP register list.  If the string is invalid return FAIL.
1663    Otherwise return the number of registers, and set PBASE to the first
1664    register.  Parses registers of type ETYPE.
1665    If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1666      - Q registers can be used to specify pairs of D registers
1667      - { } can be omitted from around a singleton register list
1668          FIXME: This is not implemented, as it would require backtracking in
1669          some cases, e.g.:
1670            vtbl.8 d3,d4,d5
1671          This could be done (the meaning isn't really ambiguous), but doesn't
1672          fit in well with the current parsing framework.
1673      - 32 D registers may be used (also true for VFPv3).
1674    FIXME: Types are ignored in these register lists, which is probably a
1675    bug.  */
1676
1677 static int
1678 parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
1679 {
1680   char *str = *ccp;
1681   int base_reg;
1682   int new_base;
1683   enum arm_reg_type regtype = (enum arm_reg_type) 0;
1684   int max_regs = 0;
1685   int count = 0;
1686   int warned = 0;
1687   unsigned long mask = 0;
1688   int i;
1689
1690   if (*str != '{')
1691     {
1692       inst.error = _("expecting {");
1693       return FAIL;
1694     }
1695
1696   str++;
1697
1698   switch (etype)
1699     {
1700     case REGLIST_VFP_S:
1701       regtype = REG_TYPE_VFS;
1702       max_regs = 32;
1703       break;
1704
1705     case REGLIST_VFP_D:
1706       regtype = REG_TYPE_VFD;
1707       break;
1708
1709     case REGLIST_NEON_D:
1710       regtype = REG_TYPE_NDQ;
1711       break;
1712     }
1713
1714   if (etype != REGLIST_VFP_S)
1715     {
1716       /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant.  */
1717       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
1718         {
1719           max_regs = 32;
1720           if (thumb_mode)
1721             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1722                                     fpu_vfp_ext_d32);
1723           else
1724             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1725                                     fpu_vfp_ext_d32);
1726         }
1727       else
1728         max_regs = 16;
1729     }
1730
1731   base_reg = max_regs;
1732
1733   do
1734     {
1735       int setmask = 1, addregs = 1;
1736
1737       new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
1738
1739       if (new_base == FAIL)
1740         {
1741           first_error (_(reg_expected_msgs[regtype]));
1742           return FAIL;
1743         }
1744
1745       if (new_base >= max_regs)
1746         {
1747           first_error (_("register out of range in list"));
1748           return FAIL;
1749         }
1750
1751       /* Note: a value of 2 * n is returned for the register Q<n>.  */
1752       if (regtype == REG_TYPE_NQ)
1753         {
1754           setmask = 3;
1755           addregs = 2;
1756         }
1757
1758       if (new_base < base_reg)
1759         base_reg = new_base;
1760
1761       if (mask & (setmask << new_base))
1762         {
1763           first_error (_("invalid register list"));
1764           return FAIL;
1765         }
1766
1767       if ((mask >> new_base) != 0 && ! warned)
1768         {
1769           as_tsktsk (_("register list not in ascending order"));
1770           warned = 1;
1771         }
1772
1773       mask |= setmask << new_base;
1774       count += addregs;
1775
1776       if (*str == '-') /* We have the start of a range expression */
1777         {
1778           int high_range;
1779
1780           str++;
1781
1782           if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
1783               == FAIL)
1784             {
1785               inst.error = gettext (reg_expected_msgs[regtype]);
1786               return FAIL;
1787             }
1788
1789           if (high_range >= max_regs)
1790             {
1791               first_error (_("register out of range in list"));
1792               return FAIL;
1793             }
1794
1795           if (regtype == REG_TYPE_NQ)
1796             high_range = high_range + 1;
1797
1798           if (high_range <= new_base)
1799             {
1800               inst.error = _("register range not in ascending order");
1801               return FAIL;
1802             }
1803
1804           for (new_base += addregs; new_base <= high_range; new_base += addregs)
1805             {
1806               if (mask & (setmask << new_base))
1807                 {
1808                   inst.error = _("invalid register list");
1809                   return FAIL;
1810                 }
1811
1812               mask |= setmask << new_base;
1813               count += addregs;
1814             }
1815         }
1816     }
1817   while (skip_past_comma (&str) != FAIL);
1818
1819   str++;
1820
1821   /* Sanity check -- should have raised a parse error above.  */
1822   if (count == 0 || count > max_regs)
1823     abort ();
1824
1825   *pbase = base_reg;
1826
1827   /* Final test -- the registers must be consecutive.  */
1828   mask >>= base_reg;
1829   for (i = 0; i < count; i++)
1830     {
1831       if ((mask & (1u << i)) == 0)
1832         {
1833           inst.error = _("non-contiguous register range");
1834           return FAIL;
1835         }
1836     }
1837
1838   *ccp = str;
1839
1840   return count;
1841 }
1842
1843 /* True if two alias types are the same.  */
1844
1845 static bfd_boolean
1846 neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1847 {
1848   if (!a && !b)
1849     return TRUE;
1850
1851   if (!a || !b)
1852     return FALSE;
1853
1854   if (a->defined != b->defined)
1855     return FALSE;
1856
1857   if ((a->defined & NTA_HASTYPE) != 0
1858       && (a->eltype.type != b->eltype.type
1859           || a->eltype.size != b->eltype.size))
1860     return FALSE;
1861
1862   if ((a->defined & NTA_HASINDEX) != 0
1863       && (a->index != b->index))
1864     return FALSE;
1865
1866   return TRUE;
1867 }
1868
1869 /* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1870    The base register is put in *PBASE.
1871    The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
1872    the return value.
1873    The register stride (minus one) is put in bit 4 of the return value.
1874    Bits [6:5] encode the list length (minus one).
1875    The type of the list elements is put in *ELTYPE, if non-NULL.  */
1876
1877 #define NEON_LANE(X)            ((X) & 0xf)
1878 #define NEON_REG_STRIDE(X)      ((((X) >> 4) & 1) + 1)
1879 #define NEON_REGLIST_LENGTH(X)  ((((X) >> 5) & 3) + 1)
1880
1881 static int
1882 parse_neon_el_struct_list (char **str, unsigned *pbase,
1883                            struct neon_type_el *eltype)
1884 {
1885   char *ptr = *str;
1886   int base_reg = -1;
1887   int reg_incr = -1;
1888   int count = 0;
1889   int lane = -1;
1890   int leading_brace = 0;
1891   enum arm_reg_type rtype = REG_TYPE_NDQ;
1892   const char *const incr_error = _("register stride must be 1 or 2");
1893   const char *const type_error = _("mismatched element/structure types in list");
1894   struct neon_typed_alias firsttype;
1895
1896   if (skip_past_char (&ptr, '{') == SUCCESS)
1897     leading_brace = 1;
1898
1899   do
1900     {
1901       struct neon_typed_alias atype;
1902       int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1903
1904       if (getreg == FAIL)
1905         {
1906           first_error (_(reg_expected_msgs[rtype]));
1907           return FAIL;
1908         }
1909
1910       if (base_reg == -1)
1911         {
1912           base_reg = getreg;
1913           if (rtype == REG_TYPE_NQ)
1914             {
1915               reg_incr = 1;
1916             }
1917           firsttype = atype;
1918         }
1919       else if (reg_incr == -1)
1920         {
1921           reg_incr = getreg - base_reg;
1922           if (reg_incr < 1 || reg_incr > 2)
1923             {
1924               first_error (_(incr_error));
1925               return FAIL;
1926             }
1927         }
1928       else if (getreg != base_reg + reg_incr * count)
1929         {
1930           first_error (_(incr_error));
1931           return FAIL;
1932         }
1933
1934       if (! neon_alias_types_same (&atype, &firsttype))
1935         {
1936           first_error (_(type_error));
1937           return FAIL;
1938         }
1939
1940       /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
1941          modes.  */
1942       if (ptr[0] == '-')
1943         {
1944           struct neon_typed_alias htype;
1945           int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1946           if (lane == -1)
1947             lane = NEON_INTERLEAVE_LANES;
1948           else if (lane != NEON_INTERLEAVE_LANES)
1949             {
1950               first_error (_(type_error));
1951               return FAIL;
1952             }
1953           if (reg_incr == -1)
1954             reg_incr = 1;
1955           else if (reg_incr != 1)
1956             {
1957               first_error (_("don't use Rn-Rm syntax with non-unit stride"));
1958               return FAIL;
1959             }
1960           ptr++;
1961           hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
1962           if (hireg == FAIL)
1963             {
1964               first_error (_(reg_expected_msgs[rtype]));
1965               return FAIL;
1966             }
1967           if (! neon_alias_types_same (&htype, &firsttype))
1968             {
1969               first_error (_(type_error));
1970               return FAIL;
1971             }
1972           count += hireg + dregs - getreg;
1973           continue;
1974         }
1975
1976       /* If we're using Q registers, we can't use [] or [n] syntax.  */
1977       if (rtype == REG_TYPE_NQ)
1978         {
1979           count += 2;
1980           continue;
1981         }
1982
1983       if ((atype.defined & NTA_HASINDEX) != 0)
1984         {
1985           if (lane == -1)
1986             lane = atype.index;
1987           else if (lane != atype.index)
1988             {
1989               first_error (_(type_error));
1990               return FAIL;
1991             }
1992         }
1993       else if (lane == -1)
1994         lane = NEON_INTERLEAVE_LANES;
1995       else if (lane != NEON_INTERLEAVE_LANES)
1996         {
1997           first_error (_(type_error));
1998           return FAIL;
1999         }
2000       count++;
2001     }
2002   while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
2003
2004   /* No lane set by [x]. We must be interleaving structures.  */
2005   if (lane == -1)
2006     lane = NEON_INTERLEAVE_LANES;
2007
2008   /* Sanity check.  */
2009   if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2010       || (count > 1 && reg_incr == -1))
2011     {
2012       first_error (_("error parsing element/structure list"));
2013       return FAIL;
2014     }
2015
2016   if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2017     {
2018       first_error (_("expected }"));
2019       return FAIL;
2020     }
2021
2022   if (reg_incr == -1)
2023     reg_incr = 1;
2024
2025   if (eltype)
2026     *eltype = firsttype.eltype;
2027
2028   *pbase = base_reg;
2029   *str = ptr;
2030
2031   return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2032 }
2033
2034 /* Parse an explicit relocation suffix on an expression.  This is
2035    either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
2036    arm_reloc_hsh contains no entries, so this function can only
2037    succeed if there is no () after the word.  Returns -1 on error,
2038    BFD_RELOC_UNUSED if there wasn't any suffix.  */
2039 static int
2040 parse_reloc (char **str)
2041 {
2042   struct reloc_entry *r;
2043   char *p, *q;
2044
2045   if (**str != '(')
2046     return BFD_RELOC_UNUSED;
2047
2048   p = *str + 1;
2049   q = p;
2050
2051   while (*q && *q != ')' && *q != ',')
2052     q++;
2053   if (*q != ')')
2054     return -1;
2055
2056   if ((r = (struct reloc_entry *)
2057        hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
2058     return -1;
2059
2060   *str = q + 1;
2061   return r->reloc;
2062 }
2063
2064 /* Directives: register aliases.  */
2065
2066 static struct reg_entry *
2067 insert_reg_alias (char *str, unsigned number, int type)
2068 {
2069   struct reg_entry *new_reg;
2070   const char *name;
2071
2072   if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
2073     {
2074       if (new_reg->builtin)
2075         as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
2076
2077       /* Only warn about a redefinition if it's not defined as the
2078          same register.  */
2079       else if (new_reg->number != number || new_reg->type != type)
2080         as_warn (_("ignoring redefinition of register alias '%s'"), str);
2081
2082       return NULL;
2083     }
2084
2085   name = xstrdup (str);
2086   new_reg = (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
2087
2088   new_reg->name = name;
2089   new_reg->number = number;
2090   new_reg->type = type;
2091   new_reg->builtin = FALSE;
2092   new_reg->neon = NULL;
2093
2094   if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
2095     abort ();
2096
2097   return new_reg;
2098 }
2099
2100 static void
2101 insert_neon_reg_alias (char *str, int number, int type,
2102                        struct neon_typed_alias *atype)
2103 {
2104   struct reg_entry *reg = insert_reg_alias (str, number, type);
2105
2106   if (!reg)
2107     {
2108       first_error (_("attempt to redefine typed alias"));
2109       return;
2110     }
2111
2112   if (atype)
2113     {
2114       reg->neon = (struct neon_typed_alias *)
2115           xmalloc (sizeof (struct neon_typed_alias));
2116       *reg->neon = *atype;
2117     }
2118 }
2119
2120 /* Look for the .req directive.  This is of the form:
2121
2122         new_register_name .req existing_register_name
2123
2124    If we find one, or if it looks sufficiently like one that we want to
2125    handle any error here, return TRUE.  Otherwise return FALSE.  */
2126
2127 static bfd_boolean
2128 create_register_alias (char * newname, char *p)
2129 {
2130   struct reg_entry *old;
2131   char *oldname, *nbuf;
2132   size_t nlen;
2133
2134   /* The input scrubber ensures that whitespace after the mnemonic is
2135      collapsed to single spaces.  */
2136   oldname = p;
2137   if (strncmp (oldname, " .req ", 6) != 0)
2138     return FALSE;
2139
2140   oldname += 6;
2141   if (*oldname == '\0')
2142     return FALSE;
2143
2144   old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
2145   if (!old)
2146     {
2147       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2148       return TRUE;
2149     }
2150
2151   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2152      the desired alias name, and p points to its end.  If not, then
2153      the desired alias name is in the global original_case_string.  */
2154 #ifdef TC_CASE_SENSITIVE
2155   nlen = p - newname;
2156 #else
2157   newname = original_case_string;
2158   nlen = strlen (newname);
2159 #endif
2160
2161   nbuf = (char *) alloca (nlen + 1);
2162   memcpy (nbuf, newname, nlen);
2163   nbuf[nlen] = '\0';
2164
2165   /* Create aliases under the new name as stated; an all-lowercase
2166      version of the new name; and an all-uppercase version of the new
2167      name.  */
2168   if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2169     {
2170       for (p = nbuf; *p; p++)
2171         *p = TOUPPER (*p);
2172
2173       if (strncmp (nbuf, newname, nlen))
2174         {
2175           /* If this attempt to create an additional alias fails, do not bother
2176              trying to create the all-lower case alias.  We will fail and issue
2177              a second, duplicate error message.  This situation arises when the
2178              programmer does something like:
2179                foo .req r0
2180                Foo .req r1
2181              The second .req creates the "Foo" alias but then fails to create
2182              the artificial FOO alias because it has already been created by the
2183              first .req.  */
2184           if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2185             return TRUE;
2186         }
2187
2188       for (p = nbuf; *p; p++)
2189         *p = TOLOWER (*p);
2190
2191       if (strncmp (nbuf, newname, nlen))
2192         insert_reg_alias (nbuf, old->number, old->type);
2193     }
2194
2195   return TRUE;
2196 }
2197
2198 /* Create a Neon typed/indexed register alias using directives, e.g.:
2199      X .dn d5.s32[1]
2200      Y .qn 6.s16
2201      Z .dn d7
2202      T .dn Z[0]
2203    These typed registers can be used instead of the types specified after the
2204    Neon mnemonic, so long as all operands given have types. Types can also be
2205    specified directly, e.g.:
2206      vadd d0.s32, d1.s32, d2.s32  */
2207
2208 static bfd_boolean
2209 create_neon_reg_alias (char *newname, char *p)
2210 {
2211   enum arm_reg_type basetype;
2212   struct reg_entry *basereg;
2213   struct reg_entry mybasereg;
2214   struct neon_type ntype;
2215   struct neon_typed_alias typeinfo;
2216   char *namebuf, *nameend;
2217   int namelen;
2218
2219   typeinfo.defined = 0;
2220   typeinfo.eltype.type = NT_invtype;
2221   typeinfo.eltype.size = -1;
2222   typeinfo.index = -1;
2223
2224   nameend = p;
2225
2226   if (strncmp (p, " .dn ", 5) == 0)
2227     basetype = REG_TYPE_VFD;
2228   else if (strncmp (p, " .qn ", 5) == 0)
2229     basetype = REG_TYPE_NQ;
2230   else
2231     return FALSE;
2232
2233   p += 5;
2234
2235   if (*p == '\0')
2236     return FALSE;
2237
2238   basereg = arm_reg_parse_multi (&p);
2239
2240   if (basereg && basereg->type != basetype)
2241     {
2242       as_bad (_("bad type for register"));
2243       return FALSE;
2244     }
2245
2246   if (basereg == NULL)
2247     {
2248       expressionS exp;
2249       /* Try parsing as an integer.  */
2250       my_get_expression (&exp, &p, GE_NO_PREFIX);
2251       if (exp.X_op != O_constant)
2252         {
2253           as_bad (_("expression must be constant"));
2254           return FALSE;
2255         }
2256       basereg = &mybasereg;
2257       basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2258                                                   : exp.X_add_number;
2259       basereg->neon = 0;
2260     }
2261
2262   if (basereg->neon)
2263     typeinfo = *basereg->neon;
2264
2265   if (parse_neon_type (&ntype, &p) == SUCCESS)
2266     {
2267       /* We got a type.  */
2268       if (typeinfo.defined & NTA_HASTYPE)
2269         {
2270           as_bad (_("can't redefine the type of a register alias"));
2271           return FALSE;
2272         }
2273
2274       typeinfo.defined |= NTA_HASTYPE;
2275       if (ntype.elems != 1)
2276         {
2277           as_bad (_("you must specify a single type only"));
2278           return FALSE;
2279         }
2280       typeinfo.eltype = ntype.el[0];
2281     }
2282
2283   if (skip_past_char (&p, '[') == SUCCESS)
2284     {
2285       expressionS exp;
2286       /* We got a scalar index.  */
2287
2288       if (typeinfo.defined & NTA_HASINDEX)
2289         {
2290           as_bad (_("can't redefine the index of a scalar alias"));
2291           return FALSE;
2292         }
2293
2294       my_get_expression (&exp, &p, GE_NO_PREFIX);
2295
2296       if (exp.X_op != O_constant)
2297         {
2298           as_bad (_("scalar index must be constant"));
2299           return FALSE;
2300         }
2301
2302       typeinfo.defined |= NTA_HASINDEX;
2303       typeinfo.index = exp.X_add_number;
2304
2305       if (skip_past_char (&p, ']') == FAIL)
2306         {
2307           as_bad (_("expecting ]"));
2308           return FALSE;
2309         }
2310     }
2311
2312   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2313      the desired alias name, and p points to its end.  If not, then
2314      the desired alias name is in the global original_case_string.  */
2315 #ifdef TC_CASE_SENSITIVE
2316   namelen = nameend - newname;
2317 #else
2318   newname = original_case_string;
2319   namelen = strlen (newname);
2320 #endif
2321
2322   namebuf = (char *) alloca (namelen + 1);
2323   strncpy (namebuf, newname, namelen);
2324   namebuf[namelen] = '\0';
2325
2326   insert_neon_reg_alias (namebuf, basereg->number, basetype,
2327                          typeinfo.defined != 0 ? &typeinfo : NULL);
2328
2329   /* Insert name in all uppercase.  */
2330   for (p = namebuf; *p; p++)
2331     *p = TOUPPER (*p);
2332
2333   if (strncmp (namebuf, newname, namelen))
2334     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2335                            typeinfo.defined != 0 ? &typeinfo : NULL);
2336
2337   /* Insert name in all lowercase.  */
2338   for (p = namebuf; *p; p++)
2339     *p = TOLOWER (*p);
2340
2341   if (strncmp (namebuf, newname, namelen))
2342     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2343                            typeinfo.defined != 0 ? &typeinfo : NULL);
2344
2345   return TRUE;
2346 }
2347
2348 /* Should never be called, as .req goes between the alias and the
2349    register name, not at the beginning of the line.  */
2350
2351 static void
2352 s_req (int a ATTRIBUTE_UNUSED)
2353 {
2354   as_bad (_("invalid syntax for .req directive"));
2355 }
2356
2357 static void
2358 s_dn (int a ATTRIBUTE_UNUSED)
2359 {
2360   as_bad (_("invalid syntax for .dn directive"));
2361 }
2362
2363 static void
2364 s_qn (int a ATTRIBUTE_UNUSED)
2365 {
2366   as_bad (_("invalid syntax for .qn directive"));
2367 }
2368
2369 /* The .unreq directive deletes an alias which was previously defined
2370    by .req.  For example:
2371
2372        my_alias .req r11
2373        .unreq my_alias    */
2374
2375 static void
2376 s_unreq (int a ATTRIBUTE_UNUSED)
2377 {
2378   char * name;
2379   char saved_char;
2380
2381   name = input_line_pointer;
2382
2383   while (*input_line_pointer != 0
2384          && *input_line_pointer != ' '
2385          && *input_line_pointer != '\n')
2386     ++input_line_pointer;
2387
2388   saved_char = *input_line_pointer;
2389   *input_line_pointer = 0;
2390
2391   if (!*name)
2392     as_bad (_("invalid syntax for .unreq directive"));
2393   else
2394     {
2395       struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2396                                                               name);
2397
2398       if (!reg)
2399         as_bad (_("unknown register alias '%s'"), name);
2400       else if (reg->builtin)
2401         as_warn (_("ignoring attempt to undefine built-in register '%s'"),
2402                  name);
2403       else
2404         {
2405           char * p;
2406           char * nbuf;
2407
2408           hash_delete (arm_reg_hsh, name, FALSE);
2409           free ((char *) reg->name);
2410           if (reg->neon)
2411             free (reg->neon);
2412           free (reg);
2413
2414           /* Also locate the all upper case and all lower case versions.
2415              Do not complain if we cannot find one or the other as it
2416              was probably deleted above.  */
2417
2418           nbuf = strdup (name);
2419           for (p = nbuf; *p; p++)
2420             *p = TOUPPER (*p);
2421           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2422           if (reg)
2423             {
2424               hash_delete (arm_reg_hsh, nbuf, FALSE);
2425               free ((char *) reg->name);
2426               if (reg->neon)
2427                 free (reg->neon);
2428               free (reg);
2429             }
2430
2431           for (p = nbuf; *p; p++)
2432             *p = TOLOWER (*p);
2433           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2434           if (reg)
2435             {
2436               hash_delete (arm_reg_hsh, nbuf, FALSE);
2437               free ((char *) reg->name);
2438               if (reg->neon)
2439                 free (reg->neon);
2440               free (reg);
2441             }
2442
2443           free (nbuf);
2444         }
2445     }
2446
2447   *input_line_pointer = saved_char;
2448   demand_empty_rest_of_line ();
2449 }
2450
2451 /* Directives: Instruction set selection.  */
2452
2453 #ifdef OBJ_ELF
2454 /* This code is to handle mapping symbols as defined in the ARM ELF spec.
2455    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2456    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2457    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
2458
2459 /* Create a new mapping symbol for the transition to STATE.  */
2460
2461 static void
2462 make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
2463 {
2464   symbolS * symbolP;
2465   const char * symname;
2466   int type;
2467
2468   switch (state)
2469     {
2470     case MAP_DATA:
2471       symname = "$d";
2472       type = BSF_NO_FLAGS;
2473       break;
2474     case MAP_ARM:
2475       symname = "$a";
2476       type = BSF_NO_FLAGS;
2477       break;
2478     case MAP_THUMB:
2479       symname = "$t";
2480       type = BSF_NO_FLAGS;
2481       break;
2482     default:
2483       abort ();
2484     }
2485
2486   symbolP = symbol_new (symname, now_seg, value, frag);
2487   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2488
2489   switch (state)
2490     {
2491     case MAP_ARM:
2492       THUMB_SET_FUNC (symbolP, 0);
2493       ARM_SET_THUMB (symbolP, 0);
2494       ARM_SET_INTERWORK (symbolP, support_interwork);
2495       break;
2496
2497     case MAP_THUMB:
2498       THUMB_SET_FUNC (symbolP, 1);
2499       ARM_SET_THUMB (symbolP, 1);
2500       ARM_SET_INTERWORK (symbolP, support_interwork);
2501       break;
2502
2503     case MAP_DATA:
2504     default:
2505       break;
2506     }
2507
2508   /* Save the mapping symbols for future reference.  Also check that
2509      we do not place two mapping symbols at the same offset within a
2510      frag.  We'll handle overlap between frags in
2511      check_mapping_symbols.
2512
2513      If .fill or other data filling directive generates zero sized data,
2514      the mapping symbol for the following code will have the same value
2515      as the one generated for the data filling directive.  In this case,
2516      we replace the old symbol with the new one at the same address.  */
2517   if (value == 0)
2518     {
2519       if (frag->tc_frag_data.first_map != NULL)
2520         {
2521           know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2522           symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2523         }
2524       frag->tc_frag_data.first_map = symbolP;
2525     }
2526   if (frag->tc_frag_data.last_map != NULL)
2527     {
2528       know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
2529       if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2530         symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2531     }
2532   frag->tc_frag_data.last_map = symbolP;
2533 }
2534
2535 /* We must sometimes convert a region marked as code to data during
2536    code alignment, if an odd number of bytes have to be padded.  The
2537    code mapping symbol is pushed to an aligned address.  */
2538
2539 static void
2540 insert_data_mapping_symbol (enum mstate state,
2541                             valueT value, fragS *frag, offsetT bytes)
2542 {
2543   /* If there was already a mapping symbol, remove it.  */
2544   if (frag->tc_frag_data.last_map != NULL
2545       && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2546     {
2547       symbolS *symp = frag->tc_frag_data.last_map;
2548
2549       if (value == 0)
2550         {
2551           know (frag->tc_frag_data.first_map == symp);
2552           frag->tc_frag_data.first_map = NULL;
2553         }
2554       frag->tc_frag_data.last_map = NULL;
2555       symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2556     }
2557
2558   make_mapping_symbol (MAP_DATA, value, frag);
2559   make_mapping_symbol (state, value + bytes, frag);
2560 }
2561
2562 static void mapping_state_2 (enum mstate state, int max_chars);
2563
2564 /* Set the mapping state to STATE.  Only call this when about to
2565    emit some STATE bytes to the file.  */
2566
2567 void
2568 mapping_state (enum mstate state)
2569 {
2570   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2571
2572 #define TRANSITION(from, to) (mapstate == (from) && state == (to))
2573
2574   if (mapstate == state)
2575     /* The mapping symbol has already been emitted.
2576        There is nothing else to do.  */
2577     return;
2578   else if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
2579     /* This case will be evaluated later in the next else.  */
2580     return;
2581   else if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2582           || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2583     {
2584       /* Only add the symbol if the offset is > 0:
2585          if we're at the first frag, check it's size > 0;
2586          if we're not at the first frag, then for sure
2587             the offset is > 0.  */
2588       struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2589       const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2590
2591       if (add_symbol)
2592         make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2593     }
2594
2595   mapping_state_2 (state, 0);
2596 #undef TRANSITION
2597 }
2598
2599 /* Same as mapping_state, but MAX_CHARS bytes have already been
2600    allocated.  Put the mapping symbol that far back.  */
2601
2602 static void
2603 mapping_state_2 (enum mstate state, int max_chars)
2604 {
2605   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2606
2607   if (!SEG_NORMAL (now_seg))
2608     return;
2609
2610   if (mapstate == state)
2611     /* The mapping symbol has already been emitted.
2612        There is nothing else to do.  */
2613     return;
2614
2615   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2616   make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
2617 }
2618 #else
2619 #define mapping_state(x) ((void)0)
2620 #define mapping_state_2(x, y) ((void)0)
2621 #endif
2622
2623 /* Find the real, Thumb encoded start of a Thumb function.  */
2624
2625 #ifdef OBJ_COFF
2626 static symbolS *
2627 find_real_start (symbolS * symbolP)
2628 {
2629   char *       real_start;
2630   const char * name = S_GET_NAME (symbolP);
2631   symbolS *    new_target;
2632
2633   /* This definition must agree with the one in gcc/config/arm/thumb.c.  */
2634 #define STUB_NAME ".real_start_of"
2635
2636   if (name == NULL)
2637     abort ();
2638
2639   /* The compiler may generate BL instructions to local labels because
2640      it needs to perform a branch to a far away location. These labels
2641      do not have a corresponding ".real_start_of" label.  We check
2642      both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2643      the ".real_start_of" convention for nonlocal branches.  */
2644   if (S_IS_LOCAL (symbolP) || name[0] == '.')
2645     return symbolP;
2646
2647   real_start = ACONCAT ((STUB_NAME, name, NULL));
2648   new_target = symbol_find (real_start);
2649
2650   if (new_target == NULL)
2651     {
2652       as_warn (_("Failed to find real start of function: %s\n"), name);
2653       new_target = symbolP;
2654     }
2655
2656   return new_target;
2657 }
2658 #endif
2659
2660 static void
2661 opcode_select (int width)
2662 {
2663   switch (width)
2664     {
2665     case 16:
2666       if (! thumb_mode)
2667         {
2668           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
2669             as_bad (_("selected processor does not support THUMB opcodes"));
2670
2671           thumb_mode = 1;
2672           /* No need to force the alignment, since we will have been
2673              coming from ARM mode, which is word-aligned.  */
2674           record_alignment (now_seg, 1);
2675         }
2676       break;
2677
2678     case 32:
2679       if (thumb_mode)
2680         {
2681           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
2682             as_bad (_("selected processor does not support ARM opcodes"));
2683
2684           thumb_mode = 0;
2685
2686           if (!need_pass_2)
2687             frag_align (2, 0, 0);
2688
2689           record_alignment (now_seg, 1);
2690         }
2691       break;
2692
2693     default:
2694       as_bad (_("invalid instruction size selected (%d)"), width);
2695     }
2696 }
2697
2698 static void
2699 s_arm (int ignore ATTRIBUTE_UNUSED)
2700 {
2701   opcode_select (32);
2702   demand_empty_rest_of_line ();
2703 }
2704
2705 static void
2706 s_thumb (int ignore ATTRIBUTE_UNUSED)
2707 {
2708   opcode_select (16);
2709   demand_empty_rest_of_line ();
2710 }
2711
2712 static void
2713 s_code (int unused ATTRIBUTE_UNUSED)
2714 {
2715   int temp;
2716
2717   temp = get_absolute_expression ();
2718   switch (temp)
2719     {
2720     case 16:
2721     case 32:
2722       opcode_select (temp);
2723       break;
2724
2725     default:
2726       as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2727     }
2728 }
2729
2730 static void
2731 s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2732 {
2733   /* If we are not already in thumb mode go into it, EVEN if
2734      the target processor does not support thumb instructions.
2735      This is used by gcc/config/arm/lib1funcs.asm for example
2736      to compile interworking support functions even if the
2737      target processor should not support interworking.  */
2738   if (! thumb_mode)
2739     {
2740       thumb_mode = 2;
2741       record_alignment (now_seg, 1);
2742     }
2743
2744   demand_empty_rest_of_line ();
2745 }
2746
2747 static void
2748 s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2749 {
2750   s_thumb (0);
2751
2752   /* The following label is the name/address of the start of a Thumb function.
2753      We need to know this for the interworking support.  */
2754   label_is_thumb_function_name = TRUE;
2755 }
2756
2757 /* Perform a .set directive, but also mark the alias as
2758    being a thumb function.  */
2759
2760 static void
2761 s_thumb_set (int equiv)
2762 {
2763   /* XXX the following is a duplicate of the code for s_set() in read.c
2764      We cannot just call that code as we need to get at the symbol that
2765      is created.  */
2766   char *    name;
2767   char      delim;
2768   char *    end_name;
2769   symbolS * symbolP;
2770
2771   /* Especial apologies for the random logic:
2772      This just grew, and could be parsed much more simply!
2773      Dean - in haste.  */
2774   name      = input_line_pointer;
2775   delim     = get_symbol_end ();
2776   end_name  = input_line_pointer;
2777   *end_name = delim;
2778
2779   if (*input_line_pointer != ',')
2780     {
2781       *end_name = 0;
2782       as_bad (_("expected comma after name \"%s\""), name);
2783       *end_name = delim;
2784       ignore_rest_of_line ();
2785       return;
2786     }
2787
2788   input_line_pointer++;
2789   *end_name = 0;
2790
2791   if (name[0] == '.' && name[1] == '\0')
2792     {
2793       /* XXX - this should not happen to .thumb_set.  */
2794       abort ();
2795     }
2796
2797   if ((symbolP = symbol_find (name)) == NULL
2798       && (symbolP = md_undefined_symbol (name)) == NULL)
2799     {
2800 #ifndef NO_LISTING
2801       /* When doing symbol listings, play games with dummy fragments living
2802          outside the normal fragment chain to record the file and line info
2803          for this symbol.  */
2804       if (listing & LISTING_SYMBOLS)
2805         {
2806           extern struct list_info_struct * listing_tail;
2807           fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
2808
2809           memset (dummy_frag, 0, sizeof (fragS));
2810           dummy_frag->fr_type = rs_fill;
2811           dummy_frag->line = listing_tail;
2812           symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2813           dummy_frag->fr_symbol = symbolP;
2814         }
2815       else
2816 #endif
2817         symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2818
2819 #ifdef OBJ_COFF
2820       /* "set" symbols are local unless otherwise specified.  */
2821       SF_SET_LOCAL (symbolP);
2822 #endif /* OBJ_COFF  */
2823     }                           /* Make a new symbol.  */
2824
2825   symbol_table_insert (symbolP);
2826
2827   * end_name = delim;
2828
2829   if (equiv
2830       && S_IS_DEFINED (symbolP)
2831       && S_GET_SEGMENT (symbolP) != reg_section)
2832     as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2833
2834   pseudo_set (symbolP);
2835
2836   demand_empty_rest_of_line ();
2837
2838   /* XXX Now we come to the Thumb specific bit of code.  */
2839
2840   THUMB_SET_FUNC (symbolP, 1);
2841   ARM_SET_THUMB (symbolP, 1);
2842 #if defined OBJ_ELF || defined OBJ_COFF
2843   ARM_SET_INTERWORK (symbolP, support_interwork);
2844 #endif
2845 }
2846
2847 /* Directives: Mode selection.  */
2848
2849 /* .syntax [unified|divided] - choose the new unified syntax
2850    (same for Arm and Thumb encoding, modulo slight differences in what
2851    can be represented) or the old divergent syntax for each mode.  */
2852 static void
2853 s_syntax (int unused ATTRIBUTE_UNUSED)
2854 {
2855   char *name, delim;
2856
2857   name = input_line_pointer;
2858   delim = get_symbol_end ();
2859
2860   if (!strcasecmp (name, "unified"))
2861     unified_syntax = TRUE;
2862   else if (!strcasecmp (name, "divided"))
2863     unified_syntax = FALSE;
2864   else
2865     {
2866       as_bad (_("unrecognized syntax mode \"%s\""), name);
2867       return;
2868     }
2869   *input_line_pointer = delim;
2870   demand_empty_rest_of_line ();
2871 }
2872
2873 /* Directives: sectioning and alignment.  */
2874
2875 /* Same as s_align_ptwo but align 0 => align 2.  */
2876
2877 static void
2878 s_align (int unused ATTRIBUTE_UNUSED)
2879 {
2880   int temp;
2881   bfd_boolean fill_p;
2882   long temp_fill;
2883   long max_alignment = 15;
2884
2885   temp = get_absolute_expression ();
2886   if (temp > max_alignment)
2887     as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2888   else if (temp < 0)
2889     {
2890       as_bad (_("alignment negative. 0 assumed."));
2891       temp = 0;
2892     }
2893
2894   if (*input_line_pointer == ',')
2895     {
2896       input_line_pointer++;
2897       temp_fill = get_absolute_expression ();
2898       fill_p = TRUE;
2899     }
2900   else
2901     {
2902       fill_p = FALSE;
2903       temp_fill = 0;
2904     }
2905
2906   if (!temp)
2907     temp = 2;
2908
2909   /* Only make a frag if we HAVE to.  */
2910   if (temp && !need_pass_2)
2911     {
2912       if (!fill_p && subseg_text_p (now_seg))
2913         frag_align_code (temp, 0);
2914       else
2915         frag_align (temp, (int) temp_fill, 0);
2916     }
2917   demand_empty_rest_of_line ();
2918
2919   record_alignment (now_seg, temp);
2920 }
2921
2922 static void
2923 s_bss (int ignore ATTRIBUTE_UNUSED)
2924 {
2925   /* We don't support putting frags in the BSS segment, we fake it by
2926      marking in_bss, then looking at s_skip for clues.  */
2927   subseg_set (bss_section, 0);
2928   demand_empty_rest_of_line ();
2929
2930 #ifdef md_elf_section_change_hook
2931   md_elf_section_change_hook ();
2932 #endif
2933 }
2934
2935 static void
2936 s_even (int ignore ATTRIBUTE_UNUSED)
2937 {
2938   /* Never make frag if expect extra pass.  */
2939   if (!need_pass_2)
2940     frag_align (1, 0, 0);
2941
2942   record_alignment (now_seg, 1);
2943
2944   demand_empty_rest_of_line ();
2945 }
2946
2947 /* Directives: Literal pools.  */
2948
2949 static literal_pool *
2950 find_literal_pool (void)
2951 {
2952   literal_pool * pool;
2953
2954   for (pool = list_of_pools; pool != NULL; pool = pool->next)
2955     {
2956       if (pool->section == now_seg
2957           && pool->sub_section == now_subseg)
2958         break;
2959     }
2960
2961   return pool;
2962 }
2963
2964 static literal_pool *
2965 find_or_make_literal_pool (void)
2966 {
2967   /* Next literal pool ID number.  */
2968   static unsigned int latest_pool_num = 1;
2969   literal_pool *      pool;
2970
2971   pool = find_literal_pool ();
2972
2973   if (pool == NULL)
2974     {
2975       /* Create a new pool.  */
2976       pool = (literal_pool *) xmalloc (sizeof (* pool));
2977       if (! pool)
2978         return NULL;
2979
2980       pool->next_free_entry = 0;
2981       pool->section         = now_seg;
2982       pool->sub_section     = now_subseg;
2983       pool->next            = list_of_pools;
2984       pool->symbol          = NULL;
2985
2986       /* Add it to the list.  */
2987       list_of_pools = pool;
2988     }
2989
2990   /* New pools, and emptied pools, will have a NULL symbol.  */
2991   if (pool->symbol == NULL)
2992     {
2993       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
2994                                     (valueT) 0, &zero_address_frag);
2995       pool->id = latest_pool_num ++;
2996     }
2997
2998   /* Done.  */
2999   return pool;
3000 }
3001
3002 /* Add the literal in the global 'inst'
3003    structure to the relevant literal pool.  */
3004
3005 static int
3006 add_to_lit_pool (void)
3007 {
3008   literal_pool * pool;
3009   unsigned int entry;
3010
3011   pool = find_or_make_literal_pool ();
3012
3013   /* Check if this literal value is already in the pool.  */
3014   for (entry = 0; entry < pool->next_free_entry; entry ++)
3015     {
3016       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3017           && (inst.reloc.exp.X_op == O_constant)
3018           && (pool->literals[entry].X_add_number
3019               == inst.reloc.exp.X_add_number)
3020           && (pool->literals[entry].X_unsigned
3021               == inst.reloc.exp.X_unsigned))
3022         break;
3023
3024       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3025           && (inst.reloc.exp.X_op == O_symbol)
3026           && (pool->literals[entry].X_add_number
3027               == inst.reloc.exp.X_add_number)
3028           && (pool->literals[entry].X_add_symbol
3029               == inst.reloc.exp.X_add_symbol)
3030           && (pool->literals[entry].X_op_symbol
3031               == inst.reloc.exp.X_op_symbol))
3032         break;
3033     }
3034
3035   /* Do we need to create a new entry?  */
3036   if (entry == pool->next_free_entry)
3037     {
3038       if (entry >= MAX_LITERAL_POOL_SIZE)
3039         {
3040           inst.error = _("literal pool overflow");
3041           return FAIL;
3042         }
3043
3044       pool->literals[entry] = inst.reloc.exp;
3045       pool->next_free_entry += 1;
3046     }
3047
3048   inst.reloc.exp.X_op         = O_symbol;
3049   inst.reloc.exp.X_add_number = ((int) entry) * 4;
3050   inst.reloc.exp.X_add_symbol = pool->symbol;
3051
3052   return SUCCESS;
3053 }
3054
3055 /* Can't use symbol_new here, so have to create a symbol and then at
3056    a later date assign it a value. Thats what these functions do.  */
3057
3058 static void
3059 symbol_locate (symbolS *    symbolP,
3060                const char * name,       /* It is copied, the caller can modify.  */
3061                segT         segment,    /* Segment identifier (SEG_<something>).  */
3062                valueT       valu,       /* Symbol value.  */
3063                fragS *      frag)       /* Associated fragment.  */
3064 {
3065   unsigned int name_length;
3066   char * preserved_copy_of_name;
3067
3068   name_length = strlen (name) + 1;   /* +1 for \0.  */
3069   obstack_grow (&notes, name, name_length);
3070   preserved_copy_of_name = (char *) obstack_finish (&notes);
3071
3072 #ifdef tc_canonicalize_symbol_name
3073   preserved_copy_of_name =
3074     tc_canonicalize_symbol_name (preserved_copy_of_name);
3075 #endif
3076
3077   S_SET_NAME (symbolP, preserved_copy_of_name);
3078
3079   S_SET_SEGMENT (symbolP, segment);
3080   S_SET_VALUE (symbolP, valu);
3081   symbol_clear_list_pointers (symbolP);
3082
3083   symbol_set_frag (symbolP, frag);
3084
3085   /* Link to end of symbol chain.  */
3086   {
3087     extern int symbol_table_frozen;
3088
3089     if (symbol_table_frozen)
3090       abort ();
3091   }
3092
3093   symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
3094
3095   obj_symbol_new_hook (symbolP);
3096
3097 #ifdef tc_symbol_new_hook
3098   tc_symbol_new_hook (symbolP);
3099 #endif
3100
3101 #ifdef DEBUG_SYMS
3102   verify_symbol_chain (symbol_rootP, symbol_lastP);
3103 #endif /* DEBUG_SYMS  */
3104 }
3105
3106
3107 static void
3108 s_ltorg (int ignored ATTRIBUTE_UNUSED)
3109 {
3110   unsigned int entry;
3111   literal_pool * pool;
3112   char sym_name[20];
3113
3114   pool = find_literal_pool ();
3115   if (pool == NULL
3116       || pool->symbol == NULL
3117       || pool->next_free_entry == 0)
3118     return;
3119
3120   mapping_state (MAP_DATA);
3121
3122   /* Align pool as you have word accesses.
3123      Only make a frag if we have to.  */
3124   if (!need_pass_2)
3125     frag_align (2, 0, 0);
3126
3127   record_alignment (now_seg, 2);
3128
3129   sprintf (sym_name, "$$lit_\002%x", pool->id);
3130
3131   symbol_locate (pool->symbol, sym_name, now_seg,
3132                  (valueT) frag_now_fix (), frag_now);
3133   symbol_table_insert (pool->symbol);
3134
3135   ARM_SET_THUMB (pool->symbol, thumb_mode);
3136
3137 #if defined OBJ_COFF || defined OBJ_ELF
3138   ARM_SET_INTERWORK (pool->symbol, support_interwork);
3139 #endif
3140
3141   for (entry = 0; entry < pool->next_free_entry; entry ++)
3142     /* First output the expression in the instruction to the pool.  */
3143     emit_expr (&(pool->literals[entry]), 4); /* .word  */
3144
3145   /* Mark the pool as empty.  */
3146   pool->next_free_entry = 0;
3147   pool->symbol = NULL;
3148 }
3149
3150 #ifdef OBJ_ELF
3151 /* Forward declarations for functions below, in the MD interface
3152    section.  */
3153 static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3154 static valueT create_unwind_entry (int);
3155 static void start_unwind_section (const segT, int);
3156 static void add_unwind_opcode (valueT, int);
3157 static void flush_pending_unwind (void);
3158
3159 /* Directives: Data.  */
3160
3161 static void
3162 s_arm_elf_cons (int nbytes)
3163 {
3164   expressionS exp;
3165
3166 #ifdef md_flush_pending_output
3167   md_flush_pending_output ();
3168 #endif
3169
3170   if (is_it_end_of_statement ())
3171     {
3172       demand_empty_rest_of_line ();
3173       return;
3174     }
3175
3176 #ifdef md_cons_align
3177   md_cons_align (nbytes);
3178 #endif
3179
3180   mapping_state (MAP_DATA);
3181   do
3182     {
3183       int reloc;
3184       char *base = input_line_pointer;
3185
3186       expression (& exp);
3187
3188       if (exp.X_op != O_symbol)
3189         emit_expr (&exp, (unsigned int) nbytes);
3190       else
3191         {
3192           char *before_reloc = input_line_pointer;
3193           reloc = parse_reloc (&input_line_pointer);
3194           if (reloc == -1)
3195             {
3196               as_bad (_("unrecognized relocation suffix"));
3197               ignore_rest_of_line ();
3198               return;
3199             }
3200           else if (reloc == BFD_RELOC_UNUSED)
3201             emit_expr (&exp, (unsigned int) nbytes);
3202           else
3203             {
3204               reloc_howto_type *howto = (reloc_howto_type *)
3205                   bfd_reloc_type_lookup (stdoutput,
3206                                          (bfd_reloc_code_real_type) reloc);
3207               int size = bfd_get_reloc_size (howto);
3208
3209               if (reloc == BFD_RELOC_ARM_PLT32)
3210                 {
3211                   as_bad (_("(plt) is only valid on branch targets"));
3212                   reloc = BFD_RELOC_UNUSED;
3213                   size = 0;
3214                 }
3215
3216               if (size > nbytes)
3217                 as_bad (_("%s relocations do not fit in %d bytes"),
3218                         howto->name, nbytes);
3219               else
3220                 {
3221                   /* We've parsed an expression stopping at O_symbol.
3222                      But there may be more expression left now that we
3223                      have parsed the relocation marker.  Parse it again.
3224                      XXX Surely there is a cleaner way to do this.  */
3225                   char *p = input_line_pointer;
3226                   int offset;
3227                   char *save_buf = (char *) alloca (input_line_pointer - base);
3228                   memcpy (save_buf, base, input_line_pointer - base);
3229                   memmove (base + (input_line_pointer - before_reloc),
3230                            base, before_reloc - base);
3231
3232                   input_line_pointer = base + (input_line_pointer-before_reloc);
3233                   expression (&exp);
3234                   memcpy (base, save_buf, p - base);
3235
3236                   offset = nbytes - size;
3237                   p = frag_more ((int) nbytes);
3238                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
3239                                size, &exp, 0, (enum bfd_reloc_code_real) reloc);
3240                 }
3241             }
3242         }
3243     }
3244   while (*input_line_pointer++ == ',');
3245
3246   /* Put terminator back into stream.  */
3247   input_line_pointer --;
3248   demand_empty_rest_of_line ();
3249 }
3250
3251 /* Emit an expression containing a 32-bit thumb instruction.
3252    Implementation based on put_thumb32_insn.  */
3253
3254 static void
3255 emit_thumb32_expr (expressionS * exp)
3256 {
3257   expressionS exp_high = *exp;
3258
3259   exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3260   emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3261   exp->X_add_number &= 0xffff;
3262   emit_expr (exp, (unsigned int) THUMB_SIZE);
3263 }
3264
3265 /*  Guess the instruction size based on the opcode.  */
3266
3267 static int
3268 thumb_insn_size (int opcode)
3269 {
3270   if ((unsigned int) opcode < 0xe800u)
3271     return 2;
3272   else if ((unsigned int) opcode >= 0xe8000000u)
3273     return 4;
3274   else
3275     return 0;
3276 }
3277
3278 static bfd_boolean
3279 emit_insn (expressionS *exp, int nbytes)
3280 {
3281   int size = 0;
3282
3283   if (exp->X_op == O_constant)
3284     {
3285       size = nbytes;
3286
3287       if (size == 0)
3288         size = thumb_insn_size (exp->X_add_number);
3289
3290       if (size != 0)
3291         {
3292           if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3293             {
3294               as_bad (_(".inst.n operand too big. "\
3295                         "Use .inst.w instead"));
3296               size = 0;
3297             }
3298           else
3299             {
3300               if (now_it.state == AUTOMATIC_IT_BLOCK)
3301                 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3302               else
3303                 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3304
3305               if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3306                 emit_thumb32_expr (exp);
3307               else
3308                 emit_expr (exp, (unsigned int) size);
3309
3310               it_fsm_post_encode ();
3311             }
3312         }
3313       else
3314         as_bad (_("cannot determine Thumb instruction size. "   \
3315                   "Use .inst.n/.inst.w instead"));
3316     }
3317   else
3318     as_bad (_("constant expression required"));
3319
3320   return (size != 0);
3321 }
3322
3323 /* Like s_arm_elf_cons but do not use md_cons_align and
3324    set the mapping state to MAP_ARM/MAP_THUMB.  */
3325
3326 static void
3327 s_arm_elf_inst (int nbytes)
3328 {
3329   if (is_it_end_of_statement ())
3330     {
3331       demand_empty_rest_of_line ();
3332       return;
3333     }
3334
3335   /* Calling mapping_state () here will not change ARM/THUMB,
3336      but will ensure not to be in DATA state.  */
3337
3338   if (thumb_mode)
3339     mapping_state (MAP_THUMB);
3340   else
3341     {
3342       if (nbytes != 0)
3343         {
3344           as_bad (_("width suffixes are invalid in ARM mode"));
3345           ignore_rest_of_line ();
3346           return;
3347         }
3348
3349       nbytes = 4;
3350
3351       mapping_state (MAP_ARM);
3352     }
3353
3354   do
3355     {
3356       expressionS exp;
3357
3358       expression (& exp);
3359
3360       if (! emit_insn (& exp, nbytes))
3361         {
3362           ignore_rest_of_line ();
3363           return;
3364         }
3365     }
3366   while (*input_line_pointer++ == ',');
3367
3368   /* Put terminator back into stream.  */
3369   input_line_pointer --;
3370   demand_empty_rest_of_line ();
3371 }
3372
3373 /* Parse a .rel31 directive.  */
3374
3375 static void
3376 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3377 {
3378   expressionS exp;
3379   char *p;
3380   valueT highbit;
3381
3382   highbit = 0;
3383   if (*input_line_pointer == '1')
3384     highbit = 0x80000000;
3385   else if (*input_line_pointer != '0')
3386     as_bad (_("expected 0 or 1"));
3387
3388   input_line_pointer++;
3389   if (*input_line_pointer != ',')
3390     as_bad (_("missing comma"));
3391   input_line_pointer++;
3392
3393 #ifdef md_flush_pending_output
3394   md_flush_pending_output ();
3395 #endif
3396
3397 #ifdef md_cons_align
3398   md_cons_align (4);
3399 #endif
3400
3401   mapping_state (MAP_DATA);
3402
3403   expression (&exp);
3404
3405   p = frag_more (4);
3406   md_number_to_chars (p, highbit, 4);
3407   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3408                BFD_RELOC_ARM_PREL31);
3409
3410   demand_empty_rest_of_line ();
3411 }
3412
3413 /* Directives: AEABI stack-unwind tables.  */
3414
3415 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
3416
3417 static void
3418 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3419 {
3420   demand_empty_rest_of_line ();
3421   if (unwind.proc_start)
3422     {
3423       as_bad (_("duplicate .fnstart directive"));
3424       return;
3425     }
3426
3427   /* Mark the start of the function.  */
3428   unwind.proc_start = expr_build_dot ();
3429
3430   /* Reset the rest of the unwind info.  */
3431   unwind.opcode_count = 0;
3432   unwind.table_entry = NULL;
3433   unwind.personality_routine = NULL;
3434   unwind.personality_index = -1;
3435   unwind.frame_size = 0;
3436   unwind.fp_offset = 0;
3437   unwind.fp_reg = REG_SP;
3438   unwind.fp_used = 0;
3439   unwind.sp_restored = 0;
3440 }
3441
3442
3443 /* Parse a handlerdata directive.  Creates the exception handling table entry
3444    for the function.  */
3445
3446 static void
3447 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3448 {
3449   demand_empty_rest_of_line ();
3450   if (!unwind.proc_start)
3451     as_bad (MISSING_FNSTART);
3452
3453   if (unwind.table_entry)
3454     as_bad (_("duplicate .handlerdata directive"));
3455
3456   create_unwind_entry (1);
3457 }
3458
3459 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
3460
3461 static void
3462 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3463 {
3464   long where;
3465   char *ptr;
3466   valueT val;
3467   unsigned int marked_pr_dependency;
3468
3469   demand_empty_rest_of_line ();
3470
3471   if (!unwind.proc_start)
3472     {
3473       as_bad (_(".fnend directive without .fnstart"));
3474       return;
3475     }
3476
3477   /* Add eh table entry.  */
3478   if (unwind.table_entry == NULL)
3479     val = create_unwind_entry (0);
3480   else
3481     val = 0;
3482
3483   /* Add index table entry.  This is two words.  */
3484   start_unwind_section (unwind.saved_seg, 1);
3485   frag_align (2, 0, 0);
3486   record_alignment (now_seg, 2);
3487
3488   ptr = frag_more (8);
3489   where = frag_now_fix () - 8;
3490
3491   /* Self relative offset of the function start.  */
3492   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3493            BFD_RELOC_ARM_PREL31);
3494
3495   /* Indicate dependency on EHABI-defined personality routines to the
3496      linker, if it hasn't been done already.  */
3497   marked_pr_dependency
3498     = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
3499   if (unwind.personality_index >= 0 && unwind.personality_index < 3
3500       && !(marked_pr_dependency & (1 << unwind.personality_index)))
3501     {
3502       static const char *const name[] =
3503         {
3504           "__aeabi_unwind_cpp_pr0",
3505           "__aeabi_unwind_cpp_pr1",
3506           "__aeabi_unwind_cpp_pr2"
3507         };
3508       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3509       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3510       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3511         |= 1 << unwind.personality_index;
3512     }
3513
3514   if (val)
3515     /* Inline exception table entry.  */
3516     md_number_to_chars (ptr + 4, val, 4);
3517   else
3518     /* Self relative offset of the table entry.  */
3519     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3520              BFD_RELOC_ARM_PREL31);
3521
3522   /* Restore the original section.  */
3523   subseg_set (unwind.saved_seg, unwind.saved_subseg);
3524
3525   unwind.proc_start = NULL;
3526 }
3527
3528
3529 /* Parse an unwind_cantunwind directive.  */
3530
3531 static void
3532 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3533 {
3534   demand_empty_rest_of_line ();
3535   if (!unwind.proc_start)
3536     as_bad (MISSING_FNSTART);
3537
3538   if (unwind.personality_routine || unwind.personality_index != -1)
3539     as_bad (_("personality routine specified for cantunwind frame"));
3540
3541   unwind.personality_index = -2;
3542 }
3543
3544
3545 /* Parse a personalityindex directive.  */
3546
3547 static void
3548 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3549 {
3550   expressionS exp;
3551
3552   if (!unwind.proc_start)
3553     as_bad (MISSING_FNSTART);
3554
3555   if (unwind.personality_routine || unwind.personality_index != -1)
3556     as_bad (_("duplicate .personalityindex directive"));
3557
3558   expression (&exp);
3559
3560   if (exp.X_op != O_constant
3561       || exp.X_add_number < 0 || exp.X_add_number > 15)
3562     {
3563       as_bad (_("bad personality routine number"));
3564       ignore_rest_of_line ();
3565       return;
3566     }
3567
3568   unwind.personality_index = exp.X_add_number;
3569
3570   demand_empty_rest_of_line ();
3571 }
3572
3573
3574 /* Parse a personality directive.  */
3575
3576 static void
3577 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3578 {
3579   char *name, *p, c;
3580
3581   if (!unwind.proc_start)
3582     as_bad (MISSING_FNSTART);
3583
3584   if (unwind.personality_routine || unwind.personality_index != -1)
3585     as_bad (_("duplicate .personality directive"));
3586
3587   name = input_line_pointer;
3588   c = get_symbol_end ();
3589   p = input_line_pointer;
3590   unwind.personality_routine = symbol_find_or_make (name);
3591   *p = c;
3592   demand_empty_rest_of_line ();
3593 }
3594
3595
3596 /* Parse a directive saving core registers.  */
3597
3598 static void
3599 s_arm_unwind_save_core (void)
3600 {
3601   valueT op;
3602   long range;
3603   int n;
3604
3605   range = parse_reg_list (&input_line_pointer);
3606   if (range == FAIL)
3607     {
3608       as_bad (_("expected register list"));
3609       ignore_rest_of_line ();
3610       return;
3611     }
3612
3613   demand_empty_rest_of_line ();
3614
3615   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3616      into .unwind_save {..., sp...}.  We aren't bothered about the value of
3617      ip because it is clobbered by calls.  */
3618   if (unwind.sp_restored && unwind.fp_reg == 12
3619       && (range & 0x3000) == 0x1000)
3620     {
3621       unwind.opcode_count--;
3622       unwind.sp_restored = 0;
3623       range = (range | 0x2000) & ~0x1000;
3624       unwind.pending_offset = 0;
3625     }
3626
3627   /* Pop r4-r15.  */
3628   if (range & 0xfff0)
3629     {
3630       /* See if we can use the short opcodes.  These pop a block of up to 8
3631          registers starting with r4, plus maybe r14.  */
3632       for (n = 0; n < 8; n++)
3633         {
3634           /* Break at the first non-saved register.      */
3635           if ((range & (1 << (n + 4))) == 0)
3636             break;
3637         }
3638       /* See if there are any other bits set.  */
3639       if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3640         {
3641           /* Use the long form.  */
3642           op = 0x8000 | ((range >> 4) & 0xfff);
3643           add_unwind_opcode (op, 2);
3644         }
3645       else
3646         {
3647           /* Use the short form.  */
3648           if (range & 0x4000)
3649             op = 0xa8; /* Pop r14.      */
3650           else
3651             op = 0xa0; /* Do not pop r14.  */
3652           op |= (n - 1);
3653           add_unwind_opcode (op, 1);
3654         }
3655     }
3656
3657   /* Pop r0-r3.  */
3658   if (range & 0xf)
3659     {
3660       op = 0xb100 | (range & 0xf);
3661       add_unwind_opcode (op, 2);
3662     }
3663
3664   /* Record the number of bytes pushed.  */
3665   for (n = 0; n < 16; n++)
3666     {
3667       if (range & (1 << n))
3668         unwind.frame_size += 4;
3669     }
3670 }
3671
3672
3673 /* Parse a directive saving FPA registers.  */
3674
3675 static void
3676 s_arm_unwind_save_fpa (int reg)
3677 {
3678   expressionS exp;
3679   int num_regs;
3680   valueT op;
3681
3682   /* Get Number of registers to transfer.  */
3683   if (skip_past_comma (&input_line_pointer) != FAIL)
3684     expression (&exp);
3685   else
3686     exp.X_op = O_illegal;
3687
3688   if (exp.X_op != O_constant)
3689     {
3690       as_bad (_("expected , <constant>"));
3691       ignore_rest_of_line ();
3692       return;
3693     }
3694
3695   num_regs = exp.X_add_number;
3696
3697   if (num_regs < 1 || num_regs > 4)
3698     {
3699       as_bad (_("number of registers must be in the range [1:4]"));
3700       ignore_rest_of_line ();
3701       return;
3702     }
3703
3704   demand_empty_rest_of_line ();
3705
3706   if (reg == 4)
3707     {
3708       /* Short form.  */
3709       op = 0xb4 | (num_regs - 1);
3710       add_unwind_opcode (op, 1);
3711     }
3712   else
3713     {
3714       /* Long form.  */
3715       op = 0xc800 | (reg << 4) | (num_regs - 1);
3716       add_unwind_opcode (op, 2);
3717     }
3718   unwind.frame_size += num_regs * 12;
3719 }
3720
3721
3722 /* Parse a directive saving VFP registers for ARMv6 and above.  */
3723
3724 static void
3725 s_arm_unwind_save_vfp_armv6 (void)
3726 {
3727   int count;
3728   unsigned int start;
3729   valueT op;
3730   int num_vfpv3_regs = 0;
3731   int num_regs_below_16;
3732
3733   count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3734   if (count == FAIL)
3735     {
3736       as_bad (_("expected register list"));
3737       ignore_rest_of_line ();
3738       return;
3739     }
3740
3741   demand_empty_rest_of_line ();
3742
3743   /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3744      than FSTMX/FLDMX-style ones).  */
3745
3746   /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
3747   if (start >= 16)
3748     num_vfpv3_regs = count;
3749   else if (start + count > 16)
3750     num_vfpv3_regs = start + count - 16;
3751
3752   if (num_vfpv3_regs > 0)
3753     {
3754       int start_offset = start > 16 ? start - 16 : 0;
3755       op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3756       add_unwind_opcode (op, 2);
3757     }
3758
3759   /* Generate opcode for registers numbered in the range 0 .. 15.  */
3760   num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
3761   gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
3762   if (num_regs_below_16 > 0)
3763     {
3764       op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3765       add_unwind_opcode (op, 2);
3766     }
3767
3768   unwind.frame_size += count * 8;
3769 }
3770
3771
3772 /* Parse a directive saving VFP registers for pre-ARMv6.  */
3773
3774 static void
3775 s_arm_unwind_save_vfp (void)
3776 {
3777   int count;
3778   unsigned int reg;
3779   valueT op;
3780
3781   count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
3782   if (count == FAIL)
3783     {
3784       as_bad (_("expected register list"));
3785       ignore_rest_of_line ();
3786       return;
3787     }
3788
3789   demand_empty_rest_of_line ();
3790
3791   if (reg == 8)
3792     {
3793       /* Short form.  */
3794       op = 0xb8 | (count - 1);
3795       add_unwind_opcode (op, 1);
3796     }
3797   else
3798     {
3799       /* Long form.  */
3800       op = 0xb300 | (reg << 4) | (count - 1);
3801       add_unwind_opcode (op, 2);
3802     }
3803   unwind.frame_size += count * 8 + 4;
3804 }
3805
3806
3807 /* Parse a directive saving iWMMXt data registers.  */
3808
3809 static void
3810 s_arm_unwind_save_mmxwr (void)
3811 {
3812   int reg;
3813   int hi_reg;
3814   int i;
3815   unsigned mask = 0;
3816   valueT op;
3817
3818   if (*input_line_pointer == '{')
3819     input_line_pointer++;
3820
3821   do
3822     {
3823       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3824
3825       if (reg == FAIL)
3826         {
3827           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3828           goto error;
3829         }
3830
3831       if (mask >> reg)
3832         as_tsktsk (_("register list not in ascending order"));
3833       mask |= 1 << reg;
3834
3835       if (*input_line_pointer == '-')
3836         {
3837           input_line_pointer++;
3838           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3839           if (hi_reg == FAIL)
3840             {
3841               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3842               goto error;
3843             }
3844           else if (reg >= hi_reg)
3845             {
3846               as_bad (_("bad register range"));
3847               goto error;
3848             }
3849           for (; reg < hi_reg; reg++)
3850             mask |= 1 << reg;
3851         }
3852     }
3853   while (skip_past_comma (&input_line_pointer) != FAIL);
3854
3855   if (*input_line_pointer == '}')
3856     input_line_pointer++;
3857
3858   demand_empty_rest_of_line ();
3859
3860   /* Generate any deferred opcodes because we're going to be looking at
3861      the list.  */
3862   flush_pending_unwind ();
3863
3864   for (i = 0; i < 16; i++)
3865     {
3866       if (mask & (1 << i))
3867         unwind.frame_size += 8;
3868     }
3869
3870   /* Attempt to combine with a previous opcode.  We do this because gcc
3871      likes to output separate unwind directives for a single block of
3872      registers.  */
3873   if (unwind.opcode_count > 0)
3874     {
3875       i = unwind.opcodes[unwind.opcode_count - 1];
3876       if ((i & 0xf8) == 0xc0)
3877         {
3878           i &= 7;
3879           /* Only merge if the blocks are contiguous.  */
3880           if (i < 6)
3881             {
3882               if ((mask & 0xfe00) == (1 << 9))
3883                 {
3884                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3885                   unwind.opcode_count--;
3886                 }
3887             }
3888           else if (i == 6 && unwind.opcode_count >= 2)
3889             {
3890               i = unwind.opcodes[unwind.opcode_count - 2];
3891               reg = i >> 4;
3892               i &= 0xf;
3893
3894               op = 0xffff << (reg - 1);
3895               if (reg > 0
3896                   && ((mask & op) == (1u << (reg - 1))))
3897                 {
3898                   op = (1 << (reg + i + 1)) - 1;
3899                   op &= ~((1 << reg) - 1);
3900                   mask |= op;
3901                   unwind.opcode_count -= 2;
3902                 }
3903             }
3904         }
3905     }
3906
3907   hi_reg = 15;
3908   /* We want to generate opcodes in the order the registers have been
3909      saved, ie. descending order.  */
3910   for (reg = 15; reg >= -1; reg--)
3911     {
3912       /* Save registers in blocks.  */
3913       if (reg < 0
3914           || !(mask & (1 << reg)))
3915         {
3916           /* We found an unsaved reg.  Generate opcodes to save the
3917              preceding block.   */
3918           if (reg != hi_reg)
3919             {
3920               if (reg == 9)
3921                 {
3922                   /* Short form.  */
3923                   op = 0xc0 | (hi_reg - 10);
3924                   add_unwind_opcode (op, 1);
3925                 }
3926               else
3927                 {
3928                   /* Long form.  */
3929                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
3930                   add_unwind_opcode (op, 2);
3931                 }
3932             }
3933           hi_reg = reg - 1;
3934         }
3935     }
3936
3937   return;
3938 error:
3939   ignore_rest_of_line ();
3940 }
3941
3942 static void
3943 s_arm_unwind_save_mmxwcg (void)
3944 {
3945   int reg;
3946   int hi_reg;
3947   unsigned mask = 0;
3948   valueT op;
3949
3950   if (*input_line_pointer == '{')
3951     input_line_pointer++;
3952
3953   do
3954     {
3955       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
3956
3957       if (reg == FAIL)
3958         {
3959           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
3960           goto error;
3961         }
3962
3963       reg -= 8;
3964       if (mask >> reg)
3965         as_tsktsk (_("register list not in ascending order"));
3966       mask |= 1 << reg;
3967
3968       if (*input_line_pointer == '-')
3969         {
3970           input_line_pointer++;
3971           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
3972           if (hi_reg == FAIL)
3973             {
3974               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
3975               goto error;
3976             }
3977           else if (reg >= hi_reg)
3978             {
3979               as_bad (_("bad register range"));
3980               goto error;
3981             }
3982           for (; reg < hi_reg; reg++)
3983             mask |= 1 << reg;
3984         }
3985     }
3986   while (skip_past_comma (&input_line_pointer) != FAIL);
3987
3988   if (*input_line_pointer == '}')
3989     input_line_pointer++;
3990
3991   demand_empty_rest_of_line ();
3992
3993   /* Generate any deferred opcodes because we're going to be looking at
3994      the list.  */
3995   flush_pending_unwind ();
3996
3997   for (reg = 0; reg < 16; reg++)
3998     {
3999       if (mask & (1 << reg))
4000         unwind.frame_size += 4;
4001     }
4002   op = 0xc700 | mask;
4003   add_unwind_opcode (op, 2);
4004   return;
4005 error:
4006   ignore_rest_of_line ();
4007 }
4008
4009
4010 /* Parse an unwind_save directive.
4011    If the argument is non-zero, this is a .vsave directive.  */
4012
4013 static void
4014 s_arm_unwind_save (int arch_v6)
4015 {
4016   char *peek;
4017   struct reg_entry *reg;
4018   bfd_boolean had_brace = FALSE;
4019
4020   if (!unwind.proc_start)
4021     as_bad (MISSING_FNSTART);
4022
4023   /* Figure out what sort of save we have.  */
4024   peek = input_line_pointer;
4025
4026   if (*peek == '{')
4027     {
4028       had_brace = TRUE;
4029       peek++;
4030     }
4031
4032   reg = arm_reg_parse_multi (&peek);
4033
4034   if (!reg)
4035     {
4036       as_bad (_("register expected"));
4037       ignore_rest_of_line ();
4038       return;
4039     }
4040
4041   switch (reg->type)
4042     {
4043     case REG_TYPE_FN:
4044       if (had_brace)
4045         {
4046           as_bad (_("FPA .unwind_save does not take a register list"));
4047           ignore_rest_of_line ();
4048           return;
4049         }
4050       input_line_pointer = peek;
4051       s_arm_unwind_save_fpa (reg->number);
4052       return;
4053
4054     case REG_TYPE_RN:     s_arm_unwind_save_core ();   return;
4055     case REG_TYPE_VFD:
4056       if (arch_v6)
4057         s_arm_unwind_save_vfp_armv6 ();
4058       else
4059         s_arm_unwind_save_vfp ();
4060       return;
4061     case REG_TYPE_MMXWR:  s_arm_unwind_save_mmxwr ();  return;
4062     case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
4063
4064     default:
4065       as_bad (_(".unwind_save does not support this kind of register"));
4066       ignore_rest_of_line ();
4067     }
4068 }
4069
4070
4071 /* Parse an unwind_movsp directive.  */
4072
4073 static void
4074 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4075 {
4076   int reg;
4077   valueT op;
4078   int offset;
4079
4080   if (!unwind.proc_start)
4081     as_bad (MISSING_FNSTART);
4082
4083   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4084   if (reg == FAIL)
4085     {
4086       as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
4087       ignore_rest_of_line ();
4088       return;
4089     }
4090
4091   /* Optional constant.  */
4092   if (skip_past_comma (&input_line_pointer) != FAIL)
4093     {
4094       if (immediate_for_directive (&offset) == FAIL)
4095         return;
4096     }
4097   else
4098     offset = 0;
4099
4100   demand_empty_rest_of_line ();
4101
4102   if (reg == REG_SP || reg == REG_PC)
4103     {
4104       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
4105       return;
4106     }
4107
4108   if (unwind.fp_reg != REG_SP)
4109     as_bad (_("unexpected .unwind_movsp directive"));
4110
4111   /* Generate opcode to restore the value.  */
4112   op = 0x90 | reg;
4113   add_unwind_opcode (op, 1);
4114
4115   /* Record the information for later.  */
4116   unwind.fp_reg = reg;
4117   unwind.fp_offset = unwind.frame_size - offset;
4118   unwind.sp_restored = 1;
4119 }
4120
4121 /* Parse an unwind_pad directive.  */
4122
4123 static void
4124 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
4125 {
4126   int offset;
4127
4128   if (!unwind.proc_start)
4129     as_bad (MISSING_FNSTART);
4130
4131   if (immediate_for_directive (&offset) == FAIL)
4132     return;
4133
4134   if (offset & 3)
4135     {
4136       as_bad (_("stack increment must be multiple of 4"));
4137       ignore_rest_of_line ();
4138       return;
4139     }
4140
4141   /* Don't generate any opcodes, just record the details for later.  */
4142   unwind.frame_size += offset;
4143   unwind.pending_offset += offset;
4144
4145   demand_empty_rest_of_line ();
4146 }
4147
4148 /* Parse an unwind_setfp directive.  */
4149
4150 static void
4151 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
4152 {
4153   int sp_reg;
4154   int fp_reg;
4155   int offset;
4156
4157   if (!unwind.proc_start)
4158     as_bad (MISSING_FNSTART);
4159
4160   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4161   if (skip_past_comma (&input_line_pointer) == FAIL)
4162     sp_reg = FAIL;
4163   else
4164     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4165
4166   if (fp_reg == FAIL || sp_reg == FAIL)
4167     {
4168       as_bad (_("expected <reg>, <reg>"));
4169       ignore_rest_of_line ();
4170       return;
4171     }
4172
4173   /* Optional constant.  */
4174   if (skip_past_comma (&input_line_pointer) != FAIL)
4175     {
4176       if (immediate_for_directive (&offset) == FAIL)
4177         return;
4178     }
4179   else
4180     offset = 0;
4181
4182   demand_empty_rest_of_line ();
4183
4184   if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4185     {
4186       as_bad (_("register must be either sp or set by a previous"
4187                 "unwind_movsp directive"));
4188       return;
4189     }
4190
4191   /* Don't generate any opcodes, just record the information for later.  */
4192   unwind.fp_reg = fp_reg;
4193   unwind.fp_used = 1;
4194   if (sp_reg == REG_SP)
4195     unwind.fp_offset = unwind.frame_size - offset;
4196   else
4197     unwind.fp_offset -= offset;
4198 }
4199
4200 /* Parse an unwind_raw directive.  */
4201
4202 static void
4203 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
4204 {
4205   expressionS exp;
4206   /* This is an arbitrary limit.         */
4207   unsigned char op[16];
4208   int count;
4209
4210   if (!unwind.proc_start)
4211     as_bad (MISSING_FNSTART);
4212
4213   expression (&exp);
4214   if (exp.X_op == O_constant
4215       && skip_past_comma (&input_line_pointer) != FAIL)
4216     {
4217       unwind.frame_size += exp.X_add_number;
4218       expression (&exp);
4219     }
4220   else
4221     exp.X_op = O_illegal;
4222
4223   if (exp.X_op != O_constant)
4224     {
4225       as_bad (_("expected <offset>, <opcode>"));
4226       ignore_rest_of_line ();
4227       return;
4228     }
4229
4230   count = 0;
4231
4232   /* Parse the opcode.  */
4233   for (;;)
4234     {
4235       if (count >= 16)
4236         {
4237           as_bad (_("unwind opcode too long"));
4238           ignore_rest_of_line ();
4239         }
4240       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
4241         {
4242           as_bad (_("invalid unwind opcode"));
4243           ignore_rest_of_line ();
4244           return;
4245         }
4246       op[count++] = exp.X_add_number;
4247
4248       /* Parse the next byte.  */
4249       if (skip_past_comma (&input_line_pointer) == FAIL)
4250         break;
4251
4252       expression (&exp);
4253     }
4254
4255   /* Add the opcode bytes in reverse order.  */
4256   while (count--)
4257     add_unwind_opcode (op[count], 1);
4258
4259   demand_empty_rest_of_line ();
4260 }
4261
4262
4263 /* Parse a .eabi_attribute directive.  */
4264
4265 static void
4266 s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4267 {
4268   int tag = s_vendor_attribute (OBJ_ATTR_PROC);
4269
4270   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4271     attributes_set_explicitly[tag] = 1;
4272 }
4273 #endif /* OBJ_ELF */
4274
4275 static void s_arm_arch (int);
4276 static void s_arm_object_arch (int);
4277 static void s_arm_cpu (int);
4278 static void s_arm_fpu (int);
4279 static void s_arm_arch_extension (int);
4280
4281 #ifdef TE_PE
4282
4283 static void
4284 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
4285 {
4286   expressionS exp;
4287
4288   do
4289     {
4290       expression (&exp);
4291       if (exp.X_op == O_symbol)
4292         exp.X_op = O_secrel;
4293
4294       emit_expr (&exp, 4);
4295     }
4296   while (*input_line_pointer++ == ',');
4297
4298   input_line_pointer--;
4299   demand_empty_rest_of_line ();
4300 }
4301 #endif /* TE_PE */
4302
4303 /* This table describes all the machine specific pseudo-ops the assembler
4304    has to support.  The fields are:
4305      pseudo-op name without dot
4306      function to call to execute this pseudo-op
4307      Integer arg to pass to the function.  */
4308
4309 const pseudo_typeS md_pseudo_table[] =
4310 {
4311   /* Never called because '.req' does not start a line.  */
4312   { "req",         s_req,         0 },
4313   /* Following two are likewise never called.  */
4314   { "dn",          s_dn,          0 },
4315   { "qn",          s_qn,          0 },
4316   { "unreq",       s_unreq,       0 },
4317   { "bss",         s_bss,         0 },
4318   { "align",       s_align,       0 },
4319   { "arm",         s_arm,         0 },
4320   { "thumb",       s_thumb,       0 },
4321   { "code",        s_code,        0 },
4322   { "force_thumb", s_force_thumb, 0 },
4323   { "thumb_func",  s_thumb_func,  0 },
4324   { "thumb_set",   s_thumb_set,   0 },
4325   { "even",        s_even,        0 },
4326   { "ltorg",       s_ltorg,       0 },
4327   { "pool",        s_ltorg,       0 },
4328   { "syntax",      s_syntax,      0 },
4329   { "cpu",         s_arm_cpu,     0 },
4330   { "arch",        s_arm_arch,    0 },
4331   { "object_arch", s_arm_object_arch,   0 },
4332   { "fpu",         s_arm_fpu,     0 },
4333   { "arch_extension", s_arm_arch_extension, 0 },
4334 #ifdef OBJ_ELF
4335   { "word",             s_arm_elf_cons, 4 },
4336   { "long",             s_arm_elf_cons, 4 },
4337   { "inst.n",           s_arm_elf_inst, 2 },
4338   { "inst.w",           s_arm_elf_inst, 4 },
4339   { "inst",             s_arm_elf_inst, 0 },
4340   { "rel31",            s_arm_rel31,      0 },
4341   { "fnstart",          s_arm_unwind_fnstart,   0 },
4342   { "fnend",            s_arm_unwind_fnend,     0 },
4343   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
4344   { "personality",      s_arm_unwind_personality, 0 },
4345   { "personalityindex", s_arm_unwind_personalityindex, 0 },
4346   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
4347   { "save",             s_arm_unwind_save,      0 },
4348   { "vsave",            s_arm_unwind_save,      1 },
4349   { "movsp",            s_arm_unwind_movsp,     0 },
4350   { "pad",              s_arm_unwind_pad,       0 },
4351   { "setfp",            s_arm_unwind_setfp,     0 },
4352   { "unwind_raw",       s_arm_unwind_raw,       0 },
4353   { "eabi_attribute",   s_arm_eabi_attribute,   0 },
4354 #else
4355   { "word",        cons, 4},
4356
4357   /* These are used for dwarf.  */
4358   {"2byte", cons, 2},
4359   {"4byte", cons, 4},
4360   {"8byte", cons, 8},
4361   /* These are used for dwarf2.  */
4362   { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4363   { "loc",  dwarf2_directive_loc,  0 },
4364   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
4365 #endif
4366   { "extend",      float_cons, 'x' },
4367   { "ldouble",     float_cons, 'x' },
4368   { "packed",      float_cons, 'p' },
4369 #ifdef TE_PE
4370   {"secrel32", pe_directive_secrel, 0},
4371 #endif
4372   { 0, 0, 0 }
4373 };
4374 \f
4375 /* Parser functions used exclusively in instruction operands.  */
4376
4377 /* Generic immediate-value read function for use in insn parsing.
4378    STR points to the beginning of the immediate (the leading #);
4379    VAL receives the value; if the value is outside [MIN, MAX]
4380    issue an error.  PREFIX_OPT is true if the immediate prefix is
4381    optional.  */
4382
4383 static int
4384 parse_immediate (char **str, int *val, int min, int max,
4385                  bfd_boolean prefix_opt)
4386 {
4387   expressionS exp;
4388   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4389   if (exp.X_op != O_constant)
4390     {
4391       inst.error = _("constant expression required");
4392       return FAIL;
4393     }
4394
4395   if (exp.X_add_number < min || exp.X_add_number > max)
4396     {
4397       inst.error = _("immediate value out of range");
4398       return FAIL;
4399     }
4400
4401   *val = exp.X_add_number;
4402   return SUCCESS;
4403 }
4404
4405 /* Less-generic immediate-value read function with the possibility of loading a
4406    big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
4407    instructions. Puts the result directly in inst.operands[i].  */
4408
4409 static int
4410 parse_big_immediate (char **str, int i)
4411 {
4412   expressionS exp;
4413   char *ptr = *str;
4414
4415   my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4416
4417   if (exp.X_op == O_constant)
4418     {
4419       inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4420       /* If we're on a 64-bit host, then a 64-bit number can be returned using
4421          O_constant.  We have to be careful not to break compilation for
4422          32-bit X_add_number, though.  */
4423       if ((exp.X_add_number & ~0xffffffffl) != 0)
4424         {
4425           /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4.  */
4426           inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4427           inst.operands[i].regisimm = 1;
4428         }
4429     }
4430   else if (exp.X_op == O_big
4431            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
4432     {
4433       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
4434
4435       /* Bignums have their least significant bits in
4436          generic_bignum[0]. Make sure we put 32 bits in imm and
4437          32 bits in reg,  in a (hopefully) portable way.  */
4438       gas_assert (parts != 0);
4439
4440       /* Make sure that the number is not too big.
4441          PR 11972: Bignums can now be sign-extended to the
4442          size of a .octa so check that the out of range bits
4443          are all zero or all one.  */
4444       if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
4445         {
4446           LITTLENUM_TYPE m = -1;
4447
4448           if (generic_bignum[parts * 2] != 0
4449               && generic_bignum[parts * 2] != m)
4450             return FAIL;
4451
4452           for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
4453             if (generic_bignum[j] != generic_bignum[j-1])
4454               return FAIL;
4455         }
4456
4457       inst.operands[i].imm = 0;
4458       for (j = 0; j < parts; j++, idx++)
4459         inst.operands[i].imm |= generic_bignum[idx]
4460                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4461       inst.operands[i].reg = 0;
4462       for (j = 0; j < parts; j++, idx++)
4463         inst.operands[i].reg |= generic_bignum[idx]
4464                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4465       inst.operands[i].regisimm = 1;
4466     }
4467   else
4468     return FAIL;
4469
4470   *str = ptr;
4471
4472   return SUCCESS;
4473 }
4474
4475 /* Returns the pseudo-register number of an FPA immediate constant,
4476    or FAIL if there isn't a valid constant here.  */
4477
4478 static int
4479 parse_fpa_immediate (char ** str)
4480 {
4481   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4482   char *         save_in;
4483   expressionS    exp;
4484   int            i;
4485   int            j;
4486
4487   /* First try and match exact strings, this is to guarantee
4488      that some formats will work even for cross assembly.  */
4489
4490   for (i = 0; fp_const[i]; i++)
4491     {
4492       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
4493         {
4494           char *start = *str;
4495
4496           *str += strlen (fp_const[i]);
4497           if (is_end_of_line[(unsigned char) **str])
4498             return i + 8;
4499           *str = start;
4500         }
4501     }
4502
4503   /* Just because we didn't get a match doesn't mean that the constant
4504      isn't valid, just that it is in a format that we don't
4505      automatically recognize.  Try parsing it with the standard
4506      expression routines.  */
4507
4508   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
4509
4510   /* Look for a raw floating point number.  */
4511   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4512       && is_end_of_line[(unsigned char) *save_in])
4513     {
4514       for (i = 0; i < NUM_FLOAT_VALS; i++)
4515         {
4516           for (j = 0; j < MAX_LITTLENUMS; j++)
4517             {
4518               if (words[j] != fp_values[i][j])
4519                 break;
4520             }
4521
4522           if (j == MAX_LITTLENUMS)
4523             {
4524               *str = save_in;
4525               return i + 8;
4526             }
4527         }
4528     }
4529
4530   /* Try and parse a more complex expression, this will probably fail
4531      unless the code uses a floating point prefix (eg "0f").  */
4532   save_in = input_line_pointer;
4533   input_line_pointer = *str;
4534   if (expression (&exp) == absolute_section
4535       && exp.X_op == O_big
4536       && exp.X_add_number < 0)
4537     {
4538       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4539          Ditto for 15.  */
4540       if (gen_to_words (words, 5, (long) 15) == 0)
4541         {
4542           for (i = 0; i < NUM_FLOAT_VALS; i++)
4543             {
4544               for (j = 0; j < MAX_LITTLENUMS; j++)
4545                 {
4546                   if (words[j] != fp_values[i][j])
4547                     break;
4548                 }
4549
4550               if (j == MAX_LITTLENUMS)
4551                 {
4552                   *str = input_line_pointer;
4553                   input_line_pointer = save_in;
4554                   return i + 8;
4555                 }
4556             }
4557         }
4558     }
4559
4560   *str = input_line_pointer;
4561   input_line_pointer = save_in;
4562   inst.error = _("invalid FPA immediate expression");
4563   return FAIL;
4564 }
4565
4566 /* Returns 1 if a number has "quarter-precision" float format
4567    0baBbbbbbc defgh000 00000000 00000000.  */
4568
4569 static int
4570 is_quarter_float (unsigned imm)
4571 {
4572   int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4573   return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4574 }
4575
4576 /* Parse an 8-bit "quarter-precision" floating point number of the form:
4577    0baBbbbbbc defgh000 00000000 00000000.
4578    The zero and minus-zero cases need special handling, since they can't be
4579    encoded in the "quarter-precision" float format, but can nonetheless be
4580    loaded as integer constants.  */
4581
4582 static unsigned
4583 parse_qfloat_immediate (char **ccp, int *immed)
4584 {
4585   char *str = *ccp;
4586   char *fpnum;
4587   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4588   int found_fpchar = 0;
4589
4590   skip_past_char (&str, '#');
4591
4592   /* We must not accidentally parse an integer as a floating-point number. Make
4593      sure that the value we parse is not an integer by checking for special
4594      characters '.' or 'e'.
4595      FIXME: This is a horrible hack, but doing better is tricky because type
4596      information isn't in a very usable state at parse time.  */
4597   fpnum = str;
4598   skip_whitespace (fpnum);
4599
4600   if (strncmp (fpnum, "0x", 2) == 0)
4601     return FAIL;
4602   else
4603     {
4604       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4605         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4606           {
4607             found_fpchar = 1;
4608             break;
4609           }
4610
4611       if (!found_fpchar)
4612         return FAIL;
4613     }
4614
4615   if ((str = atof_ieee (str, 's', words)) != NULL)
4616     {
4617       unsigned fpword = 0;
4618       int i;
4619
4620       /* Our FP word must be 32 bits (single-precision FP).  */
4621       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4622         {
4623           fpword <<= LITTLENUM_NUMBER_OF_BITS;
4624           fpword |= words[i];
4625         }
4626
4627       if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
4628         *immed = fpword;
4629       else
4630         return FAIL;
4631
4632       *ccp = str;
4633
4634       return SUCCESS;
4635     }
4636
4637   return FAIL;
4638 }
4639
4640 /* Shift operands.  */
4641 enum shift_kind
4642 {
4643   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4644 };
4645
4646 struct asm_shift_name
4647 {
4648   const char      *name;
4649   enum shift_kind  kind;
4650 };
4651
4652 /* Third argument to parse_shift.  */
4653 enum parse_shift_mode
4654 {
4655   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
4656   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
4657   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
4658   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
4659   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
4660 };
4661
4662 /* Parse a <shift> specifier on an ARM data processing instruction.
4663    This has three forms:
4664
4665      (LSL|LSR|ASL|ASR|ROR) Rs
4666      (LSL|LSR|ASL|ASR|ROR) #imm
4667      RRX
4668
4669    Note that ASL is assimilated to LSL in the instruction encoding, and
4670    RRX to ROR #0 (which cannot be written as such).  */
4671
4672 static int
4673 parse_shift (char **str, int i, enum parse_shift_mode mode)
4674 {
4675   const struct asm_shift_name *shift_name;
4676   enum shift_kind shift;
4677   char *s = *str;
4678   char *p = s;
4679   int reg;
4680
4681   for (p = *str; ISALPHA (*p); p++)
4682     ;
4683
4684   if (p == *str)
4685     {
4686       inst.error = _("shift expression expected");
4687       return FAIL;
4688     }
4689
4690   shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
4691                                                             p - *str);
4692
4693   if (shift_name == NULL)
4694     {
4695       inst.error = _("shift expression expected");
4696       return FAIL;
4697     }
4698
4699   shift = shift_name->kind;
4700
4701   switch (mode)
4702     {
4703     case NO_SHIFT_RESTRICT:
4704     case SHIFT_IMMEDIATE:   break;
4705
4706     case SHIFT_LSL_OR_ASR_IMMEDIATE:
4707       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4708         {
4709           inst.error = _("'LSL' or 'ASR' required");
4710           return FAIL;
4711         }
4712       break;
4713
4714     case SHIFT_LSL_IMMEDIATE:
4715       if (shift != SHIFT_LSL)
4716         {
4717           inst.error = _("'LSL' required");
4718           return FAIL;
4719         }
4720       break;
4721
4722     case SHIFT_ASR_IMMEDIATE:
4723       if (shift != SHIFT_ASR)
4724         {
4725           inst.error = _("'ASR' required");
4726           return FAIL;
4727         }
4728       break;
4729
4730     default: abort ();
4731     }
4732
4733   if (shift != SHIFT_RRX)
4734     {
4735       /* Whitespace can appear here if the next thing is a bare digit.  */
4736       skip_whitespace (p);
4737
4738       if (mode == NO_SHIFT_RESTRICT
4739           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
4740         {
4741           inst.operands[i].imm = reg;
4742           inst.operands[i].immisreg = 1;
4743         }
4744       else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4745         return FAIL;
4746     }
4747   inst.operands[i].shift_kind = shift;
4748   inst.operands[i].shifted = 1;
4749   *str = p;
4750   return SUCCESS;
4751 }
4752
4753 /* Parse a <shifter_operand> for an ARM data processing instruction:
4754
4755       #<immediate>
4756       #<immediate>, <rotate>
4757       <Rm>
4758       <Rm>, <shift>
4759
4760    where <shift> is defined by parse_shift above, and <rotate> is a
4761    multiple of 2 between 0 and 30.  Validation of immediate operands
4762    is deferred to md_apply_fix.  */
4763
4764 static int
4765 parse_shifter_operand (char **str, int i)
4766 {
4767   int value;
4768   expressionS exp;
4769
4770   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
4771     {
4772       inst.operands[i].reg = value;
4773       inst.operands[i].isreg = 1;
4774
4775       /* parse_shift will override this if appropriate */
4776       inst.reloc.exp.X_op = O_constant;
4777       inst.reloc.exp.X_add_number = 0;
4778
4779       if (skip_past_comma (str) == FAIL)
4780         return SUCCESS;
4781
4782       /* Shift operation on register.  */
4783       return parse_shift (str, i, NO_SHIFT_RESTRICT);
4784     }
4785
4786   if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4787     return FAIL;
4788
4789   if (skip_past_comma (str) == SUCCESS)
4790     {
4791       /* #x, y -- ie explicit rotation by Y.  */
4792       if (my_get_expression (&exp, str, GE_NO_PREFIX))
4793         return FAIL;
4794
4795       if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
4796         {
4797           inst.error = _("constant expression expected");
4798           return FAIL;
4799         }
4800
4801       value = exp.X_add_number;
4802       if (value < 0 || value > 30 || value % 2 != 0)
4803         {
4804           inst.error = _("invalid rotation");
4805           return FAIL;
4806         }
4807       if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4808         {
4809           inst.error = _("invalid constant");
4810           return FAIL;
4811         }
4812
4813       /* Convert to decoded value.  md_apply_fix will put it back.  */
4814       inst.reloc.exp.X_add_number
4815         = (((inst.reloc.exp.X_add_number << (32 - value))
4816             | (inst.reloc.exp.X_add_number >> value)) & 0xffffffff);
4817     }
4818
4819   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4820   inst.reloc.pc_rel = 0;
4821   return SUCCESS;
4822 }
4823
4824 /* Group relocation information.  Each entry in the table contains the
4825    textual name of the relocation as may appear in assembler source
4826    and must end with a colon.
4827    Along with this textual name are the relocation codes to be used if
4828    the corresponding instruction is an ALU instruction (ADD or SUB only),
4829    an LDR, an LDRS, or an LDC.  */
4830
4831 struct group_reloc_table_entry
4832 {
4833   const char *name;
4834   int alu_code;
4835   int ldr_code;
4836   int ldrs_code;
4837   int ldc_code;
4838 };
4839
4840 typedef enum
4841 {
4842   /* Varieties of non-ALU group relocation.  */
4843
4844   GROUP_LDR,
4845   GROUP_LDRS,
4846   GROUP_LDC
4847 } group_reloc_type;
4848
4849 static struct group_reloc_table_entry group_reloc_table[] =
4850   { /* Program counter relative: */
4851     { "pc_g0_nc",
4852       BFD_RELOC_ARM_ALU_PC_G0_NC,       /* ALU */
4853       0,                                /* LDR */
4854       0,                                /* LDRS */
4855       0 },                              /* LDC */
4856     { "pc_g0",
4857       BFD_RELOC_ARM_ALU_PC_G0,          /* ALU */
4858       BFD_RELOC_ARM_LDR_PC_G0,          /* LDR */
4859       BFD_RELOC_ARM_LDRS_PC_G0,         /* LDRS */
4860       BFD_RELOC_ARM_LDC_PC_G0 },        /* LDC */
4861     { "pc_g1_nc",
4862       BFD_RELOC_ARM_ALU_PC_G1_NC,       /* ALU */
4863       0,                                /* LDR */
4864       0,                                /* LDRS */
4865       0 },                              /* LDC */
4866     { "pc_g1",
4867       BFD_RELOC_ARM_ALU_PC_G1,          /* ALU */
4868       BFD_RELOC_ARM_LDR_PC_G1,          /* LDR */
4869       BFD_RELOC_ARM_LDRS_PC_G1,         /* LDRS */
4870       BFD_RELOC_ARM_LDC_PC_G1 },        /* LDC */
4871     { "pc_g2",
4872       BFD_RELOC_ARM_ALU_PC_G2,          /* ALU */
4873       BFD_RELOC_ARM_LDR_PC_G2,          /* LDR */
4874       BFD_RELOC_ARM_LDRS_PC_G2,         /* LDRS */
4875       BFD_RELOC_ARM_LDC_PC_G2 },        /* LDC */
4876     /* Section base relative */
4877     { "sb_g0_nc",
4878       BFD_RELOC_ARM_ALU_SB_G0_NC,       /* ALU */
4879       0,                                /* LDR */
4880       0,                                /* LDRS */
4881       0 },                              /* LDC */
4882     { "sb_g0",
4883       BFD_RELOC_ARM_ALU_SB_G0,          /* ALU */
4884       BFD_RELOC_ARM_LDR_SB_G0,          /* LDR */
4885       BFD_RELOC_ARM_LDRS_SB_G0,         /* LDRS */
4886       BFD_RELOC_ARM_LDC_SB_G0 },        /* LDC */
4887     { "sb_g1_nc",
4888       BFD_RELOC_ARM_ALU_SB_G1_NC,       /* ALU */
4889       0,                                /* LDR */
4890       0,                                /* LDRS */
4891       0 },                              /* LDC */
4892     { "sb_g1",
4893       BFD_RELOC_ARM_ALU_SB_G1,          /* ALU */
4894       BFD_RELOC_ARM_LDR_SB_G1,          /* LDR */
4895       BFD_RELOC_ARM_LDRS_SB_G1,         /* LDRS */
4896       BFD_RELOC_ARM_LDC_SB_G1 },        /* LDC */
4897     { "sb_g2",
4898       BFD_RELOC_ARM_ALU_SB_G2,          /* ALU */
4899       BFD_RELOC_ARM_LDR_SB_G2,          /* LDR */
4900       BFD_RELOC_ARM_LDRS_SB_G2,         /* LDRS */
4901       BFD_RELOC_ARM_LDC_SB_G2 } };      /* LDC */
4902
4903 /* Given the address of a pointer pointing to the textual name of a group
4904    relocation as may appear in assembler source, attempt to find its details
4905    in group_reloc_table.  The pointer will be updated to the character after
4906    the trailing colon.  On failure, FAIL will be returned; SUCCESS
4907    otherwise.  On success, *entry will be updated to point at the relevant
4908    group_reloc_table entry. */
4909
4910 static int
4911 find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
4912 {
4913   unsigned int i;
4914   for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
4915     {
4916       int length = strlen (group_reloc_table[i].name);
4917
4918       if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
4919           && (*str)[length] == ':')
4920         {
4921           *out = &group_reloc_table[i];
4922           *str += (length + 1);
4923           return SUCCESS;
4924         }
4925     }
4926
4927   return FAIL;
4928 }
4929
4930 /* Parse a <shifter_operand> for an ARM data processing instruction
4931    (as for parse_shifter_operand) where group relocations are allowed:
4932
4933       #<immediate>
4934       #<immediate>, <rotate>
4935       #:<group_reloc>:<expression>
4936       <Rm>
4937       <Rm>, <shift>
4938
4939    where <group_reloc> is one of the strings defined in group_reloc_table.
4940    The hashes are optional.
4941
4942    Everything else is as for parse_shifter_operand.  */
4943
4944 static parse_operand_result
4945 parse_shifter_operand_group_reloc (char **str, int i)
4946 {
4947   /* Determine if we have the sequence of characters #: or just :
4948      coming next.  If we do, then we check for a group relocation.
4949      If we don't, punt the whole lot to parse_shifter_operand.  */
4950
4951   if (((*str)[0] == '#' && (*str)[1] == ':')
4952       || (*str)[0] == ':')
4953     {
4954       struct group_reloc_table_entry *entry;
4955
4956       if ((*str)[0] == '#')
4957         (*str) += 2;
4958       else
4959         (*str)++;
4960
4961       /* Try to parse a group relocation.  Anything else is an error.  */
4962       if (find_group_reloc_table_entry (str, &entry) == FAIL)
4963         {
4964           inst.error = _("unknown group relocation");
4965           return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4966         }
4967
4968       /* We now have the group relocation table entry corresponding to
4969          the name in the assembler source.  Next, we parse the expression.  */
4970       if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
4971         return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4972
4973       /* Record the relocation type (always the ALU variant here).  */
4974       inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
4975       gas_assert (inst.reloc.type != 0);
4976
4977       return PARSE_OPERAND_SUCCESS;
4978     }
4979   else
4980     return parse_shifter_operand (str, i) == SUCCESS
4981            ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
4982
4983   /* Never reached.  */
4984 }
4985
4986 /* Parse a Neon alignment expression.  Information is written to
4987    inst.operands[i].  We assume the initial ':' has been skipped.
4988    
4989    align        .imm = align << 8, .immisalign=1, .preind=0  */
4990 static parse_operand_result
4991 parse_neon_alignment (char **str, int i)
4992 {
4993   char *p = *str;
4994   expressionS exp;
4995
4996   my_get_expression (&exp, &p, GE_NO_PREFIX);
4997
4998   if (exp.X_op != O_constant)
4999     {
5000       inst.error = _("alignment must be constant");
5001       return PARSE_OPERAND_FAIL;
5002     }
5003
5004   inst.operands[i].imm = exp.X_add_number << 8;
5005   inst.operands[i].immisalign = 1;
5006   /* Alignments are not pre-indexes.  */
5007   inst.operands[i].preind = 0;
5008
5009   *str = p;
5010   return PARSE_OPERAND_SUCCESS;
5011 }
5012
5013 /* Parse all forms of an ARM address expression.  Information is written
5014    to inst.operands[i] and/or inst.reloc.
5015
5016    Preindexed addressing (.preind=1):
5017
5018    [Rn, #offset]       .reg=Rn .reloc.exp=offset
5019    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5020    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5021                        .shift_kind=shift .reloc.exp=shift_imm
5022
5023    These three may have a trailing ! which causes .writeback to be set also.
5024
5025    Postindexed addressing (.postind=1, .writeback=1):
5026
5027    [Rn], #offset       .reg=Rn .reloc.exp=offset
5028    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5029    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5030                        .shift_kind=shift .reloc.exp=shift_imm
5031
5032    Unindexed addressing (.preind=0, .postind=0):
5033
5034    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
5035
5036    Other:
5037
5038    [Rn]{!}             shorthand for [Rn,#0]{!}
5039    =immediate          .isreg=0 .reloc.exp=immediate
5040    label               .reg=PC .reloc.pc_rel=1 .reloc.exp=label
5041
5042   It is the caller's responsibility to check for addressing modes not
5043   supported by the instruction, and to set inst.reloc.type.  */
5044
5045 static parse_operand_result
5046 parse_address_main (char **str, int i, int group_relocations,
5047                     group_reloc_type group_type)
5048 {
5049   char *p = *str;
5050   int reg;
5051
5052   if (skip_past_char (&p, '[') == FAIL)
5053     {
5054       if (skip_past_char (&p, '=') == FAIL)
5055         {
5056           /* Bare address - translate to PC-relative offset.  */
5057           inst.reloc.pc_rel = 1;
5058           inst.operands[i].reg = REG_PC;
5059           inst.operands[i].isreg = 1;
5060           inst.operands[i].preind = 1;
5061         }
5062       /* Otherwise a load-constant pseudo op, no special treatment needed here.  */
5063
5064       if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5065         return PARSE_OPERAND_FAIL;
5066
5067       *str = p;
5068       return PARSE_OPERAND_SUCCESS;
5069     }
5070
5071   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5072     {
5073       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5074       return PARSE_OPERAND_FAIL;
5075     }
5076   inst.operands[i].reg = reg;
5077   inst.operands[i].isreg = 1;
5078
5079   if (skip_past_comma (&p) == SUCCESS)
5080     {
5081       inst.operands[i].preind = 1;
5082
5083       if (*p == '+') p++;
5084       else if (*p == '-') p++, inst.operands[i].negative = 1;
5085
5086       if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5087         {
5088           inst.operands[i].imm = reg;
5089           inst.operands[i].immisreg = 1;
5090
5091           if (skip_past_comma (&p) == SUCCESS)
5092             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5093               return PARSE_OPERAND_FAIL;
5094         }
5095       else if (skip_past_char (&p, ':') == SUCCESS)
5096         {
5097           /* FIXME: '@' should be used here, but it's filtered out by generic
5098              code before we get to see it here. This may be subject to
5099              change.  */
5100           parse_operand_result result = parse_neon_alignment (&p, i);
5101           
5102           if (result != PARSE_OPERAND_SUCCESS)
5103             return result;
5104         }
5105       else
5106         {
5107           if (inst.operands[i].negative)
5108             {
5109               inst.operands[i].negative = 0;
5110               p--;
5111             }
5112
5113           if (group_relocations
5114               && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
5115             {
5116               struct group_reloc_table_entry *entry;
5117
5118               /* Skip over the #: or : sequence.  */
5119               if (*p == '#')
5120                 p += 2;
5121               else
5122                 p++;
5123
5124               /* Try to parse a group relocation.  Anything else is an
5125                  error.  */
5126               if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5127                 {
5128                   inst.error = _("unknown group relocation");
5129                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5130                 }
5131
5132               /* We now have the group relocation table entry corresponding to
5133                  the name in the assembler source.  Next, we parse the
5134                  expression.  */
5135               if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5136                 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5137
5138               /* Record the relocation type.  */
5139               switch (group_type)
5140                 {
5141                   case GROUP_LDR:
5142                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
5143                     break;
5144
5145                   case GROUP_LDRS:
5146                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
5147                     break;
5148
5149                   case GROUP_LDC:
5150                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
5151                     break;
5152
5153                   default:
5154                     gas_assert (0);
5155                 }
5156
5157               if (inst.reloc.type == 0)
5158                 {
5159                   inst.error = _("this group relocation is not allowed on this instruction");
5160                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5161                 }
5162             }
5163           else
5164             if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5165               return PARSE_OPERAND_FAIL;
5166         }
5167     }
5168   else if (skip_past_char (&p, ':') == SUCCESS)
5169     {
5170       /* FIXME: '@' should be used here, but it's filtered out by generic code
5171          before we get to see it here. This may be subject to change.  */
5172       parse_operand_result result = parse_neon_alignment (&p, i);
5173       
5174       if (result != PARSE_OPERAND_SUCCESS)
5175         return result;
5176     }
5177
5178   if (skip_past_char (&p, ']') == FAIL)
5179     {
5180       inst.error = _("']' expected");
5181       return PARSE_OPERAND_FAIL;
5182     }
5183
5184   if (skip_past_char (&p, '!') == SUCCESS)
5185     inst.operands[i].writeback = 1;
5186
5187   else if (skip_past_comma (&p) == SUCCESS)
5188     {
5189       if (skip_past_char (&p, '{') == SUCCESS)
5190         {
5191           /* [Rn], {expr} - unindexed, with option */
5192           if (parse_immediate (&p, &inst.operands[i].imm,
5193                                0, 255, TRUE) == FAIL)
5194             return PARSE_OPERAND_FAIL;
5195
5196           if (skip_past_char (&p, '}') == FAIL)
5197             {
5198               inst.error = _("'}' expected at end of 'option' field");
5199               return PARSE_OPERAND_FAIL;
5200             }
5201           if (inst.operands[i].preind)
5202             {
5203               inst.error = _("cannot combine index with option");
5204               return PARSE_OPERAND_FAIL;
5205             }
5206           *str = p;
5207           return PARSE_OPERAND_SUCCESS;
5208         }
5209       else
5210         {
5211           inst.operands[i].postind = 1;
5212           inst.operands[i].writeback = 1;
5213
5214           if (inst.operands[i].preind)
5215             {
5216               inst.error = _("cannot combine pre- and post-indexing");
5217               return PARSE_OPERAND_FAIL;
5218             }
5219
5220           if (*p == '+') p++;
5221           else if (*p == '-') p++, inst.operands[i].negative = 1;
5222
5223           if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5224             {
5225               /* We might be using the immediate for alignment already. If we
5226                  are, OR the register number into the low-order bits.  */
5227               if (inst.operands[i].immisalign)
5228                 inst.operands[i].imm |= reg;
5229               else
5230                 inst.operands[i].imm = reg;
5231               inst.operands[i].immisreg = 1;
5232
5233               if (skip_past_comma (&p) == SUCCESS)
5234                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5235                   return PARSE_OPERAND_FAIL;
5236             }
5237           else
5238             {
5239               if (inst.operands[i].negative)
5240                 {
5241                   inst.operands[i].negative = 0;
5242                   p--;
5243                 }
5244               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5245                 return PARSE_OPERAND_FAIL;
5246             }
5247         }
5248     }
5249
5250   /* If at this point neither .preind nor .postind is set, we have a
5251      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
5252   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5253     {
5254       inst.operands[i].preind = 1;
5255       inst.reloc.exp.X_op = O_constant;
5256       inst.reloc.exp.X_add_number = 0;
5257     }
5258   *str = p;
5259   return PARSE_OPERAND_SUCCESS;
5260 }
5261
5262 static int
5263 parse_address (char **str, int i)
5264 {
5265   return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
5266          ? SUCCESS : FAIL;
5267 }
5268
5269 static parse_operand_result
5270 parse_address_group_reloc (char **str, int i, group_reloc_type type)
5271 {
5272   return parse_address_main (str, i, 1, type);
5273 }
5274
5275 /* Parse an operand for a MOVW or MOVT instruction.  */
5276 static int
5277 parse_half (char **str)
5278 {
5279   char * p;
5280
5281   p = *str;
5282   skip_past_char (&p, '#');
5283   if (strncasecmp (p, ":lower16:", 9) == 0)
5284     inst.reloc.type = BFD_RELOC_ARM_MOVW;
5285   else if (strncasecmp (p, ":upper16:", 9) == 0)
5286     inst.reloc.type = BFD_RELOC_ARM_MOVT;
5287
5288   if (inst.reloc.type != BFD_RELOC_UNUSED)
5289     {
5290       p += 9;
5291       skip_whitespace (p);
5292     }
5293
5294   if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5295     return FAIL;
5296
5297   if (inst.reloc.type == BFD_RELOC_UNUSED)
5298     {
5299       if (inst.reloc.exp.X_op != O_constant)
5300         {
5301           inst.error = _("constant expression expected");
5302           return FAIL;
5303         }
5304       if (inst.reloc.exp.X_add_number < 0
5305           || inst.reloc.exp.X_add_number > 0xffff)
5306         {
5307           inst.error = _("immediate value out of range");
5308           return FAIL;
5309         }
5310     }
5311   *str = p;
5312   return SUCCESS;
5313 }
5314
5315 /* Miscellaneous. */
5316
5317 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
5318    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
5319 static int
5320 parse_psr (char **str)
5321 {
5322   char *p;
5323   unsigned long psr_field;
5324   const struct asm_psr *psr;
5325   char *start;
5326
5327   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
5328      feature for ease of use and backwards compatibility.  */
5329   p = *str;
5330   if (strncasecmp (p, "SPSR", 4) == 0)
5331     psr_field = SPSR_BIT;
5332   else if (strncasecmp (p, "CPSR", 4) == 0 
5333            || (strncasecmp (p, "APSR", 4) == 0
5334                && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m)))
5335     psr_field = 0;
5336   else
5337     {
5338       start = p;
5339       do
5340         p++;
5341       while (ISALNUM (*p) || *p == '_');
5342
5343       psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5344                                                   p - start);
5345       if (!psr)
5346         return FAIL;
5347
5348       *str = p;
5349       return psr->field;
5350     }
5351
5352   p += 4;
5353   if (*p == '_')
5354     {
5355       /* A suffix follows.  */
5356       p++;
5357       start = p;
5358
5359       do
5360         p++;
5361       while (ISALNUM (*p) || *p == '_');
5362
5363       psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5364                                                   p - start);
5365       if (!psr)
5366         goto error;
5367
5368       psr_field |= psr->field;
5369     }
5370   else
5371     {
5372       if (ISALNUM (*p))
5373         goto error;    /* Garbage after "[CS]PSR".  */
5374
5375       psr_field |= (PSR_c | PSR_f);
5376     }
5377   *str = p;
5378   return psr_field;
5379
5380  error:
5381   inst.error = _("flag for {c}psr instruction expected");
5382   return FAIL;
5383 }
5384
5385 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
5386    value suitable for splatting into the AIF field of the instruction.  */
5387
5388 static int
5389 parse_cps_flags (char **str)
5390 {
5391   int val = 0;
5392   int saw_a_flag = 0;
5393   char *s = *str;
5394
5395   for (;;)
5396     switch (*s++)
5397       {
5398       case '\0': case ',':
5399         goto done;
5400
5401       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5402       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5403       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
5404
5405       default:
5406         inst.error = _("unrecognized CPS flag");
5407         return FAIL;
5408       }
5409
5410  done:
5411   if (saw_a_flag == 0)
5412     {
5413       inst.error = _("missing CPS flags");
5414       return FAIL;
5415     }
5416
5417   *str = s - 1;
5418   return val;
5419 }
5420
5421 /* Parse an endian specifier ("BE" or "LE", case insensitive);
5422    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
5423
5424 static int
5425 parse_endian_specifier (char **str)
5426 {
5427   int little_endian;
5428   char *s = *str;
5429
5430   if (strncasecmp (s, "BE", 2))
5431     little_endian = 0;
5432   else if (strncasecmp (s, "LE", 2))
5433     little_endian = 1;
5434   else
5435     {
5436       inst.error = _("valid endian specifiers are be or le");
5437       return FAIL;
5438     }
5439
5440   if (ISALNUM (s[2]) || s[2] == '_')
5441     {
5442       inst.error = _("valid endian specifiers are be or le");
5443       return FAIL;
5444     }
5445
5446   *str = s + 2;
5447   return little_endian;
5448 }
5449
5450 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
5451    value suitable for poking into the rotate field of an sxt or sxta
5452    instruction, or FAIL on error.  */
5453
5454 static int
5455 parse_ror (char **str)
5456 {
5457   int rot;
5458   char *s = *str;
5459
5460   if (strncasecmp (s, "ROR", 3) == 0)
5461     s += 3;
5462   else
5463     {
5464       inst.error = _("missing rotation field after comma");
5465       return FAIL;
5466     }
5467
5468   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5469     return FAIL;
5470
5471   switch (rot)
5472     {
5473     case  0: *str = s; return 0x0;
5474     case  8: *str = s; return 0x1;
5475     case 16: *str = s; return 0x2;
5476     case 24: *str = s; return 0x3;
5477
5478     default:
5479       inst.error = _("rotation can only be 0, 8, 16, or 24");
5480       return FAIL;
5481     }
5482 }
5483
5484 /* Parse a conditional code (from conds[] below).  The value returned is in the
5485    range 0 .. 14, or FAIL.  */
5486 static int
5487 parse_cond (char **str)
5488 {
5489   char *q;
5490   const struct asm_cond *c;
5491   int n;
5492   /* Condition codes are always 2 characters, so matching up to
5493      3 characters is sufficient.  */
5494   char cond[3];
5495
5496   q = *str;
5497   n = 0;
5498   while (ISALPHA (*q) && n < 3)
5499     {
5500       cond[n] = TOLOWER (*q);
5501       q++;
5502       n++;
5503     }
5504
5505   c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
5506   if (!c)
5507     {
5508       inst.error = _("condition required");
5509       return FAIL;
5510     }
5511
5512   *str = q;
5513   return c->value;
5514 }
5515
5516 /* Parse an option for a barrier instruction.  Returns the encoding for the
5517    option, or FAIL.  */
5518 static int
5519 parse_barrier (char **str)
5520 {
5521   char *p, *q;
5522   const struct asm_barrier_opt *o;
5523
5524   p = q = *str;
5525   while (ISALPHA (*q))
5526     q++;
5527
5528   o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
5529                                                     q - p);
5530   if (!o)
5531     return FAIL;
5532
5533   *str = q;
5534   return o->value;
5535 }
5536
5537 /* Parse the operands of a table branch instruction.  Similar to a memory
5538    operand.  */
5539 static int
5540 parse_tb (char **str)
5541 {
5542   char * p = *str;
5543   int reg;
5544
5545   if (skip_past_char (&p, '[') == FAIL)
5546     {
5547       inst.error = _("'[' expected");
5548       return FAIL;
5549     }
5550
5551   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5552     {
5553       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5554       return FAIL;
5555     }
5556   inst.operands[0].reg = reg;
5557
5558   if (skip_past_comma (&p) == FAIL)
5559     {
5560       inst.error = _("',' expected");
5561       return FAIL;
5562     }
5563
5564   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5565     {
5566       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5567       return FAIL;
5568     }
5569   inst.operands[0].imm = reg;
5570
5571   if (skip_past_comma (&p) == SUCCESS)
5572     {
5573       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5574         return FAIL;
5575       if (inst.reloc.exp.X_add_number != 1)
5576         {
5577           inst.error = _("invalid shift");
5578           return FAIL;
5579         }
5580       inst.operands[0].shifted = 1;
5581     }
5582
5583   if (skip_past_char (&p, ']') == FAIL)
5584     {
5585       inst.error = _("']' expected");
5586       return FAIL;
5587     }
5588   *str = p;
5589   return SUCCESS;
5590 }
5591
5592 /* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5593    information on the types the operands can take and how they are encoded.
5594    Up to four operands may be read; this function handles setting the
5595    ".present" field for each read operand itself.
5596    Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5597    else returns FAIL.  */
5598
5599 static int
5600 parse_neon_mov (char **str, int *which_operand)
5601 {
5602   int i = *which_operand, val;
5603   enum arm_reg_type rtype;
5604   char *ptr = *str;
5605   struct neon_type_el optype;
5606
5607   if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5608     {
5609       /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
5610       inst.operands[i].reg = val;
5611       inst.operands[i].isscalar = 1;
5612       inst.operands[i].vectype = optype;
5613       inst.operands[i++].present = 1;
5614
5615       if (skip_past_comma (&ptr) == FAIL)
5616         goto wanted_comma;
5617
5618       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5619         goto wanted_arm;
5620
5621       inst.operands[i].reg = val;
5622       inst.operands[i].isreg = 1;
5623       inst.operands[i].present = 1;
5624     }
5625   else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
5626            != FAIL)
5627     {
5628       /* Cases 0, 1, 2, 3, 5 (D only).  */
5629       if (skip_past_comma (&ptr) == FAIL)
5630         goto wanted_comma;
5631
5632       inst.operands[i].reg = val;
5633       inst.operands[i].isreg = 1;
5634       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5635       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5636       inst.operands[i].isvec = 1;
5637       inst.operands[i].vectype = optype;
5638       inst.operands[i++].present = 1;
5639
5640       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5641         {
5642           /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5643              Case 13: VMOV <Sd>, <Rm>  */
5644           inst.operands[i].reg = val;
5645           inst.operands[i].isreg = 1;
5646           inst.operands[i].present = 1;
5647
5648           if (rtype == REG_TYPE_NQ)
5649             {
5650               first_error (_("can't use Neon quad register here"));
5651               return FAIL;
5652             }
5653           else if (rtype != REG_TYPE_VFS)
5654             {
5655               i++;
5656               if (skip_past_comma (&ptr) == FAIL)
5657                 goto wanted_comma;
5658               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5659                 goto wanted_arm;
5660               inst.operands[i].reg = val;
5661               inst.operands[i].isreg = 1;
5662               inst.operands[i].present = 1;
5663             }
5664         }
5665       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
5666                                            &optype)) != FAIL)
5667         {
5668           /* Case 0: VMOV<c><q> <Qd>, <Qm>
5669              Case 1: VMOV<c><q> <Dd>, <Dm>
5670              Case 8: VMOV.F32 <Sd>, <Sm>
5671              Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
5672
5673           inst.operands[i].reg = val;
5674           inst.operands[i].isreg = 1;
5675           inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5676           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5677           inst.operands[i].isvec = 1;
5678           inst.operands[i].vectype = optype;
5679           inst.operands[i].present = 1;
5680
5681           if (skip_past_comma (&ptr) == SUCCESS)
5682             {
5683               /* Case 15.  */
5684               i++;
5685
5686               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5687                 goto wanted_arm;
5688
5689               inst.operands[i].reg = val;
5690               inst.operands[i].isreg = 1;
5691               inst.operands[i++].present = 1;
5692
5693               if (skip_past_comma (&ptr) == FAIL)
5694                 goto wanted_comma;
5695
5696               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5697                 goto wanted_arm;
5698
5699               inst.operands[i].reg = val;
5700               inst.operands[i].isreg = 1;
5701               inst.operands[i++].present = 1;
5702             }
5703         }
5704       else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
5705           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
5706              Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
5707              Case 10: VMOV.F32 <Sd>, #<imm>
5708              Case 11: VMOV.F64 <Dd>, #<imm>  */
5709         inst.operands[i].immisfloat = 1;
5710       else if (parse_big_immediate (&ptr, i) == SUCCESS)
5711           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
5712              Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
5713         ;
5714       else
5715         {
5716           first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
5717           return FAIL;
5718         }
5719     }
5720   else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5721     {
5722       /* Cases 6, 7.  */
5723       inst.operands[i].reg = val;
5724       inst.operands[i].isreg = 1;
5725       inst.operands[i++].present = 1;
5726
5727       if (skip_past_comma (&ptr) == FAIL)
5728         goto wanted_comma;
5729
5730       if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5731         {
5732           /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
5733           inst.operands[i].reg = val;
5734           inst.operands[i].isscalar = 1;
5735           inst.operands[i].present = 1;
5736           inst.operands[i].vectype = optype;
5737         }
5738       else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5739         {
5740           /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
5741           inst.operands[i].reg = val;
5742           inst.operands[i].isreg = 1;
5743           inst.operands[i++].present = 1;
5744
5745           if (skip_past_comma (&ptr) == FAIL)
5746             goto wanted_comma;
5747
5748           if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
5749               == FAIL)
5750             {
5751               first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
5752               return FAIL;
5753             }
5754
5755           inst.operands[i].reg = val;
5756           inst.operands[i].isreg = 1;
5757           inst.operands[i].isvec = 1;
5758           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5759           inst.operands[i].vectype = optype;
5760           inst.operands[i].present = 1;
5761
5762           if (rtype == REG_TYPE_VFS)
5763             {
5764               /* Case 14.  */
5765               i++;
5766               if (skip_past_comma (&ptr) == FAIL)
5767                 goto wanted_comma;
5768               if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
5769                                               &optype)) == FAIL)
5770                 {
5771                   first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
5772                   return FAIL;
5773                 }
5774               inst.operands[i].reg = val;
5775               inst.operands[i].isreg = 1;
5776               inst.operands[i].isvec = 1;
5777               inst.operands[i].issingle = 1;
5778               inst.operands[i].vectype = optype;
5779               inst.operands[i].present = 1;
5780             }
5781         }
5782       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
5783                != FAIL)
5784         {
5785           /* Case 13.  */
5786           inst.operands[i].reg = val;
5787           inst.operands[i].isreg = 1;
5788           inst.operands[i].isvec = 1;
5789           inst.operands[i].issingle = 1;
5790           inst.operands[i].vectype = optype;
5791           inst.operands[i++].present = 1;
5792         }
5793     }
5794   else
5795     {
5796       first_error (_("parse error"));
5797       return FAIL;
5798     }
5799
5800   /* Successfully parsed the operands. Update args.  */
5801   *which_operand = i;
5802   *str = ptr;
5803   return SUCCESS;
5804
5805  wanted_comma:
5806   first_error (_("expected comma"));
5807   return FAIL;
5808
5809  wanted_arm:
5810   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
5811   return FAIL;
5812 }
5813
5814 /* Use this macro when the operand constraints are different
5815    for ARM and THUMB (e.g. ldrd).  */
5816 #define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
5817         ((arm_operand) | ((thumb_operand) << 16))
5818
5819 /* Matcher codes for parse_operands.  */
5820 enum operand_parse_code
5821 {
5822   OP_stop,      /* end of line */
5823
5824   OP_RR,        /* ARM register */
5825   OP_RRnpc,     /* ARM register, not r15 */
5826   OP_RRnpcsp,   /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
5827   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
5828   OP_RRnpctw,   /* ARM register, not r15 in Thumb-state or with writeback, 
5829                    optional trailing ! */
5830   OP_RRw,       /* ARM register, not r15, optional trailing ! */
5831   OP_RCP,       /* Coprocessor number */
5832   OP_RCN,       /* Coprocessor register */
5833   OP_RF,        /* FPA register */
5834   OP_RVS,       /* VFP single precision register */
5835   OP_RVD,       /* VFP double precision register (0..15) */
5836   OP_RND,       /* Neon double precision register (0..31) */
5837   OP_RNQ,       /* Neon quad precision register */
5838   OP_RVSD,      /* VFP single or double precision register */
5839   OP_RNDQ,      /* Neon double or quad precision register */
5840   OP_RNSDQ,     /* Neon single, double or quad precision register */
5841   OP_RNSC,      /* Neon scalar D[X] */
5842   OP_RVC,       /* VFP control register */
5843   OP_RMF,       /* Maverick F register */
5844   OP_RMD,       /* Maverick D register */
5845   OP_RMFX,      /* Maverick FX register */
5846   OP_RMDX,      /* Maverick DX register */
5847   OP_RMAX,      /* Maverick AX register */
5848   OP_RMDS,      /* Maverick DSPSC register */
5849   OP_RIWR,      /* iWMMXt wR register */
5850   OP_RIWC,      /* iWMMXt wC register */
5851   OP_RIWG,      /* iWMMXt wCG register */
5852   OP_RXA,       /* XScale accumulator register */
5853
5854   OP_REGLST,    /* ARM register list */
5855   OP_VRSLST,    /* VFP single-precision register list */
5856   OP_VRDLST,    /* VFP double-precision register list */
5857   OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
5858   OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
5859   OP_NSTRLST,   /* Neon element/structure list */
5860
5861   OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
5862   OP_RVSD_I0,   /* VFP S or D reg, or immediate zero.  */
5863   OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
5864   OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
5865   OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
5866   OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
5867   OP_VMOV,      /* Neon VMOV operands.  */
5868   OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN.  */
5869   OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
5870   OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
5871
5872   OP_I0,        /* immediate zero */
5873   OP_I7,        /* immediate value 0 .. 7 */
5874   OP_I15,       /*                 0 .. 15 */
5875   OP_I16,       /*                 1 .. 16 */
5876   OP_I16z,      /*                 0 .. 16 */
5877   OP_I31,       /*                 0 .. 31 */
5878   OP_I31w,      /*                 0 .. 31, optional trailing ! */
5879   OP_I32,       /*                 1 .. 32 */
5880   OP_I32z,      /*                 0 .. 32 */
5881   OP_I63,       /*                 0 .. 63 */
5882   OP_I63s,      /*               -64 .. 63 */
5883   OP_I64,       /*                 1 .. 64 */
5884   OP_I64z,      /*                 0 .. 64 */
5885   OP_I255,      /*                 0 .. 255 */
5886
5887   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
5888   OP_I7b,       /*                             0 .. 7 */
5889   OP_I15b,      /*                             0 .. 15 */
5890   OP_I31b,      /*                             0 .. 31 */
5891
5892   OP_SH,        /* shifter operand */
5893   OP_SHG,       /* shifter operand with possible group relocation */
5894   OP_ADDR,      /* Memory address expression (any mode) */
5895   OP_ADDRGLDR,  /* Mem addr expr (any mode) with possible LDR group reloc */
5896   OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
5897   OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
5898   OP_EXP,       /* arbitrary expression */
5899   OP_EXPi,      /* same, with optional immediate prefix */
5900   OP_EXPr,      /* same, with optional relocation suffix */
5901   OP_HALF,      /* 0 .. 65535 or low/high reloc.  */
5902
5903   OP_CPSF,      /* CPS flags */
5904   OP_ENDI,      /* Endianness specifier */
5905   OP_PSR,       /* CPSR/SPSR mask for msr */
5906   OP_COND,      /* conditional code */
5907   OP_TB,        /* Table branch.  */
5908
5909   OP_RVC_PSR,   /* CPSR/SPSR mask for msr, or VFP control register.  */
5910   OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
5911
5912   OP_RRnpc_I0,  /* ARM register or literal 0 */
5913   OP_RR_EXr,    /* ARM register or expression with opt. reloc suff. */
5914   OP_RR_EXi,    /* ARM register or expression with imm prefix */
5915   OP_RF_IF,     /* FPA register or immediate */
5916   OP_RIWR_RIWC, /* iWMMXt R or C reg */
5917   OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
5918
5919   /* Optional operands.  */
5920   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
5921   OP_oI31b,      /*                             0 .. 31 */
5922   OP_oI32b,      /*                             1 .. 32 */
5923   OP_oIffffb,    /*                             0 .. 65535 */
5924   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
5925
5926   OP_oRR,        /* ARM register */
5927   OP_oRRnpc,     /* ARM register, not the PC */
5928   OP_oRRnpcsp,   /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
5929   OP_oRRw,       /* ARM register, not r15, optional trailing ! */
5930   OP_oRND,       /* Optional Neon double precision register */
5931   OP_oRNQ,       /* Optional Neon quad precision register */
5932   OP_oRNDQ,      /* Optional Neon double or quad precision register */
5933   OP_oRNSDQ,     /* Optional single, double or quad precision vector register */
5934   OP_oSHll,      /* LSL immediate */
5935   OP_oSHar,      /* ASR immediate */
5936   OP_oSHllar,    /* LSL or ASR immediate */
5937   OP_oROR,       /* ROR 0/8/16/24 */
5938   OP_oBARRIER_I15, /* Option argument for a barrier instruction.  */
5939
5940   /* Some pre-defined mixed (ARM/THUMB) operands.  */
5941   OP_RR_npcsp           = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
5942   OP_RRnpc_npcsp        = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
5943   OP_oRRnpc_npcsp       = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
5944
5945   OP_FIRST_OPTIONAL = OP_oI7b
5946 };
5947
5948 /* Generic instruction operand parser.  This does no encoding and no
5949    semantic validation; it merely squirrels values away in the inst
5950    structure.  Returns SUCCESS or FAIL depending on whether the
5951    specified grammar matched.  */
5952 static int
5953 parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
5954 {
5955   unsigned const int *upat = pattern;
5956   char *backtrack_pos = 0;
5957   const char *backtrack_error = 0;
5958   int i, val, backtrack_index = 0;
5959   enum arm_reg_type rtype;
5960   parse_operand_result result;
5961   unsigned int op_parse_code;
5962
5963 #define po_char_or_fail(chr)                    \
5964   do                                            \
5965     {                                           \
5966       if (skip_past_char (&str, chr) == FAIL)   \
5967         goto bad_args;                          \
5968     }                                           \
5969   while (0)
5970
5971 #define po_reg_or_fail(regtype)                                 \
5972   do                                                            \
5973     {                                                           \
5974       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
5975                                  & inst.operands[i].vectype);   \
5976       if (val == FAIL)                                          \
5977         {                                                       \
5978           first_error (_(reg_expected_msgs[regtype]));          \
5979           goto failure;                                         \
5980         }                                                       \
5981       inst.operands[i].reg = val;                               \
5982       inst.operands[i].isreg = 1;                               \
5983       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
5984       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
5985       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
5986                              || rtype == REG_TYPE_VFD           \
5987                              || rtype == REG_TYPE_NQ);          \
5988     }                                                           \
5989   while (0)
5990
5991 #define po_reg_or_goto(regtype, label)                          \
5992   do                                                            \
5993     {                                                           \
5994       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
5995                                  & inst.operands[i].vectype);   \
5996       if (val == FAIL)                                          \
5997         goto label;                                             \
5998                                                                 \
5999       inst.operands[i].reg = val;                               \
6000       inst.operands[i].isreg = 1;                               \
6001       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6002       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6003       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6004                              || rtype == REG_TYPE_VFD           \
6005                              || rtype == REG_TYPE_NQ);          \
6006     }                                                           \
6007   while (0)
6008
6009 #define po_imm_or_fail(min, max, popt)                          \
6010   do                                                            \
6011     {                                                           \
6012       if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
6013         goto failure;                                           \
6014       inst.operands[i].imm = val;                               \
6015     }                                                           \
6016   while (0)
6017
6018 #define po_scalar_or_goto(elsz, label)                                  \
6019   do                                                                    \
6020     {                                                                   \
6021       val = parse_scalar (& str, elsz, & inst.operands[i].vectype);     \
6022       if (val == FAIL)                                                  \
6023         goto label;                                                     \
6024       inst.operands[i].reg = val;                                       \
6025       inst.operands[i].isscalar = 1;                                    \
6026     }                                                                   \
6027   while (0)
6028
6029 #define po_misc_or_fail(expr)                   \
6030   do                                            \
6031     {                                           \
6032       if (expr)                                 \
6033         goto failure;                           \
6034     }                                           \
6035   while (0)
6036
6037 #define po_misc_or_fail_no_backtrack(expr)              \
6038   do                                                    \
6039     {                                                   \
6040       result = expr;                                    \
6041       if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)    \
6042         backtrack_pos = 0;                              \
6043       if (result != PARSE_OPERAND_SUCCESS)              \
6044         goto failure;                                   \
6045     }                                                   \
6046   while (0)
6047
6048 #define po_barrier_or_imm(str)                             \
6049   do                                                       \
6050     {                                                      \
6051       val = parse_barrier (&str);                          \
6052       if (val == FAIL)                                     \
6053         {                                                  \
6054           if (ISALPHA (*str))                              \
6055               goto failure;                                \
6056           else                                             \
6057               goto immediate;                              \
6058         }                                                  \
6059       else                                                 \
6060         {                                                  \
6061           if ((inst.instruction & 0xf0) == 0x60            \
6062               && val != 0xf)                               \
6063             {                                              \
6064                /* ISB can only take SY as an option.  */   \
6065                inst.error = _("invalid barrier type");     \
6066                goto failure;                               \
6067             }                                              \
6068         }                                                  \
6069     }                                                      \
6070   while (0)
6071
6072   skip_whitespace (str);
6073
6074   for (i = 0; upat[i] != OP_stop; i++)
6075     {
6076       op_parse_code = upat[i];
6077       if (op_parse_code >= 1<<16)
6078         op_parse_code = thumb ? (op_parse_code >> 16)
6079                                 : (op_parse_code & ((1<<16)-1));
6080
6081       if (op_parse_code >= OP_FIRST_OPTIONAL)
6082         {
6083           /* Remember where we are in case we need to backtrack.  */
6084           gas_assert (!backtrack_pos);
6085           backtrack_pos = str;
6086           backtrack_error = inst.error;
6087           backtrack_index = i;
6088         }
6089
6090       if (i > 0 && (i > 1 || inst.operands[0].present))
6091         po_char_or_fail (',');
6092
6093       switch (op_parse_code)
6094         {
6095           /* Registers */
6096         case OP_oRRnpc:
6097         case OP_oRRnpcsp:
6098         case OP_RRnpc:
6099         case OP_RRnpcsp:
6100         case OP_oRR:
6101         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
6102         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
6103         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
6104         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
6105         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
6106         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
6107         case OP_oRND:
6108         case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);     break;
6109         case OP_RVC:
6110           po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6111           break;
6112           /* Also accept generic coprocessor regs for unknown registers.  */
6113           coproc_reg:
6114           po_reg_or_fail (REG_TYPE_CN);
6115           break;
6116         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
6117         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
6118         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
6119         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
6120         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
6121         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
6122         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
6123         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
6124         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
6125         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
6126         case OP_oRNQ:
6127         case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
6128         case OP_oRNDQ:
6129         case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
6130         case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
6131         case OP_oRNSDQ:
6132         case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
6133
6134         /* Neon scalar. Using an element size of 8 means that some invalid
6135            scalars are accepted here, so deal with those in later code.  */
6136         case OP_RNSC:  po_scalar_or_goto (8, failure);    break;
6137
6138         case OP_RNDQ_I0:
6139           {
6140             po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6141             break;
6142             try_imm0:
6143             po_imm_or_fail (0, 0, TRUE);
6144           }
6145           break;
6146
6147         case OP_RVSD_I0:
6148           po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6149           break;
6150
6151         case OP_RR_RNSC:
6152           {
6153             po_scalar_or_goto (8, try_rr);
6154             break;
6155             try_rr:
6156             po_reg_or_fail (REG_TYPE_RN);
6157           }
6158           break;
6159
6160         case OP_RNSDQ_RNSC:
6161           {
6162             po_scalar_or_goto (8, try_nsdq);
6163             break;
6164             try_nsdq:
6165             po_reg_or_fail (REG_TYPE_NSDQ);
6166           }
6167           break;
6168
6169         case OP_RNDQ_RNSC:
6170           {
6171             po_scalar_or_goto (8, try_ndq);
6172             break;
6173             try_ndq:
6174             po_reg_or_fail (REG_TYPE_NDQ);
6175           }
6176           break;
6177
6178         case OP_RND_RNSC:
6179           {
6180             po_scalar_or_goto (8, try_vfd);
6181             break;
6182             try_vfd:
6183             po_reg_or_fail (REG_TYPE_VFD);
6184           }
6185           break;
6186
6187         case OP_VMOV:
6188           /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6189              not careful then bad things might happen.  */
6190           po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6191           break;
6192
6193         case OP_RNDQ_Ibig:
6194           {
6195             po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
6196             break;
6197             try_immbig:
6198             /* There's a possibility of getting a 64-bit immediate here, so
6199                we need special handling.  */
6200             if (parse_big_immediate (&str, i) == FAIL)
6201               {
6202                 inst.error = _("immediate value is out of range");
6203                 goto failure;
6204               }
6205           }
6206           break;
6207
6208         case OP_RNDQ_I63b:
6209           {
6210             po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6211             break;
6212             try_shimm:
6213             po_imm_or_fail (0, 63, TRUE);
6214           }
6215           break;
6216
6217         case OP_RRnpcb:
6218           po_char_or_fail ('[');
6219           po_reg_or_fail  (REG_TYPE_RN);
6220           po_char_or_fail (']');
6221           break;
6222
6223         case OP_RRnpctw:
6224         case OP_RRw:
6225         case OP_oRRw:
6226           po_reg_or_fail (REG_TYPE_RN);
6227           if (skip_past_char (&str, '!') == SUCCESS)
6228             inst.operands[i].writeback = 1;
6229           break;
6230
6231           /* Immediates */
6232         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
6233         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
6234         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
6235         case OP_I16z:    po_imm_or_fail (  0,     16, FALSE);   break;
6236         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
6237         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
6238         case OP_I32z:    po_imm_or_fail (  0,     32, FALSE);   break;
6239         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
6240         case OP_I63:     po_imm_or_fail (  0,     63, FALSE);   break;
6241         case OP_I64:     po_imm_or_fail (  1,     64, FALSE);   break;
6242         case OP_I64z:    po_imm_or_fail (  0,     64, FALSE);   break;
6243         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
6244
6245         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
6246         case OP_oI7b:
6247         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
6248         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
6249         case OP_oI31b:
6250         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
6251         case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
6252         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
6253
6254           /* Immediate variants */
6255         case OP_oI255c:
6256           po_char_or_fail ('{');
6257           po_imm_or_fail (0, 255, TRUE);
6258           po_char_or_fail ('}');
6259           break;
6260
6261         case OP_I31w:
6262           /* The expression parser chokes on a trailing !, so we have
6263              to find it first and zap it.  */
6264           {
6265             char *s = str;
6266             while (*s && *s != ',')
6267               s++;
6268             if (s[-1] == '!')
6269               {
6270                 s[-1] = '\0';
6271                 inst.operands[i].writeback = 1;
6272               }
6273             po_imm_or_fail (0, 31, TRUE);
6274             if (str == s - 1)
6275               str = s;
6276           }
6277           break;
6278
6279           /* Expressions */
6280         case OP_EXPi:   EXPi:
6281           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6282                                               GE_OPT_PREFIX));
6283           break;
6284
6285         case OP_EXP:
6286           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6287                                               GE_NO_PREFIX));
6288           break;
6289
6290         case OP_EXPr:   EXPr:
6291           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6292                                               GE_NO_PREFIX));
6293           if (inst.reloc.exp.X_op == O_symbol)
6294             {
6295               val = parse_reloc (&str);
6296               if (val == -1)
6297                 {
6298                   inst.error = _("unrecognized relocation suffix");
6299                   goto failure;
6300                 }
6301               else if (val != BFD_RELOC_UNUSED)
6302                 {
6303                   inst.operands[i].imm = val;
6304                   inst.operands[i].hasreloc = 1;
6305                 }
6306             }
6307           break;
6308
6309           /* Operand for MOVW or MOVT.  */
6310         case OP_HALF:
6311           po_misc_or_fail (parse_half (&str));
6312           break;
6313
6314           /* Register or expression.  */
6315         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6316         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
6317
6318           /* Register or immediate.  */
6319         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
6320         I0:               po_imm_or_fail (0, 0, FALSE);       break;
6321
6322         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
6323         IF:
6324           if (!is_immediate_prefix (*str))
6325             goto bad_args;
6326           str++;
6327           val = parse_fpa_immediate (&str);
6328           if (val == FAIL)
6329             goto failure;
6330           /* FPA immediates are encoded as registers 8-15.
6331              parse_fpa_immediate has already applied the offset.  */
6332           inst.operands[i].reg = val;
6333           inst.operands[i].isreg = 1;
6334           break;
6335
6336         case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6337         I32z:             po_imm_or_fail (0, 32, FALSE);          break;
6338
6339           /* Two kinds of register.  */
6340         case OP_RIWR_RIWC:
6341           {
6342             struct reg_entry *rege = arm_reg_parse_multi (&str);
6343             if (!rege
6344                 || (rege->type != REG_TYPE_MMXWR
6345                     && rege->type != REG_TYPE_MMXWC
6346                     && rege->type != REG_TYPE_MMXWCG))
6347               {
6348                 inst.error = _("iWMMXt data or control register expected");
6349                 goto failure;
6350               }
6351             inst.operands[i].reg = rege->number;
6352             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6353           }
6354           break;
6355
6356         case OP_RIWC_RIWG:
6357           {
6358             struct reg_entry *rege = arm_reg_parse_multi (&str);
6359             if (!rege
6360                 || (rege->type != REG_TYPE_MMXWC
6361                     && rege->type != REG_TYPE_MMXWCG))
6362               {
6363                 inst.error = _("iWMMXt control register expected");
6364                 goto failure;
6365               }
6366             inst.operands[i].reg = rege->number;
6367             inst.operands[i].isreg = 1;
6368           }
6369           break;
6370
6371           /* Misc */
6372         case OP_CPSF:    val = parse_cps_flags (&str);          break;
6373         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
6374         case OP_oROR:    val = parse_ror (&str);                break;
6375         case OP_PSR:     val = parse_psr (&str);                break;
6376         case OP_COND:    val = parse_cond (&str);               break;
6377         case OP_oBARRIER_I15:
6378           po_barrier_or_imm (str); break;
6379           immediate:
6380           if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
6381             goto failure;
6382           break;
6383
6384         case OP_RVC_PSR:
6385           po_reg_or_goto (REG_TYPE_VFC, try_banked_reg);
6386           inst.operands[i].isvec = 1;  /* Mark VFP control reg as vector.  */
6387           break;
6388           try_banked_reg:
6389           po_reg_or_goto (REG_TYPE_RNB, try_psr);
6390           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
6391             {
6392               inst.error = _("Banked registers are not available with this "
6393                              "architecture.");
6394               goto failure;
6395             }
6396           break;
6397           try_psr:
6398           val = parse_psr (&str);
6399           break;
6400
6401         case OP_APSR_RR:
6402           po_reg_or_goto (REG_TYPE_RN, try_apsr);
6403           break;
6404           try_apsr:
6405           /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6406              instruction).  */
6407           if (strncasecmp (str, "APSR_", 5) == 0)
6408             {
6409               unsigned found = 0;
6410               str += 5;
6411               while (found < 15)
6412                 switch (*str++)
6413                   {
6414                   case 'c': found = (found & 1) ? 16 : found | 1; break;
6415                   case 'n': found = (found & 2) ? 16 : found | 2; break;
6416                   case 'z': found = (found & 4) ? 16 : found | 4; break;
6417                   case 'v': found = (found & 8) ? 16 : found | 8; break;
6418                   default: found = 16;
6419                   }
6420               if (found != 15)
6421                 goto failure;
6422               inst.operands[i].isvec = 1;
6423               /* APSR_nzcv is encoded in instructions as if it were the REG_PC.  */
6424               inst.operands[i].reg = REG_PC;
6425             }
6426           else
6427             goto failure;
6428           break;
6429
6430         case OP_TB:
6431           po_misc_or_fail (parse_tb (&str));
6432           break;
6433
6434           /* Register lists.  */
6435         case OP_REGLST:
6436           val = parse_reg_list (&str);
6437           if (*str == '^')
6438             {
6439               inst.operands[1].writeback = 1;
6440               str++;
6441             }
6442           break;
6443
6444         case OP_VRSLST:
6445           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
6446           break;
6447
6448         case OP_VRDLST:
6449           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
6450           break;
6451
6452         case OP_VRSDLST:
6453           /* Allow Q registers too.  */
6454           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6455                                     REGLIST_NEON_D);
6456           if (val == FAIL)
6457             {
6458               inst.error = NULL;
6459               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6460                                         REGLIST_VFP_S);
6461               inst.operands[i].issingle = 1;
6462             }
6463           break;
6464
6465         case OP_NRDLST:
6466           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6467                                     REGLIST_NEON_D);
6468           break;
6469
6470         case OP_NSTRLST:
6471           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6472                                            &inst.operands[i].vectype);
6473           break;
6474
6475           /* Addressing modes */
6476         case OP_ADDR:
6477           po_misc_or_fail (parse_address (&str, i));
6478           break;
6479
6480         case OP_ADDRGLDR:
6481           po_misc_or_fail_no_backtrack (
6482             parse_address_group_reloc (&str, i, GROUP_LDR));
6483           break;
6484
6485         case OP_ADDRGLDRS:
6486           po_misc_or_fail_no_backtrack (
6487             parse_address_group_reloc (&str, i, GROUP_LDRS));
6488           break;
6489
6490         case OP_ADDRGLDC:
6491           po_misc_or_fail_no_backtrack (
6492             parse_address_group_reloc (&str, i, GROUP_LDC));
6493           break;
6494
6495         case OP_SH:
6496           po_misc_or_fail (parse_shifter_operand (&str, i));
6497           break;
6498
6499         case OP_SHG:
6500           po_misc_or_fail_no_backtrack (
6501             parse_shifter_operand_group_reloc (&str, i));
6502           break;
6503
6504         case OP_oSHll:
6505           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6506           break;
6507
6508         case OP_oSHar:
6509           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6510           break;
6511
6512         case OP_oSHllar:
6513           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6514           break;
6515
6516         default:
6517           as_fatal (_("unhandled operand code %d"), op_parse_code);
6518         }
6519
6520       /* Various value-based sanity checks and shared operations.  We
6521          do not signal immediate failures for the register constraints;
6522          this allows a syntax error to take precedence.  */
6523       switch (op_parse_code)
6524         {
6525         case OP_oRRnpc:
6526         case OP_RRnpc:
6527         case OP_RRnpcb:
6528         case OP_RRw:
6529         case OP_oRRw:
6530         case OP_RRnpc_I0:
6531           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6532             inst.error = BAD_PC;
6533           break;
6534
6535         case OP_oRRnpcsp:
6536         case OP_RRnpcsp:
6537           if (inst.operands[i].isreg)
6538             {
6539               if (inst.operands[i].reg == REG_PC)
6540                 inst.error = BAD_PC;
6541               else if (inst.operands[i].reg == REG_SP)
6542                 inst.error = BAD_SP;
6543             }
6544           break;
6545
6546         case OP_RRnpctw:
6547           if (inst.operands[i].isreg 
6548               && inst.operands[i].reg == REG_PC 
6549               && (inst.operands[i].writeback || thumb))
6550             inst.error = BAD_PC;
6551           break;
6552
6553         case OP_CPSF:
6554         case OP_ENDI:
6555         case OP_oROR:
6556         case OP_PSR:
6557         case OP_RVC_PSR:
6558         case OP_COND:
6559         case OP_oBARRIER_I15:
6560         case OP_REGLST:
6561         case OP_VRSLST:
6562         case OP_VRDLST:
6563         case OP_VRSDLST:
6564         case OP_NRDLST:
6565         case OP_NSTRLST:
6566           if (val == FAIL)
6567             goto failure;
6568           inst.operands[i].imm = val;
6569           break;
6570
6571         default:
6572           break;
6573         }
6574
6575       /* If we get here, this operand was successfully parsed.  */
6576       inst.operands[i].present = 1;
6577       continue;
6578
6579     bad_args:
6580       inst.error = BAD_ARGS;
6581
6582     failure:
6583       if (!backtrack_pos)
6584         {
6585           /* The parse routine should already have set inst.error, but set a
6586              default here just in case.  */
6587           if (!inst.error)
6588             inst.error = _("syntax error");
6589           return FAIL;
6590         }
6591
6592       /* Do not backtrack over a trailing optional argument that
6593          absorbed some text.  We will only fail again, with the
6594          'garbage following instruction' error message, which is
6595          probably less helpful than the current one.  */
6596       if (backtrack_index == i && backtrack_pos != str
6597           && upat[i+1] == OP_stop)
6598         {
6599           if (!inst.error)
6600             inst.error = _("syntax error");
6601           return FAIL;
6602         }
6603
6604       /* Try again, skipping the optional argument at backtrack_pos.  */
6605       str = backtrack_pos;
6606       inst.error = backtrack_error;
6607       inst.operands[backtrack_index].present = 0;
6608       i = backtrack_index;
6609       backtrack_pos = 0;
6610     }
6611
6612   /* Check that we have parsed all the arguments.  */
6613   if (*str != '\0' && !inst.error)
6614     inst.error = _("garbage following instruction");
6615
6616   return inst.error ? FAIL : SUCCESS;
6617 }
6618
6619 #undef po_char_or_fail
6620 #undef po_reg_or_fail
6621 #undef po_reg_or_goto
6622 #undef po_imm_or_fail
6623 #undef po_scalar_or_fail
6624 #undef po_barrier_or_imm
6625
6626 /* Shorthand macro for instruction encoding functions issuing errors.  */
6627 #define constraint(expr, err)                   \
6628   do                                            \
6629     {                                           \
6630       if (expr)                                 \
6631         {                                       \
6632           inst.error = err;                     \
6633           return;                               \
6634         }                                       \
6635     }                                           \
6636   while (0)
6637
6638 /* Reject "bad registers" for Thumb-2 instructions.  Many Thumb-2
6639    instructions are unpredictable if these registers are used.  This
6640    is the BadReg predicate in ARM's Thumb-2 documentation.  */
6641 #define reject_bad_reg(reg)                             \
6642   do                                                    \
6643    if (reg == REG_SP || reg == REG_PC)                  \
6644      {                                                  \
6645        inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC;  \
6646        return;                                          \
6647      }                                                  \
6648   while (0)
6649
6650 /* If REG is R13 (the stack pointer), warn that its use is
6651    deprecated.  */
6652 #define warn_deprecated_sp(reg)                 \
6653   do                                            \
6654     if (warn_on_deprecated && reg == REG_SP)    \
6655        as_warn (_("use of r13 is deprecated")); \
6656   while (0)
6657
6658 /* Functions for operand encoding.  ARM, then Thumb.  */
6659
6660 #define rotate_left(v, n) (v << n | v >> (32 - n))
6661
6662 /* If VAL can be encoded in the immediate field of an ARM instruction,
6663    return the encoded form.  Otherwise, return FAIL.  */
6664
6665 static unsigned int
6666 encode_arm_immediate (unsigned int val)
6667 {
6668   unsigned int a, i;
6669
6670   for (i = 0; i < 32; i += 2)
6671     if ((a = rotate_left (val, i)) <= 0xff)
6672       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
6673
6674   return FAIL;
6675 }
6676
6677 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6678    return the encoded form.  Otherwise, return FAIL.  */
6679 static unsigned int
6680 encode_thumb32_immediate (unsigned int val)
6681 {
6682   unsigned int a, i;
6683
6684   if (val <= 0xff)
6685     return val;
6686
6687   for (i = 1; i <= 24; i++)
6688     {
6689       a = val >> i;
6690       if ((val & ~(0xff << i)) == 0)
6691         return ((val >> i) & 0x7f) | ((32 - i) << 7);
6692     }
6693
6694   a = val & 0xff;
6695   if (val == ((a << 16) | a))
6696     return 0x100 | a;
6697   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6698     return 0x300 | a;
6699
6700   a = val & 0xff00;
6701   if (val == ((a << 16) | a))
6702     return 0x200 | (a >> 8);
6703
6704   return FAIL;
6705 }
6706 /* Encode a VFP SP or DP register number into inst.instruction.  */
6707
6708 static void
6709 encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6710 {
6711   if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6712       && reg > 15)
6713     {
6714       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
6715         {
6716           if (thumb_mode)
6717             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
6718                                     fpu_vfp_ext_d32);
6719           else
6720             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
6721                                     fpu_vfp_ext_d32);
6722         }
6723       else
6724         {
6725           first_error (_("D register out of range for selected VFP version"));
6726           return;
6727         }
6728     }
6729
6730   switch (pos)
6731     {
6732     case VFP_REG_Sd:
6733       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
6734       break;
6735
6736     case VFP_REG_Sn:
6737       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
6738       break;
6739
6740     case VFP_REG_Sm:
6741       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
6742       break;
6743
6744     case VFP_REG_Dd:
6745       inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
6746       break;
6747
6748     case VFP_REG_Dn:
6749       inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
6750       break;
6751
6752     case VFP_REG_Dm:
6753       inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
6754       break;
6755
6756     default:
6757       abort ();
6758     }
6759 }
6760
6761 /* Encode a <shift> in an ARM-format instruction.  The immediate,
6762    if any, is handled by md_apply_fix.   */
6763 static void
6764 encode_arm_shift (int i)
6765 {
6766   if (inst.operands[i].shift_kind == SHIFT_RRX)
6767     inst.instruction |= SHIFT_ROR << 5;
6768   else
6769     {
6770       inst.instruction |= inst.operands[i].shift_kind << 5;
6771       if (inst.operands[i].immisreg)
6772         {
6773           inst.instruction |= SHIFT_BY_REG;
6774           inst.instruction |= inst.operands[i].imm << 8;
6775         }
6776       else
6777         inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
6778     }
6779 }
6780
6781 static void
6782 encode_arm_shifter_operand (int i)
6783 {
6784   if (inst.operands[i].isreg)
6785     {
6786       inst.instruction |= inst.operands[i].reg;
6787       encode_arm_shift (i);
6788     }
6789   else
6790     inst.instruction |= INST_IMMEDIATE;
6791 }
6792
6793 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
6794 static void
6795 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
6796 {
6797   gas_assert (inst.operands[i].isreg);
6798   inst.instruction |= inst.operands[i].reg << 16;
6799
6800   if (inst.operands[i].preind)
6801     {
6802       if (is_t)
6803         {
6804           inst.error = _("instruction does not accept preindexed addressing");
6805           return;
6806         }
6807       inst.instruction |= PRE_INDEX;
6808       if (inst.operands[i].writeback)
6809         inst.instruction |= WRITE_BACK;
6810
6811     }
6812   else if (inst.operands[i].postind)
6813     {
6814       gas_assert (inst.operands[i].writeback);
6815       if (is_t)
6816         inst.instruction |= WRITE_BACK;
6817     }
6818   else /* unindexed - only for coprocessor */
6819     {
6820       inst.error = _("instruction does not accept unindexed addressing");
6821       return;
6822     }
6823
6824   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
6825       && (((inst.instruction & 0x000f0000) >> 16)
6826           == ((inst.instruction & 0x0000f000) >> 12)))
6827     as_warn ((inst.instruction & LOAD_BIT)
6828              ? _("destination register same as write-back base")
6829              : _("source register same as write-back base"));
6830 }
6831
6832 /* inst.operands[i] was set up by parse_address.  Encode it into an
6833    ARM-format mode 2 load or store instruction.  If is_t is true,
6834    reject forms that cannot be used with a T instruction (i.e. not
6835    post-indexed).  */
6836 static void
6837 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
6838 {
6839   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
6840
6841   encode_arm_addr_mode_common (i, is_t);
6842
6843   if (inst.operands[i].immisreg)
6844     {
6845       constraint ((inst.operands[i].imm == REG_PC
6846                    || (is_pc && inst.operands[i].writeback)),
6847                   BAD_PC_ADDRESSING);
6848       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
6849       inst.instruction |= inst.operands[i].imm;
6850       if (!inst.operands[i].negative)
6851         inst.instruction |= INDEX_UP;
6852       if (inst.operands[i].shifted)
6853         {
6854           if (inst.operands[i].shift_kind == SHIFT_RRX)
6855             inst.instruction |= SHIFT_ROR << 5;
6856           else
6857             {
6858               inst.instruction |= inst.operands[i].shift_kind << 5;
6859               inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
6860             }
6861         }
6862     }
6863   else /* immediate offset in inst.reloc */
6864     {
6865       if (is_pc && !inst.reloc.pc_rel)
6866         {
6867           const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
6868
6869           /* If is_t is TRUE, it's called from do_ldstt.  ldrt/strt
6870              cannot use PC in addressing.
6871              PC cannot be used in writeback addressing, either.  */
6872           constraint ((is_t || inst.operands[i].writeback),
6873                       BAD_PC_ADDRESSING);
6874
6875           /* Use of PC in str is deprecated for ARMv7.  */
6876           if (warn_on_deprecated
6877               && !is_load
6878               && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
6879             as_warn (_("use of PC in this instruction is deprecated"));
6880         }
6881
6882       if (inst.reloc.type == BFD_RELOC_UNUSED)
6883         inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
6884     }
6885 }
6886
6887 /* inst.operands[i] was set up by parse_address.  Encode it into an
6888    ARM-format mode 3 load or store instruction.  Reject forms that
6889    cannot be used with such instructions.  If is_t is true, reject
6890    forms that cannot be used with a T instruction (i.e. not
6891    post-indexed).  */
6892 static void
6893 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
6894 {
6895   if (inst.operands[i].immisreg && inst.operands[i].shifted)
6896     {
6897       inst.error = _("instruction does not accept scaled register index");
6898       return;
6899     }
6900
6901   encode_arm_addr_mode_common (i, is_t);
6902
6903   if (inst.operands[i].immisreg)
6904     {
6905       constraint ((inst.operands[i].imm == REG_PC
6906                    || inst.operands[i].reg == REG_PC),
6907                   BAD_PC_ADDRESSING);
6908       inst.instruction |= inst.operands[i].imm;
6909       if (!inst.operands[i].negative)
6910         inst.instruction |= INDEX_UP;
6911     }
6912   else /* immediate offset in inst.reloc */
6913     {
6914       constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
6915                    && inst.operands[i].writeback),
6916                   BAD_PC_WRITEBACK);
6917       inst.instruction |= HWOFFSET_IMM;
6918       if (inst.reloc.type == BFD_RELOC_UNUSED)
6919         inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
6920     }
6921 }
6922
6923 /* inst.operands[i] was set up by parse_address.  Encode it into an
6924    ARM-format instruction.  Reject all forms which cannot be encoded
6925    into a coprocessor load/store instruction.  If wb_ok is false,
6926    reject use of writeback; if unind_ok is false, reject use of
6927    unindexed addressing.  If reloc_override is not 0, use it instead
6928    of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
6929    (in which case it is preserved).  */
6930
6931 static int
6932 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
6933 {
6934   inst.instruction |= inst.operands[i].reg << 16;
6935
6936   gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
6937
6938   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
6939     {
6940       gas_assert (!inst.operands[i].writeback);
6941       if (!unind_ok)
6942         {
6943           inst.error = _("instruction does not support unindexed addressing");
6944           return FAIL;
6945         }
6946       inst.instruction |= inst.operands[i].imm;
6947       inst.instruction |= INDEX_UP;
6948       return SUCCESS;
6949     }
6950
6951   if (inst.operands[i].preind)
6952     inst.instruction |= PRE_INDEX;
6953
6954   if (inst.operands[i].writeback)
6955     {
6956       if (inst.operands[i].reg == REG_PC)
6957         {
6958           inst.error = _("pc may not be used with write-back");
6959           return FAIL;
6960         }
6961       if (!wb_ok)
6962         {
6963           inst.error = _("instruction does not support writeback");
6964           return FAIL;
6965         }
6966       inst.instruction |= WRITE_BACK;
6967     }
6968
6969   if (reloc_override)
6970     inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
6971   else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
6972             || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
6973            && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
6974     {
6975       if (thumb_mode)
6976         inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
6977       else
6978         inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
6979     }
6980
6981   return SUCCESS;
6982 }
6983
6984 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
6985    Determine whether it can be performed with a move instruction; if
6986    it can, convert inst.instruction to that move instruction and
6987    return TRUE; if it can't, convert inst.instruction to a literal-pool
6988    load and return FALSE.  If this is not a valid thing to do in the
6989    current context, set inst.error and return TRUE.
6990
6991    inst.operands[i] describes the destination register.  */
6992
6993 static bfd_boolean
6994 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
6995 {
6996   unsigned long tbit;
6997
6998   if (thumb_p)
6999     tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7000   else
7001     tbit = LOAD_BIT;
7002
7003   if ((inst.instruction & tbit) == 0)
7004     {
7005       inst.error = _("invalid pseudo operation");
7006       return TRUE;
7007     }
7008   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
7009     {
7010       inst.error = _("constant expression expected");
7011       return TRUE;
7012     }
7013   if (inst.reloc.exp.X_op == O_constant)
7014     {
7015       if (thumb_p)
7016         {
7017           if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
7018             {
7019               /* This can be done with a mov(1) instruction.  */
7020               inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
7021               inst.instruction |= inst.reloc.exp.X_add_number;
7022               return TRUE;
7023             }
7024         }
7025       else
7026         {
7027           int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
7028           if (value != FAIL)
7029             {
7030               /* This can be done with a mov instruction.  */
7031               inst.instruction &= LITERAL_MASK;
7032               inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
7033               inst.instruction |= value & 0xfff;
7034               return TRUE;
7035             }
7036
7037           value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
7038           if (value != FAIL)
7039             {
7040               /* This can be done with a mvn instruction.  */
7041               inst.instruction &= LITERAL_MASK;
7042               inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
7043               inst.instruction |= value & 0xfff;
7044               return TRUE;
7045             }
7046         }
7047     }
7048
7049   if (add_to_lit_pool () == FAIL)
7050     {
7051       inst.error = _("literal pool insertion failed");
7052       return TRUE;
7053     }
7054   inst.operands[1].reg = REG_PC;
7055   inst.operands[1].isreg = 1;
7056   inst.operands[1].preind = 1;
7057   inst.reloc.pc_rel = 1;
7058   inst.reloc.type = (thumb_p
7059                      ? BFD_RELOC_ARM_THUMB_OFFSET
7060                      : (mode_3
7061                         ? BFD_RELOC_ARM_HWLITERAL
7062                         : BFD_RELOC_ARM_LITERAL));
7063   return FALSE;
7064 }
7065
7066 /* Functions for instruction encoding, sorted by sub-architecture.
7067    First some generics; their names are taken from the conventional
7068    bit positions for register arguments in ARM format instructions.  */
7069
7070 static void
7071 do_noargs (void)
7072 {
7073 }
7074
7075 static void
7076 do_rd (void)
7077 {
7078   inst.instruction |= inst.operands[0].reg << 12;
7079 }
7080
7081 static void
7082 do_rd_rm (void)
7083 {
7084   inst.instruction |= inst.operands[0].reg << 12;
7085   inst.instruction |= inst.operands[1].reg;
7086 }
7087
7088 static void
7089 do_rd_rn (void)
7090 {
7091   inst.instruction |= inst.operands[0].reg << 12;
7092   inst.instruction |= inst.operands[1].reg << 16;
7093 }
7094
7095 static void
7096 do_rn_rd (void)
7097 {
7098   inst.instruction |= inst.operands[0].reg << 16;
7099   inst.instruction |= inst.operands[1].reg << 12;
7100 }
7101
7102 static void
7103 do_rd_rm_rn (void)
7104 {
7105   unsigned Rn = inst.operands[2].reg;
7106   /* Enforce restrictions on SWP instruction.  */
7107   if ((inst.instruction & 0x0fbfffff) == 0x01000090)
7108     {
7109       constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
7110                   _("Rn must not overlap other operands"));
7111
7112       /* SWP{b} is deprecated for ARMv6* and ARMv7.  */
7113       if (warn_on_deprecated
7114           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
7115         as_warn (_("swp{b} use is deprecated for this architecture"));
7116
7117     }
7118   inst.instruction |= inst.operands[0].reg << 12;
7119   inst.instruction |= inst.operands[1].reg;
7120   inst.instruction |= Rn << 16;
7121 }
7122
7123 static void
7124 do_rd_rn_rm (void)
7125 {
7126   inst.instruction |= inst.operands[0].reg << 12;
7127   inst.instruction |= inst.operands[1].reg << 16;
7128   inst.instruction |= inst.operands[2].reg;
7129 }
7130
7131 static void
7132 do_rm_rd_rn (void)
7133 {
7134   constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7135   constraint (((inst.reloc.exp.X_op != O_constant
7136                 && inst.reloc.exp.X_op != O_illegal)
7137                || inst.reloc.exp.X_add_number != 0),
7138               BAD_ADDR_MODE);
7139   inst.instruction |= inst.operands[0].reg;
7140   inst.instruction |= inst.operands[1].reg << 12;
7141   inst.instruction |= inst.operands[2].reg << 16;
7142 }
7143
7144 static void
7145 do_imm0 (void)
7146 {
7147   inst.instruction |= inst.operands[0].imm;
7148 }
7149
7150 static void
7151 do_rd_cpaddr (void)
7152 {
7153   inst.instruction |= inst.operands[0].reg << 12;
7154   encode_arm_cp_address (1, TRUE, TRUE, 0);
7155 }
7156
7157 /* ARM instructions, in alphabetical order by function name (except
7158    that wrapper functions appear immediately after the function they
7159    wrap).  */
7160
7161 /* This is a pseudo-op of the form "adr rd, label" to be converted
7162    into a relative address of the form "add rd, pc, #label-.-8".  */
7163
7164 static void
7165 do_adr (void)
7166 {
7167   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7168
7169   /* Frag hacking will turn this into a sub instruction if the offset turns
7170      out to be negative.  */
7171   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7172   inst.reloc.pc_rel = 1;
7173   inst.reloc.exp.X_add_number -= 8;
7174 }
7175
7176 /* This is a pseudo-op of the form "adrl rd, label" to be converted
7177    into a relative address of the form:
7178    add rd, pc, #low(label-.-8)"
7179    add rd, rd, #high(label-.-8)"  */
7180
7181 static void
7182 do_adrl (void)
7183 {
7184   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7185
7186   /* Frag hacking will turn this into a sub instruction if the offset turns
7187      out to be negative.  */
7188   inst.reloc.type              = BFD_RELOC_ARM_ADRL_IMMEDIATE;
7189   inst.reloc.pc_rel            = 1;
7190   inst.size                    = INSN_SIZE * 2;
7191   inst.reloc.exp.X_add_number -= 8;
7192 }
7193
7194 static void
7195 do_arit (void)
7196 {
7197   if (!inst.operands[1].present)
7198     inst.operands[1].reg = inst.operands[0].reg;
7199   inst.instruction |= inst.operands[0].reg << 12;
7200   inst.instruction |= inst.operands[1].reg << 16;
7201   encode_arm_shifter_operand (2);
7202 }
7203
7204 static void
7205 do_barrier (void)
7206 {
7207   if (inst.operands[0].present)
7208     {
7209       constraint ((inst.instruction & 0xf0) != 0x40
7210                   && inst.operands[0].imm > 0xf
7211                   && inst.operands[0].imm < 0x0,
7212                   _("bad barrier type"));
7213       inst.instruction |= inst.operands[0].imm;
7214     }
7215   else
7216     inst.instruction |= 0xf;
7217 }
7218
7219 static void
7220 do_bfc (void)
7221 {
7222   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7223   constraint (msb > 32, _("bit-field extends past end of register"));
7224   /* The instruction encoding stores the LSB and MSB,
7225      not the LSB and width.  */
7226   inst.instruction |= inst.operands[0].reg << 12;
7227   inst.instruction |= inst.operands[1].imm << 7;
7228   inst.instruction |= (msb - 1) << 16;
7229 }
7230
7231 static void
7232 do_bfi (void)
7233 {
7234   unsigned int msb;
7235
7236   /* #0 in second position is alternative syntax for bfc, which is
7237      the same instruction but with REG_PC in the Rm field.  */
7238   if (!inst.operands[1].isreg)
7239     inst.operands[1].reg = REG_PC;
7240
7241   msb = inst.operands[2].imm + inst.operands[3].imm;
7242   constraint (msb > 32, _("bit-field extends past end of register"));
7243   /* The instruction encoding stores the LSB and MSB,
7244      not the LSB and width.  */
7245   inst.instruction |= inst.operands[0].reg << 12;
7246   inst.instruction |= inst.operands[1].reg;
7247   inst.instruction |= inst.operands[2].imm << 7;
7248   inst.instruction |= (msb - 1) << 16;
7249 }
7250
7251 static void
7252 do_bfx (void)
7253 {
7254   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7255               _("bit-field extends past end of register"));
7256   inst.instruction |= inst.operands[0].reg << 12;
7257   inst.instruction |= inst.operands[1].reg;
7258   inst.instruction |= inst.operands[2].imm << 7;
7259   inst.instruction |= (inst.operands[3].imm - 1) << 16;
7260 }
7261
7262 /* ARM V5 breakpoint instruction (argument parse)
7263      BKPT <16 bit unsigned immediate>
7264      Instruction is not conditional.
7265         The bit pattern given in insns[] has the COND_ALWAYS condition,
7266         and it is an error if the caller tried to override that.  */
7267
7268 static void
7269 do_bkpt (void)
7270 {
7271   /* Top 12 of 16 bits to bits 19:8.  */
7272   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
7273
7274   /* Bottom 4 of 16 bits to bits 3:0.  */
7275   inst.instruction |= inst.operands[0].imm & 0xf;
7276 }
7277
7278 static void
7279 encode_branch (int default_reloc)
7280 {
7281   if (inst.operands[0].hasreloc)
7282     {
7283       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32,
7284                   _("the only suffix valid here is '(plt)'"));
7285       inst.reloc.type  = BFD_RELOC_ARM_PLT32;
7286     }
7287   else
7288     inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
7289   inst.reloc.pc_rel = 1;
7290 }
7291
7292 static void
7293 do_branch (void)
7294 {
7295 #ifdef OBJ_ELF
7296   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7297     encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7298   else
7299 #endif
7300     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7301 }
7302
7303 static void
7304 do_bl (void)
7305 {
7306 #ifdef OBJ_ELF
7307   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7308     {
7309       if (inst.cond == COND_ALWAYS)
7310         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7311       else
7312         encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7313     }
7314   else
7315 #endif
7316     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7317 }
7318
7319 /* ARM V5 branch-link-exchange instruction (argument parse)
7320      BLX <target_addr>          ie BLX(1)
7321      BLX{<condition>} <Rm>      ie BLX(2)
7322    Unfortunately, there are two different opcodes for this mnemonic.
7323    So, the insns[].value is not used, and the code here zaps values
7324         into inst.instruction.
7325    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
7326
7327 static void
7328 do_blx (void)
7329 {
7330   if (inst.operands[0].isreg)
7331     {
7332       /* Arg is a register; the opcode provided by insns[] is correct.
7333          It is not illegal to do "blx pc", just useless.  */
7334       if (inst.operands[0].reg == REG_PC)
7335         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
7336
7337       inst.instruction |= inst.operands[0].reg;
7338     }
7339   else
7340     {
7341       /* Arg is an address; this instruction cannot be executed
7342          conditionally, and the opcode must be adjusted.
7343          We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7344          where we generate out a BFD_RELOC_ARM_PCREL_CALL instead.  */
7345       constraint (inst.cond != COND_ALWAYS, BAD_COND);
7346       inst.instruction = 0xfa000000;
7347       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
7348     }
7349 }
7350
7351 static void
7352 do_bx (void)
7353 {
7354   bfd_boolean want_reloc;
7355
7356   if (inst.operands[0].reg == REG_PC)
7357     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
7358
7359   inst.instruction |= inst.operands[0].reg;
7360   /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7361      it is for ARMv4t or earlier.  */
7362   want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7363   if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7364       want_reloc = TRUE;
7365
7366 #ifdef OBJ_ELF
7367   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
7368 #endif
7369     want_reloc = FALSE;
7370
7371   if (want_reloc)
7372     inst.reloc.type = BFD_RELOC_ARM_V4BX;
7373 }
7374
7375
7376 /* ARM v5TEJ.  Jump to Jazelle code.  */
7377
7378 static void
7379 do_bxj (void)
7380 {
7381   if (inst.operands[0].reg == REG_PC)
7382     as_tsktsk (_("use of r15 in bxj is not really useful"));
7383
7384   inst.instruction |= inst.operands[0].reg;
7385 }
7386
7387 /* Co-processor data operation:
7388       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7389       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
7390 static void
7391 do_cdp (void)
7392 {
7393   inst.instruction |= inst.operands[0].reg << 8;
7394   inst.instruction |= inst.operands[1].imm << 20;
7395   inst.instruction |= inst.operands[2].reg << 12;
7396   inst.instruction |= inst.operands[3].reg << 16;
7397   inst.instruction |= inst.operands[4].reg;
7398   inst.instruction |= inst.operands[5].imm << 5;
7399 }
7400
7401 static void
7402 do_cmp (void)
7403 {
7404   inst.instruction |= inst.operands[0].reg << 16;
7405   encode_arm_shifter_operand (1);
7406 }
7407
7408 /* Transfer between coprocessor and ARM registers.
7409    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7410    MRC2
7411    MCR{cond}
7412    MCR2
7413
7414    No special properties.  */
7415
7416 static void
7417 do_co_reg (void)
7418 {
7419   unsigned Rd;
7420
7421   Rd = inst.operands[2].reg;
7422   if (thumb_mode)
7423     {
7424       if (inst.instruction == 0xee000010
7425           || inst.instruction == 0xfe000010)
7426         /* MCR, MCR2  */
7427         reject_bad_reg (Rd);
7428       else
7429         /* MRC, MRC2  */
7430         constraint (Rd == REG_SP, BAD_SP);
7431     }
7432   else
7433     {
7434       /* MCR */
7435       if (inst.instruction == 0xe000010)
7436         constraint (Rd == REG_PC, BAD_PC);
7437     }
7438
7439
7440   inst.instruction |= inst.operands[0].reg << 8;
7441   inst.instruction |= inst.operands[1].imm << 21;
7442   inst.instruction |= Rd << 12;
7443   inst.instruction |= inst.operands[3].reg << 16;
7444   inst.instruction |= inst.operands[4].reg;
7445   inst.instruction |= inst.operands[5].imm << 5;
7446 }
7447
7448 /* Transfer between coprocessor register and pair of ARM registers.
7449    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7450    MCRR2
7451    MRRC{cond}
7452    MRRC2
7453
7454    Two XScale instructions are special cases of these:
7455
7456      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
7457      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
7458
7459    Result unpredictable if Rd or Rn is R15.  */
7460
7461 static void
7462 do_co_reg2c (void)
7463 {
7464   unsigned Rd, Rn;
7465
7466   Rd = inst.operands[2].reg;
7467   Rn = inst.operands[3].reg;
7468
7469   if (thumb_mode)
7470     {
7471       reject_bad_reg (Rd);
7472       reject_bad_reg (Rn);
7473     }
7474   else
7475     {
7476       constraint (Rd == REG_PC, BAD_PC);
7477       constraint (Rn == REG_PC, BAD_PC);
7478     }
7479
7480   inst.instruction |= inst.operands[0].reg << 8;
7481   inst.instruction |= inst.operands[1].imm << 4;
7482   inst.instruction |= Rd << 12;
7483   inst.instruction |= Rn << 16;
7484   inst.instruction |= inst.operands[4].reg;
7485 }
7486
7487 static void
7488 do_cpsi (void)
7489 {
7490   inst.instruction |= inst.operands[0].imm << 6;
7491   if (inst.operands[1].present)
7492     {
7493       inst.instruction |= CPSI_MMOD;
7494       inst.instruction |= inst.operands[1].imm;
7495     }
7496 }
7497
7498 static void
7499 do_dbg (void)
7500 {
7501   inst.instruction |= inst.operands[0].imm;
7502 }
7503
7504 static void
7505 do_div (void)
7506 {
7507   unsigned Rd, Rn, Rm;
7508
7509   Rd = inst.operands[0].reg;
7510   Rn = (inst.operands[1].present
7511         ? inst.operands[1].reg : Rd);
7512   Rm = inst.operands[2].reg;
7513
7514   constraint ((Rd == REG_PC), BAD_PC);
7515   constraint ((Rn == REG_PC), BAD_PC);
7516   constraint ((Rm == REG_PC), BAD_PC);
7517
7518   inst.instruction |= Rd << 16;
7519   inst.instruction |= Rn << 0;
7520   inst.instruction |= Rm << 8;
7521 }
7522
7523 static void
7524 do_it (void)
7525 {
7526   /* There is no IT instruction in ARM mode.  We
7527      process it to do the validation as if in
7528      thumb mode, just in case the code gets
7529      assembled for thumb using the unified syntax.  */
7530
7531   inst.size = 0;
7532   if (unified_syntax)
7533     {
7534       set_it_insn_type (IT_INSN);
7535       now_it.mask = (inst.instruction & 0xf) | 0x10;
7536       now_it.cc = inst.operands[0].imm;
7537     }
7538 }
7539
7540 static void
7541 do_ldmstm (void)
7542 {
7543   int base_reg = inst.operands[0].reg;
7544   int range = inst.operands[1].imm;
7545
7546   inst.instruction |= base_reg << 16;
7547   inst.instruction |= range;
7548
7549   if (inst.operands[1].writeback)
7550     inst.instruction |= LDM_TYPE_2_OR_3;
7551
7552   if (inst.operands[0].writeback)
7553     {
7554       inst.instruction |= WRITE_BACK;
7555       /* Check for unpredictable uses of writeback.  */
7556       if (inst.instruction & LOAD_BIT)
7557         {
7558           /* Not allowed in LDM type 2.  */
7559           if ((inst.instruction & LDM_TYPE_2_OR_3)
7560               && ((range & (1 << REG_PC)) == 0))
7561             as_warn (_("writeback of base register is UNPREDICTABLE"));
7562           /* Only allowed if base reg not in list for other types.  */
7563           else if (range & (1 << base_reg))
7564             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
7565         }
7566       else /* STM.  */
7567         {
7568           /* Not allowed for type 2.  */
7569           if (inst.instruction & LDM_TYPE_2_OR_3)
7570             as_warn (_("writeback of base register is UNPREDICTABLE"));
7571           /* Only allowed if base reg not in list, or first in list.  */
7572           else if ((range & (1 << base_reg))
7573                    && (range & ((1 << base_reg) - 1)))
7574             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
7575         }
7576     }
7577 }
7578
7579 /* ARMv5TE load-consecutive (argument parse)
7580    Mode is like LDRH.
7581
7582      LDRccD R, mode
7583      STRccD R, mode.  */
7584
7585 static void
7586 do_ldrd (void)
7587 {
7588   constraint (inst.operands[0].reg % 2 != 0,
7589               _("first destination register must be even"));
7590   constraint (inst.operands[1].present
7591               && inst.operands[1].reg != inst.operands[0].reg + 1,
7592               _("can only load two consecutive registers"));
7593   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7594   constraint (!inst.operands[2].isreg, _("'[' expected"));
7595
7596   if (!inst.operands[1].present)
7597     inst.operands[1].reg = inst.operands[0].reg + 1;
7598
7599   if (inst.instruction & LOAD_BIT)
7600     {
7601       /* encode_arm_addr_mode_3 will diagnose overlap between the base
7602          register and the first register written; we have to diagnose
7603          overlap between the base and the second register written here.  */
7604
7605       if (inst.operands[2].reg == inst.operands[1].reg
7606           && (inst.operands[2].writeback || inst.operands[2].postind))
7607         as_warn (_("base register written back, and overlaps "
7608                    "second destination register"));
7609
7610       /* For an index-register load, the index register must not overlap the
7611          destination (even if not write-back).  */
7612       else if (inst.operands[2].immisreg
7613                && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
7614                    || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
7615         as_warn (_("index register overlaps destination register"));
7616     }
7617
7618   inst.instruction |= inst.operands[0].reg << 12;
7619   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
7620 }
7621
7622 static void
7623 do_ldrex (void)
7624 {
7625   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
7626               || inst.operands[1].postind || inst.operands[1].writeback
7627               || inst.operands[1].immisreg || inst.operands[1].shifted
7628               || inst.operands[1].negative
7629               /* This can arise if the programmer has written
7630                    strex rN, rM, foo
7631                  or if they have mistakenly used a register name as the last
7632                  operand,  eg:
7633                    strex rN, rM, rX
7634                  It is very difficult to distinguish between these two cases
7635                  because "rX" might actually be a label. ie the register
7636                  name has been occluded by a symbol of the same name. So we
7637                  just generate a general 'bad addressing mode' type error
7638                  message and leave it up to the programmer to discover the
7639                  true cause and fix their mistake.  */
7640               || (inst.operands[1].reg == REG_PC),
7641               BAD_ADDR_MODE);
7642
7643   constraint (inst.reloc.exp.X_op != O_constant
7644               || inst.reloc.exp.X_add_number != 0,
7645               _("offset must be zero in ARM encoding"));
7646
7647   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
7648
7649   inst.instruction |= inst.operands[0].reg << 12;
7650   inst.instruction |= inst.operands[1].reg << 16;
7651   inst.reloc.type = BFD_RELOC_UNUSED;
7652 }
7653
7654 static void
7655 do_ldrexd (void)
7656 {
7657   constraint (inst.operands[0].reg % 2 != 0,
7658               _("even register required"));
7659   constraint (inst.operands[1].present
7660               && inst.operands[1].reg != inst.operands[0].reg + 1,
7661               _("can only load two consecutive registers"));
7662   /* If op 1 were present and equal to PC, this function wouldn't
7663      have been called in the first place.  */
7664   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7665
7666   inst.instruction |= inst.operands[0].reg << 12;
7667   inst.instruction |= inst.operands[2].reg << 16;
7668 }
7669
7670 static void
7671 do_ldst (void)
7672 {
7673   inst.instruction |= inst.operands[0].reg << 12;
7674   if (!inst.operands[1].isreg)
7675     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
7676       return;
7677   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
7678 }
7679
7680 static void
7681 do_ldstt (void)
7682 {
7683   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
7684      reject [Rn,...].  */
7685   if (inst.operands[1].preind)
7686     {
7687       constraint (inst.reloc.exp.X_op != O_constant
7688                   || inst.reloc.exp.X_add_number != 0,
7689                   _("this instruction requires a post-indexed address"));
7690
7691       inst.operands[1].preind = 0;
7692       inst.operands[1].postind = 1;
7693       inst.operands[1].writeback = 1;
7694     }
7695   inst.instruction |= inst.operands[0].reg << 12;
7696   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
7697 }
7698
7699 /* Halfword and signed-byte load/store operations.  */
7700
7701 static void
7702 do_ldstv4 (void)
7703 {
7704   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
7705   inst.instruction |= inst.operands[0].reg << 12;
7706   if (!inst.operands[1].isreg)
7707     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
7708       return;
7709   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
7710 }
7711
7712 static void
7713 do_ldsttv4 (void)
7714 {
7715   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
7716      reject [Rn,...].  */
7717   if (inst.operands[1].preind)
7718     {
7719       constraint (inst.reloc.exp.X_op != O_constant
7720                   || inst.reloc.exp.X_add_number != 0,
7721                   _("this instruction requires a post-indexed address"));
7722
7723       inst.operands[1].preind = 0;
7724       inst.operands[1].postind = 1;
7725       inst.operands[1].writeback = 1;
7726     }
7727   inst.instruction |= inst.operands[0].reg << 12;
7728   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
7729 }
7730
7731 /* Co-processor register load/store.
7732    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
7733 static void
7734 do_lstc (void)
7735 {
7736   inst.instruction |= inst.operands[0].reg << 8;
7737   inst.instruction |= inst.operands[1].reg << 12;
7738   encode_arm_cp_address (2, TRUE, TRUE, 0);
7739 }
7740
7741 static void
7742 do_mlas (void)
7743 {
7744   /* This restriction does not apply to mls (nor to mla in v6 or later).  */
7745   if (inst.operands[0].reg == inst.operands[1].reg
7746       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
7747       && !(inst.instruction & 0x00400000))
7748     as_tsktsk (_("Rd and Rm should be different in mla"));
7749
7750   inst.instruction |= inst.operands[0].reg << 16;
7751   inst.instruction |= inst.operands[1].reg;
7752   inst.instruction |= inst.operands[2].reg << 8;
7753   inst.instruction |= inst.operands[3].reg << 12;
7754 }
7755
7756 static void
7757 do_mov (void)
7758 {
7759   inst.instruction |= inst.operands[0].reg << 12;
7760   encode_arm_shifter_operand (1);
7761 }
7762
7763 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
7764 static void
7765 do_mov16 (void)
7766 {
7767   bfd_vma imm;
7768   bfd_boolean top;
7769
7770   top = (inst.instruction & 0x00400000) != 0;
7771   constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
7772               _(":lower16: not allowed this instruction"));
7773   constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
7774               _(":upper16: not allowed instruction"));
7775   inst.instruction |= inst.operands[0].reg << 12;
7776   if (inst.reloc.type == BFD_RELOC_UNUSED)
7777     {
7778       imm = inst.reloc.exp.X_add_number;
7779       /* The value is in two pieces: 0:11, 16:19.  */
7780       inst.instruction |= (imm & 0x00000fff);
7781       inst.instruction |= (imm & 0x0000f000) << 4;
7782     }
7783 }
7784
7785 static void do_vfp_nsyn_opcode (const char *);
7786
7787 static int
7788 do_vfp_nsyn_mrs (void)
7789 {
7790   if (inst.operands[0].isvec)
7791     {
7792       if (inst.operands[1].reg != 1)
7793         first_error (_("operand 1 must be FPSCR"));
7794       memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
7795       memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
7796       do_vfp_nsyn_opcode ("fmstat");
7797     }
7798   else if (inst.operands[1].isvec)
7799     do_vfp_nsyn_opcode ("fmrx");
7800   else
7801     return FAIL;
7802
7803   return SUCCESS;
7804 }
7805
7806 static int
7807 do_vfp_nsyn_msr (void)
7808 {
7809   if (inst.operands[0].isvec)
7810     do_vfp_nsyn_opcode ("fmxr");
7811   else
7812     return FAIL;
7813
7814   return SUCCESS;
7815 }
7816
7817 static void
7818 do_vmrs (void)
7819 {
7820   unsigned Rt = inst.operands[0].reg;
7821   
7822   if (thumb_mode && inst.operands[0].reg == REG_SP)
7823     {
7824       inst.error = BAD_SP;
7825       return;
7826     }
7827
7828   /* APSR_ sets isvec. All other refs to PC are illegal.  */
7829   if (!inst.operands[0].isvec && inst.operands[0].reg == REG_PC)
7830     {
7831       inst.error = BAD_PC;
7832       return;
7833     }
7834
7835   if (inst.operands[1].reg != 1)
7836     first_error (_("operand 1 must be FPSCR"));
7837
7838   inst.instruction |= (Rt << 12);
7839 }
7840
7841 static void
7842 do_vmsr (void)
7843 {
7844   unsigned Rt = inst.operands[1].reg;
7845   
7846   if (thumb_mode)
7847     reject_bad_reg (Rt);
7848   else if (Rt == REG_PC)
7849     {
7850       inst.error = BAD_PC;
7851       return;
7852     }
7853
7854   if (inst.operands[0].reg != 1)
7855     first_error (_("operand 0 must be FPSCR"));
7856
7857   inst.instruction |= (Rt << 12);
7858 }
7859
7860 static void
7861 do_mrs (void)
7862 {
7863   unsigned br;
7864
7865   if (do_vfp_nsyn_mrs () == SUCCESS)
7866     return;
7867
7868   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
7869   inst.instruction |= inst.operands[0].reg << 12;
7870
7871   if (inst.operands[1].isreg)
7872     {
7873       br = inst.operands[1].reg;
7874       if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf000))
7875         as_bad (_("bad register for mrs"));
7876     }
7877   else
7878     {
7879       /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
7880       constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
7881                   != (PSR_c|PSR_f),
7882                   _("'CPSR' or 'SPSR' expected"));
7883       br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
7884     }
7885
7886   inst.instruction |= br;
7887 }
7888
7889 /* Two possible forms:
7890       "{C|S}PSR_<field>, Rm",
7891       "{C|S}PSR_f, #expression".  */
7892
7893 static void
7894 do_msr (void)
7895 {
7896   if (do_vfp_nsyn_msr () == SUCCESS)
7897     return;
7898
7899   inst.instruction |= inst.operands[0].imm;
7900   if (inst.operands[1].isreg)
7901     inst.instruction |= inst.operands[1].reg;
7902   else
7903     {
7904       inst.instruction |= INST_IMMEDIATE;
7905       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7906       inst.reloc.pc_rel = 0;
7907     }
7908 }
7909
7910 static void
7911 do_mul (void)
7912 {
7913   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
7914
7915   if (!inst.operands[2].present)
7916     inst.operands[2].reg = inst.operands[0].reg;
7917   inst.instruction |= inst.operands[0].reg << 16;
7918   inst.instruction |= inst.operands[1].reg;
7919   inst.instruction |= inst.operands[2].reg << 8;
7920
7921   if (inst.operands[0].reg == inst.operands[1].reg
7922       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
7923     as_tsktsk (_("Rd and Rm should be different in mul"));
7924 }
7925
7926 /* Long Multiply Parser
7927    UMULL RdLo, RdHi, Rm, Rs
7928    SMULL RdLo, RdHi, Rm, Rs
7929    UMLAL RdLo, RdHi, Rm, Rs
7930    SMLAL RdLo, RdHi, Rm, Rs.  */
7931
7932 static void
7933 do_mull (void)
7934 {
7935   inst.instruction |= inst.operands[0].reg << 12;
7936   inst.instruction |= inst.operands[1].reg << 16;
7937   inst.instruction |= inst.operands[2].reg;
7938   inst.instruction |= inst.operands[3].reg << 8;
7939
7940   /* rdhi and rdlo must be different.  */
7941   if (inst.operands[0].reg == inst.operands[1].reg)
7942     as_tsktsk (_("rdhi and rdlo must be different"));
7943
7944   /* rdhi, rdlo and rm must all be different before armv6.  */
7945   if ((inst.operands[0].reg == inst.operands[2].reg
7946       || inst.operands[1].reg == inst.operands[2].reg)
7947       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
7948     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
7949 }
7950
7951 static void
7952 do_nop (void)
7953 {
7954   if (inst.operands[0].present
7955       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
7956     {
7957       /* Architectural NOP hints are CPSR sets with no bits selected.  */
7958       inst.instruction &= 0xf0000000;
7959       inst.instruction |= 0x0320f000;
7960       if (inst.operands[0].present)
7961         inst.instruction |= inst.operands[0].imm;
7962     }
7963 }
7964
7965 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
7966    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
7967    Condition defaults to COND_ALWAYS.
7968    Error if Rd, Rn or Rm are R15.  */
7969
7970 static void
7971 do_pkhbt (void)
7972 {
7973   inst.instruction |= inst.operands[0].reg << 12;
7974   inst.instruction |= inst.operands[1].reg << 16;
7975   inst.instruction |= inst.operands[2].reg;
7976   if (inst.operands[3].present)
7977     encode_arm_shift (3);
7978 }
7979
7980 /* ARM V6 PKHTB (Argument Parse).  */
7981
7982 static void
7983 do_pkhtb (void)
7984 {
7985   if (!inst.operands[3].present)
7986     {
7987       /* If the shift specifier is omitted, turn the instruction
7988          into pkhbt rd, rm, rn. */
7989       inst.instruction &= 0xfff00010;
7990       inst.instruction |= inst.operands[0].reg << 12;
7991       inst.instruction |= inst.operands[1].reg;
7992       inst.instruction |= inst.operands[2].reg << 16;
7993     }
7994   else
7995     {
7996       inst.instruction |= inst.operands[0].reg << 12;
7997       inst.instruction |= inst.operands[1].reg << 16;
7998       inst.instruction |= inst.operands[2].reg;
7999       encode_arm_shift (3);
8000     }
8001 }
8002
8003 /* ARMv5TE: Preload-Cache
8004    MP Extensions: Preload for write
8005
8006     PLD(W) <addr_mode>
8007
8008   Syntactically, like LDR with B=1, W=0, L=1.  */
8009
8010 static void
8011 do_pld (void)
8012 {
8013   constraint (!inst.operands[0].isreg,
8014               _("'[' expected after PLD mnemonic"));
8015   constraint (inst.operands[0].postind,
8016               _("post-indexed expression used in preload instruction"));
8017   constraint (inst.operands[0].writeback,
8018               _("writeback used in preload instruction"));
8019   constraint (!inst.operands[0].preind,
8020               _("unindexed addressing used in preload instruction"));
8021   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8022 }
8023
8024 /* ARMv7: PLI <addr_mode>  */
8025 static void
8026 do_pli (void)
8027 {
8028   constraint (!inst.operands[0].isreg,
8029               _("'[' expected after PLI mnemonic"));
8030   constraint (inst.operands[0].postind,
8031               _("post-indexed expression used in preload instruction"));
8032   constraint (inst.operands[0].writeback,
8033               _("writeback used in preload instruction"));
8034   constraint (!inst.operands[0].preind,
8035               _("unindexed addressing used in preload instruction"));
8036   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8037   inst.instruction &= ~PRE_INDEX;
8038 }
8039
8040 static void
8041 do_push_pop (void)
8042 {
8043   inst.operands[1] = inst.operands[0];
8044   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
8045   inst.operands[0].isreg = 1;
8046   inst.operands[0].writeback = 1;
8047   inst.operands[0].reg = REG_SP;
8048   do_ldmstm ();
8049 }
8050
8051 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
8052    word at the specified address and the following word
8053    respectively.
8054    Unconditionally executed.
8055    Error if Rn is R15.  */
8056
8057 static void
8058 do_rfe (void)
8059 {
8060   inst.instruction |= inst.operands[0].reg << 16;
8061   if (inst.operands[0].writeback)
8062     inst.instruction |= WRITE_BACK;
8063 }
8064
8065 /* ARM V6 ssat (argument parse).  */
8066
8067 static void
8068 do_ssat (void)
8069 {
8070   inst.instruction |= inst.operands[0].reg << 12;
8071   inst.instruction |= (inst.operands[1].imm - 1) << 16;
8072   inst.instruction |= inst.operands[2].reg;
8073
8074   if (inst.operands[3].present)
8075     encode_arm_shift (3);
8076 }
8077
8078 /* ARM V6 usat (argument parse).  */
8079
8080 static void
8081 do_usat (void)
8082 {
8083   inst.instruction |= inst.operands[0].reg << 12;
8084   inst.instruction |= inst.operands[1].imm << 16;
8085   inst.instruction |= inst.operands[2].reg;
8086
8087   if (inst.operands[3].present)
8088     encode_arm_shift (3);
8089 }
8090
8091 /* ARM V6 ssat16 (argument parse).  */
8092
8093 static void
8094 do_ssat16 (void)
8095 {
8096   inst.instruction |= inst.operands[0].reg << 12;
8097   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
8098   inst.instruction |= inst.operands[2].reg;
8099 }
8100
8101 static void
8102 do_usat16 (void)
8103 {
8104   inst.instruction |= inst.operands[0].reg << 12;
8105   inst.instruction |= inst.operands[1].imm << 16;
8106   inst.instruction |= inst.operands[2].reg;
8107 }
8108
8109 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
8110    preserving the other bits.
8111
8112    setend <endian_specifier>, where <endian_specifier> is either
8113    BE or LE.  */
8114
8115 static void
8116 do_setend (void)
8117 {
8118   if (inst.operands[0].imm)
8119     inst.instruction |= 0x200;
8120 }
8121
8122 static void
8123 do_shift (void)
8124 {
8125   unsigned int Rm = (inst.operands[1].present
8126                      ? inst.operands[1].reg
8127                      : inst.operands[0].reg);
8128
8129   inst.instruction |= inst.operands[0].reg << 12;
8130   inst.instruction |= Rm;
8131   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
8132     {
8133       inst.instruction |= inst.operands[2].reg << 8;
8134       inst.instruction |= SHIFT_BY_REG;
8135     }
8136   else
8137     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
8138 }
8139
8140 static void
8141 do_smc (void)
8142 {
8143   inst.reloc.type = BFD_RELOC_ARM_SMC;
8144   inst.reloc.pc_rel = 0;
8145 }
8146
8147 static void
8148 do_hvc (void)
8149 {
8150   inst.reloc.type = BFD_RELOC_ARM_HVC;
8151   inst.reloc.pc_rel = 0;
8152 }
8153
8154 static void
8155 do_swi (void)
8156 {
8157   inst.reloc.type = BFD_RELOC_ARM_SWI;
8158   inst.reloc.pc_rel = 0;
8159 }
8160
8161 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
8162    SMLAxy{cond} Rd,Rm,Rs,Rn
8163    SMLAWy{cond} Rd,Rm,Rs,Rn
8164    Error if any register is R15.  */
8165
8166 static void
8167 do_smla (void)
8168 {
8169   inst.instruction |= inst.operands[0].reg << 16;
8170   inst.instruction |= inst.operands[1].reg;
8171   inst.instruction |= inst.operands[2].reg << 8;
8172   inst.instruction |= inst.operands[3].reg << 12;
8173 }
8174
8175 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8176    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8177    Error if any register is R15.
8178    Warning if Rdlo == Rdhi.  */
8179
8180 static void
8181 do_smlal (void)
8182 {
8183   inst.instruction |= inst.operands[0].reg << 12;
8184   inst.instruction |= inst.operands[1].reg << 16;
8185   inst.instruction |= inst.operands[2].reg;
8186   inst.instruction |= inst.operands[3].reg << 8;
8187
8188   if (inst.operands[0].reg == inst.operands[1].reg)
8189     as_tsktsk (_("rdhi and rdlo must be different"));
8190 }
8191
8192 /* ARM V5E (El Segundo) signed-multiply (argument parse)
8193    SMULxy{cond} Rd,Rm,Rs
8194    Error if any register is R15.  */
8195
8196 static void
8197 do_smul (void)
8198 {
8199   inst.instruction |= inst.operands[0].reg << 16;
8200   inst.instruction |= inst.operands[1].reg;
8201   inst.instruction |= inst.operands[2].reg << 8;
8202 }
8203
8204 /* ARM V6 srs (argument parse).  The variable fields in the encoding are
8205    the same for both ARM and Thumb-2.  */
8206
8207 static void
8208 do_srs (void)
8209 {
8210   int reg;
8211
8212   if (inst.operands[0].present)
8213     {
8214       reg = inst.operands[0].reg;
8215       constraint (reg != REG_SP, _("SRS base register must be r13"));
8216     }
8217   else
8218     reg = REG_SP;
8219
8220   inst.instruction |= reg << 16;
8221   inst.instruction |= inst.operands[1].imm;
8222   if (inst.operands[0].writeback || inst.operands[1].writeback)
8223     inst.instruction |= WRITE_BACK;
8224 }
8225
8226 /* ARM V6 strex (argument parse).  */
8227
8228 static void
8229 do_strex (void)
8230 {
8231   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8232               || inst.operands[2].postind || inst.operands[2].writeback
8233               || inst.operands[2].immisreg || inst.operands[2].shifted
8234               || inst.operands[2].negative
8235               /* See comment in do_ldrex().  */
8236               || (inst.operands[2].reg == REG_PC),
8237               BAD_ADDR_MODE);
8238
8239   constraint (inst.operands[0].reg == inst.operands[1].reg
8240               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8241
8242   constraint (inst.reloc.exp.X_op != O_constant
8243               || inst.reloc.exp.X_add_number != 0,
8244               _("offset must be zero in ARM encoding"));
8245
8246   inst.instruction |= inst.operands[0].reg << 12;
8247   inst.instruction |= inst.operands[1].reg;
8248   inst.instruction |= inst.operands[2].reg << 16;
8249   inst.reloc.type = BFD_RELOC_UNUSED;
8250 }
8251
8252 static void
8253 do_strexd (void)
8254 {
8255   constraint (inst.operands[1].reg % 2 != 0,
8256               _("even register required"));
8257   constraint (inst.operands[2].present
8258               && inst.operands[2].reg != inst.operands[1].reg + 1,
8259               _("can only store two consecutive registers"));
8260   /* If op 2 were present and equal to PC, this function wouldn't
8261      have been called in the first place.  */
8262   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
8263
8264   constraint (inst.operands[0].reg == inst.operands[1].reg
8265               || inst.operands[0].reg == inst.operands[1].reg + 1
8266               || inst.operands[0].reg == inst.operands[3].reg,
8267               BAD_OVERLAP);
8268
8269   inst.instruction |= inst.operands[0].reg << 12;
8270   inst.instruction |= inst.operands[1].reg;
8271   inst.instruction |= inst.operands[3].reg << 16;
8272 }
8273
8274 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8275    extends it to 32-bits, and adds the result to a value in another
8276    register.  You can specify a rotation by 0, 8, 16, or 24 bits
8277    before extracting the 16-bit value.
8278    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8279    Condition defaults to COND_ALWAYS.
8280    Error if any register uses R15.  */
8281
8282 static void
8283 do_sxtah (void)
8284 {
8285   inst.instruction |= inst.operands[0].reg << 12;
8286   inst.instruction |= inst.operands[1].reg << 16;
8287   inst.instruction |= inst.operands[2].reg;
8288   inst.instruction |= inst.operands[3].imm << 10;
8289 }
8290
8291 /* ARM V6 SXTH.
8292
8293    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8294    Condition defaults to COND_ALWAYS.
8295    Error if any register uses R15.  */
8296
8297 static void
8298 do_sxth (void)
8299 {
8300   inst.instruction |= inst.operands[0].reg << 12;
8301   inst.instruction |= inst.operands[1].reg;
8302   inst.instruction |= inst.operands[2].imm << 10;
8303 }
8304 \f
8305 /* VFP instructions.  In a logical order: SP variant first, monad
8306    before dyad, arithmetic then move then load/store.  */
8307
8308 static void
8309 do_vfp_sp_monadic (void)
8310 {
8311   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8312   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8313 }
8314
8315 static void
8316 do_vfp_sp_dyadic (void)
8317 {
8318   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8319   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8320   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8321 }
8322
8323 static void
8324 do_vfp_sp_compare_z (void)
8325 {
8326   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8327 }
8328
8329 static void
8330 do_vfp_dp_sp_cvt (void)
8331 {
8332   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8333   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8334 }
8335
8336 static void
8337 do_vfp_sp_dp_cvt (void)
8338 {
8339   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8340   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8341 }
8342
8343 static void
8344 do_vfp_reg_from_sp (void)
8345 {
8346   inst.instruction |= inst.operands[0].reg << 12;
8347   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8348 }
8349
8350 static void
8351 do_vfp_reg2_from_sp2 (void)
8352 {
8353   constraint (inst.operands[2].imm != 2,
8354               _("only two consecutive VFP SP registers allowed here"));
8355   inst.instruction |= inst.operands[0].reg << 12;
8356   inst.instruction |= inst.operands[1].reg << 16;
8357   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8358 }
8359
8360 static void
8361 do_vfp_sp_from_reg (void)
8362 {
8363   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
8364   inst.instruction |= inst.operands[1].reg << 12;
8365 }
8366
8367 static void
8368 do_vfp_sp2_from_reg2 (void)
8369 {
8370   constraint (inst.operands[0].imm != 2,
8371               _("only two consecutive VFP SP registers allowed here"));
8372   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
8373   inst.instruction |= inst.operands[1].reg << 12;
8374   inst.instruction |= inst.operands[2].reg << 16;
8375 }
8376
8377 static void
8378 do_vfp_sp_ldst (void)
8379 {
8380   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8381   encode_arm_cp_address (1, FALSE, TRUE, 0);
8382 }
8383
8384 static void
8385 do_vfp_dp_ldst (void)
8386 {
8387   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8388   encode_arm_cp_address (1, FALSE, TRUE, 0);
8389 }
8390
8391
8392 static void
8393 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
8394 {
8395   if (inst.operands[0].writeback)
8396     inst.instruction |= WRITE_BACK;
8397   else
8398     constraint (ldstm_type != VFP_LDSTMIA,
8399                 _("this addressing mode requires base-register writeback"));
8400   inst.instruction |= inst.operands[0].reg << 16;
8401   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
8402   inst.instruction |= inst.operands[1].imm;
8403 }
8404
8405 static void
8406 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
8407 {
8408   int count;
8409
8410   if (inst.operands[0].writeback)
8411     inst.instruction |= WRITE_BACK;
8412   else
8413     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
8414                 _("this addressing mode requires base-register writeback"));
8415
8416   inst.instruction |= inst.operands[0].reg << 16;
8417   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8418
8419   count = inst.operands[1].imm << 1;
8420   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
8421     count += 1;
8422
8423   inst.instruction |= count;
8424 }
8425
8426 static void
8427 do_vfp_sp_ldstmia (void)
8428 {
8429   vfp_sp_ldstm (VFP_LDSTMIA);
8430 }
8431
8432 static void
8433 do_vfp_sp_ldstmdb (void)
8434 {
8435   vfp_sp_ldstm (VFP_LDSTMDB);
8436 }
8437
8438 static void
8439 do_vfp_dp_ldstmia (void)
8440 {
8441   vfp_dp_ldstm (VFP_LDSTMIA);
8442 }
8443
8444 static void
8445 do_vfp_dp_ldstmdb (void)
8446 {
8447   vfp_dp_ldstm (VFP_LDSTMDB);
8448 }
8449
8450 static void
8451 do_vfp_xp_ldstmia (void)
8452 {
8453   vfp_dp_ldstm (VFP_LDSTMIAX);
8454 }
8455
8456 static void
8457 do_vfp_xp_ldstmdb (void)
8458 {
8459   vfp_dp_ldstm (VFP_LDSTMDBX);
8460 }
8461
8462 static void
8463 do_vfp_dp_rd_rm (void)
8464 {
8465   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8466   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8467 }
8468
8469 static void
8470 do_vfp_dp_rn_rd (void)
8471 {
8472   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
8473   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8474 }
8475
8476 static void
8477 do_vfp_dp_rd_rn (void)
8478 {
8479   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8480   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8481 }
8482
8483 static void
8484 do_vfp_dp_rd_rn_rm (void)
8485 {
8486   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8487   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8488   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
8489 }
8490
8491 static void
8492 do_vfp_dp_rd (void)
8493 {
8494   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8495 }
8496
8497 static void
8498 do_vfp_dp_rm_rd_rn (void)
8499 {
8500   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
8501   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8502   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
8503 }
8504
8505 /* VFPv3 instructions.  */
8506 static void
8507 do_vfp_sp_const (void)
8508 {
8509   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8510   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8511   inst.instruction |= (inst.operands[1].imm & 0x0f);
8512 }
8513
8514 static void
8515 do_vfp_dp_const (void)
8516 {
8517   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8518   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8519   inst.instruction |= (inst.operands[1].imm & 0x0f);
8520 }
8521
8522 static void
8523 vfp_conv (int srcsize)
8524 {
8525   unsigned immbits = srcsize - inst.operands[1].imm;
8526   inst.instruction |= (immbits & 1) << 5;
8527   inst.instruction |= (immbits >> 1);
8528 }
8529
8530 static void
8531 do_vfp_sp_conv_16 (void)
8532 {
8533   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8534   vfp_conv (16);
8535 }
8536
8537 static void
8538 do_vfp_dp_conv_16 (void)
8539 {
8540   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8541   vfp_conv (16);
8542 }
8543
8544 static void
8545 do_vfp_sp_conv_32 (void)
8546 {
8547   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8548   vfp_conv (32);
8549 }
8550
8551 static void
8552 do_vfp_dp_conv_32 (void)
8553 {
8554   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8555   vfp_conv (32);
8556 }
8557 \f
8558 /* FPA instructions.  Also in a logical order.  */
8559
8560 static void
8561 do_fpa_cmp (void)
8562 {
8563   inst.instruction |= inst.operands[0].reg << 16;
8564   inst.instruction |= inst.operands[1].reg;
8565 }
8566
8567 static void
8568 do_fpa_ldmstm (void)
8569 {
8570   inst.instruction |= inst.operands[0].reg << 12;
8571   switch (inst.operands[1].imm)
8572     {
8573     case 1: inst.instruction |= CP_T_X;          break;
8574     case 2: inst.instruction |= CP_T_Y;          break;
8575     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
8576     case 4:                                      break;
8577     default: abort ();
8578     }
8579
8580   if (inst.instruction & (PRE_INDEX | INDEX_UP))
8581     {
8582       /* The instruction specified "ea" or "fd", so we can only accept
8583          [Rn]{!}.  The instruction does not really support stacking or
8584          unstacking, so we have to emulate these by setting appropriate
8585          bits and offsets.  */
8586       constraint (inst.reloc.exp.X_op != O_constant
8587                   || inst.reloc.exp.X_add_number != 0,
8588                   _("this instruction does not support indexing"));
8589
8590       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
8591         inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
8592
8593       if (!(inst.instruction & INDEX_UP))
8594         inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
8595
8596       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
8597         {
8598           inst.operands[2].preind = 0;
8599           inst.operands[2].postind = 1;
8600         }
8601     }
8602
8603   encode_arm_cp_address (2, TRUE, TRUE, 0);
8604 }
8605 \f
8606 /* iWMMXt instructions: strictly in alphabetical order.  */
8607
8608 static void
8609 do_iwmmxt_tandorc (void)
8610 {
8611   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
8612 }
8613
8614 static void
8615 do_iwmmxt_textrc (void)
8616 {
8617   inst.instruction |= inst.operands[0].reg << 12;
8618   inst.instruction |= inst.operands[1].imm;
8619 }
8620
8621 static void
8622 do_iwmmxt_textrm (void)
8623 {
8624   inst.instruction |= inst.operands[0].reg << 12;
8625   inst.instruction |= inst.operands[1].reg << 16;
8626   inst.instruction |= inst.operands[2].imm;
8627 }
8628
8629 static void
8630 do_iwmmxt_tinsr (void)
8631 {
8632   inst.instruction |= inst.operands[0].reg << 16;
8633   inst.instruction |= inst.operands[1].reg << 12;
8634   inst.instruction |= inst.operands[2].imm;
8635 }
8636
8637 static void
8638 do_iwmmxt_tmia (void)
8639 {
8640   inst.instruction |= inst.operands[0].reg << 5;
8641   inst.instruction |= inst.operands[1].reg;
8642   inst.instruction |= inst.operands[2].reg << 12;
8643 }
8644
8645 static void
8646 do_iwmmxt_waligni (void)
8647 {
8648   inst.instruction |= inst.operands[0].reg << 12;
8649   inst.instruction |= inst.operands[1].reg << 16;
8650   inst.instruction |= inst.operands[2].reg;
8651   inst.instruction |= inst.operands[3].imm << 20;
8652 }
8653
8654 static void
8655 do_iwmmxt_wmerge (void)
8656 {
8657   inst.instruction |= inst.operands[0].reg << 12;
8658   inst.instruction |= inst.operands[1].reg << 16;
8659   inst.instruction |= inst.operands[2].reg;
8660   inst.instruction |= inst.operands[3].imm << 21;
8661 }
8662
8663 static void
8664 do_iwmmxt_wmov (void)
8665 {
8666   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
8667   inst.instruction |= inst.operands[0].reg << 12;
8668   inst.instruction |= inst.operands[1].reg << 16;
8669   inst.instruction |= inst.operands[1].reg;
8670 }
8671
8672 static void
8673 do_iwmmxt_wldstbh (void)
8674 {
8675   int reloc;
8676   inst.instruction |= inst.operands[0].reg << 12;
8677   if (thumb_mode)
8678     reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
8679   else
8680     reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
8681   encode_arm_cp_address (1, TRUE, FALSE, reloc);
8682 }
8683
8684 static void
8685 do_iwmmxt_wldstw (void)
8686 {
8687   /* RIWR_RIWC clears .isreg for a control register.  */
8688   if (!inst.operands[0].isreg)
8689     {
8690       constraint (inst.cond != COND_ALWAYS, BAD_COND);
8691       inst.instruction |= 0xf0000000;
8692     }
8693
8694   inst.instruction |= inst.operands[0].reg << 12;
8695   encode_arm_cp_address (1, TRUE, TRUE, 0);
8696 }
8697
8698 static void
8699 do_iwmmxt_wldstd (void)
8700 {
8701   inst.instruction |= inst.operands[0].reg << 12;
8702   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
8703       && inst.operands[1].immisreg)
8704     {
8705       inst.instruction &= ~0x1a000ff;
8706       inst.instruction |= (0xf << 28);
8707       if (inst.operands[1].preind)
8708         inst.instruction |= PRE_INDEX;
8709       if (!inst.operands[1].negative)
8710         inst.instruction |= INDEX_UP;
8711       if (inst.operands[1].writeback)
8712         inst.instruction |= WRITE_BACK;
8713       inst.instruction |= inst.operands[1].reg << 16;
8714       inst.instruction |= inst.reloc.exp.X_add_number << 4;
8715       inst.instruction |= inst.operands[1].imm;
8716     }
8717   else
8718     encode_arm_cp_address (1, TRUE, FALSE, 0);
8719 }
8720
8721 static void
8722 do_iwmmxt_wshufh (void)
8723 {
8724   inst.instruction |= inst.operands[0].reg << 12;
8725   inst.instruction |= inst.operands[1].reg << 16;
8726   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
8727   inst.instruction |= (inst.operands[2].imm & 0x0f);
8728 }
8729
8730 static void
8731 do_iwmmxt_wzero (void)
8732 {
8733   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
8734   inst.instruction |= inst.operands[0].reg;
8735   inst.instruction |= inst.operands[0].reg << 12;
8736   inst.instruction |= inst.operands[0].reg << 16;
8737 }
8738
8739 static void
8740 do_iwmmxt_wrwrwr_or_imm5 (void)
8741 {
8742   if (inst.operands[2].isreg)
8743     do_rd_rn_rm ();
8744   else {
8745     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
8746                 _("immediate operand requires iWMMXt2"));
8747     do_rd_rn ();
8748     if (inst.operands[2].imm == 0)
8749       {
8750         switch ((inst.instruction >> 20) & 0xf)
8751           {
8752           case 4:
8753           case 5:
8754           case 6:
8755           case 7:
8756             /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
8757             inst.operands[2].imm = 16;
8758             inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
8759             break;
8760           case 8:
8761           case 9:
8762           case 10:
8763           case 11:
8764             /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
8765             inst.operands[2].imm = 32;
8766             inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
8767             break;
8768           case 12:
8769           case 13:
8770           case 14:
8771           case 15:
8772             {
8773               /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
8774               unsigned long wrn;
8775               wrn = (inst.instruction >> 16) & 0xf;
8776               inst.instruction &= 0xff0fff0f;
8777               inst.instruction |= wrn;
8778               /* Bail out here; the instruction is now assembled.  */
8779               return;
8780             }
8781           }
8782       }
8783     /* Map 32 -> 0, etc.  */
8784     inst.operands[2].imm &= 0x1f;
8785     inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
8786   }
8787 }
8788 \f
8789 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
8790    operations first, then control, shift, and load/store.  */
8791
8792 /* Insns like "foo X,Y,Z".  */
8793
8794 static void
8795 do_mav_triple (void)
8796 {
8797   inst.instruction |= inst.operands[0].reg << 16;
8798   inst.instruction |= inst.operands[1].reg;
8799   inst.instruction |= inst.operands[2].reg << 12;
8800 }
8801
8802 /* Insns like "foo W,X,Y,Z".
8803     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
8804
8805 static void
8806 do_mav_quad (void)
8807 {
8808   inst.instruction |= inst.operands[0].reg << 5;
8809   inst.instruction |= inst.operands[1].reg << 12;
8810   inst.instruction |= inst.operands[2].reg << 16;
8811   inst.instruction |= inst.operands[3].reg;
8812 }
8813
8814 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
8815 static void
8816 do_mav_dspsc (void)
8817 {
8818   inst.instruction |= inst.operands[1].reg << 12;
8819 }
8820
8821 /* Maverick shift immediate instructions.
8822    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
8823    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
8824
8825 static void
8826 do_mav_shift (void)
8827 {
8828   int imm = inst.operands[2].imm;
8829
8830   inst.instruction |= inst.operands[0].reg << 12;
8831   inst.instruction |= inst.operands[1].reg << 16;
8832
8833   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
8834      Bits 5-7 of the insn should have bits 4-6 of the immediate.
8835      Bit 4 should be 0.  */
8836   imm = (imm & 0xf) | ((imm & 0x70) << 1);
8837
8838   inst.instruction |= imm;
8839 }
8840 \f
8841 /* XScale instructions.  Also sorted arithmetic before move.  */
8842
8843 /* Xscale multiply-accumulate (argument parse)
8844      MIAcc   acc0,Rm,Rs
8845      MIAPHcc acc0,Rm,Rs
8846      MIAxycc acc0,Rm,Rs.  */
8847
8848 static void
8849 do_xsc_mia (void)
8850 {
8851   inst.instruction |= inst.operands[1].reg;
8852   inst.instruction |= inst.operands[2].reg << 12;
8853 }
8854
8855 /* Xscale move-accumulator-register (argument parse)
8856
8857      MARcc   acc0,RdLo,RdHi.  */
8858
8859 static void
8860 do_xsc_mar (void)
8861 {
8862   inst.instruction |= inst.operands[1].reg << 12;
8863   inst.instruction |= inst.operands[2].reg << 16;
8864 }
8865
8866 /* Xscale move-register-accumulator (argument parse)
8867
8868      MRAcc   RdLo,RdHi,acc0.  */
8869
8870 static void
8871 do_xsc_mra (void)
8872 {
8873   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
8874   inst.instruction |= inst.operands[0].reg << 12;
8875   inst.instruction |= inst.operands[1].reg << 16;
8876 }
8877 \f
8878 /* Encoding functions relevant only to Thumb.  */
8879
8880 /* inst.operands[i] is a shifted-register operand; encode
8881    it into inst.instruction in the format used by Thumb32.  */
8882
8883 static void
8884 encode_thumb32_shifted_operand (int i)
8885 {
8886   unsigned int value = inst.reloc.exp.X_add_number;
8887   unsigned int shift = inst.operands[i].shift_kind;
8888
8889   constraint (inst.operands[i].immisreg,
8890               _("shift by register not allowed in thumb mode"));
8891   inst.instruction |= inst.operands[i].reg;
8892   if (shift == SHIFT_RRX)
8893     inst.instruction |= SHIFT_ROR << 4;
8894   else
8895     {
8896       constraint (inst.reloc.exp.X_op != O_constant,
8897                   _("expression too complex"));
8898
8899       constraint (value > 32
8900                   || (value == 32 && (shift == SHIFT_LSL
8901                                       || shift == SHIFT_ROR)),
8902                   _("shift expression is too large"));
8903
8904       if (value == 0)
8905         shift = SHIFT_LSL;
8906       else if (value == 32)
8907         value = 0;
8908
8909       inst.instruction |= shift << 4;
8910       inst.instruction |= (value & 0x1c) << 10;
8911       inst.instruction |= (value & 0x03) << 6;
8912     }
8913 }
8914
8915
8916 /* inst.operands[i] was set up by parse_address.  Encode it into a
8917    Thumb32 format load or store instruction.  Reject forms that cannot
8918    be used with such instructions.  If is_t is true, reject forms that
8919    cannot be used with a T instruction; if is_d is true, reject forms
8920    that cannot be used with a D instruction.  If it is a store insn,
8921    reject PC in Rn.  */
8922
8923 static void
8924 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
8925 {
8926   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
8927
8928   constraint (!inst.operands[i].isreg,
8929               _("Instruction does not support =N addresses"));
8930
8931   inst.instruction |= inst.operands[i].reg << 16;
8932   if (inst.operands[i].immisreg)
8933     {
8934       constraint (is_pc, BAD_PC_ADDRESSING);
8935       constraint (is_t || is_d, _("cannot use register index with this instruction"));
8936       constraint (inst.operands[i].negative,
8937                   _("Thumb does not support negative register indexing"));
8938       constraint (inst.operands[i].postind,
8939                   _("Thumb does not support register post-indexing"));
8940       constraint (inst.operands[i].writeback,
8941                   _("Thumb does not support register indexing with writeback"));
8942       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
8943                   _("Thumb supports only LSL in shifted register indexing"));
8944
8945       inst.instruction |= inst.operands[i].imm;
8946       if (inst.operands[i].shifted)
8947         {
8948           constraint (inst.reloc.exp.X_op != O_constant,
8949                       _("expression too complex"));
8950           constraint (inst.reloc.exp.X_add_number < 0
8951                       || inst.reloc.exp.X_add_number > 3,
8952                       _("shift out of range"));
8953           inst.instruction |= inst.reloc.exp.X_add_number << 4;
8954         }
8955       inst.reloc.type = BFD_RELOC_UNUSED;
8956     }
8957   else if (inst.operands[i].preind)
8958     {
8959       constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
8960       constraint (is_t && inst.operands[i].writeback,
8961                   _("cannot use writeback with this instruction"));
8962       constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0)
8963                   && !inst.reloc.pc_rel, BAD_PC_ADDRESSING);
8964
8965       if (is_d)
8966         {
8967           inst.instruction |= 0x01000000;
8968           if (inst.operands[i].writeback)
8969             inst.instruction |= 0x00200000;
8970         }
8971       else
8972         {
8973           inst.instruction |= 0x00000c00;
8974           if (inst.operands[i].writeback)
8975             inst.instruction |= 0x00000100;
8976         }
8977       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
8978     }
8979   else if (inst.operands[i].postind)
8980     {
8981       gas_assert (inst.operands[i].writeback);
8982       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
8983       constraint (is_t, _("cannot use post-indexing with this instruction"));
8984
8985       if (is_d)
8986         inst.instruction |= 0x00200000;
8987       else
8988         inst.instruction |= 0x00000900;
8989       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
8990     }
8991   else /* unindexed - only for coprocessor */
8992     inst.error = _("instruction does not accept unindexed addressing");
8993 }
8994
8995 /* Table of Thumb instructions which exist in both 16- and 32-bit
8996    encodings (the latter only in post-V6T2 cores).  The index is the
8997    value used in the insns table below.  When there is more than one
8998    possible 16-bit encoding for the instruction, this table always
8999    holds variant (1).
9000    Also contains several pseudo-instructions used during relaxation.  */
9001 #define T16_32_TAB                              \
9002   X(_adc,   4140, eb400000),                    \
9003   X(_adcs,  4140, eb500000),                    \
9004   X(_add,   1c00, eb000000),                    \
9005   X(_adds,  1c00, eb100000),                    \
9006   X(_addi,  0000, f1000000),                    \
9007   X(_addis, 0000, f1100000),                    \
9008   X(_add_pc,000f, f20f0000),                    \
9009   X(_add_sp,000d, f10d0000),                    \
9010   X(_adr,   000f, f20f0000),                    \
9011   X(_and,   4000, ea000000),                    \
9012   X(_ands,  4000, ea100000),                    \
9013   X(_asr,   1000, fa40f000),                    \
9014   X(_asrs,  1000, fa50f000),                    \
9015   X(_b,     e000, f000b000),                    \
9016   X(_bcond, d000, f0008000),                    \
9017   X(_bic,   4380, ea200000),                    \
9018   X(_bics,  4380, ea300000),                    \
9019   X(_cmn,   42c0, eb100f00),                    \
9020   X(_cmp,   2800, ebb00f00),                    \
9021   X(_cpsie, b660, f3af8400),                    \
9022   X(_cpsid, b670, f3af8600),                    \
9023   X(_cpy,   4600, ea4f0000),                    \
9024   X(_dec_sp,80dd, f1ad0d00),                    \
9025   X(_eor,   4040, ea800000),                    \
9026   X(_eors,  4040, ea900000),                    \
9027   X(_inc_sp,00dd, f10d0d00),                    \
9028   X(_ldmia, c800, e8900000),                    \
9029   X(_ldr,   6800, f8500000),                    \
9030   X(_ldrb,  7800, f8100000),                    \
9031   X(_ldrh,  8800, f8300000),                    \
9032   X(_ldrsb, 5600, f9100000),                    \
9033   X(_ldrsh, 5e00, f9300000),                    \
9034   X(_ldr_pc,4800, f85f0000),                    \
9035   X(_ldr_pc2,4800, f85f0000),                   \
9036   X(_ldr_sp,9800, f85d0000),                    \
9037   X(_lsl,   0000, fa00f000),                    \
9038   X(_lsls,  0000, fa10f000),                    \
9039   X(_lsr,   0800, fa20f000),                    \
9040   X(_lsrs,  0800, fa30f000),                    \
9041   X(_mov,   2000, ea4f0000),                    \
9042   X(_movs,  2000, ea5f0000),                    \
9043   X(_mul,   4340, fb00f000),                     \
9044   X(_muls,  4340, ffffffff), /* no 32b muls */  \
9045   X(_mvn,   43c0, ea6f0000),                    \
9046   X(_mvns,  43c0, ea7f0000),                    \
9047   X(_neg,   4240, f1c00000), /* rsb #0 */       \
9048   X(_negs,  4240, f1d00000), /* rsbs #0 */      \
9049   X(_orr,   4300, ea400000),                    \
9050   X(_orrs,  4300, ea500000),                    \
9051   X(_pop,   bc00, e8bd0000), /* ldmia sp!,... */        \
9052   X(_push,  b400, e92d0000), /* stmdb sp!,... */        \
9053   X(_rev,   ba00, fa90f080),                    \
9054   X(_rev16, ba40, fa90f090),                    \
9055   X(_revsh, bac0, fa90f0b0),                    \
9056   X(_ror,   41c0, fa60f000),                    \
9057   X(_rors,  41c0, fa70f000),                    \
9058   X(_sbc,   4180, eb600000),                    \
9059   X(_sbcs,  4180, eb700000),                    \
9060   X(_stmia, c000, e8800000),                    \
9061   X(_str,   6000, f8400000),                    \
9062   X(_strb,  7000, f8000000),                    \
9063   X(_strh,  8000, f8200000),                    \
9064   X(_str_sp,9000, f84d0000),                    \
9065   X(_sub,   1e00, eba00000),                    \
9066   X(_subs,  1e00, ebb00000),                    \
9067   X(_subi,  8000, f1a00000),                    \
9068   X(_subis, 8000, f1b00000),                    \
9069   X(_sxtb,  b240, fa4ff080),                    \
9070   X(_sxth,  b200, fa0ff080),                    \
9071   X(_tst,   4200, ea100f00),                    \
9072   X(_uxtb,  b2c0, fa5ff080),                    \
9073   X(_uxth,  b280, fa1ff080),                    \
9074   X(_nop,   bf00, f3af8000),                    \
9075   X(_yield, bf10, f3af8001),                    \
9076   X(_wfe,   bf20, f3af8002),                    \
9077   X(_wfi,   bf30, f3af8003),                    \
9078   X(_sev,   bf40, f3af8004),
9079
9080 /* To catch errors in encoding functions, the codes are all offset by
9081    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
9082    as 16-bit instructions.  */
9083 #define X(a,b,c) T_MNEM##a
9084 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
9085 #undef X
9086
9087 #define X(a,b,c) 0x##b
9088 static const unsigned short thumb_op16[] = { T16_32_TAB };
9089 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
9090 #undef X
9091
9092 #define X(a,b,c) 0x##c
9093 static const unsigned int thumb_op32[] = { T16_32_TAB };
9094 #define THUMB_OP32(n)        (thumb_op32[(n) - (T16_32_OFFSET + 1)])
9095 #define THUMB_SETS_FLAGS(n)  (THUMB_OP32 (n) & 0x00100000)
9096 #undef X
9097 #undef T16_32_TAB
9098
9099 /* Thumb instruction encoders, in alphabetical order.  */
9100
9101 /* ADDW or SUBW.  */
9102
9103 static void
9104 do_t_add_sub_w (void)
9105 {
9106   int Rd, Rn;
9107
9108   Rd = inst.operands[0].reg;
9109   Rn = inst.operands[1].reg;
9110
9111   /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
9112      is the SP-{plus,minus}-immediate form of the instruction.  */
9113   if (Rn == REG_SP)
9114     constraint (Rd == REG_PC, BAD_PC);
9115   else
9116     reject_bad_reg (Rd);
9117
9118   inst.instruction |= (Rn << 16) | (Rd << 8);
9119   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9120 }
9121
9122 /* Parse an add or subtract instruction.  We get here with inst.instruction
9123    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
9124
9125 static void
9126 do_t_add_sub (void)
9127 {
9128   int Rd, Rs, Rn;
9129
9130   Rd = inst.operands[0].reg;
9131   Rs = (inst.operands[1].present
9132         ? inst.operands[1].reg    /* Rd, Rs, foo */
9133         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9134
9135   if (Rd == REG_PC)
9136     set_it_insn_type_last ();
9137
9138   if (unified_syntax)
9139     {
9140       bfd_boolean flags;
9141       bfd_boolean narrow;
9142       int opcode;
9143
9144       flags = (inst.instruction == T_MNEM_adds
9145                || inst.instruction == T_MNEM_subs);
9146       if (flags)
9147         narrow = !in_it_block ();
9148       else
9149         narrow = in_it_block ();
9150       if (!inst.operands[2].isreg)
9151         {
9152           int add;
9153
9154           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9155
9156           add = (inst.instruction == T_MNEM_add
9157                  || inst.instruction == T_MNEM_adds);
9158           opcode = 0;
9159           if (inst.size_req != 4)
9160             {
9161               /* Attempt to use a narrow opcode, with relaxation if
9162                  appropriate.  */
9163               if (Rd == REG_SP && Rs == REG_SP && !flags)
9164                 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
9165               else if (Rd <= 7 && Rs == REG_SP && add && !flags)
9166                 opcode = T_MNEM_add_sp;
9167               else if (Rd <= 7 && Rs == REG_PC && add && !flags)
9168                 opcode = T_MNEM_add_pc;
9169               else if (Rd <= 7 && Rs <= 7 && narrow)
9170                 {
9171                   if (flags)
9172                     opcode = add ? T_MNEM_addis : T_MNEM_subis;
9173                   else
9174                     opcode = add ? T_MNEM_addi : T_MNEM_subi;
9175                 }
9176               if (opcode)
9177                 {
9178                   inst.instruction = THUMB_OP16(opcode);
9179                   inst.instruction |= (Rd << 4) | Rs;
9180                   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9181                   if (inst.size_req != 2)
9182                     inst.relax = opcode;
9183                 }
9184               else
9185                 constraint (inst.size_req == 2, BAD_HIREG);
9186             }
9187           if (inst.size_req == 4
9188               || (inst.size_req != 2 && !opcode))
9189             {
9190               if (Rd == REG_PC)
9191                 {
9192                   constraint (add, BAD_PC);
9193                   constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9194                              _("only SUBS PC, LR, #const allowed"));
9195                   constraint (inst.reloc.exp.X_op != O_constant,
9196                               _("expression too complex"));
9197                   constraint (inst.reloc.exp.X_add_number < 0
9198                               || inst.reloc.exp.X_add_number > 0xff,
9199                              _("immediate value out of range"));
9200                   inst.instruction = T2_SUBS_PC_LR
9201                                      | inst.reloc.exp.X_add_number;
9202                   inst.reloc.type = BFD_RELOC_UNUSED;
9203                   return;
9204                 }
9205               else if (Rs == REG_PC)
9206                 {
9207                   /* Always use addw/subw.  */
9208                   inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9209                   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9210                 }
9211               else
9212                 {
9213                   inst.instruction = THUMB_OP32 (inst.instruction);
9214                   inst.instruction = (inst.instruction & 0xe1ffffff)
9215                                      | 0x10000000;
9216                   if (flags)
9217                     inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9218                   else
9219                     inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9220                 }
9221               inst.instruction |= Rd << 8;
9222               inst.instruction |= Rs << 16;
9223             }
9224         }
9225       else
9226         {
9227           Rn = inst.operands[2].reg;
9228           /* See if we can do this with a 16-bit instruction.  */
9229           if (!inst.operands[2].shifted && inst.size_req != 4)
9230             {
9231               if (Rd > 7 || Rs > 7 || Rn > 7)
9232                 narrow = FALSE;
9233
9234               if (narrow)
9235                 {
9236                   inst.instruction = ((inst.instruction == T_MNEM_adds
9237                                        || inst.instruction == T_MNEM_add)
9238                                       ? T_OPCODE_ADD_R3
9239                                       : T_OPCODE_SUB_R3);
9240                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9241                   return;
9242                 }
9243
9244               if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
9245                 {
9246                   /* Thumb-1 cores (except v6-M) require at least one high
9247                      register in a narrow non flag setting add.  */
9248                   if (Rd > 7 || Rn > 7
9249                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9250                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
9251                     {
9252                       if (Rd == Rn)
9253                         {
9254                           Rn = Rs;
9255                           Rs = Rd;
9256                         }
9257                       inst.instruction = T_OPCODE_ADD_HI;
9258                       inst.instruction |= (Rd & 8) << 4;
9259                       inst.instruction |= (Rd & 7);
9260                       inst.instruction |= Rn << 3;
9261                       return;
9262                     }
9263                 }
9264             }
9265
9266           constraint (Rd == REG_PC, BAD_PC);
9267           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9268           constraint (Rs == REG_PC, BAD_PC);
9269           reject_bad_reg (Rn);
9270
9271           /* If we get here, it can't be done in 16 bits.  */
9272           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9273                       _("shift must be constant"));
9274           inst.instruction = THUMB_OP32 (inst.instruction);
9275           inst.instruction |= Rd << 8;
9276           inst.instruction |= Rs << 16;
9277           encode_thumb32_shifted_operand (2);
9278         }
9279     }
9280   else
9281     {
9282       constraint (inst.instruction == T_MNEM_adds
9283                   || inst.instruction == T_MNEM_subs,
9284                   BAD_THUMB32);
9285
9286       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
9287         {
9288           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9289                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9290                       BAD_HIREG);
9291
9292           inst.instruction = (inst.instruction == T_MNEM_add
9293                               ? 0x0000 : 0x8000);
9294           inst.instruction |= (Rd << 4) | Rs;
9295           inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9296           return;
9297         }
9298
9299       Rn = inst.operands[2].reg;
9300       constraint (inst.operands[2].shifted, _("unshifted register required"));
9301
9302       /* We now have Rd, Rs, and Rn set to registers.  */
9303       if (Rd > 7 || Rs > 7 || Rn > 7)
9304         {
9305           /* Can't do this for SUB.      */
9306           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9307           inst.instruction = T_OPCODE_ADD_HI;
9308           inst.instruction |= (Rd & 8) << 4;
9309           inst.instruction |= (Rd & 7);
9310           if (Rs == Rd)
9311             inst.instruction |= Rn << 3;
9312           else if (Rn == Rd)
9313             inst.instruction |= Rs << 3;
9314           else
9315             constraint (1, _("dest must overlap one source register"));
9316         }
9317       else
9318         {
9319           inst.instruction = (inst.instruction == T_MNEM_add
9320                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9321           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9322         }
9323     }
9324 }
9325
9326 static void
9327 do_t_adr (void)
9328 {
9329   unsigned Rd;
9330
9331   Rd = inst.operands[0].reg;
9332   reject_bad_reg (Rd);
9333
9334   if (unified_syntax && inst.size_req == 0 && Rd <= 7)
9335     {
9336       /* Defer to section relaxation.  */
9337       inst.relax = inst.instruction;
9338       inst.instruction = THUMB_OP16 (inst.instruction);
9339       inst.instruction |= Rd << 4;
9340     }
9341   else if (unified_syntax && inst.size_req != 2)
9342     {
9343       /* Generate a 32-bit opcode.  */
9344       inst.instruction = THUMB_OP32 (inst.instruction);
9345       inst.instruction |= Rd << 8;
9346       inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9347       inst.reloc.pc_rel = 1;
9348     }
9349   else
9350     {
9351       /* Generate a 16-bit opcode.  */
9352       inst.instruction = THUMB_OP16 (inst.instruction);
9353       inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9354       inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
9355       inst.reloc.pc_rel = 1;
9356
9357       inst.instruction |= Rd << 4;
9358     }
9359 }
9360
9361 /* Arithmetic instructions for which there is just one 16-bit
9362    instruction encoding, and it allows only two low registers.
9363    For maximal compatibility with ARM syntax, we allow three register
9364    operands even when Thumb-32 instructions are not available, as long
9365    as the first two are identical.  For instance, both "sbc r0,r1" and
9366    "sbc r0,r0,r1" are allowed.  */
9367 static void
9368 do_t_arit3 (void)
9369 {
9370   int Rd, Rs, Rn;
9371
9372   Rd = inst.operands[0].reg;
9373   Rs = (inst.operands[1].present
9374         ? inst.operands[1].reg    /* Rd, Rs, foo */
9375         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9376   Rn = inst.operands[2].reg;
9377
9378   reject_bad_reg (Rd);
9379   reject_bad_reg (Rs);
9380   if (inst.operands[2].isreg)
9381     reject_bad_reg (Rn);
9382
9383   if (unified_syntax)
9384     {
9385       if (!inst.operands[2].isreg)
9386         {
9387           /* For an immediate, we always generate a 32-bit opcode;
9388              section relaxation will shrink it later if possible.  */
9389           inst.instruction = THUMB_OP32 (inst.instruction);
9390           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9391           inst.instruction |= Rd << 8;
9392           inst.instruction |= Rs << 16;
9393           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9394         }
9395       else
9396         {
9397           bfd_boolean narrow;
9398
9399           /* See if we can do this with a 16-bit instruction.  */
9400           if (THUMB_SETS_FLAGS (inst.instruction))
9401             narrow = !in_it_block ();
9402           else
9403             narrow = in_it_block ();
9404
9405           if (Rd > 7 || Rn > 7 || Rs > 7)
9406             narrow = FALSE;
9407           if (inst.operands[2].shifted)
9408             narrow = FALSE;
9409           if (inst.size_req == 4)
9410             narrow = FALSE;
9411
9412           if (narrow
9413               && Rd == Rs)
9414             {
9415               inst.instruction = THUMB_OP16 (inst.instruction);
9416               inst.instruction |= Rd;
9417               inst.instruction |= Rn << 3;
9418               return;
9419             }
9420
9421           /* If we get here, it can't be done in 16 bits.  */
9422           constraint (inst.operands[2].shifted
9423                       && inst.operands[2].immisreg,
9424                       _("shift must be constant"));
9425           inst.instruction = THUMB_OP32 (inst.instruction);
9426           inst.instruction |= Rd << 8;
9427           inst.instruction |= Rs << 16;
9428           encode_thumb32_shifted_operand (2);
9429         }
9430     }
9431   else
9432     {
9433       /* On its face this is a lie - the instruction does set the
9434          flags.  However, the only supported mnemonic in this mode
9435          says it doesn't.  */
9436       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9437
9438       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9439                   _("unshifted register required"));
9440       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9441       constraint (Rd != Rs,
9442                   _("dest and source1 must be the same register"));
9443
9444       inst.instruction = THUMB_OP16 (inst.instruction);
9445       inst.instruction |= Rd;
9446       inst.instruction |= Rn << 3;
9447     }
9448 }
9449
9450 /* Similarly, but for instructions where the arithmetic operation is
9451    commutative, so we can allow either of them to be different from
9452    the destination operand in a 16-bit instruction.  For instance, all
9453    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
9454    accepted.  */
9455 static void
9456 do_t_arit3c (void)
9457 {
9458   int Rd, Rs, Rn;
9459
9460   Rd = inst.operands[0].reg;
9461   Rs = (inst.operands[1].present
9462         ? inst.operands[1].reg    /* Rd, Rs, foo */
9463         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9464   Rn = inst.operands[2].reg;
9465
9466   reject_bad_reg (Rd);
9467   reject_bad_reg (Rs);
9468   if (inst.operands[2].isreg)
9469     reject_bad_reg (Rn);
9470
9471   if (unified_syntax)
9472     {
9473       if (!inst.operands[2].isreg)
9474         {
9475           /* For an immediate, we always generate a 32-bit opcode;
9476              section relaxation will shrink it later if possible.  */
9477           inst.instruction = THUMB_OP32 (inst.instruction);
9478           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9479           inst.instruction |= Rd << 8;
9480           inst.instruction |= Rs << 16;
9481           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9482         }
9483       else
9484         {
9485           bfd_boolean narrow;
9486
9487           /* See if we can do this with a 16-bit instruction.  */
9488           if (THUMB_SETS_FLAGS (inst.instruction))
9489             narrow = !in_it_block ();
9490           else
9491             narrow = in_it_block ();
9492
9493           if (Rd > 7 || Rn > 7 || Rs > 7)
9494             narrow = FALSE;
9495           if (inst.operands[2].shifted)
9496             narrow = FALSE;
9497           if (inst.size_req == 4)
9498             narrow = FALSE;
9499
9500           if (narrow)
9501             {
9502               if (Rd == Rs)
9503                 {
9504                   inst.instruction = THUMB_OP16 (inst.instruction);
9505                   inst.instruction |= Rd;
9506                   inst.instruction |= Rn << 3;
9507                   return;
9508                 }
9509               if (Rd == Rn)
9510                 {
9511                   inst.instruction = THUMB_OP16 (inst.instruction);
9512                   inst.instruction |= Rd;
9513                   inst.instruction |= Rs << 3;
9514                   return;
9515                 }
9516             }
9517
9518           /* If we get here, it can't be done in 16 bits.  */
9519           constraint (inst.operands[2].shifted
9520                       && inst.operands[2].immisreg,
9521                       _("shift must be constant"));
9522           inst.instruction = THUMB_OP32 (inst.instruction);
9523           inst.instruction |= Rd << 8;
9524           inst.instruction |= Rs << 16;
9525           encode_thumb32_shifted_operand (2);
9526         }
9527     }
9528   else
9529     {
9530       /* On its face this is a lie - the instruction does set the
9531          flags.  However, the only supported mnemonic in this mode
9532          says it doesn't.  */
9533       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9534
9535       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9536                   _("unshifted register required"));
9537       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9538
9539       inst.instruction = THUMB_OP16 (inst.instruction);
9540       inst.instruction |= Rd;
9541
9542       if (Rd == Rs)
9543         inst.instruction |= Rn << 3;
9544       else if (Rd == Rn)
9545         inst.instruction |= Rs << 3;
9546       else
9547         constraint (1, _("dest must overlap one source register"));
9548     }
9549 }
9550
9551 static void
9552 do_t_barrier (void)
9553 {
9554   if (inst.operands[0].present)
9555     {
9556       constraint ((inst.instruction & 0xf0) != 0x40
9557                   && inst.operands[0].imm > 0xf
9558                   && inst.operands[0].imm < 0x0,
9559                   _("bad barrier type"));
9560       inst.instruction |= inst.operands[0].imm;
9561     }
9562   else
9563     inst.instruction |= 0xf;
9564 }
9565
9566 static void
9567 do_t_bfc (void)
9568 {
9569   unsigned Rd;
9570   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
9571   constraint (msb > 32, _("bit-field extends past end of register"));
9572   /* The instruction encoding stores the LSB and MSB,
9573      not the LSB and width.  */
9574   Rd = inst.operands[0].reg;
9575   reject_bad_reg (Rd);
9576   inst.instruction |= Rd << 8;
9577   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
9578   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
9579   inst.instruction |= msb - 1;
9580 }
9581
9582 static void
9583 do_t_bfi (void)
9584 {
9585   int Rd, Rn;
9586   unsigned int msb;
9587
9588   Rd = inst.operands[0].reg;
9589   reject_bad_reg (Rd);
9590
9591   /* #0 in second position is alternative syntax for bfc, which is
9592      the same instruction but with REG_PC in the Rm field.  */
9593   if (!inst.operands[1].isreg)
9594     Rn = REG_PC;
9595   else
9596     {
9597       Rn = inst.operands[1].reg;
9598       reject_bad_reg (Rn);
9599     }
9600
9601   msb = inst.operands[2].imm + inst.operands[3].imm;
9602   constraint (msb > 32, _("bit-field extends past end of register"));
9603   /* The instruction encoding stores the LSB and MSB,
9604      not the LSB and width.  */
9605   inst.instruction |= Rd << 8;
9606   inst.instruction |= Rn << 16;
9607   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9608   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9609   inst.instruction |= msb - 1;
9610 }
9611
9612 static void
9613 do_t_bfx (void)
9614 {
9615   unsigned Rd, Rn;
9616
9617   Rd = inst.operands[0].reg;
9618   Rn = inst.operands[1].reg;
9619
9620   reject_bad_reg (Rd);
9621   reject_bad_reg (Rn);
9622
9623   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
9624               _("bit-field extends past end of register"));
9625   inst.instruction |= Rd << 8;
9626   inst.instruction |= Rn << 16;
9627   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9628   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9629   inst.instruction |= inst.operands[3].imm - 1;
9630 }
9631
9632 /* ARM V5 Thumb BLX (argument parse)
9633         BLX <target_addr>       which is BLX(1)
9634         BLX <Rm>                which is BLX(2)
9635    Unfortunately, there are two different opcodes for this mnemonic.
9636    So, the insns[].value is not used, and the code here zaps values
9637         into inst.instruction.
9638
9639    ??? How to take advantage of the additional two bits of displacement
9640    available in Thumb32 mode?  Need new relocation?  */
9641
9642 static void
9643 do_t_blx (void)
9644 {
9645   set_it_insn_type_last ();
9646
9647   if (inst.operands[0].isreg)
9648     {
9649       constraint (inst.operands[0].reg == REG_PC, BAD_PC);
9650       /* We have a register, so this is BLX(2).  */
9651       inst.instruction |= inst.operands[0].reg << 3;
9652     }
9653   else
9654     {
9655       /* No register.  This must be BLX(1).  */
9656       inst.instruction = 0xf000e800;
9657       inst.reloc.type = BFD_RELOC_THUMB_PCREL_BLX;
9658       inst.reloc.pc_rel = 1;
9659     }
9660 }
9661
9662 static void
9663 do_t_branch (void)
9664 {
9665   int opcode;
9666   int cond;
9667   int reloc;
9668
9669   cond = inst.cond;
9670   set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
9671
9672   if (in_it_block ())
9673     {
9674       /* Conditional branches inside IT blocks are encoded as unconditional
9675          branches.  */
9676       cond = COND_ALWAYS;
9677     }
9678   else
9679     cond = inst.cond;
9680
9681   if (cond != COND_ALWAYS)
9682     opcode = T_MNEM_bcond;
9683   else
9684     opcode = inst.instruction;
9685
9686   if (unified_syntax && inst.size_req == 4)
9687     {
9688       inst.instruction = THUMB_OP32(opcode);
9689       if (cond == COND_ALWAYS)
9690         reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
9691       else
9692         {
9693           gas_assert (cond != 0xF);
9694           inst.instruction |= cond << 22;
9695           reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
9696         }
9697     }
9698   else
9699     {
9700       inst.instruction = THUMB_OP16(opcode);
9701       if (cond == COND_ALWAYS)
9702         reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
9703       else
9704         {
9705           inst.instruction |= cond << 8;
9706           reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
9707         }
9708       /* Allow section relaxation.  */
9709       if (unified_syntax && inst.size_req != 2)
9710         inst.relax = opcode;
9711     }
9712   inst.reloc.type = reloc;
9713   inst.reloc.pc_rel = 1;
9714 }
9715
9716 static void
9717 do_t_bkpt (void)
9718 {
9719   constraint (inst.cond != COND_ALWAYS,
9720               _("instruction is always unconditional"));
9721   if (inst.operands[0].present)
9722     {
9723       constraint (inst.operands[0].imm > 255,
9724                   _("immediate value out of range"));
9725       inst.instruction |= inst.operands[0].imm;
9726       set_it_insn_type (NEUTRAL_IT_INSN);
9727     }
9728 }
9729
9730 static void
9731 do_t_branch23 (void)
9732 {
9733   set_it_insn_type_last ();
9734   inst.reloc.type   = BFD_RELOC_THUMB_PCREL_BRANCH23;
9735   inst.reloc.pc_rel = 1;
9736
9737 #if defined(OBJ_COFF)
9738   /* If the destination of the branch is a defined symbol which does not have
9739      the THUMB_FUNC attribute, then we must be calling a function which has
9740      the (interfacearm) attribute.  We look for the Thumb entry point to that
9741      function and change the branch to refer to that function instead.  */
9742   if (   inst.reloc.exp.X_op == O_symbol
9743       && inst.reloc.exp.X_add_symbol != NULL
9744       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
9745       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
9746     inst.reloc.exp.X_add_symbol =
9747       find_real_start (inst.reloc.exp.X_add_symbol);
9748 #endif
9749 }
9750
9751 static void
9752 do_t_bx (void)
9753 {
9754   set_it_insn_type_last ();
9755   inst.instruction |= inst.operands[0].reg << 3;
9756   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
9757      should cause the alignment to be checked once it is known.  This is
9758      because BX PC only works if the instruction is word aligned.  */
9759 }
9760
9761 static void
9762 do_t_bxj (void)
9763 {
9764   int Rm;
9765
9766   set_it_insn_type_last ();
9767   Rm = inst.operands[0].reg;
9768   reject_bad_reg (Rm);
9769   inst.instruction |= Rm << 16;
9770 }
9771
9772 static void
9773 do_t_clz (void)
9774 {
9775   unsigned Rd;
9776   unsigned Rm;
9777
9778   Rd = inst.operands[0].reg;
9779   Rm = inst.operands[1].reg;
9780
9781   reject_bad_reg (Rd);
9782   reject_bad_reg (Rm);
9783
9784   inst.instruction |= Rd << 8;
9785   inst.instruction |= Rm << 16;
9786   inst.instruction |= Rm;
9787 }
9788
9789 static void
9790 do_t_cps (void)
9791 {
9792   set_it_insn_type (OUTSIDE_IT_INSN);
9793   inst.instruction |= inst.operands[0].imm;
9794 }
9795
9796 static void
9797 do_t_cpsi (void)
9798 {
9799   set_it_insn_type (OUTSIDE_IT_INSN);
9800   if (unified_syntax
9801       && (inst.operands[1].present || inst.size_req == 4)
9802       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
9803     {
9804       unsigned int imod = (inst.instruction & 0x0030) >> 4;
9805       inst.instruction = 0xf3af8000;
9806       inst.instruction |= imod << 9;
9807       inst.instruction |= inst.operands[0].imm << 5;
9808       if (inst.operands[1].present)
9809         inst.instruction |= 0x100 | inst.operands[1].imm;
9810     }
9811   else
9812     {
9813       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
9814                   && (inst.operands[0].imm & 4),
9815                   _("selected processor does not support 'A' form "
9816                     "of this instruction"));
9817       constraint (inst.operands[1].present || inst.size_req == 4,
9818                   _("Thumb does not support the 2-argument "
9819                     "form of this instruction"));
9820       inst.instruction |= inst.operands[0].imm;
9821     }
9822 }
9823
9824 /* THUMB CPY instruction (argument parse).  */
9825
9826 static void
9827 do_t_cpy (void)
9828 {
9829   if (inst.size_req == 4)
9830     {
9831       inst.instruction = THUMB_OP32 (T_MNEM_mov);
9832       inst.instruction |= inst.operands[0].reg << 8;
9833       inst.instruction |= inst.operands[1].reg;
9834     }
9835   else
9836     {
9837       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
9838       inst.instruction |= (inst.operands[0].reg & 0x7);
9839       inst.instruction |= inst.operands[1].reg << 3;
9840     }
9841 }
9842
9843 static void
9844 do_t_cbz (void)
9845 {
9846   set_it_insn_type (OUTSIDE_IT_INSN);
9847   constraint (inst.operands[0].reg > 7, BAD_HIREG);
9848   inst.instruction |= inst.operands[0].reg;
9849   inst.reloc.pc_rel = 1;
9850   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
9851 }
9852
9853 static void
9854 do_t_dbg (void)
9855 {
9856   inst.instruction |= inst.operands[0].imm;
9857 }
9858
9859 static void
9860 do_t_div (void)
9861 {
9862   unsigned Rd, Rn, Rm;
9863
9864   Rd = inst.operands[0].reg;
9865   Rn = (inst.operands[1].present
9866         ? inst.operands[1].reg : Rd);
9867   Rm = inst.operands[2].reg;
9868
9869   reject_bad_reg (Rd);
9870   reject_bad_reg (Rn);
9871   reject_bad_reg (Rm);
9872
9873   inst.instruction |= Rd << 8;
9874   inst.instruction |= Rn << 16;
9875   inst.instruction |= Rm;
9876 }
9877
9878 static void
9879 do_t_hint (void)
9880 {
9881   if (unified_syntax && inst.size_req == 4)
9882     inst.instruction = THUMB_OP32 (inst.instruction);
9883   else
9884     inst.instruction = THUMB_OP16 (inst.instruction);
9885 }
9886
9887 static void
9888 do_t_it (void)
9889 {
9890   unsigned int cond = inst.operands[0].imm;
9891
9892   set_it_insn_type (IT_INSN);
9893   now_it.mask = (inst.instruction & 0xf) | 0x10;
9894   now_it.cc = cond;
9895
9896   /* If the condition is a negative condition, invert the mask.  */
9897   if ((cond & 0x1) == 0x0)
9898     {
9899       unsigned int mask = inst.instruction & 0x000f;
9900
9901       if ((mask & 0x7) == 0)
9902         /* no conversion needed */;
9903       else if ((mask & 0x3) == 0)
9904         mask ^= 0x8;
9905       else if ((mask & 0x1) == 0)
9906         mask ^= 0xC;
9907       else
9908         mask ^= 0xE;
9909
9910       inst.instruction &= 0xfff0;
9911       inst.instruction |= mask;
9912     }
9913
9914   inst.instruction |= cond << 4;
9915 }
9916
9917 /* Helper function used for both push/pop and ldm/stm.  */
9918 static void
9919 encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
9920 {
9921   bfd_boolean load;
9922
9923   load = (inst.instruction & (1 << 20)) != 0;
9924
9925   if (mask & (1 << 13))
9926     inst.error =  _("SP not allowed in register list");
9927
9928   if ((mask & (1 << base)) != 0
9929       && writeback)
9930     inst.error = _("having the base register in the register list when "
9931                    "using write back is UNPREDICTABLE");
9932
9933   if (load)
9934     {
9935       if (mask & (1 << 15))
9936         {
9937           if (mask & (1 << 14))
9938             inst.error = _("LR and PC should not both be in register list");
9939           else
9940             set_it_insn_type_last ();
9941         }
9942     }
9943   else
9944     {
9945       if (mask & (1 << 15))
9946         inst.error = _("PC not allowed in register list");
9947     }
9948
9949   if ((mask & (mask - 1)) == 0)
9950     {
9951       /* Single register transfers implemented as str/ldr.  */
9952       if (writeback)
9953         {
9954           if (inst.instruction & (1 << 23))
9955             inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
9956           else
9957             inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
9958         }
9959       else
9960         {
9961           if (inst.instruction & (1 << 23))
9962             inst.instruction = 0x00800000; /* ia -> [base] */
9963           else
9964             inst.instruction = 0x00000c04; /* db -> [base, #-4] */
9965         }
9966
9967       inst.instruction |= 0xf8400000;
9968       if (load)
9969         inst.instruction |= 0x00100000;
9970
9971       mask = ffs (mask) - 1;
9972       mask <<= 12;
9973     }
9974   else if (writeback)
9975     inst.instruction |= WRITE_BACK;
9976
9977   inst.instruction |= mask;
9978   inst.instruction |= base << 16;
9979 }
9980
9981 static void
9982 do_t_ldmstm (void)
9983 {
9984   /* This really doesn't seem worth it.  */
9985   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
9986               _("expression too complex"));
9987   constraint (inst.operands[1].writeback,
9988               _("Thumb load/store multiple does not support {reglist}^"));
9989
9990   if (unified_syntax)
9991     {
9992       bfd_boolean narrow;
9993       unsigned mask;
9994
9995       narrow = FALSE;
9996       /* See if we can use a 16-bit instruction.  */
9997       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
9998           && inst.size_req != 4
9999           && !(inst.operands[1].imm & ~0xff))
10000         {
10001           mask = 1 << inst.operands[0].reg;
10002
10003           if (inst.operands[0].reg <= 7)
10004             {
10005               if (inst.instruction == T_MNEM_stmia
10006                   ? inst.operands[0].writeback
10007                   : (inst.operands[0].writeback
10008                      == !(inst.operands[1].imm & mask)))
10009                 {
10010                   if (inst.instruction == T_MNEM_stmia
10011                       && (inst.operands[1].imm & mask)
10012                       && (inst.operands[1].imm & (mask - 1)))
10013                     as_warn (_("value stored for r%d is UNKNOWN"),
10014                              inst.operands[0].reg);
10015
10016                   inst.instruction = THUMB_OP16 (inst.instruction);
10017                   inst.instruction |= inst.operands[0].reg << 8;
10018                   inst.instruction |= inst.operands[1].imm;
10019                   narrow = TRUE;
10020                 }
10021               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10022                 {
10023                   /* This means 1 register in reg list one of 3 situations:
10024                      1. Instruction is stmia, but without writeback.
10025                      2. lmdia without writeback, but with Rn not in
10026                         reglist.
10027                      3. ldmia with writeback, but with Rn in reglist.
10028                      Case 3 is UNPREDICTABLE behaviour, so we handle
10029                      case 1 and 2 which can be converted into a 16-bit
10030                      str or ldr. The SP cases are handled below.  */
10031                   unsigned long opcode;
10032                   /* First, record an error for Case 3.  */
10033                   if (inst.operands[1].imm & mask
10034                       && inst.operands[0].writeback)
10035                     inst.error = 
10036                         _("having the base register in the register list when "
10037                           "using write back is UNPREDICTABLE");
10038                     
10039                   opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str 
10040                                                              : T_MNEM_ldr);
10041                   inst.instruction = THUMB_OP16 (opcode);
10042                   inst.instruction |= inst.operands[0].reg << 3;
10043                   inst.instruction |= (ffs (inst.operands[1].imm)-1);
10044                   narrow = TRUE;
10045                 }
10046             }
10047           else if (inst.operands[0] .reg == REG_SP)
10048             {
10049               if (inst.operands[0].writeback)
10050                 {
10051                   inst.instruction = 
10052                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10053                                     ? T_MNEM_push : T_MNEM_pop);
10054                   inst.instruction |= inst.operands[1].imm;
10055                   narrow = TRUE;
10056                 }
10057               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10058                 {
10059                   inst.instruction = 
10060                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10061                                     ? T_MNEM_str_sp : T_MNEM_ldr_sp);
10062                   inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
10063                   narrow = TRUE;
10064                 }
10065             }
10066         }
10067
10068       if (!narrow)
10069         {
10070           if (inst.instruction < 0xffff)
10071             inst.instruction = THUMB_OP32 (inst.instruction);
10072
10073           encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
10074                                 inst.operands[0].writeback);
10075         }
10076     }
10077   else
10078     {
10079       constraint (inst.operands[0].reg > 7
10080                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
10081       constraint (inst.instruction != T_MNEM_ldmia
10082                   && inst.instruction != T_MNEM_stmia,
10083                   _("Thumb-2 instruction only valid in unified syntax"));
10084       if (inst.instruction == T_MNEM_stmia)
10085         {
10086           if (!inst.operands[0].writeback)
10087             as_warn (_("this instruction will write back the base register"));
10088           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
10089               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
10090             as_warn (_("value stored for r%d is UNKNOWN"),
10091                      inst.operands[0].reg);
10092         }
10093       else
10094         {
10095           if (!inst.operands[0].writeback
10096               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
10097             as_warn (_("this instruction will write back the base register"));
10098           else if (inst.operands[0].writeback
10099                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
10100             as_warn (_("this instruction will not write back the base register"));
10101         }
10102
10103       inst.instruction = THUMB_OP16 (inst.instruction);
10104       inst.instruction |= inst.operands[0].reg << 8;
10105       inst.instruction |= inst.operands[1].imm;
10106     }
10107 }
10108
10109 static void
10110 do_t_ldrex (void)
10111 {
10112   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
10113               || inst.operands[1].postind || inst.operands[1].writeback
10114               || inst.operands[1].immisreg || inst.operands[1].shifted
10115               || inst.operands[1].negative,
10116               BAD_ADDR_MODE);
10117
10118   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
10119
10120   inst.instruction |= inst.operands[0].reg << 12;
10121   inst.instruction |= inst.operands[1].reg << 16;
10122   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10123 }
10124
10125 static void
10126 do_t_ldrexd (void)
10127 {
10128   if (!inst.operands[1].present)
10129     {
10130       constraint (inst.operands[0].reg == REG_LR,
10131                   _("r14 not allowed as first register "
10132                     "when second register is omitted"));
10133       inst.operands[1].reg = inst.operands[0].reg + 1;
10134     }
10135   constraint (inst.operands[0].reg == inst.operands[1].reg,
10136               BAD_OVERLAP);
10137
10138   inst.instruction |= inst.operands[0].reg << 12;
10139   inst.instruction |= inst.operands[1].reg << 8;
10140   inst.instruction |= inst.operands[2].reg << 16;
10141 }
10142
10143 static void
10144 do_t_ldst (void)
10145 {
10146   unsigned long opcode;
10147   int Rn;
10148
10149   if (inst.operands[0].isreg
10150       && !inst.operands[0].preind
10151       && inst.operands[0].reg == REG_PC)
10152     set_it_insn_type_last ();
10153
10154   opcode = inst.instruction;
10155   if (unified_syntax)
10156     {
10157       if (!inst.operands[1].isreg)
10158         {
10159           if (opcode <= 0xffff)
10160             inst.instruction = THUMB_OP32 (opcode);
10161           if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10162             return;
10163         }
10164       if (inst.operands[1].isreg
10165           && !inst.operands[1].writeback
10166           && !inst.operands[1].shifted && !inst.operands[1].postind
10167           && !inst.operands[1].negative && inst.operands[0].reg <= 7
10168           && opcode <= 0xffff
10169           && inst.size_req != 4)
10170         {
10171           /* Insn may have a 16-bit form.  */
10172           Rn = inst.operands[1].reg;
10173           if (inst.operands[1].immisreg)
10174             {
10175               inst.instruction = THUMB_OP16 (opcode);
10176               /* [Rn, Rik] */
10177               if (Rn <= 7 && inst.operands[1].imm <= 7)
10178                 goto op16;
10179               else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
10180                 reject_bad_reg (inst.operands[1].imm);
10181             }
10182           else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
10183                     && opcode != T_MNEM_ldrsb)
10184                    || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
10185                    || (Rn == REG_SP && opcode == T_MNEM_str))
10186             {
10187               /* [Rn, #const] */
10188               if (Rn > 7)
10189                 {
10190                   if (Rn == REG_PC)
10191                     {
10192                       if (inst.reloc.pc_rel)
10193                         opcode = T_MNEM_ldr_pc2;
10194                       else
10195                         opcode = T_MNEM_ldr_pc;
10196                     }
10197                   else
10198                     {
10199                       if (opcode == T_MNEM_ldr)
10200                         opcode = T_MNEM_ldr_sp;
10201                       else
10202                         opcode = T_MNEM_str_sp;
10203                     }
10204                   inst.instruction = inst.operands[0].reg << 8;
10205                 }
10206               else
10207                 {
10208                   inst.instruction = inst.operands[0].reg;
10209                   inst.instruction |= inst.operands[1].reg << 3;
10210                 }
10211               inst.instruction |= THUMB_OP16 (opcode);
10212               if (inst.size_req == 2)
10213                 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10214               else
10215                 inst.relax = opcode;
10216               return;
10217             }
10218         }
10219       /* Definitely a 32-bit variant.  */
10220
10221       /* Do some validations regarding addressing modes.  */
10222       if (inst.operands[1].immisreg && opcode != T_MNEM_ldr
10223           && opcode != T_MNEM_str)
10224         reject_bad_reg (inst.operands[1].imm);
10225
10226       inst.instruction = THUMB_OP32 (opcode);
10227       inst.instruction |= inst.operands[0].reg << 12;
10228       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
10229       return;
10230     }
10231
10232   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10233
10234   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
10235     {
10236       /* Only [Rn,Rm] is acceptable.  */
10237       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10238       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10239                   || inst.operands[1].postind || inst.operands[1].shifted
10240                   || inst.operands[1].negative,
10241                   _("Thumb does not support this addressing mode"));
10242       inst.instruction = THUMB_OP16 (inst.instruction);
10243       goto op16;
10244     }
10245
10246   inst.instruction = THUMB_OP16 (inst.instruction);
10247   if (!inst.operands[1].isreg)
10248     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10249       return;
10250
10251   constraint (!inst.operands[1].preind
10252               || inst.operands[1].shifted
10253               || inst.operands[1].writeback,
10254               _("Thumb does not support this addressing mode"));
10255   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
10256     {
10257       constraint (inst.instruction & 0x0600,
10258                   _("byte or halfword not valid for base register"));
10259       constraint (inst.operands[1].reg == REG_PC
10260                   && !(inst.instruction & THUMB_LOAD_BIT),
10261                   _("r15 based store not allowed"));
10262       constraint (inst.operands[1].immisreg,
10263                   _("invalid base register for register offset"));
10264
10265       if (inst.operands[1].reg == REG_PC)
10266         inst.instruction = T_OPCODE_LDR_PC;
10267       else if (inst.instruction & THUMB_LOAD_BIT)
10268         inst.instruction = T_OPCODE_LDR_SP;
10269       else
10270         inst.instruction = T_OPCODE_STR_SP;
10271
10272       inst.instruction |= inst.operands[0].reg << 8;
10273       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10274       return;
10275     }
10276
10277   constraint (inst.operands[1].reg > 7, BAD_HIREG);
10278   if (!inst.operands[1].immisreg)
10279     {
10280       /* Immediate offset.  */
10281       inst.instruction |= inst.operands[0].reg;
10282       inst.instruction |= inst.operands[1].reg << 3;
10283       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10284       return;
10285     }
10286
10287   /* Register offset.  */
10288   constraint (inst.operands[1].imm > 7, BAD_HIREG);
10289   constraint (inst.operands[1].negative,
10290               _("Thumb does not support this addressing mode"));
10291
10292  op16:
10293   switch (inst.instruction)
10294     {
10295     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10296     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10297     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10298     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10299     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10300     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10301     case 0x5600 /* ldrsb */:
10302     case 0x5e00 /* ldrsh */: break;
10303     default: abort ();
10304     }
10305
10306   inst.instruction |= inst.operands[0].reg;
10307   inst.instruction |= inst.operands[1].reg << 3;
10308   inst.instruction |= inst.operands[1].imm << 6;
10309 }
10310
10311 static void
10312 do_t_ldstd (void)
10313 {
10314   if (!inst.operands[1].present)
10315     {
10316       inst.operands[1].reg = inst.operands[0].reg + 1;
10317       constraint (inst.operands[0].reg == REG_LR,
10318                   _("r14 not allowed here"));
10319     }
10320   inst.instruction |= inst.operands[0].reg << 12;
10321   inst.instruction |= inst.operands[1].reg << 8;
10322   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
10323 }
10324
10325 static void
10326 do_t_ldstt (void)
10327 {
10328   inst.instruction |= inst.operands[0].reg << 12;
10329   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
10330 }
10331
10332 static void
10333 do_t_mla (void)
10334 {
10335   unsigned Rd, Rn, Rm, Ra;
10336
10337   Rd = inst.operands[0].reg;
10338   Rn = inst.operands[1].reg;
10339   Rm = inst.operands[2].reg;
10340   Ra = inst.operands[3].reg;
10341
10342   reject_bad_reg (Rd);
10343   reject_bad_reg (Rn);
10344   reject_bad_reg (Rm);
10345   reject_bad_reg (Ra);
10346
10347   inst.instruction |= Rd << 8;
10348   inst.instruction |= Rn << 16;
10349   inst.instruction |= Rm;
10350   inst.instruction |= Ra << 12;
10351 }
10352
10353 static void
10354 do_t_mlal (void)
10355 {
10356   unsigned RdLo, RdHi, Rn, Rm;
10357
10358   RdLo = inst.operands[0].reg;
10359   RdHi = inst.operands[1].reg;
10360   Rn = inst.operands[2].reg;
10361   Rm = inst.operands[3].reg;
10362
10363   reject_bad_reg (RdLo);
10364   reject_bad_reg (RdHi);
10365   reject_bad_reg (Rn);
10366   reject_bad_reg (Rm);
10367
10368   inst.instruction |= RdLo << 12;
10369   inst.instruction |= RdHi << 8;
10370   inst.instruction |= Rn << 16;
10371   inst.instruction |= Rm;
10372 }
10373
10374 static void
10375 do_t_mov_cmp (void)
10376 {
10377   unsigned Rn, Rm;
10378
10379   Rn = inst.operands[0].reg;
10380   Rm = inst.operands[1].reg;
10381
10382   if (Rn == REG_PC)
10383     set_it_insn_type_last ();
10384
10385   if (unified_syntax)
10386     {
10387       int r0off = (inst.instruction == T_MNEM_mov
10388                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
10389       unsigned long opcode;
10390       bfd_boolean narrow;
10391       bfd_boolean low_regs;
10392
10393       low_regs = (Rn <= 7 && Rm <= 7);
10394       opcode = inst.instruction;
10395       if (in_it_block ())
10396         narrow = opcode != T_MNEM_movs;
10397       else
10398         narrow = opcode != T_MNEM_movs || low_regs;
10399       if (inst.size_req == 4
10400           || inst.operands[1].shifted)
10401         narrow = FALSE;
10402
10403       /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
10404       if (opcode == T_MNEM_movs && inst.operands[1].isreg
10405           && !inst.operands[1].shifted
10406           && Rn == REG_PC
10407           && Rm == REG_LR)
10408         {
10409           inst.instruction = T2_SUBS_PC_LR;
10410           return;
10411         }
10412
10413       if (opcode == T_MNEM_cmp)
10414         {
10415           constraint (Rn == REG_PC, BAD_PC);
10416           if (narrow)
10417             {
10418               /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
10419                  but valid.  */
10420               warn_deprecated_sp (Rm);
10421               /* R15 was documented as a valid choice for Rm in ARMv6,
10422                  but as UNPREDICTABLE in ARMv7.  ARM's proprietary
10423                  tools reject R15, so we do too.  */
10424               constraint (Rm == REG_PC, BAD_PC);
10425             }
10426           else
10427             reject_bad_reg (Rm);
10428         }
10429       else if (opcode == T_MNEM_mov
10430                || opcode == T_MNEM_movs)
10431         {
10432           if (inst.operands[1].isreg)
10433             {
10434               if (opcode == T_MNEM_movs)
10435                 {
10436                   reject_bad_reg (Rn);
10437                   reject_bad_reg (Rm);
10438                 }
10439               else if (narrow)
10440                 {
10441                   /* This is mov.n.  */
10442                   if ((Rn == REG_SP || Rn == REG_PC)
10443                       && (Rm == REG_SP || Rm == REG_PC))
10444                     {
10445                       as_warn (_("Use of r%u as a source register is "
10446                                  "deprecated when r%u is the destination "
10447                                  "register."), Rm, Rn);
10448                     }
10449                 }
10450               else
10451                 {
10452                   /* This is mov.w.  */
10453                   constraint (Rn == REG_PC, BAD_PC);
10454                   constraint (Rm == REG_PC, BAD_PC);
10455                   constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
10456                 }
10457             }
10458           else
10459             reject_bad_reg (Rn);
10460         }
10461
10462       if (!inst.operands[1].isreg)
10463         {
10464           /* Immediate operand.  */
10465           if (!in_it_block () && opcode == T_MNEM_mov)
10466             narrow = 0;
10467           if (low_regs && narrow)
10468             {
10469               inst.instruction = THUMB_OP16 (opcode);
10470               inst.instruction |= Rn << 8;
10471               if (inst.size_req == 2)
10472                 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10473               else
10474                 inst.relax = opcode;
10475             }
10476           else
10477             {
10478               inst.instruction = THUMB_OP32 (inst.instruction);
10479               inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10480               inst.instruction |= Rn << r0off;
10481               inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10482             }
10483         }
10484       else if (inst.operands[1].shifted && inst.operands[1].immisreg
10485                && (inst.instruction == T_MNEM_mov
10486                    || inst.instruction == T_MNEM_movs))
10487         {
10488           /* Register shifts are encoded as separate shift instructions.  */
10489           bfd_boolean flags = (inst.instruction == T_MNEM_movs);
10490
10491           if (in_it_block ())
10492             narrow = !flags;
10493           else
10494             narrow = flags;
10495
10496           if (inst.size_req == 4)
10497             narrow = FALSE;
10498
10499           if (!low_regs || inst.operands[1].imm > 7)
10500             narrow = FALSE;
10501
10502           if (Rn != Rm)
10503             narrow = FALSE;
10504
10505           switch (inst.operands[1].shift_kind)
10506             {
10507             case SHIFT_LSL:
10508               opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
10509               break;
10510             case SHIFT_ASR:
10511               opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
10512               break;
10513             case SHIFT_LSR:
10514               opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
10515               break;
10516             case SHIFT_ROR:
10517               opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
10518               break;
10519             default:
10520               abort ();
10521             }
10522
10523           inst.instruction = opcode;
10524           if (narrow)
10525             {
10526               inst.instruction |= Rn;
10527               inst.instruction |= inst.operands[1].imm << 3;
10528             }
10529           else
10530             {
10531               if (flags)
10532                 inst.instruction |= CONDS_BIT;
10533
10534               inst.instruction |= Rn << 8;
10535               inst.instruction |= Rm << 16;
10536               inst.instruction |= inst.operands[1].imm;
10537             }
10538         }
10539       else if (!narrow)
10540         {
10541           /* Some mov with immediate shift have narrow variants.
10542              Register shifts are handled above.  */
10543           if (low_regs && inst.operands[1].shifted
10544               && (inst.instruction == T_MNEM_mov
10545                   || inst.instruction == T_MNEM_movs))
10546             {
10547               if (in_it_block ())
10548                 narrow = (inst.instruction == T_MNEM_mov);
10549               else
10550                 narrow = (inst.instruction == T_MNEM_movs);
10551             }
10552
10553           if (narrow)
10554             {
10555               switch (inst.operands[1].shift_kind)
10556                 {
10557                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
10558                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
10559                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
10560                 default: narrow = FALSE; break;
10561                 }
10562             }
10563
10564           if (narrow)
10565             {
10566               inst.instruction |= Rn;
10567               inst.instruction |= Rm << 3;
10568               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
10569             }
10570           else
10571             {
10572               inst.instruction = THUMB_OP32 (inst.instruction);
10573               inst.instruction |= Rn << r0off;
10574               encode_thumb32_shifted_operand (1);
10575             }
10576         }
10577       else
10578         switch (inst.instruction)
10579           {
10580           case T_MNEM_mov:
10581             inst.instruction = T_OPCODE_MOV_HR;
10582             inst.instruction |= (Rn & 0x8) << 4;
10583             inst.instruction |= (Rn & 0x7);
10584             inst.instruction |= Rm << 3;
10585             break;
10586
10587           case T_MNEM_movs:
10588             /* We know we have low registers at this point.
10589                Generate LSLS Rd, Rs, #0.  */
10590             inst.instruction = T_OPCODE_LSL_I;
10591             inst.instruction |= Rn;
10592             inst.instruction |= Rm << 3;
10593             break;
10594
10595           case T_MNEM_cmp:
10596             if (low_regs)
10597               {
10598                 inst.instruction = T_OPCODE_CMP_LR;
10599                 inst.instruction |= Rn;
10600                 inst.instruction |= Rm << 3;
10601               }
10602             else
10603               {
10604                 inst.instruction = T_OPCODE_CMP_HR;
10605                 inst.instruction |= (Rn & 0x8) << 4;
10606                 inst.instruction |= (Rn & 0x7);
10607                 inst.instruction |= Rm << 3;
10608               }
10609             break;
10610           }
10611       return;
10612     }
10613
10614   inst.instruction = THUMB_OP16 (inst.instruction);
10615
10616   /* PR 10443: Do not silently ignore shifted operands.  */
10617   constraint (inst.operands[1].shifted,
10618               _("shifts in CMP/MOV instructions are only supported in unified syntax"));
10619
10620   if (inst.operands[1].isreg)
10621     {
10622       if (Rn < 8 && Rm < 8)
10623         {
10624           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
10625              since a MOV instruction produces unpredictable results.  */
10626           if (inst.instruction == T_OPCODE_MOV_I8)
10627             inst.instruction = T_OPCODE_ADD_I3;
10628           else
10629             inst.instruction = T_OPCODE_CMP_LR;
10630
10631           inst.instruction |= Rn;
10632           inst.instruction |= Rm << 3;
10633         }
10634       else
10635         {
10636           if (inst.instruction == T_OPCODE_MOV_I8)
10637             inst.instruction = T_OPCODE_MOV_HR;
10638           else
10639             inst.instruction = T_OPCODE_CMP_HR;
10640           do_t_cpy ();
10641         }
10642     }
10643   else
10644     {
10645       constraint (Rn > 7,
10646                   _("only lo regs allowed with immediate"));
10647       inst.instruction |= Rn << 8;
10648       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10649     }
10650 }
10651
10652 static void
10653 do_t_mov16 (void)
10654 {
10655   unsigned Rd;
10656   bfd_vma imm;
10657   bfd_boolean top;
10658
10659   top = (inst.instruction & 0x00800000) != 0;
10660   if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
10661     {
10662       constraint (top, _(":lower16: not allowed this instruction"));
10663       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
10664     }
10665   else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
10666     {
10667       constraint (!top, _(":upper16: not allowed this instruction"));
10668       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
10669     }
10670
10671   Rd = inst.operands[0].reg;
10672   reject_bad_reg (Rd);
10673
10674   inst.instruction |= Rd << 8;
10675   if (inst.reloc.type == BFD_RELOC_UNUSED)
10676     {
10677       imm = inst.reloc.exp.X_add_number;
10678       inst.instruction |= (imm & 0xf000) << 4;
10679       inst.instruction |= (imm & 0x0800) << 15;
10680       inst.instruction |= (imm & 0x0700) << 4;
10681       inst.instruction |= (imm & 0x00ff);
10682     }
10683 }
10684
10685 static void
10686 do_t_mvn_tst (void)
10687 {
10688   unsigned Rn, Rm;
10689
10690   Rn = inst.operands[0].reg;
10691   Rm = inst.operands[1].reg;
10692
10693   if (inst.instruction == T_MNEM_cmp
10694       || inst.instruction == T_MNEM_cmn)
10695     constraint (Rn == REG_PC, BAD_PC);
10696   else
10697     reject_bad_reg (Rn);
10698   reject_bad_reg (Rm);
10699
10700   if (unified_syntax)
10701     {
10702       int r0off = (inst.instruction == T_MNEM_mvn
10703                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
10704       bfd_boolean narrow;
10705
10706       if (inst.size_req == 4
10707           || inst.instruction > 0xffff
10708           || inst.operands[1].shifted
10709           || Rn > 7 || Rm > 7)
10710         narrow = FALSE;
10711       else if (inst.instruction == T_MNEM_cmn)
10712         narrow = TRUE;
10713       else if (THUMB_SETS_FLAGS (inst.instruction))
10714         narrow = !in_it_block ();
10715       else
10716         narrow = in_it_block ();
10717
10718       if (!inst.operands[1].isreg)
10719         {
10720           /* For an immediate, we always generate a 32-bit opcode;
10721              section relaxation will shrink it later if possible.  */
10722           if (inst.instruction < 0xffff)
10723             inst.instruction = THUMB_OP32 (inst.instruction);
10724           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10725           inst.instruction |= Rn << r0off;
10726           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10727         }
10728       else
10729         {
10730           /* See if we can do this with a 16-bit instruction.  */
10731           if (narrow)
10732             {
10733               inst.instruction = THUMB_OP16 (inst.instruction);
10734               inst.instruction |= Rn;
10735               inst.instruction |= Rm << 3;
10736             }
10737           else
10738             {
10739               constraint (inst.operands[1].shifted
10740                           && inst.operands[1].immisreg,
10741                           _("shift must be constant"));
10742               if (inst.instruction < 0xffff)
10743                 inst.instruction = THUMB_OP32 (inst.instruction);
10744               inst.instruction |= Rn << r0off;
10745               encode_thumb32_shifted_operand (1);
10746             }
10747         }
10748     }
10749   else
10750     {
10751       constraint (inst.instruction > 0xffff
10752                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
10753       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
10754                   _("unshifted register required"));
10755       constraint (Rn > 7 || Rm > 7,
10756                   BAD_HIREG);
10757
10758       inst.instruction = THUMB_OP16 (inst.instruction);
10759       inst.instruction |= Rn;
10760       inst.instruction |= Rm << 3;
10761     }
10762 }
10763
10764 static void
10765 do_t_mrs (void)
10766 {
10767   unsigned Rd;
10768
10769   if (do_vfp_nsyn_mrs () == SUCCESS)
10770     return;
10771
10772   Rd = inst.operands[0].reg;
10773   reject_bad_reg (Rd);
10774   inst.instruction |= Rd << 8;
10775
10776   if (inst.operands[1].isreg)
10777     {
10778       unsigned br = inst.operands[1].reg;
10779       if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
10780         as_bad (_("bad register for mrs"));
10781
10782       inst.instruction |= br & (0xf << 16);
10783       inst.instruction |= (br & 0x300) >> 4;
10784       inst.instruction |= (br & SPSR_BIT) >> 2;
10785     }
10786   else
10787     {
10788       int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
10789
10790       if (flags == 0)
10791         {
10792           constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_m),
10793                       _("selected processor does not support "
10794                         "requested special purpose register"));
10795         }
10796       else
10797         {
10798           constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
10799                       _("selected processor does not support "
10800                         "requested special purpose register"));
10801           /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
10802           constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
10803                       _("'CPSR' or 'SPSR' expected"));
10804         }
10805
10806       inst.instruction |= (flags & SPSR_BIT) >> 2;
10807       inst.instruction |= inst.operands[1].imm & 0xff;
10808       inst.instruction |= 0xf0000;
10809     }
10810 }
10811
10812 static void
10813 do_t_msr (void)
10814 {
10815   int flags;
10816   unsigned Rn;
10817
10818   if (do_vfp_nsyn_msr () == SUCCESS)
10819     return;
10820
10821   constraint (!inst.operands[1].isreg,
10822               _("Thumb encoding does not support an immediate here"));
10823
10824   if (inst.operands[0].isreg)
10825     flags = (int)(inst.operands[0].reg);
10826   else
10827     flags = inst.operands[0].imm;
10828
10829   if (flags & ~0xff)
10830     {
10831       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
10832                   _("selected processor does not support "
10833                     "requested special purpose register"));
10834     }
10835   else
10836     {
10837       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_m),
10838                   _("selected processor does not support "
10839                     "requested special purpose register"));
10840       flags |= PSR_f;
10841     }
10842
10843   Rn = inst.operands[1].reg;
10844   reject_bad_reg (Rn);
10845
10846   inst.instruction |= (flags & SPSR_BIT) >> 2;
10847   inst.instruction |= (flags & 0xf0000) >> 8;
10848   inst.instruction |= (flags & 0x300) >> 4;
10849   inst.instruction |= (flags & 0xff);
10850   inst.instruction |= Rn << 16;
10851 }
10852
10853 static void
10854 do_t_mul (void)
10855 {
10856   bfd_boolean narrow;
10857   unsigned Rd, Rn, Rm;
10858
10859   if (!inst.operands[2].present)
10860     inst.operands[2].reg = inst.operands[0].reg;
10861
10862   Rd = inst.operands[0].reg;
10863   Rn = inst.operands[1].reg;
10864   Rm = inst.operands[2].reg;
10865
10866   if (unified_syntax)
10867     {
10868       if (inst.size_req == 4
10869           || (Rd != Rn
10870               && Rd != Rm)
10871           || Rn > 7
10872           || Rm > 7)
10873         narrow = FALSE;
10874       else if (inst.instruction == T_MNEM_muls)
10875         narrow = !in_it_block ();
10876       else
10877         narrow = in_it_block ();
10878     }
10879   else
10880     {
10881       constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
10882       constraint (Rn > 7 || Rm > 7,
10883                   BAD_HIREG);
10884       narrow = TRUE;
10885     }
10886
10887   if (narrow)
10888     {
10889       /* 16-bit MULS/Conditional MUL.  */
10890       inst.instruction = THUMB_OP16 (inst.instruction);
10891       inst.instruction |= Rd;
10892
10893       if (Rd == Rn)
10894         inst.instruction |= Rm << 3;
10895       else if (Rd == Rm)
10896         inst.instruction |= Rn << 3;
10897       else
10898         constraint (1, _("dest must overlap one source register"));
10899     }
10900   else
10901     {
10902       constraint (inst.instruction != T_MNEM_mul,
10903                   _("Thumb-2 MUL must not set flags"));
10904       /* 32-bit MUL.  */
10905       inst.instruction = THUMB_OP32 (inst.instruction);
10906       inst.instruction |= Rd << 8;
10907       inst.instruction |= Rn << 16;
10908       inst.instruction |= Rm << 0;
10909
10910       reject_bad_reg (Rd);
10911       reject_bad_reg (Rn);
10912       reject_bad_reg (Rm);
10913     }
10914 }
10915
10916 static void
10917 do_t_mull (void)
10918 {
10919   unsigned RdLo, RdHi, Rn, Rm;
10920
10921   RdLo = inst.operands[0].reg;
10922   RdHi = inst.operands[1].reg;
10923   Rn = inst.operands[2].reg;
10924   Rm = inst.operands[3].reg;
10925
10926   reject_bad_reg (RdLo);
10927   reject_bad_reg (RdHi);
10928   reject_bad_reg (Rn);
10929   reject_bad_reg (Rm);
10930
10931   inst.instruction |= RdLo << 12;
10932   inst.instruction |= RdHi << 8;
10933   inst.instruction |= Rn << 16;
10934   inst.instruction |= Rm;
10935
10936  if (RdLo == RdHi)
10937     as_tsktsk (_("rdhi and rdlo must be different"));
10938 }
10939
10940 static void
10941 do_t_nop (void)
10942 {
10943   set_it_insn_type (NEUTRAL_IT_INSN);
10944
10945   if (unified_syntax)
10946     {
10947       if (inst.size_req == 4 || inst.operands[0].imm > 15)
10948         {
10949           inst.instruction = THUMB_OP32 (inst.instruction);
10950           inst.instruction |= inst.operands[0].imm;
10951         }
10952       else
10953         {
10954           /* PR9722: Check for Thumb2 availability before
10955              generating a thumb2 nop instruction.  */
10956           if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
10957             {
10958               inst.instruction = THUMB_OP16 (inst.instruction);
10959               inst.instruction |= inst.operands[0].imm << 4;
10960             }
10961           else
10962             inst.instruction = 0x46c0;
10963         }
10964     }
10965   else
10966     {
10967       constraint (inst.operands[0].present,
10968                   _("Thumb does not support NOP with hints"));
10969       inst.instruction = 0x46c0;
10970     }
10971 }
10972
10973 static void
10974 do_t_neg (void)
10975 {
10976   if (unified_syntax)
10977     {
10978       bfd_boolean narrow;
10979
10980       if (THUMB_SETS_FLAGS (inst.instruction))
10981         narrow = !in_it_block ();
10982       else
10983         narrow = in_it_block ();
10984       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
10985         narrow = FALSE;
10986       if (inst.size_req == 4)
10987         narrow = FALSE;
10988
10989       if (!narrow)
10990         {
10991           inst.instruction = THUMB_OP32 (inst.instruction);
10992           inst.instruction |= inst.operands[0].reg << 8;
10993           inst.instruction |= inst.operands[1].reg << 16;
10994         }
10995       else
10996         {
10997           inst.instruction = THUMB_OP16 (inst.instruction);
10998           inst.instruction |= inst.operands[0].reg;
10999           inst.instruction |= inst.operands[1].reg << 3;
11000         }
11001     }
11002   else
11003     {
11004       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
11005                   BAD_HIREG);
11006       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11007
11008       inst.instruction = THUMB_OP16 (inst.instruction);
11009       inst.instruction |= inst.operands[0].reg;
11010       inst.instruction |= inst.operands[1].reg << 3;
11011     }
11012 }
11013
11014 static void
11015 do_t_orn (void)
11016 {
11017   unsigned Rd, Rn;
11018
11019   Rd = inst.operands[0].reg;
11020   Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
11021
11022   reject_bad_reg (Rd);
11023   /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN.  */
11024   reject_bad_reg (Rn);
11025
11026   inst.instruction |= Rd << 8;
11027   inst.instruction |= Rn << 16;
11028
11029   if (!inst.operands[2].isreg)
11030     {
11031       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11032       inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11033     }
11034   else
11035     {
11036       unsigned Rm;
11037
11038       Rm = inst.operands[2].reg;
11039       reject_bad_reg (Rm);
11040
11041       constraint (inst.operands[2].shifted
11042                   && inst.operands[2].immisreg,
11043                   _("shift must be constant"));
11044       encode_thumb32_shifted_operand (2);
11045     }
11046 }
11047
11048 static void
11049 do_t_pkhbt (void)
11050 {
11051   unsigned Rd, Rn, Rm;
11052
11053   Rd = inst.operands[0].reg;
11054   Rn = inst.operands[1].reg;
11055   Rm = inst.operands[2].reg;
11056
11057   reject_bad_reg (Rd);
11058   reject_bad_reg (Rn);
11059   reject_bad_reg (Rm);
11060
11061   inst.instruction |= Rd << 8;
11062   inst.instruction |= Rn << 16;
11063   inst.instruction |= Rm;
11064   if (inst.operands[3].present)
11065     {
11066       unsigned int val = inst.reloc.exp.X_add_number;
11067       constraint (inst.reloc.exp.X_op != O_constant,
11068                   _("expression too complex"));
11069       inst.instruction |= (val & 0x1c) << 10;
11070       inst.instruction |= (val & 0x03) << 6;
11071     }
11072 }
11073
11074 static void
11075 do_t_pkhtb (void)
11076 {
11077   if (!inst.operands[3].present)
11078     {
11079       unsigned Rtmp;
11080
11081       inst.instruction &= ~0x00000020;
11082
11083       /* PR 10168.  Swap the Rm and Rn registers.  */
11084       Rtmp = inst.operands[1].reg;
11085       inst.operands[1].reg = inst.operands[2].reg;
11086       inst.operands[2].reg = Rtmp;
11087     }
11088   do_t_pkhbt ();
11089 }
11090
11091 static void
11092 do_t_pld (void)
11093 {
11094   if (inst.operands[0].immisreg)
11095     reject_bad_reg (inst.operands[0].imm);
11096
11097   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
11098 }
11099
11100 static void
11101 do_t_push_pop (void)
11102 {
11103   unsigned mask;
11104
11105   constraint (inst.operands[0].writeback,
11106               _("push/pop do not support {reglist}^"));
11107   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11108               _("expression too complex"));
11109
11110   mask = inst.operands[0].imm;
11111   if ((mask & ~0xff) == 0)
11112     inst.instruction = THUMB_OP16 (inst.instruction) | mask;
11113   else if ((inst.instruction == T_MNEM_push
11114             && (mask & ~0xff) == 1 << REG_LR)
11115            || (inst.instruction == T_MNEM_pop
11116                && (mask & ~0xff) == 1 << REG_PC))
11117     {
11118       inst.instruction = THUMB_OP16 (inst.instruction);
11119       inst.instruction |= THUMB_PP_PC_LR;
11120       inst.instruction |= mask & 0xff;
11121     }
11122   else if (unified_syntax)
11123     {
11124       inst.instruction = THUMB_OP32 (inst.instruction);
11125       encode_thumb2_ldmstm (13, mask, TRUE);
11126     }
11127   else
11128     {
11129       inst.error = _("invalid register list to push/pop instruction");
11130       return;
11131     }
11132 }
11133
11134 static void
11135 do_t_rbit (void)
11136 {
11137   unsigned Rd, Rm;
11138
11139   Rd = inst.operands[0].reg;
11140   Rm = inst.operands[1].reg;
11141
11142   reject_bad_reg (Rd);
11143   reject_bad_reg (Rm);
11144
11145   inst.instruction |= Rd << 8;
11146   inst.instruction |= Rm << 16;
11147   inst.instruction |= Rm;
11148 }
11149
11150 static void
11151 do_t_rev (void)
11152 {
11153   unsigned Rd, Rm;
11154
11155   Rd = inst.operands[0].reg;
11156   Rm = inst.operands[1].reg;
11157
11158   reject_bad_reg (Rd);
11159   reject_bad_reg (Rm);
11160
11161   if (Rd <= 7 && Rm <= 7
11162       && inst.size_req != 4)
11163     {
11164       inst.instruction = THUMB_OP16 (inst.instruction);
11165       inst.instruction |= Rd;
11166       inst.instruction |= Rm << 3;
11167     }
11168   else if (unified_syntax)
11169     {
11170       inst.instruction = THUMB_OP32 (inst.instruction);
11171       inst.instruction |= Rd << 8;
11172       inst.instruction |= Rm << 16;
11173       inst.instruction |= Rm;
11174     }
11175   else
11176     inst.error = BAD_HIREG;
11177 }
11178
11179 static void
11180 do_t_rrx (void)
11181 {
11182   unsigned Rd, Rm;
11183
11184   Rd = inst.operands[0].reg;
11185   Rm = inst.operands[1].reg;
11186
11187   reject_bad_reg (Rd);
11188   reject_bad_reg (Rm);
11189
11190   inst.instruction |= Rd << 8;
11191   inst.instruction |= Rm;
11192 }
11193
11194 static void
11195 do_t_rsb (void)
11196 {
11197   unsigned Rd, Rs;
11198
11199   Rd = inst.operands[0].reg;
11200   Rs = (inst.operands[1].present
11201         ? inst.operands[1].reg    /* Rd, Rs, foo */
11202         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
11203
11204   reject_bad_reg (Rd);
11205   reject_bad_reg (Rs);
11206   if (inst.operands[2].isreg)
11207     reject_bad_reg (inst.operands[2].reg);
11208
11209   inst.instruction |= Rd << 8;
11210   inst.instruction |= Rs << 16;
11211   if (!inst.operands[2].isreg)
11212     {
11213       bfd_boolean narrow;
11214
11215       if ((inst.instruction & 0x00100000) != 0)
11216         narrow = !in_it_block ();
11217       else
11218         narrow = in_it_block ();
11219
11220       if (Rd > 7 || Rs > 7)
11221         narrow = FALSE;
11222
11223       if (inst.size_req == 4 || !unified_syntax)
11224         narrow = FALSE;
11225
11226       if (inst.reloc.exp.X_op != O_constant
11227           || inst.reloc.exp.X_add_number != 0)
11228         narrow = FALSE;
11229
11230       /* Turn rsb #0 into 16-bit neg.  We should probably do this via
11231          relaxation, but it doesn't seem worth the hassle.  */
11232       if (narrow)
11233         {
11234           inst.reloc.type = BFD_RELOC_UNUSED;
11235           inst.instruction = THUMB_OP16 (T_MNEM_negs);
11236           inst.instruction |= Rs << 3;
11237           inst.instruction |= Rd;
11238         }
11239       else
11240         {
11241           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11242           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11243         }
11244     }
11245   else
11246     encode_thumb32_shifted_operand (2);
11247 }
11248
11249 static void
11250 do_t_setend (void)
11251 {
11252   set_it_insn_type (OUTSIDE_IT_INSN);
11253   if (inst.operands[0].imm)
11254     inst.instruction |= 0x8;
11255 }
11256
11257 static void
11258 do_t_shift (void)
11259 {
11260   if (!inst.operands[1].present)
11261     inst.operands[1].reg = inst.operands[0].reg;
11262
11263   if (unified_syntax)
11264     {
11265       bfd_boolean narrow;
11266       int shift_kind;
11267
11268       switch (inst.instruction)
11269         {
11270         case T_MNEM_asr:
11271         case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11272         case T_MNEM_lsl:
11273         case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11274         case T_MNEM_lsr:
11275         case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11276         case T_MNEM_ror:
11277         case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11278         default: abort ();
11279         }
11280
11281       if (THUMB_SETS_FLAGS (inst.instruction))
11282         narrow = !in_it_block ();
11283       else
11284         narrow = in_it_block ();
11285       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11286         narrow = FALSE;
11287       if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
11288         narrow = FALSE;
11289       if (inst.operands[2].isreg
11290           && (inst.operands[1].reg != inst.operands[0].reg
11291               || inst.operands[2].reg > 7))
11292         narrow = FALSE;
11293       if (inst.size_req == 4)
11294         narrow = FALSE;
11295
11296       reject_bad_reg (inst.operands[0].reg);
11297       reject_bad_reg (inst.operands[1].reg);
11298
11299       if (!narrow)
11300         {
11301           if (inst.operands[2].isreg)
11302             {
11303               reject_bad_reg (inst.operands[2].reg);
11304               inst.instruction = THUMB_OP32 (inst.instruction);
11305               inst.instruction |= inst.operands[0].reg << 8;
11306               inst.instruction |= inst.operands[1].reg << 16;
11307               inst.instruction |= inst.operands[2].reg;
11308             }
11309           else
11310             {
11311               inst.operands[1].shifted = 1;
11312               inst.operands[1].shift_kind = shift_kind;
11313               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
11314                                              ? T_MNEM_movs : T_MNEM_mov);
11315               inst.instruction |= inst.operands[0].reg << 8;
11316               encode_thumb32_shifted_operand (1);
11317               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
11318               inst.reloc.type = BFD_RELOC_UNUSED;
11319             }
11320         }
11321       else
11322         {
11323           if (inst.operands[2].isreg)
11324             {
11325               switch (shift_kind)
11326                 {
11327                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
11328                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
11329                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
11330                 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
11331                 default: abort ();
11332                 }
11333
11334               inst.instruction |= inst.operands[0].reg;
11335               inst.instruction |= inst.operands[2].reg << 3;
11336             }
11337           else
11338             {
11339               switch (shift_kind)
11340                 {
11341                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11342                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11343                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11344                 default: abort ();
11345                 }
11346               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11347               inst.instruction |= inst.operands[0].reg;
11348               inst.instruction |= inst.operands[1].reg << 3;
11349             }
11350         }
11351     }
11352   else
11353     {
11354       constraint (inst.operands[0].reg > 7
11355                   || inst.operands[1].reg > 7, BAD_HIREG);
11356       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11357
11358       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
11359         {
11360           constraint (inst.operands[2].reg > 7, BAD_HIREG);
11361           constraint (inst.operands[0].reg != inst.operands[1].reg,
11362                       _("source1 and dest must be same register"));
11363
11364           switch (inst.instruction)
11365             {
11366             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
11367             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
11368             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
11369             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
11370             default: abort ();
11371             }
11372
11373           inst.instruction |= inst.operands[0].reg;
11374           inst.instruction |= inst.operands[2].reg << 3;
11375         }
11376       else
11377         {
11378           switch (inst.instruction)
11379             {
11380             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
11381             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
11382             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
11383             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
11384             default: abort ();
11385             }
11386           inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11387           inst.instruction |= inst.operands[0].reg;
11388           inst.instruction |= inst.operands[1].reg << 3;
11389         }
11390     }
11391 }
11392
11393 static void
11394 do_t_simd (void)
11395 {
11396   unsigned Rd, Rn, Rm;
11397
11398   Rd = inst.operands[0].reg;
11399   Rn = inst.operands[1].reg;
11400   Rm = inst.operands[2].reg;
11401
11402   reject_bad_reg (Rd);
11403   reject_bad_reg (Rn);
11404   reject_bad_reg (Rm);
11405
11406   inst.instruction |= Rd << 8;
11407   inst.instruction |= Rn << 16;
11408   inst.instruction |= Rm;
11409 }
11410
11411 static void
11412 do_t_simd2 (void)
11413 {
11414   unsigned Rd, Rn, Rm;
11415
11416   Rd = inst.operands[0].reg;
11417   Rm = inst.operands[1].reg;
11418   Rn = inst.operands[2].reg;
11419
11420   reject_bad_reg (Rd);
11421   reject_bad_reg (Rn);
11422   reject_bad_reg (Rm);
11423
11424   inst.instruction |= Rd << 8;
11425   inst.instruction |= Rn << 16;
11426   inst.instruction |= Rm;
11427 }
11428
11429 static void
11430 do_t_smc (void)
11431 {
11432   unsigned int value = inst.reloc.exp.X_add_number;
11433   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
11434               _("SMC is not permitted on this architecture"));
11435   constraint (inst.reloc.exp.X_op != O_constant,
11436               _("expression too complex"));
11437   inst.reloc.type = BFD_RELOC_UNUSED;
11438   inst.instruction |= (value & 0xf000) >> 12;
11439   inst.instruction |= (value & 0x0ff0);
11440   inst.instruction |= (value & 0x000f) << 16;
11441 }
11442
11443 static void
11444 do_t_hvc (void)
11445 {
11446   unsigned int value = inst.reloc.exp.X_add_number;
11447
11448   inst.reloc.type = BFD_RELOC_UNUSED;
11449   inst.instruction |= (value & 0x0fff);
11450   inst.instruction |= (value & 0xf000) << 4;
11451 }
11452
11453 static void
11454 do_t_ssat_usat (int bias)
11455 {
11456   unsigned Rd, Rn;
11457
11458   Rd = inst.operands[0].reg;
11459   Rn = inst.operands[2].reg;
11460
11461   reject_bad_reg (Rd);
11462   reject_bad_reg (Rn);
11463
11464   inst.instruction |= Rd << 8;
11465   inst.instruction |= inst.operands[1].imm - bias;
11466   inst.instruction |= Rn << 16;
11467
11468   if (inst.operands[3].present)
11469     {
11470       offsetT shift_amount = inst.reloc.exp.X_add_number;
11471
11472       inst.reloc.type = BFD_RELOC_UNUSED;
11473
11474       constraint (inst.reloc.exp.X_op != O_constant,
11475                   _("expression too complex"));
11476
11477       if (shift_amount != 0)
11478         {
11479           constraint (shift_amount > 31,
11480                       _("shift expression is too large"));
11481
11482           if (inst.operands[3].shift_kind == SHIFT_ASR)
11483             inst.instruction |= 0x00200000;  /* sh bit.  */
11484
11485           inst.instruction |= (shift_amount & 0x1c) << 10;
11486           inst.instruction |= (shift_amount & 0x03) << 6;
11487         }
11488     }
11489 }
11490
11491 static void
11492 do_t_ssat (void)
11493 {
11494   do_t_ssat_usat (1);
11495 }
11496
11497 static void
11498 do_t_ssat16 (void)
11499 {
11500   unsigned Rd, Rn;
11501
11502   Rd = inst.operands[0].reg;
11503   Rn = inst.operands[2].reg;
11504
11505   reject_bad_reg (Rd);
11506   reject_bad_reg (Rn);
11507
11508   inst.instruction |= Rd << 8;
11509   inst.instruction |= inst.operands[1].imm - 1;
11510   inst.instruction |= Rn << 16;
11511 }
11512
11513 static void
11514 do_t_strex (void)
11515 {
11516   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
11517               || inst.operands[2].postind || inst.operands[2].writeback
11518               || inst.operands[2].immisreg || inst.operands[2].shifted
11519               || inst.operands[2].negative,
11520               BAD_ADDR_MODE);
11521
11522   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
11523
11524   inst.instruction |= inst.operands[0].reg << 8;
11525   inst.instruction |= inst.operands[1].reg << 12;
11526   inst.instruction |= inst.operands[2].reg << 16;
11527   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
11528 }
11529
11530 static void
11531 do_t_strexd (void)
11532 {
11533   if (!inst.operands[2].present)
11534     inst.operands[2].reg = inst.operands[1].reg + 1;
11535
11536   constraint (inst.operands[0].reg == inst.operands[1].reg
11537               || inst.operands[0].reg == inst.operands[2].reg
11538               || inst.operands[0].reg == inst.operands[3].reg,
11539               BAD_OVERLAP);
11540
11541   inst.instruction |= inst.operands[0].reg;
11542   inst.instruction |= inst.operands[1].reg << 12;
11543   inst.instruction |= inst.operands[2].reg << 8;
11544   inst.instruction |= inst.operands[3].reg << 16;
11545 }
11546
11547 static void
11548 do_t_sxtah (void)
11549 {
11550   unsigned Rd, Rn, Rm;
11551
11552   Rd = inst.operands[0].reg;
11553   Rn = inst.operands[1].reg;
11554   Rm = inst.operands[2].reg;
11555
11556   reject_bad_reg (Rd);
11557   reject_bad_reg (Rn);
11558   reject_bad_reg (Rm);
11559
11560   inst.instruction |= Rd << 8;
11561   inst.instruction |= Rn << 16;
11562   inst.instruction |= Rm;
11563   inst.instruction |= inst.operands[3].imm << 4;
11564 }
11565
11566 static void
11567 do_t_sxth (void)
11568 {
11569   unsigned Rd, Rm;
11570
11571   Rd = inst.operands[0].reg;
11572   Rm = inst.operands[1].reg;
11573
11574   reject_bad_reg (Rd);
11575   reject_bad_reg (Rm);
11576
11577   if (inst.instruction <= 0xffff
11578       && inst.size_req != 4
11579       && Rd <= 7 && Rm <= 7
11580       && (!inst.operands[2].present || inst.operands[2].imm == 0))
11581     {
11582       inst.instruction = THUMB_OP16 (inst.instruction);
11583       inst.instruction |= Rd;
11584       inst.instruction |= Rm << 3;
11585     }
11586   else if (unified_syntax)
11587     {
11588       if (inst.instruction <= 0xffff)
11589         inst.instruction = THUMB_OP32 (inst.instruction);
11590       inst.instruction |= Rd << 8;
11591       inst.instruction |= Rm;
11592       inst.instruction |= inst.operands[2].imm << 4;
11593     }
11594   else
11595     {
11596       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
11597                   _("Thumb encoding does not support rotation"));
11598       constraint (1, BAD_HIREG);
11599     }
11600 }
11601
11602 static void
11603 do_t_swi (void)
11604 {
11605   /* We have to do the following check manually as ARM_EXT_OS only applies
11606      to ARM_EXT_V6M.  */
11607   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6m))
11608     {
11609       if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_os))
11610         as_bad (_("SVC is not permitted on this architecture"));
11611       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, arm_ext_os);
11612     }
11613
11614   inst.reloc.type = BFD_RELOC_ARM_SWI;
11615 }
11616
11617 static void
11618 do_t_tb (void)
11619 {
11620   unsigned Rn, Rm;
11621   int half;
11622
11623   half = (inst.instruction & 0x10) != 0;
11624   set_it_insn_type_last ();
11625   constraint (inst.operands[0].immisreg,
11626               _("instruction requires register index"));
11627
11628   Rn = inst.operands[0].reg;
11629   Rm = inst.operands[0].imm;
11630
11631   constraint (Rn == REG_SP, BAD_SP);
11632   reject_bad_reg (Rm);
11633
11634   constraint (!half && inst.operands[0].shifted,
11635               _("instruction does not allow shifted index"));
11636   inst.instruction |= (Rn << 16) | Rm;
11637 }
11638
11639 static void
11640 do_t_usat (void)
11641 {
11642   do_t_ssat_usat (0);
11643 }
11644
11645 static void
11646 do_t_usat16 (void)
11647 {
11648   unsigned Rd, Rn;
11649
11650   Rd = inst.operands[0].reg;
11651   Rn = inst.operands[2].reg;
11652
11653   reject_bad_reg (Rd);
11654   reject_bad_reg (Rn);
11655
11656   inst.instruction |= Rd << 8;
11657   inst.instruction |= inst.operands[1].imm;
11658   inst.instruction |= Rn << 16;
11659 }
11660
11661 /* Neon instruction encoder helpers.  */
11662
11663 /* Encodings for the different types for various Neon opcodes.  */
11664
11665 /* An "invalid" code for the following tables.  */
11666 #define N_INV -1u
11667
11668 struct neon_tab_entry
11669 {
11670   unsigned integer;
11671   unsigned float_or_poly;
11672   unsigned scalar_or_imm;
11673 };
11674
11675 /* Map overloaded Neon opcodes to their respective encodings.  */
11676 #define NEON_ENC_TAB                                    \
11677   X(vabd,       0x0000700, 0x1200d00, N_INV),           \
11678   X(vmax,       0x0000600, 0x0000f00, N_INV),           \
11679   X(vmin,       0x0000610, 0x0200f00, N_INV),           \
11680   X(vpadd,      0x0000b10, 0x1000d00, N_INV),           \
11681   X(vpmax,      0x0000a00, 0x1000f00, N_INV),           \
11682   X(vpmin,      0x0000a10, 0x1200f00, N_INV),           \
11683   X(vadd,       0x0000800, 0x0000d00, N_INV),           \
11684   X(vsub,       0x1000800, 0x0200d00, N_INV),           \
11685   X(vceq,       0x1000810, 0x0000e00, 0x1b10100),       \
11686   X(vcge,       0x0000310, 0x1000e00, 0x1b10080),       \
11687   X(vcgt,       0x0000300, 0x1200e00, 0x1b10000),       \
11688   /* Register variants of the following two instructions are encoded as
11689      vcge / vcgt with the operands reversed.  */        \
11690   X(vclt,       0x0000300, 0x1200e00, 0x1b10200),       \
11691   X(vcle,       0x0000310, 0x1000e00, 0x1b10180),       \
11692   X(vfma,       N_INV, 0x0000c10, N_INV),               \
11693   X(vfms,       N_INV, 0x0200c10, N_INV),               \
11694   X(vmla,       0x0000900, 0x0000d10, 0x0800040),       \
11695   X(vmls,       0x1000900, 0x0200d10, 0x0800440),       \
11696   X(vmul,       0x0000910, 0x1000d10, 0x0800840),       \
11697   X(vmull,      0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
11698   X(vmlal,      0x0800800, N_INV,     0x0800240),       \
11699   X(vmlsl,      0x0800a00, N_INV,     0x0800640),       \
11700   X(vqdmlal,    0x0800900, N_INV,     0x0800340),       \
11701   X(vqdmlsl,    0x0800b00, N_INV,     0x0800740),       \
11702   X(vqdmull,    0x0800d00, N_INV,     0x0800b40),       \
11703   X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),       \
11704   X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),       \
11705   X(vshl,       0x0000400, N_INV,     0x0800510),       \
11706   X(vqshl,      0x0000410, N_INV,     0x0800710),       \
11707   X(vand,       0x0000110, N_INV,     0x0800030),       \
11708   X(vbic,       0x0100110, N_INV,     0x0800030),       \
11709   X(veor,       0x1000110, N_INV,     N_INV),           \
11710   X(vorn,       0x0300110, N_INV,     0x0800010),       \
11711   X(vorr,       0x0200110, N_INV,     0x0800010),       \
11712   X(vmvn,       0x1b00580, N_INV,     0x0800030),       \
11713   X(vshll,      0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
11714   X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
11715   X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
11716   X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
11717   X(vst1,       0x0000000, 0x0800000, N_INV),           \
11718   X(vld2,       0x0200100, 0x0a00100, 0x0a00d00),       \
11719   X(vst2,       0x0000100, 0x0800100, N_INV),           \
11720   X(vld3,       0x0200200, 0x0a00200, 0x0a00e00),       \
11721   X(vst3,       0x0000200, 0x0800200, N_INV),           \
11722   X(vld4,       0x0200300, 0x0a00300, 0x0a00f00),       \
11723   X(vst4,       0x0000300, 0x0800300, N_INV),           \
11724   X(vmovn,      0x1b20200, N_INV,     N_INV),           \
11725   X(vtrn,       0x1b20080, N_INV,     N_INV),           \
11726   X(vqmovn,     0x1b20200, N_INV,     N_INV),           \
11727   X(vqmovun,    0x1b20240, N_INV,     N_INV),           \
11728   X(vnmul,      0xe200a40, 0xe200b40, N_INV),           \
11729   X(vnmla,      0xe100a40, 0xe100b40, N_INV),           \
11730   X(vnmls,      0xe100a00, 0xe100b00, N_INV),           \
11731   X(vfnma,      0xe900a40, 0xe900b40, N_INV),           \
11732   X(vfnms,      0xe900a00, 0xe900b00, N_INV),           \
11733   X(vcmp,       0xeb40a40, 0xeb40b40, N_INV),           \
11734   X(vcmpz,      0xeb50a40, 0xeb50b40, N_INV),           \
11735   X(vcmpe,      0xeb40ac0, 0xeb40bc0, N_INV),           \
11736   X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV)
11737
11738 enum neon_opc
11739 {
11740 #define X(OPC,I,F,S) N_MNEM_##OPC
11741 NEON_ENC_TAB
11742 #undef X
11743 };
11744
11745 static const struct neon_tab_entry neon_enc_tab[] =
11746 {
11747 #define X(OPC,I,F,S) { (I), (F), (S) }
11748 NEON_ENC_TAB
11749 #undef X
11750 };
11751
11752 /* Do not use these macros; instead, use NEON_ENCODE defined below.  */
11753 #define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
11754 #define NEON_ENC_ARMREG_(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
11755 #define NEON_ENC_POLY_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11756 #define NEON_ENC_FLOAT_(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11757 #define NEON_ENC_SCALAR_(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11758 #define NEON_ENC_IMMED_(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11759 #define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
11760 #define NEON_ENC_LANE_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11761 #define NEON_ENC_DUP_(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11762 #define NEON_ENC_SINGLE_(X) \
11763   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
11764 #define NEON_ENC_DOUBLE_(X) \
11765   ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
11766
11767 #define NEON_ENCODE(type, inst)                                 \
11768   do                                                            \
11769     {                                                           \
11770       inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
11771       inst.is_neon = 1;                                         \
11772     }                                                           \
11773   while (0)
11774
11775 #define check_neon_suffixes                                             \
11776   do                                                                    \
11777     {                                                                   \
11778       if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon)       \
11779         {                                                               \
11780           as_bad (_("invalid neon suffix for non neon instruction"));   \
11781           return;                                                       \
11782         }                                                               \
11783     }                                                                   \
11784   while (0)
11785
11786 /* Define shapes for instruction operands. The following mnemonic characters
11787    are used in this table:
11788
11789      F - VFP S<n> register
11790      D - Neon D<n> register
11791      Q - Neon Q<n> register
11792      I - Immediate
11793      S - Scalar
11794      R - ARM register
11795      L - D<n> register list
11796
11797    This table is used to generate various data:
11798      - enumerations of the form NS_DDR to be used as arguments to
11799        neon_select_shape.
11800      - a table classifying shapes into single, double, quad, mixed.
11801      - a table used to drive neon_select_shape.  */
11802
11803 #define NEON_SHAPE_DEF                  \
11804   X(3, (D, D, D), DOUBLE),              \
11805   X(3, (Q, Q, Q), QUAD),                \
11806   X(3, (D, D, I), DOUBLE),              \
11807   X(3, (Q, Q, I), QUAD),                \
11808   X(3, (D, D, S), DOUBLE),              \
11809   X(3, (Q, Q, S), QUAD),                \
11810   X(2, (D, D), DOUBLE),                 \
11811   X(2, (Q, Q), QUAD),                   \
11812   X(2, (D, S), DOUBLE),                 \
11813   X(2, (Q, S), QUAD),                   \
11814   X(2, (D, R), DOUBLE),                 \
11815   X(2, (Q, R), QUAD),                   \
11816   X(2, (D, I), DOUBLE),                 \
11817   X(2, (Q, I), QUAD),                   \
11818   X(3, (D, L, D), DOUBLE),              \
11819   X(2, (D, Q), MIXED),                  \
11820   X(2, (Q, D), MIXED),                  \
11821   X(3, (D, Q, I), MIXED),               \
11822   X(3, (Q, D, I), MIXED),               \
11823   X(3, (Q, D, D), MIXED),               \
11824   X(3, (D, Q, Q), MIXED),               \
11825   X(3, (Q, Q, D), MIXED),               \
11826   X(3, (Q, D, S), MIXED),               \
11827   X(3, (D, Q, S), MIXED),               \
11828   X(4, (D, D, D, I), DOUBLE),           \
11829   X(4, (Q, Q, Q, I), QUAD),             \
11830   X(2, (F, F), SINGLE),                 \
11831   X(3, (F, F, F), SINGLE),              \
11832   X(2, (F, I), SINGLE),                 \
11833   X(2, (F, D), MIXED),                  \
11834   X(2, (D, F), MIXED),                  \
11835   X(3, (F, F, I), MIXED),               \
11836   X(4, (R, R, F, F), SINGLE),           \
11837   X(4, (F, F, R, R), SINGLE),           \
11838   X(3, (D, R, R), DOUBLE),              \
11839   X(3, (R, R, D), DOUBLE),              \
11840   X(2, (S, R), SINGLE),                 \
11841   X(2, (R, S), SINGLE),                 \
11842   X(2, (F, R), SINGLE),                 \
11843   X(2, (R, F), SINGLE)
11844
11845 #define S2(A,B)         NS_##A##B
11846 #define S3(A,B,C)       NS_##A##B##C
11847 #define S4(A,B,C,D)     NS_##A##B##C##D
11848
11849 #define X(N, L, C) S##N L
11850
11851 enum neon_shape
11852 {
11853   NEON_SHAPE_DEF,
11854   NS_NULL
11855 };
11856
11857 #undef X
11858 #undef S2
11859 #undef S3
11860 #undef S4
11861
11862 enum neon_shape_class
11863 {
11864   SC_SINGLE,
11865   SC_DOUBLE,
11866   SC_QUAD,
11867   SC_MIXED
11868 };
11869
11870 #define X(N, L, C) SC_##C
11871
11872 static enum neon_shape_class neon_shape_class[] =
11873 {
11874   NEON_SHAPE_DEF
11875 };
11876
11877 #undef X
11878
11879 enum neon_shape_el
11880 {
11881   SE_F,
11882   SE_D,
11883   SE_Q,
11884   SE_I,
11885   SE_S,
11886   SE_R,
11887   SE_L
11888 };
11889
11890 /* Register widths of above.  */
11891 static unsigned neon_shape_el_size[] =
11892 {
11893   32,
11894   64,
11895   128,
11896   0,
11897   32,
11898   32,
11899   0
11900 };
11901
11902 struct neon_shape_info
11903 {
11904   unsigned els;
11905   enum neon_shape_el el[NEON_MAX_TYPE_ELS];
11906 };
11907
11908 #define S2(A,B)         { SE_##A, SE_##B }
11909 #define S3(A,B,C)       { SE_##A, SE_##B, SE_##C }
11910 #define S4(A,B,C,D)     { SE_##A, SE_##B, SE_##C, SE_##D }
11911
11912 #define X(N, L, C) { N, S##N L }
11913
11914 static struct neon_shape_info neon_shape_tab[] =
11915 {
11916   NEON_SHAPE_DEF
11917 };
11918
11919 #undef X
11920 #undef S2
11921 #undef S3
11922 #undef S4
11923
11924 /* Bit masks used in type checking given instructions.
11925   'N_EQK' means the type must be the same as (or based on in some way) the key
11926    type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
11927    set, various other bits can be set as well in order to modify the meaning of
11928    the type constraint.  */
11929
11930 enum neon_type_mask
11931 {
11932   N_S8   = 0x0000001,
11933   N_S16  = 0x0000002,
11934   N_S32  = 0x0000004,
11935   N_S64  = 0x0000008,
11936   N_U8   = 0x0000010,
11937   N_U16  = 0x0000020,
11938   N_U32  = 0x0000040,
11939   N_U64  = 0x0000080,
11940   N_I8   = 0x0000100,
11941   N_I16  = 0x0000200,
11942   N_I32  = 0x0000400,
11943   N_I64  = 0x0000800,
11944   N_8    = 0x0001000,
11945   N_16   = 0x0002000,
11946   N_32   = 0x0004000,
11947   N_64   = 0x0008000,
11948   N_P8   = 0x0010000,
11949   N_P16  = 0x0020000,
11950   N_F16  = 0x0040000,
11951   N_F32  = 0x0080000,
11952   N_F64  = 0x0100000,
11953   N_KEY  = 0x1000000, /* Key element (main type specifier).  */
11954   N_EQK  = 0x2000000, /* Given operand has the same type & size as the key.  */
11955   N_VFP  = 0x4000000, /* VFP mode: operand size must match register width.  */
11956   N_DBL  = 0x0000001, /* If N_EQK, this operand is twice the size.  */
11957   N_HLF  = 0x0000002, /* If N_EQK, this operand is half the size.  */
11958   N_SGN  = 0x0000004, /* If N_EQK, this operand is forced to be signed.  */
11959   N_UNS  = 0x0000008, /* If N_EQK, this operand is forced to be unsigned.  */
11960   N_INT  = 0x0000010, /* If N_EQK, this operand is forced to be integer.  */
11961   N_FLT  = 0x0000020, /* If N_EQK, this operand is forced to be float.  */
11962   N_SIZ  = 0x0000040, /* If N_EQK, this operand is forced to be size-only.  */
11963   N_UTYP = 0,
11964   N_MAX_NONSPECIAL = N_F64
11965 };
11966
11967 #define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
11968
11969 #define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
11970 #define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
11971 #define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
11972 #define N_SUF_32   (N_SU_32 | N_F32)
11973 #define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
11974 #define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F32)
11975
11976 /* Pass this as the first type argument to neon_check_type to ignore types
11977    altogether.  */
11978 #define N_IGNORE_TYPE (N_KEY | N_EQK)
11979
11980 /* Select a "shape" for the current instruction (describing register types or
11981    sizes) from a list of alternatives. Return NS_NULL if the current instruction
11982    doesn't fit. For non-polymorphic shapes, checking is usually done as a
11983    function of operand parsing, so this function doesn't need to be called.
11984    Shapes should be listed in order of decreasing length.  */
11985
11986 static enum neon_shape
11987 neon_select_shape (enum neon_shape shape, ...)
11988 {
11989   va_list ap;
11990   enum neon_shape first_shape = shape;
11991
11992   /* Fix missing optional operands. FIXME: we don't know at this point how
11993      many arguments we should have, so this makes the assumption that we have
11994      > 1. This is true of all current Neon opcodes, I think, but may not be
11995      true in the future.  */
11996   if (!inst.operands[1].present)
11997     inst.operands[1] = inst.operands[0];
11998
11999   va_start (ap, shape);
12000
12001   for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
12002     {
12003       unsigned j;
12004       int matches = 1;
12005
12006       for (j = 0; j < neon_shape_tab[shape].els; j++)
12007         {
12008           if (!inst.operands[j].present)
12009             {
12010               matches = 0;
12011               break;
12012             }
12013
12014           switch (neon_shape_tab[shape].el[j])
12015             {
12016             case SE_F:
12017               if (!(inst.operands[j].isreg
12018                     && inst.operands[j].isvec
12019                     && inst.operands[j].issingle
12020                     && !inst.operands[j].isquad))
12021                 matches = 0;
12022               break;
12023
12024             case SE_D:
12025               if (!(inst.operands[j].isreg
12026                     && inst.operands[j].isvec
12027                     && !inst.operands[j].isquad
12028                     && !inst.operands[j].issingle))
12029                 matches = 0;
12030               break;
12031
12032             case SE_R:
12033               if (!(inst.operands[j].isreg
12034                     && !inst.operands[j].isvec))
12035                 matches = 0;
12036               break;
12037
12038             case SE_Q:
12039               if (!(inst.operands[j].isreg
12040                     && inst.operands[j].isvec
12041                     && inst.operands[j].isquad
12042                     && !inst.operands[j].issingle))
12043                 matches = 0;
12044               break;
12045
12046             case SE_I:
12047               if (!(!inst.operands[j].isreg
12048                     && !inst.operands[j].isscalar))
12049                 matches = 0;
12050               break;
12051
12052             case SE_S:
12053               if (!(!inst.operands[j].isreg
12054                     && inst.operands[j].isscalar))
12055                 matches = 0;
12056               break;
12057
12058             case SE_L:
12059               break;
12060             }
12061           if (!matches)
12062             break;
12063         }
12064       if (matches)
12065         break;
12066     }
12067
12068   va_end (ap);
12069
12070   if (shape == NS_NULL && first_shape != NS_NULL)
12071     first_error (_("invalid instruction shape"));
12072
12073   return shape;
12074 }
12075
12076 /* True if SHAPE is predominantly a quadword operation (most of the time, this
12077    means the Q bit should be set).  */
12078
12079 static int
12080 neon_quad (enum neon_shape shape)
12081 {
12082   return neon_shape_class[shape] == SC_QUAD;
12083 }
12084
12085 static void
12086 neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
12087                        unsigned *g_size)
12088 {
12089   /* Allow modification to be made to types which are constrained to be
12090      based on the key element, based on bits set alongside N_EQK.  */
12091   if ((typebits & N_EQK) != 0)
12092     {
12093       if ((typebits & N_HLF) != 0)
12094         *g_size /= 2;
12095       else if ((typebits & N_DBL) != 0)
12096         *g_size *= 2;
12097       if ((typebits & N_SGN) != 0)
12098         *g_type = NT_signed;
12099       else if ((typebits & N_UNS) != 0)
12100         *g_type = NT_unsigned;
12101       else if ((typebits & N_INT) != 0)
12102         *g_type = NT_integer;
12103       else if ((typebits & N_FLT) != 0)
12104         *g_type = NT_float;
12105       else if ((typebits & N_SIZ) != 0)
12106         *g_type = NT_untyped;
12107     }
12108 }
12109
12110 /* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
12111    operand type, i.e. the single type specified in a Neon instruction when it
12112    is the only one given.  */
12113
12114 static struct neon_type_el
12115 neon_type_promote (struct neon_type_el *key, unsigned thisarg)
12116 {
12117   struct neon_type_el dest = *key;
12118
12119   gas_assert ((thisarg & N_EQK) != 0);
12120
12121   neon_modify_type_size (thisarg, &dest.type, &dest.size);
12122
12123   return dest;
12124 }
12125
12126 /* Convert Neon type and size into compact bitmask representation.  */
12127
12128 static enum neon_type_mask
12129 type_chk_of_el_type (enum neon_el_type type, unsigned size)
12130 {
12131   switch (type)
12132     {
12133     case NT_untyped:
12134       switch (size)
12135         {
12136         case 8:  return N_8;
12137         case 16: return N_16;
12138         case 32: return N_32;
12139         case 64: return N_64;
12140         default: ;
12141         }
12142       break;
12143
12144     case NT_integer:
12145       switch (size)
12146         {
12147         case 8:  return N_I8;
12148         case 16: return N_I16;
12149         case 32: return N_I32;
12150         case 64: return N_I64;
12151         default: ;
12152         }
12153       break;
12154
12155     case NT_float:
12156       switch (size)
12157         {
12158         case 16: return N_F16;
12159         case 32: return N_F32;
12160         case 64: return N_F64;
12161         default: ;
12162         }
12163       break;
12164
12165     case NT_poly:
12166       switch (size)
12167         {
12168         case 8:  return N_P8;
12169         case 16: return N_P16;
12170         default: ;
12171         }
12172       break;
12173
12174     case NT_signed:
12175       switch (size)
12176         {
12177         case 8:  return N_S8;
12178         case 16: return N_S16;
12179         case 32: return N_S32;
12180         case 64: return N_S64;
12181         default: ;
12182         }
12183       break;
12184
12185     case NT_unsigned:
12186       switch (size)
12187         {
12188         case 8:  return N_U8;
12189         case 16: return N_U16;
12190         case 32: return N_U32;
12191         case 64: return N_U64;
12192         default: ;
12193         }
12194       break;
12195
12196     default: ;
12197     }
12198
12199   return N_UTYP;
12200 }
12201
12202 /* Convert compact Neon bitmask type representation to a type and size. Only
12203    handles the case where a single bit is set in the mask.  */
12204
12205 static int
12206 el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
12207                      enum neon_type_mask mask)
12208 {
12209   if ((mask & N_EQK) != 0)
12210     return FAIL;
12211
12212   if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
12213     *size = 8;
12214   else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_P16)) != 0)
12215     *size = 16;
12216   else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
12217     *size = 32;
12218   else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64)) != 0)
12219     *size = 64;
12220   else
12221     return FAIL;
12222
12223   if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
12224     *type = NT_signed;
12225   else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
12226     *type = NT_unsigned;
12227   else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
12228     *type = NT_integer;
12229   else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
12230     *type = NT_untyped;
12231   else if ((mask & (N_P8 | N_P16)) != 0)
12232     *type = NT_poly;
12233   else if ((mask & (N_F32 | N_F64)) != 0)
12234     *type = NT_float;
12235   else
12236     return FAIL;
12237
12238   return SUCCESS;
12239 }
12240
12241 /* Modify a bitmask of allowed types. This is only needed for type
12242    relaxation.  */
12243
12244 static unsigned
12245 modify_types_allowed (unsigned allowed, unsigned mods)
12246 {
12247   unsigned size;
12248   enum neon_el_type type;
12249   unsigned destmask;
12250   int i;
12251
12252   destmask = 0;
12253
12254   for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
12255     {
12256       if (el_type_of_type_chk (&type, &size,
12257                                (enum neon_type_mask) (allowed & i)) == SUCCESS)
12258         {
12259           neon_modify_type_size (mods, &type, &size);
12260           destmask |= type_chk_of_el_type (type, size);
12261         }
12262     }
12263
12264   return destmask;
12265 }
12266
12267 /* Check type and return type classification.
12268    The manual states (paraphrase): If one datatype is given, it indicates the
12269    type given in:
12270     - the second operand, if there is one
12271     - the operand, if there is no second operand
12272     - the result, if there are no operands.
12273    This isn't quite good enough though, so we use a concept of a "key" datatype
12274    which is set on a per-instruction basis, which is the one which matters when
12275    only one data type is written.
12276    Note: this function has side-effects (e.g. filling in missing operands). All
12277    Neon instructions should call it before performing bit encoding.  */
12278
12279 static struct neon_type_el
12280 neon_check_type (unsigned els, enum neon_shape ns, ...)
12281 {
12282   va_list ap;
12283   unsigned i, pass, key_el = 0;
12284   unsigned types[NEON_MAX_TYPE_ELS];
12285   enum neon_el_type k_type = NT_invtype;
12286   unsigned k_size = -1u;
12287   struct neon_type_el badtype = {NT_invtype, -1};
12288   unsigned key_allowed = 0;
12289
12290   /* Optional registers in Neon instructions are always (not) in operand 1.
12291      Fill in the missing operand here, if it was omitted.  */
12292   if (els > 1 && !inst.operands[1].present)
12293     inst.operands[1] = inst.operands[0];
12294
12295   /* Suck up all the varargs.  */
12296   va_start (ap, ns);
12297   for (i = 0; i < els; i++)
12298     {
12299       unsigned thisarg = va_arg (ap, unsigned);
12300       if (thisarg == N_IGNORE_TYPE)
12301         {
12302           va_end (ap);
12303           return badtype;
12304         }
12305       types[i] = thisarg;
12306       if ((thisarg & N_KEY) != 0)
12307         key_el = i;
12308     }
12309   va_end (ap);
12310
12311   if (inst.vectype.elems > 0)
12312     for (i = 0; i < els; i++)
12313       if (inst.operands[i].vectype.type != NT_invtype)
12314         {
12315           first_error (_("types specified in both the mnemonic and operands"));
12316           return badtype;
12317         }
12318
12319   /* Duplicate inst.vectype elements here as necessary.
12320      FIXME: No idea if this is exactly the same as the ARM assembler,
12321      particularly when an insn takes one register and one non-register
12322      operand. */
12323   if (inst.vectype.elems == 1 && els > 1)
12324     {
12325       unsigned j;
12326       inst.vectype.elems = els;
12327       inst.vectype.el[key_el] = inst.vectype.el[0];
12328       for (j = 0; j < els; j++)
12329         if (j != key_el)
12330           inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12331                                                   types[j]);
12332     }
12333   else if (inst.vectype.elems == 0 && els > 0)
12334     {
12335       unsigned j;
12336       /* No types were given after the mnemonic, so look for types specified
12337          after each operand. We allow some flexibility here; as long as the
12338          "key" operand has a type, we can infer the others.  */
12339       for (j = 0; j < els; j++)
12340         if (inst.operands[j].vectype.type != NT_invtype)
12341           inst.vectype.el[j] = inst.operands[j].vectype;
12342
12343       if (inst.operands[key_el].vectype.type != NT_invtype)
12344         {
12345           for (j = 0; j < els; j++)
12346             if (inst.operands[j].vectype.type == NT_invtype)
12347               inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12348                                                       types[j]);
12349         }
12350       else
12351         {
12352           first_error (_("operand types can't be inferred"));
12353           return badtype;
12354         }
12355     }
12356   else if (inst.vectype.elems != els)
12357     {
12358       first_error (_("type specifier has the wrong number of parts"));
12359       return badtype;
12360     }
12361
12362   for (pass = 0; pass < 2; pass++)
12363     {
12364       for (i = 0; i < els; i++)
12365         {
12366           unsigned thisarg = types[i];
12367           unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
12368             ? modify_types_allowed (key_allowed, thisarg) : thisarg;
12369           enum neon_el_type g_type = inst.vectype.el[i].type;
12370           unsigned g_size = inst.vectype.el[i].size;
12371
12372           /* Decay more-specific signed & unsigned types to sign-insensitive
12373              integer types if sign-specific variants are unavailable.  */
12374           if ((g_type == NT_signed || g_type == NT_unsigned)
12375               && (types_allowed & N_SU_ALL) == 0)
12376             g_type = NT_integer;
12377
12378           /* If only untyped args are allowed, decay any more specific types to
12379              them. Some instructions only care about signs for some element
12380              sizes, so handle that properly.  */
12381           if ((g_size == 8 && (types_allowed & N_8) != 0)
12382               || (g_size == 16 && (types_allowed & N_16) != 0)
12383               || (g_size == 32 && (types_allowed & N_32) != 0)
12384               || (g_size == 64 && (types_allowed & N_64) != 0))
12385             g_type = NT_untyped;
12386
12387           if (pass == 0)
12388             {
12389               if ((thisarg & N_KEY) != 0)
12390                 {
12391                   k_type = g_type;
12392                   k_size = g_size;
12393                   key_allowed = thisarg & ~N_KEY;
12394                 }
12395             }
12396           else
12397             {
12398               if ((thisarg & N_VFP) != 0)
12399                 {
12400                   enum neon_shape_el regshape;
12401                   unsigned regwidth, match;
12402
12403                   /* PR 11136: Catch the case where we are passed a shape of NS_NULL.  */
12404                   if (ns == NS_NULL)
12405                     {
12406                       first_error (_("invalid instruction shape"));
12407                       return badtype;
12408                     }
12409                   regshape = neon_shape_tab[ns].el[i];
12410                   regwidth = neon_shape_el_size[regshape];
12411
12412                   /* In VFP mode, operands must match register widths. If we
12413                      have a key operand, use its width, else use the width of
12414                      the current operand.  */
12415                   if (k_size != -1u)
12416                     match = k_size;
12417                   else
12418                     match = g_size;
12419
12420                   if (regwidth != match)
12421                     {
12422                       first_error (_("operand size must match register width"));
12423                       return badtype;
12424                     }
12425                 }
12426
12427               if ((thisarg & N_EQK) == 0)
12428                 {
12429                   unsigned given_type = type_chk_of_el_type (g_type, g_size);
12430
12431                   if ((given_type & types_allowed) == 0)
12432                     {
12433                       first_error (_("bad type in Neon instruction"));
12434                       return badtype;
12435                     }
12436                 }
12437               else
12438                 {
12439                   enum neon_el_type mod_k_type = k_type;
12440                   unsigned mod_k_size = k_size;
12441                   neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
12442                   if (g_type != mod_k_type || g_size != mod_k_size)
12443                     {
12444                       first_error (_("inconsistent types in Neon instruction"));
12445                       return badtype;
12446                     }
12447                 }
12448             }
12449         }
12450     }
12451
12452   return inst.vectype.el[key_el];
12453 }
12454
12455 /* Neon-style VFP instruction forwarding.  */
12456
12457 /* Thumb VFP instructions have 0xE in the condition field.  */
12458
12459 static void
12460 do_vfp_cond_or_thumb (void)
12461 {
12462   inst.is_neon = 1;
12463
12464   if (thumb_mode)
12465     inst.instruction |= 0xe0000000;
12466   else
12467     inst.instruction |= inst.cond << 28;
12468 }
12469
12470 /* Look up and encode a simple mnemonic, for use as a helper function for the
12471    Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
12472    etc.  It is assumed that operand parsing has already been done, and that the
12473    operands are in the form expected by the given opcode (this isn't necessarily
12474    the same as the form in which they were parsed, hence some massaging must
12475    take place before this function is called).
12476    Checks current arch version against that in the looked-up opcode.  */
12477
12478 static void
12479 do_vfp_nsyn_opcode (const char *opname)
12480 {
12481   const struct asm_opcode *opcode;
12482
12483   opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
12484
12485   if (!opcode)
12486     abort ();
12487
12488   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
12489                 thumb_mode ? *opcode->tvariant : *opcode->avariant),
12490               _(BAD_FPU));
12491
12492   inst.is_neon = 1;
12493
12494   if (thumb_mode)
12495     {
12496       inst.instruction = opcode->tvalue;
12497       opcode->tencode ();
12498     }
12499   else
12500     {
12501       inst.instruction = (inst.cond << 28) | opcode->avalue;
12502       opcode->aencode ();
12503     }
12504 }
12505
12506 static void
12507 do_vfp_nsyn_add_sub (enum neon_shape rs)
12508 {
12509   int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
12510
12511   if (rs == NS_FFF)
12512     {
12513       if (is_add)
12514         do_vfp_nsyn_opcode ("fadds");
12515       else
12516         do_vfp_nsyn_opcode ("fsubs");
12517     }
12518   else
12519     {
12520       if (is_add)
12521         do_vfp_nsyn_opcode ("faddd");
12522       else
12523         do_vfp_nsyn_opcode ("fsubd");
12524     }
12525 }
12526
12527 /* Check operand types to see if this is a VFP instruction, and if so call
12528    PFN ().  */
12529
12530 static int
12531 try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
12532 {
12533   enum neon_shape rs;
12534   struct neon_type_el et;
12535
12536   switch (args)
12537     {
12538     case 2:
12539       rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12540       et = neon_check_type (2, rs,
12541         N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12542       break;
12543
12544     case 3:
12545       rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12546       et = neon_check_type (3, rs,
12547         N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12548       break;
12549
12550     default:
12551       abort ();
12552     }
12553
12554   if (et.type != NT_invtype)
12555     {
12556       pfn (rs);
12557       return SUCCESS;
12558     }
12559
12560   inst.error = NULL;
12561   return FAIL;
12562 }
12563
12564 static void
12565 do_vfp_nsyn_mla_mls (enum neon_shape rs)
12566 {
12567   int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
12568
12569   if (rs == NS_FFF)
12570     {
12571       if (is_mla)
12572         do_vfp_nsyn_opcode ("fmacs");
12573       else
12574         do_vfp_nsyn_opcode ("fnmacs");
12575     }
12576   else
12577     {
12578       if (is_mla)
12579         do_vfp_nsyn_opcode ("fmacd");
12580       else
12581         do_vfp_nsyn_opcode ("fnmacd");
12582     }
12583 }
12584
12585 static void
12586 do_vfp_nsyn_fma_fms (enum neon_shape rs)
12587 {
12588   int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
12589
12590   if (rs == NS_FFF)
12591     {
12592       if (is_fma)
12593         do_vfp_nsyn_opcode ("ffmas");
12594       else
12595         do_vfp_nsyn_opcode ("ffnmas");
12596     }
12597   else
12598     {
12599       if (is_fma)
12600         do_vfp_nsyn_opcode ("ffmad");
12601       else
12602         do_vfp_nsyn_opcode ("ffnmad");
12603     }
12604 }
12605
12606 static void
12607 do_vfp_nsyn_mul (enum neon_shape rs)
12608 {
12609   if (rs == NS_FFF)
12610     do_vfp_nsyn_opcode ("fmuls");
12611   else
12612     do_vfp_nsyn_opcode ("fmuld");
12613 }
12614
12615 static void
12616 do_vfp_nsyn_abs_neg (enum neon_shape rs)
12617 {
12618   int is_neg = (inst.instruction & 0x80) != 0;
12619   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
12620
12621   if (rs == NS_FF)
12622     {
12623       if (is_neg)
12624         do_vfp_nsyn_opcode ("fnegs");
12625       else
12626         do_vfp_nsyn_opcode ("fabss");
12627     }
12628   else
12629     {
12630       if (is_neg)
12631         do_vfp_nsyn_opcode ("fnegd");
12632       else
12633         do_vfp_nsyn_opcode ("fabsd");
12634     }
12635 }
12636
12637 /* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
12638    insns belong to Neon, and are handled elsewhere.  */
12639
12640 static void
12641 do_vfp_nsyn_ldm_stm (int is_dbmode)
12642 {
12643   int is_ldm = (inst.instruction & (1 << 20)) != 0;
12644   if (is_ldm)
12645     {
12646       if (is_dbmode)
12647         do_vfp_nsyn_opcode ("fldmdbs");
12648       else
12649         do_vfp_nsyn_opcode ("fldmias");
12650     }
12651   else
12652     {
12653       if (is_dbmode)
12654         do_vfp_nsyn_opcode ("fstmdbs");
12655       else
12656         do_vfp_nsyn_opcode ("fstmias");
12657     }
12658 }
12659
12660 static void
12661 do_vfp_nsyn_sqrt (void)
12662 {
12663   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12664   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12665
12666   if (rs == NS_FF)
12667     do_vfp_nsyn_opcode ("fsqrts");
12668   else
12669     do_vfp_nsyn_opcode ("fsqrtd");
12670 }
12671
12672 static void
12673 do_vfp_nsyn_div (void)
12674 {
12675   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12676   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
12677     N_F32 | N_F64 | N_KEY | N_VFP);
12678
12679   if (rs == NS_FFF)
12680     do_vfp_nsyn_opcode ("fdivs");
12681   else
12682     do_vfp_nsyn_opcode ("fdivd");
12683 }
12684
12685 static void
12686 do_vfp_nsyn_nmul (void)
12687 {
12688   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12689   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
12690     N_F32 | N_F64 | N_KEY | N_VFP);
12691
12692   if (rs == NS_FFF)
12693     {
12694       NEON_ENCODE (SINGLE, inst);
12695       do_vfp_sp_dyadic ();
12696     }
12697   else
12698     {
12699       NEON_ENCODE (DOUBLE, inst);
12700       do_vfp_dp_rd_rn_rm ();
12701     }
12702   do_vfp_cond_or_thumb ();
12703 }
12704
12705 static void
12706 do_vfp_nsyn_cmp (void)
12707 {
12708   if (inst.operands[1].isreg)
12709     {
12710       enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12711       neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12712
12713       if (rs == NS_FF)
12714         {
12715           NEON_ENCODE (SINGLE, inst);
12716           do_vfp_sp_monadic ();
12717         }
12718       else
12719         {
12720           NEON_ENCODE (DOUBLE, inst);
12721           do_vfp_dp_rd_rm ();
12722         }
12723     }
12724   else
12725     {
12726       enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
12727       neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
12728
12729       switch (inst.instruction & 0x0fffffff)
12730         {
12731         case N_MNEM_vcmp:
12732           inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
12733           break;
12734         case N_MNEM_vcmpe:
12735           inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
12736           break;
12737         default:
12738           abort ();
12739         }
12740
12741       if (rs == NS_FI)
12742         {
12743           NEON_ENCODE (SINGLE, inst);
12744           do_vfp_sp_compare_z ();
12745         }
12746       else
12747         {
12748           NEON_ENCODE (DOUBLE, inst);
12749           do_vfp_dp_rd ();
12750         }
12751     }
12752   do_vfp_cond_or_thumb ();
12753 }
12754
12755 static void
12756 nsyn_insert_sp (void)
12757 {
12758   inst.operands[1] = inst.operands[0];
12759   memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
12760   inst.operands[0].reg = REG_SP;
12761   inst.operands[0].isreg = 1;
12762   inst.operands[0].writeback = 1;
12763   inst.operands[0].present = 1;
12764 }
12765
12766 static void
12767 do_vfp_nsyn_push (void)
12768 {
12769   nsyn_insert_sp ();
12770   if (inst.operands[1].issingle)
12771     do_vfp_nsyn_opcode ("fstmdbs");
12772   else
12773     do_vfp_nsyn_opcode ("fstmdbd");
12774 }
12775
12776 static void
12777 do_vfp_nsyn_pop (void)
12778 {
12779   nsyn_insert_sp ();
12780   if (inst.operands[1].issingle)
12781     do_vfp_nsyn_opcode ("fldmias");
12782   else
12783     do_vfp_nsyn_opcode ("fldmiad");
12784 }
12785
12786 /* Fix up Neon data-processing instructions, ORing in the correct bits for
12787    ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
12788
12789 static void
12790 neon_dp_fixup (struct arm_it* insn)
12791 {
12792   unsigned int i = insn->instruction;
12793   insn->is_neon = 1;
12794
12795   if (thumb_mode)
12796     {
12797       /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
12798       if (i & (1 << 24))
12799         i |= 1 << 28;
12800
12801       i &= ~(1 << 24);
12802
12803       i |= 0xef000000;
12804     }
12805   else
12806     i |= 0xf2000000;
12807
12808   insn->instruction = i;
12809 }
12810
12811 /* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
12812    (0, 1, 2, 3).  */
12813
12814 static unsigned
12815 neon_logbits (unsigned x)
12816 {
12817   return ffs (x) - 4;
12818 }
12819
12820 #define LOW4(R) ((R) & 0xf)
12821 #define HI1(R) (((R) >> 4) & 1)
12822
12823 /* Encode insns with bit pattern:
12824
12825   |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
12826   |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
12827
12828   SIZE is passed in bits. -1 means size field isn't changed, in case it has a
12829   different meaning for some instruction.  */
12830
12831 static void
12832 neon_three_same (int isquad, int ubit, int size)
12833 {
12834   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12835   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12836   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
12837   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
12838   inst.instruction |= LOW4 (inst.operands[2].reg);
12839   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
12840   inst.instruction |= (isquad != 0) << 6;
12841   inst.instruction |= (ubit != 0) << 24;
12842   if (size != -1)
12843     inst.instruction |= neon_logbits (size) << 20;
12844
12845   neon_dp_fixup (&inst);
12846 }
12847
12848 /* Encode instructions of the form:
12849
12850   |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
12851   |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
12852
12853   Don't write size if SIZE == -1.  */
12854
12855 static void
12856 neon_two_same (int qbit, int ubit, int size)
12857 {
12858   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12859   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12860   inst.instruction |= LOW4 (inst.operands[1].reg);
12861   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12862   inst.instruction |= (qbit != 0) << 6;
12863   inst.instruction |= (ubit != 0) << 24;
12864
12865   if (size != -1)
12866     inst.instruction |= neon_logbits (size) << 18;
12867
12868   neon_dp_fixup (&inst);
12869 }
12870
12871 /* Neon instruction encoders, in approximate order of appearance.  */
12872
12873 static void
12874 do_neon_dyadic_i_su (void)
12875 {
12876   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12877   struct neon_type_el et = neon_check_type (3, rs,
12878     N_EQK, N_EQK, N_SU_32 | N_KEY);
12879   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12880 }
12881
12882 static void
12883 do_neon_dyadic_i64_su (void)
12884 {
12885   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12886   struct neon_type_el et = neon_check_type (3, rs,
12887     N_EQK, N_EQK, N_SU_ALL | N_KEY);
12888   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12889 }
12890
12891 static void
12892 neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
12893                 unsigned immbits)
12894 {
12895   unsigned size = et.size >> 3;
12896   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12897   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12898   inst.instruction |= LOW4 (inst.operands[1].reg);
12899   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12900   inst.instruction |= (isquad != 0) << 6;
12901   inst.instruction |= immbits << 16;
12902   inst.instruction |= (size >> 3) << 7;
12903   inst.instruction |= (size & 0x7) << 19;
12904   if (write_ubit)
12905     inst.instruction |= (uval != 0) << 24;
12906
12907   neon_dp_fixup (&inst);
12908 }
12909
12910 static void
12911 do_neon_shl_imm (void)
12912 {
12913   if (!inst.operands[2].isreg)
12914     {
12915       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
12916       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
12917       NEON_ENCODE (IMMED, inst);
12918       neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
12919     }
12920   else
12921     {
12922       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12923       struct neon_type_el et = neon_check_type (3, rs,
12924         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
12925       unsigned int tmp;
12926
12927       /* VSHL/VQSHL 3-register variants have syntax such as:
12928            vshl.xx Dd, Dm, Dn
12929          whereas other 3-register operations encoded by neon_three_same have
12930          syntax like:
12931            vadd.xx Dd, Dn, Dm
12932          (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
12933          here.  */
12934       tmp = inst.operands[2].reg;
12935       inst.operands[2].reg = inst.operands[1].reg;
12936       inst.operands[1].reg = tmp;
12937       NEON_ENCODE (INTEGER, inst);
12938       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12939     }
12940 }
12941
12942 static void
12943 do_neon_qshl_imm (void)
12944 {
12945   if (!inst.operands[2].isreg)
12946     {
12947       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
12948       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
12949
12950       NEON_ENCODE (IMMED, inst);
12951       neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
12952                       inst.operands[2].imm);
12953     }
12954   else
12955     {
12956       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12957       struct neon_type_el et = neon_check_type (3, rs,
12958         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
12959       unsigned int tmp;
12960
12961       /* See note in do_neon_shl_imm.  */
12962       tmp = inst.operands[2].reg;
12963       inst.operands[2].reg = inst.operands[1].reg;
12964       inst.operands[1].reg = tmp;
12965       NEON_ENCODE (INTEGER, inst);
12966       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12967     }
12968 }
12969
12970 static void
12971 do_neon_rshl (void)
12972 {
12973   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12974   struct neon_type_el et = neon_check_type (3, rs,
12975     N_EQK, N_EQK, N_SU_ALL | N_KEY);
12976   unsigned int tmp;
12977
12978   tmp = inst.operands[2].reg;
12979   inst.operands[2].reg = inst.operands[1].reg;
12980   inst.operands[1].reg = tmp;
12981   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
12982 }
12983
12984 static int
12985 neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
12986 {
12987   /* Handle .I8 pseudo-instructions.  */
12988   if (size == 8)
12989     {
12990       /* Unfortunately, this will make everything apart from zero out-of-range.
12991          FIXME is this the intended semantics? There doesn't seem much point in
12992          accepting .I8 if so.  */
12993       immediate |= immediate << 8;
12994       size = 16;
12995     }
12996
12997   if (size >= 32)
12998     {
12999       if (immediate == (immediate & 0x000000ff))
13000         {
13001           *immbits = immediate;
13002           return 0x1;
13003         }
13004       else if (immediate == (immediate & 0x0000ff00))
13005         {
13006           *immbits = immediate >> 8;
13007           return 0x3;
13008         }
13009       else if (immediate == (immediate & 0x00ff0000))
13010         {
13011           *immbits = immediate >> 16;
13012           return 0x5;
13013         }
13014       else if (immediate == (immediate & 0xff000000))
13015         {
13016           *immbits = immediate >> 24;
13017           return 0x7;
13018         }
13019       if ((immediate & 0xffff) != (immediate >> 16))
13020         goto bad_immediate;
13021       immediate &= 0xffff;
13022     }
13023
13024   if (immediate == (immediate & 0x000000ff))
13025     {
13026       *immbits = immediate;
13027       return 0x9;
13028     }
13029   else if (immediate == (immediate & 0x0000ff00))
13030     {
13031       *immbits = immediate >> 8;
13032       return 0xb;
13033     }
13034
13035   bad_immediate:
13036   first_error (_("immediate value out of range"));
13037   return FAIL;
13038 }
13039
13040 /* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
13041    A, B, C, D.  */
13042
13043 static int
13044 neon_bits_same_in_bytes (unsigned imm)
13045 {
13046   return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
13047          && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
13048          && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
13049          && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
13050 }
13051
13052 /* For immediate of above form, return 0bABCD.  */
13053
13054 static unsigned
13055 neon_squash_bits (unsigned imm)
13056 {
13057   return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
13058          | ((imm & 0x01000000) >> 21);
13059 }
13060
13061 /* Compress quarter-float representation to 0b...000 abcdefgh.  */
13062
13063 static unsigned
13064 neon_qfloat_bits (unsigned imm)
13065 {
13066   return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
13067 }
13068
13069 /* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
13070    the instruction. *OP is passed as the initial value of the op field, and
13071    may be set to a different value depending on the constant (i.e.
13072    "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
13073    MVN).  If the immediate looks like a repeated pattern then also
13074    try smaller element sizes.  */
13075
13076 static int
13077 neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
13078                          unsigned *immbits, int *op, int size,
13079                          enum neon_el_type type)
13080 {
13081   /* Only permit float immediates (including 0.0/-0.0) if the operand type is
13082      float.  */
13083   if (type == NT_float && !float_p)
13084     return FAIL;
13085
13086   if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
13087     {
13088       if (size != 32 || *op == 1)
13089         return FAIL;
13090       *immbits = neon_qfloat_bits (immlo);
13091       return 0xf;
13092     }
13093
13094   if (size == 64)
13095     {
13096       if (neon_bits_same_in_bytes (immhi)
13097           && neon_bits_same_in_bytes (immlo))
13098         {
13099           if (*op == 1)
13100             return FAIL;
13101           *immbits = (neon_squash_bits (immhi) << 4)
13102                      | neon_squash_bits (immlo);
13103           *op = 1;
13104           return 0xe;
13105         }
13106
13107       if (immhi != immlo)
13108         return FAIL;
13109     }
13110
13111   if (size >= 32)
13112     {
13113       if (immlo == (immlo & 0x000000ff))
13114         {
13115           *immbits = immlo;
13116           return 0x0;
13117         }
13118       else if (immlo == (immlo & 0x0000ff00))
13119         {
13120           *immbits = immlo >> 8;
13121           return 0x2;
13122         }
13123       else if (immlo == (immlo & 0x00ff0000))
13124         {
13125           *immbits = immlo >> 16;
13126           return 0x4;
13127         }
13128       else if (immlo == (immlo & 0xff000000))
13129         {
13130           *immbits = immlo >> 24;
13131           return 0x6;
13132         }
13133       else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
13134         {
13135           *immbits = (immlo >> 8) & 0xff;
13136           return 0xc;
13137         }
13138       else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
13139         {
13140           *immbits = (immlo >> 16) & 0xff;
13141           return 0xd;
13142         }
13143
13144       if ((immlo & 0xffff) != (immlo >> 16))
13145         return FAIL;
13146       immlo &= 0xffff;
13147     }
13148
13149   if (size >= 16)
13150     {
13151       if (immlo == (immlo & 0x000000ff))
13152         {
13153           *immbits = immlo;
13154           return 0x8;
13155         }
13156       else if (immlo == (immlo & 0x0000ff00))
13157         {
13158           *immbits = immlo >> 8;
13159           return 0xa;
13160         }
13161
13162       if ((immlo & 0xff) != (immlo >> 8))
13163         return FAIL;
13164       immlo &= 0xff;
13165     }
13166
13167   if (immlo == (immlo & 0x000000ff))
13168     {
13169       /* Don't allow MVN with 8-bit immediate.  */
13170       if (*op == 1)
13171         return FAIL;
13172       *immbits = immlo;
13173       return 0xe;
13174     }
13175
13176   return FAIL;
13177 }
13178
13179 /* Write immediate bits [7:0] to the following locations:
13180
13181   |28/24|23     19|18 16|15                    4|3     0|
13182   |  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|
13183
13184   This function is used by VMOV/VMVN/VORR/VBIC.  */
13185
13186 static void
13187 neon_write_immbits (unsigned immbits)
13188 {
13189   inst.instruction |= immbits & 0xf;
13190   inst.instruction |= ((immbits >> 4) & 0x7) << 16;
13191   inst.instruction |= ((immbits >> 7) & 0x1) << 24;
13192 }
13193
13194 /* Invert low-order SIZE bits of XHI:XLO.  */
13195
13196 static void
13197 neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
13198 {
13199   unsigned immlo = xlo ? *xlo : 0;
13200   unsigned immhi = xhi ? *xhi : 0;
13201
13202   switch (size)
13203     {
13204     case 8:
13205       immlo = (~immlo) & 0xff;
13206       break;
13207
13208     case 16:
13209       immlo = (~immlo) & 0xffff;
13210       break;
13211
13212     case 64:
13213       immhi = (~immhi) & 0xffffffff;
13214       /* fall through.  */
13215
13216     case 32:
13217       immlo = (~immlo) & 0xffffffff;
13218       break;
13219
13220     default:
13221       abort ();
13222     }
13223
13224   if (xlo)
13225     *xlo = immlo;
13226
13227   if (xhi)
13228     *xhi = immhi;
13229 }
13230
13231 static void
13232 do_neon_logic (void)
13233 {
13234   if (inst.operands[2].present && inst.operands[2].isreg)
13235     {
13236       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13237       neon_check_type (3, rs, N_IGNORE_TYPE);
13238       /* U bit and size field were set as part of the bitmask.  */
13239       NEON_ENCODE (INTEGER, inst);
13240       neon_three_same (neon_quad (rs), 0, -1);
13241     }
13242   else
13243     {
13244       const int three_ops_form = (inst.operands[2].present
13245                                   && !inst.operands[2].isreg);
13246       const int immoperand = (three_ops_form ? 2 : 1);
13247       enum neon_shape rs = (three_ops_form
13248                             ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
13249                             : neon_select_shape (NS_DI, NS_QI, NS_NULL));
13250       struct neon_type_el et = neon_check_type (2, rs,
13251         N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
13252       enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
13253       unsigned immbits;
13254       int cmode;
13255
13256       if (et.type == NT_invtype)
13257         return;
13258
13259       if (three_ops_form)
13260         constraint (inst.operands[0].reg != inst.operands[1].reg,
13261                     _("first and second operands shall be the same register"));
13262
13263       NEON_ENCODE (IMMED, inst);
13264
13265       immbits = inst.operands[immoperand].imm;
13266       if (et.size == 64)
13267         {
13268           /* .i64 is a pseudo-op, so the immediate must be a repeating
13269              pattern.  */
13270           if (immbits != (inst.operands[immoperand].regisimm ?
13271                           inst.operands[immoperand].reg : 0))
13272             {
13273               /* Set immbits to an invalid constant.  */
13274               immbits = 0xdeadbeef;
13275             }
13276         }
13277
13278       switch (opcode)
13279         {
13280         case N_MNEM_vbic:
13281           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13282           break;
13283
13284         case N_MNEM_vorr:
13285           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13286           break;
13287
13288         case N_MNEM_vand:
13289           /* Pseudo-instruction for VBIC.  */
13290           neon_invert_size (&immbits, 0, et.size);
13291           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13292           break;
13293
13294         case N_MNEM_vorn:
13295           /* Pseudo-instruction for VORR.  */
13296           neon_invert_size (&immbits, 0, et.size);
13297           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13298           break;
13299
13300         default:
13301           abort ();
13302         }
13303
13304       if (cmode == FAIL)
13305         return;
13306
13307       inst.instruction |= neon_quad (rs) << 6;
13308       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13309       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13310       inst.instruction |= cmode << 8;
13311       neon_write_immbits (immbits);
13312
13313       neon_dp_fixup (&inst);
13314     }
13315 }
13316
13317 static void
13318 do_neon_bitfield (void)
13319 {
13320   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13321   neon_check_type (3, rs, N_IGNORE_TYPE);
13322   neon_three_same (neon_quad (rs), 0, -1);
13323 }
13324
13325 static void
13326 neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
13327                   unsigned destbits)
13328 {
13329   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13330   struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
13331                                             types | N_KEY);
13332   if (et.type == NT_float)
13333     {
13334       NEON_ENCODE (FLOAT, inst);
13335       neon_three_same (neon_quad (rs), 0, -1);
13336     }
13337   else
13338     {
13339       NEON_ENCODE (INTEGER, inst);
13340       neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
13341     }
13342 }
13343
13344 static void
13345 do_neon_dyadic_if_su (void)
13346 {
13347   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13348 }
13349
13350 static void
13351 do_neon_dyadic_if_su_d (void)
13352 {
13353   /* This version only allow D registers, but that constraint is enforced during
13354      operand parsing so we don't need to do anything extra here.  */
13355   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13356 }
13357
13358 static void
13359 do_neon_dyadic_if_i_d (void)
13360 {
13361   /* The "untyped" case can't happen. Do this to stop the "U" bit being
13362      affected if we specify unsigned args.  */
13363   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13364 }
13365
13366 enum vfp_or_neon_is_neon_bits
13367 {
13368   NEON_CHECK_CC = 1,
13369   NEON_CHECK_ARCH = 2
13370 };
13371
13372 /* Call this function if an instruction which may have belonged to the VFP or
13373    Neon instruction sets, but turned out to be a Neon instruction (due to the
13374    operand types involved, etc.). We have to check and/or fix-up a couple of
13375    things:
13376
13377      - Make sure the user hasn't attempted to make a Neon instruction
13378        conditional.
13379      - Alter the value in the condition code field if necessary.
13380      - Make sure that the arch supports Neon instructions.
13381
13382    Which of these operations take place depends on bits from enum
13383    vfp_or_neon_is_neon_bits.
13384
13385    WARNING: This function has side effects! If NEON_CHECK_CC is used and the
13386    current instruction's condition is COND_ALWAYS, the condition field is
13387    changed to inst.uncond_value. This is necessary because instructions shared
13388    between VFP and Neon may be conditional for the VFP variants only, and the
13389    unconditional Neon version must have, e.g., 0xF in the condition field.  */
13390
13391 static int
13392 vfp_or_neon_is_neon (unsigned check)
13393 {
13394   /* Conditions are always legal in Thumb mode (IT blocks).  */
13395   if (!thumb_mode && (check & NEON_CHECK_CC))
13396     {
13397       if (inst.cond != COND_ALWAYS)
13398         {
13399           first_error (_(BAD_COND));
13400           return FAIL;
13401         }
13402       if (inst.uncond_value != -1)
13403         inst.instruction |= inst.uncond_value << 28;
13404     }
13405
13406   if ((check & NEON_CHECK_ARCH)
13407       && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
13408     {
13409       first_error (_(BAD_FPU));
13410       return FAIL;
13411     }
13412
13413   return SUCCESS;
13414 }
13415
13416 static void
13417 do_neon_addsub_if_i (void)
13418 {
13419   if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
13420     return;
13421
13422   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13423     return;
13424
13425   /* The "untyped" case can't happen. Do this to stop the "U" bit being
13426      affected if we specify unsigned args.  */
13427   neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
13428 }
13429
13430 /* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
13431    result to be:
13432      V<op> A,B     (A is operand 0, B is operand 2)
13433    to mean:
13434      V<op> A,B,A
13435    not:
13436      V<op> A,B,B
13437    so handle that case specially.  */
13438
13439 static void
13440 neon_exchange_operands (void)
13441 {
13442   void *scratch = alloca (sizeof (inst.operands[0]));
13443   if (inst.operands[1].present)
13444     {
13445       /* Swap operands[1] and operands[2].  */
13446       memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
13447       inst.operands[1] = inst.operands[2];
13448       memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
13449     }
13450   else
13451     {
13452       inst.operands[1] = inst.operands[2];
13453       inst.operands[2] = inst.operands[0];
13454     }
13455 }
13456
13457 static void
13458 neon_compare (unsigned regtypes, unsigned immtypes, int invert)
13459 {
13460   if (inst.operands[2].isreg)
13461     {
13462       if (invert)
13463         neon_exchange_operands ();
13464       neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
13465     }
13466   else
13467     {
13468       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13469       struct neon_type_el et = neon_check_type (2, rs,
13470         N_EQK | N_SIZ, immtypes | N_KEY);
13471
13472       NEON_ENCODE (IMMED, inst);
13473       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13474       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13475       inst.instruction |= LOW4 (inst.operands[1].reg);
13476       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13477       inst.instruction |= neon_quad (rs) << 6;
13478       inst.instruction |= (et.type == NT_float) << 10;
13479       inst.instruction |= neon_logbits (et.size) << 18;
13480
13481       neon_dp_fixup (&inst);
13482     }
13483 }
13484
13485 static void
13486 do_neon_cmp (void)
13487 {
13488   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
13489 }
13490
13491 static void
13492 do_neon_cmp_inv (void)
13493 {
13494   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
13495 }
13496
13497 static void
13498 do_neon_ceq (void)
13499 {
13500   neon_compare (N_IF_32, N_IF_32, FALSE);
13501 }
13502
13503 /* For multiply instructions, we have the possibility of 16-bit or 32-bit
13504    scalars, which are encoded in 5 bits, M : Rm.
13505    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
13506    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
13507    index in M.  */
13508
13509 static unsigned
13510 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
13511 {
13512   unsigned regno = NEON_SCALAR_REG (scalar);
13513   unsigned elno = NEON_SCALAR_INDEX (scalar);
13514
13515   switch (elsize)
13516     {
13517     case 16:
13518       if (regno > 7 || elno > 3)
13519         goto bad_scalar;
13520       return regno | (elno << 3);
13521
13522     case 32:
13523       if (regno > 15 || elno > 1)
13524         goto bad_scalar;
13525       return regno | (elno << 4);
13526
13527     default:
13528     bad_scalar:
13529       first_error (_("scalar out of range for multiply instruction"));
13530     }
13531
13532   return 0;
13533 }
13534
13535 /* Encode multiply / multiply-accumulate scalar instructions.  */
13536
13537 static void
13538 neon_mul_mac (struct neon_type_el et, int ubit)
13539 {
13540   unsigned scalar;
13541
13542   /* Give a more helpful error message if we have an invalid type.  */
13543   if (et.type == NT_invtype)
13544     return;
13545
13546   scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
13547   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13548   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13549   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13550   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13551   inst.instruction |= LOW4 (scalar);
13552   inst.instruction |= HI1 (scalar) << 5;
13553   inst.instruction |= (et.type == NT_float) << 8;
13554   inst.instruction |= neon_logbits (et.size) << 20;
13555   inst.instruction |= (ubit != 0) << 24;
13556
13557   neon_dp_fixup (&inst);
13558 }
13559
13560 static void
13561 do_neon_mac_maybe_scalar (void)
13562 {
13563   if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
13564     return;
13565
13566   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13567     return;
13568
13569   if (inst.operands[2].isscalar)
13570     {
13571       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
13572       struct neon_type_el et = neon_check_type (3, rs,
13573         N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
13574       NEON_ENCODE (SCALAR, inst);
13575       neon_mul_mac (et, neon_quad (rs));
13576     }
13577   else
13578     {
13579       /* The "untyped" case can't happen.  Do this to stop the "U" bit being
13580          affected if we specify unsigned args.  */
13581       neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13582     }
13583 }
13584
13585 static void
13586 do_neon_fmac (void)
13587 {
13588   if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
13589     return;
13590
13591   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13592     return;
13593
13594   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13595 }
13596
13597 static void
13598 do_neon_tst (void)
13599 {
13600   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13601   struct neon_type_el et = neon_check_type (3, rs,
13602     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
13603   neon_three_same (neon_quad (rs), 0, et.size);
13604 }
13605
13606 /* VMUL with 3 registers allows the P8 type. The scalar version supports the
13607    same types as the MAC equivalents. The polynomial type for this instruction
13608    is encoded the same as the integer type.  */
13609
13610 static void
13611 do_neon_mul (void)
13612 {
13613   if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
13614     return;
13615
13616   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13617     return;
13618
13619   if (inst.operands[2].isscalar)
13620     do_neon_mac_maybe_scalar ();
13621   else
13622     neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
13623 }
13624
13625 static void
13626 do_neon_qdmulh (void)
13627 {
13628   if (inst.operands[2].isscalar)
13629     {
13630       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
13631       struct neon_type_el et = neon_check_type (3, rs,
13632         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
13633       NEON_ENCODE (SCALAR, inst);
13634       neon_mul_mac (et, neon_quad (rs));
13635     }
13636   else
13637     {
13638       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13639       struct neon_type_el et = neon_check_type (3, rs,
13640         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
13641       NEON_ENCODE (INTEGER, inst);
13642       /* The U bit (rounding) comes from bit mask.  */
13643       neon_three_same (neon_quad (rs), 0, et.size);
13644     }
13645 }
13646
13647 static void
13648 do_neon_fcmp_absolute (void)
13649 {
13650   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13651   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
13652   /* Size field comes from bit mask.  */
13653   neon_three_same (neon_quad (rs), 1, -1);
13654 }
13655
13656 static void
13657 do_neon_fcmp_absolute_inv (void)
13658 {
13659   neon_exchange_operands ();
13660   do_neon_fcmp_absolute ();
13661 }
13662
13663 static void
13664 do_neon_step (void)
13665 {
13666   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13667   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
13668   neon_three_same (neon_quad (rs), 0, -1);
13669 }
13670
13671 static void
13672 do_neon_abs_neg (void)
13673 {
13674   enum neon_shape rs;
13675   struct neon_type_el et;
13676
13677   if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
13678     return;
13679
13680   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13681     return;
13682
13683   rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13684   et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
13685
13686   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13687   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13688   inst.instruction |= LOW4 (inst.operands[1].reg);
13689   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13690   inst.instruction |= neon_quad (rs) << 6;
13691   inst.instruction |= (et.type == NT_float) << 10;
13692   inst.instruction |= neon_logbits (et.size) << 18;
13693
13694   neon_dp_fixup (&inst);
13695 }
13696
13697 static void
13698 do_neon_sli (void)
13699 {
13700   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13701   struct neon_type_el et = neon_check_type (2, rs,
13702     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
13703   int imm = inst.operands[2].imm;
13704   constraint (imm < 0 || (unsigned)imm >= et.size,
13705               _("immediate out of range for insert"));
13706   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
13707 }
13708
13709 static void
13710 do_neon_sri (void)
13711 {
13712   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13713   struct neon_type_el et = neon_check_type (2, rs,
13714     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
13715   int imm = inst.operands[2].imm;
13716   constraint (imm < 1 || (unsigned)imm > et.size,
13717               _("immediate out of range for insert"));
13718   neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
13719 }
13720
13721 static void
13722 do_neon_qshlu_imm (void)
13723 {
13724   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13725   struct neon_type_el et = neon_check_type (2, rs,
13726     N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
13727   int imm = inst.operands[2].imm;
13728   constraint (imm < 0 || (unsigned)imm >= et.size,
13729               _("immediate out of range for shift"));
13730   /* Only encodes the 'U present' variant of the instruction.
13731      In this case, signed types have OP (bit 8) set to 0.
13732      Unsigned types have OP set to 1.  */
13733   inst.instruction |= (et.type == NT_unsigned) << 8;
13734   /* The rest of the bits are the same as other immediate shifts.  */
13735   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
13736 }
13737
13738 static void
13739 do_neon_qmovn (void)
13740 {
13741   struct neon_type_el et = neon_check_type (2, NS_DQ,
13742     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
13743   /* Saturating move where operands can be signed or unsigned, and the
13744      destination has the same signedness.  */
13745   NEON_ENCODE (INTEGER, inst);
13746   if (et.type == NT_unsigned)
13747     inst.instruction |= 0xc0;
13748   else
13749     inst.instruction |= 0x80;
13750   neon_two_same (0, 1, et.size / 2);
13751 }
13752
13753 static void
13754 do_neon_qmovun (void)
13755 {
13756   struct neon_type_el et = neon_check_type (2, NS_DQ,
13757     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
13758   /* Saturating move with unsigned results. Operands must be signed.  */
13759   NEON_ENCODE (INTEGER, inst);
13760   neon_two_same (0, 1, et.size / 2);
13761 }
13762
13763 static void
13764 do_neon_rshift_sat_narrow (void)
13765 {
13766   /* FIXME: Types for narrowing. If operands are signed, results can be signed
13767      or unsigned. If operands are unsigned, results must also be unsigned.  */
13768   struct neon_type_el et = neon_check_type (2, NS_DQI,
13769     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
13770   int imm = inst.operands[2].imm;
13771   /* This gets the bounds check, size encoding and immediate bits calculation
13772      right.  */
13773   et.size /= 2;
13774
13775   /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
13776      VQMOVN.I<size> <Dd>, <Qm>.  */
13777   if (imm == 0)
13778     {
13779       inst.operands[2].present = 0;
13780       inst.instruction = N_MNEM_vqmovn;
13781       do_neon_qmovn ();
13782       return;
13783     }
13784
13785   constraint (imm < 1 || (unsigned)imm > et.size,
13786               _("immediate out of range"));
13787   neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
13788 }
13789
13790 static void
13791 do_neon_rshift_sat_narrow_u (void)
13792 {
13793   /* FIXME: Types for narrowing. If operands are signed, results can be signed
13794      or unsigned. If operands are unsigned, results must also be unsigned.  */
13795   struct neon_type_el et = neon_check_type (2, NS_DQI,
13796     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
13797   int imm = inst.operands[2].imm;
13798   /* This gets the bounds check, size encoding and immediate bits calculation
13799      right.  */
13800   et.size /= 2;
13801
13802   /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
13803      VQMOVUN.I<size> <Dd>, <Qm>.  */
13804   if (imm == 0)
13805     {
13806       inst.operands[2].present = 0;
13807       inst.instruction = N_MNEM_vqmovun;
13808       do_neon_qmovun ();
13809       return;
13810     }
13811
13812   constraint (imm < 1 || (unsigned)imm > et.size,
13813               _("immediate out of range"));
13814   /* FIXME: The manual is kind of unclear about what value U should have in
13815      VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
13816      must be 1.  */
13817   neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
13818 }
13819
13820 static void
13821 do_neon_movn (void)
13822 {
13823   struct neon_type_el et = neon_check_type (2, NS_DQ,
13824     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
13825   NEON_ENCODE (INTEGER, inst);
13826   neon_two_same (0, 1, et.size / 2);
13827 }
13828
13829 static void
13830 do_neon_rshift_narrow (void)
13831 {
13832   struct neon_type_el et = neon_check_type (2, NS_DQI,
13833     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
13834   int imm = inst.operands[2].imm;
13835   /* This gets the bounds check, size encoding and immediate bits calculation
13836      right.  */
13837   et.size /= 2;
13838
13839   /* If immediate is zero then we are a pseudo-instruction for
13840      VMOVN.I<size> <Dd>, <Qm>  */
13841   if (imm == 0)
13842     {
13843       inst.operands[2].present = 0;
13844       inst.instruction = N_MNEM_vmovn;
13845       do_neon_movn ();
13846       return;
13847     }
13848
13849   constraint (imm < 1 || (unsigned)imm > et.size,
13850               _("immediate out of range for narrowing operation"));
13851   neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
13852 }
13853
13854 static void
13855 do_neon_shll (void)
13856 {
13857   /* FIXME: Type checking when lengthening.  */
13858   struct neon_type_el et = neon_check_type (2, NS_QDI,
13859     N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
13860   unsigned imm = inst.operands[2].imm;
13861
13862   if (imm == et.size)
13863     {
13864       /* Maximum shift variant.  */
13865       NEON_ENCODE (INTEGER, inst);
13866       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13867       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13868       inst.instruction |= LOW4 (inst.operands[1].reg);
13869       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13870       inst.instruction |= neon_logbits (et.size) << 18;
13871
13872       neon_dp_fixup (&inst);
13873     }
13874   else
13875     {
13876       /* A more-specific type check for non-max versions.  */
13877       et = neon_check_type (2, NS_QDI,
13878         N_EQK | N_DBL, N_SU_32 | N_KEY);
13879       NEON_ENCODE (IMMED, inst);
13880       neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
13881     }
13882 }
13883
13884 /* Check the various types for the VCVT instruction, and return which version
13885    the current instruction is.  */
13886
13887 static int
13888 neon_cvt_flavour (enum neon_shape rs)
13889 {
13890 #define CVT_VAR(C,X,Y)                                                  \
13891   et = neon_check_type (2, rs, whole_reg | (X), whole_reg | (Y));       \
13892   if (et.type != NT_invtype)                                            \
13893     {                                                                   \
13894       inst.error = NULL;                                                \
13895       return (C);                                                       \
13896     }
13897   struct neon_type_el et;
13898   unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
13899                         || rs == NS_FF) ? N_VFP : 0;
13900   /* The instruction versions which take an immediate take one register
13901      argument, which is extended to the width of the full register. Thus the
13902      "source" and "destination" registers must have the same width.  Hack that
13903      here by making the size equal to the key (wider, in this case) operand.  */
13904   unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
13905
13906   CVT_VAR (0, N_S32, N_F32);
13907   CVT_VAR (1, N_U32, N_F32);
13908   CVT_VAR (2, N_F32, N_S32);
13909   CVT_VAR (3, N_F32, N_U32);
13910   /* Half-precision conversions.  */
13911   CVT_VAR (4, N_F32, N_F16);
13912   CVT_VAR (5, N_F16, N_F32);
13913
13914   whole_reg = N_VFP;
13915
13916   /* VFP instructions.  */
13917   CVT_VAR (6, N_F32, N_F64);
13918   CVT_VAR (7, N_F64, N_F32);
13919   CVT_VAR (8, N_S32, N_F64 | key);
13920   CVT_VAR (9, N_U32, N_F64 | key);
13921   CVT_VAR (10, N_F64 | key, N_S32);
13922   CVT_VAR (11, N_F64 | key, N_U32);
13923   /* VFP instructions with bitshift.  */
13924   CVT_VAR (12, N_F32 | key, N_S16);
13925   CVT_VAR (13, N_F32 | key, N_U16);
13926   CVT_VAR (14, N_F64 | key, N_S16);
13927   CVT_VAR (15, N_F64 | key, N_U16);
13928   CVT_VAR (16, N_S16, N_F32 | key);
13929   CVT_VAR (17, N_U16, N_F32 | key);
13930   CVT_VAR (18, N_S16, N_F64 | key);
13931   CVT_VAR (19, N_U16, N_F64 | key);
13932
13933   return -1;
13934 #undef CVT_VAR
13935 }
13936
13937 /* Neon-syntax VFP conversions.  */
13938
13939 static void
13940 do_vfp_nsyn_cvt (enum neon_shape rs, int flavour)
13941 {
13942   const char *opname = 0;
13943
13944   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
13945     {
13946       /* Conversions with immediate bitshift.  */
13947       const char *enc[] =
13948         {
13949           "ftosls",
13950           "ftouls",
13951           "fsltos",
13952           "fultos",
13953           NULL,
13954           NULL,
13955           NULL,
13956           NULL,
13957           "ftosld",
13958           "ftould",
13959           "fsltod",
13960           "fultod",
13961           "fshtos",
13962           "fuhtos",
13963           "fshtod",
13964           "fuhtod",
13965           "ftoshs",
13966           "ftouhs",
13967           "ftoshd",
13968           "ftouhd"
13969         };
13970
13971       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
13972         {
13973           opname = enc[flavour];
13974           constraint (inst.operands[0].reg != inst.operands[1].reg,
13975                       _("operands 0 and 1 must be the same register"));
13976           inst.operands[1] = inst.operands[2];
13977           memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
13978         }
13979     }
13980   else
13981     {
13982       /* Conversions without bitshift.  */
13983       const char *enc[] =
13984         {
13985           "ftosis",
13986           "ftouis",
13987           "fsitos",
13988           "fuitos",
13989           "NULL",
13990           "NULL",
13991           "fcvtsd",
13992           "fcvtds",
13993           "ftosid",
13994           "ftouid",
13995           "fsitod",
13996           "fuitod"
13997         };
13998
13999       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
14000         opname = enc[flavour];
14001     }
14002
14003   if (opname)
14004     do_vfp_nsyn_opcode (opname);
14005 }
14006
14007 static void
14008 do_vfp_nsyn_cvtz (void)
14009 {
14010   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
14011   int flavour = neon_cvt_flavour (rs);
14012   const char *enc[] =
14013     {
14014       "ftosizs",
14015       "ftouizs",
14016       NULL,
14017       NULL,
14018       NULL,
14019       NULL,
14020       NULL,
14021       NULL,
14022       "ftosizd",
14023       "ftouizd"
14024     };
14025
14026   if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
14027     do_vfp_nsyn_opcode (enc[flavour]);
14028 }
14029
14030 static void
14031 do_neon_cvt_1 (bfd_boolean round_to_zero ATTRIBUTE_UNUSED)
14032 {
14033   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
14034     NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
14035   int flavour = neon_cvt_flavour (rs);
14036
14037   /* PR11109: Handle round-to-zero for VCVT conversions.  */
14038   if (round_to_zero
14039       && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
14040       && (flavour == 0 || flavour == 1 || flavour == 8 || flavour == 9)
14041       && (rs == NS_FD || rs == NS_FF))
14042     {
14043       do_vfp_nsyn_cvtz ();
14044       return;
14045     }
14046
14047   /* VFP rather than Neon conversions.  */
14048   if (flavour >= 6)
14049     {
14050       do_vfp_nsyn_cvt (rs, flavour);
14051       return;
14052     }
14053
14054   switch (rs)
14055     {
14056     case NS_DDI:
14057     case NS_QQI:
14058       {
14059         unsigned immbits;
14060         unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
14061
14062         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14063           return;
14064
14065         /* Fixed-point conversion with #0 immediate is encoded as an
14066            integer conversion.  */
14067         if (inst.operands[2].present && inst.operands[2].imm == 0)
14068           goto int_encode;
14069        immbits = 32 - inst.operands[2].imm;
14070         NEON_ENCODE (IMMED, inst);
14071         if (flavour != -1)
14072           inst.instruction |= enctab[flavour];
14073         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14074         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14075         inst.instruction |= LOW4 (inst.operands[1].reg);
14076         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14077         inst.instruction |= neon_quad (rs) << 6;
14078         inst.instruction |= 1 << 21;
14079         inst.instruction |= immbits << 16;
14080
14081         neon_dp_fixup (&inst);
14082       }
14083       break;
14084
14085     case NS_DD:
14086     case NS_QQ:
14087     int_encode:
14088       {
14089         unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
14090
14091         NEON_ENCODE (INTEGER, inst);
14092
14093         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14094           return;
14095
14096         if (flavour != -1)
14097           inst.instruction |= enctab[flavour];
14098
14099         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14100         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14101         inst.instruction |= LOW4 (inst.operands[1].reg);
14102         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14103         inst.instruction |= neon_quad (rs) << 6;
14104         inst.instruction |= 2 << 18;
14105
14106         neon_dp_fixup (&inst);
14107       }
14108     break;
14109
14110     /* Half-precision conversions for Advanced SIMD -- neon.  */
14111     case NS_QD:
14112     case NS_DQ:
14113
14114       if ((rs == NS_DQ)
14115           && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
14116           {
14117             as_bad (_("operand size must match register width"));
14118             break;
14119           }
14120
14121       if ((rs == NS_QD)
14122           && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
14123           {
14124             as_bad (_("operand size must match register width"));
14125             break;
14126           }
14127
14128       if (rs == NS_DQ)
14129         inst.instruction = 0x3b60600;
14130       else
14131         inst.instruction = 0x3b60700;
14132
14133       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14134       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14135       inst.instruction |= LOW4 (inst.operands[1].reg);
14136       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14137       neon_dp_fixup (&inst);
14138       break;
14139
14140     default:
14141       /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
14142       do_vfp_nsyn_cvt (rs, flavour);
14143     }
14144 }
14145
14146 static void
14147 do_neon_cvtr (void)
14148 {
14149   do_neon_cvt_1 (FALSE);
14150 }
14151
14152 static void
14153 do_neon_cvt (void)
14154 {
14155   do_neon_cvt_1 (TRUE);
14156 }
14157
14158 static void
14159 do_neon_cvtb (void)
14160 {
14161   inst.instruction = 0xeb20a40;
14162
14163   /* The sizes are attached to the mnemonic.  */
14164   if (inst.vectype.el[0].type != NT_invtype
14165       && inst.vectype.el[0].size == 16)
14166     inst.instruction |= 0x00010000;
14167
14168   /* Programmer's syntax: the sizes are attached to the operands.  */
14169   else if (inst.operands[0].vectype.type != NT_invtype
14170            && inst.operands[0].vectype.size == 16)
14171     inst.instruction |= 0x00010000;
14172
14173   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
14174   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
14175   do_vfp_cond_or_thumb ();
14176 }
14177
14178
14179 static void
14180 do_neon_cvtt (void)
14181 {
14182   do_neon_cvtb ();
14183   inst.instruction |= 0x80;
14184 }
14185
14186 static void
14187 neon_move_immediate (void)
14188 {
14189   enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
14190   struct neon_type_el et = neon_check_type (2, rs,
14191     N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
14192   unsigned immlo, immhi = 0, immbits;
14193   int op, cmode, float_p;
14194
14195   constraint (et.type == NT_invtype,
14196               _("operand size must be specified for immediate VMOV"));
14197
14198   /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
14199   op = (inst.instruction & (1 << 5)) != 0;
14200
14201   immlo = inst.operands[1].imm;
14202   if (inst.operands[1].regisimm)
14203     immhi = inst.operands[1].reg;
14204
14205   constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
14206               _("immediate has bits set outside the operand size"));
14207
14208   float_p = inst.operands[1].immisfloat;
14209
14210   if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
14211                                         et.size, et.type)) == FAIL)
14212     {
14213       /* Invert relevant bits only.  */
14214       neon_invert_size (&immlo, &immhi, et.size);
14215       /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
14216          with one or the other; those cases are caught by
14217          neon_cmode_for_move_imm.  */
14218       op = !op;
14219       if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
14220                                             &op, et.size, et.type)) == FAIL)
14221         {
14222           first_error (_("immediate out of range"));
14223           return;
14224         }
14225     }
14226
14227   inst.instruction &= ~(1 << 5);
14228   inst.instruction |= op << 5;
14229
14230   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14231   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14232   inst.instruction |= neon_quad (rs) << 6;
14233   inst.instruction |= cmode << 8;
14234
14235   neon_write_immbits (immbits);
14236 }
14237
14238 static void
14239 do_neon_mvn (void)
14240 {
14241   if (inst.operands[1].isreg)
14242     {
14243       enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14244
14245       NEON_ENCODE (INTEGER, inst);
14246       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14247       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14248       inst.instruction |= LOW4 (inst.operands[1].reg);
14249       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14250       inst.instruction |= neon_quad (rs) << 6;
14251     }
14252   else
14253     {
14254       NEON_ENCODE (IMMED, inst);
14255       neon_move_immediate ();
14256     }
14257
14258   neon_dp_fixup (&inst);
14259 }
14260
14261 /* Encode instructions of form:
14262
14263   |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
14264   |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |  */
14265
14266 static void
14267 neon_mixed_length (struct neon_type_el et, unsigned size)
14268 {
14269   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14270   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14271   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14272   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14273   inst.instruction |= LOW4 (inst.operands[2].reg);
14274   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14275   inst.instruction |= (et.type == NT_unsigned) << 24;
14276   inst.instruction |= neon_logbits (size) << 20;
14277
14278   neon_dp_fixup (&inst);
14279 }
14280
14281 static void
14282 do_neon_dyadic_long (void)
14283 {
14284   /* FIXME: Type checking for lengthening op.  */
14285   struct neon_type_el et = neon_check_type (3, NS_QDD,
14286     N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
14287   neon_mixed_length (et, et.size);
14288 }
14289
14290 static void
14291 do_neon_abal (void)
14292 {
14293   struct neon_type_el et = neon_check_type (3, NS_QDD,
14294     N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
14295   neon_mixed_length (et, et.size);
14296 }
14297
14298 static void
14299 neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
14300 {
14301   if (inst.operands[2].isscalar)
14302     {
14303       struct neon_type_el et = neon_check_type (3, NS_QDS,
14304         N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
14305       NEON_ENCODE (SCALAR, inst);
14306       neon_mul_mac (et, et.type == NT_unsigned);
14307     }
14308   else
14309     {
14310       struct neon_type_el et = neon_check_type (3, NS_QDD,
14311         N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
14312       NEON_ENCODE (INTEGER, inst);
14313       neon_mixed_length (et, et.size);
14314     }
14315 }
14316
14317 static void
14318 do_neon_mac_maybe_scalar_long (void)
14319 {
14320   neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
14321 }
14322
14323 static void
14324 do_neon_dyadic_wide (void)
14325 {
14326   struct neon_type_el et = neon_check_type (3, NS_QQD,
14327     N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
14328   neon_mixed_length (et, et.size);
14329 }
14330
14331 static void
14332 do_neon_dyadic_narrow (void)
14333 {
14334   struct neon_type_el et = neon_check_type (3, NS_QDD,
14335     N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
14336   /* Operand sign is unimportant, and the U bit is part of the opcode,
14337      so force the operand type to integer.  */
14338   et.type = NT_integer;
14339   neon_mixed_length (et, et.size / 2);
14340 }
14341
14342 static void
14343 do_neon_mul_sat_scalar_long (void)
14344 {
14345   neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
14346 }
14347
14348 static void
14349 do_neon_vmull (void)
14350 {
14351   if (inst.operands[2].isscalar)
14352     do_neon_mac_maybe_scalar_long ();
14353   else
14354     {
14355       struct neon_type_el et = neon_check_type (3, NS_QDD,
14356         N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_KEY);
14357       if (et.type == NT_poly)
14358         NEON_ENCODE (POLY, inst);
14359       else
14360         NEON_ENCODE (INTEGER, inst);
14361       /* For polynomial encoding, size field must be 0b00 and the U bit must be
14362          zero. Should be OK as-is.  */
14363       neon_mixed_length (et, et.size);
14364     }
14365 }
14366
14367 static void
14368 do_neon_ext (void)
14369 {
14370   enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
14371   struct neon_type_el et = neon_check_type (3, rs,
14372     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14373   unsigned imm = (inst.operands[3].imm * et.size) / 8;
14374
14375   constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
14376               _("shift out of range"));
14377   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14378   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14379   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14380   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14381   inst.instruction |= LOW4 (inst.operands[2].reg);
14382   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14383   inst.instruction |= neon_quad (rs) << 6;
14384   inst.instruction |= imm << 8;
14385
14386   neon_dp_fixup (&inst);
14387 }
14388
14389 static void
14390 do_neon_rev (void)
14391 {
14392   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14393   struct neon_type_el et = neon_check_type (2, rs,
14394     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14395   unsigned op = (inst.instruction >> 7) & 3;
14396   /* N (width of reversed regions) is encoded as part of the bitmask. We
14397      extract it here to check the elements to be reversed are smaller.
14398      Otherwise we'd get a reserved instruction.  */
14399   unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
14400   gas_assert (elsize != 0);
14401   constraint (et.size >= elsize,
14402               _("elements must be smaller than reversal region"));
14403   neon_two_same (neon_quad (rs), 1, et.size);
14404 }
14405
14406 static void
14407 do_neon_dup (void)
14408 {
14409   if (inst.operands[1].isscalar)
14410     {
14411       enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
14412       struct neon_type_el et = neon_check_type (2, rs,
14413         N_EQK, N_8 | N_16 | N_32 | N_KEY);
14414       unsigned sizebits = et.size >> 3;
14415       unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
14416       int logsize = neon_logbits (et.size);
14417       unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
14418
14419       if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
14420         return;
14421
14422       NEON_ENCODE (SCALAR, inst);
14423       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14424       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14425       inst.instruction |= LOW4 (dm);
14426       inst.instruction |= HI1 (dm) << 5;
14427       inst.instruction |= neon_quad (rs) << 6;
14428       inst.instruction |= x << 17;
14429       inst.instruction |= sizebits << 16;
14430
14431       neon_dp_fixup (&inst);
14432     }
14433   else
14434     {
14435       enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
14436       struct neon_type_el et = neon_check_type (2, rs,
14437         N_8 | N_16 | N_32 | N_KEY, N_EQK);
14438       /* Duplicate ARM register to lanes of vector.  */
14439       NEON_ENCODE (ARMREG, inst);
14440       switch (et.size)
14441         {
14442         case 8:  inst.instruction |= 0x400000; break;
14443         case 16: inst.instruction |= 0x000020; break;
14444         case 32: inst.instruction |= 0x000000; break;
14445         default: break;
14446         }
14447       inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
14448       inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
14449       inst.instruction |= HI1 (inst.operands[0].reg) << 7;
14450       inst.instruction |= neon_quad (rs) << 21;
14451       /* The encoding for this instruction is identical for the ARM and Thumb
14452          variants, except for the condition field.  */
14453       do_vfp_cond_or_thumb ();
14454     }
14455 }
14456
14457 /* VMOV has particularly many variations. It can be one of:
14458      0. VMOV<c><q> <Qd>, <Qm>
14459      1. VMOV<c><q> <Dd>, <Dm>
14460    (Register operations, which are VORR with Rm = Rn.)
14461      2. VMOV<c><q>.<dt> <Qd>, #<imm>
14462      3. VMOV<c><q>.<dt> <Dd>, #<imm>
14463    (Immediate loads.)
14464      4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
14465    (ARM register to scalar.)
14466      5. VMOV<c><q> <Dm>, <Rd>, <Rn>
14467    (Two ARM registers to vector.)
14468      6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
14469    (Scalar to ARM register.)
14470      7. VMOV<c><q> <Rd>, <Rn>, <Dm>
14471    (Vector to two ARM registers.)
14472      8. VMOV.F32 <Sd>, <Sm>
14473      9. VMOV.F64 <Dd>, <Dm>
14474    (VFP register moves.)
14475     10. VMOV.F32 <Sd>, #imm
14476     11. VMOV.F64 <Dd>, #imm
14477    (VFP float immediate load.)
14478     12. VMOV <Rd>, <Sm>
14479    (VFP single to ARM reg.)
14480     13. VMOV <Sd>, <Rm>
14481    (ARM reg to VFP single.)
14482     14. VMOV <Rd>, <Re>, <Sn>, <Sm>
14483    (Two ARM regs to two VFP singles.)
14484     15. VMOV <Sd>, <Se>, <Rn>, <Rm>
14485    (Two VFP singles to two ARM regs.)
14486
14487    These cases can be disambiguated using neon_select_shape, except cases 1/9
14488    and 3/11 which depend on the operand type too.
14489
14490    All the encoded bits are hardcoded by this function.
14491
14492    Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
14493    Cases 5, 7 may be used with VFPv2 and above.
14494
14495    FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
14496    can specify a type where it doesn't make sense to, and is ignored).  */
14497
14498 static void
14499 do_neon_mov (void)
14500 {
14501   enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
14502     NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
14503     NS_NULL);
14504   struct neon_type_el et;
14505   const char *ldconst = 0;
14506
14507   switch (rs)
14508     {
14509     case NS_DD:  /* case 1/9.  */
14510       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14511       /* It is not an error here if no type is given.  */
14512       inst.error = NULL;
14513       if (et.type == NT_float && et.size == 64)
14514         {
14515           do_vfp_nsyn_opcode ("fcpyd");
14516           break;
14517         }
14518       /* fall through.  */
14519
14520     case NS_QQ:  /* case 0/1.  */
14521       {
14522         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14523           return;
14524         /* The architecture manual I have doesn't explicitly state which
14525            value the U bit should have for register->register moves, but
14526            the equivalent VORR instruction has U = 0, so do that.  */
14527         inst.instruction = 0x0200110;
14528         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14529         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14530         inst.instruction |= LOW4 (inst.operands[1].reg);
14531         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14532         inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14533         inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14534         inst.instruction |= neon_quad (rs) << 6;
14535
14536         neon_dp_fixup (&inst);
14537       }
14538       break;
14539
14540     case NS_DI:  /* case 3/11.  */
14541       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14542       inst.error = NULL;
14543       if (et.type == NT_float && et.size == 64)
14544         {
14545           /* case 11 (fconstd).  */
14546           ldconst = "fconstd";
14547           goto encode_fconstd;
14548         }
14549       /* fall through.  */
14550
14551     case NS_QI:  /* case 2/3.  */
14552       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14553         return;
14554       inst.instruction = 0x0800010;
14555       neon_move_immediate ();
14556       neon_dp_fixup (&inst);
14557       break;
14558
14559     case NS_SR:  /* case 4.  */
14560       {
14561         unsigned bcdebits = 0;
14562         int logsize;
14563         unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
14564         unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
14565
14566         et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
14567         logsize = neon_logbits (et.size);
14568
14569         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
14570                     _(BAD_FPU));
14571         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
14572                     && et.size != 32, _(BAD_FPU));
14573         constraint (et.type == NT_invtype, _("bad type for scalar"));
14574         constraint (x >= 64 / et.size, _("scalar index out of range"));
14575
14576         switch (et.size)
14577           {
14578           case 8:  bcdebits = 0x8; break;
14579           case 16: bcdebits = 0x1; break;
14580           case 32: bcdebits = 0x0; break;
14581           default: ;
14582           }
14583
14584         bcdebits |= x << logsize;
14585
14586         inst.instruction = 0xe000b10;
14587         do_vfp_cond_or_thumb ();
14588         inst.instruction |= LOW4 (dn) << 16;
14589         inst.instruction |= HI1 (dn) << 7;
14590         inst.instruction |= inst.operands[1].reg << 12;
14591         inst.instruction |= (bcdebits & 3) << 5;
14592         inst.instruction |= (bcdebits >> 2) << 21;
14593       }
14594       break;
14595
14596     case NS_DRR:  /* case 5 (fmdrr).  */
14597       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
14598                   _(BAD_FPU));
14599
14600       inst.instruction = 0xc400b10;
14601       do_vfp_cond_or_thumb ();
14602       inst.instruction |= LOW4 (inst.operands[0].reg);
14603       inst.instruction |= HI1 (inst.operands[0].reg) << 5;
14604       inst.instruction |= inst.operands[1].reg << 12;
14605       inst.instruction |= inst.operands[2].reg << 16;
14606       break;
14607
14608     case NS_RS:  /* case 6.  */
14609       {
14610         unsigned logsize;
14611         unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
14612         unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
14613         unsigned abcdebits = 0;
14614
14615         et = neon_check_type (2, NS_NULL,
14616                               N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
14617         logsize = neon_logbits (et.size);
14618
14619         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
14620                     _(BAD_FPU));
14621         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
14622                     && et.size != 32, _(BAD_FPU));
14623         constraint (et.type == NT_invtype, _("bad type for scalar"));
14624         constraint (x >= 64 / et.size, _("scalar index out of range"));
14625
14626         switch (et.size)
14627           {
14628           case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
14629           case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
14630           case 32: abcdebits = 0x00; break;
14631           default: ;
14632           }
14633
14634         abcdebits |= x << logsize;
14635         inst.instruction = 0xe100b10;
14636         do_vfp_cond_or_thumb ();
14637         inst.instruction |= LOW4 (dn) << 16;
14638         inst.instruction |= HI1 (dn) << 7;
14639         inst.instruction |= inst.operands[0].reg << 12;
14640         inst.instruction |= (abcdebits & 3) << 5;
14641         inst.instruction |= (abcdebits >> 2) << 21;
14642       }
14643       break;
14644
14645     case NS_RRD:  /* case 7 (fmrrd).  */
14646       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
14647                   _(BAD_FPU));
14648
14649       inst.instruction = 0xc500b10;
14650       do_vfp_cond_or_thumb ();
14651       inst.instruction |= inst.operands[0].reg << 12;
14652       inst.instruction |= inst.operands[1].reg << 16;
14653       inst.instruction |= LOW4 (inst.operands[2].reg);
14654       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14655       break;
14656
14657     case NS_FF:  /* case 8 (fcpys).  */
14658       do_vfp_nsyn_opcode ("fcpys");
14659       break;
14660
14661     case NS_FI:  /* case 10 (fconsts).  */
14662       ldconst = "fconsts";
14663       encode_fconstd:
14664       if (is_quarter_float (inst.operands[1].imm))
14665         {
14666           inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
14667           do_vfp_nsyn_opcode (ldconst);
14668         }
14669       else
14670         first_error (_("immediate out of range"));
14671       break;
14672
14673     case NS_RF:  /* case 12 (fmrs).  */
14674       do_vfp_nsyn_opcode ("fmrs");
14675       break;
14676
14677     case NS_FR:  /* case 13 (fmsr).  */
14678       do_vfp_nsyn_opcode ("fmsr");
14679       break;
14680
14681     /* The encoders for the fmrrs and fmsrr instructions expect three operands
14682        (one of which is a list), but we have parsed four.  Do some fiddling to
14683        make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
14684        expect.  */
14685     case NS_RRFF:  /* case 14 (fmrrs).  */
14686       constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
14687                   _("VFP registers must be adjacent"));
14688       inst.operands[2].imm = 2;
14689       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
14690       do_vfp_nsyn_opcode ("fmrrs");
14691       break;
14692
14693     case NS_FFRR:  /* case 15 (fmsrr).  */
14694       constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
14695                   _("VFP registers must be adjacent"));
14696       inst.operands[1] = inst.operands[2];
14697       inst.operands[2] = inst.operands[3];
14698       inst.operands[0].imm = 2;
14699       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
14700       do_vfp_nsyn_opcode ("fmsrr");
14701       break;
14702
14703     default:
14704       abort ();
14705     }
14706 }
14707
14708 static void
14709 do_neon_rshift_round_imm (void)
14710 {
14711   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14712   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
14713   int imm = inst.operands[2].imm;
14714
14715   /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
14716   if (imm == 0)
14717     {
14718       inst.operands[2].present = 0;
14719       do_neon_mov ();
14720       return;
14721     }
14722
14723   constraint (imm < 1 || (unsigned)imm > et.size,
14724               _("immediate out of range for shift"));
14725   neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
14726                   et.size - imm);
14727 }
14728
14729 static void
14730 do_neon_movl (void)
14731 {
14732   struct neon_type_el et = neon_check_type (2, NS_QD,
14733     N_EQK | N_DBL, N_SU_32 | N_KEY);
14734   unsigned sizebits = et.size >> 3;
14735   inst.instruction |= sizebits << 19;
14736   neon_two_same (0, et.type == NT_unsigned, -1);
14737 }
14738
14739 static void
14740 do_neon_trn (void)
14741 {
14742   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14743   struct neon_type_el et = neon_check_type (2, rs,
14744     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14745   NEON_ENCODE (INTEGER, inst);
14746   neon_two_same (neon_quad (rs), 1, et.size);
14747 }
14748
14749 static void
14750 do_neon_zip_uzp (void)
14751 {
14752   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14753   struct neon_type_el et = neon_check_type (2, rs,
14754     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14755   if (rs == NS_DD && et.size == 32)
14756     {
14757       /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
14758       inst.instruction = N_MNEM_vtrn;
14759       do_neon_trn ();
14760       return;
14761     }
14762   neon_two_same (neon_quad (rs), 1, et.size);
14763 }
14764
14765 static void
14766 do_neon_sat_abs_neg (void)
14767 {
14768   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14769   struct neon_type_el et = neon_check_type (2, rs,
14770     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
14771   neon_two_same (neon_quad (rs), 1, et.size);
14772 }
14773
14774 static void
14775 do_neon_pair_long (void)
14776 {
14777   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14778   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
14779   /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
14780   inst.instruction |= (et.type == NT_unsigned) << 7;
14781   neon_two_same (neon_quad (rs), 1, et.size);
14782 }
14783
14784 static void
14785 do_neon_recip_est (void)
14786 {
14787   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14788   struct neon_type_el et = neon_check_type (2, rs,
14789     N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
14790   inst.instruction |= (et.type == NT_float) << 8;
14791   neon_two_same (neon_quad (rs), 1, et.size);
14792 }
14793
14794 static void
14795 do_neon_cls (void)
14796 {
14797   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14798   struct neon_type_el et = neon_check_type (2, rs,
14799     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
14800   neon_two_same (neon_quad (rs), 1, et.size);
14801 }
14802
14803 static void
14804 do_neon_clz (void)
14805 {
14806   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14807   struct neon_type_el et = neon_check_type (2, rs,
14808     N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
14809   neon_two_same (neon_quad (rs), 1, et.size);
14810 }
14811
14812 static void
14813 do_neon_cnt (void)
14814 {
14815   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14816   struct neon_type_el et = neon_check_type (2, rs,
14817     N_EQK | N_INT, N_8 | N_KEY);
14818   neon_two_same (neon_quad (rs), 1, et.size);
14819 }
14820
14821 static void
14822 do_neon_swp (void)
14823 {
14824   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14825   neon_two_same (neon_quad (rs), 1, -1);
14826 }
14827
14828 static void
14829 do_neon_tbl_tbx (void)
14830 {
14831   unsigned listlenbits;
14832   neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
14833
14834   if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
14835     {
14836       first_error (_("bad list length for table lookup"));
14837       return;
14838     }
14839
14840   listlenbits = inst.operands[1].imm - 1;
14841   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14842   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14843   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14844   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14845   inst.instruction |= LOW4 (inst.operands[2].reg);
14846   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14847   inst.instruction |= listlenbits << 8;
14848
14849   neon_dp_fixup (&inst);
14850 }
14851
14852 static void
14853 do_neon_ldm_stm (void)
14854 {
14855   /* P, U and L bits are part of bitmask.  */
14856   int is_dbmode = (inst.instruction & (1 << 24)) != 0;
14857   unsigned offsetbits = inst.operands[1].imm * 2;
14858
14859   if (inst.operands[1].issingle)
14860     {
14861       do_vfp_nsyn_ldm_stm (is_dbmode);
14862       return;
14863     }
14864
14865   constraint (is_dbmode && !inst.operands[0].writeback,
14866               _("writeback (!) must be used for VLDMDB and VSTMDB"));
14867
14868   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
14869               _("register list must contain at least 1 and at most 16 "
14870                 "registers"));
14871
14872   inst.instruction |= inst.operands[0].reg << 16;
14873   inst.instruction |= inst.operands[0].writeback << 21;
14874   inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
14875   inst.instruction |= HI1 (inst.operands[1].reg) << 22;
14876
14877   inst.instruction |= offsetbits;
14878
14879   do_vfp_cond_or_thumb ();
14880 }
14881
14882 static void
14883 do_neon_ldr_str (void)
14884 {
14885   int is_ldr = (inst.instruction & (1 << 20)) != 0;
14886
14887   /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
14888      And is UNPREDICTABLE in thumb mode.  */
14889   if (!is_ldr 
14890       && inst.operands[1].reg == REG_PC
14891       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
14892     {
14893       if (!thumb_mode && warn_on_deprecated)
14894         as_warn (_("Use of PC here is deprecated"));
14895       else
14896         inst.error = _("Use of PC here is UNPREDICTABLE");
14897     }
14898
14899   if (inst.operands[0].issingle)
14900     {
14901       if (is_ldr)
14902         do_vfp_nsyn_opcode ("flds");
14903       else
14904         do_vfp_nsyn_opcode ("fsts");
14905     }
14906   else
14907     {
14908       if (is_ldr)
14909         do_vfp_nsyn_opcode ("fldd");
14910       else
14911         do_vfp_nsyn_opcode ("fstd");
14912     }
14913 }
14914
14915 /* "interleave" version also handles non-interleaving register VLD1/VST1
14916    instructions.  */
14917
14918 static void
14919 do_neon_ld_st_interleave (void)
14920 {
14921   struct neon_type_el et = neon_check_type (1, NS_NULL,
14922                                             N_8 | N_16 | N_32 | N_64);
14923   unsigned alignbits = 0;
14924   unsigned idx;
14925   /* The bits in this table go:
14926      0: register stride of one (0) or two (1)
14927      1,2: register list length, minus one (1, 2, 3, 4).
14928      3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
14929      We use -1 for invalid entries.  */
14930   const int typetable[] =
14931     {
14932       0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
14933        -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
14934        -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
14935        -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
14936     };
14937   int typebits;
14938
14939   if (et.type == NT_invtype)
14940     return;
14941
14942   if (inst.operands[1].immisalign)
14943     switch (inst.operands[1].imm >> 8)
14944       {
14945       case 64: alignbits = 1; break;
14946       case 128:
14947         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
14948             && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
14949           goto bad_alignment;
14950         alignbits = 2;
14951         break;
14952       case 256:
14953         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
14954           goto bad_alignment;
14955         alignbits = 3;
14956         break;
14957       default:
14958       bad_alignment:
14959         first_error (_("bad alignment"));
14960         return;
14961       }
14962
14963   inst.instruction |= alignbits << 4;
14964   inst.instruction |= neon_logbits (et.size) << 6;
14965
14966   /* Bits [4:6] of the immediate in a list specifier encode register stride
14967      (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
14968      VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
14969      up the right value for "type" in a table based on this value and the given
14970      list style, then stick it back.  */
14971   idx = ((inst.operands[0].imm >> 4) & 7)
14972         | (((inst.instruction >> 8) & 3) << 3);
14973
14974   typebits = typetable[idx];
14975
14976   constraint (typebits == -1, _("bad list type for instruction"));
14977
14978   inst.instruction &= ~0xf00;
14979   inst.instruction |= typebits << 8;
14980 }
14981
14982 /* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
14983    *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
14984    otherwise. The variable arguments are a list of pairs of legal (size, align)
14985    values, terminated with -1.  */
14986
14987 static int
14988 neon_alignment_bit (int size, int align, int *do_align, ...)
14989 {
14990   va_list ap;
14991   int result = FAIL, thissize, thisalign;
14992
14993   if (!inst.operands[1].immisalign)
14994     {
14995       *do_align = 0;
14996       return SUCCESS;
14997     }
14998
14999   va_start (ap, do_align);
15000
15001   do
15002     {
15003       thissize = va_arg (ap, int);
15004       if (thissize == -1)
15005         break;
15006       thisalign = va_arg (ap, int);
15007
15008       if (size == thissize && align == thisalign)
15009         result = SUCCESS;
15010     }
15011   while (result != SUCCESS);
15012
15013   va_end (ap);
15014
15015   if (result == SUCCESS)
15016     *do_align = 1;
15017   else
15018     first_error (_("unsupported alignment for instruction"));
15019
15020   return result;
15021 }
15022
15023 static void
15024 do_neon_ld_st_lane (void)
15025 {
15026   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15027   int align_good, do_align = 0;
15028   int logsize = neon_logbits (et.size);
15029   int align = inst.operands[1].imm >> 8;
15030   int n = (inst.instruction >> 8) & 3;
15031   int max_el = 64 / et.size;
15032
15033   if (et.type == NT_invtype)
15034     return;
15035
15036   constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
15037               _("bad list length"));
15038   constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
15039               _("scalar index out of range"));
15040   constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
15041               && et.size == 8,
15042               _("stride of 2 unavailable when element size is 8"));
15043
15044   switch (n)
15045     {
15046     case 0:  /* VLD1 / VST1.  */
15047       align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
15048                                        32, 32, -1);
15049       if (align_good == FAIL)
15050         return;
15051       if (do_align)
15052         {
15053           unsigned alignbits = 0;
15054           switch (et.size)
15055             {
15056             case 16: alignbits = 0x1; break;
15057             case 32: alignbits = 0x3; break;
15058             default: ;
15059             }
15060           inst.instruction |= alignbits << 4;
15061         }
15062       break;
15063
15064     case 1:  /* VLD2 / VST2.  */
15065       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
15066                                        32, 64, -1);
15067       if (align_good == FAIL)
15068         return;
15069       if (do_align)
15070         inst.instruction |= 1 << 4;
15071       break;
15072
15073     case 2:  /* VLD3 / VST3.  */
15074       constraint (inst.operands[1].immisalign,
15075                   _("can't use alignment with this instruction"));
15076       break;
15077
15078     case 3:  /* VLD4 / VST4.  */
15079       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15080                                        16, 64, 32, 64, 32, 128, -1);
15081       if (align_good == FAIL)
15082         return;
15083       if (do_align)
15084         {
15085           unsigned alignbits = 0;
15086           switch (et.size)
15087             {
15088             case 8:  alignbits = 0x1; break;
15089             case 16: alignbits = 0x1; break;
15090             case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
15091             default: ;
15092             }
15093           inst.instruction |= alignbits << 4;
15094         }
15095       break;
15096
15097     default: ;
15098     }
15099
15100   /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
15101   if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15102     inst.instruction |= 1 << (4 + logsize);
15103
15104   inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
15105   inst.instruction |= logsize << 10;
15106 }
15107
15108 /* Encode single n-element structure to all lanes VLD<n> instructions.  */
15109
15110 static void
15111 do_neon_ld_dup (void)
15112 {
15113   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15114   int align_good, do_align = 0;
15115
15116   if (et.type == NT_invtype)
15117     return;
15118
15119   switch ((inst.instruction >> 8) & 3)
15120     {
15121     case 0:  /* VLD1.  */
15122       gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
15123       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15124                                        &do_align, 16, 16, 32, 32, -1);
15125       if (align_good == FAIL)
15126         return;
15127       switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
15128         {
15129         case 1: break;
15130         case 2: inst.instruction |= 1 << 5; break;
15131         default: first_error (_("bad list length")); return;
15132         }
15133       inst.instruction |= neon_logbits (et.size) << 6;
15134       break;
15135
15136     case 1:  /* VLD2.  */
15137       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15138                                        &do_align, 8, 16, 16, 32, 32, 64, -1);
15139       if (align_good == FAIL)
15140         return;
15141       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
15142                   _("bad list length"));
15143       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15144         inst.instruction |= 1 << 5;
15145       inst.instruction |= neon_logbits (et.size) << 6;
15146       break;
15147
15148     case 2:  /* VLD3.  */
15149       constraint (inst.operands[1].immisalign,
15150                   _("can't use alignment with this instruction"));
15151       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
15152                   _("bad list length"));
15153       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15154         inst.instruction |= 1 << 5;
15155       inst.instruction |= neon_logbits (et.size) << 6;
15156       break;
15157
15158     case 3:  /* VLD4.  */
15159       {
15160         int align = inst.operands[1].imm >> 8;
15161         align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15162                                          16, 64, 32, 64, 32, 128, -1);
15163         if (align_good == FAIL)
15164           return;
15165         constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
15166                     _("bad list length"));
15167         if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15168           inst.instruction |= 1 << 5;
15169         if (et.size == 32 && align == 128)
15170           inst.instruction |= 0x3 << 6;
15171         else
15172           inst.instruction |= neon_logbits (et.size) << 6;
15173       }
15174       break;
15175
15176     default: ;
15177     }
15178
15179   inst.instruction |= do_align << 4;
15180 }
15181
15182 /* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
15183    apart from bits [11:4].  */
15184
15185 static void
15186 do_neon_ldx_stx (void)
15187 {
15188   if (inst.operands[1].isreg)
15189     constraint (inst.operands[1].reg == REG_PC, BAD_PC);
15190
15191   switch (NEON_LANE (inst.operands[0].imm))
15192     {
15193     case NEON_INTERLEAVE_LANES:
15194       NEON_ENCODE (INTERLV, inst);
15195       do_neon_ld_st_interleave ();
15196       break;
15197
15198     case NEON_ALL_LANES:
15199       NEON_ENCODE (DUP, inst);
15200       do_neon_ld_dup ();
15201       break;
15202
15203     default:
15204       NEON_ENCODE (LANE, inst);
15205       do_neon_ld_st_lane ();
15206     }
15207
15208   /* L bit comes from bit mask.  */
15209   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15210   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15211   inst.instruction |= inst.operands[1].reg << 16;
15212
15213   if (inst.operands[1].postind)
15214     {
15215       int postreg = inst.operands[1].imm & 0xf;
15216       constraint (!inst.operands[1].immisreg,
15217                   _("post-index must be a register"));
15218       constraint (postreg == 0xd || postreg == 0xf,
15219                   _("bad register for post-index"));
15220       inst.instruction |= postreg;
15221     }
15222   else if (inst.operands[1].writeback)
15223     {
15224       inst.instruction |= 0xd;
15225     }
15226   else
15227     inst.instruction |= 0xf;
15228
15229   if (thumb_mode)
15230     inst.instruction |= 0xf9000000;
15231   else
15232     inst.instruction |= 0xf4000000;
15233 }
15234 \f
15235 /* Overall per-instruction processing.  */
15236
15237 /* We need to be able to fix up arbitrary expressions in some statements.
15238    This is so that we can handle symbols that are an arbitrary distance from
15239    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
15240    which returns part of an address in a form which will be valid for
15241    a data instruction.  We do this by pushing the expression into a symbol
15242    in the expr_section, and creating a fix for that.  */
15243
15244 static void
15245 fix_new_arm (fragS *       frag,
15246              int           where,
15247              short int     size,
15248              expressionS * exp,
15249              int           pc_rel,
15250              int           reloc)
15251 {
15252   fixS *           new_fix;
15253
15254   switch (exp->X_op)
15255     {
15256     case O_constant:
15257     case O_symbol:
15258     case O_add:
15259     case O_subtract:
15260       new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
15261                              (enum bfd_reloc_code_real) reloc);
15262       break;
15263
15264     default:
15265       new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
15266                                   pc_rel, (enum bfd_reloc_code_real) reloc);
15267       break;
15268     }
15269
15270   /* Mark whether the fix is to a THUMB instruction, or an ARM
15271      instruction.  */
15272   new_fix->tc_fix_data = thumb_mode;
15273 }
15274
15275 /* Create a frg for an instruction requiring relaxation.  */
15276 static void
15277 output_relax_insn (void)
15278 {
15279   char * to;
15280   symbolS *sym;
15281   int offset;
15282
15283   /* The size of the instruction is unknown, so tie the debug info to the
15284      start of the instruction.  */
15285   dwarf2_emit_insn (0);
15286
15287   switch (inst.reloc.exp.X_op)
15288     {
15289     case O_symbol:
15290       sym = inst.reloc.exp.X_add_symbol;
15291       offset = inst.reloc.exp.X_add_number;
15292       break;
15293     case O_constant:
15294       sym = NULL;
15295       offset = inst.reloc.exp.X_add_number;
15296       break;
15297     default:
15298       sym = make_expr_symbol (&inst.reloc.exp);
15299       offset = 0;
15300       break;
15301   }
15302   to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
15303                  inst.relax, sym, offset, NULL/*offset, opcode*/);
15304   md_number_to_chars (to, inst.instruction, THUMB_SIZE);
15305 }
15306
15307 /* Write a 32-bit thumb instruction to buf.  */
15308 static void
15309 put_thumb32_insn (char * buf, unsigned long insn)
15310 {
15311   md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
15312   md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
15313 }
15314
15315 static void
15316 output_inst (const char * str)
15317 {
15318   char * to = NULL;
15319
15320   if (inst.error)
15321     {
15322       as_bad ("%s -- `%s'", inst.error, str);
15323       return;
15324     }
15325   if (inst.relax)
15326     {
15327       output_relax_insn ();
15328       return;
15329     }
15330   if (inst.size == 0)
15331     return;
15332
15333   to = frag_more (inst.size);
15334   /* PR 9814: Record the thumb mode into the current frag so that we know
15335      what type of NOP padding to use, if necessary.  We override any previous
15336      setting so that if the mode has changed then the NOPS that we use will
15337      match the encoding of the last instruction in the frag.  */
15338   frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
15339
15340   if (thumb_mode && (inst.size > THUMB_SIZE))
15341     {
15342       gas_assert (inst.size == (2 * THUMB_SIZE));
15343       put_thumb32_insn (to, inst.instruction);
15344     }
15345   else if (inst.size > INSN_SIZE)
15346     {
15347       gas_assert (inst.size == (2 * INSN_SIZE));
15348       md_number_to_chars (to, inst.instruction, INSN_SIZE);
15349       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
15350     }
15351   else
15352     md_number_to_chars (to, inst.instruction, inst.size);
15353
15354   if (inst.reloc.type != BFD_RELOC_UNUSED)
15355     fix_new_arm (frag_now, to - frag_now->fr_literal,
15356                  inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
15357                  inst.reloc.type);
15358
15359   dwarf2_emit_insn (inst.size);
15360 }
15361
15362 static char *
15363 output_it_inst (int cond, int mask, char * to)
15364 {
15365   unsigned long instruction = 0xbf00;
15366
15367   mask &= 0xf;
15368   instruction |= mask;
15369   instruction |= cond << 4;
15370
15371   if (to == NULL)
15372     {
15373       to = frag_more (2);
15374 #ifdef OBJ_ELF
15375       dwarf2_emit_insn (2);
15376 #endif
15377     }
15378
15379   md_number_to_chars (to, instruction, 2);
15380
15381   return to;
15382 }
15383
15384 /* Tag values used in struct asm_opcode's tag field.  */
15385 enum opcode_tag
15386 {
15387   OT_unconditional,     /* Instruction cannot be conditionalized.
15388                            The ARM condition field is still 0xE.  */
15389   OT_unconditionalF,    /* Instruction cannot be conditionalized
15390                            and carries 0xF in its ARM condition field.  */
15391   OT_csuffix,           /* Instruction takes a conditional suffix.  */
15392   OT_csuffixF,          /* Some forms of the instruction take a conditional
15393                            suffix, others place 0xF where the condition field
15394                            would be.  */
15395   OT_cinfix3,           /* Instruction takes a conditional infix,
15396                            beginning at character index 3.  (In
15397                            unified mode, it becomes a suffix.)  */
15398   OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
15399                             tsts, cmps, cmns, and teqs. */
15400   OT_cinfix3_legacy,    /* Legacy instruction takes a conditional infix at
15401                            character index 3, even in unified mode.  Used for
15402                            legacy instructions where suffix and infix forms
15403                            may be ambiguous.  */
15404   OT_csuf_or_in3,       /* Instruction takes either a conditional
15405                            suffix or an infix at character index 3.  */
15406   OT_odd_infix_unc,     /* This is the unconditional variant of an
15407                            instruction that takes a conditional infix
15408                            at an unusual position.  In unified mode,
15409                            this variant will accept a suffix.  */
15410   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
15411                            are the conditional variants of instructions that
15412                            take conditional infixes in unusual positions.
15413                            The infix appears at character index
15414                            (tag - OT_odd_infix_0).  These are not accepted
15415                            in unified mode.  */
15416 };
15417
15418 /* Subroutine of md_assemble, responsible for looking up the primary
15419    opcode from the mnemonic the user wrote.  STR points to the
15420    beginning of the mnemonic.
15421
15422    This is not simply a hash table lookup, because of conditional
15423    variants.  Most instructions have conditional variants, which are
15424    expressed with a _conditional affix_ to the mnemonic.  If we were
15425    to encode each conditional variant as a literal string in the opcode
15426    table, it would have approximately 20,000 entries.
15427
15428    Most mnemonics take this affix as a suffix, and in unified syntax,
15429    'most' is upgraded to 'all'.  However, in the divided syntax, some
15430    instructions take the affix as an infix, notably the s-variants of
15431    the arithmetic instructions.  Of those instructions, all but six
15432    have the infix appear after the third character of the mnemonic.
15433
15434    Accordingly, the algorithm for looking up primary opcodes given
15435    an identifier is:
15436
15437    1. Look up the identifier in the opcode table.
15438       If we find a match, go to step U.
15439
15440    2. Look up the last two characters of the identifier in the
15441       conditions table.  If we find a match, look up the first N-2
15442       characters of the identifier in the opcode table.  If we
15443       find a match, go to step CE.
15444
15445    3. Look up the fourth and fifth characters of the identifier in
15446       the conditions table.  If we find a match, extract those
15447       characters from the identifier, and look up the remaining
15448       characters in the opcode table.  If we find a match, go
15449       to step CM.
15450
15451    4. Fail.
15452
15453    U. Examine the tag field of the opcode structure, in case this is
15454       one of the six instructions with its conditional infix in an
15455       unusual place.  If it is, the tag tells us where to find the
15456       infix; look it up in the conditions table and set inst.cond
15457       accordingly.  Otherwise, this is an unconditional instruction.
15458       Again set inst.cond accordingly.  Return the opcode structure.
15459
15460   CE. Examine the tag field to make sure this is an instruction that
15461       should receive a conditional suffix.  If it is not, fail.
15462       Otherwise, set inst.cond from the suffix we already looked up,
15463       and return the opcode structure.
15464
15465   CM. Examine the tag field to make sure this is an instruction that
15466       should receive a conditional infix after the third character.
15467       If it is not, fail.  Otherwise, undo the edits to the current
15468       line of input and proceed as for case CE.  */
15469
15470 static const struct asm_opcode *
15471 opcode_lookup (char **str)
15472 {
15473   char *end, *base;
15474   char *affix;
15475   const struct asm_opcode *opcode;
15476   const struct asm_cond *cond;
15477   char save[2];
15478
15479   /* Scan up to the end of the mnemonic, which must end in white space,
15480      '.' (in unified mode, or for Neon/VFP instructions), or end of string.  */
15481   for (base = end = *str; *end != '\0'; end++)
15482     if (*end == ' ' || *end == '.')
15483       break;
15484
15485   if (end == base)
15486     return NULL;
15487
15488   /* Handle a possible width suffix and/or Neon type suffix.  */
15489   if (end[0] == '.')
15490     {
15491       int offset = 2;
15492
15493       /* The .w and .n suffixes are only valid if the unified syntax is in
15494          use.  */
15495       if (unified_syntax && end[1] == 'w')
15496         inst.size_req = 4;
15497       else if (unified_syntax && end[1] == 'n')
15498         inst.size_req = 2;
15499       else
15500         offset = 0;
15501
15502       inst.vectype.elems = 0;
15503
15504       *str = end + offset;
15505
15506       if (end[offset] == '.')
15507         {
15508           /* See if we have a Neon type suffix (possible in either unified or
15509              non-unified ARM syntax mode).  */
15510           if (parse_neon_type (&inst.vectype, str) == FAIL)
15511             return NULL;
15512         }
15513       else if (end[offset] != '\0' && end[offset] != ' ')
15514         return NULL;
15515     }
15516   else
15517     *str = end;
15518
15519   /* Look for unaffixed or special-case affixed mnemonic.  */
15520   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15521                                                     end - base);
15522   if (opcode)
15523     {
15524       /* step U */
15525       if (opcode->tag < OT_odd_infix_0)
15526         {
15527           inst.cond = COND_ALWAYS;
15528           return opcode;
15529         }
15530
15531       if (warn_on_deprecated && unified_syntax)
15532         as_warn (_("conditional infixes are deprecated in unified syntax"));
15533       affix = base + (opcode->tag - OT_odd_infix_0);
15534       cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15535       gas_assert (cond);
15536
15537       inst.cond = cond->value;
15538       return opcode;
15539     }
15540
15541   /* Cannot have a conditional suffix on a mnemonic of less than two
15542      characters.  */
15543   if (end - base < 3)
15544     return NULL;
15545
15546   /* Look for suffixed mnemonic.  */
15547   affix = end - 2;
15548   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15549   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15550                                                     affix - base);
15551   if (opcode && cond)
15552     {
15553       /* step CE */
15554       switch (opcode->tag)
15555         {
15556         case OT_cinfix3_legacy:
15557           /* Ignore conditional suffixes matched on infix only mnemonics.  */
15558           break;
15559
15560         case OT_cinfix3:
15561         case OT_cinfix3_deprecated:
15562         case OT_odd_infix_unc:
15563           if (!unified_syntax)
15564             return 0;
15565           /* else fall through */
15566
15567         case OT_csuffix:
15568         case OT_csuffixF:
15569         case OT_csuf_or_in3:
15570           inst.cond = cond->value;
15571           return opcode;
15572
15573         case OT_unconditional:
15574         case OT_unconditionalF:
15575           if (thumb_mode)
15576             inst.cond = cond->value;
15577           else
15578             {
15579               /* Delayed diagnostic.  */
15580               inst.error = BAD_COND;
15581               inst.cond = COND_ALWAYS;
15582             }
15583           return opcode;
15584
15585         default:
15586           return NULL;
15587         }
15588     }
15589
15590   /* Cannot have a usual-position infix on a mnemonic of less than
15591      six characters (five would be a suffix).  */
15592   if (end - base < 6)
15593     return NULL;
15594
15595   /* Look for infixed mnemonic in the usual position.  */
15596   affix = base + 3;
15597   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15598   if (!cond)
15599     return NULL;
15600
15601   memcpy (save, affix, 2);
15602   memmove (affix, affix + 2, (end - affix) - 2);
15603   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15604                                                     (end - base) - 2);
15605   memmove (affix + 2, affix, (end - affix) - 2);
15606   memcpy (affix, save, 2);
15607
15608   if (opcode
15609       && (opcode->tag == OT_cinfix3
15610           || opcode->tag == OT_cinfix3_deprecated
15611           || opcode->tag == OT_csuf_or_in3
15612           || opcode->tag == OT_cinfix3_legacy))
15613     {
15614       /* Step CM.  */
15615       if (warn_on_deprecated && unified_syntax
15616           && (opcode->tag == OT_cinfix3
15617               || opcode->tag == OT_cinfix3_deprecated))
15618         as_warn (_("conditional infixes are deprecated in unified syntax"));
15619
15620       inst.cond = cond->value;
15621       return opcode;
15622     }
15623
15624   return NULL;
15625 }
15626
15627 /* This function generates an initial IT instruction, leaving its block
15628    virtually open for the new instructions. Eventually,
15629    the mask will be updated by now_it_add_mask () each time
15630    a new instruction needs to be included in the IT block.
15631    Finally, the block is closed with close_automatic_it_block ().
15632    The block closure can be requested either from md_assemble (),
15633    a tencode (), or due to a label hook.  */
15634
15635 static void
15636 new_automatic_it_block (int cond)
15637 {
15638   now_it.state = AUTOMATIC_IT_BLOCK;
15639   now_it.mask = 0x18;
15640   now_it.cc = cond;
15641   now_it.block_length = 1;
15642   mapping_state (MAP_THUMB);
15643   now_it.insn = output_it_inst (cond, now_it.mask, NULL);
15644 }
15645
15646 /* Close an automatic IT block.
15647    See comments in new_automatic_it_block ().  */
15648
15649 static void
15650 close_automatic_it_block (void)
15651 {
15652   now_it.mask = 0x10;
15653   now_it.block_length = 0;
15654 }
15655
15656 /* Update the mask of the current automatically-generated IT
15657    instruction. See comments in new_automatic_it_block ().  */
15658
15659 static void
15660 now_it_add_mask (int cond)
15661 {
15662 #define CLEAR_BIT(value, nbit)  ((value) & ~(1 << (nbit)))
15663 #define SET_BIT_VALUE(value, bitvalue, nbit)  (CLEAR_BIT (value, nbit) \
15664                                               | ((bitvalue) << (nbit)))
15665   const int resulting_bit = (cond & 1);
15666
15667   now_it.mask &= 0xf;
15668   now_it.mask = SET_BIT_VALUE (now_it.mask,
15669                                    resulting_bit,
15670                                   (5 - now_it.block_length));
15671   now_it.mask = SET_BIT_VALUE (now_it.mask,
15672                                    1,
15673                                    ((5 - now_it.block_length) - 1) );
15674   output_it_inst (now_it.cc, now_it.mask, now_it.insn);
15675
15676 #undef CLEAR_BIT
15677 #undef SET_BIT_VALUE
15678 }
15679
15680 /* The IT blocks handling machinery is accessed through the these functions:
15681      it_fsm_pre_encode ()               from md_assemble ()
15682      set_it_insn_type ()                optional, from the tencode functions
15683      set_it_insn_type_last ()           ditto
15684      in_it_block ()                     ditto
15685      it_fsm_post_encode ()              from md_assemble ()
15686      force_automatic_it_block_close ()  from label habdling functions
15687
15688    Rationale:
15689      1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
15690         initializing the IT insn type with a generic initial value depending
15691         on the inst.condition.
15692      2) During the tencode function, two things may happen:
15693         a) The tencode function overrides the IT insn type by
15694            calling either set_it_insn_type (type) or set_it_insn_type_last ().
15695         b) The tencode function queries the IT block state by
15696            calling in_it_block () (i.e. to determine narrow/not narrow mode).
15697
15698         Both set_it_insn_type and in_it_block run the internal FSM state
15699         handling function (handle_it_state), because: a) setting the IT insn
15700         type may incur in an invalid state (exiting the function),
15701         and b) querying the state requires the FSM to be updated.
15702         Specifically we want to avoid creating an IT block for conditional
15703         branches, so it_fsm_pre_encode is actually a guess and we can't
15704         determine whether an IT block is required until the tencode () routine
15705         has decided what type of instruction this actually it.
15706         Because of this, if set_it_insn_type and in_it_block have to be used,
15707         set_it_insn_type has to be called first.
15708
15709         set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
15710         determines the insn IT type depending on the inst.cond code.
15711         When a tencode () routine encodes an instruction that can be
15712         either outside an IT block, or, in the case of being inside, has to be
15713         the last one, set_it_insn_type_last () will determine the proper
15714         IT instruction type based on the inst.cond code. Otherwise,
15715         set_it_insn_type can be called for overriding that logic or
15716         for covering other cases.
15717
15718         Calling handle_it_state () may not transition the IT block state to
15719         OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
15720         still queried. Instead, if the FSM determines that the state should
15721         be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
15722         after the tencode () function: that's what it_fsm_post_encode () does.
15723
15724         Since in_it_block () calls the state handling function to get an
15725         updated state, an error may occur (due to invalid insns combination).
15726         In that case, inst.error is set.
15727         Therefore, inst.error has to be checked after the execution of
15728         the tencode () routine.
15729
15730      3) Back in md_assemble(), it_fsm_post_encode () is called to commit
15731         any pending state change (if any) that didn't take place in
15732         handle_it_state () as explained above.  */
15733
15734 static void
15735 it_fsm_pre_encode (void)
15736 {
15737   if (inst.cond != COND_ALWAYS)
15738     inst.it_insn_type = INSIDE_IT_INSN;
15739   else
15740     inst.it_insn_type = OUTSIDE_IT_INSN;
15741
15742   now_it.state_handled = 0;
15743 }
15744
15745 /* IT state FSM handling function.  */
15746
15747 static int
15748 handle_it_state (void)
15749 {
15750   now_it.state_handled = 1;
15751
15752   switch (now_it.state)
15753     {
15754     case OUTSIDE_IT_BLOCK:
15755       switch (inst.it_insn_type)
15756         {
15757         case OUTSIDE_IT_INSN:
15758           break;
15759
15760         case INSIDE_IT_INSN:
15761         case INSIDE_IT_LAST_INSN:
15762           if (thumb_mode == 0)
15763             {
15764               if (unified_syntax
15765                   && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
15766                 as_tsktsk (_("Warning: conditional outside an IT block"\
15767                              " for Thumb."));
15768             }
15769           else
15770             {
15771               if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
15772                   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
15773                 {
15774                   /* Automatically generate the IT instruction.  */
15775                   new_automatic_it_block (inst.cond);
15776                   if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
15777                     close_automatic_it_block ();
15778                 }
15779               else
15780                 {
15781                   inst.error = BAD_OUT_IT;
15782                   return FAIL;
15783                 }
15784             }
15785           break;
15786
15787         case IF_INSIDE_IT_LAST_INSN:
15788         case NEUTRAL_IT_INSN:
15789           break;
15790
15791         case IT_INSN:
15792           now_it.state = MANUAL_IT_BLOCK;
15793           now_it.block_length = 0;
15794           break;
15795         }
15796       break;
15797
15798     case AUTOMATIC_IT_BLOCK:
15799       /* Three things may happen now:
15800          a) We should increment current it block size;
15801          b) We should close current it block (closing insn or 4 insns);
15802          c) We should close current it block and start a new one (due
15803          to incompatible conditions or
15804          4 insns-length block reached).  */
15805
15806       switch (inst.it_insn_type)
15807         {
15808         case OUTSIDE_IT_INSN:
15809           /* The closure of the block shall happen immediatelly,
15810              so any in_it_block () call reports the block as closed.  */
15811           force_automatic_it_block_close ();
15812           break;
15813
15814         case INSIDE_IT_INSN:
15815         case INSIDE_IT_LAST_INSN:
15816         case IF_INSIDE_IT_LAST_INSN:
15817           now_it.block_length++;
15818
15819           if (now_it.block_length > 4
15820               || !now_it_compatible (inst.cond))
15821             {
15822               force_automatic_it_block_close ();
15823               if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
15824                 new_automatic_it_block (inst.cond);
15825             }
15826           else
15827             {
15828               now_it_add_mask (inst.cond);
15829             }
15830
15831           if (now_it.state == AUTOMATIC_IT_BLOCK
15832               && (inst.it_insn_type == INSIDE_IT_LAST_INSN
15833                   || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
15834             close_automatic_it_block ();
15835           break;
15836
15837         case NEUTRAL_IT_INSN:
15838           now_it.block_length++;
15839
15840           if (now_it.block_length > 4)
15841             force_automatic_it_block_close ();
15842           else
15843             now_it_add_mask (now_it.cc & 1);
15844           break;
15845
15846         case IT_INSN:
15847           close_automatic_it_block ();
15848           now_it.state = MANUAL_IT_BLOCK;
15849           break;
15850         }
15851       break;
15852
15853     case MANUAL_IT_BLOCK:
15854       {
15855         /* Check conditional suffixes.  */
15856         const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
15857         int is_last;
15858         now_it.mask <<= 1;
15859         now_it.mask &= 0x1f;
15860         is_last = (now_it.mask == 0x10);
15861
15862         switch (inst.it_insn_type)
15863           {
15864           case OUTSIDE_IT_INSN:
15865             inst.error = BAD_NOT_IT;
15866             return FAIL;
15867
15868           case INSIDE_IT_INSN:
15869             if (cond != inst.cond)
15870               {
15871                 inst.error = BAD_IT_COND;
15872                 return FAIL;
15873               }
15874             break;
15875
15876           case INSIDE_IT_LAST_INSN:
15877           case IF_INSIDE_IT_LAST_INSN:
15878             if (cond != inst.cond)
15879               {
15880                 inst.error = BAD_IT_COND;
15881                 return FAIL;
15882               }
15883             if (!is_last)
15884               {
15885                 inst.error = BAD_BRANCH;
15886                 return FAIL;
15887               }
15888             break;
15889
15890           case NEUTRAL_IT_INSN:
15891             /* The BKPT instruction is unconditional even in an IT block.  */
15892             break;
15893
15894           case IT_INSN:
15895             inst.error = BAD_IT_IT;
15896             return FAIL;
15897           }
15898       }
15899       break;
15900     }
15901
15902   return SUCCESS;
15903 }
15904
15905 static void
15906 it_fsm_post_encode (void)
15907 {
15908   int is_last;
15909
15910   if (!now_it.state_handled)
15911     handle_it_state ();
15912
15913   is_last = (now_it.mask == 0x10);
15914   if (is_last)
15915     {
15916       now_it.state = OUTSIDE_IT_BLOCK;
15917       now_it.mask = 0;
15918     }
15919 }
15920
15921 static void
15922 force_automatic_it_block_close (void)
15923 {
15924   if (now_it.state == AUTOMATIC_IT_BLOCK)
15925     {
15926       close_automatic_it_block ();
15927       now_it.state = OUTSIDE_IT_BLOCK;
15928       now_it.mask = 0;
15929     }
15930 }
15931
15932 static int
15933 in_it_block (void)
15934 {
15935   if (!now_it.state_handled)
15936     handle_it_state ();
15937
15938   return now_it.state != OUTSIDE_IT_BLOCK;
15939 }
15940
15941 void
15942 md_assemble (char *str)
15943 {
15944   char *p = str;
15945   const struct asm_opcode * opcode;
15946
15947   /* Align the previous label if needed.  */
15948   if (last_label_seen != NULL)
15949     {
15950       symbol_set_frag (last_label_seen, frag_now);
15951       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
15952       S_SET_SEGMENT (last_label_seen, now_seg);
15953     }
15954
15955   memset (&inst, '\0', sizeof (inst));
15956   inst.reloc.type = BFD_RELOC_UNUSED;
15957
15958   opcode = opcode_lookup (&p);
15959   if (!opcode)
15960     {
15961       /* It wasn't an instruction, but it might be a register alias of
15962          the form alias .req reg, or a Neon .dn/.qn directive.  */
15963       if (! create_register_alias (str, p)
15964           && ! create_neon_reg_alias (str, p))
15965         as_bad (_("bad instruction `%s'"), str);
15966
15967       return;
15968     }
15969
15970   if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
15971     as_warn (_("s suffix on comparison instruction is deprecated"));
15972
15973   /* The value which unconditional instructions should have in place of the
15974      condition field.  */
15975   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
15976
15977   if (thumb_mode)
15978     {
15979       arm_feature_set variant;
15980
15981       variant = cpu_variant;
15982       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
15983       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
15984         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
15985       /* Check that this instruction is supported for this CPU.  */
15986       if (!opcode->tvariant
15987           || (thumb_mode == 1
15988               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
15989         {
15990           as_bad (_("selected processor does not support Thumb mode `%s'"), str);
15991           return;
15992         }
15993       if (inst.cond != COND_ALWAYS && !unified_syntax
15994           && opcode->tencode != do_t_branch)
15995         {
15996           as_bad (_("Thumb does not support conditional execution"));
15997           return;
15998         }
15999
16000       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
16001         {
16002           if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
16003               && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
16004                    || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
16005             {
16006               /* Two things are addressed here.
16007                  1) Implicit require narrow instructions on Thumb-1.
16008                     This avoids relaxation accidentally introducing Thumb-2
16009                      instructions.
16010                  2) Reject wide instructions in non Thumb-2 cores.  */
16011               if (inst.size_req == 0)
16012                 inst.size_req = 2;
16013               else if (inst.size_req == 4)
16014                 {
16015                   as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
16016                   return;
16017                 }
16018             }
16019         }
16020
16021       inst.instruction = opcode->tvalue;
16022
16023       if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
16024         {
16025           /* Prepare the it_insn_type for those encodings that don't set
16026              it.  */
16027           it_fsm_pre_encode ();
16028
16029           opcode->tencode ();
16030
16031           it_fsm_post_encode ();
16032         }
16033
16034       if (!(inst.error || inst.relax))
16035         {
16036           gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
16037           inst.size = (inst.instruction > 0xffff ? 4 : 2);
16038           if (inst.size_req && inst.size_req != inst.size)
16039             {
16040               as_bad (_("cannot honor width suffix -- `%s'"), str);
16041               return;
16042             }
16043         }
16044
16045       /* Something has gone badly wrong if we try to relax a fixed size
16046          instruction.  */
16047       gas_assert (inst.size_req == 0 || !inst.relax);
16048
16049       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16050                               *opcode->tvariant);
16051       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
16052          set those bits when Thumb-2 32-bit instructions are seen.  ie.
16053          anything other than bl/blx and v6-M instructions.
16054          This is overly pessimistic for relaxable instructions.  */
16055       if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
16056            || inst.relax)
16057           && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
16058                || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
16059         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16060                                 arm_ext_v6t2);
16061
16062       check_neon_suffixes;
16063
16064       if (!inst.error)
16065         {
16066           mapping_state (MAP_THUMB);
16067         }
16068     }
16069   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
16070     {
16071       bfd_boolean is_bx;
16072
16073       /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
16074       is_bx = (opcode->aencode == do_bx);
16075
16076       /* Check that this instruction is supported for this CPU.  */
16077       if (!(is_bx && fix_v4bx)
16078           && !(opcode->avariant &&
16079                ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
16080         {
16081           as_bad (_("selected processor does not support ARM mode `%s'"), str);
16082           return;
16083         }
16084       if (inst.size_req)
16085         {
16086           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
16087           return;
16088         }
16089
16090       inst.instruction = opcode->avalue;
16091       if (opcode->tag == OT_unconditionalF)
16092         inst.instruction |= 0xF << 28;
16093       else
16094         inst.instruction |= inst.cond << 28;
16095       inst.size = INSN_SIZE;
16096       if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
16097         {
16098           it_fsm_pre_encode ();
16099           opcode->aencode ();
16100           it_fsm_post_encode ();
16101         }
16102       /* Arm mode bx is marked as both v4T and v5 because it's still required
16103          on a hypothetical non-thumb v5 core.  */
16104       if (is_bx)
16105         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
16106       else
16107         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
16108                                 *opcode->avariant);
16109
16110       check_neon_suffixes;
16111
16112       if (!inst.error)
16113         {
16114           mapping_state (MAP_ARM);
16115         }
16116     }
16117   else
16118     {
16119       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
16120                 "-- `%s'"), str);
16121       return;
16122     }
16123   output_inst (str);
16124 }
16125
16126 static void
16127 check_it_blocks_finished (void)
16128 {
16129 #ifdef OBJ_ELF
16130   asection *sect;
16131
16132   for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
16133     if (seg_info (sect)->tc_segment_info_data.current_it.state
16134         == MANUAL_IT_BLOCK)
16135       {
16136         as_warn (_("section '%s' finished with an open IT block."),
16137                  sect->name);
16138       }
16139 #else
16140   if (now_it.state == MANUAL_IT_BLOCK)
16141     as_warn (_("file finished with an open IT block."));
16142 #endif
16143 }
16144
16145 /* Various frobbings of labels and their addresses.  */
16146
16147 void
16148 arm_start_line_hook (void)
16149 {
16150   last_label_seen = NULL;
16151 }
16152
16153 void
16154 arm_frob_label (symbolS * sym)
16155 {
16156   last_label_seen = sym;
16157
16158   ARM_SET_THUMB (sym, thumb_mode);
16159
16160 #if defined OBJ_COFF || defined OBJ_ELF
16161   ARM_SET_INTERWORK (sym, support_interwork);
16162 #endif
16163
16164   force_automatic_it_block_close ();
16165
16166   /* Note - do not allow local symbols (.Lxxx) to be labelled
16167      as Thumb functions.  This is because these labels, whilst
16168      they exist inside Thumb code, are not the entry points for
16169      possible ARM->Thumb calls.  Also, these labels can be used
16170      as part of a computed goto or switch statement.  eg gcc
16171      can generate code that looks like this:
16172
16173                 ldr  r2, [pc, .Laaa]
16174                 lsl  r3, r3, #2
16175                 ldr  r2, [r3, r2]
16176                 mov  pc, r2
16177
16178        .Lbbb:  .word .Lxxx
16179        .Lccc:  .word .Lyyy
16180        ..etc...
16181        .Laaa:   .word Lbbb
16182
16183      The first instruction loads the address of the jump table.
16184      The second instruction converts a table index into a byte offset.
16185      The third instruction gets the jump address out of the table.
16186      The fourth instruction performs the jump.
16187
16188      If the address stored at .Laaa is that of a symbol which has the
16189      Thumb_Func bit set, then the linker will arrange for this address
16190      to have the bottom bit set, which in turn would mean that the
16191      address computation performed by the third instruction would end
16192      up with the bottom bit set.  Since the ARM is capable of unaligned
16193      word loads, the instruction would then load the incorrect address
16194      out of the jump table, and chaos would ensue.  */
16195   if (label_is_thumb_function_name
16196       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
16197       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
16198     {
16199       /* When the address of a Thumb function is taken the bottom
16200          bit of that address should be set.  This will allow
16201          interworking between Arm and Thumb functions to work
16202          correctly.  */
16203
16204       THUMB_SET_FUNC (sym, 1);
16205
16206       label_is_thumb_function_name = FALSE;
16207     }
16208
16209   dwarf2_emit_label (sym);
16210 }
16211
16212 bfd_boolean
16213 arm_data_in_code (void)
16214 {
16215   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
16216     {
16217       *input_line_pointer = '/';
16218       input_line_pointer += 5;
16219       *input_line_pointer = 0;
16220       return TRUE;
16221     }
16222
16223   return FALSE;
16224 }
16225
16226 char *
16227 arm_canonicalize_symbol_name (char * name)
16228 {
16229   int len;
16230
16231   if (thumb_mode && (len = strlen (name)) > 5
16232       && streq (name + len - 5, "/data"))
16233     *(name + len - 5) = 0;
16234
16235   return name;
16236 }
16237 \f
16238 /* Table of all register names defined by default.  The user can
16239    define additional names with .req.  Note that all register names
16240    should appear in both upper and lowercase variants.  Some registers
16241    also have mixed-case names.  */
16242
16243 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
16244 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
16245 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
16246 #define REGSET(p,t) \
16247   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
16248   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
16249   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
16250   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
16251 #define REGSETH(p,t) \
16252   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
16253   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
16254   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
16255   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
16256 #define REGSET2(p,t) \
16257   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
16258   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
16259   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
16260   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
16261 #define SPLRBANK(base,bank,t) \
16262   REGDEF(lr_##bank, 768|((base+0)<<16), t), \
16263   REGDEF(sp_##bank, 768|((base+1)<<16), t), \
16264   REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
16265   REGDEF(LR_##bank, 768|((base+0)<<16), t), \
16266   REGDEF(SP_##bank, 768|((base+1)<<16), t), \
16267   REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
16268
16269 static const struct reg_entry reg_names[] =
16270 {
16271   /* ARM integer registers.  */
16272   REGSET(r, RN), REGSET(R, RN),
16273
16274   /* ATPCS synonyms.  */
16275   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
16276   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
16277   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
16278
16279   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
16280   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
16281   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
16282
16283   /* Well-known aliases.  */
16284   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
16285   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
16286
16287   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
16288   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
16289
16290   /* Coprocessor numbers.  */
16291   REGSET(p, CP), REGSET(P, CP),
16292
16293   /* Coprocessor register numbers.  The "cr" variants are for backward
16294      compatibility.  */
16295   REGSET(c,  CN), REGSET(C, CN),
16296   REGSET(cr, CN), REGSET(CR, CN),
16297
16298   /* ARM banked registers.  */
16299   REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
16300   REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
16301   REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
16302   REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
16303   REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
16304   REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
16305   REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
16306
16307   REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
16308   REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
16309   REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
16310   REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
16311   REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
16312   REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(SP_fiq,512|(13<<16),RNB),
16313   REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
16314   REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
16315
16316   SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
16317   SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
16318   SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
16319   SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
16320   SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
16321   REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
16322   REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
16323   REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB), 
16324   REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
16325
16326   /* FPA registers.  */
16327   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
16328   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
16329
16330   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
16331   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
16332
16333   /* VFP SP registers.  */
16334   REGSET(s,VFS),  REGSET(S,VFS),
16335   REGSETH(s,VFS), REGSETH(S,VFS),
16336
16337   /* VFP DP Registers.  */
16338   REGSET(d,VFD),  REGSET(D,VFD),
16339   /* Extra Neon DP registers.  */
16340   REGSETH(d,VFD), REGSETH(D,VFD),
16341
16342   /* Neon QP registers.  */
16343   REGSET2(q,NQ),  REGSET2(Q,NQ),
16344
16345   /* VFP control registers.  */
16346   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
16347   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
16348   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
16349   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
16350   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
16351   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
16352
16353   /* Maverick DSP coprocessor registers.  */
16354   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
16355   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
16356
16357   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
16358   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
16359   REGDEF(dspsc,0,DSPSC),
16360
16361   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
16362   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
16363   REGDEF(DSPSC,0,DSPSC),
16364
16365   /* iWMMXt data registers - p0, c0-15.  */
16366   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
16367
16368   /* iWMMXt control registers - p1, c0-3.  */
16369   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
16370   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
16371   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
16372   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
16373
16374   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
16375   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
16376   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
16377   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
16378   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
16379
16380   /* XScale accumulator registers.  */
16381   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
16382 };
16383 #undef REGDEF
16384 #undef REGNUM
16385 #undef REGSET
16386
16387 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
16388    within psr_required_here.  */
16389 static const struct asm_psr psrs[] =
16390 {
16391   /* Backward compatibility notation.  Note that "all" is no longer
16392      truly all possible PSR bits.  */
16393   {"all",  PSR_c | PSR_f},
16394   {"flg",  PSR_f},
16395   {"ctl",  PSR_c},
16396
16397   /* Individual flags.  */
16398   {"f",    PSR_f},
16399   {"c",    PSR_c},
16400   {"x",    PSR_x},
16401   {"s",    PSR_s},
16402   {"g",    PSR_s},
16403
16404   /* Combinations of flags.  */
16405   {"fs",   PSR_f | PSR_s},
16406   {"fx",   PSR_f | PSR_x},
16407   {"fc",   PSR_f | PSR_c},
16408   {"sf",   PSR_s | PSR_f},
16409   {"sx",   PSR_s | PSR_x},
16410   {"sc",   PSR_s | PSR_c},
16411   {"xf",   PSR_x | PSR_f},
16412   {"xs",   PSR_x | PSR_s},
16413   {"xc",   PSR_x | PSR_c},
16414   {"cf",   PSR_c | PSR_f},
16415   {"cs",   PSR_c | PSR_s},
16416   {"cx",   PSR_c | PSR_x},
16417   {"fsx",  PSR_f | PSR_s | PSR_x},
16418   {"fsc",  PSR_f | PSR_s | PSR_c},
16419   {"fxs",  PSR_f | PSR_x | PSR_s},
16420   {"fxc",  PSR_f | PSR_x | PSR_c},
16421   {"fcs",  PSR_f | PSR_c | PSR_s},
16422   {"fcx",  PSR_f | PSR_c | PSR_x},
16423   {"sfx",  PSR_s | PSR_f | PSR_x},
16424   {"sfc",  PSR_s | PSR_f | PSR_c},
16425   {"sxf",  PSR_s | PSR_x | PSR_f},
16426   {"sxc",  PSR_s | PSR_x | PSR_c},
16427   {"scf",  PSR_s | PSR_c | PSR_f},
16428   {"scx",  PSR_s | PSR_c | PSR_x},
16429   {"xfs",  PSR_x | PSR_f | PSR_s},
16430   {"xfc",  PSR_x | PSR_f | PSR_c},
16431   {"xsf",  PSR_x | PSR_s | PSR_f},
16432   {"xsc",  PSR_x | PSR_s | PSR_c},
16433   {"xcf",  PSR_x | PSR_c | PSR_f},
16434   {"xcs",  PSR_x | PSR_c | PSR_s},
16435   {"cfs",  PSR_c | PSR_f | PSR_s},
16436   {"cfx",  PSR_c | PSR_f | PSR_x},
16437   {"csf",  PSR_c | PSR_s | PSR_f},
16438   {"csx",  PSR_c | PSR_s | PSR_x},
16439   {"cxf",  PSR_c | PSR_x | PSR_f},
16440   {"cxs",  PSR_c | PSR_x | PSR_s},
16441   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
16442   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
16443   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
16444   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
16445   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
16446   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
16447   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
16448   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
16449   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
16450   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
16451   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
16452   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
16453   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
16454   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
16455   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
16456   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
16457   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
16458   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
16459   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
16460   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
16461   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
16462   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
16463   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
16464   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
16465
16466   /* APSR flags */
16467   {"nzcvq", PSR_f},
16468   {"nzcvqg", PSR_s | PSR_f}
16469 };
16470
16471 /* Table of V7M psr names.  */
16472 static const struct asm_psr v7m_psrs[] =
16473 {
16474   {"apsr",        0 }, {"APSR",         0 },
16475   {"iapsr",       1 }, {"IAPSR",        1 },
16476   {"eapsr",       2 }, {"EAPSR",        2 },
16477   {"psr",         3 }, {"PSR",          3 },
16478   {"xpsr",        3 }, {"XPSR",         3 }, {"xPSR",     3 },
16479   {"ipsr",        5 }, {"IPSR",         5 },
16480   {"epsr",        6 }, {"EPSR",         6 },
16481   {"iepsr",       7 }, {"IEPSR",        7 },
16482   {"msp",         8 }, {"MSP",          8 },
16483   {"psp",         9 }, {"PSP",          9 },
16484   {"primask",     16}, {"PRIMASK",      16},
16485   {"basepri",     17}, {"BASEPRI",      17},
16486   {"basepri_max", 18}, {"BASEPRI_MAX",  18},
16487   {"faultmask",   19}, {"FAULTMASK",    19},
16488   {"control",     20}, {"CONTROL",      20}
16489 };
16490
16491 /* Table of all shift-in-operand names.  */
16492 static const struct asm_shift_name shift_names [] =
16493 {
16494   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
16495   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
16496   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
16497   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
16498   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
16499   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
16500 };
16501
16502 /* Table of all explicit relocation names.  */
16503 #ifdef OBJ_ELF
16504 static struct reloc_entry reloc_names[] =
16505 {
16506   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
16507   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
16508   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
16509   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
16510   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
16511   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
16512   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
16513   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
16514   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
16515   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
16516   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32},
16517   { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL}
16518 };
16519 #endif
16520
16521 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
16522 static const struct asm_cond conds[] =
16523 {
16524   {"eq", 0x0},
16525   {"ne", 0x1},
16526   {"cs", 0x2}, {"hs", 0x2},
16527   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
16528   {"mi", 0x4},
16529   {"pl", 0x5},
16530   {"vs", 0x6},
16531   {"vc", 0x7},
16532   {"hi", 0x8},
16533   {"ls", 0x9},
16534   {"ge", 0xa},
16535   {"lt", 0xb},
16536   {"gt", 0xc},
16537   {"le", 0xd},
16538   {"al", 0xe}
16539 };
16540
16541 static struct asm_barrier_opt barrier_opt_names[] =
16542 {
16543   { "sy",    0xf }, { "SY",    0xf },
16544   { "un",    0x7 }, { "UN",    0x7 },
16545   { "st",    0xe }, { "ST",    0xe },
16546   { "unst",  0x6 }, { "UNST",  0x6 },
16547   { "ish",   0xb }, { "ISH",   0xb },
16548   { "sh",    0xb }, { "SH",    0xb },
16549   { "ishst", 0xa }, { "ISHST", 0xa },
16550   { "shst",  0xa }, { "SHST",  0xa },
16551   { "nsh",   0x7 }, { "NSH",   0x7 },
16552   { "nshst", 0x6 }, { "NSHST", 0x6 },
16553   { "osh",   0x3 }, { "OSH",   0x3 },
16554   { "oshst", 0x2 }, { "OSHST", 0x2 }
16555 };
16556
16557 /* Table of ARM-format instructions.    */
16558
16559 /* Macros for gluing together operand strings.  N.B. In all cases
16560    other than OPS0, the trailing OP_stop comes from default
16561    zero-initialization of the unspecified elements of the array.  */
16562 #define OPS0()            { OP_stop, }
16563 #define OPS1(a)           { OP_##a, }
16564 #define OPS2(a,b)         { OP_##a,OP_##b, }
16565 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
16566 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
16567 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
16568 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
16569
16570 /* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
16571    This is useful when mixing operands for ARM and THUMB, i.e. using the
16572    MIX_ARM_THUMB_OPERANDS macro.
16573    In order to use these macros, prefix the number of operands with _
16574    e.g. _3.  */
16575 #define OPS_1(a)           { a, }
16576 #define OPS_2(a,b)         { a,b, }
16577 #define OPS_3(a,b,c)       { a,b,c, }
16578 #define OPS_4(a,b,c,d)     { a,b,c,d, }
16579 #define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
16580 #define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
16581
16582 /* These macros abstract out the exact format of the mnemonic table and
16583    save some repeated characters.  */
16584
16585 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
16586 #define TxCE(mnem, op, top, nops, ops, ae, te) \
16587   { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
16588     THUMB_VARIANT, do_##ae, do_##te }
16589
16590 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
16591    a T_MNEM_xyz enumerator.  */
16592 #define TCE(mnem, aop, top, nops, ops, ae, te) \
16593       TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
16594 #define tCE(mnem, aop, top, nops, ops, ae, te) \
16595       TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
16596
16597 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
16598    infix after the third character.  */
16599 #define TxC3(mnem, op, top, nops, ops, ae, te) \
16600   { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
16601     THUMB_VARIANT, do_##ae, do_##te }
16602 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
16603   { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
16604     THUMB_VARIANT, do_##ae, do_##te }
16605 #define TC3(mnem, aop, top, nops, ops, ae, te) \
16606       TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
16607 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
16608       TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
16609 #define tC3(mnem, aop, top, nops, ops, ae, te) \
16610       TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
16611 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
16612       TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
16613
16614 /* Mnemonic with a conditional infix in an unusual place.  Each and every variant has to
16615    appear in the condition table.  */
16616 #define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te)   \
16617   { m1 #m2 m3, OPS##nops ops, sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
16618     0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
16619
16620 #define TxCM(m1, m2, op, top, nops, ops, ae, te)        \
16621   TxCM_ (m1,   , m2, op, top, nops, ops, ae, te),       \
16622   TxCM_ (m1, eq, m2, op, top, nops, ops, ae, te),       \
16623   TxCM_ (m1, ne, m2, op, top, nops, ops, ae, te),       \
16624   TxCM_ (m1, cs, m2, op, top, nops, ops, ae, te),       \
16625   TxCM_ (m1, hs, m2, op, top, nops, ops, ae, te),       \
16626   TxCM_ (m1, cc, m2, op, top, nops, ops, ae, te),       \
16627   TxCM_ (m1, ul, m2, op, top, nops, ops, ae, te),       \
16628   TxCM_ (m1, lo, m2, op, top, nops, ops, ae, te),       \
16629   TxCM_ (m1, mi, m2, op, top, nops, ops, ae, te),       \
16630   TxCM_ (m1, pl, m2, op, top, nops, ops, ae, te),       \
16631   TxCM_ (m1, vs, m2, op, top, nops, ops, ae, te),       \
16632   TxCM_ (m1, vc, m2, op, top, nops, ops, ae, te),       \
16633   TxCM_ (m1, hi, m2, op, top, nops, ops, ae, te),       \
16634   TxCM_ (m1, ls, m2, op, top, nops, ops, ae, te),       \
16635   TxCM_ (m1, ge, m2, op, top, nops, ops, ae, te),       \
16636   TxCM_ (m1, lt, m2, op, top, nops, ops, ae, te),       \
16637   TxCM_ (m1, gt, m2, op, top, nops, ops, ae, te),       \
16638   TxCM_ (m1, le, m2, op, top, nops, ops, ae, te),       \
16639   TxCM_ (m1, al, m2, op, top, nops, ops, ae, te)
16640
16641 #define TCM(m1,m2, aop, top, nops, ops, ae, te)         \
16642       TxCM (m1,m2, aop, 0x##top, nops, ops, ae, te)
16643 #define tCM(m1,m2, aop, top, nops, ops, ae, te)         \
16644       TxCM (m1,m2, aop, T_MNEM##top, nops, ops, ae, te)
16645
16646 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
16647    field is still 0xE.  Many of the Thumb variants can be executed
16648    conditionally, so this is checked separately.  */
16649 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
16650   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
16651     THUMB_VARIANT, do_##ae, do_##te }
16652
16653 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
16654    condition code field.  */
16655 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
16656   { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
16657     THUMB_VARIANT, do_##ae, do_##te }
16658
16659 /* ARM-only variants of all the above.  */
16660 #define CE(mnem,  op, nops, ops, ae)    \
16661   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16662
16663 #define C3(mnem, op, nops, ops, ae)     \
16664   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16665
16666 /* Legacy mnemonics that always have conditional infix after the third
16667    character.  */
16668 #define CL(mnem, op, nops, ops, ae)     \
16669   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
16670     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16671
16672 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
16673 #define cCE(mnem,  op, nops, ops, ae)   \
16674   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16675
16676 /* Legacy coprocessor instructions where conditional infix and conditional
16677    suffix are ambiguous.  For consistency this includes all FPA instructions,
16678    not just the potentially ambiguous ones.  */
16679 #define cCL(mnem, op, nops, ops, ae)    \
16680   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
16681     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16682
16683 /* Coprocessor, takes either a suffix or a position-3 infix
16684    (for an FPA corner case). */
16685 #define C3E(mnem, op, nops, ops, ae) \
16686   { mnem, OPS##nops ops, OT_csuf_or_in3, \
16687     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16688
16689 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
16690   { m1 #m2 m3, OPS##nops ops, \
16691     sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
16692     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16693
16694 #define CM(m1, m2, op, nops, ops, ae)   \
16695   xCM_ (m1,   , m2, op, nops, ops, ae), \
16696   xCM_ (m1, eq, m2, op, nops, ops, ae), \
16697   xCM_ (m1, ne, m2, op, nops, ops, ae), \
16698   xCM_ (m1, cs, m2, op, nops, ops, ae), \
16699   xCM_ (m1, hs, m2, op, nops, ops, ae), \
16700   xCM_ (m1, cc, m2, op, nops, ops, ae), \
16701   xCM_ (m1, ul, m2, op, nops, ops, ae), \
16702   xCM_ (m1, lo, m2, op, nops, ops, ae), \
16703   xCM_ (m1, mi, m2, op, nops, ops, ae), \
16704   xCM_ (m1, pl, m2, op, nops, ops, ae), \
16705   xCM_ (m1, vs, m2, op, nops, ops, ae), \
16706   xCM_ (m1, vc, m2, op, nops, ops, ae), \
16707   xCM_ (m1, hi, m2, op, nops, ops, ae), \
16708   xCM_ (m1, ls, m2, op, nops, ops, ae), \
16709   xCM_ (m1, ge, m2, op, nops, ops, ae), \
16710   xCM_ (m1, lt, m2, op, nops, ops, ae), \
16711   xCM_ (m1, gt, m2, op, nops, ops, ae), \
16712   xCM_ (m1, le, m2, op, nops, ops, ae), \
16713   xCM_ (m1, al, m2, op, nops, ops, ae)
16714
16715 #define UE(mnem, op, nops, ops, ae)     \
16716   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
16717
16718 #define UF(mnem, op, nops, ops, ae)     \
16719   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
16720
16721 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
16722    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
16723    use the same encoding function for each.  */
16724 #define NUF(mnem, op, nops, ops, enc)                                   \
16725   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
16726     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16727
16728 /* Neon data processing, version which indirects through neon_enc_tab for
16729    the various overloaded versions of opcodes.  */
16730 #define nUF(mnem, op, nops, ops, enc)                                   \
16731   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
16732     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16733
16734 /* Neon insn with conditional suffix for the ARM version, non-overloaded
16735    version.  */
16736 #define NCE_tag(mnem, op, nops, ops, enc, tag)                          \
16737   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
16738     THUMB_VARIANT, do_##enc, do_##enc }
16739
16740 #define NCE(mnem, op, nops, ops, enc)                                   \
16741    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
16742
16743 #define NCEF(mnem, op, nops, ops, enc)                                  \
16744     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
16745
16746 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
16747 #define nCE_tag(mnem, op, nops, ops, enc, tag)                          \
16748   { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,          \
16749     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16750
16751 #define nCE(mnem, op, nops, ops, enc)                                   \
16752    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
16753
16754 #define nCEF(mnem, op, nops, ops, enc)                                  \
16755     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
16756
16757 #define do_0 0
16758
16759 static const struct asm_opcode insns[] =
16760 {
16761 #define ARM_VARIANT &arm_ext_v1 /* Core ARM Instructions.  */
16762 #define THUMB_VARIANT &arm_ext_v4t
16763  tCE("and",     0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
16764  tC3("ands",    0100000, _ands,    3, (RR, oRR, SH), arit, t_arit3c),
16765  tCE("eor",     0200000, _eor,     3, (RR, oRR, SH), arit, t_arit3c),
16766  tC3("eors",    0300000, _eors,    3, (RR, oRR, SH), arit, t_arit3c),
16767  tCE("sub",     0400000, _sub,     3, (RR, oRR, SH), arit, t_add_sub),
16768  tC3("subs",    0500000, _subs,    3, (RR, oRR, SH), arit, t_add_sub),
16769  tCE("add",     0800000, _add,     3, (RR, oRR, SHG), arit, t_add_sub),
16770  tC3("adds",    0900000, _adds,    3, (RR, oRR, SHG), arit, t_add_sub),
16771  tCE("adc",     0a00000, _adc,     3, (RR, oRR, SH), arit, t_arit3c),
16772  tC3("adcs",    0b00000, _adcs,    3, (RR, oRR, SH), arit, t_arit3c),
16773  tCE("sbc",     0c00000, _sbc,     3, (RR, oRR, SH), arit, t_arit3),
16774  tC3("sbcs",    0d00000, _sbcs,    3, (RR, oRR, SH), arit, t_arit3),
16775  tCE("orr",     1800000, _orr,     3, (RR, oRR, SH), arit, t_arit3c),
16776  tC3("orrs",    1900000, _orrs,    3, (RR, oRR, SH), arit, t_arit3c),
16777  tCE("bic",     1c00000, _bic,     3, (RR, oRR, SH), arit, t_arit3),
16778  tC3("bics",    1d00000, _bics,    3, (RR, oRR, SH), arit, t_arit3),
16779
16780  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
16781     for setting PSR flag bits.  They are obsolete in V6 and do not
16782     have Thumb equivalents. */
16783  tCE("tst",     1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
16784  tC3w("tsts",   1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
16785   CL("tstp",    110f000,           2, (RR, SH),      cmp),
16786  tCE("cmp",     1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
16787  tC3w("cmps",   1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
16788   CL("cmpp",    150f000,           2, (RR, SH),      cmp),
16789  tCE("cmn",     1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
16790  tC3w("cmns",   1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
16791   CL("cmnp",    170f000,           2, (RR, SH),      cmp),
16792
16793  tCE("mov",     1a00000, _mov,     2, (RR, SH),      mov,  t_mov_cmp),
16794  tC3("movs",    1b00000, _movs,    2, (RR, SH),      mov,  t_mov_cmp),
16795  tCE("mvn",     1e00000, _mvn,     2, (RR, SH),      mov,  t_mvn_tst),
16796  tC3("mvns",    1f00000, _mvns,    2, (RR, SH),      mov,  t_mvn_tst),
16797
16798  tCE("ldr",     4100000, _ldr,     2, (RR, ADDRGLDR),ldst, t_ldst),
16799  tC3("ldrb",    4500000, _ldrb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
16800  tCE("str",     4000000, _str,     _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
16801                                                                 OP_RRnpc),
16802                                         OP_ADDRGLDR),ldst, t_ldst),
16803  tC3("strb",    4400000, _strb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
16804
16805  tCE("stm",     8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16806  tC3("stmia",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16807  tC3("stmea",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16808  tCE("ldm",     8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16809  tC3("ldmia",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16810  tC3("ldmfd",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
16811
16812  TCE("swi",     f000000, df00,     1, (EXPi),        swi, t_swi),
16813  TCE("svc",     f000000, df00,     1, (EXPi),        swi, t_swi),
16814  tCE("b",       a000000, _b,       1, (EXPr),        branch, t_branch),
16815  TCE("bl",      b000000, f000f800, 1, (EXPr),        bl, t_branch23),
16816
16817   /* Pseudo ops.  */
16818  tCE("adr",     28f0000, _adr,     2, (RR, EXP),     adr,  t_adr),
16819   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
16820  tCE("nop",     1a00000, _nop,     1, (oI255c),      nop,  t_nop),
16821
16822   /* Thumb-compatibility pseudo ops.  */
16823  tCE("lsl",     1a00000, _lsl,     3, (RR, oRR, SH), shift, t_shift),
16824  tC3("lsls",    1b00000, _lsls,    3, (RR, oRR, SH), shift, t_shift),
16825  tCE("lsr",     1a00020, _lsr,     3, (RR, oRR, SH), shift, t_shift),
16826  tC3("lsrs",    1b00020, _lsrs,    3, (RR, oRR, SH), shift, t_shift),
16827  tCE("asr",     1a00040, _asr,     3, (RR, oRR, SH), shift, t_shift),
16828  tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
16829  tCE("ror",     1a00060, _ror,     3, (RR, oRR, SH), shift, t_shift),
16830  tC3("rors",    1b00060, _rors,    3, (RR, oRR, SH), shift, t_shift),
16831  tCE("neg",     2600000, _neg,     2, (RR, RR),      rd_rn, t_neg),
16832  tC3("negs",    2700000, _negs,    2, (RR, RR),      rd_rn, t_neg),
16833  tCE("push",    92d0000, _push,     1, (REGLST),             push_pop, t_push_pop),
16834  tCE("pop",     8bd0000, _pop,     1, (REGLST),      push_pop, t_push_pop),
16835
16836  /* These may simplify to neg.  */
16837  TCE("rsb",     0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
16838  TC3("rsbs",    0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
16839
16840 #undef  THUMB_VARIANT
16841 #define THUMB_VARIANT  & arm_ext_v6
16842
16843  TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
16844
16845  /* V1 instructions with no Thumb analogue prior to V6T2.  */
16846 #undef  THUMB_VARIANT
16847 #define THUMB_VARIANT  & arm_ext_v6t2
16848
16849  TCE("teq",     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
16850  TC3w("teqs",   1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
16851   CL("teqp",    130f000,           2, (RR, SH),      cmp),
16852
16853  TC3("ldrt",    4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
16854  TC3("ldrbt",   4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
16855  TC3("strt",    4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
16856  TC3("strbt",   4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
16857
16858  TC3("stmdb",   9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
16859  TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
16860
16861  TC3("ldmdb",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
16862  TC3("ldmea",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
16863
16864  /* V1 instructions with no Thumb analogue at all.  */
16865   CE("rsc",     0e00000,           3, (RR, oRR, SH), arit),
16866   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
16867
16868   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
16869   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
16870   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
16871   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
16872   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
16873   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
16874   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
16875   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
16876
16877 #undef  ARM_VARIANT
16878 #define ARM_VARIANT    & arm_ext_v2     /* ARM 2 - multiplies.  */
16879 #undef  THUMB_VARIANT
16880 #define THUMB_VARIANT  & arm_ext_v4t
16881
16882  tCE("mul",     0000090, _mul,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
16883  tC3("muls",    0100090, _muls,    3, (RRnpc, RRnpc, oRR), mul, t_mul),
16884
16885 #undef  THUMB_VARIANT
16886 #define THUMB_VARIANT  & arm_ext_v6t2
16887
16888  TCE("mla",     0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
16889   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
16890
16891   /* Generic coprocessor instructions.  */
16892  TCE("cdp",     e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
16893  TCE("ldc",     c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16894  TC3("ldcl",    c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16895  TCE("stc",     c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16896  TC3("stcl",    c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16897  TCE("mcr",     e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
16898  TCE("mrc",     e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b),   co_reg, co_reg),
16899
16900 #undef  ARM_VARIANT
16901 #define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
16902
16903   CE("swp",     1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
16904   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
16905
16906 #undef  ARM_VARIANT
16907 #define ARM_VARIANT    & arm_ext_v3     /* ARM 6 Status register instructions.  */
16908 #undef  THUMB_VARIANT
16909 #define THUMB_VARIANT  & arm_ext_msr
16910
16911  TCE("mrs",     1000000, f3e08000, 2, (APSR_RR, RVC_PSR), mrs, t_mrs),
16912  TCE("msr",     120f000, f3808000, 2, (RVC_PSR, RR_EXi), msr, t_msr),
16913
16914 #undef  ARM_VARIANT
16915 #define ARM_VARIANT    & arm_ext_v3m     /* ARM 7M long multiplies.  */
16916 #undef  THUMB_VARIANT
16917 #define THUMB_VARIANT  & arm_ext_v6t2
16918
16919  TCE("smull",   0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
16920   CM("smull","s",       0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
16921  TCE("umull",   0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
16922   CM("umull","s",       0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
16923  TCE("smlal",   0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
16924   CM("smlal","s",       0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
16925  TCE("umlal",   0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
16926   CM("umlal","s",       0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
16927
16928 #undef  ARM_VARIANT
16929 #define ARM_VARIANT    & arm_ext_v4     /* ARM Architecture 4.  */
16930 #undef  THUMB_VARIANT
16931 #define THUMB_VARIANT  & arm_ext_v4t
16932
16933  tC3("ldrh",    01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16934  tC3("strh",    00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16935  tC3("ldrsh",   01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16936  tC3("ldrsb",   01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16937  tCM("ld","sh", 01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16938  tCM("ld","sb", 01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
16939
16940 #undef  ARM_VARIANT
16941 #define ARM_VARIANT  & arm_ext_v4t_5
16942
16943   /* ARM Architecture 4T.  */
16944   /* Note: bx (and blx) are required on V5, even if the processor does
16945      not support Thumb.  */
16946  TCE("bx",      12fff10, 4700, 1, (RR), bx, t_bx),
16947
16948 #undef  ARM_VARIANT
16949 #define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.     */
16950 #undef  THUMB_VARIANT
16951 #define THUMB_VARIANT  & arm_ext_v5t
16952
16953   /* Note: blx has 2 variants; the .value coded here is for
16954      BLX(2).  Only this variant has conditional execution.  */
16955  TCE("blx",     12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
16956  TUE("bkpt",    1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
16957
16958 #undef  THUMB_VARIANT
16959 #define THUMB_VARIANT  & arm_ext_v6t2
16960
16961  TCE("clz",     16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
16962  TUF("ldc2",    c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16963  TUF("ldc2l",   c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
16964  TUF("stc2",    c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
16965  TUF("stc2l",   c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
16966  TUF("cdp2",    e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
16967  TUF("mcr2",    e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
16968  TUF("mrc2",    e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
16969
16970 #undef  ARM_VARIANT
16971 #define ARM_VARIANT  & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
16972 #undef THUMB_VARIANT
16973 #define THUMB_VARIANT &arm_ext_v5exp
16974
16975  TCE("smlabb",  1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16976  TCE("smlatb",  10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16977  TCE("smlabt",  10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16978  TCE("smlatt",  10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16979
16980  TCE("smlawb",  1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16981  TCE("smlawt",  12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
16982
16983  TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
16984  TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
16985  TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
16986  TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
16987
16988  TCE("smulbb",  1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16989  TCE("smultb",  16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16990  TCE("smulbt",  16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16991  TCE("smultt",  16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16992
16993  TCE("smulwb",  12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16994  TCE("smulwt",  12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
16995
16996  TCE("qadd",    1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
16997  TCE("qdadd",   1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
16998  TCE("qsub",    1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
16999  TCE("qdsub",   1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
17000
17001 #undef  ARM_VARIANT
17002 #define ARM_VARIANT  & arm_ext_v5e /*  ARM Architecture 5TE.  */
17003 #undef THUMB_VARIANT
17004 #define THUMB_VARIANT &arm_ext_v6t2
17005
17006  TUF("pld",     450f000, f810f000, 1, (ADDR),                pld,  t_pld),
17007  TC3("ldrd",    00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
17008      ldrd, t_ldstd),
17009  TC3("strd",    00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
17010                                        ADDRGLDRS), ldrd, t_ldstd),
17011
17012  TCE("mcrr",    c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17013  TCE("mrrc",    c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17014
17015 #undef  ARM_VARIANT
17016 #define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
17017
17018  TCE("bxj",     12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
17019
17020 #undef  ARM_VARIANT
17021 #define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
17022 #undef  THUMB_VARIANT
17023 #define THUMB_VARIANT  & arm_ext_v6
17024
17025  TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
17026  TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
17027  tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
17028  tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
17029  tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
17030  tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17031  tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17032  tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17033  tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17034  TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
17035
17036 #undef  THUMB_VARIANT
17037 #define THUMB_VARIANT  & arm_ext_v6t2
17038
17039  TCE("ldrex",   1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),        ldrex, t_ldrex),
17040  TCE("strex",   1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17041                                       strex,  t_strex),
17042  TUF("mcrr2",   c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17043  TUF("mrrc2",   c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17044
17045  TCE("ssat",    6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
17046  TCE("usat",    6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
17047
17048 /*  ARM V6 not included in V7M.  */
17049 #undef  THUMB_VARIANT
17050 #define THUMB_VARIANT  & arm_ext_v6_notm
17051  TUF("rfeia",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
17052   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
17053   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
17054  TUF("rfedb",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
17055  TUF("rfefd",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
17056   UF(rfefa,     9900a00,           1, (RRw),                       rfe),
17057   UF(rfeea,     8100a00,           1, (RRw),                       rfe),
17058  TUF("rfeed",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
17059  TUF("srsia",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
17060   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
17061   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
17062  TUF("srsdb",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
17063
17064 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
17065 #undef  THUMB_VARIANT
17066 #define THUMB_VARIANT  & arm_ext_v6_dsp
17067  TUF("cps",     1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
17068  TCE("pkhbt",   6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
17069  TCE("pkhtb",   6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
17070  TCE("qadd16",  6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17071  TCE("qadd8",   6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17072  TCE("qasx",    6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17073  /* Old name for QASX.  */
17074  TCE("qaddsubx",        6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17075  TCE("qsax",    6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17076  /* Old name for QSAX.  */
17077  TCE("qsubaddx",        6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17078  TCE("qsub16",  6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17079  TCE("qsub8",   6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17080  TCE("sadd16",  6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17081  TCE("sadd8",   6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17082  TCE("sasx",    6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17083  /* Old name for SASX.  */
17084  TCE("saddsubx",        6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17085  TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17086  TCE("shadd8",  6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17087  TCE("shasx",     6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17088  /* Old name for SHASX.  */
17089  TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17090  TCE("shsax",      6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),    rd_rn_rm, t_simd),
17091  /* Old name for SHSAX.  */
17092  TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17093  TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17094  TCE("shsub8",  6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17095  TCE("ssax",    6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17096  /* Old name for SSAX.  */
17097  TCE("ssubaddx",        6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17098  TCE("ssub16",  6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17099  TCE("ssub8",   6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17100  TCE("uadd16",  6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17101  TCE("uadd8",   6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17102  TCE("uasx",    6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17103  /* Old name for UASX.  */
17104  TCE("uaddsubx",        6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17105  TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17106  TCE("uhadd8",  6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17107  TCE("uhasx",     6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17108  /* Old name for UHASX.  */
17109  TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17110  TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17111  /* Old name for UHSAX.  */
17112  TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17113  TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17114  TCE("uhsub8",  6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17115  TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17116  TCE("uqadd8",  6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17117  TCE("uqasx",     6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17118  /* Old name for UQASX.  */
17119  TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17120  TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17121  /* Old name for UQSAX.  */
17122  TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17123  TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17124  TCE("uqsub8",  6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17125  TCE("usub16",  6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17126  TCE("usax",    6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17127  /* Old name for USAX.  */
17128  TCE("usubaddx",        6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17129  TCE("usub8",   6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17130  TCE("sxtah",   6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17131  TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17132  TCE("sxtab",   6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17133  TCE("sxtb16",  68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
17134  TCE("uxtah",   6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17135  TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17136  TCE("uxtab",   6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17137  TCE("uxtb16",  6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
17138  TCE("sel",     6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17139  TCE("smlad",   7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17140  TCE("smladx",  7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17141  TCE("smlald",  7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17142  TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17143  TCE("smlsd",   7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17144  TCE("smlsdx",  7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17145  TCE("smlsld",  7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17146  TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17147  TCE("smmla",   7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17148  TCE("smmlar",  7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17149  TCE("smmls",   75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17150  TCE("smmlsr",  75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17151  TCE("smmul",   750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17152  TCE("smmulr",  750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17153  TCE("smuad",   700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17154  TCE("smuadx",  700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17155  TCE("smusd",   700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17156  TCE("smusdx",  700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17157  TCE("ssat16",  6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
17158  TCE("umaal",   0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
17159  TCE("usad8",   780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
17160  TCE("usada8",  7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
17161  TCE("usat16",  6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
17162
17163 #undef  ARM_VARIANT
17164 #define ARM_VARIANT   & arm_ext_v6k
17165 #undef  THUMB_VARIANT
17166 #define THUMB_VARIANT & arm_ext_v6k
17167
17168  tCE("yield",   320f001, _yield,    0, (), noargs, t_hint),
17169  tCE("wfe",     320f002, _wfe,      0, (), noargs, t_hint),
17170  tCE("wfi",     320f003, _wfi,      0, (), noargs, t_hint),
17171  tCE("sev",     320f004, _sev,      0, (), noargs, t_hint),
17172
17173 #undef  THUMB_VARIANT
17174 #define THUMB_VARIANT  & arm_ext_v6_notm
17175  TCE("ldrexd",  1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
17176                                       ldrexd, t_ldrexd),
17177  TCE("strexd",  1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
17178                                        RRnpcb), strexd, t_strexd),
17179
17180 #undef  THUMB_VARIANT
17181 #define THUMB_VARIANT  & arm_ext_v6t2
17182  TCE("ldrexb",  1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
17183      rd_rn,  rd_rn),
17184  TCE("ldrexh",  1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
17185      rd_rn,  rd_rn),
17186  TCE("strexb",  1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17187      strex, rm_rd_rn),
17188  TCE("strexh",  1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17189      strex, rm_rd_rn), 
17190  TUF("clrex",   57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
17191
17192 #undef  ARM_VARIANT
17193 #define ARM_VARIANT    & arm_ext_sec
17194 #undef THUMB_VARIANT
17195 #define THUMB_VARIANT  & arm_ext_sec
17196
17197  TCE("smc",     1600070, f7f08000, 1, (EXPi), smc, t_smc),
17198
17199 #undef  ARM_VARIANT
17200 #define ARM_VARIANT    & arm_ext_virt
17201 #undef  THUMB_VARIANT
17202 #define THUMB_VARIANT    & arm_ext_virt
17203
17204  TCE("hvc",     1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
17205  TCE("eret",    160006e, f3de8f00, 0, (), noargs, noargs),
17206
17207 #undef  ARM_VARIANT
17208 #define ARM_VARIANT  & arm_ext_v6t2
17209 #undef  THUMB_VARIANT
17210 #define THUMB_VARIANT  & arm_ext_v6t2
17211
17212  TCE("bfc",     7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
17213  TCE("bfi",     7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
17214  TCE("sbfx",    7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
17215  TCE("ubfx",    7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
17216
17217  TCE("mls",     0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
17218  TCE("movw",    3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
17219  TCE("movt",    3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
17220  TCE("rbit",    6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
17221
17222  TC3("ldrht",   03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17223  TC3("ldrsht",  03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17224  TC3("ldrsbt",  03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17225  TC3("strht",   02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17226
17227  /* Thumb-only instructions.  */
17228 #undef ARM_VARIANT
17229 #define ARM_VARIANT NULL
17230   TUE("cbnz",     0,           b900,     2, (RR, EXP), 0, t_cbz),
17231   TUE("cbz",      0,           b100,     2, (RR, EXP), 0, t_cbz),
17232
17233  /* ARM does not really have an IT instruction, so always allow it.
17234     The opcode is copied from Thumb in order to allow warnings in
17235     -mimplicit-it=[never | arm] modes.  */
17236 #undef  ARM_VARIANT
17237 #define ARM_VARIANT  & arm_ext_v1
17238
17239  TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
17240  TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
17241  TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
17242  TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
17243  TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
17244  TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
17245  TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
17246  TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
17247  TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
17248  TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
17249  TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
17250  TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
17251  TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
17252  TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
17253  TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
17254  /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
17255  TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
17256  TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
17257
17258  /* Thumb2 only instructions.  */
17259 #undef  ARM_VARIANT
17260 #define ARM_VARIANT  NULL
17261
17262  TCE("addw",    0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17263  TCE("subw",    0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17264  TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
17265  TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
17266  TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
17267  TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
17268
17269  /* Hardware division instructions.  */
17270 #undef  ARM_VARIANT
17271 #define ARM_VARIANT    & arm_ext_adiv
17272 #undef  THUMB_VARIANT
17273 #define THUMB_VARIANT  & arm_ext_div
17274
17275  TCE("sdiv",    710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
17276  TCE("udiv",    730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
17277
17278  /* ARM V6M/V7 instructions.  */
17279 #undef  ARM_VARIANT
17280 #define ARM_VARIANT    & arm_ext_barrier
17281 #undef  THUMB_VARIANT
17282 #define THUMB_VARIANT  & arm_ext_barrier
17283
17284  TUF("dmb",     57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier,  t_barrier),
17285  TUF("dsb",     57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier,  t_barrier),
17286  TUF("isb",     57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier,  t_barrier),
17287
17288  /* ARM V7 instructions.  */
17289 #undef  ARM_VARIANT
17290 #define ARM_VARIANT    & arm_ext_v7
17291 #undef  THUMB_VARIANT
17292 #define THUMB_VARIANT  & arm_ext_v7
17293
17294  TUF("pli",     450f000, f910f000, 1, (ADDR),     pli,      t_pld),
17295  TCE("dbg",     320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
17296
17297 #undef ARM_VARIANT
17298 #define ARM_VARIANT    & arm_ext_mp
17299 #undef THUMB_VARIANT
17300 #define THUMB_VARIANT  & arm_ext_mp
17301
17302  TUF("pldw",    410f000, f830f000, 1, (ADDR),   pld,    t_pld),
17303
17304 #undef  ARM_VARIANT
17305 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
17306
17307  cCE("wfs",     e200110, 1, (RR),            rd),
17308  cCE("rfs",     e300110, 1, (RR),            rd),
17309  cCE("wfc",     e400110, 1, (RR),            rd),
17310  cCE("rfc",     e500110, 1, (RR),            rd),
17311
17312  cCL("ldfs",    c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17313  cCL("ldfd",    c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17314  cCL("ldfe",    c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17315  cCL("ldfp",    c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17316
17317  cCL("stfs",    c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17318  cCL("stfd",    c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17319  cCL("stfe",    c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17320  cCL("stfp",    c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17321
17322  cCL("mvfs",    e008100, 2, (RF, RF_IF),     rd_rm),
17323  cCL("mvfsp",   e008120, 2, (RF, RF_IF),     rd_rm),
17324  cCL("mvfsm",   e008140, 2, (RF, RF_IF),     rd_rm),
17325  cCL("mvfsz",   e008160, 2, (RF, RF_IF),     rd_rm),
17326  cCL("mvfd",    e008180, 2, (RF, RF_IF),     rd_rm),
17327  cCL("mvfdp",   e0081a0, 2, (RF, RF_IF),     rd_rm),
17328  cCL("mvfdm",   e0081c0, 2, (RF, RF_IF),     rd_rm),
17329  cCL("mvfdz",   e0081e0, 2, (RF, RF_IF),     rd_rm),
17330  cCL("mvfe",    e088100, 2, (RF, RF_IF),     rd_rm),
17331  cCL("mvfep",   e088120, 2, (RF, RF_IF),     rd_rm),
17332  cCL("mvfem",   e088140, 2, (RF, RF_IF),     rd_rm),
17333  cCL("mvfez",   e088160, 2, (RF, RF_IF),     rd_rm),
17334
17335  cCL("mnfs",    e108100, 2, (RF, RF_IF),     rd_rm),
17336  cCL("mnfsp",   e108120, 2, (RF, RF_IF),     rd_rm),
17337  cCL("mnfsm",   e108140, 2, (RF, RF_IF),     rd_rm),
17338  cCL("mnfsz",   e108160, 2, (RF, RF_IF),     rd_rm),
17339  cCL("mnfd",    e108180, 2, (RF, RF_IF),     rd_rm),
17340  cCL("mnfdp",   e1081a0, 2, (RF, RF_IF),     rd_rm),
17341  cCL("mnfdm",   e1081c0, 2, (RF, RF_IF),     rd_rm),
17342  cCL("mnfdz",   e1081e0, 2, (RF, RF_IF),     rd_rm),
17343  cCL("mnfe",    e188100, 2, (RF, RF_IF),     rd_rm),
17344  cCL("mnfep",   e188120, 2, (RF, RF_IF),     rd_rm),
17345  cCL("mnfem",   e188140, 2, (RF, RF_IF),     rd_rm),
17346  cCL("mnfez",   e188160, 2, (RF, RF_IF),     rd_rm),
17347
17348  cCL("abss",    e208100, 2, (RF, RF_IF),     rd_rm),
17349  cCL("abssp",   e208120, 2, (RF, RF_IF),     rd_rm),
17350  cCL("abssm",   e208140, 2, (RF, RF_IF),     rd_rm),
17351  cCL("abssz",   e208160, 2, (RF, RF_IF),     rd_rm),
17352  cCL("absd",    e208180, 2, (RF, RF_IF),     rd_rm),
17353  cCL("absdp",   e2081a0, 2, (RF, RF_IF),     rd_rm),
17354  cCL("absdm",   e2081c0, 2, (RF, RF_IF),     rd_rm),
17355  cCL("absdz",   e2081e0, 2, (RF, RF_IF),     rd_rm),
17356  cCL("abse",    e288100, 2, (RF, RF_IF),     rd_rm),
17357  cCL("absep",   e288120, 2, (RF, RF_IF),     rd_rm),
17358  cCL("absem",   e288140, 2, (RF, RF_IF),     rd_rm),
17359  cCL("absez",   e288160, 2, (RF, RF_IF),     rd_rm),
17360
17361  cCL("rnds",    e308100, 2, (RF, RF_IF),     rd_rm),
17362  cCL("rndsp",   e308120, 2, (RF, RF_IF),     rd_rm),
17363  cCL("rndsm",   e308140, 2, (RF, RF_IF),     rd_rm),
17364  cCL("rndsz",   e308160, 2, (RF, RF_IF),     rd_rm),
17365  cCL("rndd",    e308180, 2, (RF, RF_IF),     rd_rm),
17366  cCL("rnddp",   e3081a0, 2, (RF, RF_IF),     rd_rm),
17367  cCL("rnddm",   e3081c0, 2, (RF, RF_IF),     rd_rm),
17368  cCL("rnddz",   e3081e0, 2, (RF, RF_IF),     rd_rm),
17369  cCL("rnde",    e388100, 2, (RF, RF_IF),     rd_rm),
17370  cCL("rndep",   e388120, 2, (RF, RF_IF),     rd_rm),
17371  cCL("rndem",   e388140, 2, (RF, RF_IF),     rd_rm),
17372  cCL("rndez",   e388160, 2, (RF, RF_IF),     rd_rm),
17373
17374  cCL("sqts",    e408100, 2, (RF, RF_IF),     rd_rm),
17375  cCL("sqtsp",   e408120, 2, (RF, RF_IF),     rd_rm),
17376  cCL("sqtsm",   e408140, 2, (RF, RF_IF),     rd_rm),
17377  cCL("sqtsz",   e408160, 2, (RF, RF_IF),     rd_rm),
17378  cCL("sqtd",    e408180, 2, (RF, RF_IF),     rd_rm),
17379  cCL("sqtdp",   e4081a0, 2, (RF, RF_IF),     rd_rm),
17380  cCL("sqtdm",   e4081c0, 2, (RF, RF_IF),     rd_rm),
17381  cCL("sqtdz",   e4081e0, 2, (RF, RF_IF),     rd_rm),
17382  cCL("sqte",    e488100, 2, (RF, RF_IF),     rd_rm),
17383  cCL("sqtep",   e488120, 2, (RF, RF_IF),     rd_rm),
17384  cCL("sqtem",   e488140, 2, (RF, RF_IF),     rd_rm),
17385  cCL("sqtez",   e488160, 2, (RF, RF_IF),     rd_rm),
17386
17387  cCL("logs",    e508100, 2, (RF, RF_IF),     rd_rm),
17388  cCL("logsp",   e508120, 2, (RF, RF_IF),     rd_rm),
17389  cCL("logsm",   e508140, 2, (RF, RF_IF),     rd_rm),
17390  cCL("logsz",   e508160, 2, (RF, RF_IF),     rd_rm),
17391  cCL("logd",    e508180, 2, (RF, RF_IF),     rd_rm),
17392  cCL("logdp",   e5081a0, 2, (RF, RF_IF),     rd_rm),
17393  cCL("logdm",   e5081c0, 2, (RF, RF_IF),     rd_rm),
17394  cCL("logdz",   e5081e0, 2, (RF, RF_IF),     rd_rm),
17395  cCL("loge",    e588100, 2, (RF, RF_IF),     rd_rm),
17396  cCL("logep",   e588120, 2, (RF, RF_IF),     rd_rm),
17397  cCL("logem",   e588140, 2, (RF, RF_IF),     rd_rm),
17398  cCL("logez",   e588160, 2, (RF, RF_IF),     rd_rm),
17399
17400  cCL("lgns",    e608100, 2, (RF, RF_IF),     rd_rm),
17401  cCL("lgnsp",   e608120, 2, (RF, RF_IF),     rd_rm),
17402  cCL("lgnsm",   e608140, 2, (RF, RF_IF),     rd_rm),
17403  cCL("lgnsz",   e608160, 2, (RF, RF_IF),     rd_rm),
17404  cCL("lgnd",    e608180, 2, (RF, RF_IF),     rd_rm),
17405  cCL("lgndp",   e6081a0, 2, (RF, RF_IF),     rd_rm),
17406  cCL("lgndm",   e6081c0, 2, (RF, RF_IF),     rd_rm),
17407  cCL("lgndz",   e6081e0, 2, (RF, RF_IF),     rd_rm),
17408  cCL("lgne",    e688100, 2, (RF, RF_IF),     rd_rm),
17409  cCL("lgnep",   e688120, 2, (RF, RF_IF),     rd_rm),
17410  cCL("lgnem",   e688140, 2, (RF, RF_IF),     rd_rm),
17411  cCL("lgnez",   e688160, 2, (RF, RF_IF),     rd_rm),
17412
17413  cCL("exps",    e708100, 2, (RF, RF_IF),     rd_rm),
17414  cCL("expsp",   e708120, 2, (RF, RF_IF),     rd_rm),
17415  cCL("expsm",   e708140, 2, (RF, RF_IF),     rd_rm),
17416  cCL("expsz",   e708160, 2, (RF, RF_IF),     rd_rm),
17417  cCL("expd",    e708180, 2, (RF, RF_IF),     rd_rm),
17418  cCL("expdp",   e7081a0, 2, (RF, RF_IF),     rd_rm),
17419  cCL("expdm",   e7081c0, 2, (RF, RF_IF),     rd_rm),
17420  cCL("expdz",   e7081e0, 2, (RF, RF_IF),     rd_rm),
17421  cCL("expe",    e788100, 2, (RF, RF_IF),     rd_rm),
17422  cCL("expep",   e788120, 2, (RF, RF_IF),     rd_rm),
17423  cCL("expem",   e788140, 2, (RF, RF_IF),     rd_rm),
17424  cCL("expdz",   e788160, 2, (RF, RF_IF),     rd_rm),
17425
17426  cCL("sins",    e808100, 2, (RF, RF_IF),     rd_rm),
17427  cCL("sinsp",   e808120, 2, (RF, RF_IF),     rd_rm),
17428  cCL("sinsm",   e808140, 2, (RF, RF_IF),     rd_rm),
17429  cCL("sinsz",   e808160, 2, (RF, RF_IF),     rd_rm),
17430  cCL("sind",    e808180, 2, (RF, RF_IF),     rd_rm),
17431  cCL("sindp",   e8081a0, 2, (RF, RF_IF),     rd_rm),
17432  cCL("sindm",   e8081c0, 2, (RF, RF_IF),     rd_rm),
17433  cCL("sindz",   e8081e0, 2, (RF, RF_IF),     rd_rm),
17434  cCL("sine",    e888100, 2, (RF, RF_IF),     rd_rm),
17435  cCL("sinep",   e888120, 2, (RF, RF_IF),     rd_rm),
17436  cCL("sinem",   e888140, 2, (RF, RF_IF),     rd_rm),
17437  cCL("sinez",   e888160, 2, (RF, RF_IF),     rd_rm),
17438
17439  cCL("coss",    e908100, 2, (RF, RF_IF),     rd_rm),
17440  cCL("cossp",   e908120, 2, (RF, RF_IF),     rd_rm),
17441  cCL("cossm",   e908140, 2, (RF, RF_IF),     rd_rm),
17442  cCL("cossz",   e908160, 2, (RF, RF_IF),     rd_rm),
17443  cCL("cosd",    e908180, 2, (RF, RF_IF),     rd_rm),
17444  cCL("cosdp",   e9081a0, 2, (RF, RF_IF),     rd_rm),
17445  cCL("cosdm",   e9081c0, 2, (RF, RF_IF),     rd_rm),
17446  cCL("cosdz",   e9081e0, 2, (RF, RF_IF),     rd_rm),
17447  cCL("cose",    e988100, 2, (RF, RF_IF),     rd_rm),
17448  cCL("cosep",   e988120, 2, (RF, RF_IF),     rd_rm),
17449  cCL("cosem",   e988140, 2, (RF, RF_IF),     rd_rm),
17450  cCL("cosez",   e988160, 2, (RF, RF_IF),     rd_rm),
17451
17452  cCL("tans",    ea08100, 2, (RF, RF_IF),     rd_rm),
17453  cCL("tansp",   ea08120, 2, (RF, RF_IF),     rd_rm),
17454  cCL("tansm",   ea08140, 2, (RF, RF_IF),     rd_rm),
17455  cCL("tansz",   ea08160, 2, (RF, RF_IF),     rd_rm),
17456  cCL("tand",    ea08180, 2, (RF, RF_IF),     rd_rm),
17457  cCL("tandp",   ea081a0, 2, (RF, RF_IF),     rd_rm),
17458  cCL("tandm",   ea081c0, 2, (RF, RF_IF),     rd_rm),
17459  cCL("tandz",   ea081e0, 2, (RF, RF_IF),     rd_rm),
17460  cCL("tane",    ea88100, 2, (RF, RF_IF),     rd_rm),
17461  cCL("tanep",   ea88120, 2, (RF, RF_IF),     rd_rm),
17462  cCL("tanem",   ea88140, 2, (RF, RF_IF),     rd_rm),
17463  cCL("tanez",   ea88160, 2, (RF, RF_IF),     rd_rm),
17464
17465  cCL("asns",    eb08100, 2, (RF, RF_IF),     rd_rm),
17466  cCL("asnsp",   eb08120, 2, (RF, RF_IF),     rd_rm),
17467  cCL("asnsm",   eb08140, 2, (RF, RF_IF),     rd_rm),
17468  cCL("asnsz",   eb08160, 2, (RF, RF_IF),     rd_rm),
17469  cCL("asnd",    eb08180, 2, (RF, RF_IF),     rd_rm),
17470  cCL("asndp",   eb081a0, 2, (RF, RF_IF),     rd_rm),
17471  cCL("asndm",   eb081c0, 2, (RF, RF_IF),     rd_rm),
17472  cCL("asndz",   eb081e0, 2, (RF, RF_IF),     rd_rm),
17473  cCL("asne",    eb88100, 2, (RF, RF_IF),     rd_rm),
17474  cCL("asnep",   eb88120, 2, (RF, RF_IF),     rd_rm),
17475  cCL("asnem",   eb88140, 2, (RF, RF_IF),     rd_rm),
17476  cCL("asnez",   eb88160, 2, (RF, RF_IF),     rd_rm),
17477
17478  cCL("acss",    ec08100, 2, (RF, RF_IF),     rd_rm),
17479  cCL("acssp",   ec08120, 2, (RF, RF_IF),     rd_rm),
17480  cCL("acssm",   ec08140, 2, (RF, RF_IF),     rd_rm),
17481  cCL("acssz",   ec08160, 2, (RF, RF_IF),     rd_rm),
17482  cCL("acsd",    ec08180, 2, (RF, RF_IF),     rd_rm),
17483  cCL("acsdp",   ec081a0, 2, (RF, RF_IF),     rd_rm),
17484  cCL("acsdm",   ec081c0, 2, (RF, RF_IF),     rd_rm),
17485  cCL("acsdz",   ec081e0, 2, (RF, RF_IF),     rd_rm),
17486  cCL("acse",    ec88100, 2, (RF, RF_IF),     rd_rm),
17487  cCL("acsep",   ec88120, 2, (RF, RF_IF),     rd_rm),
17488  cCL("acsem",   ec88140, 2, (RF, RF_IF),     rd_rm),
17489  cCL("acsez",   ec88160, 2, (RF, RF_IF),     rd_rm),
17490
17491  cCL("atns",    ed08100, 2, (RF, RF_IF),     rd_rm),
17492  cCL("atnsp",   ed08120, 2, (RF, RF_IF),     rd_rm),
17493  cCL("atnsm",   ed08140, 2, (RF, RF_IF),     rd_rm),
17494  cCL("atnsz",   ed08160, 2, (RF, RF_IF),     rd_rm),
17495  cCL("atnd",    ed08180, 2, (RF, RF_IF),     rd_rm),
17496  cCL("atndp",   ed081a0, 2, (RF, RF_IF),     rd_rm),
17497  cCL("atndm",   ed081c0, 2, (RF, RF_IF),     rd_rm),
17498  cCL("atndz",   ed081e0, 2, (RF, RF_IF),     rd_rm),
17499  cCL("atne",    ed88100, 2, (RF, RF_IF),     rd_rm),
17500  cCL("atnep",   ed88120, 2, (RF, RF_IF),     rd_rm),
17501  cCL("atnem",   ed88140, 2, (RF, RF_IF),     rd_rm),
17502  cCL("atnez",   ed88160, 2, (RF, RF_IF),     rd_rm),
17503
17504  cCL("urds",    ee08100, 2, (RF, RF_IF),     rd_rm),
17505  cCL("urdsp",   ee08120, 2, (RF, RF_IF),     rd_rm),
17506  cCL("urdsm",   ee08140, 2, (RF, RF_IF),     rd_rm),
17507  cCL("urdsz",   ee08160, 2, (RF, RF_IF),     rd_rm),
17508  cCL("urdd",    ee08180, 2, (RF, RF_IF),     rd_rm),
17509  cCL("urddp",   ee081a0, 2, (RF, RF_IF),     rd_rm),
17510  cCL("urddm",   ee081c0, 2, (RF, RF_IF),     rd_rm),
17511  cCL("urddz",   ee081e0, 2, (RF, RF_IF),     rd_rm),
17512  cCL("urde",    ee88100, 2, (RF, RF_IF),     rd_rm),
17513  cCL("urdep",   ee88120, 2, (RF, RF_IF),     rd_rm),
17514  cCL("urdem",   ee88140, 2, (RF, RF_IF),     rd_rm),
17515  cCL("urdez",   ee88160, 2, (RF, RF_IF),     rd_rm),
17516
17517  cCL("nrms",    ef08100, 2, (RF, RF_IF),     rd_rm),
17518  cCL("nrmsp",   ef08120, 2, (RF, RF_IF),     rd_rm),
17519  cCL("nrmsm",   ef08140, 2, (RF, RF_IF),     rd_rm),
17520  cCL("nrmsz",   ef08160, 2, (RF, RF_IF),     rd_rm),
17521  cCL("nrmd",    ef08180, 2, (RF, RF_IF),     rd_rm),
17522  cCL("nrmdp",   ef081a0, 2, (RF, RF_IF),     rd_rm),
17523  cCL("nrmdm",   ef081c0, 2, (RF, RF_IF),     rd_rm),
17524  cCL("nrmdz",   ef081e0, 2, (RF, RF_IF),     rd_rm),
17525  cCL("nrme",    ef88100, 2, (RF, RF_IF),     rd_rm),
17526  cCL("nrmep",   ef88120, 2, (RF, RF_IF),     rd_rm),
17527  cCL("nrmem",   ef88140, 2, (RF, RF_IF),     rd_rm),
17528  cCL("nrmez",   ef88160, 2, (RF, RF_IF),     rd_rm),
17529
17530  cCL("adfs",    e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
17531  cCL("adfsp",   e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
17532  cCL("adfsm",   e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
17533  cCL("adfsz",   e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
17534  cCL("adfd",    e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
17535  cCL("adfdp",   e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17536  cCL("adfdm",   e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17537  cCL("adfdz",   e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17538  cCL("adfe",    e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
17539  cCL("adfep",   e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
17540  cCL("adfem",   e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
17541  cCL("adfez",   e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
17542
17543  cCL("sufs",    e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
17544  cCL("sufsp",   e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
17545  cCL("sufsm",   e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
17546  cCL("sufsz",   e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
17547  cCL("sufd",    e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
17548  cCL("sufdp",   e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17549  cCL("sufdm",   e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17550  cCL("sufdz",   e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17551  cCL("sufe",    e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
17552  cCL("sufep",   e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
17553  cCL("sufem",   e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
17554  cCL("sufez",   e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
17555
17556  cCL("rsfs",    e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
17557  cCL("rsfsp",   e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
17558  cCL("rsfsm",   e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
17559  cCL("rsfsz",   e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
17560  cCL("rsfd",    e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
17561  cCL("rsfdp",   e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17562  cCL("rsfdm",   e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17563  cCL("rsfdz",   e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17564  cCL("rsfe",    e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
17565  cCL("rsfep",   e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
17566  cCL("rsfem",   e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
17567  cCL("rsfez",   e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
17568
17569  cCL("mufs",    e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
17570  cCL("mufsp",   e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
17571  cCL("mufsm",   e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
17572  cCL("mufsz",   e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
17573  cCL("mufd",    e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
17574  cCL("mufdp",   e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17575  cCL("mufdm",   e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17576  cCL("mufdz",   e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17577  cCL("mufe",    e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
17578  cCL("mufep",   e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
17579  cCL("mufem",   e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
17580  cCL("mufez",   e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
17581
17582  cCL("dvfs",    e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
17583  cCL("dvfsp",   e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
17584  cCL("dvfsm",   e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
17585  cCL("dvfsz",   e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
17586  cCL("dvfd",    e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
17587  cCL("dvfdp",   e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17588  cCL("dvfdm",   e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17589  cCL("dvfdz",   e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17590  cCL("dvfe",    e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
17591  cCL("dvfep",   e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
17592  cCL("dvfem",   e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
17593  cCL("dvfez",   e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
17594
17595  cCL("rdfs",    e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
17596  cCL("rdfsp",   e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
17597  cCL("rdfsm",   e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
17598  cCL("rdfsz",   e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
17599  cCL("rdfd",    e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
17600  cCL("rdfdp",   e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17601  cCL("rdfdm",   e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17602  cCL("rdfdz",   e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17603  cCL("rdfe",    e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
17604  cCL("rdfep",   e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
17605  cCL("rdfem",   e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
17606  cCL("rdfez",   e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
17607
17608  cCL("pows",    e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
17609  cCL("powsp",   e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
17610  cCL("powsm",   e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
17611  cCL("powsz",   e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
17612  cCL("powd",    e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
17613  cCL("powdp",   e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17614  cCL("powdm",   e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17615  cCL("powdz",   e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17616  cCL("powe",    e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
17617  cCL("powep",   e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
17618  cCL("powem",   e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
17619  cCL("powez",   e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
17620
17621  cCL("rpws",    e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
17622  cCL("rpwsp",   e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
17623  cCL("rpwsm",   e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
17624  cCL("rpwsz",   e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
17625  cCL("rpwd",    e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
17626  cCL("rpwdp",   e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17627  cCL("rpwdm",   e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17628  cCL("rpwdz",   e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17629  cCL("rpwe",    e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
17630  cCL("rpwep",   e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
17631  cCL("rpwem",   e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
17632  cCL("rpwez",   e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
17633
17634  cCL("rmfs",    e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
17635  cCL("rmfsp",   e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
17636  cCL("rmfsm",   e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
17637  cCL("rmfsz",   e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
17638  cCL("rmfd",    e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
17639  cCL("rmfdp",   e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17640  cCL("rmfdm",   e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17641  cCL("rmfdz",   e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17642  cCL("rmfe",    e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
17643  cCL("rmfep",   e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
17644  cCL("rmfem",   e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
17645  cCL("rmfez",   e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
17646
17647  cCL("fmls",    e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
17648  cCL("fmlsp",   e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
17649  cCL("fmlsm",   e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
17650  cCL("fmlsz",   e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
17651  cCL("fmld",    e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
17652  cCL("fmldp",   e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17653  cCL("fmldm",   e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17654  cCL("fmldz",   e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17655  cCL("fmle",    e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
17656  cCL("fmlep",   e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
17657  cCL("fmlem",   e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
17658  cCL("fmlez",   e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
17659
17660  cCL("fdvs",    ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17661  cCL("fdvsp",   ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17662  cCL("fdvsm",   ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17663  cCL("fdvsz",   ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17664  cCL("fdvd",    ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17665  cCL("fdvdp",   ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17666  cCL("fdvdm",   ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17667  cCL("fdvdz",   ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17668  cCL("fdve",    ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17669  cCL("fdvep",   ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17670  cCL("fdvem",   ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17671  cCL("fdvez",   ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17672
17673  cCL("frds",    eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17674  cCL("frdsp",   eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17675  cCL("frdsm",   eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17676  cCL("frdsz",   eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17677  cCL("frdd",    eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17678  cCL("frddp",   eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17679  cCL("frddm",   eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17680  cCL("frddz",   eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17681  cCL("frde",    eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17682  cCL("frdep",   eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17683  cCL("frdem",   eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17684  cCL("frdez",   eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17685
17686  cCL("pols",    ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17687  cCL("polsp",   ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17688  cCL("polsm",   ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17689  cCL("polsz",   ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17690  cCL("pold",    ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17691  cCL("poldp",   ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17692  cCL("poldm",   ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17693  cCL("poldz",   ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17694  cCL("pole",    ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17695  cCL("polep",   ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17696  cCL("polem",   ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17697  cCL("polez",   ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17698
17699  cCE("cmf",     e90f110, 2, (RF, RF_IF),     fpa_cmp),
17700  C3E("cmfe",    ed0f110, 2, (RF, RF_IF),     fpa_cmp),
17701  cCE("cnf",     eb0f110, 2, (RF, RF_IF),     fpa_cmp),
17702  C3E("cnfe",    ef0f110, 2, (RF, RF_IF),     fpa_cmp),
17703
17704  cCL("flts",    e000110, 2, (RF, RR),        rn_rd),
17705  cCL("fltsp",   e000130, 2, (RF, RR),        rn_rd),
17706  cCL("fltsm",   e000150, 2, (RF, RR),        rn_rd),
17707  cCL("fltsz",   e000170, 2, (RF, RR),        rn_rd),
17708  cCL("fltd",    e000190, 2, (RF, RR),        rn_rd),
17709  cCL("fltdp",   e0001b0, 2, (RF, RR),        rn_rd),
17710  cCL("fltdm",   e0001d0, 2, (RF, RR),        rn_rd),
17711  cCL("fltdz",   e0001f0, 2, (RF, RR),        rn_rd),
17712  cCL("flte",    e080110, 2, (RF, RR),        rn_rd),
17713  cCL("fltep",   e080130, 2, (RF, RR),        rn_rd),
17714  cCL("fltem",   e080150, 2, (RF, RR),        rn_rd),
17715  cCL("fltez",   e080170, 2, (RF, RR),        rn_rd),
17716
17717   /* The implementation of the FIX instruction is broken on some
17718      assemblers, in that it accepts a precision specifier as well as a
17719      rounding specifier, despite the fact that this is meaningless.
17720      To be more compatible, we accept it as well, though of course it
17721      does not set any bits.  */
17722  cCE("fix",     e100110, 2, (RR, RF),        rd_rm),
17723  cCL("fixp",    e100130, 2, (RR, RF),        rd_rm),
17724  cCL("fixm",    e100150, 2, (RR, RF),        rd_rm),
17725  cCL("fixz",    e100170, 2, (RR, RF),        rd_rm),
17726  cCL("fixsp",   e100130, 2, (RR, RF),        rd_rm),
17727  cCL("fixsm",   e100150, 2, (RR, RF),        rd_rm),
17728  cCL("fixsz",   e100170, 2, (RR, RF),        rd_rm),
17729  cCL("fixdp",   e100130, 2, (RR, RF),        rd_rm),
17730  cCL("fixdm",   e100150, 2, (RR, RF),        rd_rm),
17731  cCL("fixdz",   e100170, 2, (RR, RF),        rd_rm),
17732  cCL("fixep",   e100130, 2, (RR, RF),        rd_rm),
17733  cCL("fixem",   e100150, 2, (RR, RF),        rd_rm),
17734  cCL("fixez",   e100170, 2, (RR, RF),        rd_rm),
17735
17736   /* Instructions that were new with the real FPA, call them V2.  */
17737 #undef  ARM_VARIANT
17738 #define ARM_VARIANT  & fpu_fpa_ext_v2
17739
17740  cCE("lfm",     c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17741  cCL("lfmfd",   c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17742  cCL("lfmea",   d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17743  cCE("sfm",     c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17744  cCL("sfmfd",   d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17745  cCL("sfmea",   c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17746
17747 #undef  ARM_VARIANT
17748 #define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
17749
17750   /* Moves and type conversions.  */
17751  cCE("fcpys",   eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
17752  cCE("fmrs",    e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
17753  cCE("fmsr",    e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
17754  cCE("fmstat",  ef1fa10, 0, (),               noargs),
17755  cCE("vmrs",    ef10a10, 2, (APSR_RR, RVC),   vmrs),
17756  cCE("vmsr",    ee10a10, 2, (RVC, RR),        vmsr),
17757  cCE("fsitos",  eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17758  cCE("fuitos",  eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
17759  cCE("ftosis",  ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
17760  cCE("ftosizs", ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17761  cCE("ftouis",  ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
17762  cCE("ftouizs", ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17763  cCE("fmrx",    ef00a10, 2, (RR, RVC),        rd_rn),
17764  cCE("fmxr",    ee00a10, 2, (RVC, RR),        rn_rd),
17765
17766   /* Memory operations.  */
17767  cCE("flds",    d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
17768  cCE("fsts",    d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
17769  cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
17770  cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
17771  cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
17772  cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
17773  cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
17774  cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
17775  cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
17776  cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
17777  cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
17778  cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
17779  cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
17780  cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
17781  cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
17782  cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
17783  cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
17784  cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
17785
17786   /* Monadic operations.  */
17787  cCE("fabss",   eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17788  cCE("fnegs",   eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
17789  cCE("fsqrts",  eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17790
17791   /* Dyadic operations.  */
17792  cCE("fadds",   e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17793  cCE("fsubs",   e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17794  cCE("fmuls",   e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17795  cCE("fdivs",   e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17796  cCE("fmacs",   e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17797  cCE("fmscs",   e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17798  cCE("fnmuls",  e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17799  cCE("fnmacs",  e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17800  cCE("fnmscs",  e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
17801
17802   /* Comparisons.  */
17803  cCE("fcmps",   eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
17804  cCE("fcmpzs",  eb50a40, 1, (RVS),            vfp_sp_compare_z),
17805  cCE("fcmpes",  eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
17806  cCE("fcmpezs", eb50ac0, 1, (RVS),            vfp_sp_compare_z),
17807
17808  /* Double precision load/store are still present on single precision
17809     implementations.  */
17810  cCE("fldd",    d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
17811  cCE("fstd",    d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
17812  cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
17813  cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
17814  cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
17815  cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
17816  cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
17817  cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
17818  cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
17819  cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
17820
17821 #undef  ARM_VARIANT
17822 #define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
17823
17824   /* Moves and type conversions.  */
17825  cCE("fcpyd",   eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
17826  cCE("fcvtds",  eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
17827  cCE("fcvtsd",  eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17828  cCE("fmdhr",   e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
17829  cCE("fmdlr",   e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
17830  cCE("fmrdh",   e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
17831  cCE("fmrdl",   e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
17832  cCE("fsitod",  eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
17833  cCE("fuitod",  eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
17834  cCE("ftosid",  ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17835  cCE("ftosizd", ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17836  cCE("ftouid",  ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17837  cCE("ftouizd", ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
17838
17839   /* Monadic operations.  */
17840  cCE("fabsd",   eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
17841  cCE("fnegd",   eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
17842  cCE("fsqrtd",  eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
17843
17844   /* Dyadic operations.  */
17845  cCE("faddd",   e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17846  cCE("fsubd",   e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17847  cCE("fmuld",   e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17848  cCE("fdivd",   e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17849  cCE("fmacd",   e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17850  cCE("fmscd",   e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17851  cCE("fnmuld",  e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17852  cCE("fnmacd",  e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17853  cCE("fnmscd",  e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
17854
17855   /* Comparisons.  */
17856  cCE("fcmpd",   eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
17857  cCE("fcmpzd",  eb50b40, 1, (RVD),            vfp_dp_rd),
17858  cCE("fcmped",  eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
17859  cCE("fcmpezd", eb50bc0, 1, (RVD),            vfp_dp_rd),
17860
17861 #undef  ARM_VARIANT
17862 #define ARM_VARIANT  & fpu_vfp_ext_v2
17863
17864  cCE("fmsrr",   c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
17865  cCE("fmrrs",   c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
17866  cCE("fmdrr",   c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
17867  cCE("fmrrd",   c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
17868
17869 /* Instructions which may belong to either the Neon or VFP instruction sets.
17870    Individual encoder functions perform additional architecture checks.  */
17871 #undef  ARM_VARIANT
17872 #define ARM_VARIANT    & fpu_vfp_ext_v1xd
17873 #undef  THUMB_VARIANT
17874 #define THUMB_VARIANT  & fpu_vfp_ext_v1xd
17875
17876   /* These mnemonics are unique to VFP.  */
17877  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
17878  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
17879  nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
17880  nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
17881  nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
17882  nCE(vcmp,      _vcmp,    2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
17883  nCE(vcmpe,     _vcmpe,   2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
17884  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
17885  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
17886  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
17887
17888   /* Mnemonics shared by Neon and VFP.  */
17889  nCEF(vmul,     _vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
17890  nCEF(vmla,     _vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
17891  nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
17892
17893  nCEF(vadd,     _vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
17894  nCEF(vsub,     _vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
17895
17896  NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
17897  NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
17898
17899  NCE(vldm,      c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
17900  NCE(vldmia,    c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
17901  NCE(vldmdb,    d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
17902  NCE(vstm,      c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
17903  NCE(vstmia,    c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
17904  NCE(vstmdb,    d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
17905  NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
17906  NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
17907
17908  nCEF(vcvt,     _vcvt,   3, (RNSDQ, RNSDQ, oI32b), neon_cvt),
17909  nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
17910  nCEF(vcvtb,    _vcvt,   2, (RVS, RVS), neon_cvtb),
17911  nCEF(vcvtt,    _vcvt,   2, (RVS, RVS), neon_cvtt),
17912
17913
17914   /* NOTE: All VMOV encoding is special-cased!  */
17915  NCE(vmov,      0,       1, (VMOV), neon_mov),
17916  NCE(vmovq,     0,       1, (VMOV), neon_mov),
17917
17918 #undef  THUMB_VARIANT
17919 #define THUMB_VARIANT  & fpu_neon_ext_v1
17920 #undef  ARM_VARIANT
17921 #define ARM_VARIANT    & fpu_neon_ext_v1
17922
17923   /* Data processing with three registers of the same length.  */
17924   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
17925  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
17926  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
17927  NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
17928  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
17929  NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
17930  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
17931  NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
17932  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
17933   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
17934  NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
17935  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
17936  NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
17937  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
17938  NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
17939  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
17940  NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
17941  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
17942   /* If not immediate, fall back to neon_dyadic_i64_su.
17943      shl_imm should accept I8 I16 I32 I64,
17944      qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
17945  nUF(vshl,      _vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
17946  nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
17947  nUF(vqshl,     _vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
17948  nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
17949   /* Logic ops, types optional & ignored.  */
17950  nUF(vand,      _vand,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
17951  nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
17952  nUF(vbic,      _vbic,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
17953  nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
17954  nUF(vorr,      _vorr,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
17955  nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
17956  nUF(vorn,      _vorn,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
17957  nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
17958  nUF(veor,      _veor,    3, (RNDQ, oRNDQ, RNDQ),      neon_logic),
17959  nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
17960   /* Bitfield ops, untyped.  */
17961  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
17962  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
17963  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
17964  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
17965  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
17966  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
17967   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32.  */
17968  nUF(vabd,      _vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
17969  nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
17970  nUF(vmax,      _vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
17971  nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
17972  nUF(vmin,      _vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
17973  nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
17974   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
17975      back to neon_dyadic_if_su.  */
17976  nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
17977  nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
17978  nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
17979  nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
17980  nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
17981  nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
17982  nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
17983  nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
17984   /* Comparison. Type I8 I16 I32 F32.  */
17985  nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
17986  nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
17987   /* As above, D registers only.  */
17988  nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
17989  nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
17990   /* Int and float variants, signedness unimportant.  */
17991  nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
17992  nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
17993  nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
17994   /* Add/sub take types I8 I16 I32 I64 F32.  */
17995  nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
17996  nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
17997   /* vtst takes sizes 8, 16, 32.  */
17998  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
17999  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
18000   /* VMUL takes I8 I16 I32 F32 P8.  */
18001  nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
18002   /* VQD{R}MULH takes S16 S32.  */
18003  nUF(vqdmulh,   _vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18004  nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
18005  nUF(vqrdmulh,  _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18006  nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
18007  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18008  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
18009  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18010  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
18011  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18012  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
18013  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18014  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
18015  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
18016  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
18017  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
18018  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
18019
18020   /* Two address, int/float. Types S8 S16 S32 F32.  */
18021  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
18022  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
18023
18024   /* Data processing with two registers and a shift amount.  */
18025   /* Right shifts, and variants with rounding.
18026      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
18027  NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18028  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
18029  NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18030  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
18031  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
18032  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
18033  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
18034  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
18035   /* Shift and insert. Sizes accepted 8 16 32 64.  */
18036  NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
18037  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
18038  NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
18039  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
18040   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
18041  NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
18042  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
18043   /* Right shift immediate, saturating & narrowing, with rounding variants.
18044      Types accepted S16 S32 S64 U16 U32 U64.  */
18045  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18046  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18047   /* As above, unsigned. Types accepted S16 S32 S64.  */
18048  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18049  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18050   /* Right shift narrowing. Types accepted I16 I32 I64.  */
18051  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18052  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18053   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
18054  nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
18055   /* CVT with optional immediate for fixed-point variant.  */
18056  nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
18057
18058  nUF(vmvn,      _vmvn,    2, (RNDQ, RNDQ_Ibig), neon_mvn),
18059  nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
18060
18061   /* Data processing, three registers of different lengths.  */
18062   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
18063  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
18064  NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
18065  NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
18066  NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
18067   /* If not scalar, fall back to neon_dyadic_long.
18068      Vector types as above, scalar types S16 S32 U16 U32.  */
18069  nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
18070  nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
18071   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
18072  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18073  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18074   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
18075  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18076  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18077  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18078  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18079   /* Saturating doubling multiplies. Types S16 S32.  */
18080  nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18081  nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18082  nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18083   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
18084      S16 S32 U16 U32.  */
18085  nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
18086
18087   /* Extract. Size 8.  */
18088  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
18089  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
18090
18091   /* Two registers, miscellaneous.  */
18092   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
18093  NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
18094  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
18095  NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
18096  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
18097  NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
18098  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
18099   /* Vector replicate. Sizes 8 16 32.  */
18100  nCE(vdup,      _vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
18101  nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
18102   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
18103  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
18104   /* VMOVN. Types I16 I32 I64.  */
18105  nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
18106   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
18107  nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
18108   /* VQMOVUN. Types S16 S32 S64.  */
18109  nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
18110   /* VZIP / VUZP. Sizes 8 16 32.  */
18111  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
18112  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
18113  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
18114  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
18115   /* VQABS / VQNEG. Types S8 S16 S32.  */
18116  NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
18117  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
18118  NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
18119  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
18120   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
18121  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
18122  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
18123  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
18124  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
18125   /* Reciprocal estimates. Types U32 F32.  */
18126  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
18127  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
18128  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
18129  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
18130   /* VCLS. Types S8 S16 S32.  */
18131  NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
18132  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
18133   /* VCLZ. Types I8 I16 I32.  */
18134  NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
18135  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
18136   /* VCNT. Size 8.  */
18137  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
18138  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
18139   /* Two address, untyped.  */
18140  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
18141  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
18142   /* VTRN. Sizes 8 16 32.  */
18143  nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
18144  nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
18145
18146   /* Table lookup. Size 8.  */
18147  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18148  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18149
18150 #undef  THUMB_VARIANT
18151 #define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
18152 #undef  ARM_VARIANT
18153 #define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
18154
18155   /* Neon element/structure load/store.  */
18156  nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18157  nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18158  nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18159  nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18160  nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18161  nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18162  nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18163  nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18164
18165 #undef  THUMB_VARIANT
18166 #define THUMB_VARIANT &fpu_vfp_ext_v3xd
18167 #undef ARM_VARIANT
18168 #define ARM_VARIANT &fpu_vfp_ext_v3xd
18169  cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
18170  cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18171  cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18172  cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18173  cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18174  cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18175  cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18176  cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18177  cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18178
18179 #undef THUMB_VARIANT
18180 #define THUMB_VARIANT  & fpu_vfp_ext_v3
18181 #undef  ARM_VARIANT
18182 #define ARM_VARIANT    & fpu_vfp_ext_v3
18183
18184  cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
18185  cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18186  cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18187  cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18188  cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18189  cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18190  cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18191  cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18192  cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18193
18194 #undef ARM_VARIANT
18195 #define ARM_VARIANT &fpu_vfp_ext_fma
18196 #undef THUMB_VARIANT
18197 #define THUMB_VARIANT &fpu_vfp_ext_fma
18198  /* Mnemonics shared by Neon and VFP.  These are included in the
18199     VFP FMA variant; NEON and VFP FMA always includes the NEON
18200     FMA instructions.  */
18201  nCEF(vfma,     _vfma,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18202  nCEF(vfms,     _vfms,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18203  /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
18204     the v form should always be used.  */
18205  cCE("ffmas",   ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18206  cCE("ffnmas",  ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18207  cCE("ffmad",   ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18208  cCE("ffnmad",  ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18209  nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18210  nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18211
18212 #undef THUMB_VARIANT
18213 #undef  ARM_VARIANT
18214 #define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
18215
18216  cCE("mia",     e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18217  cCE("miaph",   e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18218  cCE("miabb",   e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18219  cCE("miabt",   e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18220  cCE("miatb",   e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18221  cCE("miatt",   e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18222  cCE("mar",     c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
18223  cCE("mra",     c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
18224
18225 #undef  ARM_VARIANT
18226 #define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
18227
18228  cCE("tandcb",  e13f130, 1, (RR),                   iwmmxt_tandorc),
18229  cCE("tandch",  e53f130, 1, (RR),                   iwmmxt_tandorc),
18230  cCE("tandcw",  e93f130, 1, (RR),                   iwmmxt_tandorc),
18231  cCE("tbcstb",  e400010, 2, (RIWR, RR),             rn_rd),
18232  cCE("tbcsth",  e400050, 2, (RIWR, RR),             rn_rd),
18233  cCE("tbcstw",  e400090, 2, (RIWR, RR),             rn_rd),
18234  cCE("textrcb", e130170, 2, (RR, I7),               iwmmxt_textrc),
18235  cCE("textrch", e530170, 2, (RR, I7),               iwmmxt_textrc),
18236  cCE("textrcw", e930170, 2, (RR, I7),               iwmmxt_textrc),
18237  cCE("textrmub",        e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18238  cCE("textrmuh",        e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18239  cCE("textrmuw",        e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18240  cCE("textrmsb",        e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18241  cCE("textrmsh",        e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18242  cCE("textrmsw",        e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18243  cCE("tinsrb",  e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
18244  cCE("tinsrh",  e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
18245  cCE("tinsrw",  e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
18246  cCE("tmcr",    e000110, 2, (RIWC_RIWG, RR),        rn_rd),
18247  cCE("tmcrr",   c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
18248  cCE("tmia",    e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18249  cCE("tmiaph",  e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18250  cCE("tmiabb",  e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18251  cCE("tmiabt",  e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18252  cCE("tmiatb",  e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18253  cCE("tmiatt",  e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18254  cCE("tmovmskb",        e100030, 2, (RR, RIWR),             rd_rn),
18255  cCE("tmovmskh",        e500030, 2, (RR, RIWR),             rd_rn),
18256  cCE("tmovmskw",        e900030, 2, (RR, RIWR),             rd_rn),
18257  cCE("tmrc",    e100110, 2, (RR, RIWC_RIWG),        rd_rn),
18258  cCE("tmrrc",   c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
18259  cCE("torcb",   e13f150, 1, (RR),                   iwmmxt_tandorc),
18260  cCE("torch",   e53f150, 1, (RR),                   iwmmxt_tandorc),
18261  cCE("torcw",   e93f150, 1, (RR),                   iwmmxt_tandorc),
18262  cCE("waccb",   e0001c0, 2, (RIWR, RIWR),           rd_rn),
18263  cCE("wacch",   e4001c0, 2, (RIWR, RIWR),           rd_rn),
18264  cCE("waccw",   e8001c0, 2, (RIWR, RIWR),           rd_rn),
18265  cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18266  cCE("waddb",   e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18267  cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18268  cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18269  cCE("waddh",   e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18270  cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18271  cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18272  cCE("waddw",   e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18273  cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18274  cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
18275  cCE("walignr0",        e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18276  cCE("walignr1",        e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18277  cCE("walignr2",        ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18278  cCE("walignr3",        eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18279  cCE("wand",    e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18280  cCE("wandn",   e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18281  cCE("wavg2b",  e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18282  cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18283  cCE("wavg2h",  ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18284  cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18285  cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18286  cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18287  cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18288  cCE("wcmpgtub",        e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18289  cCE("wcmpgtuh",        e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18290  cCE("wcmpgtuw",        e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18291  cCE("wcmpgtsb",        e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18292  cCE("wcmpgtsh",        e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18293  cCE("wcmpgtsw",        eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18294  cCE("wldrb",   c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18295  cCE("wldrh",   c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18296  cCE("wldrw",   c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
18297  cCE("wldrd",   c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
18298  cCE("wmacs",   e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18299  cCE("wmacsz",  e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18300  cCE("wmacu",   e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18301  cCE("wmacuz",  e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18302  cCE("wmadds",  ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18303  cCE("wmaddu",  e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18304  cCE("wmaxsb",  e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18305  cCE("wmaxsh",  e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18306  cCE("wmaxsw",  ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18307  cCE("wmaxub",  e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18308  cCE("wmaxuh",  e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18309  cCE("wmaxuw",  e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18310  cCE("wminsb",  e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18311  cCE("wminsh",  e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18312  cCE("wminsw",  eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18313  cCE("wminub",  e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18314  cCE("wminuh",  e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18315  cCE("wminuw",  e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18316  cCE("wmov",    e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
18317  cCE("wmulsm",  e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18318  cCE("wmulsl",  e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18319  cCE("wmulum",  e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18320  cCE("wmulul",  e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18321  cCE("wor",     e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18322  cCE("wpackhss",        e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18323  cCE("wpackhus",        e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18324  cCE("wpackwss",        eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18325  cCE("wpackwus",        e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18326  cCE("wpackdss",        ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18327  cCE("wpackdus",        ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18328  cCE("wrorh",   e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18329  cCE("wrorhg",  e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18330  cCE("wrorw",   eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18331  cCE("wrorwg",  eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18332  cCE("wrord",   ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18333  cCE("wrordg",  ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18334  cCE("wsadb",   e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18335  cCE("wsadbz",  e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18336  cCE("wsadh",   e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18337  cCE("wsadhz",  e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18338  cCE("wshufh",  e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
18339  cCE("wsllh",   e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18340  cCE("wsllhg",  e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18341  cCE("wsllw",   e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18342  cCE("wsllwg",  e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18343  cCE("wslld",   ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18344  cCE("wslldg",  ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18345  cCE("wsrah",   e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18346  cCE("wsrahg",  e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18347  cCE("wsraw",   e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18348  cCE("wsrawg",  e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18349  cCE("wsrad",   ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18350  cCE("wsradg",  ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18351  cCE("wsrlh",   e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18352  cCE("wsrlhg",  e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18353  cCE("wsrlw",   ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18354  cCE("wsrlwg",  ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18355  cCE("wsrld",   ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18356  cCE("wsrldg",  ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18357  cCE("wstrb",   c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18358  cCE("wstrh",   c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18359  cCE("wstrw",   c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
18360  cCE("wstrd",   c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
18361  cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18362  cCE("wsubb",   e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18363  cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18364  cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18365  cCE("wsubh",   e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18366  cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18367  cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18368  cCE("wsubw",   e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18369  cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18370  cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),         rd_rn),
18371  cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),         rd_rn),
18372  cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),         rd_rn),
18373  cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),         rd_rn),
18374  cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),         rd_rn),
18375  cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),         rd_rn),
18376  cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18377  cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18378  cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18379  cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),         rd_rn),
18380  cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),         rd_rn),
18381  cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),         rd_rn),
18382  cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),         rd_rn),
18383  cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),         rd_rn),
18384  cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),         rd_rn),
18385  cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18386  cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18387  cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18388  cCE("wxor",    e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18389  cCE("wzero",   e300000, 1, (RIWR),                 iwmmxt_wzero),
18390
18391 #undef  ARM_VARIANT
18392 #define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
18393
18394  cCE("torvscb",   e12f190, 1, (RR),                 iwmmxt_tandorc),
18395  cCE("torvsch",   e52f190, 1, (RR),                 iwmmxt_tandorc),
18396  cCE("torvscw",   e92f190, 1, (RR),                 iwmmxt_tandorc),
18397  cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
18398  cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
18399  cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
18400  cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18401  cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18402  cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18403  cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18404  cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18405  cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18406  cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18407  cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18408  cCE("wavg4",   e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18409  cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18410  cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18411  cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18412  cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18413  cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18414  cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
18415  cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18416  cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18417  cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18418  cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18419  cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18420  cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18421  cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18422  cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18423  cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18424  cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18425  cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18426  cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18427  cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18428  cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18429  cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18430  cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18431  cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18432  cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18433  cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18434  cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18435  cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18436  cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18437  cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18438  cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18439  cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18440  cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18441  cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18442  cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18443  cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18444  cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18445  cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18446  cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18447  cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18448  cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18449  cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18450  cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18451
18452 #undef  ARM_VARIANT
18453 #define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
18454
18455  cCE("cfldrs",  c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
18456  cCE("cfldrd",  c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
18457  cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
18458  cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
18459  cCE("cfstrs",  c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
18460  cCE("cfstrd",  c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
18461  cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
18462  cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
18463  cCE("cfmvsr",  e000450, 2, (RMF, RR),                rn_rd),
18464  cCE("cfmvrs",  e100450, 2, (RR, RMF),                rd_rn),
18465  cCE("cfmvdlr", e000410, 2, (RMD, RR),                rn_rd),
18466  cCE("cfmvrdl", e100410, 2, (RR, RMD),                rd_rn),
18467  cCE("cfmvdhr", e000430, 2, (RMD, RR),                rn_rd),
18468  cCE("cfmvrdh", e100430, 2, (RR, RMD),                rd_rn),
18469  cCE("cfmv64lr",        e000510, 2, (RMDX, RR),               rn_rd),
18470  cCE("cfmvr64l",        e100510, 2, (RR, RMDX),               rd_rn),
18471  cCE("cfmv64hr",        e000530, 2, (RMDX, RR),               rn_rd),
18472  cCE("cfmvr64h",        e100530, 2, (RR, RMDX),               rd_rn),
18473  cCE("cfmval32",        e200440, 2, (RMAX, RMFX),             rd_rn),
18474  cCE("cfmv32al",        e100440, 2, (RMFX, RMAX),             rd_rn),
18475  cCE("cfmvam32",        e200460, 2, (RMAX, RMFX),             rd_rn),
18476  cCE("cfmv32am",        e100460, 2, (RMFX, RMAX),             rd_rn),
18477  cCE("cfmvah32",        e200480, 2, (RMAX, RMFX),             rd_rn),
18478  cCE("cfmv32ah",        e100480, 2, (RMFX, RMAX),             rd_rn),
18479  cCE("cfmva32", e2004a0, 2, (RMAX, RMFX),             rd_rn),
18480  cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX),             rd_rn),
18481  cCE("cfmva64", e2004c0, 2, (RMAX, RMDX),             rd_rn),
18482  cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX),             rd_rn),
18483  cCE("cfmvsc32",        e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
18484  cCE("cfmv32sc",        e1004e0, 2, (RMDX, RMDS),             rd),
18485  cCE("cfcpys",  e000400, 2, (RMF, RMF),               rd_rn),
18486  cCE("cfcpyd",  e000420, 2, (RMD, RMD),               rd_rn),
18487  cCE("cfcvtsd", e000460, 2, (RMD, RMF),               rd_rn),
18488  cCE("cfcvtds", e000440, 2, (RMF, RMD),               rd_rn),
18489  cCE("cfcvt32s",        e000480, 2, (RMF, RMFX),              rd_rn),
18490  cCE("cfcvt32d",        e0004a0, 2, (RMD, RMFX),              rd_rn),
18491  cCE("cfcvt64s",        e0004c0, 2, (RMF, RMDX),              rd_rn),
18492  cCE("cfcvt64d",        e0004e0, 2, (RMD, RMDX),              rd_rn),
18493  cCE("cfcvts32",        e100580, 2, (RMFX, RMF),              rd_rn),
18494  cCE("cfcvtd32",        e1005a0, 2, (RMFX, RMD),              rd_rn),
18495  cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),            rd_rn),
18496  cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),            rd_rn),
18497  cCE("cfrshl32",        e000550, 3, (RMFX, RMFX, RR),         mav_triple),
18498  cCE("cfrshl64",        e000570, 3, (RMDX, RMDX, RR),         mav_triple),
18499  cCE("cfsh32",  e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
18500  cCE("cfsh64",  e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
18501  cCE("cfcmps",  e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
18502  cCE("cfcmpd",  e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
18503  cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
18504  cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
18505  cCE("cfabss",  e300400, 2, (RMF, RMF),               rd_rn),
18506  cCE("cfabsd",  e300420, 2, (RMD, RMD),               rd_rn),
18507  cCE("cfnegs",  e300440, 2, (RMF, RMF),               rd_rn),
18508  cCE("cfnegd",  e300460, 2, (RMD, RMD),               rd_rn),
18509  cCE("cfadds",  e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
18510  cCE("cfaddd",  e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
18511  cCE("cfsubs",  e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
18512  cCE("cfsubd",  e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
18513  cCE("cfmuls",  e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
18514  cCE("cfmuld",  e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
18515  cCE("cfabs32", e300500, 2, (RMFX, RMFX),             rd_rn),
18516  cCE("cfabs64", e300520, 2, (RMDX, RMDX),             rd_rn),
18517  cCE("cfneg32", e300540, 2, (RMFX, RMFX),             rd_rn),
18518  cCE("cfneg64", e300560, 2, (RMDX, RMDX),             rd_rn),
18519  cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18520  cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18521  cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18522  cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18523  cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18524  cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18525  cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18526  cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18527  cCE("cfmadd32",        e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18528  cCE("cfmsub32",        e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18529  cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
18530  cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
18531 };
18532 #undef ARM_VARIANT
18533 #undef THUMB_VARIANT
18534 #undef TCE
18535 #undef TCM
18536 #undef TUE
18537 #undef TUF
18538 #undef TCC
18539 #undef cCE
18540 #undef cCL
18541 #undef C3E
18542 #undef CE
18543 #undef CM
18544 #undef UE
18545 #undef UF
18546 #undef UT
18547 #undef NUF
18548 #undef nUF
18549 #undef NCE
18550 #undef nCE
18551 #undef OPS0
18552 #undef OPS1
18553 #undef OPS2
18554 #undef OPS3
18555 #undef OPS4
18556 #undef OPS5
18557 #undef OPS6
18558 #undef do_0
18559 \f
18560 /* MD interface: bits in the object file.  */
18561
18562 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
18563    for use in the a.out file, and stores them in the array pointed to by buf.
18564    This knows about the endian-ness of the target machine and does
18565    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
18566    2 (short) and 4 (long)  Floating numbers are put out as a series of
18567    LITTLENUMS (shorts, here at least).  */
18568
18569 void
18570 md_number_to_chars (char * buf, valueT val, int n)
18571 {
18572   if (target_big_endian)
18573     number_to_chars_bigendian (buf, val, n);
18574   else
18575     number_to_chars_littleendian (buf, val, n);
18576 }
18577
18578 static valueT
18579 md_chars_to_number (char * buf, int n)
18580 {
18581   valueT result = 0;
18582   unsigned char * where = (unsigned char *) buf;
18583
18584   if (target_big_endian)
18585     {
18586       while (n--)
18587         {
18588           result <<= 8;
18589           result |= (*where++ & 255);
18590         }
18591     }
18592   else
18593     {
18594       while (n--)
18595         {
18596           result <<= 8;
18597           result |= (where[n] & 255);
18598         }
18599     }
18600
18601   return result;
18602 }
18603
18604 /* MD interface: Sections.  */
18605
18606 /* Estimate the size of a frag before relaxing.  Assume everything fits in
18607    2 bytes.  */
18608
18609 int
18610 md_estimate_size_before_relax (fragS * fragp,
18611                                segT    segtype ATTRIBUTE_UNUSED)
18612 {
18613   fragp->fr_var = 2;
18614   return 2;
18615 }
18616
18617 /* Convert a machine dependent frag.  */
18618
18619 void
18620 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
18621 {
18622   unsigned long insn;
18623   unsigned long old_op;
18624   char *buf;
18625   expressionS exp;
18626   fixS *fixp;
18627   int reloc_type;
18628   int pc_rel;
18629   int opcode;
18630
18631   buf = fragp->fr_literal + fragp->fr_fix;
18632
18633   old_op = bfd_get_16(abfd, buf);
18634   if (fragp->fr_symbol)
18635     {
18636       exp.X_op = O_symbol;
18637       exp.X_add_symbol = fragp->fr_symbol;
18638     }
18639   else
18640     {
18641       exp.X_op = O_constant;
18642     }
18643   exp.X_add_number = fragp->fr_offset;
18644   opcode = fragp->fr_subtype;
18645   switch (opcode)
18646     {
18647     case T_MNEM_ldr_pc:
18648     case T_MNEM_ldr_pc2:
18649     case T_MNEM_ldr_sp:
18650     case T_MNEM_str_sp:
18651     case T_MNEM_ldr:
18652     case T_MNEM_ldrb:
18653     case T_MNEM_ldrh:
18654     case T_MNEM_str:
18655     case T_MNEM_strb:
18656     case T_MNEM_strh:
18657       if (fragp->fr_var == 4)
18658         {
18659           insn = THUMB_OP32 (opcode);
18660           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
18661             {
18662               insn |= (old_op & 0x700) << 4;
18663             }
18664           else
18665             {
18666               insn |= (old_op & 7) << 12;
18667               insn |= (old_op & 0x38) << 13;
18668             }
18669           insn |= 0x00000c00;
18670           put_thumb32_insn (buf, insn);
18671           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
18672         }
18673       else
18674         {
18675           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
18676         }
18677       pc_rel = (opcode == T_MNEM_ldr_pc2);
18678       break;
18679     case T_MNEM_adr:
18680       if (fragp->fr_var == 4)
18681         {
18682           insn = THUMB_OP32 (opcode);
18683           insn |= (old_op & 0xf0) << 4;
18684           put_thumb32_insn (buf, insn);
18685           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
18686         }
18687       else
18688         {
18689           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
18690           exp.X_add_number -= 4;
18691         }
18692       pc_rel = 1;
18693       break;
18694     case T_MNEM_mov:
18695     case T_MNEM_movs:
18696     case T_MNEM_cmp:
18697     case T_MNEM_cmn:
18698       if (fragp->fr_var == 4)
18699         {
18700           int r0off = (opcode == T_MNEM_mov
18701                        || opcode == T_MNEM_movs) ? 0 : 8;
18702           insn = THUMB_OP32 (opcode);
18703           insn = (insn & 0xe1ffffff) | 0x10000000;
18704           insn |= (old_op & 0x700) << r0off;
18705           put_thumb32_insn (buf, insn);
18706           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
18707         }
18708       else
18709         {
18710           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
18711         }
18712       pc_rel = 0;
18713       break;
18714     case T_MNEM_b:
18715       if (fragp->fr_var == 4)
18716         {
18717           insn = THUMB_OP32(opcode);
18718           put_thumb32_insn (buf, insn);
18719           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
18720         }
18721       else
18722         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
18723       pc_rel = 1;
18724       break;
18725     case T_MNEM_bcond:
18726       if (fragp->fr_var == 4)
18727         {
18728           insn = THUMB_OP32(opcode);
18729           insn |= (old_op & 0xf00) << 14;
18730           put_thumb32_insn (buf, insn);
18731           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
18732         }
18733       else
18734         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
18735       pc_rel = 1;
18736       break;
18737     case T_MNEM_add_sp:
18738     case T_MNEM_add_pc:
18739     case T_MNEM_inc_sp:
18740     case T_MNEM_dec_sp:
18741       if (fragp->fr_var == 4)
18742         {
18743           /* ??? Choose between add and addw.  */
18744           insn = THUMB_OP32 (opcode);
18745           insn |= (old_op & 0xf0) << 4;
18746           put_thumb32_insn (buf, insn);
18747           if (opcode == T_MNEM_add_pc)
18748             reloc_type = BFD_RELOC_ARM_T32_IMM12;
18749           else
18750             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
18751         }
18752       else
18753         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
18754       pc_rel = 0;
18755       break;
18756
18757     case T_MNEM_addi:
18758     case T_MNEM_addis:
18759     case T_MNEM_subi:
18760     case T_MNEM_subis:
18761       if (fragp->fr_var == 4)
18762         {
18763           insn = THUMB_OP32 (opcode);
18764           insn |= (old_op & 0xf0) << 4;
18765           insn |= (old_op & 0xf) << 16;
18766           put_thumb32_insn (buf, insn);
18767           if (insn & (1 << 20))
18768             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
18769           else
18770             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
18771         }
18772       else
18773         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
18774       pc_rel = 0;
18775       break;
18776     default:
18777       abort ();
18778     }
18779   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
18780                       (enum bfd_reloc_code_real) reloc_type);
18781   fixp->fx_file = fragp->fr_file;
18782   fixp->fx_line = fragp->fr_line;
18783   fragp->fr_fix += fragp->fr_var;
18784 }
18785
18786 /* Return the size of a relaxable immediate operand instruction.
18787    SHIFT and SIZE specify the form of the allowable immediate.  */
18788 static int
18789 relax_immediate (fragS *fragp, int size, int shift)
18790 {
18791   offsetT offset;
18792   offsetT mask;
18793   offsetT low;
18794
18795   /* ??? Should be able to do better than this.  */
18796   if (fragp->fr_symbol)
18797     return 4;
18798
18799   low = (1 << shift) - 1;
18800   mask = (1 << (shift + size)) - (1 << shift);
18801   offset = fragp->fr_offset;
18802   /* Force misaligned offsets to 32-bit variant.  */
18803   if (offset & low)
18804     return 4;
18805   if (offset & ~mask)
18806     return 4;
18807   return 2;
18808 }
18809
18810 /* Get the address of a symbol during relaxation.  */
18811 static addressT
18812 relaxed_symbol_addr (fragS *fragp, long stretch)
18813 {
18814   fragS *sym_frag;
18815   addressT addr;
18816   symbolS *sym;
18817
18818   sym = fragp->fr_symbol;
18819   sym_frag = symbol_get_frag (sym);
18820   know (S_GET_SEGMENT (sym) != absolute_section
18821         || sym_frag == &zero_address_frag);
18822   addr = S_GET_VALUE (sym) + fragp->fr_offset;
18823
18824   /* If frag has yet to be reached on this pass, assume it will
18825      move by STRETCH just as we did.  If this is not so, it will
18826      be because some frag between grows, and that will force
18827      another pass.  */
18828
18829   if (stretch != 0
18830       && sym_frag->relax_marker != fragp->relax_marker)
18831     {
18832       fragS *f;
18833
18834       /* Adjust stretch for any alignment frag.  Note that if have
18835          been expanding the earlier code, the symbol may be
18836          defined in what appears to be an earlier frag.  FIXME:
18837          This doesn't handle the fr_subtype field, which specifies
18838          a maximum number of bytes to skip when doing an
18839          alignment.  */
18840       for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
18841         {
18842           if (f->fr_type == rs_align || f->fr_type == rs_align_code)
18843             {
18844               if (stretch < 0)
18845                 stretch = - ((- stretch)
18846                              & ~ ((1 << (int) f->fr_offset) - 1));
18847               else
18848                 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
18849               if (stretch == 0)
18850                 break;
18851             }
18852         }
18853       if (f != NULL)
18854         addr += stretch;
18855     }
18856
18857   return addr;
18858 }
18859
18860 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
18861    load.  */
18862 static int
18863 relax_adr (fragS *fragp, asection *sec, long stretch)
18864 {
18865   addressT addr;
18866   offsetT val;
18867
18868   /* Assume worst case for symbols not known to be in the same section.  */
18869   if (fragp->fr_symbol == NULL
18870       || !S_IS_DEFINED (fragp->fr_symbol)
18871       || sec != S_GET_SEGMENT (fragp->fr_symbol)
18872       || S_IS_WEAK (fragp->fr_symbol))
18873     return 4;
18874
18875   val = relaxed_symbol_addr (fragp, stretch);
18876   addr = fragp->fr_address + fragp->fr_fix;
18877   addr = (addr + 4) & ~3;
18878   /* Force misaligned targets to 32-bit variant.  */
18879   if (val & 3)
18880     return 4;
18881   val -= addr;
18882   if (val < 0 || val > 1020)
18883     return 4;
18884   return 2;
18885 }
18886
18887 /* Return the size of a relaxable add/sub immediate instruction.  */
18888 static int
18889 relax_addsub (fragS *fragp, asection *sec)
18890 {
18891   char *buf;
18892   int op;
18893
18894   buf = fragp->fr_literal + fragp->fr_fix;
18895   op = bfd_get_16(sec->owner, buf);
18896   if ((op & 0xf) == ((op >> 4) & 0xf))
18897     return relax_immediate (fragp, 8, 0);
18898   else
18899     return relax_immediate (fragp, 3, 0);
18900 }
18901
18902
18903 /* Return the size of a relaxable branch instruction.  BITS is the
18904    size of the offset field in the narrow instruction.  */
18905
18906 static int
18907 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
18908 {
18909   addressT addr;
18910   offsetT val;
18911   offsetT limit;
18912
18913   /* Assume worst case for symbols not known to be in the same section.  */
18914   if (!S_IS_DEFINED (fragp->fr_symbol)
18915       || sec != S_GET_SEGMENT (fragp->fr_symbol)
18916       || S_IS_WEAK (fragp->fr_symbol))
18917     return 4;
18918
18919 #ifdef OBJ_ELF
18920   if (S_IS_DEFINED (fragp->fr_symbol)
18921       && ARM_IS_FUNC (fragp->fr_symbol))
18922       return 4;
18923 #endif
18924
18925   val = relaxed_symbol_addr (fragp, stretch);
18926   addr = fragp->fr_address + fragp->fr_fix + 4;
18927   val -= addr;
18928
18929   /* Offset is a signed value *2 */
18930   limit = 1 << bits;
18931   if (val >= limit || val < -limit)
18932     return 4;
18933   return 2;
18934 }
18935
18936
18937 /* Relax a machine dependent frag.  This returns the amount by which
18938    the current size of the frag should change.  */
18939
18940 int
18941 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
18942 {
18943   int oldsize;
18944   int newsize;
18945
18946   oldsize = fragp->fr_var;
18947   switch (fragp->fr_subtype)
18948     {
18949     case T_MNEM_ldr_pc2:
18950       newsize = relax_adr (fragp, sec, stretch);
18951       break;
18952     case T_MNEM_ldr_pc:
18953     case T_MNEM_ldr_sp:
18954     case T_MNEM_str_sp:
18955       newsize = relax_immediate (fragp, 8, 2);
18956       break;
18957     case T_MNEM_ldr:
18958     case T_MNEM_str:
18959       newsize = relax_immediate (fragp, 5, 2);
18960       break;
18961     case T_MNEM_ldrh:
18962     case T_MNEM_strh:
18963       newsize = relax_immediate (fragp, 5, 1);
18964       break;
18965     case T_MNEM_ldrb:
18966     case T_MNEM_strb:
18967       newsize = relax_immediate (fragp, 5, 0);
18968       break;
18969     case T_MNEM_adr:
18970       newsize = relax_adr (fragp, sec, stretch);
18971       break;
18972     case T_MNEM_mov:
18973     case T_MNEM_movs:
18974     case T_MNEM_cmp:
18975     case T_MNEM_cmn:
18976       newsize = relax_immediate (fragp, 8, 0);
18977       break;
18978     case T_MNEM_b:
18979       newsize = relax_branch (fragp, sec, 11, stretch);
18980       break;
18981     case T_MNEM_bcond:
18982       newsize = relax_branch (fragp, sec, 8, stretch);
18983       break;
18984     case T_MNEM_add_sp:
18985     case T_MNEM_add_pc:
18986       newsize = relax_immediate (fragp, 8, 2);
18987       break;
18988     case T_MNEM_inc_sp:
18989     case T_MNEM_dec_sp:
18990       newsize = relax_immediate (fragp, 7, 2);
18991       break;
18992     case T_MNEM_addi:
18993     case T_MNEM_addis:
18994     case T_MNEM_subi:
18995     case T_MNEM_subis:
18996       newsize = relax_addsub (fragp, sec);
18997       break;
18998     default:
18999       abort ();
19000     }
19001
19002   fragp->fr_var = newsize;
19003   /* Freeze wide instructions that are at or before the same location as
19004      in the previous pass.  This avoids infinite loops.
19005      Don't freeze them unconditionally because targets may be artificially
19006      misaligned by the expansion of preceding frags.  */
19007   if (stretch <= 0 && newsize > 2)
19008     {
19009       md_convert_frag (sec->owner, sec, fragp);
19010       frag_wane (fragp);
19011     }
19012
19013   return newsize - oldsize;
19014 }
19015
19016 /* Round up a section size to the appropriate boundary.  */
19017
19018 valueT
19019 md_section_align (segT   segment ATTRIBUTE_UNUSED,
19020                   valueT size)
19021 {
19022 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
19023   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
19024     {
19025       /* For a.out, force the section size to be aligned.  If we don't do
19026          this, BFD will align it for us, but it will not write out the
19027          final bytes of the section.  This may be a bug in BFD, but it is
19028          easier to fix it here since that is how the other a.out targets
19029          work.  */
19030       int align;
19031
19032       align = bfd_get_section_alignment (stdoutput, segment);
19033       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
19034     }
19035 #endif
19036
19037   return size;
19038 }
19039
19040 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
19041    of an rs_align_code fragment.  */
19042
19043 void
19044 arm_handle_align (fragS * fragP)
19045 {
19046   static char const arm_noop[2][2][4] =
19047     {
19048       {  /* ARMv1 */
19049         {0x00, 0x00, 0xa0, 0xe1},  /* LE */
19050         {0xe1, 0xa0, 0x00, 0x00},  /* BE */
19051       },
19052       {  /* ARMv6k */
19053         {0x00, 0xf0, 0x20, 0xe3},  /* LE */
19054         {0xe3, 0x20, 0xf0, 0x00},  /* BE */
19055       },
19056     };
19057   static char const thumb_noop[2][2][2] =
19058     {
19059       {  /* Thumb-1 */
19060         {0xc0, 0x46},  /* LE */
19061         {0x46, 0xc0},  /* BE */
19062       },
19063       {  /* Thumb-2 */
19064         {0x00, 0xbf},  /* LE */
19065         {0xbf, 0x00}   /* BE */
19066       }
19067     };
19068   static char const wide_thumb_noop[2][4] =
19069     {  /* Wide Thumb-2 */
19070       {0xaf, 0xf3, 0x00, 0x80},  /* LE */
19071       {0xf3, 0xaf, 0x80, 0x00},  /* BE */
19072     };
19073
19074   unsigned bytes, fix, noop_size;
19075   char * p;
19076   const char * noop;
19077   const char *narrow_noop = NULL;
19078 #ifdef OBJ_ELF
19079   enum mstate state;
19080 #endif
19081
19082   if (fragP->fr_type != rs_align_code)
19083     return;
19084
19085   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
19086   p = fragP->fr_literal + fragP->fr_fix;
19087   fix = 0;
19088
19089   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
19090     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
19091
19092   gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
19093
19094   if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
19095     {
19096       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
19097         {
19098           narrow_noop = thumb_noop[1][target_big_endian];
19099           noop = wide_thumb_noop[target_big_endian];
19100         }
19101       else
19102         noop = thumb_noop[0][target_big_endian];
19103       noop_size = 2;
19104 #ifdef OBJ_ELF
19105       state = MAP_THUMB;
19106 #endif
19107     }
19108   else
19109     {
19110       noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
19111                      [target_big_endian];
19112       noop_size = 4;
19113 #ifdef OBJ_ELF
19114       state = MAP_ARM;
19115 #endif
19116     }
19117
19118   fragP->fr_var = noop_size;
19119
19120   if (bytes & (noop_size - 1))
19121     {
19122       fix = bytes & (noop_size - 1);
19123 #ifdef OBJ_ELF
19124       insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
19125 #endif
19126       memset (p, 0, fix);
19127       p += fix;
19128       bytes -= fix;
19129     }
19130
19131   if (narrow_noop)
19132     {
19133       if (bytes & noop_size)
19134         {
19135           /* Insert a narrow noop.  */
19136           memcpy (p, narrow_noop, noop_size);
19137           p += noop_size;
19138           bytes -= noop_size;
19139           fix += noop_size;
19140         }
19141
19142       /* Use wide noops for the remainder */
19143       noop_size = 4;
19144     }
19145
19146   while (bytes >= noop_size)
19147     {
19148       memcpy (p, noop, noop_size);
19149       p += noop_size;
19150       bytes -= noop_size;
19151       fix += noop_size;
19152     }
19153
19154   fragP->fr_fix += fix;
19155 }
19156
19157 /* Called from md_do_align.  Used to create an alignment
19158    frag in a code section.  */
19159
19160 void
19161 arm_frag_align_code (int n, int max)
19162 {
19163   char * p;
19164
19165   /* We assume that there will never be a requirement
19166      to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
19167   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
19168     {
19169       char err_msg[128];
19170
19171       sprintf (err_msg, 
19172         _("alignments greater than %d bytes not supported in .text sections."),
19173         MAX_MEM_FOR_RS_ALIGN_CODE + 1);
19174       as_fatal ("%s", err_msg);
19175     }
19176
19177   p = frag_var (rs_align_code,
19178                 MAX_MEM_FOR_RS_ALIGN_CODE,
19179                 1,
19180                 (relax_substateT) max,
19181                 (symbolS *) NULL,
19182                 (offsetT) n,
19183                 (char *) NULL);
19184   *p = 0;
19185 }
19186
19187 /* Perform target specific initialisation of a frag.
19188    Note - despite the name this initialisation is not done when the frag
19189    is created, but only when its type is assigned.  A frag can be created
19190    and used a long time before its type is set, so beware of assuming that
19191    this initialisationis performed first.  */
19192
19193 #ifndef OBJ_ELF
19194 void
19195 arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
19196 {
19197   /* Record whether this frag is in an ARM or a THUMB area.  */
19198   fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
19199 }
19200
19201 #else /* OBJ_ELF is defined.  */
19202 void
19203 arm_init_frag (fragS * fragP, int max_chars)
19204 {
19205   /* If the current ARM vs THUMB mode has not already
19206      been recorded into this frag then do so now.  */
19207   if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
19208     {
19209       fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
19210
19211       /* Record a mapping symbol for alignment frags.  We will delete this
19212          later if the alignment ends up empty.  */
19213       switch (fragP->fr_type)
19214         {
19215           case rs_align:
19216           case rs_align_test:
19217           case rs_fill:
19218             mapping_state_2 (MAP_DATA, max_chars);
19219             break;
19220           case rs_align_code:
19221             mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
19222             break;
19223           default:
19224             break;
19225         }
19226     }
19227 }
19228
19229 /* When we change sections we need to issue a new mapping symbol.  */
19230
19231 void
19232 arm_elf_change_section (void)
19233 {
19234   /* Link an unlinked unwind index table section to the .text section.  */
19235   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
19236       && elf_linked_to_section (now_seg) == NULL)
19237     elf_linked_to_section (now_seg) = text_section;
19238 }
19239
19240 int
19241 arm_elf_section_type (const char * str, size_t len)
19242 {
19243   if (len == 5 && strncmp (str, "exidx", 5) == 0)
19244     return SHT_ARM_EXIDX;
19245
19246   return -1;
19247 }
19248 \f
19249 /* Code to deal with unwinding tables.  */
19250
19251 static void add_unwind_adjustsp (offsetT);
19252
19253 /* Generate any deferred unwind frame offset.  */
19254
19255 static void
19256 flush_pending_unwind (void)
19257 {
19258   offsetT offset;
19259
19260   offset = unwind.pending_offset;
19261   unwind.pending_offset = 0;
19262   if (offset != 0)
19263     add_unwind_adjustsp (offset);
19264 }
19265
19266 /* Add an opcode to this list for this function.  Two-byte opcodes should
19267    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
19268    order.  */
19269
19270 static void
19271 add_unwind_opcode (valueT op, int length)
19272 {
19273   /* Add any deferred stack adjustment.  */
19274   if (unwind.pending_offset)
19275     flush_pending_unwind ();
19276
19277   unwind.sp_restored = 0;
19278
19279   if (unwind.opcode_count + length > unwind.opcode_alloc)
19280     {
19281       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
19282       if (unwind.opcodes)
19283         unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
19284                                                      unwind.opcode_alloc);
19285       else
19286         unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
19287     }
19288   while (length > 0)
19289     {
19290       length--;
19291       unwind.opcodes[unwind.opcode_count] = op & 0xff;
19292       op >>= 8;
19293       unwind.opcode_count++;
19294     }
19295 }
19296
19297 /* Add unwind opcodes to adjust the stack pointer.  */
19298
19299 static void
19300 add_unwind_adjustsp (offsetT offset)
19301 {
19302   valueT op;
19303
19304   if (offset > 0x200)
19305     {
19306       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
19307       char bytes[5];
19308       int n;
19309       valueT o;
19310
19311       /* Long form: 0xb2, uleb128.  */
19312       /* This might not fit in a word so add the individual bytes,
19313          remembering the list is built in reverse order.  */
19314       o = (valueT) ((offset - 0x204) >> 2);
19315       if (o == 0)
19316         add_unwind_opcode (0, 1);
19317
19318       /* Calculate the uleb128 encoding of the offset.  */
19319       n = 0;
19320       while (o)
19321         {
19322           bytes[n] = o & 0x7f;
19323           o >>= 7;
19324           if (o)
19325             bytes[n] |= 0x80;
19326           n++;
19327         }
19328       /* Add the insn.  */
19329       for (; n; n--)
19330         add_unwind_opcode (bytes[n - 1], 1);
19331       add_unwind_opcode (0xb2, 1);
19332     }
19333   else if (offset > 0x100)
19334     {
19335       /* Two short opcodes.  */
19336       add_unwind_opcode (0x3f, 1);
19337       op = (offset - 0x104) >> 2;
19338       add_unwind_opcode (op, 1);
19339     }
19340   else if (offset > 0)
19341     {
19342       /* Short opcode.  */
19343       op = (offset - 4) >> 2;
19344       add_unwind_opcode (op, 1);
19345     }
19346   else if (offset < 0)
19347     {
19348       offset = -offset;
19349       while (offset > 0x100)
19350         {
19351           add_unwind_opcode (0x7f, 1);
19352           offset -= 0x100;
19353         }
19354       op = ((offset - 4) >> 2) | 0x40;
19355       add_unwind_opcode (op, 1);
19356     }
19357 }
19358
19359 /* Finish the list of unwind opcodes for this function.  */
19360 static void
19361 finish_unwind_opcodes (void)
19362 {
19363   valueT op;
19364
19365   if (unwind.fp_used)
19366     {
19367       /* Adjust sp as necessary.  */
19368       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
19369       flush_pending_unwind ();
19370
19371       /* After restoring sp from the frame pointer.  */
19372       op = 0x90 | unwind.fp_reg;
19373       add_unwind_opcode (op, 1);
19374     }
19375   else
19376     flush_pending_unwind ();
19377 }
19378
19379
19380 /* Start an exception table entry.  If idx is nonzero this is an index table
19381    entry.  */
19382
19383 static void
19384 start_unwind_section (const segT text_seg, int idx)
19385 {
19386   const char * text_name;
19387   const char * prefix;
19388   const char * prefix_once;
19389   const char * group_name;
19390   size_t prefix_len;
19391   size_t text_len;
19392   char * sec_name;
19393   size_t sec_name_len;
19394   int type;
19395   int flags;
19396   int linkonce;
19397
19398   if (idx)
19399     {
19400       prefix = ELF_STRING_ARM_unwind;
19401       prefix_once = ELF_STRING_ARM_unwind_once;
19402       type = SHT_ARM_EXIDX;
19403     }
19404   else
19405     {
19406       prefix = ELF_STRING_ARM_unwind_info;
19407       prefix_once = ELF_STRING_ARM_unwind_info_once;
19408       type = SHT_PROGBITS;
19409     }
19410
19411   text_name = segment_name (text_seg);
19412   if (streq (text_name, ".text"))
19413     text_name = "";
19414
19415   if (strncmp (text_name, ".gnu.linkonce.t.",
19416                strlen (".gnu.linkonce.t.")) == 0)
19417     {
19418       prefix = prefix_once;
19419       text_name += strlen (".gnu.linkonce.t.");
19420     }
19421
19422   prefix_len = strlen (prefix);
19423   text_len = strlen (text_name);
19424   sec_name_len = prefix_len + text_len;
19425   sec_name = (char *) xmalloc (sec_name_len + 1);
19426   memcpy (sec_name, prefix, prefix_len);
19427   memcpy (sec_name + prefix_len, text_name, text_len);
19428   sec_name[prefix_len + text_len] = '\0';
19429
19430   flags = SHF_ALLOC;
19431   linkonce = 0;
19432   group_name = 0;
19433
19434   /* Handle COMDAT group.  */
19435   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
19436     {
19437       group_name = elf_group_name (text_seg);
19438       if (group_name == NULL)
19439         {
19440           as_bad (_("Group section `%s' has no group signature"),
19441                   segment_name (text_seg));
19442           ignore_rest_of_line ();
19443           return;
19444         }
19445       flags |= SHF_GROUP;
19446       linkonce = 1;
19447     }
19448
19449   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
19450
19451   /* Set the section link for index tables.  */
19452   if (idx)
19453     elf_linked_to_section (now_seg) = text_seg;
19454 }
19455
19456
19457 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
19458    personality routine data.  Returns zero, or the index table value for
19459    and inline entry.  */
19460
19461 static valueT
19462 create_unwind_entry (int have_data)
19463 {
19464   int size;
19465   addressT where;
19466   char *ptr;
19467   /* The current word of data.  */
19468   valueT data;
19469   /* The number of bytes left in this word.  */
19470   int n;
19471
19472   finish_unwind_opcodes ();
19473
19474   /* Remember the current text section.  */
19475   unwind.saved_seg = now_seg;
19476   unwind.saved_subseg = now_subseg;
19477
19478   start_unwind_section (now_seg, 0);
19479
19480   if (unwind.personality_routine == NULL)
19481     {
19482       if (unwind.personality_index == -2)
19483         {
19484           if (have_data)
19485             as_bad (_("handlerdata in cantunwind frame"));
19486           return 1; /* EXIDX_CANTUNWIND.  */
19487         }
19488
19489       /* Use a default personality routine if none is specified.  */
19490       if (unwind.personality_index == -1)
19491         {
19492           if (unwind.opcode_count > 3)
19493             unwind.personality_index = 1;
19494           else
19495             unwind.personality_index = 0;
19496         }
19497
19498       /* Space for the personality routine entry.  */
19499       if (unwind.personality_index == 0)
19500         {
19501           if (unwind.opcode_count > 3)
19502             as_bad (_("too many unwind opcodes for personality routine 0"));
19503
19504           if (!have_data)
19505             {
19506               /* All the data is inline in the index table.  */
19507               data = 0x80;
19508               n = 3;
19509               while (unwind.opcode_count > 0)
19510                 {
19511                   unwind.opcode_count--;
19512                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
19513                   n--;
19514                 }
19515
19516               /* Pad with "finish" opcodes.  */
19517               while (n--)
19518                 data = (data << 8) | 0xb0;
19519
19520               return data;
19521             }
19522           size = 0;
19523         }
19524       else
19525         /* We get two opcodes "free" in the first word.  */
19526         size = unwind.opcode_count - 2;
19527     }
19528   else
19529     /* An extra byte is required for the opcode count.  */
19530     size = unwind.opcode_count + 1;
19531
19532   size = (size + 3) >> 2;
19533   if (size > 0xff)
19534     as_bad (_("too many unwind opcodes"));
19535
19536   frag_align (2, 0, 0);
19537   record_alignment (now_seg, 2);
19538   unwind.table_entry = expr_build_dot ();
19539
19540   /* Allocate the table entry.  */
19541   ptr = frag_more ((size << 2) + 4);
19542   where = frag_now_fix () - ((size << 2) + 4);
19543
19544   switch (unwind.personality_index)
19545     {
19546     case -1:
19547       /* ??? Should this be a PLT generating relocation?  */
19548       /* Custom personality routine.  */
19549       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
19550                BFD_RELOC_ARM_PREL31);
19551
19552       where += 4;
19553       ptr += 4;
19554
19555       /* Set the first byte to the number of additional words.  */
19556       data = size - 1;
19557       n = 3;
19558       break;
19559
19560     /* ABI defined personality routines.  */
19561     case 0:
19562       /* Three opcodes bytes are packed into the first word.  */
19563       data = 0x80;
19564       n = 3;
19565       break;
19566
19567     case 1:
19568     case 2:
19569       /* The size and first two opcode bytes go in the first word.  */
19570       data = ((0x80 + unwind.personality_index) << 8) | size;
19571       n = 2;
19572       break;
19573
19574     default:
19575       /* Should never happen.  */
19576       abort ();
19577     }
19578
19579   /* Pack the opcodes into words (MSB first), reversing the list at the same
19580      time.  */
19581   while (unwind.opcode_count > 0)
19582     {
19583       if (n == 0)
19584         {
19585           md_number_to_chars (ptr, data, 4);
19586           ptr += 4;
19587           n = 4;
19588           data = 0;
19589         }
19590       unwind.opcode_count--;
19591       n--;
19592       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
19593     }
19594
19595   /* Finish off the last word.  */
19596   if (n < 4)
19597     {
19598       /* Pad with "finish" opcodes.  */
19599       while (n--)
19600         data = (data << 8) | 0xb0;
19601
19602       md_number_to_chars (ptr, data, 4);
19603     }
19604
19605   if (!have_data)
19606     {
19607       /* Add an empty descriptor if there is no user-specified data.   */
19608       ptr = frag_more (4);
19609       md_number_to_chars (ptr, 0, 4);
19610     }
19611
19612   return 0;
19613 }
19614
19615
19616 /* Initialize the DWARF-2 unwind information for this procedure.  */
19617
19618 void
19619 tc_arm_frame_initial_instructions (void)
19620 {
19621   cfi_add_CFA_def_cfa (REG_SP, 0);
19622 }
19623 #endif /* OBJ_ELF */
19624
19625 /* Convert REGNAME to a DWARF-2 register number.  */
19626
19627 int
19628 tc_arm_regname_to_dw2regnum (char *regname)
19629 {
19630   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
19631
19632   if (reg == FAIL)
19633     return -1;
19634
19635   return reg;
19636 }
19637
19638 #ifdef TE_PE
19639 void
19640 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
19641 {
19642   expressionS exp;
19643
19644   exp.X_op = O_secrel;
19645   exp.X_add_symbol = symbol;
19646   exp.X_add_number = 0;
19647   emit_expr (&exp, size);
19648 }
19649 #endif
19650
19651 /* MD interface: Symbol and relocation handling.  */
19652
19653 /* Return the address within the segment that a PC-relative fixup is
19654    relative to.  For ARM, PC-relative fixups applied to instructions
19655    are generally relative to the location of the fixup plus 8 bytes.
19656    Thumb branches are offset by 4, and Thumb loads relative to PC
19657    require special handling.  */
19658
19659 long
19660 md_pcrel_from_section (fixS * fixP, segT seg)
19661 {
19662   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
19663
19664   /* If this is pc-relative and we are going to emit a relocation
19665      then we just want to put out any pipeline compensation that the linker
19666      will need.  Otherwise we want to use the calculated base.
19667      For WinCE we skip the bias for externals as well, since this
19668      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
19669   if (fixP->fx_pcrel
19670       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
19671           || (arm_force_relocation (fixP)
19672 #ifdef TE_WINCE
19673               && !S_IS_EXTERNAL (fixP->fx_addsy)
19674 #endif
19675               )))
19676     base = 0;
19677
19678
19679   switch (fixP->fx_r_type)
19680     {
19681       /* PC relative addressing on the Thumb is slightly odd as the
19682          bottom two bits of the PC are forced to zero for the
19683          calculation.  This happens *after* application of the
19684          pipeline offset.  However, Thumb adrl already adjusts for
19685          this, so we need not do it again.  */
19686     case BFD_RELOC_ARM_THUMB_ADD:
19687       return base & ~3;
19688
19689     case BFD_RELOC_ARM_THUMB_OFFSET:
19690     case BFD_RELOC_ARM_T32_OFFSET_IMM:
19691     case BFD_RELOC_ARM_T32_ADD_PC12:
19692     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
19693       return (base + 4) & ~3;
19694
19695       /* Thumb branches are simply offset by +4.  */
19696     case BFD_RELOC_THUMB_PCREL_BRANCH7:
19697     case BFD_RELOC_THUMB_PCREL_BRANCH9:
19698     case BFD_RELOC_THUMB_PCREL_BRANCH12:
19699     case BFD_RELOC_THUMB_PCREL_BRANCH20:
19700     case BFD_RELOC_THUMB_PCREL_BRANCH25:
19701       return base + 4;
19702
19703     case BFD_RELOC_THUMB_PCREL_BRANCH23:
19704       if (fixP->fx_addsy
19705           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19706           && (!S_IS_EXTERNAL (fixP->fx_addsy))
19707           && ARM_IS_FUNC (fixP->fx_addsy)
19708           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19709         base = fixP->fx_where + fixP->fx_frag->fr_address;
19710        return base + 4;
19711
19712       /* BLX is like branches above, but forces the low two bits of PC to
19713          zero.  */
19714     case BFD_RELOC_THUMB_PCREL_BLX:
19715       if (fixP->fx_addsy
19716           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19717           && (!S_IS_EXTERNAL (fixP->fx_addsy))
19718           && THUMB_IS_FUNC (fixP->fx_addsy)
19719           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19720         base = fixP->fx_where + fixP->fx_frag->fr_address;
19721       return (base + 4) & ~3;
19722
19723       /* ARM mode branches are offset by +8.  However, the Windows CE
19724          loader expects the relocation not to take this into account.  */
19725     case BFD_RELOC_ARM_PCREL_BLX:
19726       if (fixP->fx_addsy
19727           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19728           && (!S_IS_EXTERNAL (fixP->fx_addsy))
19729           && ARM_IS_FUNC (fixP->fx_addsy)
19730           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19731         base = fixP->fx_where + fixP->fx_frag->fr_address;
19732       return base + 8;
19733
19734     case BFD_RELOC_ARM_PCREL_CALL:
19735       if (fixP->fx_addsy
19736           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19737           && (!S_IS_EXTERNAL (fixP->fx_addsy))
19738           && THUMB_IS_FUNC (fixP->fx_addsy)
19739           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19740         base = fixP->fx_where + fixP->fx_frag->fr_address;
19741       return base + 8;
19742
19743     case BFD_RELOC_ARM_PCREL_BRANCH:
19744     case BFD_RELOC_ARM_PCREL_JUMP:
19745     case BFD_RELOC_ARM_PLT32:
19746 #ifdef TE_WINCE
19747       /* When handling fixups immediately, because we have already
19748          discovered the value of a symbol, or the address of the frag involved
19749          we must account for the offset by +8, as the OS loader will never see the reloc.
19750          see fixup_segment() in write.c
19751          The S_IS_EXTERNAL test handles the case of global symbols.
19752          Those need the calculated base, not just the pipe compensation the linker will need.  */
19753       if (fixP->fx_pcrel
19754           && fixP->fx_addsy != NULL
19755           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19756           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
19757         return base + 8;
19758       return base;
19759 #else
19760       return base + 8;
19761 #endif
19762
19763
19764       /* ARM mode loads relative to PC are also offset by +8.  Unlike
19765          branches, the Windows CE loader *does* expect the relocation
19766          to take this into account.  */
19767     case BFD_RELOC_ARM_OFFSET_IMM:
19768     case BFD_RELOC_ARM_OFFSET_IMM8:
19769     case BFD_RELOC_ARM_HWLITERAL:
19770     case BFD_RELOC_ARM_LITERAL:
19771     case BFD_RELOC_ARM_CP_OFF_IMM:
19772       return base + 8;
19773
19774
19775       /* Other PC-relative relocations are un-offset.  */
19776     default:
19777       return base;
19778     }
19779 }
19780
19781 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
19782    Otherwise we have no need to default values of symbols.  */
19783
19784 symbolS *
19785 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
19786 {
19787 #ifdef OBJ_ELF
19788   if (name[0] == '_' && name[1] == 'G'
19789       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
19790     {
19791       if (!GOT_symbol)
19792         {
19793           if (symbol_find (name))
19794             as_bad (_("GOT already in the symbol table"));
19795
19796           GOT_symbol = symbol_new (name, undefined_section,
19797                                    (valueT) 0, & zero_address_frag);
19798         }
19799
19800       return GOT_symbol;
19801     }
19802 #endif
19803
19804   return NULL;
19805 }
19806
19807 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
19808    computed as two separate immediate values, added together.  We
19809    already know that this value cannot be computed by just one ARM
19810    instruction.  */
19811
19812 static unsigned int
19813 validate_immediate_twopart (unsigned int   val,
19814                             unsigned int * highpart)
19815 {
19816   unsigned int a;
19817   unsigned int i;
19818
19819   for (i = 0; i < 32; i += 2)
19820     if (((a = rotate_left (val, i)) & 0xff) != 0)
19821       {
19822         if (a & 0xff00)
19823           {
19824             if (a & ~ 0xffff)
19825               continue;
19826             * highpart = (a  >> 8) | ((i + 24) << 7);
19827           }
19828         else if (a & 0xff0000)
19829           {
19830             if (a & 0xff000000)
19831               continue;
19832             * highpart = (a >> 16) | ((i + 16) << 7);
19833           }
19834         else
19835           {
19836             gas_assert (a & 0xff000000);
19837             * highpart = (a >> 24) | ((i + 8) << 7);
19838           }
19839
19840         return (a & 0xff) | (i << 7);
19841       }
19842
19843   return FAIL;
19844 }
19845
19846 static int
19847 validate_offset_imm (unsigned int val, int hwse)
19848 {
19849   if ((hwse && val > 255) || val > 4095)
19850     return FAIL;
19851   return val;
19852 }
19853
19854 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
19855    negative immediate constant by altering the instruction.  A bit of
19856    a hack really.
19857         MOV <-> MVN
19858         AND <-> BIC
19859         ADC <-> SBC
19860         by inverting the second operand, and
19861         ADD <-> SUB
19862         CMP <-> CMN
19863         by negating the second operand.  */
19864
19865 static int
19866 negate_data_op (unsigned long * instruction,
19867                 unsigned long   value)
19868 {
19869   int op, new_inst;
19870   unsigned long negated, inverted;
19871
19872   negated = encode_arm_immediate (-value);
19873   inverted = encode_arm_immediate (~value);
19874
19875   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
19876   switch (op)
19877     {
19878       /* First negates.  */
19879     case OPCODE_SUB:             /* ADD <-> SUB  */
19880       new_inst = OPCODE_ADD;
19881       value = negated;
19882       break;
19883
19884     case OPCODE_ADD:
19885       new_inst = OPCODE_SUB;
19886       value = negated;
19887       break;
19888
19889     case OPCODE_CMP:             /* CMP <-> CMN  */
19890       new_inst = OPCODE_CMN;
19891       value = negated;
19892       break;
19893
19894     case OPCODE_CMN:
19895       new_inst = OPCODE_CMP;
19896       value = negated;
19897       break;
19898
19899       /* Now Inverted ops.  */
19900     case OPCODE_MOV:             /* MOV <-> MVN  */
19901       new_inst = OPCODE_MVN;
19902       value = inverted;
19903       break;
19904
19905     case OPCODE_MVN:
19906       new_inst = OPCODE_MOV;
19907       value = inverted;
19908       break;
19909
19910     case OPCODE_AND:             /* AND <-> BIC  */
19911       new_inst = OPCODE_BIC;
19912       value = inverted;
19913       break;
19914
19915     case OPCODE_BIC:
19916       new_inst = OPCODE_AND;
19917       value = inverted;
19918       break;
19919
19920     case OPCODE_ADC:              /* ADC <-> SBC  */
19921       new_inst = OPCODE_SBC;
19922       value = inverted;
19923       break;
19924
19925     case OPCODE_SBC:
19926       new_inst = OPCODE_ADC;
19927       value = inverted;
19928       break;
19929
19930       /* We cannot do anything.  */
19931     default:
19932       return FAIL;
19933     }
19934
19935   if (value == (unsigned) FAIL)
19936     return FAIL;
19937
19938   *instruction &= OPCODE_MASK;
19939   *instruction |= new_inst << DATA_OP_SHIFT;
19940   return value;
19941 }
19942
19943 /* Like negate_data_op, but for Thumb-2.   */
19944
19945 static unsigned int
19946 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
19947 {
19948   int op, new_inst;
19949   int rd;
19950   unsigned int negated, inverted;
19951
19952   negated = encode_thumb32_immediate (-value);
19953   inverted = encode_thumb32_immediate (~value);
19954
19955   rd = (*instruction >> 8) & 0xf;
19956   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
19957   switch (op)
19958     {
19959       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
19960     case T2_OPCODE_SUB:
19961       new_inst = T2_OPCODE_ADD;
19962       value = negated;
19963       break;
19964
19965     case T2_OPCODE_ADD:
19966       new_inst = T2_OPCODE_SUB;
19967       value = negated;
19968       break;
19969
19970       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
19971     case T2_OPCODE_ORR:
19972       new_inst = T2_OPCODE_ORN;
19973       value = inverted;
19974       break;
19975
19976     case T2_OPCODE_ORN:
19977       new_inst = T2_OPCODE_ORR;
19978       value = inverted;
19979       break;
19980
19981       /* AND <-> BIC.  TST has no inverted equivalent.  */
19982     case T2_OPCODE_AND:
19983       new_inst = T2_OPCODE_BIC;
19984       if (rd == 15)
19985         value = FAIL;
19986       else
19987         value = inverted;
19988       break;
19989
19990     case T2_OPCODE_BIC:
19991       new_inst = T2_OPCODE_AND;
19992       value = inverted;
19993       break;
19994
19995       /* ADC <-> SBC  */
19996     case T2_OPCODE_ADC:
19997       new_inst = T2_OPCODE_SBC;
19998       value = inverted;
19999       break;
20000
20001     case T2_OPCODE_SBC:
20002       new_inst = T2_OPCODE_ADC;
20003       value = inverted;
20004       break;
20005
20006       /* We cannot do anything.  */
20007     default:
20008       return FAIL;
20009     }
20010
20011   if (value == (unsigned int)FAIL)
20012     return FAIL;
20013
20014   *instruction &= T2_OPCODE_MASK;
20015   *instruction |= new_inst << T2_DATA_OP_SHIFT;
20016   return value;
20017 }
20018
20019 /* Read a 32-bit thumb instruction from buf.  */
20020 static unsigned long
20021 get_thumb32_insn (char * buf)
20022 {
20023   unsigned long insn;
20024   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
20025   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20026
20027   return insn;
20028 }
20029
20030
20031 /* We usually want to set the low bit on the address of thumb function
20032    symbols.  In particular .word foo - . should have the low bit set.
20033    Generic code tries to fold the difference of two symbols to
20034    a constant.  Prevent this and force a relocation when the first symbols
20035    is a thumb function.  */
20036
20037 bfd_boolean
20038 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
20039 {
20040   if (op == O_subtract
20041       && l->X_op == O_symbol
20042       && r->X_op == O_symbol
20043       && THUMB_IS_FUNC (l->X_add_symbol))
20044     {
20045       l->X_op = O_subtract;
20046       l->X_op_symbol = r->X_add_symbol;
20047       l->X_add_number -= r->X_add_number;
20048       return TRUE;
20049     }
20050
20051   /* Process as normal.  */
20052   return FALSE;
20053 }
20054
20055 /* Encode Thumb2 unconditional branches and calls. The encoding
20056    for the 2 are identical for the immediate values.  */
20057
20058 static void
20059 encode_thumb2_b_bl_offset (char * buf, offsetT value)
20060 {
20061 #define T2I1I2MASK  ((1 << 13) | (1 << 11))
20062   offsetT newval;
20063   offsetT newval2;
20064   addressT S, I1, I2, lo, hi;
20065
20066   S = (value >> 24) & 0x01;
20067   I1 = (value >> 23) & 0x01;
20068   I2 = (value >> 22) & 0x01;
20069   hi = (value >> 12) & 0x3ff;
20070   lo = (value >> 1) & 0x7ff; 
20071   newval   = md_chars_to_number (buf, THUMB_SIZE);
20072   newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20073   newval  |= (S << 10) | hi;
20074   newval2 &=  ~T2I1I2MASK;
20075   newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
20076   md_number_to_chars (buf, newval, THUMB_SIZE);
20077   md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
20078 }
20079
20080 void
20081 md_apply_fix (fixS *    fixP,
20082                valueT * valP,
20083                segT     seg)
20084 {
20085   offsetT        value = * valP;
20086   offsetT        newval;
20087   unsigned int   newimm;
20088   unsigned long  temp;
20089   int            sign;
20090   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
20091
20092   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
20093
20094   /* Note whether this will delete the relocation.  */
20095
20096   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
20097     fixP->fx_done = 1;
20098
20099   /* On a 64-bit host, silently truncate 'value' to 32 bits for
20100      consistency with the behaviour on 32-bit hosts.  Remember value
20101      for emit_reloc.  */
20102   value &= 0xffffffff;
20103   value ^= 0x80000000;
20104   value -= 0x80000000;
20105
20106   *valP = value;
20107   fixP->fx_addnumber = value;
20108
20109   /* Same treatment for fixP->fx_offset.  */
20110   fixP->fx_offset &= 0xffffffff;
20111   fixP->fx_offset ^= 0x80000000;
20112   fixP->fx_offset -= 0x80000000;
20113
20114   switch (fixP->fx_r_type)
20115     {
20116     case BFD_RELOC_NONE:
20117       /* This will need to go in the object file.  */
20118       fixP->fx_done = 0;
20119       break;
20120
20121     case BFD_RELOC_ARM_IMMEDIATE:
20122       /* We claim that this fixup has been processed here,
20123          even if in fact we generate an error because we do
20124          not have a reloc for it, so tc_gen_reloc will reject it.  */
20125       fixP->fx_done = 1;
20126
20127       if (fixP->fx_addsy)
20128         {
20129           const char *msg = 0;
20130
20131           if (! S_IS_DEFINED (fixP->fx_addsy))
20132             msg = _("undefined symbol %s used as an immediate value");
20133           else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20134             msg = _("symbol %s is in a different section");
20135           else if (S_IS_WEAK (fixP->fx_addsy))
20136             msg = _("symbol %s is weak and may be overridden later");
20137
20138           if (msg)
20139             {
20140               as_bad_where (fixP->fx_file, fixP->fx_line,
20141                             msg, S_GET_NAME (fixP->fx_addsy));
20142               break;
20143             }
20144         }
20145
20146       newimm = encode_arm_immediate (value);
20147       temp = md_chars_to_number (buf, INSN_SIZE);
20148
20149       /* If the instruction will fail, see if we can fix things up by
20150          changing the opcode.  */
20151       if (newimm == (unsigned int) FAIL
20152           && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
20153         {
20154           as_bad_where (fixP->fx_file, fixP->fx_line,
20155                         _("invalid constant (%lx) after fixup"),
20156                         (unsigned long) value);
20157           break;
20158         }
20159
20160       newimm |= (temp & 0xfffff000);
20161       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
20162       break;
20163
20164     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
20165       {
20166         unsigned int highpart = 0;
20167         unsigned int newinsn  = 0xe1a00000; /* nop.  */
20168
20169         if (fixP->fx_addsy)
20170           {
20171             const char *msg = 0;
20172
20173             if (! S_IS_DEFINED (fixP->fx_addsy))
20174               msg = _("undefined symbol %s used as an immediate value");
20175             else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20176               msg = _("symbol %s is in a different section");
20177             else if (S_IS_WEAK (fixP->fx_addsy))
20178               msg = _("symbol %s is weak and may be overridden later");
20179
20180             if (msg)
20181               {
20182                 as_bad_where (fixP->fx_file, fixP->fx_line,
20183                               msg, S_GET_NAME (fixP->fx_addsy));
20184                 break;
20185               }
20186           }
20187         
20188         newimm = encode_arm_immediate (value);
20189         temp = md_chars_to_number (buf, INSN_SIZE);
20190
20191         /* If the instruction will fail, see if we can fix things up by
20192            changing the opcode.  */
20193         if (newimm == (unsigned int) FAIL
20194             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
20195           {
20196             /* No ?  OK - try using two ADD instructions to generate
20197                the value.  */
20198             newimm = validate_immediate_twopart (value, & highpart);
20199
20200             /* Yes - then make sure that the second instruction is
20201                also an add.  */
20202             if (newimm != (unsigned int) FAIL)
20203               newinsn = temp;
20204             /* Still No ?  Try using a negated value.  */
20205             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
20206               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
20207             /* Otherwise - give up.  */
20208             else
20209               {
20210                 as_bad_where (fixP->fx_file, fixP->fx_line,
20211                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
20212                               (long) value);
20213                 break;
20214               }
20215
20216             /* Replace the first operand in the 2nd instruction (which
20217                is the PC) with the destination register.  We have
20218                already added in the PC in the first instruction and we
20219                do not want to do it again.  */
20220             newinsn &= ~ 0xf0000;
20221             newinsn |= ((newinsn & 0x0f000) << 4);
20222           }
20223
20224         newimm |= (temp & 0xfffff000);
20225         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
20226
20227         highpart |= (newinsn & 0xfffff000);
20228         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
20229       }
20230       break;
20231
20232     case BFD_RELOC_ARM_OFFSET_IMM:
20233       if (!fixP->fx_done && seg->use_rela_p)
20234         value = 0;
20235
20236     case BFD_RELOC_ARM_LITERAL:
20237       sign = value >= 0;
20238
20239       if (value < 0)
20240         value = - value;
20241
20242       if (validate_offset_imm (value, 0) == FAIL)
20243         {
20244           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
20245             as_bad_where (fixP->fx_file, fixP->fx_line,
20246                           _("invalid literal constant: pool needs to be closer"));
20247           else
20248             as_bad_where (fixP->fx_file, fixP->fx_line,
20249                           _("bad immediate value for offset (%ld)"),
20250                           (long) value);
20251           break;
20252         }
20253
20254       newval = md_chars_to_number (buf, INSN_SIZE);
20255       newval &= 0xff7ff000;
20256       newval |= value | (sign ? INDEX_UP : 0);
20257       md_number_to_chars (buf, newval, INSN_SIZE);
20258       break;
20259
20260     case BFD_RELOC_ARM_OFFSET_IMM8:
20261     case BFD_RELOC_ARM_HWLITERAL:
20262       sign = value >= 0;
20263
20264       if (value < 0)
20265         value = - value;
20266
20267       if (validate_offset_imm (value, 1) == FAIL)
20268         {
20269           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
20270             as_bad_where (fixP->fx_file, fixP->fx_line,
20271                           _("invalid literal constant: pool needs to be closer"));
20272           else
20273             as_bad (_("bad immediate value for 8-bit offset (%ld)"),
20274                     (long) value);
20275           break;
20276         }
20277
20278       newval = md_chars_to_number (buf, INSN_SIZE);
20279       newval &= 0xff7ff0f0;
20280       newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
20281       md_number_to_chars (buf, newval, INSN_SIZE);
20282       break;
20283
20284     case BFD_RELOC_ARM_T32_OFFSET_U8:
20285       if (value < 0 || value > 1020 || value % 4 != 0)
20286         as_bad_where (fixP->fx_file, fixP->fx_line,
20287                       _("bad immediate value for offset (%ld)"), (long) value);
20288       value /= 4;
20289
20290       newval = md_chars_to_number (buf+2, THUMB_SIZE);
20291       newval |= value;
20292       md_number_to_chars (buf+2, newval, THUMB_SIZE);
20293       break;
20294
20295     case BFD_RELOC_ARM_T32_OFFSET_IMM:
20296       /* This is a complicated relocation used for all varieties of Thumb32
20297          load/store instruction with immediate offset:
20298
20299          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
20300                                                    *4, optional writeback(W)
20301                                                    (doubleword load/store)
20302
20303          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
20304          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
20305          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
20306          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
20307          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
20308
20309          Uppercase letters indicate bits that are already encoded at
20310          this point.  Lowercase letters are our problem.  For the
20311          second block of instructions, the secondary opcode nybble
20312          (bits 8..11) is present, and bit 23 is zero, even if this is
20313          a PC-relative operation.  */
20314       newval = md_chars_to_number (buf, THUMB_SIZE);
20315       newval <<= 16;
20316       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
20317
20318       if ((newval & 0xf0000000) == 0xe0000000)
20319         {
20320           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
20321           if (value >= 0)
20322             newval |= (1 << 23);
20323           else
20324             value = -value;
20325           if (value % 4 != 0)
20326             {
20327               as_bad_where (fixP->fx_file, fixP->fx_line,
20328                             _("offset not a multiple of 4"));
20329               break;
20330             }
20331           value /= 4;
20332           if (value > 0xff)
20333             {
20334               as_bad_where (fixP->fx_file, fixP->fx_line,
20335                             _("offset out of range"));
20336               break;
20337             }
20338           newval &= ~0xff;
20339         }
20340       else if ((newval & 0x000f0000) == 0x000f0000)
20341         {
20342           /* PC-relative, 12-bit offset.  */
20343           if (value >= 0)
20344             newval |= (1 << 23);
20345           else
20346             value = -value;
20347           if (value > 0xfff)
20348             {
20349               as_bad_where (fixP->fx_file, fixP->fx_line,
20350                             _("offset out of range"));
20351               break;
20352             }
20353           newval &= ~0xfff;
20354         }
20355       else if ((newval & 0x00000100) == 0x00000100)
20356         {
20357           /* Writeback: 8-bit, +/- offset.  */
20358           if (value >= 0)
20359             newval |= (1 << 9);
20360           else
20361             value = -value;
20362           if (value > 0xff)
20363             {
20364               as_bad_where (fixP->fx_file, fixP->fx_line,
20365                             _("offset out of range"));
20366               break;
20367             }
20368           newval &= ~0xff;
20369         }
20370       else if ((newval & 0x00000f00) == 0x00000e00)
20371         {
20372           /* T-instruction: positive 8-bit offset.  */
20373           if (value < 0 || value > 0xff)
20374             {
20375               as_bad_where (fixP->fx_file, fixP->fx_line,
20376                             _("offset out of range"));
20377               break;
20378             }
20379           newval &= ~0xff;
20380           newval |= value;
20381         }
20382       else
20383         {
20384           /* Positive 12-bit or negative 8-bit offset.  */
20385           int limit;
20386           if (value >= 0)
20387             {
20388               newval |= (1 << 23);
20389               limit = 0xfff;
20390             }
20391           else
20392             {
20393               value = -value;
20394               limit = 0xff;
20395             }
20396           if (value > limit)
20397             {
20398               as_bad_where (fixP->fx_file, fixP->fx_line,
20399                             _("offset out of range"));
20400               break;
20401             }
20402           newval &= ~limit;
20403         }
20404
20405       newval |= value;
20406       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
20407       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
20408       break;
20409
20410     case BFD_RELOC_ARM_SHIFT_IMM:
20411       newval = md_chars_to_number (buf, INSN_SIZE);
20412       if (((unsigned long) value) > 32
20413           || (value == 32
20414               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
20415         {
20416           as_bad_where (fixP->fx_file, fixP->fx_line,
20417                         _("shift expression is too large"));
20418           break;
20419         }
20420
20421       if (value == 0)
20422         /* Shifts of zero must be done as lsl.  */
20423         newval &= ~0x60;
20424       else if (value == 32)
20425         value = 0;
20426       newval &= 0xfffff07f;
20427       newval |= (value & 0x1f) << 7;
20428       md_number_to_chars (buf, newval, INSN_SIZE);
20429       break;
20430
20431     case BFD_RELOC_ARM_T32_IMMEDIATE:
20432     case BFD_RELOC_ARM_T32_ADD_IMM:
20433     case BFD_RELOC_ARM_T32_IMM12:
20434     case BFD_RELOC_ARM_T32_ADD_PC12:
20435       /* We claim that this fixup has been processed here,
20436          even if in fact we generate an error because we do
20437          not have a reloc for it, so tc_gen_reloc will reject it.  */
20438       fixP->fx_done = 1;
20439
20440       if (fixP->fx_addsy
20441           && ! S_IS_DEFINED (fixP->fx_addsy))
20442         {
20443           as_bad_where (fixP->fx_file, fixP->fx_line,
20444                         _("undefined symbol %s used as an immediate value"),
20445                         S_GET_NAME (fixP->fx_addsy));
20446           break;
20447         }
20448
20449       newval = md_chars_to_number (buf, THUMB_SIZE);
20450       newval <<= 16;
20451       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
20452
20453       newimm = FAIL;
20454       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
20455           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
20456         {
20457           newimm = encode_thumb32_immediate (value);
20458           if (newimm == (unsigned int) FAIL)
20459             newimm = thumb32_negate_data_op (&newval, value);
20460         }
20461       if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
20462           && newimm == (unsigned int) FAIL)
20463         {
20464           /* Turn add/sum into addw/subw.  */
20465           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
20466             newval = (newval & 0xfeffffff) | 0x02000000;
20467           /* No flat 12-bit imm encoding for addsw/subsw.  */
20468           if ((newval & 0x00100000) == 0)
20469             {
20470               /* 12 bit immediate for addw/subw.  */
20471               if (value < 0)
20472                 {
20473                   value = -value;
20474                   newval ^= 0x00a00000;
20475                 }
20476               if (value > 0xfff)
20477                 newimm = (unsigned int) FAIL;
20478               else
20479                 newimm = value;
20480             }
20481         }
20482
20483       if (newimm == (unsigned int)FAIL)
20484         {
20485           as_bad_where (fixP->fx_file, fixP->fx_line,
20486                         _("invalid constant (%lx) after fixup"),
20487                         (unsigned long) value);
20488           break;
20489         }
20490
20491       newval |= (newimm & 0x800) << 15;
20492       newval |= (newimm & 0x700) << 4;
20493       newval |= (newimm & 0x0ff);
20494
20495       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
20496       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
20497       break;
20498
20499     case BFD_RELOC_ARM_SMC:
20500       if (((unsigned long) value) > 0xffff)
20501         as_bad_where (fixP->fx_file, fixP->fx_line,
20502                       _("invalid smc expression"));
20503       newval = md_chars_to_number (buf, INSN_SIZE);
20504       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
20505       md_number_to_chars (buf, newval, INSN_SIZE);
20506       break;
20507
20508     case BFD_RELOC_ARM_HVC:
20509       if (((unsigned long) value) > 0xffff)
20510         as_bad_where (fixP->fx_file, fixP->fx_line,
20511                       _("invalid hvc expression"));
20512       newval = md_chars_to_number (buf, INSN_SIZE);
20513       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
20514       md_number_to_chars (buf, newval, INSN_SIZE);
20515       break;
20516
20517     case BFD_RELOC_ARM_SWI:
20518       if (fixP->tc_fix_data != 0)
20519         {
20520           if (((unsigned long) value) > 0xff)
20521             as_bad_where (fixP->fx_file, fixP->fx_line,
20522                           _("invalid swi expression"));
20523           newval = md_chars_to_number (buf, THUMB_SIZE);
20524           newval |= value;
20525           md_number_to_chars (buf, newval, THUMB_SIZE);
20526         }
20527       else
20528         {
20529           if (((unsigned long) value) > 0x00ffffff)
20530             as_bad_where (fixP->fx_file, fixP->fx_line,
20531                           _("invalid swi expression"));
20532           newval = md_chars_to_number (buf, INSN_SIZE);
20533           newval |= value;
20534           md_number_to_chars (buf, newval, INSN_SIZE);
20535         }
20536       break;
20537
20538     case BFD_RELOC_ARM_MULTI:
20539       if (((unsigned long) value) > 0xffff)
20540         as_bad_where (fixP->fx_file, fixP->fx_line,
20541                       _("invalid expression in load/store multiple"));
20542       newval = value | md_chars_to_number (buf, INSN_SIZE);
20543       md_number_to_chars (buf, newval, INSN_SIZE);
20544       break;
20545
20546 #ifdef OBJ_ELF
20547     case BFD_RELOC_ARM_PCREL_CALL:
20548
20549       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20550           && fixP->fx_addsy
20551           && !S_IS_EXTERNAL (fixP->fx_addsy)
20552           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20553           && THUMB_IS_FUNC (fixP->fx_addsy))
20554         /* Flip the bl to blx. This is a simple flip
20555            bit here because we generate PCREL_CALL for
20556            unconditional bls.  */
20557         {
20558           newval = md_chars_to_number (buf, INSN_SIZE);
20559           newval = newval | 0x10000000;
20560           md_number_to_chars (buf, newval, INSN_SIZE);
20561           temp = 1;
20562           fixP->fx_done = 1;
20563         }
20564       else
20565         temp = 3;
20566       goto arm_branch_common;
20567
20568     case BFD_RELOC_ARM_PCREL_JUMP:
20569       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20570           && fixP->fx_addsy
20571           && !S_IS_EXTERNAL (fixP->fx_addsy)
20572           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20573           && THUMB_IS_FUNC (fixP->fx_addsy))
20574         {
20575           /* This would map to a bl<cond>, b<cond>,
20576              b<always> to a Thumb function. We
20577              need to force a relocation for this particular
20578              case.  */
20579           newval = md_chars_to_number (buf, INSN_SIZE);
20580           fixP->fx_done = 0;
20581         }
20582
20583     case BFD_RELOC_ARM_PLT32:
20584 #endif
20585     case BFD_RELOC_ARM_PCREL_BRANCH:
20586       temp = 3;
20587       goto arm_branch_common;
20588
20589     case BFD_RELOC_ARM_PCREL_BLX:
20590
20591       temp = 1;
20592       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20593           && fixP->fx_addsy
20594           && !S_IS_EXTERNAL (fixP->fx_addsy)
20595           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20596           && ARM_IS_FUNC (fixP->fx_addsy))
20597         {
20598           /* Flip the blx to a bl and warn.  */
20599           const char *name = S_GET_NAME (fixP->fx_addsy);
20600           newval = 0xeb000000;
20601           as_warn_where (fixP->fx_file, fixP->fx_line,
20602                          _("blx to '%s' an ARM ISA state function changed to bl"),
20603                           name);
20604           md_number_to_chars (buf, newval, INSN_SIZE);
20605           temp = 3;
20606           fixP->fx_done = 1;
20607         }
20608
20609 #ifdef OBJ_ELF
20610        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
20611          fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
20612 #endif
20613
20614     arm_branch_common:
20615       /* We are going to store value (shifted right by two) in the
20616          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
20617          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
20618          also be be clear.  */
20619       if (value & temp)
20620         as_bad_where (fixP->fx_file, fixP->fx_line,
20621                       _("misaligned branch destination"));
20622       if ((value & (offsetT)0xfe000000) != (offsetT)0
20623           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
20624         as_bad_where (fixP->fx_file, fixP->fx_line,
20625                       _("branch out of range"));
20626
20627       if (fixP->fx_done || !seg->use_rela_p)
20628         {
20629           newval = md_chars_to_number (buf, INSN_SIZE);
20630           newval |= (value >> 2) & 0x00ffffff;
20631           /* Set the H bit on BLX instructions.  */
20632           if (temp == 1)
20633             {
20634               if (value & 2)
20635                 newval |= 0x01000000;
20636               else
20637                 newval &= ~0x01000000;
20638             }
20639           md_number_to_chars (buf, newval, INSN_SIZE);
20640         }
20641       break;
20642
20643     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
20644       /* CBZ can only branch forward.  */
20645
20646       /* Attempts to use CBZ to branch to the next instruction
20647          (which, strictly speaking, are prohibited) will be turned into
20648          no-ops.
20649
20650          FIXME: It may be better to remove the instruction completely and
20651          perform relaxation.  */
20652       if (value == -2)
20653         {
20654           newval = md_chars_to_number (buf, THUMB_SIZE);
20655           newval = 0xbf00; /* NOP encoding T1 */
20656           md_number_to_chars (buf, newval, THUMB_SIZE);
20657         }
20658       else
20659         {
20660           if (value & ~0x7e)
20661             as_bad_where (fixP->fx_file, fixP->fx_line,
20662                           _("branch out of range"));
20663
20664           if (fixP->fx_done || !seg->use_rela_p)
20665             {
20666               newval = md_chars_to_number (buf, THUMB_SIZE);
20667               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
20668               md_number_to_chars (buf, newval, THUMB_SIZE);
20669             }
20670         }
20671       break;
20672
20673     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
20674       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
20675         as_bad_where (fixP->fx_file, fixP->fx_line,
20676                       _("branch out of range"));
20677
20678       if (fixP->fx_done || !seg->use_rela_p)
20679         {
20680           newval = md_chars_to_number (buf, THUMB_SIZE);
20681           newval |= (value & 0x1ff) >> 1;
20682           md_number_to_chars (buf, newval, THUMB_SIZE);
20683         }
20684       break;
20685
20686     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
20687       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
20688         as_bad_where (fixP->fx_file, fixP->fx_line,
20689                       _("branch out of range"));
20690
20691       if (fixP->fx_done || !seg->use_rela_p)
20692         {
20693           newval = md_chars_to_number (buf, THUMB_SIZE);
20694           newval |= (value & 0xfff) >> 1;
20695           md_number_to_chars (buf, newval, THUMB_SIZE);
20696         }
20697       break;
20698
20699     case BFD_RELOC_THUMB_PCREL_BRANCH20:
20700       if (fixP->fx_addsy
20701           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20702           && !S_IS_EXTERNAL (fixP->fx_addsy)
20703           && S_IS_DEFINED (fixP->fx_addsy)
20704           && ARM_IS_FUNC (fixP->fx_addsy)
20705           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20706         {
20707           /* Force a relocation for a branch 20 bits wide.  */
20708           fixP->fx_done = 0;
20709         }
20710       if ((value & ~0x1fffff) && ((value & ~0x1fffff) != ~0x1fffff))
20711         as_bad_where (fixP->fx_file, fixP->fx_line,
20712                       _("conditional branch out of range"));
20713
20714       if (fixP->fx_done || !seg->use_rela_p)
20715         {
20716           offsetT newval2;
20717           addressT S, J1, J2, lo, hi;
20718
20719           S  = (value & 0x00100000) >> 20;
20720           J2 = (value & 0x00080000) >> 19;
20721           J1 = (value & 0x00040000) >> 18;
20722           hi = (value & 0x0003f000) >> 12;
20723           lo = (value & 0x00000ffe) >> 1;
20724
20725           newval   = md_chars_to_number (buf, THUMB_SIZE);
20726           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20727           newval  |= (S << 10) | hi;
20728           newval2 |= (J1 << 13) | (J2 << 11) | lo;
20729           md_number_to_chars (buf, newval, THUMB_SIZE);
20730           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
20731         }
20732       break;
20733
20734     case BFD_RELOC_THUMB_PCREL_BLX:
20735
20736       /* If there is a blx from a thumb state function to
20737          another thumb function flip this to a bl and warn
20738          about it.  */
20739
20740       if (fixP->fx_addsy
20741           && S_IS_DEFINED (fixP->fx_addsy)
20742           && !S_IS_EXTERNAL (fixP->fx_addsy)
20743           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20744           && THUMB_IS_FUNC (fixP->fx_addsy))
20745         {
20746           const char *name = S_GET_NAME (fixP->fx_addsy);
20747           as_warn_where (fixP->fx_file, fixP->fx_line,
20748                          _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
20749                          name);
20750           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20751           newval = newval | 0x1000;
20752           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
20753           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
20754           fixP->fx_done = 1;
20755         }
20756
20757
20758       goto thumb_bl_common;
20759
20760     case BFD_RELOC_THUMB_PCREL_BRANCH23:
20761
20762       /* A bl from Thumb state ISA to an internal ARM state function
20763          is converted to a blx.  */
20764       if (fixP->fx_addsy
20765           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20766           && !S_IS_EXTERNAL (fixP->fx_addsy)
20767           && S_IS_DEFINED (fixP->fx_addsy)
20768           && ARM_IS_FUNC (fixP->fx_addsy)
20769           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20770         {
20771           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20772           newval = newval & ~0x1000;
20773           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
20774           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
20775           fixP->fx_done = 1;
20776         }
20777
20778     thumb_bl_common:
20779
20780 #ifdef OBJ_ELF
20781        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4 &&
20782            fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
20783          fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
20784 #endif
20785
20786       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
20787         /* For a BLX instruction, make sure that the relocation is rounded up
20788            to a word boundary.  This follows the semantics of the instruction
20789            which specifies that bit 1 of the target address will come from bit
20790            1 of the base address.  */
20791         value = (value + 1) & ~ 1;
20792
20793
20794        if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
20795         {
20796           if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
20797             {
20798               as_bad_where (fixP->fx_file, fixP->fx_line,
20799                             _("branch out of range"));
20800             }
20801           else if ((value & ~0x1ffffff)
20802                    && ((value & ~0x1ffffff) != ~0x1ffffff))
20803               {
20804                 as_bad_where (fixP->fx_file, fixP->fx_line,
20805                             _("Thumb2 branch out of range"));
20806               }
20807         }
20808
20809       if (fixP->fx_done || !seg->use_rela_p)
20810         encode_thumb2_b_bl_offset (buf, value);
20811
20812       break;
20813
20814     case BFD_RELOC_THUMB_PCREL_BRANCH25:
20815       if ((value & ~0x1ffffff) && ((value & ~0x1ffffff) != ~0x1ffffff))
20816         as_bad_where (fixP->fx_file, fixP->fx_line,
20817                       _("branch out of range"));
20818
20819       if (fixP->fx_done || !seg->use_rela_p)
20820           encode_thumb2_b_bl_offset (buf, value);
20821
20822       break;
20823
20824     case BFD_RELOC_8:
20825       if (fixP->fx_done || !seg->use_rela_p)
20826         md_number_to_chars (buf, value, 1);
20827       break;
20828
20829     case BFD_RELOC_16:
20830       if (fixP->fx_done || !seg->use_rela_p)
20831         md_number_to_chars (buf, value, 2);
20832       break;
20833
20834 #ifdef OBJ_ELF
20835     case BFD_RELOC_ARM_TLS_GD32:
20836     case BFD_RELOC_ARM_TLS_LE32:
20837     case BFD_RELOC_ARM_TLS_IE32:
20838     case BFD_RELOC_ARM_TLS_LDM32:
20839     case BFD_RELOC_ARM_TLS_LDO32:
20840       S_SET_THREAD_LOCAL (fixP->fx_addsy);
20841       /* fall through */
20842
20843     case BFD_RELOC_ARM_GOT32:
20844     case BFD_RELOC_ARM_GOTOFF:
20845       if (fixP->fx_done || !seg->use_rela_p)
20846         md_number_to_chars (buf, 0, 4);
20847       break;
20848
20849     case BFD_RELOC_ARM_GOT_PREL:
20850       if (fixP->fx_done || !seg->use_rela_p)
20851         md_number_to_chars (buf, value, 4);
20852       break;
20853
20854     case BFD_RELOC_ARM_TARGET2:
20855       /* TARGET2 is not partial-inplace, so we need to write the
20856          addend here for REL targets, because it won't be written out
20857          during reloc processing later.  */
20858       if (fixP->fx_done || !seg->use_rela_p)
20859         md_number_to_chars (buf, fixP->fx_offset, 4);
20860       break;
20861 #endif
20862
20863     case BFD_RELOC_RVA:
20864     case BFD_RELOC_32:
20865     case BFD_RELOC_ARM_TARGET1:
20866     case BFD_RELOC_ARM_ROSEGREL32:
20867     case BFD_RELOC_ARM_SBREL32:
20868     case BFD_RELOC_32_PCREL:
20869 #ifdef TE_PE
20870     case BFD_RELOC_32_SECREL:
20871 #endif
20872       if (fixP->fx_done || !seg->use_rela_p)
20873 #ifdef TE_WINCE
20874         /* For WinCE we only do this for pcrel fixups.  */
20875         if (fixP->fx_done || fixP->fx_pcrel)
20876 #endif
20877           md_number_to_chars (buf, value, 4);
20878       break;
20879
20880 #ifdef OBJ_ELF
20881     case BFD_RELOC_ARM_PREL31:
20882       if (fixP->fx_done || !seg->use_rela_p)
20883         {
20884           newval = md_chars_to_number (buf, 4) & 0x80000000;
20885           if ((value ^ (value >> 1)) & 0x40000000)
20886             {
20887               as_bad_where (fixP->fx_file, fixP->fx_line,
20888                             _("rel31 relocation overflow"));
20889             }
20890           newval |= value & 0x7fffffff;
20891           md_number_to_chars (buf, newval, 4);
20892         }
20893       break;
20894 #endif
20895
20896     case BFD_RELOC_ARM_CP_OFF_IMM:
20897     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
20898       if (value < -1023 || value > 1023 || (value & 3))
20899         as_bad_where (fixP->fx_file, fixP->fx_line,
20900                       _("co-processor offset out of range"));
20901     cp_off_common:
20902       sign = value >= 0;
20903       if (value < 0)
20904         value = -value;
20905       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
20906           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
20907         newval = md_chars_to_number (buf, INSN_SIZE);
20908       else
20909         newval = get_thumb32_insn (buf);
20910       newval &= 0xff7fff00;
20911       newval |= (value >> 2) | (sign ? INDEX_UP : 0);
20912       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
20913           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
20914         md_number_to_chars (buf, newval, INSN_SIZE);
20915       else
20916         put_thumb32_insn (buf, newval);
20917       break;
20918
20919     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
20920     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
20921       if (value < -255 || value > 255)
20922         as_bad_where (fixP->fx_file, fixP->fx_line,
20923                       _("co-processor offset out of range"));
20924       value *= 4;
20925       goto cp_off_common;
20926
20927     case BFD_RELOC_ARM_THUMB_OFFSET:
20928       newval = md_chars_to_number (buf, THUMB_SIZE);
20929       /* Exactly what ranges, and where the offset is inserted depends
20930          on the type of instruction, we can establish this from the
20931          top 4 bits.  */
20932       switch (newval >> 12)
20933         {
20934         case 4: /* PC load.  */
20935           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
20936              forced to zero for these loads; md_pcrel_from has already
20937              compensated for this.  */
20938           if (value & 3)
20939             as_bad_where (fixP->fx_file, fixP->fx_line,
20940                           _("invalid offset, target not word aligned (0x%08lX)"),
20941                           (((unsigned long) fixP->fx_frag->fr_address
20942                             + (unsigned long) fixP->fx_where) & ~3)
20943                           + (unsigned long) value);
20944
20945           if (value & ~0x3fc)
20946             as_bad_where (fixP->fx_file, fixP->fx_line,
20947                           _("invalid offset, value too big (0x%08lX)"),
20948                           (long) value);
20949
20950           newval |= value >> 2;
20951           break;
20952
20953         case 9: /* SP load/store.  */
20954           if (value & ~0x3fc)
20955             as_bad_where (fixP->fx_file, fixP->fx_line,
20956                           _("invalid offset, value too big (0x%08lX)"),
20957                           (long) value);
20958           newval |= value >> 2;
20959           break;
20960
20961         case 6: /* Word load/store.  */
20962           if (value & ~0x7c)
20963             as_bad_where (fixP->fx_file, fixP->fx_line,
20964                           _("invalid offset, value too big (0x%08lX)"),
20965                           (long) value);
20966           newval |= value << 4; /* 6 - 2.  */
20967           break;
20968
20969         case 7: /* Byte load/store.  */
20970           if (value & ~0x1f)
20971             as_bad_where (fixP->fx_file, fixP->fx_line,
20972                           _("invalid offset, value too big (0x%08lX)"),
20973                           (long) value);
20974           newval |= value << 6;
20975           break;
20976
20977         case 8: /* Halfword load/store.  */
20978           if (value & ~0x3e)
20979             as_bad_where (fixP->fx_file, fixP->fx_line,
20980                           _("invalid offset, value too big (0x%08lX)"),
20981                           (long) value);
20982           newval |= value << 5; /* 6 - 1.  */
20983           break;
20984
20985         default:
20986           as_bad_where (fixP->fx_file, fixP->fx_line,
20987                         "Unable to process relocation for thumb opcode: %lx",
20988                         (unsigned long) newval);
20989           break;
20990         }
20991       md_number_to_chars (buf, newval, THUMB_SIZE);
20992       break;
20993
20994     case BFD_RELOC_ARM_THUMB_ADD:
20995       /* This is a complicated relocation, since we use it for all of
20996          the following immediate relocations:
20997
20998             3bit ADD/SUB
20999             8bit ADD/SUB
21000             9bit ADD/SUB SP word-aligned
21001            10bit ADD PC/SP word-aligned
21002
21003          The type of instruction being processed is encoded in the
21004          instruction field:
21005
21006            0x8000  SUB
21007            0x00F0  Rd
21008            0x000F  Rs
21009       */
21010       newval = md_chars_to_number (buf, THUMB_SIZE);
21011       {
21012         int rd = (newval >> 4) & 0xf;
21013         int rs = newval & 0xf;
21014         int subtract = !!(newval & 0x8000);
21015
21016         /* Check for HI regs, only very restricted cases allowed:
21017            Adjusting SP, and using PC or SP to get an address.  */
21018         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
21019             || (rs > 7 && rs != REG_SP && rs != REG_PC))
21020           as_bad_where (fixP->fx_file, fixP->fx_line,
21021                         _("invalid Hi register with immediate"));
21022
21023         /* If value is negative, choose the opposite instruction.  */
21024         if (value < 0)
21025           {
21026             value = -value;
21027             subtract = !subtract;
21028             if (value < 0)
21029               as_bad_where (fixP->fx_file, fixP->fx_line,
21030                             _("immediate value out of range"));
21031           }
21032
21033         if (rd == REG_SP)
21034           {
21035             if (value & ~0x1fc)
21036               as_bad_where (fixP->fx_file, fixP->fx_line,
21037                             _("invalid immediate for stack address calculation"));
21038             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
21039             newval |= value >> 2;
21040           }
21041         else if (rs == REG_PC || rs == REG_SP)
21042           {
21043             if (subtract || value & ~0x3fc)
21044               as_bad_where (fixP->fx_file, fixP->fx_line,
21045                             _("invalid immediate for address calculation (value = 0x%08lX)"),
21046                             (unsigned long) value);
21047             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
21048             newval |= rd << 8;
21049             newval |= value >> 2;
21050           }
21051         else if (rs == rd)
21052           {
21053             if (value & ~0xff)
21054               as_bad_where (fixP->fx_file, fixP->fx_line,
21055                             _("immediate value out of range"));
21056             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
21057             newval |= (rd << 8) | value;
21058           }
21059         else
21060           {
21061             if (value & ~0x7)
21062               as_bad_where (fixP->fx_file, fixP->fx_line,
21063                             _("immediate value out of range"));
21064             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
21065             newval |= rd | (rs << 3) | (value << 6);
21066           }
21067       }
21068       md_number_to_chars (buf, newval, THUMB_SIZE);
21069       break;
21070
21071     case BFD_RELOC_ARM_THUMB_IMM:
21072       newval = md_chars_to_number (buf, THUMB_SIZE);
21073       if (value < 0 || value > 255)
21074         as_bad_where (fixP->fx_file, fixP->fx_line,
21075                       _("invalid immediate: %ld is out of range"),
21076                       (long) value);
21077       newval |= value;
21078       md_number_to_chars (buf, newval, THUMB_SIZE);
21079       break;
21080
21081     case BFD_RELOC_ARM_THUMB_SHIFT:
21082       /* 5bit shift value (0..32).  LSL cannot take 32.  */
21083       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
21084       temp = newval & 0xf800;
21085       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
21086         as_bad_where (fixP->fx_file, fixP->fx_line,
21087                       _("invalid shift value: %ld"), (long) value);
21088       /* Shifts of zero must be encoded as LSL.  */
21089       if (value == 0)
21090         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
21091       /* Shifts of 32 are encoded as zero.  */
21092       else if (value == 32)
21093         value = 0;
21094       newval |= value << 6;
21095       md_number_to_chars (buf, newval, THUMB_SIZE);
21096       break;
21097
21098     case BFD_RELOC_VTABLE_INHERIT:
21099     case BFD_RELOC_VTABLE_ENTRY:
21100       fixP->fx_done = 0;
21101       return;
21102
21103     case BFD_RELOC_ARM_MOVW:
21104     case BFD_RELOC_ARM_MOVT:
21105     case BFD_RELOC_ARM_THUMB_MOVW:
21106     case BFD_RELOC_ARM_THUMB_MOVT:
21107       if (fixP->fx_done || !seg->use_rela_p)
21108         {
21109           /* REL format relocations are limited to a 16-bit addend.  */
21110           if (!fixP->fx_done)
21111             {
21112               if (value < -0x8000 || value > 0x7fff)
21113                   as_bad_where (fixP->fx_file, fixP->fx_line,
21114                                 _("offset out of range"));
21115             }
21116           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
21117                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21118             {
21119               value >>= 16;
21120             }
21121
21122           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
21123               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21124             {
21125               newval = get_thumb32_insn (buf);
21126               newval &= 0xfbf08f00;
21127               newval |= (value & 0xf000) << 4;
21128               newval |= (value & 0x0800) << 15;
21129               newval |= (value & 0x0700) << 4;
21130               newval |= (value & 0x00ff);
21131               put_thumb32_insn (buf, newval);
21132             }
21133           else
21134             {
21135               newval = md_chars_to_number (buf, 4);
21136               newval &= 0xfff0f000;
21137               newval |= value & 0x0fff;
21138               newval |= (value & 0xf000) << 4;
21139               md_number_to_chars (buf, newval, 4);
21140             }
21141         }
21142       return;
21143
21144    case BFD_RELOC_ARM_ALU_PC_G0_NC:
21145    case BFD_RELOC_ARM_ALU_PC_G0:
21146    case BFD_RELOC_ARM_ALU_PC_G1_NC:
21147    case BFD_RELOC_ARM_ALU_PC_G1:
21148    case BFD_RELOC_ARM_ALU_PC_G2:
21149    case BFD_RELOC_ARM_ALU_SB_G0_NC:
21150    case BFD_RELOC_ARM_ALU_SB_G0:
21151    case BFD_RELOC_ARM_ALU_SB_G1_NC:
21152    case BFD_RELOC_ARM_ALU_SB_G1:
21153    case BFD_RELOC_ARM_ALU_SB_G2:
21154      gas_assert (!fixP->fx_done);
21155      if (!seg->use_rela_p)
21156        {
21157          bfd_vma insn;
21158          bfd_vma encoded_addend;
21159          bfd_vma addend_abs = abs (value);
21160
21161          /* Check that the absolute value of the addend can be
21162             expressed as an 8-bit constant plus a rotation.  */
21163          encoded_addend = encode_arm_immediate (addend_abs);
21164          if (encoded_addend == (unsigned int) FAIL)
21165            as_bad_where (fixP->fx_file, fixP->fx_line,
21166                          _("the offset 0x%08lX is not representable"),
21167                          (unsigned long) addend_abs);
21168
21169          /* Extract the instruction.  */
21170          insn = md_chars_to_number (buf, INSN_SIZE);
21171
21172          /* If the addend is positive, use an ADD instruction.
21173             Otherwise use a SUB.  Take care not to destroy the S bit.  */
21174          insn &= 0xff1fffff;
21175          if (value < 0)
21176            insn |= 1 << 22;
21177          else
21178            insn |= 1 << 23;
21179
21180          /* Place the encoded addend into the first 12 bits of the
21181             instruction.  */
21182          insn &= 0xfffff000;
21183          insn |= encoded_addend;
21184
21185          /* Update the instruction.  */
21186          md_number_to_chars (buf, insn, INSN_SIZE);
21187        }
21188      break;
21189
21190     case BFD_RELOC_ARM_LDR_PC_G0:
21191     case BFD_RELOC_ARM_LDR_PC_G1:
21192     case BFD_RELOC_ARM_LDR_PC_G2:
21193     case BFD_RELOC_ARM_LDR_SB_G0:
21194     case BFD_RELOC_ARM_LDR_SB_G1:
21195     case BFD_RELOC_ARM_LDR_SB_G2:
21196       gas_assert (!fixP->fx_done);
21197       if (!seg->use_rela_p)
21198         {
21199           bfd_vma insn;
21200           bfd_vma addend_abs = abs (value);
21201
21202           /* Check that the absolute value of the addend can be
21203              encoded in 12 bits.  */
21204           if (addend_abs >= 0x1000)
21205             as_bad_where (fixP->fx_file, fixP->fx_line,
21206                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
21207                           (unsigned long) addend_abs);
21208
21209           /* Extract the instruction.  */
21210           insn = md_chars_to_number (buf, INSN_SIZE);
21211
21212           /* If the addend is negative, clear bit 23 of the instruction.
21213              Otherwise set it.  */
21214           if (value < 0)
21215             insn &= ~(1 << 23);
21216           else
21217             insn |= 1 << 23;
21218
21219           /* Place the absolute value of the addend into the first 12 bits
21220              of the instruction.  */
21221           insn &= 0xfffff000;
21222           insn |= addend_abs;
21223
21224           /* Update the instruction.  */
21225           md_number_to_chars (buf, insn, INSN_SIZE);
21226         }
21227       break;
21228
21229     case BFD_RELOC_ARM_LDRS_PC_G0:
21230     case BFD_RELOC_ARM_LDRS_PC_G1:
21231     case BFD_RELOC_ARM_LDRS_PC_G2:
21232     case BFD_RELOC_ARM_LDRS_SB_G0:
21233     case BFD_RELOC_ARM_LDRS_SB_G1:
21234     case BFD_RELOC_ARM_LDRS_SB_G2:
21235       gas_assert (!fixP->fx_done);
21236       if (!seg->use_rela_p)
21237         {
21238           bfd_vma insn;
21239           bfd_vma addend_abs = abs (value);
21240
21241           /* Check that the absolute value of the addend can be
21242              encoded in 8 bits.  */
21243           if (addend_abs >= 0x100)
21244             as_bad_where (fixP->fx_file, fixP->fx_line,
21245                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
21246                           (unsigned long) addend_abs);
21247
21248           /* Extract the instruction.  */
21249           insn = md_chars_to_number (buf, INSN_SIZE);
21250
21251           /* If the addend is negative, clear bit 23 of the instruction.
21252              Otherwise set it.  */
21253           if (value < 0)
21254             insn &= ~(1 << 23);
21255           else
21256             insn |= 1 << 23;
21257
21258           /* Place the first four bits of the absolute value of the addend
21259              into the first 4 bits of the instruction, and the remaining
21260              four into bits 8 .. 11.  */
21261           insn &= 0xfffff0f0;
21262           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
21263
21264           /* Update the instruction.  */
21265           md_number_to_chars (buf, insn, INSN_SIZE);
21266         }
21267       break;
21268
21269     case BFD_RELOC_ARM_LDC_PC_G0:
21270     case BFD_RELOC_ARM_LDC_PC_G1:
21271     case BFD_RELOC_ARM_LDC_PC_G2:
21272     case BFD_RELOC_ARM_LDC_SB_G0:
21273     case BFD_RELOC_ARM_LDC_SB_G1:
21274     case BFD_RELOC_ARM_LDC_SB_G2:
21275       gas_assert (!fixP->fx_done);
21276       if (!seg->use_rela_p)
21277         {
21278           bfd_vma insn;
21279           bfd_vma addend_abs = abs (value);
21280
21281           /* Check that the absolute value of the addend is a multiple of
21282              four and, when divided by four, fits in 8 bits.  */
21283           if (addend_abs & 0x3)
21284             as_bad_where (fixP->fx_file, fixP->fx_line,
21285                           _("bad offset 0x%08lX (must be word-aligned)"),
21286                           (unsigned long) addend_abs);
21287
21288           if ((addend_abs >> 2) > 0xff)
21289             as_bad_where (fixP->fx_file, fixP->fx_line,
21290                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
21291                           (unsigned long) addend_abs);
21292
21293           /* Extract the instruction.  */
21294           insn = md_chars_to_number (buf, INSN_SIZE);
21295
21296           /* If the addend is negative, clear bit 23 of the instruction.
21297              Otherwise set it.  */
21298           if (value < 0)
21299             insn &= ~(1 << 23);
21300           else
21301             insn |= 1 << 23;
21302
21303           /* Place the addend (divided by four) into the first eight
21304              bits of the instruction.  */
21305           insn &= 0xfffffff0;
21306           insn |= addend_abs >> 2;
21307
21308           /* Update the instruction.  */
21309           md_number_to_chars (buf, insn, INSN_SIZE);
21310         }
21311       break;
21312
21313     case BFD_RELOC_ARM_V4BX:
21314       /* This will need to go in the object file.  */
21315       fixP->fx_done = 0;
21316       break;
21317
21318     case BFD_RELOC_UNUSED:
21319     default:
21320       as_bad_where (fixP->fx_file, fixP->fx_line,
21321                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
21322     }
21323 }
21324
21325 /* Translate internal representation of relocation info to BFD target
21326    format.  */
21327
21328 arelent *
21329 tc_gen_reloc (asection *section, fixS *fixp)
21330 {
21331   arelent * reloc;
21332   bfd_reloc_code_real_type code;
21333
21334   reloc = (arelent *) xmalloc (sizeof (arelent));
21335
21336   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
21337   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
21338   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
21339
21340   if (fixp->fx_pcrel)
21341     {
21342       if (section->use_rela_p)
21343         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
21344       else
21345         fixp->fx_offset = reloc->address;
21346     }
21347   reloc->addend = fixp->fx_offset;
21348
21349   switch (fixp->fx_r_type)
21350     {
21351     case BFD_RELOC_8:
21352       if (fixp->fx_pcrel)
21353         {
21354           code = BFD_RELOC_8_PCREL;
21355           break;
21356         }
21357
21358     case BFD_RELOC_16:
21359       if (fixp->fx_pcrel)
21360         {
21361           code = BFD_RELOC_16_PCREL;
21362           break;
21363         }
21364
21365     case BFD_RELOC_32:
21366       if (fixp->fx_pcrel)
21367         {
21368           code = BFD_RELOC_32_PCREL;
21369           break;
21370         }
21371
21372     case BFD_RELOC_ARM_MOVW:
21373       if (fixp->fx_pcrel)
21374         {
21375           code = BFD_RELOC_ARM_MOVW_PCREL;
21376           break;
21377         }
21378
21379     case BFD_RELOC_ARM_MOVT:
21380       if (fixp->fx_pcrel)
21381         {
21382           code = BFD_RELOC_ARM_MOVT_PCREL;
21383           break;
21384         }
21385
21386     case BFD_RELOC_ARM_THUMB_MOVW:
21387       if (fixp->fx_pcrel)
21388         {
21389           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
21390           break;
21391         }
21392
21393     case BFD_RELOC_ARM_THUMB_MOVT:
21394       if (fixp->fx_pcrel)
21395         {
21396           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
21397           break;
21398         }
21399
21400     case BFD_RELOC_NONE:
21401     case BFD_RELOC_ARM_PCREL_BRANCH:
21402     case BFD_RELOC_ARM_PCREL_BLX:
21403     case BFD_RELOC_RVA:
21404     case BFD_RELOC_THUMB_PCREL_BRANCH7:
21405     case BFD_RELOC_THUMB_PCREL_BRANCH9:
21406     case BFD_RELOC_THUMB_PCREL_BRANCH12:
21407     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21408     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21409     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21410     case BFD_RELOC_VTABLE_ENTRY:
21411     case BFD_RELOC_VTABLE_INHERIT:
21412 #ifdef TE_PE
21413     case BFD_RELOC_32_SECREL:
21414 #endif
21415       code = fixp->fx_r_type;
21416       break;
21417
21418     case BFD_RELOC_THUMB_PCREL_BLX:
21419 #ifdef OBJ_ELF
21420       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
21421         code = BFD_RELOC_THUMB_PCREL_BRANCH23;
21422       else
21423 #endif
21424         code = BFD_RELOC_THUMB_PCREL_BLX;
21425       break;
21426
21427     case BFD_RELOC_ARM_LITERAL:
21428     case BFD_RELOC_ARM_HWLITERAL:
21429       /* If this is called then the a literal has
21430          been referenced across a section boundary.  */
21431       as_bad_where (fixp->fx_file, fixp->fx_line,
21432                     _("literal referenced across section boundary"));
21433       return NULL;
21434
21435 #ifdef OBJ_ELF
21436     case BFD_RELOC_ARM_GOT32:
21437     case BFD_RELOC_ARM_GOTOFF:
21438     case BFD_RELOC_ARM_GOT_PREL:
21439     case BFD_RELOC_ARM_PLT32:
21440     case BFD_RELOC_ARM_TARGET1:
21441     case BFD_RELOC_ARM_ROSEGREL32:
21442     case BFD_RELOC_ARM_SBREL32:
21443     case BFD_RELOC_ARM_PREL31:
21444     case BFD_RELOC_ARM_TARGET2:
21445     case BFD_RELOC_ARM_TLS_LE32:
21446     case BFD_RELOC_ARM_TLS_LDO32:
21447     case BFD_RELOC_ARM_PCREL_CALL:
21448     case BFD_RELOC_ARM_PCREL_JUMP:
21449     case BFD_RELOC_ARM_ALU_PC_G0_NC:
21450     case BFD_RELOC_ARM_ALU_PC_G0:
21451     case BFD_RELOC_ARM_ALU_PC_G1_NC:
21452     case BFD_RELOC_ARM_ALU_PC_G1:
21453     case BFD_RELOC_ARM_ALU_PC_G2:
21454     case BFD_RELOC_ARM_LDR_PC_G0:
21455     case BFD_RELOC_ARM_LDR_PC_G1:
21456     case BFD_RELOC_ARM_LDR_PC_G2:
21457     case BFD_RELOC_ARM_LDRS_PC_G0:
21458     case BFD_RELOC_ARM_LDRS_PC_G1:
21459     case BFD_RELOC_ARM_LDRS_PC_G2:
21460     case BFD_RELOC_ARM_LDC_PC_G0:
21461     case BFD_RELOC_ARM_LDC_PC_G1:
21462     case BFD_RELOC_ARM_LDC_PC_G2:
21463     case BFD_RELOC_ARM_ALU_SB_G0_NC:
21464     case BFD_RELOC_ARM_ALU_SB_G0:
21465     case BFD_RELOC_ARM_ALU_SB_G1_NC:
21466     case BFD_RELOC_ARM_ALU_SB_G1:
21467     case BFD_RELOC_ARM_ALU_SB_G2:
21468     case BFD_RELOC_ARM_LDR_SB_G0:
21469     case BFD_RELOC_ARM_LDR_SB_G1:
21470     case BFD_RELOC_ARM_LDR_SB_G2:
21471     case BFD_RELOC_ARM_LDRS_SB_G0:
21472     case BFD_RELOC_ARM_LDRS_SB_G1:
21473     case BFD_RELOC_ARM_LDRS_SB_G2:
21474     case BFD_RELOC_ARM_LDC_SB_G0:
21475     case BFD_RELOC_ARM_LDC_SB_G1:
21476     case BFD_RELOC_ARM_LDC_SB_G2:
21477     case BFD_RELOC_ARM_V4BX:
21478       code = fixp->fx_r_type;
21479       break;
21480
21481     case BFD_RELOC_ARM_TLS_GD32:
21482     case BFD_RELOC_ARM_TLS_IE32:
21483     case BFD_RELOC_ARM_TLS_LDM32:
21484       /* BFD will include the symbol's address in the addend.
21485          But we don't want that, so subtract it out again here.  */
21486       if (!S_IS_COMMON (fixp->fx_addsy))
21487         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
21488       code = fixp->fx_r_type;
21489       break;
21490 #endif
21491
21492     case BFD_RELOC_ARM_IMMEDIATE:
21493       as_bad_where (fixp->fx_file, fixp->fx_line,
21494                     _("internal relocation (type: IMMEDIATE) not fixed up"));
21495       return NULL;
21496
21497     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21498       as_bad_where (fixp->fx_file, fixp->fx_line,
21499                     _("ADRL used for a symbol not defined in the same file"));
21500       return NULL;
21501
21502     case BFD_RELOC_ARM_OFFSET_IMM:
21503       if (section->use_rela_p)
21504         {
21505           code = fixp->fx_r_type;
21506           break;
21507         }
21508
21509       if (fixp->fx_addsy != NULL
21510           && !S_IS_DEFINED (fixp->fx_addsy)
21511           && S_IS_LOCAL (fixp->fx_addsy))
21512         {
21513           as_bad_where (fixp->fx_file, fixp->fx_line,
21514                         _("undefined local label `%s'"),
21515                         S_GET_NAME (fixp->fx_addsy));
21516           return NULL;
21517         }
21518
21519       as_bad_where (fixp->fx_file, fixp->fx_line,
21520                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
21521       return NULL;
21522
21523     default:
21524       {
21525         char * type;
21526
21527         switch (fixp->fx_r_type)
21528           {
21529           case BFD_RELOC_NONE:             type = "NONE";         break;
21530           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
21531           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
21532           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
21533           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
21534           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
21535           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
21536           case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
21537           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
21538           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
21539           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
21540           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
21541           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
21542           default:                         type = _("<unknown>"); break;
21543           }
21544         as_bad_where (fixp->fx_file, fixp->fx_line,
21545                       _("cannot represent %s relocation in this object file format"),
21546                       type);
21547         return NULL;
21548       }
21549     }
21550
21551 #ifdef OBJ_ELF
21552   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
21553       && GOT_symbol
21554       && fixp->fx_addsy == GOT_symbol)
21555     {
21556       code = BFD_RELOC_ARM_GOTPC;
21557       reloc->addend = fixp->fx_offset = reloc->address;
21558     }
21559 #endif
21560
21561   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
21562
21563   if (reloc->howto == NULL)
21564     {
21565       as_bad_where (fixp->fx_file, fixp->fx_line,
21566                     _("cannot represent %s relocation in this object file format"),
21567                     bfd_get_reloc_code_name (code));
21568       return NULL;
21569     }
21570
21571   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
21572      vtable entry to be used in the relocation's section offset.  */
21573   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
21574     reloc->address = fixp->fx_offset;
21575
21576   return reloc;
21577 }
21578
21579 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
21580
21581 void
21582 cons_fix_new_arm (fragS *       frag,
21583                   int           where,
21584                   int           size,
21585                   expressionS * exp)
21586 {
21587   bfd_reloc_code_real_type type;
21588   int pcrel = 0;
21589
21590   /* Pick a reloc.
21591      FIXME: @@ Should look at CPU word size.  */
21592   switch (size)
21593     {
21594     case 1:
21595       type = BFD_RELOC_8;
21596       break;
21597     case 2:
21598       type = BFD_RELOC_16;
21599       break;
21600     case 4:
21601     default:
21602       type = BFD_RELOC_32;
21603       break;
21604     case 8:
21605       type = BFD_RELOC_64;
21606       break;
21607     }
21608
21609 #ifdef TE_PE
21610   if (exp->X_op == O_secrel)
21611   {
21612     exp->X_op = O_symbol;
21613     type = BFD_RELOC_32_SECREL;
21614   }
21615 #endif
21616
21617   fix_new_exp (frag, where, (int) size, exp, pcrel, type);
21618 }
21619
21620 #if defined (OBJ_COFF)
21621 void
21622 arm_validate_fix (fixS * fixP)
21623 {
21624   /* If the destination of the branch is a defined symbol which does not have
21625      the THUMB_FUNC attribute, then we must be calling a function which has
21626      the (interfacearm) attribute.  We look for the Thumb entry point to that
21627      function and change the branch to refer to that function instead.  */
21628   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
21629       && fixP->fx_addsy != NULL
21630       && S_IS_DEFINED (fixP->fx_addsy)
21631       && ! THUMB_IS_FUNC (fixP->fx_addsy))
21632     {
21633       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
21634     }
21635 }
21636 #endif
21637
21638
21639 int
21640 arm_force_relocation (struct fix * fixp)
21641 {
21642 #if defined (OBJ_COFF) && defined (TE_PE)
21643   if (fixp->fx_r_type == BFD_RELOC_RVA)
21644     return 1;
21645 #endif
21646
21647   /* In case we have a call or a branch to a function in ARM ISA mode from
21648      a thumb function or vice-versa force the relocation. These relocations
21649      are cleared off for some cores that might have blx and simple transformations
21650      are possible.  */
21651
21652 #ifdef OBJ_ELF
21653   switch (fixp->fx_r_type)
21654     {
21655     case BFD_RELOC_ARM_PCREL_JUMP:
21656     case BFD_RELOC_ARM_PCREL_CALL:
21657     case BFD_RELOC_THUMB_PCREL_BLX:
21658       if (THUMB_IS_FUNC (fixp->fx_addsy))
21659         return 1;
21660       break;
21661
21662     case BFD_RELOC_ARM_PCREL_BLX:
21663     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21664     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21665     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21666       if (ARM_IS_FUNC (fixp->fx_addsy))
21667         return 1;
21668       break;
21669
21670     default:
21671       break;
21672     }
21673 #endif
21674
21675   /* Resolve these relocations even if the symbol is extern or weak.  */
21676   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
21677       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
21678       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
21679       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
21680       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
21681       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
21682       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12)
21683     return 0;
21684
21685   /* Always leave these relocations for the linker.  */
21686   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
21687        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
21688       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
21689     return 1;
21690
21691   /* Always generate relocations against function symbols.  */
21692   if (fixp->fx_r_type == BFD_RELOC_32
21693       && fixp->fx_addsy
21694       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
21695     return 1;
21696
21697   return generic_force_reloc (fixp);
21698 }
21699
21700 #if defined (OBJ_ELF) || defined (OBJ_COFF)
21701 /* Relocations against function names must be left unadjusted,
21702    so that the linker can use this information to generate interworking
21703    stubs.  The MIPS version of this function
21704    also prevents relocations that are mips-16 specific, but I do not
21705    know why it does this.
21706
21707    FIXME:
21708    There is one other problem that ought to be addressed here, but
21709    which currently is not:  Taking the address of a label (rather
21710    than a function) and then later jumping to that address.  Such
21711    addresses also ought to have their bottom bit set (assuming that
21712    they reside in Thumb code), but at the moment they will not.  */
21713
21714 bfd_boolean
21715 arm_fix_adjustable (fixS * fixP)
21716 {
21717   if (fixP->fx_addsy == NULL)
21718     return 1;
21719
21720   /* Preserve relocations against symbols with function type.  */
21721   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
21722     return FALSE;
21723
21724   if (THUMB_IS_FUNC (fixP->fx_addsy)
21725       && fixP->fx_subsy == NULL)
21726     return FALSE;
21727
21728   /* We need the symbol name for the VTABLE entries.  */
21729   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
21730       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
21731     return FALSE;
21732
21733   /* Don't allow symbols to be discarded on GOT related relocs.  */
21734   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
21735       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
21736       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
21737       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
21738       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
21739       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
21740       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
21741       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
21742       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
21743     return FALSE;
21744
21745   /* Similarly for group relocations.  */
21746   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
21747        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
21748       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
21749     return FALSE;
21750
21751   /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
21752   if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
21753       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
21754       || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
21755       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
21756       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
21757       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
21758       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
21759       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
21760     return FALSE;
21761
21762   return TRUE;
21763 }
21764 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
21765
21766 #ifdef OBJ_ELF
21767
21768 const char *
21769 elf32_arm_target_format (void)
21770 {
21771 #ifdef TE_SYMBIAN
21772   return (target_big_endian
21773           ? "elf32-bigarm-symbian"
21774           : "elf32-littlearm-symbian");
21775 #elif defined (TE_VXWORKS)
21776   return (target_big_endian
21777           ? "elf32-bigarm-vxworks"
21778           : "elf32-littlearm-vxworks");
21779 #else
21780   if (target_big_endian)
21781     return "elf32-bigarm";
21782   else
21783     return "elf32-littlearm";
21784 #endif
21785 }
21786
21787 void
21788 armelf_frob_symbol (symbolS * symp,
21789                     int *     puntp)
21790 {
21791   elf_frob_symbol (symp, puntp);
21792 }
21793 #endif
21794
21795 /* MD interface: Finalization.  */
21796
21797 void
21798 arm_cleanup (void)
21799 {
21800   literal_pool * pool;
21801
21802   /* Ensure that all the IT blocks are properly closed.  */
21803   check_it_blocks_finished ();
21804
21805   for (pool = list_of_pools; pool; pool = pool->next)
21806     {
21807       /* Put it at the end of the relevant section.  */
21808       subseg_set (pool->section, pool->sub_section);
21809 #ifdef OBJ_ELF
21810       arm_elf_change_section ();
21811 #endif
21812       s_ltorg (0);
21813     }
21814 }
21815
21816 #ifdef OBJ_ELF
21817 /* Remove any excess mapping symbols generated for alignment frags in
21818    SEC.  We may have created a mapping symbol before a zero byte
21819    alignment; remove it if there's a mapping symbol after the
21820    alignment.  */
21821 static void
21822 check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
21823                        void *dummy ATTRIBUTE_UNUSED)
21824 {
21825   segment_info_type *seginfo = seg_info (sec);
21826   fragS *fragp;
21827
21828   if (seginfo == NULL || seginfo->frchainP == NULL)
21829     return;
21830
21831   for (fragp = seginfo->frchainP->frch_root;
21832        fragp != NULL;
21833        fragp = fragp->fr_next)
21834     {
21835       symbolS *sym = fragp->tc_frag_data.last_map;
21836       fragS *next = fragp->fr_next;
21837
21838       /* Variable-sized frags have been converted to fixed size by
21839          this point.  But if this was variable-sized to start with,
21840          there will be a fixed-size frag after it.  So don't handle
21841          next == NULL.  */
21842       if (sym == NULL || next == NULL)
21843         continue;
21844
21845       if (S_GET_VALUE (sym) < next->fr_address)
21846         /* Not at the end of this frag.  */
21847         continue;
21848       know (S_GET_VALUE (sym) == next->fr_address);
21849
21850       do
21851         {
21852           if (next->tc_frag_data.first_map != NULL)
21853             {
21854               /* Next frag starts with a mapping symbol.  Discard this
21855                  one.  */
21856               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
21857               break;
21858             }
21859
21860           if (next->fr_next == NULL)
21861             {
21862               /* This mapping symbol is at the end of the section.  Discard
21863                  it.  */
21864               know (next->fr_fix == 0 && next->fr_var == 0);
21865               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
21866               break;
21867             }
21868
21869           /* As long as we have empty frags without any mapping symbols,
21870              keep looking.  */
21871           /* If the next frag is non-empty and does not start with a
21872              mapping symbol, then this mapping symbol is required.  */
21873           if (next->fr_address != next->fr_next->fr_address)
21874             break;
21875
21876           next = next->fr_next;
21877         }
21878       while (next != NULL);
21879     }
21880 }
21881 #endif
21882
21883 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
21884    ARM ones.  */
21885
21886 void
21887 arm_adjust_symtab (void)
21888 {
21889 #ifdef OBJ_COFF
21890   symbolS * sym;
21891
21892   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
21893     {
21894       if (ARM_IS_THUMB (sym))
21895         {
21896           if (THUMB_IS_FUNC (sym))
21897             {
21898               /* Mark the symbol as a Thumb function.  */
21899               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
21900                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
21901                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
21902
21903               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
21904                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
21905               else
21906                 as_bad (_("%s: unexpected function type: %d"),
21907                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
21908             }
21909           else switch (S_GET_STORAGE_CLASS (sym))
21910             {
21911             case C_EXT:
21912               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
21913               break;
21914             case C_STAT:
21915               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
21916               break;
21917             case C_LABEL:
21918               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
21919               break;
21920             default:
21921               /* Do nothing.  */
21922               break;
21923             }
21924         }
21925
21926       if (ARM_IS_INTERWORK (sym))
21927         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
21928     }
21929 #endif
21930 #ifdef OBJ_ELF
21931   symbolS * sym;
21932   char      bind;
21933
21934   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
21935     {
21936       if (ARM_IS_THUMB (sym))
21937         {
21938           elf_symbol_type * elf_sym;
21939
21940           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
21941           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
21942
21943           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
21944                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
21945             {
21946               /* If it's a .thumb_func, declare it as so,
21947                  otherwise tag label as .code 16.  */
21948               if (THUMB_IS_FUNC (sym))
21949                 elf_sym->internal_elf_sym.st_info =
21950                   ELF_ST_INFO (bind, STT_ARM_TFUNC);
21951               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
21952                 elf_sym->internal_elf_sym.st_info =
21953                   ELF_ST_INFO (bind, STT_ARM_16BIT);
21954             }
21955         }
21956     }
21957
21958   /* Remove any overlapping mapping symbols generated by alignment frags.  */
21959   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
21960 #endif
21961 }
21962
21963 /* MD interface: Initialization.  */
21964
21965 static void
21966 set_constant_flonums (void)
21967 {
21968   int i;
21969
21970   for (i = 0; i < NUM_FLOAT_VALS; i++)
21971     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
21972       abort ();
21973 }
21974
21975 /* Auto-select Thumb mode if it's the only available instruction set for the
21976    given architecture.  */
21977
21978 static void
21979 autoselect_thumb_from_cpu_variant (void)
21980 {
21981   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
21982     opcode_select (16);
21983 }
21984
21985 void
21986 md_begin (void)
21987 {
21988   unsigned mach;
21989   unsigned int i;
21990
21991   if (   (arm_ops_hsh = hash_new ()) == NULL
21992       || (arm_cond_hsh = hash_new ()) == NULL
21993       || (arm_shift_hsh = hash_new ()) == NULL
21994       || (arm_psr_hsh = hash_new ()) == NULL
21995       || (arm_v7m_psr_hsh = hash_new ()) == NULL
21996       || (arm_reg_hsh = hash_new ()) == NULL
21997       || (arm_reloc_hsh = hash_new ()) == NULL
21998       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
21999     as_fatal (_("virtual memory exhausted"));
22000
22001   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
22002     hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
22003   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
22004     hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
22005   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
22006     hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
22007   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
22008     hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
22009   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
22010     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
22011                  (void *) (v7m_psrs + i));
22012   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
22013     hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
22014   for (i = 0;
22015        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
22016        i++)
22017     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
22018                  (void *) (barrier_opt_names + i));
22019 #ifdef OBJ_ELF
22020   for (i = 0; i < sizeof (reloc_names) / sizeof (struct reloc_entry); i++)
22021     hash_insert (arm_reloc_hsh, reloc_names[i].name, (void *) (reloc_names + i));
22022 #endif
22023
22024   set_constant_flonums ();
22025
22026   /* Set the cpu variant based on the command-line options.  We prefer
22027      -mcpu= over -march= if both are set (as for GCC); and we prefer
22028      -mfpu= over any other way of setting the floating point unit.
22029      Use of legacy options with new options are faulted.  */
22030   if (legacy_cpu)
22031     {
22032       if (mcpu_cpu_opt || march_cpu_opt)
22033         as_bad (_("use of old and new-style options to set CPU type"));
22034
22035       mcpu_cpu_opt = legacy_cpu;
22036     }
22037   else if (!mcpu_cpu_opt)
22038     mcpu_cpu_opt = march_cpu_opt;
22039
22040   if (legacy_fpu)
22041     {
22042       if (mfpu_opt)
22043         as_bad (_("use of old and new-style options to set FPU type"));
22044
22045       mfpu_opt = legacy_fpu;
22046     }
22047   else if (!mfpu_opt)
22048     {
22049 #if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
22050         || defined (TE_NetBSD) || defined (TE_VXWORKS))
22051       /* Some environments specify a default FPU.  If they don't, infer it
22052          from the processor.  */
22053       if (mcpu_fpu_opt)
22054         mfpu_opt = mcpu_fpu_opt;
22055       else
22056         mfpu_opt = march_fpu_opt;
22057 #else
22058       mfpu_opt = &fpu_default;
22059 #endif
22060     }
22061
22062   if (!mfpu_opt)
22063     {
22064       if (mcpu_cpu_opt != NULL)
22065         mfpu_opt = &fpu_default;
22066       else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
22067         mfpu_opt = &fpu_arch_vfp_v2;
22068       else
22069         mfpu_opt = &fpu_arch_fpa;
22070     }
22071
22072 #ifdef CPU_DEFAULT
22073   if (!mcpu_cpu_opt)
22074     {
22075       mcpu_cpu_opt = &cpu_default;
22076       selected_cpu = cpu_default;
22077     }
22078 #else
22079   if (mcpu_cpu_opt)
22080     selected_cpu = *mcpu_cpu_opt;
22081   else
22082     mcpu_cpu_opt = &arm_arch_any;
22083 #endif
22084
22085   ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
22086
22087   autoselect_thumb_from_cpu_variant ();
22088
22089   arm_arch_used = thumb_arch_used = arm_arch_none;
22090
22091 #if defined OBJ_COFF || defined OBJ_ELF
22092   {
22093     unsigned int flags = 0;
22094
22095 #if defined OBJ_ELF
22096     flags = meabi_flags;
22097
22098     switch (meabi_flags)
22099       {
22100       case EF_ARM_EABI_UNKNOWN:
22101 #endif
22102         /* Set the flags in the private structure.  */
22103         if (uses_apcs_26)      flags |= F_APCS26;
22104         if (support_interwork) flags |= F_INTERWORK;
22105         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
22106         if (pic_code)          flags |= F_PIC;
22107         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
22108           flags |= F_SOFT_FLOAT;
22109
22110         switch (mfloat_abi_opt)
22111           {
22112           case ARM_FLOAT_ABI_SOFT:
22113           case ARM_FLOAT_ABI_SOFTFP:
22114             flags |= F_SOFT_FLOAT;
22115             break;
22116
22117           case ARM_FLOAT_ABI_HARD:
22118             if (flags & F_SOFT_FLOAT)
22119               as_bad (_("hard-float conflicts with specified fpu"));
22120             break;
22121           }
22122
22123         /* Using pure-endian doubles (even if soft-float).      */
22124         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
22125           flags |= F_VFP_FLOAT;
22126
22127 #if defined OBJ_ELF
22128         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
22129             flags |= EF_ARM_MAVERICK_FLOAT;
22130         break;
22131
22132       case EF_ARM_EABI_VER4:
22133       case EF_ARM_EABI_VER5:
22134         /* No additional flags to set.  */
22135         break;
22136
22137       default:
22138         abort ();
22139       }
22140 #endif
22141     bfd_set_private_flags (stdoutput, flags);
22142
22143     /* We have run out flags in the COFF header to encode the
22144        status of ATPCS support, so instead we create a dummy,
22145        empty, debug section called .arm.atpcs.  */
22146     if (atpcs)
22147       {
22148         asection * sec;
22149
22150         sec = bfd_make_section (stdoutput, ".arm.atpcs");
22151
22152         if (sec != NULL)
22153           {
22154             bfd_set_section_flags
22155               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
22156             bfd_set_section_size (stdoutput, sec, 0);
22157             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
22158           }
22159       }
22160   }
22161 #endif
22162
22163   /* Record the CPU type as well.  */
22164   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
22165     mach = bfd_mach_arm_iWMMXt2;
22166   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
22167     mach = bfd_mach_arm_iWMMXt;
22168   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
22169     mach = bfd_mach_arm_XScale;
22170   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
22171     mach = bfd_mach_arm_ep9312;
22172   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
22173     mach = bfd_mach_arm_5TE;
22174   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
22175     {
22176       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
22177         mach = bfd_mach_arm_5T;
22178       else
22179         mach = bfd_mach_arm_5;
22180     }
22181   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
22182     {
22183       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
22184         mach = bfd_mach_arm_4T;
22185       else
22186         mach = bfd_mach_arm_4;
22187     }
22188   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
22189     mach = bfd_mach_arm_3M;
22190   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
22191     mach = bfd_mach_arm_3;
22192   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
22193     mach = bfd_mach_arm_2a;
22194   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
22195     mach = bfd_mach_arm_2;
22196   else
22197     mach = bfd_mach_arm_unknown;
22198
22199   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
22200 }
22201
22202 /* Command line processing.  */
22203
22204 /* md_parse_option
22205       Invocation line includes a switch not recognized by the base assembler.
22206       See if it's a processor-specific option.
22207
22208       This routine is somewhat complicated by the need for backwards
22209       compatibility (since older releases of gcc can't be changed).
22210       The new options try to make the interface as compatible as
22211       possible with GCC.
22212
22213       New options (supported) are:
22214
22215               -mcpu=<cpu name>           Assemble for selected processor
22216               -march=<architecture name> Assemble for selected architecture
22217               -mfpu=<fpu architecture>   Assemble for selected FPU.
22218               -EB/-mbig-endian           Big-endian
22219               -EL/-mlittle-endian        Little-endian
22220               -k                         Generate PIC code
22221               -mthumb                    Start in Thumb mode
22222               -mthumb-interwork          Code supports ARM/Thumb interworking
22223
22224               -m[no-]warn-deprecated     Warn about deprecated features
22225
22226       For now we will also provide support for:
22227
22228               -mapcs-32                  32-bit Program counter
22229               -mapcs-26                  26-bit Program counter
22230               -macps-float               Floats passed in FP registers
22231               -mapcs-reentrant           Reentrant code
22232               -matpcs
22233       (sometime these will probably be replaced with -mapcs=<list of options>
22234       and -matpcs=<list of options>)
22235
22236       The remaining options are only supported for back-wards compatibility.
22237       Cpu variants, the arm part is optional:
22238               -m[arm]1                Currently not supported.
22239               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
22240               -m[arm]3                Arm 3 processor
22241               -m[arm]6[xx],           Arm 6 processors
22242               -m[arm]7[xx][t][[d]m]   Arm 7 processors
22243               -m[arm]8[10]            Arm 8 processors
22244               -m[arm]9[20][tdmi]      Arm 9 processors
22245               -mstrongarm[110[0]]     StrongARM processors
22246               -mxscale                XScale processors
22247               -m[arm]v[2345[t[e]]]    Arm architectures
22248               -mall                   All (except the ARM1)
22249       FP variants:
22250               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
22251               -mfpe-old               (No float load/store multiples)
22252               -mvfpxd                 VFP Single precision
22253               -mvfp                   All VFP
22254               -mno-fpu                Disable all floating point instructions
22255
22256       The following CPU names are recognized:
22257               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
22258               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
22259               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
22260               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
22261               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
22262               arm10t arm10e, arm1020t, arm1020e, arm10200e,
22263               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
22264
22265       */
22266
22267 const char * md_shortopts = "m:k";
22268
22269 #ifdef ARM_BI_ENDIAN
22270 #define OPTION_EB (OPTION_MD_BASE + 0)
22271 #define OPTION_EL (OPTION_MD_BASE + 1)
22272 #else
22273 #if TARGET_BYTES_BIG_ENDIAN
22274 #define OPTION_EB (OPTION_MD_BASE + 0)
22275 #else
22276 #define OPTION_EL (OPTION_MD_BASE + 1)
22277 #endif
22278 #endif
22279 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
22280
22281 struct option md_longopts[] =
22282 {
22283 #ifdef OPTION_EB
22284   {"EB", no_argument, NULL, OPTION_EB},
22285 #endif
22286 #ifdef OPTION_EL
22287   {"EL", no_argument, NULL, OPTION_EL},
22288 #endif
22289   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
22290   {NULL, no_argument, NULL, 0}
22291 };
22292
22293 size_t md_longopts_size = sizeof (md_longopts);
22294
22295 struct arm_option_table
22296 {
22297   char *option;         /* Option name to match.  */
22298   char *help;           /* Help information.  */
22299   int  *var;            /* Variable to change.  */
22300   int   value;          /* What to change it to.  */
22301   char *deprecated;     /* If non-null, print this message.  */
22302 };
22303
22304 struct arm_option_table arm_opts[] =
22305 {
22306   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
22307   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
22308   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
22309    &support_interwork, 1, NULL},
22310   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
22311   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
22312   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
22313    1, NULL},
22314   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
22315   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
22316   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
22317   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
22318    NULL},
22319
22320   /* These are recognized by the assembler, but have no affect on code.  */
22321   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
22322   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
22323
22324   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
22325   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
22326    &warn_on_deprecated, 0, NULL},
22327   {NULL, NULL, NULL, 0, NULL}
22328 };
22329
22330 struct arm_legacy_option_table
22331 {
22332   char *option;                         /* Option name to match.  */
22333   const arm_feature_set **var;          /* Variable to change.  */
22334   const arm_feature_set value;          /* What to change it to.  */
22335   char *deprecated;                     /* If non-null, print this message.  */
22336 };
22337
22338 const struct arm_legacy_option_table arm_legacy_opts[] =
22339 {
22340   /* DON'T add any new processors to this list -- we want the whole list
22341      to go away...  Add them to the processors table instead.  */
22342   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
22343   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
22344   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
22345   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
22346   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
22347   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
22348   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
22349   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
22350   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
22351   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
22352   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
22353   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
22354   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
22355   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
22356   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
22357   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
22358   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
22359   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
22360   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
22361   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
22362   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
22363   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
22364   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
22365   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
22366   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
22367   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
22368   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
22369   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
22370   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
22371   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
22372   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
22373   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
22374   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
22375   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
22376   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22377   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22378   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22379   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22380   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22381   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22382   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
22383   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
22384   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
22385   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
22386   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
22387   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
22388   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22389   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22390   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22391   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22392   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22393   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22394   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22395   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22396   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22397   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22398   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
22399   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
22400   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
22401   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
22402   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22403   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22404   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22405   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22406   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22407   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22408   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22409   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22410   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
22411   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
22412    N_("use -mcpu=strongarm110")},
22413   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
22414    N_("use -mcpu=strongarm1100")},
22415   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
22416    N_("use -mcpu=strongarm1110")},
22417   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
22418   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
22419   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
22420
22421   /* Architecture variants -- don't add any more to this list either.  */
22422   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
22423   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
22424   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22425   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22426   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
22427   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
22428   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22429   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22430   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
22431   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
22432   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22433   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22434   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
22435   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
22436   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22437   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22438   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
22439   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
22440
22441   /* Floating point variants -- don't add any more to this list either.  */
22442   {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
22443   {"mfpa10",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
22444   {"mfpa11",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
22445   {"mno-fpu",  &legacy_fpu, ARM_ARCH_NONE,
22446    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
22447
22448   {NULL, NULL, ARM_ARCH_NONE, NULL}
22449 };
22450
22451 struct arm_cpu_option_table
22452 {
22453   char *name;
22454   const arm_feature_set value;
22455   /* For some CPUs we assume an FPU unless the user explicitly sets
22456      -mfpu=...  */
22457   const arm_feature_set default_fpu;
22458   /* The canonical name of the CPU, or NULL to use NAME converted to upper
22459      case.  */
22460   const char *canonical_name;
22461 };
22462
22463 /* This list should, at a minimum, contain all the cpu names
22464    recognized by GCC.  */
22465 static const struct arm_cpu_option_table arm_cpus[] =
22466 {
22467   {"all",               ARM_ANY,         FPU_ARCH_FPA,    NULL},
22468   {"arm1",              ARM_ARCH_V1,     FPU_ARCH_FPA,    NULL},
22469   {"arm2",              ARM_ARCH_V2,     FPU_ARCH_FPA,    NULL},
22470   {"arm250",            ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL},
22471   {"arm3",              ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL},
22472   {"arm6",              ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22473   {"arm60",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22474   {"arm600",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22475   {"arm610",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22476   {"arm620",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22477   {"arm7",              ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22478   {"arm7m",             ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
22479   {"arm7d",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22480   {"arm7dm",            ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
22481   {"arm7di",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22482   {"arm7dmi",           ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
22483   {"arm70",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22484   {"arm700",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22485   {"arm700i",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22486   {"arm710",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22487   {"arm710t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22488   {"arm720",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22489   {"arm720t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22490   {"arm740t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22491   {"arm710c",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22492   {"arm7100",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22493   {"arm7500",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22494   {"arm7500fe",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22495   {"arm7t",             ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22496   {"arm7tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22497   {"arm7tdmi-s",        ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22498   {"arm8",              ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22499   {"arm810",            ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22500   {"strongarm",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22501   {"strongarm1",        ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22502   {"strongarm110",      ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22503   {"strongarm1100",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22504   {"strongarm1110",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22505   {"arm9",              ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22506   {"arm920",            ARM_ARCH_V4T,    FPU_ARCH_FPA,    "ARM920T"},
22507   {"arm920t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22508   {"arm922t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22509   {"arm940t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22510   {"arm9tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22511   {"fa526",             ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22512   {"fa626",             ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22513   /* For V5 or later processors we default to using VFP; but the user
22514      should really set the FPU type explicitly.  */
22515   {"arm9e-r0",          ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22516   {"arm9e",             ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22517   {"arm926ej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"},
22518   {"arm926ejs",         ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"},
22519   {"arm926ej-s",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL},
22520   {"arm946e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22521   {"arm946e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM946E-S"},
22522   {"arm946e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22523   {"arm966e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22524   {"arm966e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM966E-S"},
22525   {"arm966e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22526   {"arm968e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22527   {"arm10t",            ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
22528   {"arm10tdmi",         ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
22529   {"arm10e",            ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22530   {"arm1020",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM1020E"},
22531   {"arm1020t",          ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
22532   {"arm1020e",          ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22533   {"arm1022e",          ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22534   {"arm1026ejs",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM1026EJ-S"},
22535   {"arm1026ej-s",       ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL},
22536   {"fa626te",           ARM_ARCH_V5TE,   FPU_NONE,        NULL},
22537   {"fa726te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22538   {"arm1136js",         ARM_ARCH_V6,     FPU_NONE,        "ARM1136J-S"},
22539   {"arm1136j-s",        ARM_ARCH_V6,     FPU_NONE,        NULL},
22540   {"arm1136jfs",        ARM_ARCH_V6,     FPU_ARCH_VFP_V2, "ARM1136JF-S"},
22541   {"arm1136jf-s",       ARM_ARCH_V6,     FPU_ARCH_VFP_V2, NULL},
22542   {"mpcore",            ARM_ARCH_V6K,    FPU_ARCH_VFP_V2, "MPCore"},
22543   {"mpcorenovfp",       ARM_ARCH_V6K,    FPU_NONE,        "MPCore"},
22544   {"arm1156t2-s",       ARM_ARCH_V6T2,   FPU_NONE,        NULL},
22545   {"arm1156t2f-s",      ARM_ARCH_V6T2,   FPU_ARCH_VFP_V2, NULL},
22546   {"arm1176jz-s",       ARM_ARCH_V6ZK,   FPU_NONE,        NULL},
22547   {"arm1176jzf-s",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2, NULL},
22548   {"cortex-a5",         ARM_ARCH_V7A_MP_SEC, 
22549                                          FPU_NONE,        "Cortex-A5"},
22550   {"cortex-a8",         ARM_ARCH_V7A_SEC,
22551                                          ARM_FEATURE (0, FPU_VFP_V3
22552                                                         | FPU_NEON_EXT_V1),
22553                                                           "Cortex-A8"},
22554   {"cortex-a9",         ARM_ARCH_V7A_MP_SEC,
22555                                          ARM_FEATURE (0, FPU_VFP_V3
22556                                                         | FPU_NEON_EXT_V1),
22557                                                           "Cortex-A9"},
22558   {"cortex-a15",        ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
22559                                          FPU_ARCH_NEON_VFP_V4,
22560                                                           "Cortex-A15"},
22561   {"cortex-r4",         ARM_ARCH_V7R,    FPU_NONE,        "Cortex-R4"},
22562   {"cortex-r4f",        ARM_ARCH_V7R,    FPU_ARCH_VFP_V3D16,
22563                                                           "Cortex-R4F"},
22564   {"cortex-m4",         ARM_ARCH_V7EM,   FPU_NONE,        "Cortex-M4"},
22565   {"cortex-m3",         ARM_ARCH_V7M,    FPU_NONE,        "Cortex-M3"},
22566   {"cortex-m1",         ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M1"},
22567   {"cortex-m0",         ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0"},
22568   /* ??? XSCALE is really an architecture.  */
22569   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
22570   /* ??? iwmmxt is not a processor.  */
22571   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL},
22572   {"iwmmxt2",           ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL},
22573   {"i80200",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
22574   /* Maverick */
22575   {"ep9312",    ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK), FPU_ARCH_MAVERICK, "ARM920T"},
22576   {NULL,                ARM_ARCH_NONE,   ARM_ARCH_NONE, NULL}
22577 };
22578
22579 struct arm_arch_option_table
22580 {
22581   char *name;
22582   const arm_feature_set value;
22583   const arm_feature_set default_fpu;
22584 };
22585
22586 /* This list should, at a minimum, contain all the architecture names
22587    recognized by GCC.  */
22588 static const struct arm_arch_option_table arm_archs[] =
22589 {
22590   {"all",               ARM_ANY,         FPU_ARCH_FPA},
22591   {"armv1",             ARM_ARCH_V1,     FPU_ARCH_FPA},
22592   {"armv2",             ARM_ARCH_V2,     FPU_ARCH_FPA},
22593   {"armv2a",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
22594   {"armv2s",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
22595   {"armv3",             ARM_ARCH_V3,     FPU_ARCH_FPA},
22596   {"armv3m",            ARM_ARCH_V3M,    FPU_ARCH_FPA},
22597   {"armv4",             ARM_ARCH_V4,     FPU_ARCH_FPA},
22598   {"armv4xm",           ARM_ARCH_V4xM,   FPU_ARCH_FPA},
22599   {"armv4t",            ARM_ARCH_V4T,    FPU_ARCH_FPA},
22600   {"armv4txm",          ARM_ARCH_V4TxM,  FPU_ARCH_FPA},
22601   {"armv5",             ARM_ARCH_V5,     FPU_ARCH_VFP},
22602   {"armv5t",            ARM_ARCH_V5T,    FPU_ARCH_VFP},
22603   {"armv5txm",          ARM_ARCH_V5TxM,  FPU_ARCH_VFP},
22604   {"armv5te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP},
22605   {"armv5texp",         ARM_ARCH_V5TExP, FPU_ARCH_VFP},
22606   {"armv5tej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP},
22607   {"armv6",             ARM_ARCH_V6,     FPU_ARCH_VFP},
22608   {"armv6j",            ARM_ARCH_V6,     FPU_ARCH_VFP},
22609   {"armv6k",            ARM_ARCH_V6K,    FPU_ARCH_VFP},
22610   {"armv6z",            ARM_ARCH_V6Z,    FPU_ARCH_VFP},
22611   {"armv6zk",           ARM_ARCH_V6ZK,   FPU_ARCH_VFP},
22612   {"armv6t2",           ARM_ARCH_V6T2,   FPU_ARCH_VFP},
22613   {"armv6kt2",          ARM_ARCH_V6KT2,  FPU_ARCH_VFP},
22614   {"armv6zt2",          ARM_ARCH_V6ZT2,  FPU_ARCH_VFP},
22615   {"armv6zkt2",         ARM_ARCH_V6ZKT2, FPU_ARCH_VFP},
22616   {"armv6-m",           ARM_ARCH_V6M,    FPU_ARCH_VFP},
22617   {"armv6s-m",          ARM_ARCH_V6SM,   FPU_ARCH_VFP},
22618   {"armv7",             ARM_ARCH_V7,     FPU_ARCH_VFP},
22619   /* The official spelling of the ARMv7 profile variants is the dashed form.
22620      Accept the non-dashed form for compatibility with old toolchains.  */
22621   {"armv7a",            ARM_ARCH_V7A,    FPU_ARCH_VFP},
22622   {"armv7r",            ARM_ARCH_V7R,    FPU_ARCH_VFP},
22623   {"armv7m",            ARM_ARCH_V7M,    FPU_ARCH_VFP},
22624   {"armv7-a",           ARM_ARCH_V7A,    FPU_ARCH_VFP},
22625   {"armv7-r",           ARM_ARCH_V7R,    FPU_ARCH_VFP},
22626   {"armv7-m",           ARM_ARCH_V7M,    FPU_ARCH_VFP},
22627   {"armv7e-m",          ARM_ARCH_V7EM,   FPU_ARCH_VFP},
22628   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP},
22629   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP},
22630   {"iwmmxt2",           ARM_ARCH_IWMMXT2,FPU_ARCH_VFP},
22631   {NULL,                ARM_ARCH_NONE,   ARM_ARCH_NONE}
22632 };
22633
22634 /* ISA extensions in the co-processor and main instruction set space.  */
22635 struct arm_option_extension_value_table
22636 {
22637   char *name;
22638   const arm_feature_set value;
22639   const arm_feature_set allowed_archs;
22640 };
22641
22642 /* The following table must be in alphabetical order with a NULL last entry.
22643    */
22644 static const struct arm_option_extension_value_table arm_extensions[] =
22645 {
22646   {"idiv",      ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
22647                                    ARM_FEATURE (ARM_EXT_V7A, 0)},
22648   {"iwmmxt",    ARM_FEATURE (0, ARM_CEXT_IWMMXT),       ARM_ANY},
22649   {"iwmmxt2",   ARM_FEATURE (0, ARM_CEXT_IWMMXT2),      ARM_ANY},
22650   {"maverick",  ARM_FEATURE (0, ARM_CEXT_MAVERICK),     ARM_ANY},
22651   {"mp",        ARM_FEATURE (ARM_EXT_MP, 0),
22652                      ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)},
22653   {"os",        ARM_FEATURE (ARM_EXT_OS, 0),
22654                                    ARM_FEATURE (ARM_EXT_V6M, 0)},
22655   {"sec",       ARM_FEATURE (ARM_EXT_SEC, 0),
22656                      ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)},
22657   {"virt",      ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV | ARM_EXT_DIV, 0),
22658                                    ARM_FEATURE (ARM_EXT_V7A, 0)},
22659   {"xscale",    ARM_FEATURE (0, ARM_CEXT_XSCALE),       ARM_ANY},
22660   {NULL,        ARM_ARCH_NONE,                    ARM_ARCH_NONE}
22661 };
22662
22663 /* ISA floating-point and Advanced SIMD extensions.  */
22664 struct arm_option_fpu_value_table
22665 {
22666   char *name;
22667   const arm_feature_set value;
22668 };
22669
22670 /* This list should, at a minimum, contain all the fpu names
22671    recognized by GCC.  */
22672 static const struct arm_option_fpu_value_table arm_fpus[] =
22673 {
22674   {"softfpa",           FPU_NONE},
22675   {"fpe",               FPU_ARCH_FPE},
22676   {"fpe2",              FPU_ARCH_FPE},
22677   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
22678   {"fpa",               FPU_ARCH_FPA},
22679   {"fpa10",             FPU_ARCH_FPA},
22680   {"fpa11",             FPU_ARCH_FPA},
22681   {"arm7500fe",         FPU_ARCH_FPA},
22682   {"softvfp",           FPU_ARCH_VFP},
22683   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
22684   {"vfp",               FPU_ARCH_VFP_V2},
22685   {"vfp9",              FPU_ARCH_VFP_V2},
22686   {"vfp3",              FPU_ARCH_VFP_V3}, /* For backwards compatbility.  */
22687   {"vfp10",             FPU_ARCH_VFP_V2},
22688   {"vfp10-r0",          FPU_ARCH_VFP_V1},
22689   {"vfpxd",             FPU_ARCH_VFP_V1xD},
22690   {"vfpv2",             FPU_ARCH_VFP_V2},
22691   {"vfpv3",             FPU_ARCH_VFP_V3},
22692   {"vfpv3-fp16",        FPU_ARCH_VFP_V3_FP16},
22693   {"vfpv3-d16",         FPU_ARCH_VFP_V3D16},
22694   {"vfpv3-d16-fp16",    FPU_ARCH_VFP_V3D16_FP16},
22695   {"vfpv3xd",           FPU_ARCH_VFP_V3xD},
22696   {"vfpv3xd-fp16",      FPU_ARCH_VFP_V3xD_FP16},
22697   {"arm1020t",          FPU_ARCH_VFP_V1},
22698   {"arm1020e",          FPU_ARCH_VFP_V2},
22699   {"arm1136jfs",        FPU_ARCH_VFP_V2},
22700   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
22701   {"maverick",          FPU_ARCH_MAVERICK},
22702   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
22703   {"neon-fp16",         FPU_ARCH_NEON_FP16},
22704   {"vfpv4",             FPU_ARCH_VFP_V4},
22705   {"vfpv4-d16",         FPU_ARCH_VFP_V4D16},
22706   {"fpv4-sp-d16",       FPU_ARCH_VFP_V4_SP_D16},
22707   {"neon-vfpv4",        FPU_ARCH_NEON_VFP_V4},
22708   {NULL,                ARM_ARCH_NONE}
22709 };
22710
22711 struct arm_option_value_table
22712 {
22713   char *name;
22714   long value;
22715 };
22716
22717 static const struct arm_option_value_table arm_float_abis[] =
22718 {
22719   {"hard",      ARM_FLOAT_ABI_HARD},
22720   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
22721   {"soft",      ARM_FLOAT_ABI_SOFT},
22722   {NULL,        0}
22723 };
22724
22725 #ifdef OBJ_ELF
22726 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
22727 static const struct arm_option_value_table arm_eabis[] =
22728 {
22729   {"gnu",       EF_ARM_EABI_UNKNOWN},
22730   {"4",         EF_ARM_EABI_VER4},
22731   {"5",         EF_ARM_EABI_VER5},
22732   {NULL,        0}
22733 };
22734 #endif
22735
22736 struct arm_long_option_table
22737 {
22738   char * option;                /* Substring to match.  */
22739   char * help;                  /* Help information.  */
22740   int (* func) (char * subopt); /* Function to decode sub-option.  */
22741   char * deprecated;            /* If non-null, print this message.  */
22742 };
22743
22744 static bfd_boolean
22745 arm_parse_extension (char * str, const arm_feature_set **opt_p)
22746 {
22747   arm_feature_set *ext_set = (arm_feature_set *)
22748       xmalloc (sizeof (arm_feature_set));
22749
22750   /* We insist on extensions being specified in alphabetical order, and with
22751      extensions being added before being removed.  We achieve this by having 
22752      the global ARM_EXTENSIONS table in alphabetical order, and using the 
22753      ADDING_VALUE variable to indicate whether we are adding an extension (1)
22754      or removing it (0) and only allowing it to change in the order 
22755      -1 -> 1 -> 0.  */
22756   const struct arm_option_extension_value_table * opt = NULL;
22757   int adding_value = -1;
22758
22759   /* Copy the feature set, so that we can modify it.  */
22760   *ext_set = **opt_p;
22761   *opt_p = ext_set;
22762
22763   while (str != NULL && *str != 0)
22764     {
22765       char * ext;
22766       size_t optlen;
22767
22768       if (*str != '+')
22769         {
22770           as_bad (_("invalid architectural extension"));
22771           return FALSE;
22772         }
22773
22774       str++;
22775       ext = strchr (str, '+');
22776
22777       if (ext != NULL)
22778         optlen = ext - str;
22779       else
22780         optlen = strlen (str);
22781
22782       if (optlen >= 2
22783           && strncmp (str, "no", 2) == 0)
22784         {
22785           if (adding_value != 0)
22786             {
22787               adding_value = 0;
22788               opt = arm_extensions;
22789             }
22790
22791           optlen -= 2;
22792           str += 2;
22793         }
22794       else if (optlen > 0)
22795         {
22796           if (adding_value == -1)
22797             {
22798               adding_value = 1;
22799               opt = arm_extensions;
22800             }
22801           else if (adding_value != 1)
22802             {
22803               as_bad (_("must specify extensions to add before specifying "
22804                         "those to remove"));
22805               return FALSE;
22806             }
22807         }
22808
22809       if (optlen == 0)
22810         {
22811           as_bad (_("missing architectural extension"));
22812           return FALSE;
22813         }
22814
22815       gas_assert (adding_value != -1);
22816       gas_assert (opt != NULL);
22817
22818       /* Scan over the options table trying to find an exact match. */
22819       for (; opt->name != NULL; opt++)
22820         if (strncmp (opt->name, str, optlen) == 0
22821             && strlen (opt->name) == optlen)
22822           {
22823             /* Check we can apply the extension to this architecture.  */
22824             if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
22825               {
22826                 as_bad (_("extension does not apply to the base architecture"));
22827                 return FALSE;
22828               }
22829
22830             /* Add or remove the extension.  */
22831             if (adding_value)
22832               ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
22833             else
22834               ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
22835
22836             break;
22837           }
22838
22839       if (opt->name == NULL)
22840         {
22841           /* Did we fail to find an extension because it wasn't specified in
22842              alphabetical order, or because it does not exist?  */
22843
22844           for (opt = arm_extensions; opt->name != NULL; opt++)
22845             if (strncmp (opt->name, str, optlen) == 0)
22846               break;
22847
22848           if (opt->name == NULL)
22849             as_bad (_("unknown architectural extension `%s'"), str);
22850           else
22851             as_bad (_("architectural extensions must be specified in "
22852                       "alphabetical order"));
22853
22854           return FALSE;
22855         }
22856       else
22857         {
22858           /* We should skip the extension we've just matched the next time
22859              round.  */
22860           opt++;
22861         }
22862
22863       str = ext;
22864     };
22865
22866   return TRUE;
22867 }
22868
22869 static bfd_boolean
22870 arm_parse_cpu (char * str)
22871 {
22872   const struct arm_cpu_option_table * opt;
22873   char * ext = strchr (str, '+');
22874   int optlen;
22875
22876   if (ext != NULL)
22877     optlen = ext - str;
22878   else
22879     optlen = strlen (str);
22880
22881   if (optlen == 0)
22882     {
22883       as_bad (_("missing cpu name `%s'"), str);
22884       return FALSE;
22885     }
22886
22887   for (opt = arm_cpus; opt->name != NULL; opt++)
22888     if (strncmp (opt->name, str, optlen) == 0)
22889       {
22890         mcpu_cpu_opt = &opt->value;
22891         mcpu_fpu_opt = &opt->default_fpu;
22892         if (opt->canonical_name)
22893           strcpy (selected_cpu_name, opt->canonical_name);
22894         else
22895           {
22896             int i;
22897
22898             for (i = 0; i < optlen; i++)
22899               selected_cpu_name[i] = TOUPPER (opt->name[i]);
22900             selected_cpu_name[i] = 0;
22901           }
22902
22903         if (ext != NULL)
22904           return arm_parse_extension (ext, &mcpu_cpu_opt);
22905
22906         return TRUE;
22907       }
22908
22909   as_bad (_("unknown cpu `%s'"), str);
22910   return FALSE;
22911 }
22912
22913 static bfd_boolean
22914 arm_parse_arch (char * str)
22915 {
22916   const struct arm_arch_option_table *opt;
22917   char *ext = strchr (str, '+');
22918   int optlen;
22919
22920   if (ext != NULL)
22921     optlen = ext - str;
22922   else
22923     optlen = strlen (str);
22924
22925   if (optlen == 0)
22926     {
22927       as_bad (_("missing architecture name `%s'"), str);
22928       return FALSE;
22929     }
22930
22931   for (opt = arm_archs; opt->name != NULL; opt++)
22932     if (strncmp (opt->name, str, optlen) == 0)
22933       {
22934         march_cpu_opt = &opt->value;
22935         march_fpu_opt = &opt->default_fpu;
22936         strcpy (selected_cpu_name, opt->name);
22937
22938         if (ext != NULL)
22939           return arm_parse_extension (ext, &march_cpu_opt);
22940
22941         return TRUE;
22942       }
22943
22944   as_bad (_("unknown architecture `%s'\n"), str);
22945   return FALSE;
22946 }
22947
22948 static bfd_boolean
22949 arm_parse_fpu (char * str)
22950 {
22951   const struct arm_option_fpu_value_table * opt;
22952
22953   for (opt = arm_fpus; opt->name != NULL; opt++)
22954     if (streq (opt->name, str))
22955       {
22956         mfpu_opt = &opt->value;
22957         return TRUE;
22958       }
22959
22960   as_bad (_("unknown floating point format `%s'\n"), str);
22961   return FALSE;
22962 }
22963
22964 static bfd_boolean
22965 arm_parse_float_abi (char * str)
22966 {
22967   const struct arm_option_value_table * opt;
22968
22969   for (opt = arm_float_abis; opt->name != NULL; opt++)
22970     if (streq (opt->name, str))
22971       {
22972         mfloat_abi_opt = opt->value;
22973         return TRUE;
22974       }
22975
22976   as_bad (_("unknown floating point abi `%s'\n"), str);
22977   return FALSE;
22978 }
22979
22980 #ifdef OBJ_ELF
22981 static bfd_boolean
22982 arm_parse_eabi (char * str)
22983 {
22984   const struct arm_option_value_table *opt;
22985
22986   for (opt = arm_eabis; opt->name != NULL; opt++)
22987     if (streq (opt->name, str))
22988       {
22989         meabi_flags = opt->value;
22990         return TRUE;
22991       }
22992   as_bad (_("unknown EABI `%s'\n"), str);
22993   return FALSE;
22994 }
22995 #endif
22996
22997 static bfd_boolean
22998 arm_parse_it_mode (char * str)
22999 {
23000   bfd_boolean ret = TRUE;
23001
23002   if (streq ("arm", str))
23003     implicit_it_mode = IMPLICIT_IT_MODE_ARM;
23004   else if (streq ("thumb", str))
23005     implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
23006   else if (streq ("always", str))
23007     implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
23008   else if (streq ("never", str))
23009     implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
23010   else
23011     {
23012       as_bad (_("unknown implicit IT mode `%s', should be "\
23013                 "arm, thumb, always, or never."), str);
23014       ret = FALSE;
23015     }
23016
23017   return ret;
23018 }
23019
23020 struct arm_long_option_table arm_long_opts[] =
23021 {
23022   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
23023    arm_parse_cpu, NULL},
23024   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
23025    arm_parse_arch, NULL},
23026   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
23027    arm_parse_fpu, NULL},
23028   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
23029    arm_parse_float_abi, NULL},
23030 #ifdef OBJ_ELF
23031   {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
23032    arm_parse_eabi, NULL},
23033 #endif
23034   {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
23035    arm_parse_it_mode, NULL},
23036   {NULL, NULL, 0, NULL}
23037 };
23038
23039 int
23040 md_parse_option (int c, char * arg)
23041 {
23042   struct arm_option_table *opt;
23043   const struct arm_legacy_option_table *fopt;
23044   struct arm_long_option_table *lopt;
23045
23046   switch (c)
23047     {
23048 #ifdef OPTION_EB
23049     case OPTION_EB:
23050       target_big_endian = 1;
23051       break;
23052 #endif
23053
23054 #ifdef OPTION_EL
23055     case OPTION_EL:
23056       target_big_endian = 0;
23057       break;
23058 #endif
23059
23060     case OPTION_FIX_V4BX:
23061       fix_v4bx = TRUE;
23062       break;
23063
23064     case 'a':
23065       /* Listing option.  Just ignore these, we don't support additional
23066          ones.  */
23067       return 0;
23068
23069     default:
23070       for (opt = arm_opts; opt->option != NULL; opt++)
23071         {
23072           if (c == opt->option[0]
23073               && ((arg == NULL && opt->option[1] == 0)
23074                   || streq (arg, opt->option + 1)))
23075             {
23076               /* If the option is deprecated, tell the user.  */
23077               if (warn_on_deprecated && opt->deprecated != NULL)
23078                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23079                            arg ? arg : "", _(opt->deprecated));
23080
23081               if (opt->var != NULL)
23082                 *opt->var = opt->value;
23083
23084               return 1;
23085             }
23086         }
23087
23088       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
23089         {
23090           if (c == fopt->option[0]
23091               && ((arg == NULL && fopt->option[1] == 0)
23092                   || streq (arg, fopt->option + 1)))
23093             {
23094               /* If the option is deprecated, tell the user.  */
23095               if (warn_on_deprecated && fopt->deprecated != NULL)
23096                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23097                            arg ? arg : "", _(fopt->deprecated));
23098
23099               if (fopt->var != NULL)
23100                 *fopt->var = &fopt->value;
23101
23102               return 1;
23103             }
23104         }
23105
23106       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23107         {
23108           /* These options are expected to have an argument.  */
23109           if (c == lopt->option[0]
23110               && arg != NULL
23111               && strncmp (arg, lopt->option + 1,
23112                           strlen (lopt->option + 1)) == 0)
23113             {
23114               /* If the option is deprecated, tell the user.  */
23115               if (warn_on_deprecated && lopt->deprecated != NULL)
23116                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
23117                            _(lopt->deprecated));
23118
23119               /* Call the sup-option parser.  */
23120               return lopt->func (arg + strlen (lopt->option) - 1);
23121             }
23122         }
23123
23124       return 0;
23125     }
23126
23127   return 1;
23128 }
23129
23130 void
23131 md_show_usage (FILE * fp)
23132 {
23133   struct arm_option_table *opt;
23134   struct arm_long_option_table *lopt;
23135
23136   fprintf (fp, _(" ARM-specific assembler options:\n"));
23137
23138   for (opt = arm_opts; opt->option != NULL; opt++)
23139     if (opt->help != NULL)
23140       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
23141
23142   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23143     if (lopt->help != NULL)
23144       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
23145
23146 #ifdef OPTION_EB
23147   fprintf (fp, _("\
23148   -EB                     assemble code for a big-endian cpu\n"));
23149 #endif
23150
23151 #ifdef OPTION_EL
23152   fprintf (fp, _("\
23153   -EL                     assemble code for a little-endian cpu\n"));
23154 #endif
23155
23156   fprintf (fp, _("\
23157   --fix-v4bx              Allow BX in ARMv4 code\n"));
23158 }
23159
23160
23161 #ifdef OBJ_ELF
23162 typedef struct
23163 {
23164   int val;
23165   arm_feature_set flags;
23166 } cpu_arch_ver_table;
23167
23168 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
23169    least features first.  */
23170 static const cpu_arch_ver_table cpu_arch_ver[] =
23171 {
23172     {1, ARM_ARCH_V4},
23173     {2, ARM_ARCH_V4T},
23174     {3, ARM_ARCH_V5},
23175     {3, ARM_ARCH_V5T},
23176     {4, ARM_ARCH_V5TE},
23177     {5, ARM_ARCH_V5TEJ},
23178     {6, ARM_ARCH_V6},
23179     {9, ARM_ARCH_V6K},
23180     {7, ARM_ARCH_V6Z},
23181     {11, ARM_ARCH_V6M},
23182     {12, ARM_ARCH_V6SM},
23183     {8, ARM_ARCH_V6T2},
23184     {10, ARM_ARCH_V7A},
23185     {10, ARM_ARCH_V7R},
23186     {10, ARM_ARCH_V7M},
23187     {0, ARM_ARCH_NONE}
23188 };
23189
23190 /* Set an attribute if it has not already been set by the user.  */
23191 static void
23192 aeabi_set_attribute_int (int tag, int value)
23193 {
23194   if (tag < 1
23195       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23196       || !attributes_set_explicitly[tag])
23197     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
23198 }
23199
23200 static void
23201 aeabi_set_attribute_string (int tag, const char *value)
23202 {
23203   if (tag < 1
23204       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23205       || !attributes_set_explicitly[tag])
23206     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
23207 }
23208
23209 /* Set the public EABI object attributes.  */
23210 static void
23211 aeabi_set_public_attributes (void)
23212 {
23213   int arch;
23214   int virt_sec = 0;
23215   arm_feature_set flags;
23216   arm_feature_set tmp;
23217   const cpu_arch_ver_table *p;
23218
23219   /* Choose the architecture based on the capabilities of the requested cpu
23220      (if any) and/or the instructions actually used.  */
23221   ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
23222   ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
23223   ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
23224   /*Allow the user to override the reported architecture.  */
23225   if (object_arch)
23226     {
23227       ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
23228       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
23229     }
23230
23231   tmp = flags;
23232   arch = 0;
23233   for (p = cpu_arch_ver; p->val; p++)
23234     {
23235       if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
23236         {
23237           arch = p->val;
23238           ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
23239         }
23240     }
23241
23242   /* The table lookup above finds the last architecture to contribute
23243      a new feature.  Unfortunately, Tag13 is a subset of the union of
23244      v6T2 and v7-M, so it is never seen as contributing a new feature.
23245      We can not search for the last entry which is entirely used,
23246      because if no CPU is specified we build up only those flags
23247      actually used.  Perhaps we should separate out the specified
23248      and implicit cases.  Avoid taking this path for -march=all by
23249      checking for contradictory v7-A / v7-M features.  */
23250   if (arch == 10
23251       && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
23252       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
23253       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
23254     arch = 13;
23255
23256   /* Tag_CPU_name.  */
23257   if (selected_cpu_name[0])
23258     {
23259       char *q;
23260
23261       q = selected_cpu_name;
23262       if (strncmp (q, "armv", 4) == 0)
23263         {
23264           int i;
23265
23266           q += 4;
23267           for (i = 0; q[i]; i++)
23268             q[i] = TOUPPER (q[i]);
23269         }
23270       aeabi_set_attribute_string (Tag_CPU_name, q);
23271     }
23272
23273   /* Tag_CPU_arch.  */
23274   aeabi_set_attribute_int (Tag_CPU_arch, arch);
23275
23276   /* Tag_CPU_arch_profile.  */
23277   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
23278     aeabi_set_attribute_int (Tag_CPU_arch_profile, 'A');
23279   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
23280     aeabi_set_attribute_int (Tag_CPU_arch_profile, 'R');
23281   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
23282     aeabi_set_attribute_int (Tag_CPU_arch_profile, 'M');
23283
23284   /* Tag_ARM_ISA_use.  */
23285   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
23286       || arch == 0)
23287     aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
23288
23289   /* Tag_THUMB_ISA_use.  */
23290   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
23291       || arch == 0)
23292     aeabi_set_attribute_int (Tag_THUMB_ISA_use,
23293         ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
23294
23295   /* Tag_VFP_arch.  */
23296   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
23297     aeabi_set_attribute_int (Tag_VFP_arch,
23298                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
23299                              ? 5 : 6);
23300   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
23301     aeabi_set_attribute_int (Tag_VFP_arch, 3);
23302   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
23303     aeabi_set_attribute_int (Tag_VFP_arch, 4);
23304   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
23305     aeabi_set_attribute_int (Tag_VFP_arch, 2);
23306   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
23307            || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
23308     aeabi_set_attribute_int (Tag_VFP_arch, 1);
23309
23310   /* Tag_ABI_HardFP_use.  */
23311   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
23312       && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
23313     aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
23314
23315   /* Tag_WMMX_arch.  */
23316   if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
23317     aeabi_set_attribute_int (Tag_WMMX_arch, 2);
23318   else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
23319     aeabi_set_attribute_int (Tag_WMMX_arch, 1);
23320
23321   /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
23322   if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
23323     aeabi_set_attribute_int
23324       (Tag_Advanced_SIMD_arch, (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma)
23325                                 ? 2 : 1));
23326   
23327   /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
23328   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16))
23329     aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
23330
23331   /* Tag_DIV_use.  */
23332   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv))
23333     aeabi_set_attribute_int (Tag_DIV_use, 2);
23334   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_div))
23335     aeabi_set_attribute_int (Tag_DIV_use, 0);
23336   else
23337     aeabi_set_attribute_int (Tag_DIV_use, 1);
23338
23339   /* Tag_MP_extension_use.  */
23340   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
23341     aeabi_set_attribute_int (Tag_MPextension_use, 1);
23342
23343   /* Tag Virtualization_use.  */
23344   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
23345     virt_sec |= 1;
23346   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
23347     virt_sec |= 2;
23348   if (virt_sec != 0)
23349     aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
23350 }
23351
23352 /* Add the default contents for the .ARM.attributes section.  */
23353 void
23354 arm_md_end (void)
23355 {
23356   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
23357     return;
23358
23359   aeabi_set_public_attributes ();
23360 }
23361 #endif /* OBJ_ELF */
23362
23363
23364 /* Parse a .cpu directive.  */
23365
23366 static void
23367 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
23368 {
23369   const struct arm_cpu_option_table *opt;
23370   char *name;
23371   char saved_char;
23372
23373   name = input_line_pointer;
23374   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23375     input_line_pointer++;
23376   saved_char = *input_line_pointer;
23377   *input_line_pointer = 0;
23378
23379   /* Skip the first "all" entry.  */
23380   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
23381     if (streq (opt->name, name))
23382       {
23383         mcpu_cpu_opt = &opt->value;
23384         selected_cpu = opt->value;
23385         if (opt->canonical_name)
23386           strcpy (selected_cpu_name, opt->canonical_name);
23387         else
23388           {
23389             int i;
23390             for (i = 0; opt->name[i]; i++)
23391               selected_cpu_name[i] = TOUPPER (opt->name[i]);
23392             selected_cpu_name[i] = 0;
23393           }
23394         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23395         *input_line_pointer = saved_char;
23396         demand_empty_rest_of_line ();
23397         return;
23398       }
23399   as_bad (_("unknown cpu `%s'"), name);
23400   *input_line_pointer = saved_char;
23401   ignore_rest_of_line ();
23402 }
23403
23404
23405 /* Parse a .arch directive.  */
23406
23407 static void
23408 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
23409 {
23410   const struct arm_arch_option_table *opt;
23411   char saved_char;
23412   char *name;
23413
23414   name = input_line_pointer;
23415   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23416     input_line_pointer++;
23417   saved_char = *input_line_pointer;
23418   *input_line_pointer = 0;
23419
23420   /* Skip the first "all" entry.  */
23421   for (opt = arm_archs + 1; opt->name != NULL; opt++)
23422     if (streq (opt->name, name))
23423       {
23424         mcpu_cpu_opt = &opt->value;
23425         selected_cpu = opt->value;
23426         strcpy (selected_cpu_name, opt->name);
23427         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23428         *input_line_pointer = saved_char;
23429         demand_empty_rest_of_line ();
23430         return;
23431       }
23432
23433   as_bad (_("unknown architecture `%s'\n"), name);
23434   *input_line_pointer = saved_char;
23435   ignore_rest_of_line ();
23436 }
23437
23438
23439 /* Parse a .object_arch directive.  */
23440
23441 static void
23442 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
23443 {
23444   const struct arm_arch_option_table *opt;
23445   char saved_char;
23446   char *name;
23447
23448   name = input_line_pointer;
23449   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23450     input_line_pointer++;
23451   saved_char = *input_line_pointer;
23452   *input_line_pointer = 0;
23453
23454   /* Skip the first "all" entry.  */
23455   for (opt = arm_archs + 1; opt->name != NULL; opt++)
23456     if (streq (opt->name, name))
23457       {
23458         object_arch = &opt->value;
23459         *input_line_pointer = saved_char;
23460         demand_empty_rest_of_line ();
23461         return;
23462       }
23463
23464   as_bad (_("unknown architecture `%s'\n"), name);
23465   *input_line_pointer = saved_char;
23466   ignore_rest_of_line ();
23467 }
23468
23469 /* Parse a .arch_extension directive.  */
23470
23471 static void
23472 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
23473 {
23474   const struct arm_option_extension_value_table *opt;
23475   char saved_char;
23476   char *name;
23477   int adding_value = 1;
23478
23479   name = input_line_pointer;
23480   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23481     input_line_pointer++;
23482   saved_char = *input_line_pointer;
23483   *input_line_pointer = 0;
23484
23485   if (strlen (name) >= 2
23486       && strncmp (name, "no", 2) == 0)
23487     {
23488       adding_value = 0;
23489       name += 2;
23490     }
23491
23492   for (opt = arm_extensions; opt->name != NULL; opt++)
23493     if (streq (opt->name, name))
23494       {
23495         if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
23496           {
23497             as_bad (_("architectural extension `%s' is not allowed for the "
23498                       "current base architecture"), name);
23499             break;
23500           }
23501
23502         if (adding_value)
23503           ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
23504         else
23505           ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
23506
23507         mcpu_cpu_opt = &selected_cpu;
23508         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23509         *input_line_pointer = saved_char;
23510         demand_empty_rest_of_line ();
23511         return;
23512       }
23513
23514   if (opt->name == NULL)
23515     as_bad (_("unknown architecture `%s'\n"), name);
23516
23517   *input_line_pointer = saved_char;
23518   ignore_rest_of_line ();
23519 }
23520
23521 /* Parse a .fpu directive.  */
23522
23523 static void
23524 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
23525 {
23526   const struct arm_option_fpu_value_table *opt;
23527   char saved_char;
23528   char *name;
23529
23530   name = input_line_pointer;
23531   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23532     input_line_pointer++;
23533   saved_char = *input_line_pointer;
23534   *input_line_pointer = 0;
23535
23536   for (opt = arm_fpus; opt->name != NULL; opt++)
23537     if (streq (opt->name, name))
23538       {
23539         mfpu_opt = &opt->value;
23540         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23541         *input_line_pointer = saved_char;
23542         demand_empty_rest_of_line ();
23543         return;
23544       }
23545
23546   as_bad (_("unknown floating point format `%s'\n"), name);
23547   *input_line_pointer = saved_char;
23548   ignore_rest_of_line ();
23549 }
23550
23551 /* Copy symbol information.  */
23552
23553 void
23554 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
23555 {
23556   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
23557 }
23558
23559 #ifdef OBJ_ELF
23560 /* Given a symbolic attribute NAME, return the proper integer value.
23561    Returns -1 if the attribute is not known.  */
23562
23563 int
23564 arm_convert_symbolic_attribute (const char *name)
23565 {
23566   static const struct
23567   {
23568     const char * name;
23569     const int    tag;
23570   }
23571   attribute_table[] =
23572     {
23573       /* When you modify this table you should
23574          also modify the list in doc/c-arm.texi.  */
23575 #define T(tag) {#tag, tag}
23576       T (Tag_CPU_raw_name),
23577       T (Tag_CPU_name),
23578       T (Tag_CPU_arch),
23579       T (Tag_CPU_arch_profile),
23580       T (Tag_ARM_ISA_use),
23581       T (Tag_THUMB_ISA_use),
23582       T (Tag_FP_arch),
23583       T (Tag_VFP_arch),
23584       T (Tag_WMMX_arch),
23585       T (Tag_Advanced_SIMD_arch),
23586       T (Tag_PCS_config),
23587       T (Tag_ABI_PCS_R9_use),
23588       T (Tag_ABI_PCS_RW_data),
23589       T (Tag_ABI_PCS_RO_data),
23590       T (Tag_ABI_PCS_GOT_use),
23591       T (Tag_ABI_PCS_wchar_t),
23592       T (Tag_ABI_FP_rounding),
23593       T (Tag_ABI_FP_denormal),
23594       T (Tag_ABI_FP_exceptions),
23595       T (Tag_ABI_FP_user_exceptions),
23596       T (Tag_ABI_FP_number_model),
23597       T (Tag_ABI_align_needed),
23598       T (Tag_ABI_align8_needed),
23599       T (Tag_ABI_align_preserved),
23600       T (Tag_ABI_align8_preserved),
23601       T (Tag_ABI_enum_size),
23602       T (Tag_ABI_HardFP_use),
23603       T (Tag_ABI_VFP_args),
23604       T (Tag_ABI_WMMX_args),
23605       T (Tag_ABI_optimization_goals),
23606       T (Tag_ABI_FP_optimization_goals),
23607       T (Tag_compatibility),
23608       T (Tag_CPU_unaligned_access),
23609       T (Tag_FP_HP_extension),
23610       T (Tag_VFP_HP_extension),
23611       T (Tag_ABI_FP_16bit_format),
23612       T (Tag_MPextension_use),
23613       T (Tag_DIV_use),
23614       T (Tag_nodefaults),
23615       T (Tag_also_compatible_with),
23616       T (Tag_conformance),
23617       T (Tag_T2EE_use),
23618       T (Tag_Virtualization_use),
23619       /* We deliberately do not include Tag_MPextension_use_legacy.  */
23620 #undef T
23621     };
23622   unsigned int i;
23623
23624   if (name == NULL)
23625     return -1;
23626
23627   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
23628     if (streq (name, attribute_table[i].name))
23629       return attribute_table[i].tag;
23630
23631   return -1;
23632 }
23633
23634
23635 /* Apply sym value for relocations only in the case that
23636    they are for local symbols and you have the respective
23637    architectural feature for blx and simple switches.  */
23638 int
23639 arm_apply_sym_value (struct fix * fixP)
23640 {
23641   if (fixP->fx_addsy
23642       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
23643       && !S_IS_EXTERNAL (fixP->fx_addsy))
23644     {
23645       switch (fixP->fx_r_type)
23646         {
23647         case BFD_RELOC_ARM_PCREL_BLX:
23648         case BFD_RELOC_THUMB_PCREL_BRANCH23:
23649           if (ARM_IS_FUNC (fixP->fx_addsy))
23650             return 1;
23651           break;
23652
23653         case BFD_RELOC_ARM_PCREL_CALL:
23654         case BFD_RELOC_THUMB_PCREL_BLX:
23655           if (THUMB_IS_FUNC (fixP->fx_addsy))
23656               return 1;
23657           break;
23658
23659         default:
23660           break;
23661         }
23662
23663     }
23664   return 0;
23665 }
23666 #endif /* OBJ_ELF */