PR gas/12698
[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, 2011
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 static const arm_feature_set arm_arch_v6m_only = ARM_ARCH_V6M_ONLY;
211
212 static const arm_feature_set arm_cext_iwmmxt2 =
213   ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
214 static const arm_feature_set arm_cext_iwmmxt =
215   ARM_FEATURE (0, ARM_CEXT_IWMMXT);
216 static const arm_feature_set arm_cext_xscale =
217   ARM_FEATURE (0, ARM_CEXT_XSCALE);
218 static const arm_feature_set arm_cext_maverick =
219   ARM_FEATURE (0, ARM_CEXT_MAVERICK);
220 static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
221 static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
222 static const arm_feature_set fpu_vfp_ext_v1xd =
223   ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
224 static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
225 static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
226 static const arm_feature_set fpu_vfp_ext_v3xd = ARM_FEATURE (0, FPU_VFP_EXT_V3xD);
227 static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
228 static const arm_feature_set fpu_vfp_ext_d32 =
229   ARM_FEATURE (0, FPU_VFP_EXT_D32);
230 static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
231 static const arm_feature_set fpu_vfp_v3_or_neon_ext =
232   ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
233 static const arm_feature_set fpu_vfp_fp16 = ARM_FEATURE (0, FPU_VFP_EXT_FP16);
234 static const arm_feature_set fpu_neon_ext_fma = ARM_FEATURE (0, FPU_NEON_EXT_FMA);
235 static const arm_feature_set fpu_vfp_ext_fma = ARM_FEATURE (0, FPU_VFP_EXT_FMA);
236
237 static int mfloat_abi_opt = -1;
238 /* Record user cpu selection for object attributes.  */
239 static arm_feature_set selected_cpu = ARM_ARCH_NONE;
240 /* Must be long enough to hold any of the names in arm_cpus.  */
241 static char selected_cpu_name[16];
242
243 /* Return if no cpu was selected on command-line.  */
244 static bfd_boolean
245 no_cpu_selected (void)
246 {
247   return selected_cpu.core == arm_arch_none.core
248     && selected_cpu.coproc == arm_arch_none.coproc;
249 }
250
251 #ifdef OBJ_ELF
252 # ifdef EABI_DEFAULT
253 static int meabi_flags = EABI_DEFAULT;
254 # else
255 static int meabi_flags = EF_ARM_EABI_UNKNOWN;
256 # endif
257
258 static int attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
259
260 bfd_boolean
261 arm_is_eabi (void)
262 {
263   return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
264 }
265 #endif
266
267 #ifdef OBJ_ELF
268 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
269 symbolS * GOT_symbol;
270 #endif
271
272 /* 0: assemble for ARM,
273    1: assemble for Thumb,
274    2: assemble for Thumb even though target CPU does not support thumb
275       instructions.  */
276 static int thumb_mode = 0;
277 /* A value distinct from the possible values for thumb_mode that we
278    can use to record whether thumb_mode has been copied into the
279    tc_frag_data field of a frag.  */
280 #define MODE_RECORDED (1 << 4)
281
282 /* Specifies the intrinsic IT insn behavior mode.  */
283 enum implicit_it_mode
284 {
285   IMPLICIT_IT_MODE_NEVER  = 0x00,
286   IMPLICIT_IT_MODE_ARM    = 0x01,
287   IMPLICIT_IT_MODE_THUMB  = 0x02,
288   IMPLICIT_IT_MODE_ALWAYS = (IMPLICIT_IT_MODE_ARM | IMPLICIT_IT_MODE_THUMB)
289 };
290 static int implicit_it_mode = IMPLICIT_IT_MODE_ARM;
291
292 /* If unified_syntax is true, we are processing the new unified
293    ARM/Thumb syntax.  Important differences from the old ARM mode:
294
295      - Immediate operands do not require a # prefix.
296      - Conditional affixes always appear at the end of the
297        instruction.  (For backward compatibility, those instructions
298        that formerly had them in the middle, continue to accept them
299        there.)
300      - The IT instruction may appear, and if it does is validated
301        against subsequent conditional affixes.  It does not generate
302        machine code.
303
304    Important differences from the old Thumb mode:
305
306      - Immediate operands do not require a # prefix.
307      - Most of the V6T2 instructions are only available in unified mode.
308      - The .N and .W suffixes are recognized and honored (it is an error
309        if they cannot be honored).
310      - All instructions set the flags if and only if they have an 's' affix.
311      - Conditional affixes may be used.  They are validated against
312        preceding IT instructions.  Unlike ARM mode, you cannot use a
313        conditional affix except in the scope of an IT instruction.  */
314
315 static bfd_boolean unified_syntax = FALSE;
316
317 enum neon_el_type
318 {
319   NT_invtype,
320   NT_untyped,
321   NT_integer,
322   NT_float,
323   NT_poly,
324   NT_signed,
325   NT_unsigned
326 };
327
328 struct neon_type_el
329 {
330   enum neon_el_type type;
331   unsigned size;
332 };
333
334 #define NEON_MAX_TYPE_ELS 4
335
336 struct neon_type
337 {
338   struct neon_type_el el[NEON_MAX_TYPE_ELS];
339   unsigned elems;
340 };
341
342 enum it_instruction_type
343 {
344    OUTSIDE_IT_INSN,
345    INSIDE_IT_INSN,
346    INSIDE_IT_LAST_INSN,
347    IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
348                               if inside, should be the last one.  */
349    NEUTRAL_IT_INSN,        /* This could be either inside or outside,
350                               i.e. BKPT and NOP.  */
351    IT_INSN                 /* The IT insn has been parsed.  */
352 };
353
354 struct arm_it
355 {
356   const char *  error;
357   unsigned long instruction;
358   int           size;
359   int           size_req;
360   int           cond;
361   /* "uncond_value" is set to the value in place of the conditional field in
362      unconditional versions of the instruction, or -1 if nothing is
363      appropriate.  */
364   int           uncond_value;
365   struct neon_type vectype;
366   /* This does not indicate an actual NEON instruction, only that
367      the mnemonic accepts neon-style type suffixes.  */
368   int           is_neon;
369   /* Set to the opcode if the instruction needs relaxation.
370      Zero if the instruction is not relaxed.  */
371   unsigned long relax;
372   struct
373   {
374     bfd_reloc_code_real_type type;
375     expressionS              exp;
376     int                      pc_rel;
377   } reloc;
378
379   enum it_instruction_type it_insn_type;
380
381   struct
382   {
383     unsigned reg;
384     signed int imm;
385     struct neon_type_el vectype;
386     unsigned present    : 1;  /* Operand present.  */
387     unsigned isreg      : 1;  /* Operand was a register.  */
388     unsigned immisreg   : 1;  /* .imm field is a second register.  */
389     unsigned isscalar   : 1;  /* Operand is a (Neon) scalar.  */
390     unsigned immisalign : 1;  /* Immediate is an alignment specifier.  */
391     unsigned immisfloat : 1;  /* Immediate was parsed as a float.  */
392     /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
393        instructions. This allows us to disambiguate ARM <-> vector insns.  */
394     unsigned regisimm   : 1;  /* 64-bit immediate, reg forms high 32 bits.  */
395     unsigned isvec      : 1;  /* Is a single, double or quad VFP/Neon reg.  */
396     unsigned isquad     : 1;  /* Operand is Neon quad-precision register.  */
397     unsigned issingle   : 1;  /* Operand is VFP single-precision register.  */
398     unsigned hasreloc   : 1;  /* Operand has relocation suffix.  */
399     unsigned writeback  : 1;  /* Operand has trailing !  */
400     unsigned preind     : 1;  /* Preindexed address.  */
401     unsigned postind    : 1;  /* Postindexed address.  */
402     unsigned negative   : 1;  /* Index register was negated.  */
403     unsigned shifted    : 1;  /* Shift applied to operation.  */
404     unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
405   } operands[6];
406 };
407
408 static struct arm_it inst;
409
410 #define NUM_FLOAT_VALS 8
411
412 const char * fp_const[] =
413 {
414   "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
415 };
416
417 /* Number of littlenums required to hold an extended precision number.  */
418 #define MAX_LITTLENUMS 6
419
420 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
421
422 #define FAIL    (-1)
423 #define SUCCESS (0)
424
425 #define SUFF_S 1
426 #define SUFF_D 2
427 #define SUFF_E 3
428 #define SUFF_P 4
429
430 #define CP_T_X   0x00008000
431 #define CP_T_Y   0x00400000
432
433 #define CONDS_BIT        0x00100000
434 #define LOAD_BIT         0x00100000
435
436 #define DOUBLE_LOAD_FLAG 0x00000001
437
438 struct asm_cond
439 {
440   const char *   template_name;
441   unsigned long  value;
442 };
443
444 #define COND_ALWAYS 0xE
445
446 struct asm_psr
447 {
448   const char *   template_name;
449   unsigned long  field;
450 };
451
452 struct asm_barrier_opt
453 {
454   const char *   template_name;
455   unsigned long  value;
456 };
457
458 /* The bit that distinguishes CPSR and SPSR.  */
459 #define SPSR_BIT   (1 << 22)
460
461 /* The individual PSR flag bits.  */
462 #define PSR_c   (1 << 16)
463 #define PSR_x   (1 << 17)
464 #define PSR_s   (1 << 18)
465 #define PSR_f   (1 << 19)
466
467 struct reloc_entry
468 {
469   char *                    name;
470   bfd_reloc_code_real_type  reloc;
471 };
472
473 enum vfp_reg_pos
474 {
475   VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
476   VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
477 };
478
479 enum vfp_ldstm_type
480 {
481   VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
482 };
483
484 /* Bits for DEFINED field in neon_typed_alias.  */
485 #define NTA_HASTYPE  1
486 #define NTA_HASINDEX 2
487
488 struct neon_typed_alias
489 {
490   unsigned char        defined;
491   unsigned char        index;
492   struct neon_type_el  eltype;
493 };
494
495 /* ARM register categories.  This includes coprocessor numbers and various
496    architecture extensions' registers.  */
497 enum arm_reg_type
498 {
499   REG_TYPE_RN,
500   REG_TYPE_CP,
501   REG_TYPE_CN,
502   REG_TYPE_FN,
503   REG_TYPE_VFS,
504   REG_TYPE_VFD,
505   REG_TYPE_NQ,
506   REG_TYPE_VFSD,
507   REG_TYPE_NDQ,
508   REG_TYPE_NSDQ,
509   REG_TYPE_VFC,
510   REG_TYPE_MVF,
511   REG_TYPE_MVD,
512   REG_TYPE_MVFX,
513   REG_TYPE_MVDX,
514   REG_TYPE_MVAX,
515   REG_TYPE_DSPSC,
516   REG_TYPE_MMXWR,
517   REG_TYPE_MMXWC,
518   REG_TYPE_MMXWCG,
519   REG_TYPE_XSCALE,
520   REG_TYPE_RNB
521 };
522
523 /* Structure for a hash table entry for a register.
524    If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
525    information which states whether a vector type or index is specified (for a
526    register alias created with .dn or .qn). Otherwise NEON should be NULL.  */
527 struct reg_entry
528 {
529   const char *               name;
530   unsigned int               number;
531   unsigned char              type;
532   unsigned char              builtin;
533   struct neon_typed_alias *  neon;
534 };
535
536 /* Diagnostics used when we don't get a register of the expected type.  */
537 const char * const reg_expected_msgs[] =
538 {
539   N_("ARM register expected"),
540   N_("bad or missing co-processor number"),
541   N_("co-processor register expected"),
542   N_("FPA register expected"),
543   N_("VFP single precision register expected"),
544   N_("VFP/Neon double precision register expected"),
545   N_("Neon quad precision register expected"),
546   N_("VFP single or double precision register expected"),
547   N_("Neon double or quad precision register expected"),
548   N_("VFP single, double or Neon quad precision register expected"),
549   N_("VFP system register expected"),
550   N_("Maverick MVF register expected"),
551   N_("Maverick MVD register expected"),
552   N_("Maverick MVFX register expected"),
553   N_("Maverick MVDX register expected"),
554   N_("Maverick MVAX register expected"),
555   N_("Maverick DSPSC register expected"),
556   N_("iWMMXt data register expected"),
557   N_("iWMMXt control register expected"),
558   N_("iWMMXt scalar register expected"),
559   N_("XScale accumulator register expected"),
560 };
561
562 /* Some well known registers that we refer to directly elsewhere.  */
563 #define REG_SP  13
564 #define REG_LR  14
565 #define REG_PC  15
566
567 /* ARM instructions take 4bytes in the object file, Thumb instructions
568    take 2:  */
569 #define INSN_SIZE       4
570
571 struct asm_opcode
572 {
573   /* Basic string to match.  */
574   const char * template_name;
575
576   /* Parameters to instruction.  */
577   unsigned int operands[8];
578
579   /* Conditional tag - see opcode_lookup.  */
580   unsigned int tag : 4;
581
582   /* Basic instruction code.  */
583   unsigned int avalue : 28;
584
585   /* Thumb-format instruction code.  */
586   unsigned int tvalue;
587
588   /* Which architecture variant provides this instruction.  */
589   const arm_feature_set * avariant;
590   const arm_feature_set * tvariant;
591
592   /* Function to call to encode instruction in ARM format.  */
593   void (* aencode) (void);
594
595   /* Function to call to encode instruction in Thumb format.  */
596   void (* tencode) (void);
597 };
598
599 /* Defines for various bits that we will want to toggle.  */
600 #define INST_IMMEDIATE  0x02000000
601 #define OFFSET_REG      0x02000000
602 #define HWOFFSET_IMM    0x00400000
603 #define SHIFT_BY_REG    0x00000010
604 #define PRE_INDEX       0x01000000
605 #define INDEX_UP        0x00800000
606 #define WRITE_BACK      0x00200000
607 #define LDM_TYPE_2_OR_3 0x00400000
608 #define CPSI_MMOD       0x00020000
609
610 #define LITERAL_MASK    0xf000f000
611 #define OPCODE_MASK     0xfe1fffff
612 #define V4_STR_BIT      0x00000020
613
614 #define T2_SUBS_PC_LR   0xf3de8f00
615
616 #define DATA_OP_SHIFT   21
617
618 #define T2_OPCODE_MASK  0xfe1fffff
619 #define T2_DATA_OP_SHIFT 21
620
621 /* Codes to distinguish the arithmetic instructions.  */
622 #define OPCODE_AND      0
623 #define OPCODE_EOR      1
624 #define OPCODE_SUB      2
625 #define OPCODE_RSB      3
626 #define OPCODE_ADD      4
627 #define OPCODE_ADC      5
628 #define OPCODE_SBC      6
629 #define OPCODE_RSC      7
630 #define OPCODE_TST      8
631 #define OPCODE_TEQ      9
632 #define OPCODE_CMP      10
633 #define OPCODE_CMN      11
634 #define OPCODE_ORR      12
635 #define OPCODE_MOV      13
636 #define OPCODE_BIC      14
637 #define OPCODE_MVN      15
638
639 #define T2_OPCODE_AND   0
640 #define T2_OPCODE_BIC   1
641 #define T2_OPCODE_ORR   2
642 #define T2_OPCODE_ORN   3
643 #define T2_OPCODE_EOR   4
644 #define T2_OPCODE_ADD   8
645 #define T2_OPCODE_ADC   10
646 #define T2_OPCODE_SBC   11
647 #define T2_OPCODE_SUB   13
648 #define T2_OPCODE_RSB   14
649
650 #define T_OPCODE_MUL 0x4340
651 #define T_OPCODE_TST 0x4200
652 #define T_OPCODE_CMN 0x42c0
653 #define T_OPCODE_NEG 0x4240
654 #define T_OPCODE_MVN 0x43c0
655
656 #define T_OPCODE_ADD_R3 0x1800
657 #define T_OPCODE_SUB_R3 0x1a00
658 #define T_OPCODE_ADD_HI 0x4400
659 #define T_OPCODE_ADD_ST 0xb000
660 #define T_OPCODE_SUB_ST 0xb080
661 #define T_OPCODE_ADD_SP 0xa800
662 #define T_OPCODE_ADD_PC 0xa000
663 #define T_OPCODE_ADD_I8 0x3000
664 #define T_OPCODE_SUB_I8 0x3800
665 #define T_OPCODE_ADD_I3 0x1c00
666 #define T_OPCODE_SUB_I3 0x1e00
667
668 #define T_OPCODE_ASR_R  0x4100
669 #define T_OPCODE_LSL_R  0x4080
670 #define T_OPCODE_LSR_R  0x40c0
671 #define T_OPCODE_ROR_R  0x41c0
672 #define T_OPCODE_ASR_I  0x1000
673 #define T_OPCODE_LSL_I  0x0000
674 #define T_OPCODE_LSR_I  0x0800
675
676 #define T_OPCODE_MOV_I8 0x2000
677 #define T_OPCODE_CMP_I8 0x2800
678 #define T_OPCODE_CMP_LR 0x4280
679 #define T_OPCODE_MOV_HR 0x4600
680 #define T_OPCODE_CMP_HR 0x4500
681
682 #define T_OPCODE_LDR_PC 0x4800
683 #define T_OPCODE_LDR_SP 0x9800
684 #define T_OPCODE_STR_SP 0x9000
685 #define T_OPCODE_LDR_IW 0x6800
686 #define T_OPCODE_STR_IW 0x6000
687 #define T_OPCODE_LDR_IH 0x8800
688 #define T_OPCODE_STR_IH 0x8000
689 #define T_OPCODE_LDR_IB 0x7800
690 #define T_OPCODE_STR_IB 0x7000
691 #define T_OPCODE_LDR_RW 0x5800
692 #define T_OPCODE_STR_RW 0x5000
693 #define T_OPCODE_LDR_RH 0x5a00
694 #define T_OPCODE_STR_RH 0x5200
695 #define T_OPCODE_LDR_RB 0x5c00
696 #define T_OPCODE_STR_RB 0x5400
697
698 #define T_OPCODE_PUSH   0xb400
699 #define T_OPCODE_POP    0xbc00
700
701 #define T_OPCODE_BRANCH 0xe000
702
703 #define THUMB_SIZE      2       /* Size of thumb instruction.  */
704 #define THUMB_PP_PC_LR 0x0100
705 #define THUMB_LOAD_BIT 0x0800
706 #define THUMB2_LOAD_BIT 0x00100000
707
708 #define BAD_ARGS        _("bad arguments to instruction")
709 #define BAD_SP          _("r13 not allowed here")
710 #define BAD_PC          _("r15 not allowed here")
711 #define BAD_COND        _("instruction cannot be conditional")
712 #define BAD_OVERLAP     _("registers may not be the same")
713 #define BAD_HIREG       _("lo register required")
714 #define BAD_THUMB32     _("instruction not supported in Thumb16 mode")
715 #define BAD_ADDR_MODE   _("instruction does not accept this addressing mode");
716 #define BAD_BRANCH      _("branch must be last instruction in IT block")
717 #define BAD_NOT_IT      _("instruction not allowed in IT block")
718 #define BAD_FPU         _("selected FPU does not support instruction")
719 #define BAD_OUT_IT      _("thumb conditional instruction should be in IT block")
720 #define BAD_IT_COND     _("incorrect condition in IT block")
721 #define BAD_IT_IT       _("IT falling in the range of a previous IT block")
722 #define MISSING_FNSTART _("missing .fnstart before unwinding directive")
723 #define BAD_PC_ADDRESSING \
724         _("cannot use register index with PC-relative addressing")
725 #define BAD_PC_WRITEBACK \
726         _("cannot use writeback with PC-relative addressing")
727
728 static struct hash_control * arm_ops_hsh;
729 static struct hash_control * arm_cond_hsh;
730 static struct hash_control * arm_shift_hsh;
731 static struct hash_control * arm_psr_hsh;
732 static struct hash_control * arm_v7m_psr_hsh;
733 static struct hash_control * arm_reg_hsh;
734 static struct hash_control * arm_reloc_hsh;
735 static struct hash_control * arm_barrier_opt_hsh;
736
737 /* Stuff needed to resolve the label ambiguity
738    As:
739      ...
740      label:   <insn>
741    may differ from:
742      ...
743      label:
744               <insn>  */
745
746 symbolS *  last_label_seen;
747 static int label_is_thumb_function_name = FALSE;
748
749 /* Literal pool structure.  Held on a per-section
750    and per-sub-section basis.  */
751
752 #define MAX_LITERAL_POOL_SIZE 1024
753 typedef struct literal_pool
754 {
755   expressionS            literals [MAX_LITERAL_POOL_SIZE];
756   unsigned int           next_free_entry;
757   unsigned int           id;
758   symbolS *              symbol;
759   segT                   section;
760   subsegT                sub_section;
761   struct literal_pool *  next;
762 } literal_pool;
763
764 /* Pointer to a linked list of literal pools.  */
765 literal_pool * list_of_pools = NULL;
766
767 #ifdef OBJ_ELF
768 #  define now_it seg_info (now_seg)->tc_segment_info_data.current_it
769 #else
770 static struct current_it now_it;
771 #endif
772
773 static inline int
774 now_it_compatible (int cond)
775 {
776   return (cond & ~1) == (now_it.cc & ~1);
777 }
778
779 static inline int
780 conditional_insn (void)
781 {
782   return inst.cond != COND_ALWAYS;
783 }
784
785 static int in_it_block (void);
786
787 static int handle_it_state (void);
788
789 static void force_automatic_it_block_close (void);
790
791 static void it_fsm_post_encode (void);
792
793 #define set_it_insn_type(type)                  \
794   do                                            \
795     {                                           \
796       inst.it_insn_type = type;                 \
797       if (handle_it_state () == FAIL)           \
798         return;                                 \
799     }                                           \
800   while (0)
801
802 #define set_it_insn_type_nonvoid(type, failret) \
803   do                                            \
804     {                                           \
805       inst.it_insn_type = type;                 \
806       if (handle_it_state () == FAIL)           \
807         return failret;                         \
808     }                                           \
809   while(0)
810
811 #define set_it_insn_type_last()                         \
812   do                                                    \
813     {                                                   \
814       if (inst.cond == COND_ALWAYS)                     \
815         set_it_insn_type (IF_INSIDE_IT_LAST_INSN);      \
816       else                                              \
817         set_it_insn_type (INSIDE_IT_LAST_INSN);         \
818     }                                                   \
819   while (0)
820
821 /* Pure syntax.  */
822
823 /* This array holds the chars that always start a comment.  If the
824    pre-processor is disabled, these aren't very useful.  */
825 const char comment_chars[] = "@";
826
827 /* This array holds the chars that only start a comment at the beginning of
828    a line.  If the line seems to have the form '# 123 filename'
829    .line and .file directives will appear in the pre-processed output.  */
830 /* Note that input_file.c hand checks for '#' at the beginning of the
831    first line of the input file.  This is because the compiler outputs
832    #NO_APP at the beginning of its output.  */
833 /* Also note that comments like this one will always work.  */
834 const char line_comment_chars[] = "#";
835
836 const char line_separator_chars[] = ";";
837
838 /* Chars that can be used to separate mant
839    from exp in floating point numbers.  */
840 const char EXP_CHARS[] = "eE";
841
842 /* Chars that mean this number is a floating point constant.  */
843 /* As in 0f12.456  */
844 /* or    0d1.2345e12  */
845
846 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
847
848 /* Prefix characters that indicate the start of an immediate
849    value.  */
850 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
851
852 /* Separator character handling.  */
853
854 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
855
856 static inline int
857 skip_past_char (char ** str, char c)
858 {
859   if (**str == c)
860     {
861       (*str)++;
862       return SUCCESS;
863     }
864   else
865     return FAIL;
866 }
867
868 #define skip_past_comma(str) skip_past_char (str, ',')
869
870 /* Arithmetic expressions (possibly involving symbols).  */
871
872 /* Return TRUE if anything in the expression is a bignum.  */
873
874 static int
875 walk_no_bignums (symbolS * sp)
876 {
877   if (symbol_get_value_expression (sp)->X_op == O_big)
878     return 1;
879
880   if (symbol_get_value_expression (sp)->X_add_symbol)
881     {
882       return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
883               || (symbol_get_value_expression (sp)->X_op_symbol
884                   && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
885     }
886
887   return 0;
888 }
889
890 static int in_my_get_expression = 0;
891
892 /* Third argument to my_get_expression.  */
893 #define GE_NO_PREFIX 0
894 #define GE_IMM_PREFIX 1
895 #define GE_OPT_PREFIX 2
896 /* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
897    immediates, as can be used in Neon VMVN and VMOV immediate instructions.  */
898 #define GE_OPT_PREFIX_BIG 3
899
900 static int
901 my_get_expression (expressionS * ep, char ** str, int prefix_mode)
902 {
903   char * save_in;
904   segT   seg;
905
906   /* In unified syntax, all prefixes are optional.  */
907   if (unified_syntax)
908     prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
909                   : GE_OPT_PREFIX;
910
911   switch (prefix_mode)
912     {
913     case GE_NO_PREFIX: break;
914     case GE_IMM_PREFIX:
915       if (!is_immediate_prefix (**str))
916         {
917           inst.error = _("immediate expression requires a # prefix");
918           return FAIL;
919         }
920       (*str)++;
921       break;
922     case GE_OPT_PREFIX:
923     case GE_OPT_PREFIX_BIG:
924       if (is_immediate_prefix (**str))
925         (*str)++;
926       break;
927     default: abort ();
928     }
929
930   memset (ep, 0, sizeof (expressionS));
931
932   save_in = input_line_pointer;
933   input_line_pointer = *str;
934   in_my_get_expression = 1;
935   seg = expression (ep);
936   in_my_get_expression = 0;
937
938   if (ep->X_op == O_illegal || ep->X_op == O_absent)
939     {
940       /* We found a bad or missing expression in md_operand().  */
941       *str = input_line_pointer;
942       input_line_pointer = save_in;
943       if (inst.error == NULL)
944         inst.error = (ep->X_op == O_absent
945                       ? _("missing expression") :_("bad expression"));
946       return 1;
947     }
948
949 #ifdef OBJ_AOUT
950   if (seg != absolute_section
951       && seg != text_section
952       && seg != data_section
953       && seg != bss_section
954       && seg != undefined_section)
955     {
956       inst.error = _("bad segment");
957       *str = input_line_pointer;
958       input_line_pointer = save_in;
959       return 1;
960     }
961 #else
962   (void) seg;
963 #endif
964
965   /* Get rid of any bignums now, so that we don't generate an error for which
966      we can't establish a line number later on.  Big numbers are never valid
967      in instructions, which is where this routine is always called.  */
968   if (prefix_mode != GE_OPT_PREFIX_BIG
969       && (ep->X_op == O_big
970           || (ep->X_add_symbol
971               && (walk_no_bignums (ep->X_add_symbol)
972                   || (ep->X_op_symbol
973                       && walk_no_bignums (ep->X_op_symbol))))))
974     {
975       inst.error = _("invalid constant");
976       *str = input_line_pointer;
977       input_line_pointer = save_in;
978       return 1;
979     }
980
981   *str = input_line_pointer;
982   input_line_pointer = save_in;
983   return 0;
984 }
985
986 /* Turn a string in input_line_pointer into a floating point constant
987    of type TYPE, and store the appropriate bytes in *LITP.  The number
988    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
989    returned, or NULL on OK.
990
991    Note that fp constants aren't represent in the normal way on the ARM.
992    In big endian mode, things are as expected.  However, in little endian
993    mode fp constants are big-endian word-wise, and little-endian byte-wise
994    within the words.  For example, (double) 1.1 in big endian mode is
995    the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
996    the byte sequence 99 99 f1 3f 9a 99 99 99.
997
998    ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
999
1000 char *
1001 md_atof (int type, char * litP, int * sizeP)
1002 {
1003   int prec;
1004   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1005   char *t;
1006   int i;
1007
1008   switch (type)
1009     {
1010     case 'f':
1011     case 'F':
1012     case 's':
1013     case 'S':
1014       prec = 2;
1015       break;
1016
1017     case 'd':
1018     case 'D':
1019     case 'r':
1020     case 'R':
1021       prec = 4;
1022       break;
1023
1024     case 'x':
1025     case 'X':
1026       prec = 5;
1027       break;
1028
1029     case 'p':
1030     case 'P':
1031       prec = 5;
1032       break;
1033
1034     default:
1035       *sizeP = 0;
1036       return _("Unrecognized or unsupported floating point constant");
1037     }
1038
1039   t = atof_ieee (input_line_pointer, type, words);
1040   if (t)
1041     input_line_pointer = t;
1042   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1043
1044   if (target_big_endian)
1045     {
1046       for (i = 0; i < prec; i++)
1047         {
1048           md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1049           litP += sizeof (LITTLENUM_TYPE);
1050         }
1051     }
1052   else
1053     {
1054       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
1055         for (i = prec - 1; i >= 0; i--)
1056           {
1057             md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1058             litP += sizeof (LITTLENUM_TYPE);
1059           }
1060       else
1061         /* For a 4 byte float the order of elements in `words' is 1 0.
1062            For an 8 byte float the order is 1 0 3 2.  */
1063         for (i = 0; i < prec; i += 2)
1064           {
1065             md_number_to_chars (litP, (valueT) words[i + 1],
1066                                 sizeof (LITTLENUM_TYPE));
1067             md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1068                                 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1069             litP += 2 * sizeof (LITTLENUM_TYPE);
1070           }
1071     }
1072
1073   return NULL;
1074 }
1075
1076 /* We handle all bad expressions here, so that we can report the faulty
1077    instruction in the error message.  */
1078 void
1079 md_operand (expressionS * exp)
1080 {
1081   if (in_my_get_expression)
1082     exp->X_op = O_illegal;
1083 }
1084
1085 /* Immediate values.  */
1086
1087 /* Generic immediate-value read function for use in directives.
1088    Accepts anything that 'expression' can fold to a constant.
1089    *val receives the number.  */
1090 #ifdef OBJ_ELF
1091 static int
1092 immediate_for_directive (int *val)
1093 {
1094   expressionS exp;
1095   exp.X_op = O_illegal;
1096
1097   if (is_immediate_prefix (*input_line_pointer))
1098     {
1099       input_line_pointer++;
1100       expression (&exp);
1101     }
1102
1103   if (exp.X_op != O_constant)
1104     {
1105       as_bad (_("expected #constant"));
1106       ignore_rest_of_line ();
1107       return FAIL;
1108     }
1109   *val = exp.X_add_number;
1110   return SUCCESS;
1111 }
1112 #endif
1113
1114 /* Register parsing.  */
1115
1116 /* Generic register parser.  CCP points to what should be the
1117    beginning of a register name.  If it is indeed a valid register
1118    name, advance CCP over it and return the reg_entry structure;
1119    otherwise return NULL.  Does not issue diagnostics.  */
1120
1121 static struct reg_entry *
1122 arm_reg_parse_multi (char **ccp)
1123 {
1124   char *start = *ccp;
1125   char *p;
1126   struct reg_entry *reg;
1127
1128 #ifdef REGISTER_PREFIX
1129   if (*start != REGISTER_PREFIX)
1130     return NULL;
1131   start++;
1132 #endif
1133 #ifdef OPTIONAL_REGISTER_PREFIX
1134   if (*start == OPTIONAL_REGISTER_PREFIX)
1135     start++;
1136 #endif
1137
1138   p = start;
1139   if (!ISALPHA (*p) || !is_name_beginner (*p))
1140     return NULL;
1141
1142   do
1143     p++;
1144   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1145
1146   reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1147
1148   if (!reg)
1149     return NULL;
1150
1151   *ccp = p;
1152   return reg;
1153 }
1154
1155 static int
1156 arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1157                     enum arm_reg_type type)
1158 {
1159   /* Alternative syntaxes are accepted for a few register classes.  */
1160   switch (type)
1161     {
1162     case REG_TYPE_MVF:
1163     case REG_TYPE_MVD:
1164     case REG_TYPE_MVFX:
1165     case REG_TYPE_MVDX:
1166       /* Generic coprocessor register names are allowed for these.  */
1167       if (reg && reg->type == REG_TYPE_CN)
1168         return reg->number;
1169       break;
1170
1171     case REG_TYPE_CP:
1172       /* For backward compatibility, a bare number is valid here.  */
1173       {
1174         unsigned long processor = strtoul (start, ccp, 10);
1175         if (*ccp != start && processor <= 15)
1176           return processor;
1177       }
1178
1179     case REG_TYPE_MMXWC:
1180       /* WC includes WCG.  ??? I'm not sure this is true for all
1181          instructions that take WC registers.  */
1182       if (reg && reg->type == REG_TYPE_MMXWCG)
1183         return reg->number;
1184       break;
1185
1186     default:
1187       break;
1188     }
1189
1190   return FAIL;
1191 }
1192
1193 /* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1194    return value is the register number or FAIL.  */
1195
1196 static int
1197 arm_reg_parse (char **ccp, enum arm_reg_type type)
1198 {
1199   char *start = *ccp;
1200   struct reg_entry *reg = arm_reg_parse_multi (ccp);
1201   int ret;
1202
1203   /* Do not allow a scalar (reg+index) to parse as a register.  */
1204   if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1205     return FAIL;
1206
1207   if (reg && reg->type == type)
1208     return reg->number;
1209
1210   if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1211     return ret;
1212
1213   *ccp = start;
1214   return FAIL;
1215 }
1216
1217 /* Parse a Neon type specifier. *STR should point at the leading '.'
1218    character. Does no verification at this stage that the type fits the opcode
1219    properly. E.g.,
1220
1221      .i32.i32.s16
1222      .s32.f32
1223      .u16
1224
1225    Can all be legally parsed by this function.
1226
1227    Fills in neon_type struct pointer with parsed information, and updates STR
1228    to point after the parsed type specifier. Returns SUCCESS if this was a legal
1229    type, FAIL if not.  */
1230
1231 static int
1232 parse_neon_type (struct neon_type *type, char **str)
1233 {
1234   char *ptr = *str;
1235
1236   if (type)
1237     type->elems = 0;
1238
1239   while (type->elems < NEON_MAX_TYPE_ELS)
1240     {
1241       enum neon_el_type thistype = NT_untyped;
1242       unsigned thissize = -1u;
1243
1244       if (*ptr != '.')
1245         break;
1246
1247       ptr++;
1248
1249       /* Just a size without an explicit type.  */
1250       if (ISDIGIT (*ptr))
1251         goto parsesize;
1252
1253       switch (TOLOWER (*ptr))
1254         {
1255         case 'i': thistype = NT_integer; break;
1256         case 'f': thistype = NT_float; break;
1257         case 'p': thistype = NT_poly; break;
1258         case 's': thistype = NT_signed; break;
1259         case 'u': thistype = NT_unsigned; break;
1260         case 'd':
1261           thistype = NT_float;
1262           thissize = 64;
1263           ptr++;
1264           goto done;
1265         default:
1266           as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1267           return FAIL;
1268         }
1269
1270       ptr++;
1271
1272       /* .f is an abbreviation for .f32.  */
1273       if (thistype == NT_float && !ISDIGIT (*ptr))
1274         thissize = 32;
1275       else
1276         {
1277         parsesize:
1278           thissize = strtoul (ptr, &ptr, 10);
1279
1280           if (thissize != 8 && thissize != 16 && thissize != 32
1281               && thissize != 64)
1282             {
1283               as_bad (_("bad size %d in type specifier"), thissize);
1284               return FAIL;
1285             }
1286         }
1287
1288       done:
1289       if (type)
1290         {
1291           type->el[type->elems].type = thistype;
1292           type->el[type->elems].size = thissize;
1293           type->elems++;
1294         }
1295     }
1296
1297   /* Empty/missing type is not a successful parse.  */
1298   if (type->elems == 0)
1299     return FAIL;
1300
1301   *str = ptr;
1302
1303   return SUCCESS;
1304 }
1305
1306 /* Errors may be set multiple times during parsing or bit encoding
1307    (particularly in the Neon bits), but usually the earliest error which is set
1308    will be the most meaningful. Avoid overwriting it with later (cascading)
1309    errors by calling this function.  */
1310
1311 static void
1312 first_error (const char *err)
1313 {
1314   if (!inst.error)
1315     inst.error = err;
1316 }
1317
1318 /* Parse a single type, e.g. ".s32", leading period included.  */
1319 static int
1320 parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1321 {
1322   char *str = *ccp;
1323   struct neon_type optype;
1324
1325   if (*str == '.')
1326     {
1327       if (parse_neon_type (&optype, &str) == SUCCESS)
1328         {
1329           if (optype.elems == 1)
1330             *vectype = optype.el[0];
1331           else
1332             {
1333               first_error (_("only one type should be specified for operand"));
1334               return FAIL;
1335             }
1336         }
1337       else
1338         {
1339           first_error (_("vector type expected"));
1340           return FAIL;
1341         }
1342     }
1343   else
1344     return FAIL;
1345
1346   *ccp = str;
1347
1348   return SUCCESS;
1349 }
1350
1351 /* Special meanings for indices (which have a range of 0-7), which will fit into
1352    a 4-bit integer.  */
1353
1354 #define NEON_ALL_LANES          15
1355 #define NEON_INTERLEAVE_LANES   14
1356
1357 /* Parse either a register or a scalar, with an optional type. Return the
1358    register number, and optionally fill in the actual type of the register
1359    when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1360    type/index information in *TYPEINFO.  */
1361
1362 static int
1363 parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1364                            enum arm_reg_type *rtype,
1365                            struct neon_typed_alias *typeinfo)
1366 {
1367   char *str = *ccp;
1368   struct reg_entry *reg = arm_reg_parse_multi (&str);
1369   struct neon_typed_alias atype;
1370   struct neon_type_el parsetype;
1371
1372   atype.defined = 0;
1373   atype.index = -1;
1374   atype.eltype.type = NT_invtype;
1375   atype.eltype.size = -1;
1376
1377   /* Try alternate syntax for some types of register. Note these are mutually
1378      exclusive with the Neon syntax extensions.  */
1379   if (reg == NULL)
1380     {
1381       int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1382       if (altreg != FAIL)
1383         *ccp = str;
1384       if (typeinfo)
1385         *typeinfo = atype;
1386       return altreg;
1387     }
1388
1389   /* Undo polymorphism when a set of register types may be accepted.  */
1390   if ((type == REG_TYPE_NDQ
1391        && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1392       || (type == REG_TYPE_VFSD
1393           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1394       || (type == REG_TYPE_NSDQ
1395           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1396               || reg->type == REG_TYPE_NQ))
1397       || (type == REG_TYPE_MMXWC
1398           && (reg->type == REG_TYPE_MMXWCG)))
1399     type = (enum arm_reg_type) reg->type;
1400
1401   if (type != reg->type)
1402     return FAIL;
1403
1404   if (reg->neon)
1405     atype = *reg->neon;
1406
1407   if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1408     {
1409       if ((atype.defined & NTA_HASTYPE) != 0)
1410         {
1411           first_error (_("can't redefine type for operand"));
1412           return FAIL;
1413         }
1414       atype.defined |= NTA_HASTYPE;
1415       atype.eltype = parsetype;
1416     }
1417
1418   if (skip_past_char (&str, '[') == SUCCESS)
1419     {
1420       if (type != REG_TYPE_VFD)
1421         {
1422           first_error (_("only D registers may be indexed"));
1423           return FAIL;
1424         }
1425
1426       if ((atype.defined & NTA_HASINDEX) != 0)
1427         {
1428           first_error (_("can't change index for operand"));
1429           return FAIL;
1430         }
1431
1432       atype.defined |= NTA_HASINDEX;
1433
1434       if (skip_past_char (&str, ']') == SUCCESS)
1435         atype.index = NEON_ALL_LANES;
1436       else
1437         {
1438           expressionS exp;
1439
1440           my_get_expression (&exp, &str, GE_NO_PREFIX);
1441
1442           if (exp.X_op != O_constant)
1443             {
1444               first_error (_("constant expression required"));
1445               return FAIL;
1446             }
1447
1448           if (skip_past_char (&str, ']') == FAIL)
1449             return FAIL;
1450
1451           atype.index = exp.X_add_number;
1452         }
1453     }
1454
1455   if (typeinfo)
1456     *typeinfo = atype;
1457
1458   if (rtype)
1459     *rtype = type;
1460
1461   *ccp = str;
1462
1463   return reg->number;
1464 }
1465
1466 /* Like arm_reg_parse, but allow allow the following extra features:
1467     - If RTYPE is non-zero, return the (possibly restricted) type of the
1468       register (e.g. Neon double or quad reg when either has been requested).
1469     - If this is a Neon vector type with additional type information, fill
1470       in the struct pointed to by VECTYPE (if non-NULL).
1471    This function will fault on encountering a scalar.  */
1472
1473 static int
1474 arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1475                      enum arm_reg_type *rtype, struct neon_type_el *vectype)
1476 {
1477   struct neon_typed_alias atype;
1478   char *str = *ccp;
1479   int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1480
1481   if (reg == FAIL)
1482     return FAIL;
1483
1484   /* Do not allow regname(... to parse as a register.  */
1485   if (*str == '(')
1486     return FAIL;
1487
1488   /* Do not allow a scalar (reg+index) to parse as a register.  */
1489   if ((atype.defined & NTA_HASINDEX) != 0)
1490     {
1491       first_error (_("register operand expected, but got scalar"));
1492       return FAIL;
1493     }
1494
1495   if (vectype)
1496     *vectype = atype.eltype;
1497
1498   *ccp = str;
1499
1500   return reg;
1501 }
1502
1503 #define NEON_SCALAR_REG(X)      ((X) >> 4)
1504 #define NEON_SCALAR_INDEX(X)    ((X) & 15)
1505
1506 /* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1507    have enough information to be able to do a good job bounds-checking. So, we
1508    just do easy checks here, and do further checks later.  */
1509
1510 static int
1511 parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
1512 {
1513   int reg;
1514   char *str = *ccp;
1515   struct neon_typed_alias atype;
1516
1517   reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
1518
1519   if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
1520     return FAIL;
1521
1522   if (atype.index == NEON_ALL_LANES)
1523     {
1524       first_error (_("scalar must have an index"));
1525       return FAIL;
1526     }
1527   else if (atype.index >= 64 / elsize)
1528     {
1529       first_error (_("scalar index out of range"));
1530       return FAIL;
1531     }
1532
1533   if (type)
1534     *type = atype.eltype;
1535
1536   *ccp = str;
1537
1538   return reg * 16 + atype.index;
1539 }
1540
1541 /* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
1542
1543 static long
1544 parse_reg_list (char ** strp)
1545 {
1546   char * str = * strp;
1547   long   range = 0;
1548   int    another_range;
1549
1550   /* We come back here if we get ranges concatenated by '+' or '|'.  */
1551   do
1552     {
1553       another_range = 0;
1554
1555       if (*str == '{')
1556         {
1557           int in_range = 0;
1558           int cur_reg = -1;
1559
1560           str++;
1561           do
1562             {
1563               int reg;
1564
1565               if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
1566                 {
1567                   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
1568                   return FAIL;
1569                 }
1570
1571               if (in_range)
1572                 {
1573                   int i;
1574
1575                   if (reg <= cur_reg)
1576                     {
1577                       first_error (_("bad range in register list"));
1578                       return FAIL;
1579                     }
1580
1581                   for (i = cur_reg + 1; i < reg; i++)
1582                     {
1583                       if (range & (1 << i))
1584                         as_tsktsk
1585                           (_("Warning: duplicated register (r%d) in register list"),
1586                            i);
1587                       else
1588                         range |= 1 << i;
1589                     }
1590                   in_range = 0;
1591                 }
1592
1593               if (range & (1 << reg))
1594                 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1595                            reg);
1596               else if (reg <= cur_reg)
1597                 as_tsktsk (_("Warning: register range not in ascending order"));
1598
1599               range |= 1 << reg;
1600               cur_reg = reg;
1601             }
1602           while (skip_past_comma (&str) != FAIL
1603                  || (in_range = 1, *str++ == '-'));
1604           str--;
1605
1606           if (*str++ != '}')
1607             {
1608               first_error (_("missing `}'"));
1609               return FAIL;
1610             }
1611         }
1612       else
1613         {
1614           expressionS exp;
1615
1616           if (my_get_expression (&exp, &str, GE_NO_PREFIX))
1617             return FAIL;
1618
1619           if (exp.X_op == O_constant)
1620             {
1621               if (exp.X_add_number
1622                   != (exp.X_add_number & 0x0000ffff))
1623                 {
1624                   inst.error = _("invalid register mask");
1625                   return FAIL;
1626                 }
1627
1628               if ((range & exp.X_add_number) != 0)
1629                 {
1630                   int regno = range & exp.X_add_number;
1631
1632                   regno &= -regno;
1633                   regno = (1 << regno) - 1;
1634                   as_tsktsk
1635                     (_("Warning: duplicated register (r%d) in register list"),
1636                      regno);
1637                 }
1638
1639               range |= exp.X_add_number;
1640             }
1641           else
1642             {
1643               if (inst.reloc.type != 0)
1644                 {
1645                   inst.error = _("expression too complex");
1646                   return FAIL;
1647                 }
1648
1649               memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
1650               inst.reloc.type = BFD_RELOC_ARM_MULTI;
1651               inst.reloc.pc_rel = 0;
1652             }
1653         }
1654
1655       if (*str == '|' || *str == '+')
1656         {
1657           str++;
1658           another_range = 1;
1659         }
1660     }
1661   while (another_range);
1662
1663   *strp = str;
1664   return range;
1665 }
1666
1667 /* Types of registers in a list.  */
1668
1669 enum reg_list_els
1670 {
1671   REGLIST_VFP_S,
1672   REGLIST_VFP_D,
1673   REGLIST_NEON_D
1674 };
1675
1676 /* Parse a VFP register list.  If the string is invalid return FAIL.
1677    Otherwise return the number of registers, and set PBASE to the first
1678    register.  Parses registers of type ETYPE.
1679    If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1680      - Q registers can be used to specify pairs of D registers
1681      - { } can be omitted from around a singleton register list
1682          FIXME: This is not implemented, as it would require backtracking in
1683          some cases, e.g.:
1684            vtbl.8 d3,d4,d5
1685          This could be done (the meaning isn't really ambiguous), but doesn't
1686          fit in well with the current parsing framework.
1687      - 32 D registers may be used (also true for VFPv3).
1688    FIXME: Types are ignored in these register lists, which is probably a
1689    bug.  */
1690
1691 static int
1692 parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
1693 {
1694   char *str = *ccp;
1695   int base_reg;
1696   int new_base;
1697   enum arm_reg_type regtype = (enum arm_reg_type) 0;
1698   int max_regs = 0;
1699   int count = 0;
1700   int warned = 0;
1701   unsigned long mask = 0;
1702   int i;
1703
1704   if (*str != '{')
1705     {
1706       inst.error = _("expecting {");
1707       return FAIL;
1708     }
1709
1710   str++;
1711
1712   switch (etype)
1713     {
1714     case REGLIST_VFP_S:
1715       regtype = REG_TYPE_VFS;
1716       max_regs = 32;
1717       break;
1718
1719     case REGLIST_VFP_D:
1720       regtype = REG_TYPE_VFD;
1721       break;
1722
1723     case REGLIST_NEON_D:
1724       regtype = REG_TYPE_NDQ;
1725       break;
1726     }
1727
1728   if (etype != REGLIST_VFP_S)
1729     {
1730       /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant.  */
1731       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
1732         {
1733           max_regs = 32;
1734           if (thumb_mode)
1735             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1736                                     fpu_vfp_ext_d32);
1737           else
1738             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1739                                     fpu_vfp_ext_d32);
1740         }
1741       else
1742         max_regs = 16;
1743     }
1744
1745   base_reg = max_regs;
1746
1747   do
1748     {
1749       int setmask = 1, addregs = 1;
1750
1751       new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
1752
1753       if (new_base == FAIL)
1754         {
1755           first_error (_(reg_expected_msgs[regtype]));
1756           return FAIL;
1757         }
1758
1759       if (new_base >= max_regs)
1760         {
1761           first_error (_("register out of range in list"));
1762           return FAIL;
1763         }
1764
1765       /* Note: a value of 2 * n is returned for the register Q<n>.  */
1766       if (regtype == REG_TYPE_NQ)
1767         {
1768           setmask = 3;
1769           addregs = 2;
1770         }
1771
1772       if (new_base < base_reg)
1773         base_reg = new_base;
1774
1775       if (mask & (setmask << new_base))
1776         {
1777           first_error (_("invalid register list"));
1778           return FAIL;
1779         }
1780
1781       if ((mask >> new_base) != 0 && ! warned)
1782         {
1783           as_tsktsk (_("register list not in ascending order"));
1784           warned = 1;
1785         }
1786
1787       mask |= setmask << new_base;
1788       count += addregs;
1789
1790       if (*str == '-') /* We have the start of a range expression */
1791         {
1792           int high_range;
1793
1794           str++;
1795
1796           if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
1797               == FAIL)
1798             {
1799               inst.error = gettext (reg_expected_msgs[regtype]);
1800               return FAIL;
1801             }
1802
1803           if (high_range >= max_regs)
1804             {
1805               first_error (_("register out of range in list"));
1806               return FAIL;
1807             }
1808
1809           if (regtype == REG_TYPE_NQ)
1810             high_range = high_range + 1;
1811
1812           if (high_range <= new_base)
1813             {
1814               inst.error = _("register range not in ascending order");
1815               return FAIL;
1816             }
1817
1818           for (new_base += addregs; new_base <= high_range; new_base += addregs)
1819             {
1820               if (mask & (setmask << new_base))
1821                 {
1822                   inst.error = _("invalid register list");
1823                   return FAIL;
1824                 }
1825
1826               mask |= setmask << new_base;
1827               count += addregs;
1828             }
1829         }
1830     }
1831   while (skip_past_comma (&str) != FAIL);
1832
1833   str++;
1834
1835   /* Sanity check -- should have raised a parse error above.  */
1836   if (count == 0 || count > max_regs)
1837     abort ();
1838
1839   *pbase = base_reg;
1840
1841   /* Final test -- the registers must be consecutive.  */
1842   mask >>= base_reg;
1843   for (i = 0; i < count; i++)
1844     {
1845       if ((mask & (1u << i)) == 0)
1846         {
1847           inst.error = _("non-contiguous register range");
1848           return FAIL;
1849         }
1850     }
1851
1852   *ccp = str;
1853
1854   return count;
1855 }
1856
1857 /* True if two alias types are the same.  */
1858
1859 static bfd_boolean
1860 neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1861 {
1862   if (!a && !b)
1863     return TRUE;
1864
1865   if (!a || !b)
1866     return FALSE;
1867
1868   if (a->defined != b->defined)
1869     return FALSE;
1870
1871   if ((a->defined & NTA_HASTYPE) != 0
1872       && (a->eltype.type != b->eltype.type
1873           || a->eltype.size != b->eltype.size))
1874     return FALSE;
1875
1876   if ((a->defined & NTA_HASINDEX) != 0
1877       && (a->index != b->index))
1878     return FALSE;
1879
1880   return TRUE;
1881 }
1882
1883 /* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1884    The base register is put in *PBASE.
1885    The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
1886    the return value.
1887    The register stride (minus one) is put in bit 4 of the return value.
1888    Bits [6:5] encode the list length (minus one).
1889    The type of the list elements is put in *ELTYPE, if non-NULL.  */
1890
1891 #define NEON_LANE(X)            ((X) & 0xf)
1892 #define NEON_REG_STRIDE(X)      ((((X) >> 4) & 1) + 1)
1893 #define NEON_REGLIST_LENGTH(X)  ((((X) >> 5) & 3) + 1)
1894
1895 static int
1896 parse_neon_el_struct_list (char **str, unsigned *pbase,
1897                            struct neon_type_el *eltype)
1898 {
1899   char *ptr = *str;
1900   int base_reg = -1;
1901   int reg_incr = -1;
1902   int count = 0;
1903   int lane = -1;
1904   int leading_brace = 0;
1905   enum arm_reg_type rtype = REG_TYPE_NDQ;
1906   const char *const incr_error = _("register stride must be 1 or 2");
1907   const char *const type_error = _("mismatched element/structure types in list");
1908   struct neon_typed_alias firsttype;
1909
1910   if (skip_past_char (&ptr, '{') == SUCCESS)
1911     leading_brace = 1;
1912
1913   do
1914     {
1915       struct neon_typed_alias atype;
1916       int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1917
1918       if (getreg == FAIL)
1919         {
1920           first_error (_(reg_expected_msgs[rtype]));
1921           return FAIL;
1922         }
1923
1924       if (base_reg == -1)
1925         {
1926           base_reg = getreg;
1927           if (rtype == REG_TYPE_NQ)
1928             {
1929               reg_incr = 1;
1930             }
1931           firsttype = atype;
1932         }
1933       else if (reg_incr == -1)
1934         {
1935           reg_incr = getreg - base_reg;
1936           if (reg_incr < 1 || reg_incr > 2)
1937             {
1938               first_error (_(incr_error));
1939               return FAIL;
1940             }
1941         }
1942       else if (getreg != base_reg + reg_incr * count)
1943         {
1944           first_error (_(incr_error));
1945           return FAIL;
1946         }
1947
1948       if (! neon_alias_types_same (&atype, &firsttype))
1949         {
1950           first_error (_(type_error));
1951           return FAIL;
1952         }
1953
1954       /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
1955          modes.  */
1956       if (ptr[0] == '-')
1957         {
1958           struct neon_typed_alias htype;
1959           int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1960           if (lane == -1)
1961             lane = NEON_INTERLEAVE_LANES;
1962           else if (lane != NEON_INTERLEAVE_LANES)
1963             {
1964               first_error (_(type_error));
1965               return FAIL;
1966             }
1967           if (reg_incr == -1)
1968             reg_incr = 1;
1969           else if (reg_incr != 1)
1970             {
1971               first_error (_("don't use Rn-Rm syntax with non-unit stride"));
1972               return FAIL;
1973             }
1974           ptr++;
1975           hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
1976           if (hireg == FAIL)
1977             {
1978               first_error (_(reg_expected_msgs[rtype]));
1979               return FAIL;
1980             }
1981           if (! neon_alias_types_same (&htype, &firsttype))
1982             {
1983               first_error (_(type_error));
1984               return FAIL;
1985             }
1986           count += hireg + dregs - getreg;
1987           continue;
1988         }
1989
1990       /* If we're using Q registers, we can't use [] or [n] syntax.  */
1991       if (rtype == REG_TYPE_NQ)
1992         {
1993           count += 2;
1994           continue;
1995         }
1996
1997       if ((atype.defined & NTA_HASINDEX) != 0)
1998         {
1999           if (lane == -1)
2000             lane = atype.index;
2001           else if (lane != atype.index)
2002             {
2003               first_error (_(type_error));
2004               return FAIL;
2005             }
2006         }
2007       else if (lane == -1)
2008         lane = NEON_INTERLEAVE_LANES;
2009       else if (lane != NEON_INTERLEAVE_LANES)
2010         {
2011           first_error (_(type_error));
2012           return FAIL;
2013         }
2014       count++;
2015     }
2016   while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
2017
2018   /* No lane set by [x]. We must be interleaving structures.  */
2019   if (lane == -1)
2020     lane = NEON_INTERLEAVE_LANES;
2021
2022   /* Sanity check.  */
2023   if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2024       || (count > 1 && reg_incr == -1))
2025     {
2026       first_error (_("error parsing element/structure list"));
2027       return FAIL;
2028     }
2029
2030   if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2031     {
2032       first_error (_("expected }"));
2033       return FAIL;
2034     }
2035
2036   if (reg_incr == -1)
2037     reg_incr = 1;
2038
2039   if (eltype)
2040     *eltype = firsttype.eltype;
2041
2042   *pbase = base_reg;
2043   *str = ptr;
2044
2045   return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2046 }
2047
2048 /* Parse an explicit relocation suffix on an expression.  This is
2049    either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
2050    arm_reloc_hsh contains no entries, so this function can only
2051    succeed if there is no () after the word.  Returns -1 on error,
2052    BFD_RELOC_UNUSED if there wasn't any suffix.  */
2053 static int
2054 parse_reloc (char **str)
2055 {
2056   struct reloc_entry *r;
2057   char *p, *q;
2058
2059   if (**str != '(')
2060     return BFD_RELOC_UNUSED;
2061
2062   p = *str + 1;
2063   q = p;
2064
2065   while (*q && *q != ')' && *q != ',')
2066     q++;
2067   if (*q != ')')
2068     return -1;
2069
2070   if ((r = (struct reloc_entry *)
2071        hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
2072     return -1;
2073
2074   *str = q + 1;
2075   return r->reloc;
2076 }
2077
2078 /* Directives: register aliases.  */
2079
2080 static struct reg_entry *
2081 insert_reg_alias (char *str, unsigned number, int type)
2082 {
2083   struct reg_entry *new_reg;
2084   const char *name;
2085
2086   if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
2087     {
2088       if (new_reg->builtin)
2089         as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
2090
2091       /* Only warn about a redefinition if it's not defined as the
2092          same register.  */
2093       else if (new_reg->number != number || new_reg->type != type)
2094         as_warn (_("ignoring redefinition of register alias '%s'"), str);
2095
2096       return NULL;
2097     }
2098
2099   name = xstrdup (str);
2100   new_reg = (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
2101
2102   new_reg->name = name;
2103   new_reg->number = number;
2104   new_reg->type = type;
2105   new_reg->builtin = FALSE;
2106   new_reg->neon = NULL;
2107
2108   if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
2109     abort ();
2110
2111   return new_reg;
2112 }
2113
2114 static void
2115 insert_neon_reg_alias (char *str, int number, int type,
2116                        struct neon_typed_alias *atype)
2117 {
2118   struct reg_entry *reg = insert_reg_alias (str, number, type);
2119
2120   if (!reg)
2121     {
2122       first_error (_("attempt to redefine typed alias"));
2123       return;
2124     }
2125
2126   if (atype)
2127     {
2128       reg->neon = (struct neon_typed_alias *)
2129           xmalloc (sizeof (struct neon_typed_alias));
2130       *reg->neon = *atype;
2131     }
2132 }
2133
2134 /* Look for the .req directive.  This is of the form:
2135
2136         new_register_name .req existing_register_name
2137
2138    If we find one, or if it looks sufficiently like one that we want to
2139    handle any error here, return TRUE.  Otherwise return FALSE.  */
2140
2141 static bfd_boolean
2142 create_register_alias (char * newname, char *p)
2143 {
2144   struct reg_entry *old;
2145   char *oldname, *nbuf;
2146   size_t nlen;
2147
2148   /* The input scrubber ensures that whitespace after the mnemonic is
2149      collapsed to single spaces.  */
2150   oldname = p;
2151   if (strncmp (oldname, " .req ", 6) != 0)
2152     return FALSE;
2153
2154   oldname += 6;
2155   if (*oldname == '\0')
2156     return FALSE;
2157
2158   old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
2159   if (!old)
2160     {
2161       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2162       return TRUE;
2163     }
2164
2165   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2166      the desired alias name, and p points to its end.  If not, then
2167      the desired alias name is in the global original_case_string.  */
2168 #ifdef TC_CASE_SENSITIVE
2169   nlen = p - newname;
2170 #else
2171   newname = original_case_string;
2172   nlen = strlen (newname);
2173 #endif
2174
2175   nbuf = (char *) alloca (nlen + 1);
2176   memcpy (nbuf, newname, nlen);
2177   nbuf[nlen] = '\0';
2178
2179   /* Create aliases under the new name as stated; an all-lowercase
2180      version of the new name; and an all-uppercase version of the new
2181      name.  */
2182   if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2183     {
2184       for (p = nbuf; *p; p++)
2185         *p = TOUPPER (*p);
2186
2187       if (strncmp (nbuf, newname, nlen))
2188         {
2189           /* If this attempt to create an additional alias fails, do not bother
2190              trying to create the all-lower case alias.  We will fail and issue
2191              a second, duplicate error message.  This situation arises when the
2192              programmer does something like:
2193                foo .req r0
2194                Foo .req r1
2195              The second .req creates the "Foo" alias but then fails to create
2196              the artificial FOO alias because it has already been created by the
2197              first .req.  */
2198           if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2199             return TRUE;
2200         }
2201
2202       for (p = nbuf; *p; p++)
2203         *p = TOLOWER (*p);
2204
2205       if (strncmp (nbuf, newname, nlen))
2206         insert_reg_alias (nbuf, old->number, old->type);
2207     }
2208
2209   return TRUE;
2210 }
2211
2212 /* Create a Neon typed/indexed register alias using directives, e.g.:
2213      X .dn d5.s32[1]
2214      Y .qn 6.s16
2215      Z .dn d7
2216      T .dn Z[0]
2217    These typed registers can be used instead of the types specified after the
2218    Neon mnemonic, so long as all operands given have types. Types can also be
2219    specified directly, e.g.:
2220      vadd d0.s32, d1.s32, d2.s32  */
2221
2222 static bfd_boolean
2223 create_neon_reg_alias (char *newname, char *p)
2224 {
2225   enum arm_reg_type basetype;
2226   struct reg_entry *basereg;
2227   struct reg_entry mybasereg;
2228   struct neon_type ntype;
2229   struct neon_typed_alias typeinfo;
2230   char *namebuf, *nameend ATTRIBUTE_UNUSED;
2231   int namelen;
2232
2233   typeinfo.defined = 0;
2234   typeinfo.eltype.type = NT_invtype;
2235   typeinfo.eltype.size = -1;
2236   typeinfo.index = -1;
2237
2238   nameend = p;
2239
2240   if (strncmp (p, " .dn ", 5) == 0)
2241     basetype = REG_TYPE_VFD;
2242   else if (strncmp (p, " .qn ", 5) == 0)
2243     basetype = REG_TYPE_NQ;
2244   else
2245     return FALSE;
2246
2247   p += 5;
2248
2249   if (*p == '\0')
2250     return FALSE;
2251
2252   basereg = arm_reg_parse_multi (&p);
2253
2254   if (basereg && basereg->type != basetype)
2255     {
2256       as_bad (_("bad type for register"));
2257       return FALSE;
2258     }
2259
2260   if (basereg == NULL)
2261     {
2262       expressionS exp;
2263       /* Try parsing as an integer.  */
2264       my_get_expression (&exp, &p, GE_NO_PREFIX);
2265       if (exp.X_op != O_constant)
2266         {
2267           as_bad (_("expression must be constant"));
2268           return FALSE;
2269         }
2270       basereg = &mybasereg;
2271       basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2272                                                   : exp.X_add_number;
2273       basereg->neon = 0;
2274     }
2275
2276   if (basereg->neon)
2277     typeinfo = *basereg->neon;
2278
2279   if (parse_neon_type (&ntype, &p) == SUCCESS)
2280     {
2281       /* We got a type.  */
2282       if (typeinfo.defined & NTA_HASTYPE)
2283         {
2284           as_bad (_("can't redefine the type of a register alias"));
2285           return FALSE;
2286         }
2287
2288       typeinfo.defined |= NTA_HASTYPE;
2289       if (ntype.elems != 1)
2290         {
2291           as_bad (_("you must specify a single type only"));
2292           return FALSE;
2293         }
2294       typeinfo.eltype = ntype.el[0];
2295     }
2296
2297   if (skip_past_char (&p, '[') == SUCCESS)
2298     {
2299       expressionS exp;
2300       /* We got a scalar index.  */
2301
2302       if (typeinfo.defined & NTA_HASINDEX)
2303         {
2304           as_bad (_("can't redefine the index of a scalar alias"));
2305           return FALSE;
2306         }
2307
2308       my_get_expression (&exp, &p, GE_NO_PREFIX);
2309
2310       if (exp.X_op != O_constant)
2311         {
2312           as_bad (_("scalar index must be constant"));
2313           return FALSE;
2314         }
2315
2316       typeinfo.defined |= NTA_HASINDEX;
2317       typeinfo.index = exp.X_add_number;
2318
2319       if (skip_past_char (&p, ']') == FAIL)
2320         {
2321           as_bad (_("expecting ]"));
2322           return FALSE;
2323         }
2324     }
2325
2326   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2327      the desired alias name, and p points to its end.  If not, then
2328      the desired alias name is in the global original_case_string.  */
2329 #ifdef TC_CASE_SENSITIVE
2330   namelen = nameend - newname;
2331 #else
2332   newname = original_case_string;
2333   namelen = strlen (newname);
2334 #endif
2335
2336   namebuf = (char *) alloca (namelen + 1);
2337   strncpy (namebuf, newname, namelen);
2338   namebuf[namelen] = '\0';
2339
2340   insert_neon_reg_alias (namebuf, basereg->number, basetype,
2341                          typeinfo.defined != 0 ? &typeinfo : NULL);
2342
2343   /* Insert name in all uppercase.  */
2344   for (p = namebuf; *p; p++)
2345     *p = TOUPPER (*p);
2346
2347   if (strncmp (namebuf, newname, namelen))
2348     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2349                            typeinfo.defined != 0 ? &typeinfo : NULL);
2350
2351   /* Insert name in all lowercase.  */
2352   for (p = namebuf; *p; p++)
2353     *p = TOLOWER (*p);
2354
2355   if (strncmp (namebuf, newname, namelen))
2356     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2357                            typeinfo.defined != 0 ? &typeinfo : NULL);
2358
2359   return TRUE;
2360 }
2361
2362 /* Should never be called, as .req goes between the alias and the
2363    register name, not at the beginning of the line.  */
2364
2365 static void
2366 s_req (int a ATTRIBUTE_UNUSED)
2367 {
2368   as_bad (_("invalid syntax for .req directive"));
2369 }
2370
2371 static void
2372 s_dn (int a ATTRIBUTE_UNUSED)
2373 {
2374   as_bad (_("invalid syntax for .dn directive"));
2375 }
2376
2377 static void
2378 s_qn (int a ATTRIBUTE_UNUSED)
2379 {
2380   as_bad (_("invalid syntax for .qn directive"));
2381 }
2382
2383 /* The .unreq directive deletes an alias which was previously defined
2384    by .req.  For example:
2385
2386        my_alias .req r11
2387        .unreq my_alias    */
2388
2389 static void
2390 s_unreq (int a ATTRIBUTE_UNUSED)
2391 {
2392   char * name;
2393   char saved_char;
2394
2395   name = input_line_pointer;
2396
2397   while (*input_line_pointer != 0
2398          && *input_line_pointer != ' '
2399          && *input_line_pointer != '\n')
2400     ++input_line_pointer;
2401
2402   saved_char = *input_line_pointer;
2403   *input_line_pointer = 0;
2404
2405   if (!*name)
2406     as_bad (_("invalid syntax for .unreq directive"));
2407   else
2408     {
2409       struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2410                                                               name);
2411
2412       if (!reg)
2413         as_bad (_("unknown register alias '%s'"), name);
2414       else if (reg->builtin)
2415         as_warn (_("ignoring attempt to use .unreq on fixed register name: '%s'"),
2416                  name);
2417       else
2418         {
2419           char * p;
2420           char * nbuf;
2421
2422           hash_delete (arm_reg_hsh, name, FALSE);
2423           free ((char *) reg->name);
2424           if (reg->neon)
2425             free (reg->neon);
2426           free (reg);
2427
2428           /* Also locate the all upper case and all lower case versions.
2429              Do not complain if we cannot find one or the other as it
2430              was probably deleted above.  */
2431
2432           nbuf = strdup (name);
2433           for (p = nbuf; *p; p++)
2434             *p = TOUPPER (*p);
2435           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2436           if (reg)
2437             {
2438               hash_delete (arm_reg_hsh, nbuf, FALSE);
2439               free ((char *) reg->name);
2440               if (reg->neon)
2441                 free (reg->neon);
2442               free (reg);
2443             }
2444
2445           for (p = nbuf; *p; p++)
2446             *p = TOLOWER (*p);
2447           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2448           if (reg)
2449             {
2450               hash_delete (arm_reg_hsh, nbuf, FALSE);
2451               free ((char *) reg->name);
2452               if (reg->neon)
2453                 free (reg->neon);
2454               free (reg);
2455             }
2456
2457           free (nbuf);
2458         }
2459     }
2460
2461   *input_line_pointer = saved_char;
2462   demand_empty_rest_of_line ();
2463 }
2464
2465 /* Directives: Instruction set selection.  */
2466
2467 #ifdef OBJ_ELF
2468 /* This code is to handle mapping symbols as defined in the ARM ELF spec.
2469    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2470    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2471    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
2472
2473 /* Create a new mapping symbol for the transition to STATE.  */
2474
2475 static void
2476 make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
2477 {
2478   symbolS * symbolP;
2479   const char * symname;
2480   int type;
2481
2482   switch (state)
2483     {
2484     case MAP_DATA:
2485       symname = "$d";
2486       type = BSF_NO_FLAGS;
2487       break;
2488     case MAP_ARM:
2489       symname = "$a";
2490       type = BSF_NO_FLAGS;
2491       break;
2492     case MAP_THUMB:
2493       symname = "$t";
2494       type = BSF_NO_FLAGS;
2495       break;
2496     default:
2497       abort ();
2498     }
2499
2500   symbolP = symbol_new (symname, now_seg, value, frag);
2501   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2502
2503   switch (state)
2504     {
2505     case MAP_ARM:
2506       THUMB_SET_FUNC (symbolP, 0);
2507       ARM_SET_THUMB (symbolP, 0);
2508       ARM_SET_INTERWORK (symbolP, support_interwork);
2509       break;
2510
2511     case MAP_THUMB:
2512       THUMB_SET_FUNC (symbolP, 1);
2513       ARM_SET_THUMB (symbolP, 1);
2514       ARM_SET_INTERWORK (symbolP, support_interwork);
2515       break;
2516
2517     case MAP_DATA:
2518     default:
2519       break;
2520     }
2521
2522   /* Save the mapping symbols for future reference.  Also check that
2523      we do not place two mapping symbols at the same offset within a
2524      frag.  We'll handle overlap between frags in
2525      check_mapping_symbols.
2526
2527      If .fill or other data filling directive generates zero sized data,
2528      the mapping symbol for the following code will have the same value
2529      as the one generated for the data filling directive.  In this case,
2530      we replace the old symbol with the new one at the same address.  */
2531   if (value == 0)
2532     {
2533       if (frag->tc_frag_data.first_map != NULL)
2534         {
2535           know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2536           symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2537         }
2538       frag->tc_frag_data.first_map = symbolP;
2539     }
2540   if (frag->tc_frag_data.last_map != NULL)
2541     {
2542       know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
2543       if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2544         symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2545     }
2546   frag->tc_frag_data.last_map = symbolP;
2547 }
2548
2549 /* We must sometimes convert a region marked as code to data during
2550    code alignment, if an odd number of bytes have to be padded.  The
2551    code mapping symbol is pushed to an aligned address.  */
2552
2553 static void
2554 insert_data_mapping_symbol (enum mstate state,
2555                             valueT value, fragS *frag, offsetT bytes)
2556 {
2557   /* If there was already a mapping symbol, remove it.  */
2558   if (frag->tc_frag_data.last_map != NULL
2559       && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2560     {
2561       symbolS *symp = frag->tc_frag_data.last_map;
2562
2563       if (value == 0)
2564         {
2565           know (frag->tc_frag_data.first_map == symp);
2566           frag->tc_frag_data.first_map = NULL;
2567         }
2568       frag->tc_frag_data.last_map = NULL;
2569       symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2570     }
2571
2572   make_mapping_symbol (MAP_DATA, value, frag);
2573   make_mapping_symbol (state, value + bytes, frag);
2574 }
2575
2576 static void mapping_state_2 (enum mstate state, int max_chars);
2577
2578 /* Set the mapping state to STATE.  Only call this when about to
2579    emit some STATE bytes to the file.  */
2580
2581 void
2582 mapping_state (enum mstate state)
2583 {
2584   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2585
2586 #define TRANSITION(from, to) (mapstate == (from) && state == (to))
2587
2588   if (mapstate == state)
2589     /* The mapping symbol has already been emitted.
2590        There is nothing else to do.  */
2591     return;
2592   else if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
2593     /* This case will be evaluated later in the next else.  */
2594     return;
2595   else if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2596           || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2597     {
2598       /* Only add the symbol if the offset is > 0:
2599          if we're at the first frag, check it's size > 0;
2600          if we're not at the first frag, then for sure
2601             the offset is > 0.  */
2602       struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2603       const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2604
2605       if (add_symbol)
2606         make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2607     }
2608
2609   mapping_state_2 (state, 0);
2610 #undef TRANSITION
2611 }
2612
2613 /* Same as mapping_state, but MAX_CHARS bytes have already been
2614    allocated.  Put the mapping symbol that far back.  */
2615
2616 static void
2617 mapping_state_2 (enum mstate state, int max_chars)
2618 {
2619   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2620
2621   if (!SEG_NORMAL (now_seg))
2622     return;
2623
2624   if (mapstate == state)
2625     /* The mapping symbol has already been emitted.
2626        There is nothing else to do.  */
2627     return;
2628
2629   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2630   make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
2631 }
2632 #else
2633 #define mapping_state(x) ((void)0)
2634 #define mapping_state_2(x, y) ((void)0)
2635 #endif
2636
2637 /* Find the real, Thumb encoded start of a Thumb function.  */
2638
2639 #ifdef OBJ_COFF
2640 static symbolS *
2641 find_real_start (symbolS * symbolP)
2642 {
2643   char *       real_start;
2644   const char * name = S_GET_NAME (symbolP);
2645   symbolS *    new_target;
2646
2647   /* This definition must agree with the one in gcc/config/arm/thumb.c.  */
2648 #define STUB_NAME ".real_start_of"
2649
2650   if (name == NULL)
2651     abort ();
2652
2653   /* The compiler may generate BL instructions to local labels because
2654      it needs to perform a branch to a far away location. These labels
2655      do not have a corresponding ".real_start_of" label.  We check
2656      both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2657      the ".real_start_of" convention for nonlocal branches.  */
2658   if (S_IS_LOCAL (symbolP) || name[0] == '.')
2659     return symbolP;
2660
2661   real_start = ACONCAT ((STUB_NAME, name, NULL));
2662   new_target = symbol_find (real_start);
2663
2664   if (new_target == NULL)
2665     {
2666       as_warn (_("Failed to find real start of function: %s\n"), name);
2667       new_target = symbolP;
2668     }
2669
2670   return new_target;
2671 }
2672 #endif
2673
2674 static void
2675 opcode_select (int width)
2676 {
2677   switch (width)
2678     {
2679     case 16:
2680       if (! thumb_mode)
2681         {
2682           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
2683             as_bad (_("selected processor does not support THUMB opcodes"));
2684
2685           thumb_mode = 1;
2686           /* No need to force the alignment, since we will have been
2687              coming from ARM mode, which is word-aligned.  */
2688           record_alignment (now_seg, 1);
2689         }
2690       break;
2691
2692     case 32:
2693       if (thumb_mode)
2694         {
2695           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
2696             as_bad (_("selected processor does not support ARM opcodes"));
2697
2698           thumb_mode = 0;
2699
2700           if (!need_pass_2)
2701             frag_align (2, 0, 0);
2702
2703           record_alignment (now_seg, 1);
2704         }
2705       break;
2706
2707     default:
2708       as_bad (_("invalid instruction size selected (%d)"), width);
2709     }
2710 }
2711
2712 static void
2713 s_arm (int ignore ATTRIBUTE_UNUSED)
2714 {
2715   opcode_select (32);
2716   demand_empty_rest_of_line ();
2717 }
2718
2719 static void
2720 s_thumb (int ignore ATTRIBUTE_UNUSED)
2721 {
2722   opcode_select (16);
2723   demand_empty_rest_of_line ();
2724 }
2725
2726 static void
2727 s_code (int unused ATTRIBUTE_UNUSED)
2728 {
2729   int temp;
2730
2731   temp = get_absolute_expression ();
2732   switch (temp)
2733     {
2734     case 16:
2735     case 32:
2736       opcode_select (temp);
2737       break;
2738
2739     default:
2740       as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2741     }
2742 }
2743
2744 static void
2745 s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2746 {
2747   /* If we are not already in thumb mode go into it, EVEN if
2748      the target processor does not support thumb instructions.
2749      This is used by gcc/config/arm/lib1funcs.asm for example
2750      to compile interworking support functions even if the
2751      target processor should not support interworking.  */
2752   if (! thumb_mode)
2753     {
2754       thumb_mode = 2;
2755       record_alignment (now_seg, 1);
2756     }
2757
2758   demand_empty_rest_of_line ();
2759 }
2760
2761 static void
2762 s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2763 {
2764   s_thumb (0);
2765
2766   /* The following label is the name/address of the start of a Thumb function.
2767      We need to know this for the interworking support.  */
2768   label_is_thumb_function_name = TRUE;
2769 }
2770
2771 /* Perform a .set directive, but also mark the alias as
2772    being a thumb function.  */
2773
2774 static void
2775 s_thumb_set (int equiv)
2776 {
2777   /* XXX the following is a duplicate of the code for s_set() in read.c
2778      We cannot just call that code as we need to get at the symbol that
2779      is created.  */
2780   char *    name;
2781   char      delim;
2782   char *    end_name;
2783   symbolS * symbolP;
2784
2785   /* Especial apologies for the random logic:
2786      This just grew, and could be parsed much more simply!
2787      Dean - in haste.  */
2788   name      = input_line_pointer;
2789   delim     = get_symbol_end ();
2790   end_name  = input_line_pointer;
2791   *end_name = delim;
2792
2793   if (*input_line_pointer != ',')
2794     {
2795       *end_name = 0;
2796       as_bad (_("expected comma after name \"%s\""), name);
2797       *end_name = delim;
2798       ignore_rest_of_line ();
2799       return;
2800     }
2801
2802   input_line_pointer++;
2803   *end_name = 0;
2804
2805   if (name[0] == '.' && name[1] == '\0')
2806     {
2807       /* XXX - this should not happen to .thumb_set.  */
2808       abort ();
2809     }
2810
2811   if ((symbolP = symbol_find (name)) == NULL
2812       && (symbolP = md_undefined_symbol (name)) == NULL)
2813     {
2814 #ifndef NO_LISTING
2815       /* When doing symbol listings, play games with dummy fragments living
2816          outside the normal fragment chain to record the file and line info
2817          for this symbol.  */
2818       if (listing & LISTING_SYMBOLS)
2819         {
2820           extern struct list_info_struct * listing_tail;
2821           fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
2822
2823           memset (dummy_frag, 0, sizeof (fragS));
2824           dummy_frag->fr_type = rs_fill;
2825           dummy_frag->line = listing_tail;
2826           symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2827           dummy_frag->fr_symbol = symbolP;
2828         }
2829       else
2830 #endif
2831         symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2832
2833 #ifdef OBJ_COFF
2834       /* "set" symbols are local unless otherwise specified.  */
2835       SF_SET_LOCAL (symbolP);
2836 #endif /* OBJ_COFF  */
2837     }                           /* Make a new symbol.  */
2838
2839   symbol_table_insert (symbolP);
2840
2841   * end_name = delim;
2842
2843   if (equiv
2844       && S_IS_DEFINED (symbolP)
2845       && S_GET_SEGMENT (symbolP) != reg_section)
2846     as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2847
2848   pseudo_set (symbolP);
2849
2850   demand_empty_rest_of_line ();
2851
2852   /* XXX Now we come to the Thumb specific bit of code.  */
2853
2854   THUMB_SET_FUNC (symbolP, 1);
2855   ARM_SET_THUMB (symbolP, 1);
2856 #if defined OBJ_ELF || defined OBJ_COFF
2857   ARM_SET_INTERWORK (symbolP, support_interwork);
2858 #endif
2859 }
2860
2861 /* Directives: Mode selection.  */
2862
2863 /* .syntax [unified|divided] - choose the new unified syntax
2864    (same for Arm and Thumb encoding, modulo slight differences in what
2865    can be represented) or the old divergent syntax for each mode.  */
2866 static void
2867 s_syntax (int unused ATTRIBUTE_UNUSED)
2868 {
2869   char *name, delim;
2870
2871   name = input_line_pointer;
2872   delim = get_symbol_end ();
2873
2874   if (!strcasecmp (name, "unified"))
2875     unified_syntax = TRUE;
2876   else if (!strcasecmp (name, "divided"))
2877     unified_syntax = FALSE;
2878   else
2879     {
2880       as_bad (_("unrecognized syntax mode \"%s\""), name);
2881       return;
2882     }
2883   *input_line_pointer = delim;
2884   demand_empty_rest_of_line ();
2885 }
2886
2887 /* Directives: sectioning and alignment.  */
2888
2889 /* Same as s_align_ptwo but align 0 => align 2.  */
2890
2891 static void
2892 s_align (int unused ATTRIBUTE_UNUSED)
2893 {
2894   int temp;
2895   bfd_boolean fill_p;
2896   long temp_fill;
2897   long max_alignment = 15;
2898
2899   temp = get_absolute_expression ();
2900   if (temp > max_alignment)
2901     as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2902   else if (temp < 0)
2903     {
2904       as_bad (_("alignment negative. 0 assumed."));
2905       temp = 0;
2906     }
2907
2908   if (*input_line_pointer == ',')
2909     {
2910       input_line_pointer++;
2911       temp_fill = get_absolute_expression ();
2912       fill_p = TRUE;
2913     }
2914   else
2915     {
2916       fill_p = FALSE;
2917       temp_fill = 0;
2918     }
2919
2920   if (!temp)
2921     temp = 2;
2922
2923   /* Only make a frag if we HAVE to.  */
2924   if (temp && !need_pass_2)
2925     {
2926       if (!fill_p && subseg_text_p (now_seg))
2927         frag_align_code (temp, 0);
2928       else
2929         frag_align (temp, (int) temp_fill, 0);
2930     }
2931   demand_empty_rest_of_line ();
2932
2933   record_alignment (now_seg, temp);
2934 }
2935
2936 static void
2937 s_bss (int ignore ATTRIBUTE_UNUSED)
2938 {
2939   /* We don't support putting frags in the BSS segment, we fake it by
2940      marking in_bss, then looking at s_skip for clues.  */
2941   subseg_set (bss_section, 0);
2942   demand_empty_rest_of_line ();
2943
2944 #ifdef md_elf_section_change_hook
2945   md_elf_section_change_hook ();
2946 #endif
2947 }
2948
2949 static void
2950 s_even (int ignore ATTRIBUTE_UNUSED)
2951 {
2952   /* Never make frag if expect extra pass.  */
2953   if (!need_pass_2)
2954     frag_align (1, 0, 0);
2955
2956   record_alignment (now_seg, 1);
2957
2958   demand_empty_rest_of_line ();
2959 }
2960
2961 /* Directives: Literal pools.  */
2962
2963 static literal_pool *
2964 find_literal_pool (void)
2965 {
2966   literal_pool * pool;
2967
2968   for (pool = list_of_pools; pool != NULL; pool = pool->next)
2969     {
2970       if (pool->section == now_seg
2971           && pool->sub_section == now_subseg)
2972         break;
2973     }
2974
2975   return pool;
2976 }
2977
2978 static literal_pool *
2979 find_or_make_literal_pool (void)
2980 {
2981   /* Next literal pool ID number.  */
2982   static unsigned int latest_pool_num = 1;
2983   literal_pool *      pool;
2984
2985   pool = find_literal_pool ();
2986
2987   if (pool == NULL)
2988     {
2989       /* Create a new pool.  */
2990       pool = (literal_pool *) xmalloc (sizeof (* pool));
2991       if (! pool)
2992         return NULL;
2993
2994       pool->next_free_entry = 0;
2995       pool->section         = now_seg;
2996       pool->sub_section     = now_subseg;
2997       pool->next            = list_of_pools;
2998       pool->symbol          = NULL;
2999
3000       /* Add it to the list.  */
3001       list_of_pools = pool;
3002     }
3003
3004   /* New pools, and emptied pools, will have a NULL symbol.  */
3005   if (pool->symbol == NULL)
3006     {
3007       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
3008                                     (valueT) 0, &zero_address_frag);
3009       pool->id = latest_pool_num ++;
3010     }
3011
3012   /* Done.  */
3013   return pool;
3014 }
3015
3016 /* Add the literal in the global 'inst'
3017    structure to the relevant literal pool.  */
3018
3019 static int
3020 add_to_lit_pool (void)
3021 {
3022   literal_pool * pool;
3023   unsigned int entry;
3024
3025   pool = find_or_make_literal_pool ();
3026
3027   /* Check if this literal value is already in the pool.  */
3028   for (entry = 0; entry < pool->next_free_entry; entry ++)
3029     {
3030       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3031           && (inst.reloc.exp.X_op == O_constant)
3032           && (pool->literals[entry].X_add_number
3033               == inst.reloc.exp.X_add_number)
3034           && (pool->literals[entry].X_unsigned
3035               == inst.reloc.exp.X_unsigned))
3036         break;
3037
3038       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3039           && (inst.reloc.exp.X_op == O_symbol)
3040           && (pool->literals[entry].X_add_number
3041               == inst.reloc.exp.X_add_number)
3042           && (pool->literals[entry].X_add_symbol
3043               == inst.reloc.exp.X_add_symbol)
3044           && (pool->literals[entry].X_op_symbol
3045               == inst.reloc.exp.X_op_symbol))
3046         break;
3047     }
3048
3049   /* Do we need to create a new entry?  */
3050   if (entry == pool->next_free_entry)
3051     {
3052       if (entry >= MAX_LITERAL_POOL_SIZE)
3053         {
3054           inst.error = _("literal pool overflow");
3055           return FAIL;
3056         }
3057
3058       pool->literals[entry] = inst.reloc.exp;
3059       pool->next_free_entry += 1;
3060     }
3061
3062   inst.reloc.exp.X_op         = O_symbol;
3063   inst.reloc.exp.X_add_number = ((int) entry) * 4;
3064   inst.reloc.exp.X_add_symbol = pool->symbol;
3065
3066   return SUCCESS;
3067 }
3068
3069 /* Can't use symbol_new here, so have to create a symbol and then at
3070    a later date assign it a value. Thats what these functions do.  */
3071
3072 static void
3073 symbol_locate (symbolS *    symbolP,
3074                const char * name,       /* It is copied, the caller can modify.  */
3075                segT         segment,    /* Segment identifier (SEG_<something>).  */
3076                valueT       valu,       /* Symbol value.  */
3077                fragS *      frag)       /* Associated fragment.  */
3078 {
3079   unsigned int name_length;
3080   char * preserved_copy_of_name;
3081
3082   name_length = strlen (name) + 1;   /* +1 for \0.  */
3083   obstack_grow (&notes, name, name_length);
3084   preserved_copy_of_name = (char *) obstack_finish (&notes);
3085
3086 #ifdef tc_canonicalize_symbol_name
3087   preserved_copy_of_name =
3088     tc_canonicalize_symbol_name (preserved_copy_of_name);
3089 #endif
3090
3091   S_SET_NAME (symbolP, preserved_copy_of_name);
3092
3093   S_SET_SEGMENT (symbolP, segment);
3094   S_SET_VALUE (symbolP, valu);
3095   symbol_clear_list_pointers (symbolP);
3096
3097   symbol_set_frag (symbolP, frag);
3098
3099   /* Link to end of symbol chain.  */
3100   {
3101     extern int symbol_table_frozen;
3102
3103     if (symbol_table_frozen)
3104       abort ();
3105   }
3106
3107   symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
3108
3109   obj_symbol_new_hook (symbolP);
3110
3111 #ifdef tc_symbol_new_hook
3112   tc_symbol_new_hook (symbolP);
3113 #endif
3114
3115 #ifdef DEBUG_SYMS
3116   verify_symbol_chain (symbol_rootP, symbol_lastP);
3117 #endif /* DEBUG_SYMS  */
3118 }
3119
3120
3121 static void
3122 s_ltorg (int ignored ATTRIBUTE_UNUSED)
3123 {
3124   unsigned int entry;
3125   literal_pool * pool;
3126   char sym_name[20];
3127
3128   pool = find_literal_pool ();
3129   if (pool == NULL
3130       || pool->symbol == NULL
3131       || pool->next_free_entry == 0)
3132     return;
3133
3134   mapping_state (MAP_DATA);
3135
3136   /* Align pool as you have word accesses.
3137      Only make a frag if we have to.  */
3138   if (!need_pass_2)
3139     frag_align (2, 0, 0);
3140
3141   record_alignment (now_seg, 2);
3142
3143   sprintf (sym_name, "$$lit_\002%x", pool->id);
3144
3145   symbol_locate (pool->symbol, sym_name, now_seg,
3146                  (valueT) frag_now_fix (), frag_now);
3147   symbol_table_insert (pool->symbol);
3148
3149   ARM_SET_THUMB (pool->symbol, thumb_mode);
3150
3151 #if defined OBJ_COFF || defined OBJ_ELF
3152   ARM_SET_INTERWORK (pool->symbol, support_interwork);
3153 #endif
3154
3155   for (entry = 0; entry < pool->next_free_entry; entry ++)
3156     /* First output the expression in the instruction to the pool.  */
3157     emit_expr (&(pool->literals[entry]), 4); /* .word  */
3158
3159   /* Mark the pool as empty.  */
3160   pool->next_free_entry = 0;
3161   pool->symbol = NULL;
3162 }
3163
3164 #ifdef OBJ_ELF
3165 /* Forward declarations for functions below, in the MD interface
3166    section.  */
3167 static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3168 static valueT create_unwind_entry (int);
3169 static void start_unwind_section (const segT, int);
3170 static void add_unwind_opcode (valueT, int);
3171 static void flush_pending_unwind (void);
3172
3173 /* Directives: Data.  */
3174
3175 static void
3176 s_arm_elf_cons (int nbytes)
3177 {
3178   expressionS exp;
3179
3180 #ifdef md_flush_pending_output
3181   md_flush_pending_output ();
3182 #endif
3183
3184   if (is_it_end_of_statement ())
3185     {
3186       demand_empty_rest_of_line ();
3187       return;
3188     }
3189
3190 #ifdef md_cons_align
3191   md_cons_align (nbytes);
3192 #endif
3193
3194   mapping_state (MAP_DATA);
3195   do
3196     {
3197       int reloc;
3198       char *base = input_line_pointer;
3199
3200       expression (& exp);
3201
3202       if (exp.X_op != O_symbol)
3203         emit_expr (&exp, (unsigned int) nbytes);
3204       else
3205         {
3206           char *before_reloc = input_line_pointer;
3207           reloc = parse_reloc (&input_line_pointer);
3208           if (reloc == -1)
3209             {
3210               as_bad (_("unrecognized relocation suffix"));
3211               ignore_rest_of_line ();
3212               return;
3213             }
3214           else if (reloc == BFD_RELOC_UNUSED)
3215             emit_expr (&exp, (unsigned int) nbytes);
3216           else
3217             {
3218               reloc_howto_type *howto = (reloc_howto_type *)
3219                   bfd_reloc_type_lookup (stdoutput,
3220                                          (bfd_reloc_code_real_type) reloc);
3221               int size = bfd_get_reloc_size (howto);
3222
3223               if (reloc == BFD_RELOC_ARM_PLT32)
3224                 {
3225                   as_bad (_("(plt) is only valid on branch targets"));
3226                   reloc = BFD_RELOC_UNUSED;
3227                   size = 0;
3228                 }
3229
3230               if (size > nbytes)
3231                 as_bad (_("%s relocations do not fit in %d bytes"),
3232                         howto->name, nbytes);
3233               else
3234                 {
3235                   /* We've parsed an expression stopping at O_symbol.
3236                      But there may be more expression left now that we
3237                      have parsed the relocation marker.  Parse it again.
3238                      XXX Surely there is a cleaner way to do this.  */
3239                   char *p = input_line_pointer;
3240                   int offset;
3241                   char *save_buf = (char *) alloca (input_line_pointer - base);
3242                   memcpy (save_buf, base, input_line_pointer - base);
3243                   memmove (base + (input_line_pointer - before_reloc),
3244                            base, before_reloc - base);
3245
3246                   input_line_pointer = base + (input_line_pointer-before_reloc);
3247                   expression (&exp);
3248                   memcpy (base, save_buf, p - base);
3249
3250                   offset = nbytes - size;
3251                   p = frag_more ((int) nbytes);
3252                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
3253                                size, &exp, 0, (enum bfd_reloc_code_real) reloc);
3254                 }
3255             }
3256         }
3257     }
3258   while (*input_line_pointer++ == ',');
3259
3260   /* Put terminator back into stream.  */
3261   input_line_pointer --;
3262   demand_empty_rest_of_line ();
3263 }
3264
3265 /* Emit an expression containing a 32-bit thumb instruction.
3266    Implementation based on put_thumb32_insn.  */
3267
3268 static void
3269 emit_thumb32_expr (expressionS * exp)
3270 {
3271   expressionS exp_high = *exp;
3272
3273   exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3274   emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3275   exp->X_add_number &= 0xffff;
3276   emit_expr (exp, (unsigned int) THUMB_SIZE);
3277 }
3278
3279 /*  Guess the instruction size based on the opcode.  */
3280
3281 static int
3282 thumb_insn_size (int opcode)
3283 {
3284   if ((unsigned int) opcode < 0xe800u)
3285     return 2;
3286   else if ((unsigned int) opcode >= 0xe8000000u)
3287     return 4;
3288   else
3289     return 0;
3290 }
3291
3292 static bfd_boolean
3293 emit_insn (expressionS *exp, int nbytes)
3294 {
3295   int size = 0;
3296
3297   if (exp->X_op == O_constant)
3298     {
3299       size = nbytes;
3300
3301       if (size == 0)
3302         size = thumb_insn_size (exp->X_add_number);
3303
3304       if (size != 0)
3305         {
3306           if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3307             {
3308               as_bad (_(".inst.n operand too big. "\
3309                         "Use .inst.w instead"));
3310               size = 0;
3311             }
3312           else
3313             {
3314               if (now_it.state == AUTOMATIC_IT_BLOCK)
3315                 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3316               else
3317                 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3318
3319               if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3320                 emit_thumb32_expr (exp);
3321               else
3322                 emit_expr (exp, (unsigned int) size);
3323
3324               it_fsm_post_encode ();
3325             }
3326         }
3327       else
3328         as_bad (_("cannot determine Thumb instruction size. "   \
3329                   "Use .inst.n/.inst.w instead"));
3330     }
3331   else
3332     as_bad (_("constant expression required"));
3333
3334   return (size != 0);
3335 }
3336
3337 /* Like s_arm_elf_cons but do not use md_cons_align and
3338    set the mapping state to MAP_ARM/MAP_THUMB.  */
3339
3340 static void
3341 s_arm_elf_inst (int nbytes)
3342 {
3343   if (is_it_end_of_statement ())
3344     {
3345       demand_empty_rest_of_line ();
3346       return;
3347     }
3348
3349   /* Calling mapping_state () here will not change ARM/THUMB,
3350      but will ensure not to be in DATA state.  */
3351
3352   if (thumb_mode)
3353     mapping_state (MAP_THUMB);
3354   else
3355     {
3356       if (nbytes != 0)
3357         {
3358           as_bad (_("width suffixes are invalid in ARM mode"));
3359           ignore_rest_of_line ();
3360           return;
3361         }
3362
3363       nbytes = 4;
3364
3365       mapping_state (MAP_ARM);
3366     }
3367
3368   do
3369     {
3370       expressionS exp;
3371
3372       expression (& exp);
3373
3374       if (! emit_insn (& exp, nbytes))
3375         {
3376           ignore_rest_of_line ();
3377           return;
3378         }
3379     }
3380   while (*input_line_pointer++ == ',');
3381
3382   /* Put terminator back into stream.  */
3383   input_line_pointer --;
3384   demand_empty_rest_of_line ();
3385 }
3386
3387 /* Parse a .rel31 directive.  */
3388
3389 static void
3390 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3391 {
3392   expressionS exp;
3393   char *p;
3394   valueT highbit;
3395
3396   highbit = 0;
3397   if (*input_line_pointer == '1')
3398     highbit = 0x80000000;
3399   else if (*input_line_pointer != '0')
3400     as_bad (_("expected 0 or 1"));
3401
3402   input_line_pointer++;
3403   if (*input_line_pointer != ',')
3404     as_bad (_("missing comma"));
3405   input_line_pointer++;
3406
3407 #ifdef md_flush_pending_output
3408   md_flush_pending_output ();
3409 #endif
3410
3411 #ifdef md_cons_align
3412   md_cons_align (4);
3413 #endif
3414
3415   mapping_state (MAP_DATA);
3416
3417   expression (&exp);
3418
3419   p = frag_more (4);
3420   md_number_to_chars (p, highbit, 4);
3421   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3422                BFD_RELOC_ARM_PREL31);
3423
3424   demand_empty_rest_of_line ();
3425 }
3426
3427 /* Directives: AEABI stack-unwind tables.  */
3428
3429 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
3430
3431 static void
3432 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3433 {
3434   demand_empty_rest_of_line ();
3435   if (unwind.proc_start)
3436     {
3437       as_bad (_("duplicate .fnstart directive"));
3438       return;
3439     }
3440
3441   /* Mark the start of the function.  */
3442   unwind.proc_start = expr_build_dot ();
3443
3444   /* Reset the rest of the unwind info.  */
3445   unwind.opcode_count = 0;
3446   unwind.table_entry = NULL;
3447   unwind.personality_routine = NULL;
3448   unwind.personality_index = -1;
3449   unwind.frame_size = 0;
3450   unwind.fp_offset = 0;
3451   unwind.fp_reg = REG_SP;
3452   unwind.fp_used = 0;
3453   unwind.sp_restored = 0;
3454 }
3455
3456
3457 /* Parse a handlerdata directive.  Creates the exception handling table entry
3458    for the function.  */
3459
3460 static void
3461 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3462 {
3463   demand_empty_rest_of_line ();
3464   if (!unwind.proc_start)
3465     as_bad (MISSING_FNSTART);
3466
3467   if (unwind.table_entry)
3468     as_bad (_("duplicate .handlerdata directive"));
3469
3470   create_unwind_entry (1);
3471 }
3472
3473 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
3474
3475 static void
3476 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3477 {
3478   long where;
3479   char *ptr;
3480   valueT val;
3481   unsigned int marked_pr_dependency;
3482
3483   demand_empty_rest_of_line ();
3484
3485   if (!unwind.proc_start)
3486     {
3487       as_bad (_(".fnend directive without .fnstart"));
3488       return;
3489     }
3490
3491   /* Add eh table entry.  */
3492   if (unwind.table_entry == NULL)
3493     val = create_unwind_entry (0);
3494   else
3495     val = 0;
3496
3497   /* Add index table entry.  This is two words.  */
3498   start_unwind_section (unwind.saved_seg, 1);
3499   frag_align (2, 0, 0);
3500   record_alignment (now_seg, 2);
3501
3502   ptr = frag_more (8);
3503   where = frag_now_fix () - 8;
3504
3505   /* Self relative offset of the function start.  */
3506   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3507            BFD_RELOC_ARM_PREL31);
3508
3509   /* Indicate dependency on EHABI-defined personality routines to the
3510      linker, if it hasn't been done already.  */
3511   marked_pr_dependency
3512     = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
3513   if (unwind.personality_index >= 0 && unwind.personality_index < 3
3514       && !(marked_pr_dependency & (1 << unwind.personality_index)))
3515     {
3516       static const char *const name[] =
3517         {
3518           "__aeabi_unwind_cpp_pr0",
3519           "__aeabi_unwind_cpp_pr1",
3520           "__aeabi_unwind_cpp_pr2"
3521         };
3522       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3523       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3524       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3525         |= 1 << unwind.personality_index;
3526     }
3527
3528   if (val)
3529     /* Inline exception table entry.  */
3530     md_number_to_chars (ptr + 4, val, 4);
3531   else
3532     /* Self relative offset of the table entry.  */
3533     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3534              BFD_RELOC_ARM_PREL31);
3535
3536   /* Restore the original section.  */
3537   subseg_set (unwind.saved_seg, unwind.saved_subseg);
3538
3539   unwind.proc_start = NULL;
3540 }
3541
3542
3543 /* Parse an unwind_cantunwind directive.  */
3544
3545 static void
3546 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3547 {
3548   demand_empty_rest_of_line ();
3549   if (!unwind.proc_start)
3550     as_bad (MISSING_FNSTART);
3551
3552   if (unwind.personality_routine || unwind.personality_index != -1)
3553     as_bad (_("personality routine specified for cantunwind frame"));
3554
3555   unwind.personality_index = -2;
3556 }
3557
3558
3559 /* Parse a personalityindex directive.  */
3560
3561 static void
3562 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3563 {
3564   expressionS exp;
3565
3566   if (!unwind.proc_start)
3567     as_bad (MISSING_FNSTART);
3568
3569   if (unwind.personality_routine || unwind.personality_index != -1)
3570     as_bad (_("duplicate .personalityindex directive"));
3571
3572   expression (&exp);
3573
3574   if (exp.X_op != O_constant
3575       || exp.X_add_number < 0 || exp.X_add_number > 15)
3576     {
3577       as_bad (_("bad personality routine number"));
3578       ignore_rest_of_line ();
3579       return;
3580     }
3581
3582   unwind.personality_index = exp.X_add_number;
3583
3584   demand_empty_rest_of_line ();
3585 }
3586
3587
3588 /* Parse a personality directive.  */
3589
3590 static void
3591 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3592 {
3593   char *name, *p, c;
3594
3595   if (!unwind.proc_start)
3596     as_bad (MISSING_FNSTART);
3597
3598   if (unwind.personality_routine || unwind.personality_index != -1)
3599     as_bad (_("duplicate .personality directive"));
3600
3601   name = input_line_pointer;
3602   c = get_symbol_end ();
3603   p = input_line_pointer;
3604   unwind.personality_routine = symbol_find_or_make (name);
3605   *p = c;
3606   demand_empty_rest_of_line ();
3607 }
3608
3609
3610 /* Parse a directive saving core registers.  */
3611
3612 static void
3613 s_arm_unwind_save_core (void)
3614 {
3615   valueT op;
3616   long range;
3617   int n;
3618
3619   range = parse_reg_list (&input_line_pointer);
3620   if (range == FAIL)
3621     {
3622       as_bad (_("expected register list"));
3623       ignore_rest_of_line ();
3624       return;
3625     }
3626
3627   demand_empty_rest_of_line ();
3628
3629   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3630      into .unwind_save {..., sp...}.  We aren't bothered about the value of
3631      ip because it is clobbered by calls.  */
3632   if (unwind.sp_restored && unwind.fp_reg == 12
3633       && (range & 0x3000) == 0x1000)
3634     {
3635       unwind.opcode_count--;
3636       unwind.sp_restored = 0;
3637       range = (range | 0x2000) & ~0x1000;
3638       unwind.pending_offset = 0;
3639     }
3640
3641   /* Pop r4-r15.  */
3642   if (range & 0xfff0)
3643     {
3644       /* See if we can use the short opcodes.  These pop a block of up to 8
3645          registers starting with r4, plus maybe r14.  */
3646       for (n = 0; n < 8; n++)
3647         {
3648           /* Break at the first non-saved register.      */
3649           if ((range & (1 << (n + 4))) == 0)
3650             break;
3651         }
3652       /* See if there are any other bits set.  */
3653       if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3654         {
3655           /* Use the long form.  */
3656           op = 0x8000 | ((range >> 4) & 0xfff);
3657           add_unwind_opcode (op, 2);
3658         }
3659       else
3660         {
3661           /* Use the short form.  */
3662           if (range & 0x4000)
3663             op = 0xa8; /* Pop r14.      */
3664           else
3665             op = 0xa0; /* Do not pop r14.  */
3666           op |= (n - 1);
3667           add_unwind_opcode (op, 1);
3668         }
3669     }
3670
3671   /* Pop r0-r3.  */
3672   if (range & 0xf)
3673     {
3674       op = 0xb100 | (range & 0xf);
3675       add_unwind_opcode (op, 2);
3676     }
3677
3678   /* Record the number of bytes pushed.  */
3679   for (n = 0; n < 16; n++)
3680     {
3681       if (range & (1 << n))
3682         unwind.frame_size += 4;
3683     }
3684 }
3685
3686
3687 /* Parse a directive saving FPA registers.  */
3688
3689 static void
3690 s_arm_unwind_save_fpa (int reg)
3691 {
3692   expressionS exp;
3693   int num_regs;
3694   valueT op;
3695
3696   /* Get Number of registers to transfer.  */
3697   if (skip_past_comma (&input_line_pointer) != FAIL)
3698     expression (&exp);
3699   else
3700     exp.X_op = O_illegal;
3701
3702   if (exp.X_op != O_constant)
3703     {
3704       as_bad (_("expected , <constant>"));
3705       ignore_rest_of_line ();
3706       return;
3707     }
3708
3709   num_regs = exp.X_add_number;
3710
3711   if (num_regs < 1 || num_regs > 4)
3712     {
3713       as_bad (_("number of registers must be in the range [1:4]"));
3714       ignore_rest_of_line ();
3715       return;
3716     }
3717
3718   demand_empty_rest_of_line ();
3719
3720   if (reg == 4)
3721     {
3722       /* Short form.  */
3723       op = 0xb4 | (num_regs - 1);
3724       add_unwind_opcode (op, 1);
3725     }
3726   else
3727     {
3728       /* Long form.  */
3729       op = 0xc800 | (reg << 4) | (num_regs - 1);
3730       add_unwind_opcode (op, 2);
3731     }
3732   unwind.frame_size += num_regs * 12;
3733 }
3734
3735
3736 /* Parse a directive saving VFP registers for ARMv6 and above.  */
3737
3738 static void
3739 s_arm_unwind_save_vfp_armv6 (void)
3740 {
3741   int count;
3742   unsigned int start;
3743   valueT op;
3744   int num_vfpv3_regs = 0;
3745   int num_regs_below_16;
3746
3747   count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3748   if (count == FAIL)
3749     {
3750       as_bad (_("expected register list"));
3751       ignore_rest_of_line ();
3752       return;
3753     }
3754
3755   demand_empty_rest_of_line ();
3756
3757   /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3758      than FSTMX/FLDMX-style ones).  */
3759
3760   /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
3761   if (start >= 16)
3762     num_vfpv3_regs = count;
3763   else if (start + count > 16)
3764     num_vfpv3_regs = start + count - 16;
3765
3766   if (num_vfpv3_regs > 0)
3767     {
3768       int start_offset = start > 16 ? start - 16 : 0;
3769       op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3770       add_unwind_opcode (op, 2);
3771     }
3772
3773   /* Generate opcode for registers numbered in the range 0 .. 15.  */
3774   num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
3775   gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
3776   if (num_regs_below_16 > 0)
3777     {
3778       op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3779       add_unwind_opcode (op, 2);
3780     }
3781
3782   unwind.frame_size += count * 8;
3783 }
3784
3785
3786 /* Parse a directive saving VFP registers for pre-ARMv6.  */
3787
3788 static void
3789 s_arm_unwind_save_vfp (void)
3790 {
3791   int count;
3792   unsigned int reg;
3793   valueT op;
3794
3795   count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
3796   if (count == FAIL)
3797     {
3798       as_bad (_("expected register list"));
3799       ignore_rest_of_line ();
3800       return;
3801     }
3802
3803   demand_empty_rest_of_line ();
3804
3805   if (reg == 8)
3806     {
3807       /* Short form.  */
3808       op = 0xb8 | (count - 1);
3809       add_unwind_opcode (op, 1);
3810     }
3811   else
3812     {
3813       /* Long form.  */
3814       op = 0xb300 | (reg << 4) | (count - 1);
3815       add_unwind_opcode (op, 2);
3816     }
3817   unwind.frame_size += count * 8 + 4;
3818 }
3819
3820
3821 /* Parse a directive saving iWMMXt data registers.  */
3822
3823 static void
3824 s_arm_unwind_save_mmxwr (void)
3825 {
3826   int reg;
3827   int hi_reg;
3828   int i;
3829   unsigned mask = 0;
3830   valueT op;
3831
3832   if (*input_line_pointer == '{')
3833     input_line_pointer++;
3834
3835   do
3836     {
3837       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3838
3839       if (reg == FAIL)
3840         {
3841           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3842           goto error;
3843         }
3844
3845       if (mask >> reg)
3846         as_tsktsk (_("register list not in ascending order"));
3847       mask |= 1 << reg;
3848
3849       if (*input_line_pointer == '-')
3850         {
3851           input_line_pointer++;
3852           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3853           if (hi_reg == FAIL)
3854             {
3855               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3856               goto error;
3857             }
3858           else if (reg >= hi_reg)
3859             {
3860               as_bad (_("bad register range"));
3861               goto error;
3862             }
3863           for (; reg < hi_reg; reg++)
3864             mask |= 1 << reg;
3865         }
3866     }
3867   while (skip_past_comma (&input_line_pointer) != FAIL);
3868
3869   if (*input_line_pointer == '}')
3870     input_line_pointer++;
3871
3872   demand_empty_rest_of_line ();
3873
3874   /* Generate any deferred opcodes because we're going to be looking at
3875      the list.  */
3876   flush_pending_unwind ();
3877
3878   for (i = 0; i < 16; i++)
3879     {
3880       if (mask & (1 << i))
3881         unwind.frame_size += 8;
3882     }
3883
3884   /* Attempt to combine with a previous opcode.  We do this because gcc
3885      likes to output separate unwind directives for a single block of
3886      registers.  */
3887   if (unwind.opcode_count > 0)
3888     {
3889       i = unwind.opcodes[unwind.opcode_count - 1];
3890       if ((i & 0xf8) == 0xc0)
3891         {
3892           i &= 7;
3893           /* Only merge if the blocks are contiguous.  */
3894           if (i < 6)
3895             {
3896               if ((mask & 0xfe00) == (1 << 9))
3897                 {
3898                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3899                   unwind.opcode_count--;
3900                 }
3901             }
3902           else if (i == 6 && unwind.opcode_count >= 2)
3903             {
3904               i = unwind.opcodes[unwind.opcode_count - 2];
3905               reg = i >> 4;
3906               i &= 0xf;
3907
3908               op = 0xffff << (reg - 1);
3909               if (reg > 0
3910                   && ((mask & op) == (1u << (reg - 1))))
3911                 {
3912                   op = (1 << (reg + i + 1)) - 1;
3913                   op &= ~((1 << reg) - 1);
3914                   mask |= op;
3915                   unwind.opcode_count -= 2;
3916                 }
3917             }
3918         }
3919     }
3920
3921   hi_reg = 15;
3922   /* We want to generate opcodes in the order the registers have been
3923      saved, ie. descending order.  */
3924   for (reg = 15; reg >= -1; reg--)
3925     {
3926       /* Save registers in blocks.  */
3927       if (reg < 0
3928           || !(mask & (1 << reg)))
3929         {
3930           /* We found an unsaved reg.  Generate opcodes to save the
3931              preceding block.   */
3932           if (reg != hi_reg)
3933             {
3934               if (reg == 9)
3935                 {
3936                   /* Short form.  */
3937                   op = 0xc0 | (hi_reg - 10);
3938                   add_unwind_opcode (op, 1);
3939                 }
3940               else
3941                 {
3942                   /* Long form.  */
3943                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
3944                   add_unwind_opcode (op, 2);
3945                 }
3946             }
3947           hi_reg = reg - 1;
3948         }
3949     }
3950
3951   return;
3952 error:
3953   ignore_rest_of_line ();
3954 }
3955
3956 static void
3957 s_arm_unwind_save_mmxwcg (void)
3958 {
3959   int reg;
3960   int hi_reg;
3961   unsigned mask = 0;
3962   valueT op;
3963
3964   if (*input_line_pointer == '{')
3965     input_line_pointer++;
3966
3967   do
3968     {
3969       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
3970
3971       if (reg == FAIL)
3972         {
3973           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
3974           goto error;
3975         }
3976
3977       reg -= 8;
3978       if (mask >> reg)
3979         as_tsktsk (_("register list not in ascending order"));
3980       mask |= 1 << reg;
3981
3982       if (*input_line_pointer == '-')
3983         {
3984           input_line_pointer++;
3985           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
3986           if (hi_reg == FAIL)
3987             {
3988               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
3989               goto error;
3990             }
3991           else if (reg >= hi_reg)
3992             {
3993               as_bad (_("bad register range"));
3994               goto error;
3995             }
3996           for (; reg < hi_reg; reg++)
3997             mask |= 1 << reg;
3998         }
3999     }
4000   while (skip_past_comma (&input_line_pointer) != FAIL);
4001
4002   if (*input_line_pointer == '}')
4003     input_line_pointer++;
4004
4005   demand_empty_rest_of_line ();
4006
4007   /* Generate any deferred opcodes because we're going to be looking at
4008      the list.  */
4009   flush_pending_unwind ();
4010
4011   for (reg = 0; reg < 16; reg++)
4012     {
4013       if (mask & (1 << reg))
4014         unwind.frame_size += 4;
4015     }
4016   op = 0xc700 | mask;
4017   add_unwind_opcode (op, 2);
4018   return;
4019 error:
4020   ignore_rest_of_line ();
4021 }
4022
4023
4024 /* Parse an unwind_save directive.
4025    If the argument is non-zero, this is a .vsave directive.  */
4026
4027 static void
4028 s_arm_unwind_save (int arch_v6)
4029 {
4030   char *peek;
4031   struct reg_entry *reg;
4032   bfd_boolean had_brace = FALSE;
4033
4034   if (!unwind.proc_start)
4035     as_bad (MISSING_FNSTART);
4036
4037   /* Figure out what sort of save we have.  */
4038   peek = input_line_pointer;
4039
4040   if (*peek == '{')
4041     {
4042       had_brace = TRUE;
4043       peek++;
4044     }
4045
4046   reg = arm_reg_parse_multi (&peek);
4047
4048   if (!reg)
4049     {
4050       as_bad (_("register expected"));
4051       ignore_rest_of_line ();
4052       return;
4053     }
4054
4055   switch (reg->type)
4056     {
4057     case REG_TYPE_FN:
4058       if (had_brace)
4059         {
4060           as_bad (_("FPA .unwind_save does not take a register list"));
4061           ignore_rest_of_line ();
4062           return;
4063         }
4064       input_line_pointer = peek;
4065       s_arm_unwind_save_fpa (reg->number);
4066       return;
4067
4068     case REG_TYPE_RN:     s_arm_unwind_save_core ();   return;
4069     case REG_TYPE_VFD:
4070       if (arch_v6)
4071         s_arm_unwind_save_vfp_armv6 ();
4072       else
4073         s_arm_unwind_save_vfp ();
4074       return;
4075     case REG_TYPE_MMXWR:  s_arm_unwind_save_mmxwr ();  return;
4076     case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
4077
4078     default:
4079       as_bad (_(".unwind_save does not support this kind of register"));
4080       ignore_rest_of_line ();
4081     }
4082 }
4083
4084
4085 /* Parse an unwind_movsp directive.  */
4086
4087 static void
4088 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4089 {
4090   int reg;
4091   valueT op;
4092   int offset;
4093
4094   if (!unwind.proc_start)
4095     as_bad (MISSING_FNSTART);
4096
4097   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4098   if (reg == FAIL)
4099     {
4100       as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
4101       ignore_rest_of_line ();
4102       return;
4103     }
4104
4105   /* Optional constant.  */
4106   if (skip_past_comma (&input_line_pointer) != FAIL)
4107     {
4108       if (immediate_for_directive (&offset) == FAIL)
4109         return;
4110     }
4111   else
4112     offset = 0;
4113
4114   demand_empty_rest_of_line ();
4115
4116   if (reg == REG_SP || reg == REG_PC)
4117     {
4118       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
4119       return;
4120     }
4121
4122   if (unwind.fp_reg != REG_SP)
4123     as_bad (_("unexpected .unwind_movsp directive"));
4124
4125   /* Generate opcode to restore the value.  */
4126   op = 0x90 | reg;
4127   add_unwind_opcode (op, 1);
4128
4129   /* Record the information for later.  */
4130   unwind.fp_reg = reg;
4131   unwind.fp_offset = unwind.frame_size - offset;
4132   unwind.sp_restored = 1;
4133 }
4134
4135 /* Parse an unwind_pad directive.  */
4136
4137 static void
4138 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
4139 {
4140   int offset;
4141
4142   if (!unwind.proc_start)
4143     as_bad (MISSING_FNSTART);
4144
4145   if (immediate_for_directive (&offset) == FAIL)
4146     return;
4147
4148   if (offset & 3)
4149     {
4150       as_bad (_("stack increment must be multiple of 4"));
4151       ignore_rest_of_line ();
4152       return;
4153     }
4154
4155   /* Don't generate any opcodes, just record the details for later.  */
4156   unwind.frame_size += offset;
4157   unwind.pending_offset += offset;
4158
4159   demand_empty_rest_of_line ();
4160 }
4161
4162 /* Parse an unwind_setfp directive.  */
4163
4164 static void
4165 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
4166 {
4167   int sp_reg;
4168   int fp_reg;
4169   int offset;
4170
4171   if (!unwind.proc_start)
4172     as_bad (MISSING_FNSTART);
4173
4174   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4175   if (skip_past_comma (&input_line_pointer) == FAIL)
4176     sp_reg = FAIL;
4177   else
4178     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4179
4180   if (fp_reg == FAIL || sp_reg == FAIL)
4181     {
4182       as_bad (_("expected <reg>, <reg>"));
4183       ignore_rest_of_line ();
4184       return;
4185     }
4186
4187   /* Optional constant.  */
4188   if (skip_past_comma (&input_line_pointer) != FAIL)
4189     {
4190       if (immediate_for_directive (&offset) == FAIL)
4191         return;
4192     }
4193   else
4194     offset = 0;
4195
4196   demand_empty_rest_of_line ();
4197
4198   if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4199     {
4200       as_bad (_("register must be either sp or set by a previous"
4201                 "unwind_movsp directive"));
4202       return;
4203     }
4204
4205   /* Don't generate any opcodes, just record the information for later.  */
4206   unwind.fp_reg = fp_reg;
4207   unwind.fp_used = 1;
4208   if (sp_reg == REG_SP)
4209     unwind.fp_offset = unwind.frame_size - offset;
4210   else
4211     unwind.fp_offset -= offset;
4212 }
4213
4214 /* Parse an unwind_raw directive.  */
4215
4216 static void
4217 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
4218 {
4219   expressionS exp;
4220   /* This is an arbitrary limit.         */
4221   unsigned char op[16];
4222   int count;
4223
4224   if (!unwind.proc_start)
4225     as_bad (MISSING_FNSTART);
4226
4227   expression (&exp);
4228   if (exp.X_op == O_constant
4229       && skip_past_comma (&input_line_pointer) != FAIL)
4230     {
4231       unwind.frame_size += exp.X_add_number;
4232       expression (&exp);
4233     }
4234   else
4235     exp.X_op = O_illegal;
4236
4237   if (exp.X_op != O_constant)
4238     {
4239       as_bad (_("expected <offset>, <opcode>"));
4240       ignore_rest_of_line ();
4241       return;
4242     }
4243
4244   count = 0;
4245
4246   /* Parse the opcode.  */
4247   for (;;)
4248     {
4249       if (count >= 16)
4250         {
4251           as_bad (_("unwind opcode too long"));
4252           ignore_rest_of_line ();
4253         }
4254       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
4255         {
4256           as_bad (_("invalid unwind opcode"));
4257           ignore_rest_of_line ();
4258           return;
4259         }
4260       op[count++] = exp.X_add_number;
4261
4262       /* Parse the next byte.  */
4263       if (skip_past_comma (&input_line_pointer) == FAIL)
4264         break;
4265
4266       expression (&exp);
4267     }
4268
4269   /* Add the opcode bytes in reverse order.  */
4270   while (count--)
4271     add_unwind_opcode (op[count], 1);
4272
4273   demand_empty_rest_of_line ();
4274 }
4275
4276
4277 /* Parse a .eabi_attribute directive.  */
4278
4279 static void
4280 s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4281 {
4282   int tag = s_vendor_attribute (OBJ_ATTR_PROC);
4283
4284   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4285     attributes_set_explicitly[tag] = 1;
4286 }
4287
4288 /* Emit a tls fix for the symbol.  */
4289
4290 static void
4291 s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4292 {
4293   char *p;
4294   expressionS exp;
4295 #ifdef md_flush_pending_output
4296   md_flush_pending_output ();
4297 #endif
4298
4299 #ifdef md_cons_align
4300   md_cons_align (4);
4301 #endif
4302
4303   /* Since we're just labelling the code, there's no need to define a
4304      mapping symbol.  */
4305   expression (&exp);
4306   p = obstack_next_free (&frchain_now->frch_obstack);
4307   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4308                thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4309                : BFD_RELOC_ARM_TLS_DESCSEQ);
4310 }
4311 #endif /* OBJ_ELF */
4312
4313 static void s_arm_arch (int);
4314 static void s_arm_object_arch (int);
4315 static void s_arm_cpu (int);
4316 static void s_arm_fpu (int);
4317 static void s_arm_arch_extension (int);
4318
4319 #ifdef TE_PE
4320
4321 static void
4322 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
4323 {
4324   expressionS exp;
4325
4326   do
4327     {
4328       expression (&exp);
4329       if (exp.X_op == O_symbol)
4330         exp.X_op = O_secrel;
4331
4332       emit_expr (&exp, 4);
4333     }
4334   while (*input_line_pointer++ == ',');
4335
4336   input_line_pointer--;
4337   demand_empty_rest_of_line ();
4338 }
4339 #endif /* TE_PE */
4340
4341 /* This table describes all the machine specific pseudo-ops the assembler
4342    has to support.  The fields are:
4343      pseudo-op name without dot
4344      function to call to execute this pseudo-op
4345      Integer arg to pass to the function.  */
4346
4347 const pseudo_typeS md_pseudo_table[] =
4348 {
4349   /* Never called because '.req' does not start a line.  */
4350   { "req",         s_req,         0 },
4351   /* Following two are likewise never called.  */
4352   { "dn",          s_dn,          0 },
4353   { "qn",          s_qn,          0 },
4354   { "unreq",       s_unreq,       0 },
4355   { "bss",         s_bss,         0 },
4356   { "align",       s_align,       0 },
4357   { "arm",         s_arm,         0 },
4358   { "thumb",       s_thumb,       0 },
4359   { "code",        s_code,        0 },
4360   { "force_thumb", s_force_thumb, 0 },
4361   { "thumb_func",  s_thumb_func,  0 },
4362   { "thumb_set",   s_thumb_set,   0 },
4363   { "even",        s_even,        0 },
4364   { "ltorg",       s_ltorg,       0 },
4365   { "pool",        s_ltorg,       0 },
4366   { "syntax",      s_syntax,      0 },
4367   { "cpu",         s_arm_cpu,     0 },
4368   { "arch",        s_arm_arch,    0 },
4369   { "object_arch", s_arm_object_arch,   0 },
4370   { "fpu",         s_arm_fpu,     0 },
4371   { "arch_extension", s_arm_arch_extension, 0 },
4372 #ifdef OBJ_ELF
4373   { "word",             s_arm_elf_cons, 4 },
4374   { "long",             s_arm_elf_cons, 4 },
4375   { "inst.n",           s_arm_elf_inst, 2 },
4376   { "inst.w",           s_arm_elf_inst, 4 },
4377   { "inst",             s_arm_elf_inst, 0 },
4378   { "rel31",            s_arm_rel31,      0 },
4379   { "fnstart",          s_arm_unwind_fnstart,   0 },
4380   { "fnend",            s_arm_unwind_fnend,     0 },
4381   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
4382   { "personality",      s_arm_unwind_personality, 0 },
4383   { "personalityindex", s_arm_unwind_personalityindex, 0 },
4384   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
4385   { "save",             s_arm_unwind_save,      0 },
4386   { "vsave",            s_arm_unwind_save,      1 },
4387   { "movsp",            s_arm_unwind_movsp,     0 },
4388   { "pad",              s_arm_unwind_pad,       0 },
4389   { "setfp",            s_arm_unwind_setfp,     0 },
4390   { "unwind_raw",       s_arm_unwind_raw,       0 },
4391   { "eabi_attribute",   s_arm_eabi_attribute,   0 },
4392   { "tlsdescseq",       s_arm_tls_descseq,      0 },
4393 #else
4394   { "word",        cons, 4},
4395
4396   /* These are used for dwarf.  */
4397   {"2byte", cons, 2},
4398   {"4byte", cons, 4},
4399   {"8byte", cons, 8},
4400   /* These are used for dwarf2.  */
4401   { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4402   { "loc",  dwarf2_directive_loc,  0 },
4403   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
4404 #endif
4405   { "extend",      float_cons, 'x' },
4406   { "ldouble",     float_cons, 'x' },
4407   { "packed",      float_cons, 'p' },
4408 #ifdef TE_PE
4409   {"secrel32", pe_directive_secrel, 0},
4410 #endif
4411   { 0, 0, 0 }
4412 };
4413 \f
4414 /* Parser functions used exclusively in instruction operands.  */
4415
4416 /* Generic immediate-value read function for use in insn parsing.
4417    STR points to the beginning of the immediate (the leading #);
4418    VAL receives the value; if the value is outside [MIN, MAX]
4419    issue an error.  PREFIX_OPT is true if the immediate prefix is
4420    optional.  */
4421
4422 static int
4423 parse_immediate (char **str, int *val, int min, int max,
4424                  bfd_boolean prefix_opt)
4425 {
4426   expressionS exp;
4427   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4428   if (exp.X_op != O_constant)
4429     {
4430       inst.error = _("constant expression required");
4431       return FAIL;
4432     }
4433
4434   if (exp.X_add_number < min || exp.X_add_number > max)
4435     {
4436       inst.error = _("immediate value out of range");
4437       return FAIL;
4438     }
4439
4440   *val = exp.X_add_number;
4441   return SUCCESS;
4442 }
4443
4444 /* Less-generic immediate-value read function with the possibility of loading a
4445    big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
4446    instructions. Puts the result directly in inst.operands[i].  */
4447
4448 static int
4449 parse_big_immediate (char **str, int i)
4450 {
4451   expressionS exp;
4452   char *ptr = *str;
4453
4454   my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4455
4456   if (exp.X_op == O_constant)
4457     {
4458       inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4459       /* If we're on a 64-bit host, then a 64-bit number can be returned using
4460          O_constant.  We have to be careful not to break compilation for
4461          32-bit X_add_number, though.  */
4462       if ((exp.X_add_number & ~(offsetT)(0xffffffffU)) != 0)
4463         {
4464           /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4.  */
4465           inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4466           inst.operands[i].regisimm = 1;
4467         }
4468     }
4469   else if (exp.X_op == O_big
4470            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
4471     {
4472       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
4473
4474       /* Bignums have their least significant bits in
4475          generic_bignum[0]. Make sure we put 32 bits in imm and
4476          32 bits in reg,  in a (hopefully) portable way.  */
4477       gas_assert (parts != 0);
4478
4479       /* Make sure that the number is not too big.
4480          PR 11972: Bignums can now be sign-extended to the
4481          size of a .octa so check that the out of range bits
4482          are all zero or all one.  */
4483       if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
4484         {
4485           LITTLENUM_TYPE m = -1;
4486
4487           if (generic_bignum[parts * 2] != 0
4488               && generic_bignum[parts * 2] != m)
4489             return FAIL;
4490
4491           for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
4492             if (generic_bignum[j] != generic_bignum[j-1])
4493               return FAIL;
4494         }
4495
4496       inst.operands[i].imm = 0;
4497       for (j = 0; j < parts; j++, idx++)
4498         inst.operands[i].imm |= generic_bignum[idx]
4499                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4500       inst.operands[i].reg = 0;
4501       for (j = 0; j < parts; j++, idx++)
4502         inst.operands[i].reg |= generic_bignum[idx]
4503                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4504       inst.operands[i].regisimm = 1;
4505     }
4506   else
4507     return FAIL;
4508
4509   *str = ptr;
4510
4511   return SUCCESS;
4512 }
4513
4514 /* Returns the pseudo-register number of an FPA immediate constant,
4515    or FAIL if there isn't a valid constant here.  */
4516
4517 static int
4518 parse_fpa_immediate (char ** str)
4519 {
4520   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4521   char *         save_in;
4522   expressionS    exp;
4523   int            i;
4524   int            j;
4525
4526   /* First try and match exact strings, this is to guarantee
4527      that some formats will work even for cross assembly.  */
4528
4529   for (i = 0; fp_const[i]; i++)
4530     {
4531       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
4532         {
4533           char *start = *str;
4534
4535           *str += strlen (fp_const[i]);
4536           if (is_end_of_line[(unsigned char) **str])
4537             return i + 8;
4538           *str = start;
4539         }
4540     }
4541
4542   /* Just because we didn't get a match doesn't mean that the constant
4543      isn't valid, just that it is in a format that we don't
4544      automatically recognize.  Try parsing it with the standard
4545      expression routines.  */
4546
4547   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
4548
4549   /* Look for a raw floating point number.  */
4550   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4551       && is_end_of_line[(unsigned char) *save_in])
4552     {
4553       for (i = 0; i < NUM_FLOAT_VALS; i++)
4554         {
4555           for (j = 0; j < MAX_LITTLENUMS; j++)
4556             {
4557               if (words[j] != fp_values[i][j])
4558                 break;
4559             }
4560
4561           if (j == MAX_LITTLENUMS)
4562             {
4563               *str = save_in;
4564               return i + 8;
4565             }
4566         }
4567     }
4568
4569   /* Try and parse a more complex expression, this will probably fail
4570      unless the code uses a floating point prefix (eg "0f").  */
4571   save_in = input_line_pointer;
4572   input_line_pointer = *str;
4573   if (expression (&exp) == absolute_section
4574       && exp.X_op == O_big
4575       && exp.X_add_number < 0)
4576     {
4577       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4578          Ditto for 15.  */
4579       if (gen_to_words (words, 5, (long) 15) == 0)
4580         {
4581           for (i = 0; i < NUM_FLOAT_VALS; i++)
4582             {
4583               for (j = 0; j < MAX_LITTLENUMS; j++)
4584                 {
4585                   if (words[j] != fp_values[i][j])
4586                     break;
4587                 }
4588
4589               if (j == MAX_LITTLENUMS)
4590                 {
4591                   *str = input_line_pointer;
4592                   input_line_pointer = save_in;
4593                   return i + 8;
4594                 }
4595             }
4596         }
4597     }
4598
4599   *str = input_line_pointer;
4600   input_line_pointer = save_in;
4601   inst.error = _("invalid FPA immediate expression");
4602   return FAIL;
4603 }
4604
4605 /* Returns 1 if a number has "quarter-precision" float format
4606    0baBbbbbbc defgh000 00000000 00000000.  */
4607
4608 static int
4609 is_quarter_float (unsigned imm)
4610 {
4611   int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4612   return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4613 }
4614
4615 /* Parse an 8-bit "quarter-precision" floating point number of the form:
4616    0baBbbbbbc defgh000 00000000 00000000.
4617    The zero and minus-zero cases need special handling, since they can't be
4618    encoded in the "quarter-precision" float format, but can nonetheless be
4619    loaded as integer constants.  */
4620
4621 static unsigned
4622 parse_qfloat_immediate (char **ccp, int *immed)
4623 {
4624   char *str = *ccp;
4625   char *fpnum;
4626   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4627   int found_fpchar = 0;
4628
4629   skip_past_char (&str, '#');
4630
4631   /* We must not accidentally parse an integer as a floating-point number. Make
4632      sure that the value we parse is not an integer by checking for special
4633      characters '.' or 'e'.
4634      FIXME: This is a horrible hack, but doing better is tricky because type
4635      information isn't in a very usable state at parse time.  */
4636   fpnum = str;
4637   skip_whitespace (fpnum);
4638
4639   if (strncmp (fpnum, "0x", 2) == 0)
4640     return FAIL;
4641   else
4642     {
4643       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4644         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4645           {
4646             found_fpchar = 1;
4647             break;
4648           }
4649
4650       if (!found_fpchar)
4651         return FAIL;
4652     }
4653
4654   if ((str = atof_ieee (str, 's', words)) != NULL)
4655     {
4656       unsigned fpword = 0;
4657       int i;
4658
4659       /* Our FP word must be 32 bits (single-precision FP).  */
4660       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4661         {
4662           fpword <<= LITTLENUM_NUMBER_OF_BITS;
4663           fpword |= words[i];
4664         }
4665
4666       if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
4667         *immed = fpword;
4668       else
4669         return FAIL;
4670
4671       *ccp = str;
4672
4673       return SUCCESS;
4674     }
4675
4676   return FAIL;
4677 }
4678
4679 /* Shift operands.  */
4680 enum shift_kind
4681 {
4682   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4683 };
4684
4685 struct asm_shift_name
4686 {
4687   const char      *name;
4688   enum shift_kind  kind;
4689 };
4690
4691 /* Third argument to parse_shift.  */
4692 enum parse_shift_mode
4693 {
4694   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
4695   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
4696   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
4697   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
4698   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
4699 };
4700
4701 /* Parse a <shift> specifier on an ARM data processing instruction.
4702    This has three forms:
4703
4704      (LSL|LSR|ASL|ASR|ROR) Rs
4705      (LSL|LSR|ASL|ASR|ROR) #imm
4706      RRX
4707
4708    Note that ASL is assimilated to LSL in the instruction encoding, and
4709    RRX to ROR #0 (which cannot be written as such).  */
4710
4711 static int
4712 parse_shift (char **str, int i, enum parse_shift_mode mode)
4713 {
4714   const struct asm_shift_name *shift_name;
4715   enum shift_kind shift;
4716   char *s = *str;
4717   char *p = s;
4718   int reg;
4719
4720   for (p = *str; ISALPHA (*p); p++)
4721     ;
4722
4723   if (p == *str)
4724     {
4725       inst.error = _("shift expression expected");
4726       return FAIL;
4727     }
4728
4729   shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
4730                                                             p - *str);
4731
4732   if (shift_name == NULL)
4733     {
4734       inst.error = _("shift expression expected");
4735       return FAIL;
4736     }
4737
4738   shift = shift_name->kind;
4739
4740   switch (mode)
4741     {
4742     case NO_SHIFT_RESTRICT:
4743     case SHIFT_IMMEDIATE:   break;
4744
4745     case SHIFT_LSL_OR_ASR_IMMEDIATE:
4746       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4747         {
4748           inst.error = _("'LSL' or 'ASR' required");
4749           return FAIL;
4750         }
4751       break;
4752
4753     case SHIFT_LSL_IMMEDIATE:
4754       if (shift != SHIFT_LSL)
4755         {
4756           inst.error = _("'LSL' required");
4757           return FAIL;
4758         }
4759       break;
4760
4761     case SHIFT_ASR_IMMEDIATE:
4762       if (shift != SHIFT_ASR)
4763         {
4764           inst.error = _("'ASR' required");
4765           return FAIL;
4766         }
4767       break;
4768
4769     default: abort ();
4770     }
4771
4772   if (shift != SHIFT_RRX)
4773     {
4774       /* Whitespace can appear here if the next thing is a bare digit.  */
4775       skip_whitespace (p);
4776
4777       if (mode == NO_SHIFT_RESTRICT
4778           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
4779         {
4780           inst.operands[i].imm = reg;
4781           inst.operands[i].immisreg = 1;
4782         }
4783       else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4784         return FAIL;
4785     }
4786   inst.operands[i].shift_kind = shift;
4787   inst.operands[i].shifted = 1;
4788   *str = p;
4789   return SUCCESS;
4790 }
4791
4792 /* Parse a <shifter_operand> for an ARM data processing instruction:
4793
4794       #<immediate>
4795       #<immediate>, <rotate>
4796       <Rm>
4797       <Rm>, <shift>
4798
4799    where <shift> is defined by parse_shift above, and <rotate> is a
4800    multiple of 2 between 0 and 30.  Validation of immediate operands
4801    is deferred to md_apply_fix.  */
4802
4803 static int
4804 parse_shifter_operand (char **str, int i)
4805 {
4806   int value;
4807   expressionS exp;
4808
4809   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
4810     {
4811       inst.operands[i].reg = value;
4812       inst.operands[i].isreg = 1;
4813
4814       /* parse_shift will override this if appropriate */
4815       inst.reloc.exp.X_op = O_constant;
4816       inst.reloc.exp.X_add_number = 0;
4817
4818       if (skip_past_comma (str) == FAIL)
4819         return SUCCESS;
4820
4821       /* Shift operation on register.  */
4822       return parse_shift (str, i, NO_SHIFT_RESTRICT);
4823     }
4824
4825   if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4826     return FAIL;
4827
4828   if (skip_past_comma (str) == SUCCESS)
4829     {
4830       /* #x, y -- ie explicit rotation by Y.  */
4831       if (my_get_expression (&exp, str, GE_NO_PREFIX))
4832         return FAIL;
4833
4834       if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
4835         {
4836           inst.error = _("constant expression expected");
4837           return FAIL;
4838         }
4839
4840       value = exp.X_add_number;
4841       if (value < 0 || value > 30 || value % 2 != 0)
4842         {
4843           inst.error = _("invalid rotation");
4844           return FAIL;
4845         }
4846       if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4847         {
4848           inst.error = _("invalid constant");
4849           return FAIL;
4850         }
4851
4852       /* Convert to decoded value.  md_apply_fix will put it back.  */
4853       inst.reloc.exp.X_add_number
4854         = (((inst.reloc.exp.X_add_number << (32 - value))
4855             | (inst.reloc.exp.X_add_number >> value)) & 0xffffffff);
4856     }
4857
4858   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4859   inst.reloc.pc_rel = 0;
4860   return SUCCESS;
4861 }
4862
4863 /* Group relocation information.  Each entry in the table contains the
4864    textual name of the relocation as may appear in assembler source
4865    and must end with a colon.
4866    Along with this textual name are the relocation codes to be used if
4867    the corresponding instruction is an ALU instruction (ADD or SUB only),
4868    an LDR, an LDRS, or an LDC.  */
4869
4870 struct group_reloc_table_entry
4871 {
4872   const char *name;
4873   int alu_code;
4874   int ldr_code;
4875   int ldrs_code;
4876   int ldc_code;
4877 };
4878
4879 typedef enum
4880 {
4881   /* Varieties of non-ALU group relocation.  */
4882
4883   GROUP_LDR,
4884   GROUP_LDRS,
4885   GROUP_LDC
4886 } group_reloc_type;
4887
4888 static struct group_reloc_table_entry group_reloc_table[] =
4889   { /* Program counter relative: */
4890     { "pc_g0_nc",
4891       BFD_RELOC_ARM_ALU_PC_G0_NC,       /* ALU */
4892       0,                                /* LDR */
4893       0,                                /* LDRS */
4894       0 },                              /* LDC */
4895     { "pc_g0",
4896       BFD_RELOC_ARM_ALU_PC_G0,          /* ALU */
4897       BFD_RELOC_ARM_LDR_PC_G0,          /* LDR */
4898       BFD_RELOC_ARM_LDRS_PC_G0,         /* LDRS */
4899       BFD_RELOC_ARM_LDC_PC_G0 },        /* LDC */
4900     { "pc_g1_nc",
4901       BFD_RELOC_ARM_ALU_PC_G1_NC,       /* ALU */
4902       0,                                /* LDR */
4903       0,                                /* LDRS */
4904       0 },                              /* LDC */
4905     { "pc_g1",
4906       BFD_RELOC_ARM_ALU_PC_G1,          /* ALU */
4907       BFD_RELOC_ARM_LDR_PC_G1,          /* LDR */
4908       BFD_RELOC_ARM_LDRS_PC_G1,         /* LDRS */
4909       BFD_RELOC_ARM_LDC_PC_G1 },        /* LDC */
4910     { "pc_g2",
4911       BFD_RELOC_ARM_ALU_PC_G2,          /* ALU */
4912       BFD_RELOC_ARM_LDR_PC_G2,          /* LDR */
4913       BFD_RELOC_ARM_LDRS_PC_G2,         /* LDRS */
4914       BFD_RELOC_ARM_LDC_PC_G2 },        /* LDC */
4915     /* Section base relative */
4916     { "sb_g0_nc",
4917       BFD_RELOC_ARM_ALU_SB_G0_NC,       /* ALU */
4918       0,                                /* LDR */
4919       0,                                /* LDRS */
4920       0 },                              /* LDC */
4921     { "sb_g0",
4922       BFD_RELOC_ARM_ALU_SB_G0,          /* ALU */
4923       BFD_RELOC_ARM_LDR_SB_G0,          /* LDR */
4924       BFD_RELOC_ARM_LDRS_SB_G0,         /* LDRS */
4925       BFD_RELOC_ARM_LDC_SB_G0 },        /* LDC */
4926     { "sb_g1_nc",
4927       BFD_RELOC_ARM_ALU_SB_G1_NC,       /* ALU */
4928       0,                                /* LDR */
4929       0,                                /* LDRS */
4930       0 },                              /* LDC */
4931     { "sb_g1",
4932       BFD_RELOC_ARM_ALU_SB_G1,          /* ALU */
4933       BFD_RELOC_ARM_LDR_SB_G1,          /* LDR */
4934       BFD_RELOC_ARM_LDRS_SB_G1,         /* LDRS */
4935       BFD_RELOC_ARM_LDC_SB_G1 },        /* LDC */
4936     { "sb_g2",
4937       BFD_RELOC_ARM_ALU_SB_G2,          /* ALU */
4938       BFD_RELOC_ARM_LDR_SB_G2,          /* LDR */
4939       BFD_RELOC_ARM_LDRS_SB_G2,         /* LDRS */
4940       BFD_RELOC_ARM_LDC_SB_G2 } };      /* LDC */
4941
4942 /* Given the address of a pointer pointing to the textual name of a group
4943    relocation as may appear in assembler source, attempt to find its details
4944    in group_reloc_table.  The pointer will be updated to the character after
4945    the trailing colon.  On failure, FAIL will be returned; SUCCESS
4946    otherwise.  On success, *entry will be updated to point at the relevant
4947    group_reloc_table entry. */
4948
4949 static int
4950 find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
4951 {
4952   unsigned int i;
4953   for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
4954     {
4955       int length = strlen (group_reloc_table[i].name);
4956
4957       if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
4958           && (*str)[length] == ':')
4959         {
4960           *out = &group_reloc_table[i];
4961           *str += (length + 1);
4962           return SUCCESS;
4963         }
4964     }
4965
4966   return FAIL;
4967 }
4968
4969 /* Parse a <shifter_operand> for an ARM data processing instruction
4970    (as for parse_shifter_operand) where group relocations are allowed:
4971
4972       #<immediate>
4973       #<immediate>, <rotate>
4974       #:<group_reloc>:<expression>
4975       <Rm>
4976       <Rm>, <shift>
4977
4978    where <group_reloc> is one of the strings defined in group_reloc_table.
4979    The hashes are optional.
4980
4981    Everything else is as for parse_shifter_operand.  */
4982
4983 static parse_operand_result
4984 parse_shifter_operand_group_reloc (char **str, int i)
4985 {
4986   /* Determine if we have the sequence of characters #: or just :
4987      coming next.  If we do, then we check for a group relocation.
4988      If we don't, punt the whole lot to parse_shifter_operand.  */
4989
4990   if (((*str)[0] == '#' && (*str)[1] == ':')
4991       || (*str)[0] == ':')
4992     {
4993       struct group_reloc_table_entry *entry;
4994
4995       if ((*str)[0] == '#')
4996         (*str) += 2;
4997       else
4998         (*str)++;
4999
5000       /* Try to parse a group relocation.  Anything else is an error.  */
5001       if (find_group_reloc_table_entry (str, &entry) == FAIL)
5002         {
5003           inst.error = _("unknown group relocation");
5004           return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5005         }
5006
5007       /* We now have the group relocation table entry corresponding to
5008          the name in the assembler source.  Next, we parse the expression.  */
5009       if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
5010         return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5011
5012       /* Record the relocation type (always the ALU variant here).  */
5013       inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
5014       gas_assert (inst.reloc.type != 0);
5015
5016       return PARSE_OPERAND_SUCCESS;
5017     }
5018   else
5019     return parse_shifter_operand (str, i) == SUCCESS
5020            ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
5021
5022   /* Never reached.  */
5023 }
5024
5025 /* Parse a Neon alignment expression.  Information is written to
5026    inst.operands[i].  We assume the initial ':' has been skipped.
5027    
5028    align        .imm = align << 8, .immisalign=1, .preind=0  */
5029 static parse_operand_result
5030 parse_neon_alignment (char **str, int i)
5031 {
5032   char *p = *str;
5033   expressionS exp;
5034
5035   my_get_expression (&exp, &p, GE_NO_PREFIX);
5036
5037   if (exp.X_op != O_constant)
5038     {
5039       inst.error = _("alignment must be constant");
5040       return PARSE_OPERAND_FAIL;
5041     }
5042
5043   inst.operands[i].imm = exp.X_add_number << 8;
5044   inst.operands[i].immisalign = 1;
5045   /* Alignments are not pre-indexes.  */
5046   inst.operands[i].preind = 0;
5047
5048   *str = p;
5049   return PARSE_OPERAND_SUCCESS;
5050 }
5051
5052 /* Parse all forms of an ARM address expression.  Information is written
5053    to inst.operands[i] and/or inst.reloc.
5054
5055    Preindexed addressing (.preind=1):
5056
5057    [Rn, #offset]       .reg=Rn .reloc.exp=offset
5058    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5059    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5060                        .shift_kind=shift .reloc.exp=shift_imm
5061
5062    These three may have a trailing ! which causes .writeback to be set also.
5063
5064    Postindexed addressing (.postind=1, .writeback=1):
5065
5066    [Rn], #offset       .reg=Rn .reloc.exp=offset
5067    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5068    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5069                        .shift_kind=shift .reloc.exp=shift_imm
5070
5071    Unindexed addressing (.preind=0, .postind=0):
5072
5073    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
5074
5075    Other:
5076
5077    [Rn]{!}             shorthand for [Rn,#0]{!}
5078    =immediate          .isreg=0 .reloc.exp=immediate
5079    label               .reg=PC .reloc.pc_rel=1 .reloc.exp=label
5080
5081   It is the caller's responsibility to check for addressing modes not
5082   supported by the instruction, and to set inst.reloc.type.  */
5083
5084 static parse_operand_result
5085 parse_address_main (char **str, int i, int group_relocations,
5086                     group_reloc_type group_type)
5087 {
5088   char *p = *str;
5089   int reg;
5090
5091   if (skip_past_char (&p, '[') == FAIL)
5092     {
5093       if (skip_past_char (&p, '=') == FAIL)
5094         {
5095           /* Bare address - translate to PC-relative offset.  */
5096           inst.reloc.pc_rel = 1;
5097           inst.operands[i].reg = REG_PC;
5098           inst.operands[i].isreg = 1;
5099           inst.operands[i].preind = 1;
5100         }
5101       /* Otherwise a load-constant pseudo op, no special treatment needed here.  */
5102
5103       if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5104         return PARSE_OPERAND_FAIL;
5105
5106       *str = p;
5107       return PARSE_OPERAND_SUCCESS;
5108     }
5109
5110   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5111     {
5112       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5113       return PARSE_OPERAND_FAIL;
5114     }
5115   inst.operands[i].reg = reg;
5116   inst.operands[i].isreg = 1;
5117
5118   if (skip_past_comma (&p) == SUCCESS)
5119     {
5120       inst.operands[i].preind = 1;
5121
5122       if (*p == '+') p++;
5123       else if (*p == '-') p++, inst.operands[i].negative = 1;
5124
5125       if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5126         {
5127           inst.operands[i].imm = reg;
5128           inst.operands[i].immisreg = 1;
5129
5130           if (skip_past_comma (&p) == SUCCESS)
5131             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5132               return PARSE_OPERAND_FAIL;
5133         }
5134       else if (skip_past_char (&p, ':') == SUCCESS)
5135         {
5136           /* FIXME: '@' should be used here, but it's filtered out by generic
5137              code before we get to see it here. This may be subject to
5138              change.  */
5139           parse_operand_result result = parse_neon_alignment (&p, i);
5140           
5141           if (result != PARSE_OPERAND_SUCCESS)
5142             return result;
5143         }
5144       else
5145         {
5146           if (inst.operands[i].negative)
5147             {
5148               inst.operands[i].negative = 0;
5149               p--;
5150             }
5151
5152           if (group_relocations
5153               && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
5154             {
5155               struct group_reloc_table_entry *entry;
5156
5157               /* Skip over the #: or : sequence.  */
5158               if (*p == '#')
5159                 p += 2;
5160               else
5161                 p++;
5162
5163               /* Try to parse a group relocation.  Anything else is an
5164                  error.  */
5165               if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5166                 {
5167                   inst.error = _("unknown group relocation");
5168                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5169                 }
5170
5171               /* We now have the group relocation table entry corresponding to
5172                  the name in the assembler source.  Next, we parse the
5173                  expression.  */
5174               if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5175                 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5176
5177               /* Record the relocation type.  */
5178               switch (group_type)
5179                 {
5180                   case GROUP_LDR:
5181                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
5182                     break;
5183
5184                   case GROUP_LDRS:
5185                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
5186                     break;
5187
5188                   case GROUP_LDC:
5189                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
5190                     break;
5191
5192                   default:
5193                     gas_assert (0);
5194                 }
5195
5196               if (inst.reloc.type == 0)
5197                 {
5198                   inst.error = _("this group relocation is not allowed on this instruction");
5199                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5200                 }
5201             }
5202           else
5203             {
5204               char *q = p;
5205               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5206                 return PARSE_OPERAND_FAIL;
5207               /* If the offset is 0, find out if it's a +0 or -0.  */
5208               if (inst.reloc.exp.X_op == O_constant
5209                   && inst.reloc.exp.X_add_number == 0)
5210                 {
5211                   skip_whitespace (q);
5212                   if (*q == '#')
5213                     {
5214                       q++;
5215                       skip_whitespace (q);
5216                     }
5217                   if (*q == '-')
5218                     inst.operands[i].negative = 1;
5219                 }
5220             }
5221         }
5222     }
5223   else if (skip_past_char (&p, ':') == SUCCESS)
5224     {
5225       /* FIXME: '@' should be used here, but it's filtered out by generic code
5226          before we get to see it here. This may be subject to change.  */
5227       parse_operand_result result = parse_neon_alignment (&p, i);
5228       
5229       if (result != PARSE_OPERAND_SUCCESS)
5230         return result;
5231     }
5232
5233   if (skip_past_char (&p, ']') == FAIL)
5234     {
5235       inst.error = _("']' expected");
5236       return PARSE_OPERAND_FAIL;
5237     }
5238
5239   if (skip_past_char (&p, '!') == SUCCESS)
5240     inst.operands[i].writeback = 1;
5241
5242   else if (skip_past_comma (&p) == SUCCESS)
5243     {
5244       if (skip_past_char (&p, '{') == SUCCESS)
5245         {
5246           /* [Rn], {expr} - unindexed, with option */
5247           if (parse_immediate (&p, &inst.operands[i].imm,
5248                                0, 255, TRUE) == FAIL)
5249             return PARSE_OPERAND_FAIL;
5250
5251           if (skip_past_char (&p, '}') == FAIL)
5252             {
5253               inst.error = _("'}' expected at end of 'option' field");
5254               return PARSE_OPERAND_FAIL;
5255             }
5256           if (inst.operands[i].preind)
5257             {
5258               inst.error = _("cannot combine index with option");
5259               return PARSE_OPERAND_FAIL;
5260             }
5261           *str = p;
5262           return PARSE_OPERAND_SUCCESS;
5263         }
5264       else
5265         {
5266           inst.operands[i].postind = 1;
5267           inst.operands[i].writeback = 1;
5268
5269           if (inst.operands[i].preind)
5270             {
5271               inst.error = _("cannot combine pre- and post-indexing");
5272               return PARSE_OPERAND_FAIL;
5273             }
5274
5275           if (*p == '+') p++;
5276           else if (*p == '-') p++, inst.operands[i].negative = 1;
5277
5278           if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5279             {
5280               /* We might be using the immediate for alignment already. If we
5281                  are, OR the register number into the low-order bits.  */
5282               if (inst.operands[i].immisalign)
5283                 inst.operands[i].imm |= reg;
5284               else
5285                 inst.operands[i].imm = reg;
5286               inst.operands[i].immisreg = 1;
5287
5288               if (skip_past_comma (&p) == SUCCESS)
5289                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5290                   return PARSE_OPERAND_FAIL;
5291             }
5292           else
5293             {
5294               char *q = p;
5295               if (inst.operands[i].negative)
5296                 {
5297                   inst.operands[i].negative = 0;
5298                   p--;
5299                 }
5300               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5301                 return PARSE_OPERAND_FAIL;
5302               /* If the offset is 0, find out if it's a +0 or -0.  */
5303               if (inst.reloc.exp.X_op == O_constant
5304                   && inst.reloc.exp.X_add_number == 0)
5305                 {
5306                   skip_whitespace (q);
5307                   if (*q == '#')
5308                     {
5309                       q++;
5310                       skip_whitespace (q);
5311                     }
5312                   if (*q == '-')
5313                     inst.operands[i].negative = 1;
5314                 }
5315             }
5316         }
5317     }
5318
5319   /* If at this point neither .preind nor .postind is set, we have a
5320      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
5321   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5322     {
5323       inst.operands[i].preind = 1;
5324       inst.reloc.exp.X_op = O_constant;
5325       inst.reloc.exp.X_add_number = 0;
5326     }
5327   *str = p;
5328   return PARSE_OPERAND_SUCCESS;
5329 }
5330
5331 static int
5332 parse_address (char **str, int i)
5333 {
5334   return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
5335          ? SUCCESS : FAIL;
5336 }
5337
5338 static parse_operand_result
5339 parse_address_group_reloc (char **str, int i, group_reloc_type type)
5340 {
5341   return parse_address_main (str, i, 1, type);
5342 }
5343
5344 /* Parse an operand for a MOVW or MOVT instruction.  */
5345 static int
5346 parse_half (char **str)
5347 {
5348   char * p;
5349
5350   p = *str;
5351   skip_past_char (&p, '#');
5352   if (strncasecmp (p, ":lower16:", 9) == 0)
5353     inst.reloc.type = BFD_RELOC_ARM_MOVW;
5354   else if (strncasecmp (p, ":upper16:", 9) == 0)
5355     inst.reloc.type = BFD_RELOC_ARM_MOVT;
5356
5357   if (inst.reloc.type != BFD_RELOC_UNUSED)
5358     {
5359       p += 9;
5360       skip_whitespace (p);
5361     }
5362
5363   if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5364     return FAIL;
5365
5366   if (inst.reloc.type == BFD_RELOC_UNUSED)
5367     {
5368       if (inst.reloc.exp.X_op != O_constant)
5369         {
5370           inst.error = _("constant expression expected");
5371           return FAIL;
5372         }
5373       if (inst.reloc.exp.X_add_number < 0
5374           || inst.reloc.exp.X_add_number > 0xffff)
5375         {
5376           inst.error = _("immediate value out of range");
5377           return FAIL;
5378         }
5379     }
5380   *str = p;
5381   return SUCCESS;
5382 }
5383
5384 /* Miscellaneous. */
5385
5386 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
5387    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
5388 static int
5389 parse_psr (char **str, bfd_boolean lhs)
5390 {
5391   char *p;
5392   unsigned long psr_field;
5393   const struct asm_psr *psr;
5394   char *start;
5395   bfd_boolean is_apsr = FALSE;
5396   bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
5397
5398   /* PR gas/12698:  If the user has specified -march=all then m_profile will
5399      be TRUE, but we want to ignore it in this case as we are building for any
5400      CPU type, including non-m variants.  */
5401   if (selected_cpu.core == arm_arch_any.core)
5402     m_profile = FALSE;
5403
5404   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
5405      feature for ease of use and backwards compatibility.  */
5406   p = *str;
5407   if (strncasecmp (p, "SPSR", 4) == 0)
5408     {
5409       if (m_profile)
5410         goto unsupported_psr;
5411         
5412       psr_field = SPSR_BIT;
5413     }
5414   else if (strncasecmp (p, "CPSR", 4) == 0)
5415     {
5416       if (m_profile)
5417         goto unsupported_psr;
5418
5419       psr_field = 0;
5420     }
5421   else if (strncasecmp (p, "APSR", 4) == 0)
5422     {
5423       /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
5424          and ARMv7-R architecture CPUs.  */
5425       is_apsr = TRUE;
5426       psr_field = 0;
5427     }
5428   else if (m_profile)
5429     {
5430       start = p;
5431       do
5432         p++;
5433       while (ISALNUM (*p) || *p == '_');
5434
5435       if (strncasecmp (start, "iapsr", 5) == 0
5436           || strncasecmp (start, "eapsr", 5) == 0
5437           || strncasecmp (start, "xpsr", 4) == 0
5438           || strncasecmp (start, "psr", 3) == 0)
5439         p = start + strcspn (start, "rR") + 1;
5440
5441       psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5442                                                   p - start);
5443
5444       if (!psr)
5445         return FAIL;
5446
5447       /* If APSR is being written, a bitfield may be specified.  Note that
5448          APSR itself is handled above.  */
5449       if (psr->field <= 3)
5450         {
5451           psr_field = psr->field;
5452           is_apsr = TRUE;
5453           goto check_suffix;
5454         }
5455
5456       *str = p;
5457       /* M-profile MSR instructions have the mask field set to "10", except
5458          *PSR variants which modify APSR, which may use a different mask (and
5459          have been handled already).  Do that by setting the PSR_f field
5460          here.  */
5461       return psr->field | (lhs ? PSR_f : 0);
5462     }
5463   else
5464     goto unsupported_psr;
5465
5466   p += 4;
5467 check_suffix:
5468   if (*p == '_')
5469     {
5470       /* A suffix follows.  */
5471       p++;
5472       start = p;
5473
5474       do
5475         p++;
5476       while (ISALNUM (*p) || *p == '_');
5477
5478       if (is_apsr)
5479         {
5480           /* APSR uses a notation for bits, rather than fields.  */
5481           unsigned int nzcvq_bits = 0;
5482           unsigned int g_bit = 0;
5483           char *bit;
5484           
5485           for (bit = start; bit != p; bit++)
5486             {
5487               switch (TOLOWER (*bit))
5488                 {
5489                 case 'n':
5490                   nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
5491                   break;
5492
5493                 case 'z':
5494                   nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
5495                   break;
5496
5497                 case 'c':
5498                   nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
5499                   break;
5500
5501                 case 'v':
5502                   nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
5503                   break;
5504                 
5505                 case 'q':
5506                   nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
5507                   break;
5508                 
5509                 case 'g':
5510                   g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
5511                   break;
5512                 
5513                 default:
5514                   inst.error = _("unexpected bit specified after APSR");
5515                   return FAIL;
5516                 }
5517             }
5518           
5519           if (nzcvq_bits == 0x1f)
5520             psr_field |= PSR_f;
5521           
5522           if (g_bit == 0x1)
5523             {
5524               if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
5525                 {
5526                   inst.error = _("selected processor does not "
5527                                  "support DSP extension");
5528                   return FAIL;
5529                 }
5530
5531               psr_field |= PSR_s;
5532             }
5533           
5534           if ((nzcvq_bits & 0x20) != 0
5535               || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
5536               || (g_bit & 0x2) != 0)
5537             {
5538               inst.error = _("bad bitmask specified after APSR");
5539               return FAIL;
5540             }
5541         }
5542       else
5543         {
5544           psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5545                                                       p - start);
5546           if (!psr)
5547             goto error;
5548
5549           psr_field |= psr->field;
5550         }
5551     }
5552   else
5553     {
5554       if (ISALNUM (*p))
5555         goto error;    /* Garbage after "[CS]PSR".  */
5556
5557       /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes).  This
5558          is deprecated, but allow it anyway.  */
5559       if (is_apsr && lhs)
5560         {
5561           psr_field |= PSR_f;
5562           as_tsktsk (_("writing to APSR without specifying a bitmask is "
5563                        "deprecated"));
5564         }
5565       else if (!m_profile)
5566         /* These bits are never right for M-profile devices: don't set them
5567            (only code paths which read/write APSR reach here).  */
5568         psr_field |= (PSR_c | PSR_f);
5569     }
5570   *str = p;
5571   return psr_field;
5572
5573  unsupported_psr:
5574   inst.error = _("selected processor does not support requested special "
5575                  "purpose register");
5576   return FAIL;
5577
5578  error:
5579   inst.error = _("flag for {c}psr instruction expected");
5580   return FAIL;
5581 }
5582
5583 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
5584    value suitable for splatting into the AIF field of the instruction.  */
5585
5586 static int
5587 parse_cps_flags (char **str)
5588 {
5589   int val = 0;
5590   int saw_a_flag = 0;
5591   char *s = *str;
5592
5593   for (;;)
5594     switch (*s++)
5595       {
5596       case '\0': case ',':
5597         goto done;
5598
5599       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5600       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5601       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
5602
5603       default:
5604         inst.error = _("unrecognized CPS flag");
5605         return FAIL;
5606       }
5607
5608  done:
5609   if (saw_a_flag == 0)
5610     {
5611       inst.error = _("missing CPS flags");
5612       return FAIL;
5613     }
5614
5615   *str = s - 1;
5616   return val;
5617 }
5618
5619 /* Parse an endian specifier ("BE" or "LE", case insensitive);
5620    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
5621
5622 static int
5623 parse_endian_specifier (char **str)
5624 {
5625   int little_endian;
5626   char *s = *str;
5627
5628   if (strncasecmp (s, "BE", 2))
5629     little_endian = 0;
5630   else if (strncasecmp (s, "LE", 2))
5631     little_endian = 1;
5632   else
5633     {
5634       inst.error = _("valid endian specifiers are be or le");
5635       return FAIL;
5636     }
5637
5638   if (ISALNUM (s[2]) || s[2] == '_')
5639     {
5640       inst.error = _("valid endian specifiers are be or le");
5641       return FAIL;
5642     }
5643
5644   *str = s + 2;
5645   return little_endian;
5646 }
5647
5648 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
5649    value suitable for poking into the rotate field of an sxt or sxta
5650    instruction, or FAIL on error.  */
5651
5652 static int
5653 parse_ror (char **str)
5654 {
5655   int rot;
5656   char *s = *str;
5657
5658   if (strncasecmp (s, "ROR", 3) == 0)
5659     s += 3;
5660   else
5661     {
5662       inst.error = _("missing rotation field after comma");
5663       return FAIL;
5664     }
5665
5666   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5667     return FAIL;
5668
5669   switch (rot)
5670     {
5671     case  0: *str = s; return 0x0;
5672     case  8: *str = s; return 0x1;
5673     case 16: *str = s; return 0x2;
5674     case 24: *str = s; return 0x3;
5675
5676     default:
5677       inst.error = _("rotation can only be 0, 8, 16, or 24");
5678       return FAIL;
5679     }
5680 }
5681
5682 /* Parse a conditional code (from conds[] below).  The value returned is in the
5683    range 0 .. 14, or FAIL.  */
5684 static int
5685 parse_cond (char **str)
5686 {
5687   char *q;
5688   const struct asm_cond *c;
5689   int n;
5690   /* Condition codes are always 2 characters, so matching up to
5691      3 characters is sufficient.  */
5692   char cond[3];
5693
5694   q = *str;
5695   n = 0;
5696   while (ISALPHA (*q) && n < 3)
5697     {
5698       cond[n] = TOLOWER (*q);
5699       q++;
5700       n++;
5701     }
5702
5703   c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
5704   if (!c)
5705     {
5706       inst.error = _("condition required");
5707       return FAIL;
5708     }
5709
5710   *str = q;
5711   return c->value;
5712 }
5713
5714 /* Parse an option for a barrier instruction.  Returns the encoding for the
5715    option, or FAIL.  */
5716 static int
5717 parse_barrier (char **str)
5718 {
5719   char *p, *q;
5720   const struct asm_barrier_opt *o;
5721
5722   p = q = *str;
5723   while (ISALPHA (*q))
5724     q++;
5725
5726   o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
5727                                                     q - p);
5728   if (!o)
5729     return FAIL;
5730
5731   *str = q;
5732   return o->value;
5733 }
5734
5735 /* Parse the operands of a table branch instruction.  Similar to a memory
5736    operand.  */
5737 static int
5738 parse_tb (char **str)
5739 {
5740   char * p = *str;
5741   int reg;
5742
5743   if (skip_past_char (&p, '[') == FAIL)
5744     {
5745       inst.error = _("'[' expected");
5746       return FAIL;
5747     }
5748
5749   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5750     {
5751       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5752       return FAIL;
5753     }
5754   inst.operands[0].reg = reg;
5755
5756   if (skip_past_comma (&p) == FAIL)
5757     {
5758       inst.error = _("',' expected");
5759       return FAIL;
5760     }
5761
5762   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5763     {
5764       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5765       return FAIL;
5766     }
5767   inst.operands[0].imm = reg;
5768
5769   if (skip_past_comma (&p) == SUCCESS)
5770     {
5771       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5772         return FAIL;
5773       if (inst.reloc.exp.X_add_number != 1)
5774         {
5775           inst.error = _("invalid shift");
5776           return FAIL;
5777         }
5778       inst.operands[0].shifted = 1;
5779     }
5780
5781   if (skip_past_char (&p, ']') == FAIL)
5782     {
5783       inst.error = _("']' expected");
5784       return FAIL;
5785     }
5786   *str = p;
5787   return SUCCESS;
5788 }
5789
5790 /* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5791    information on the types the operands can take and how they are encoded.
5792    Up to four operands may be read; this function handles setting the
5793    ".present" field for each read operand itself.
5794    Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5795    else returns FAIL.  */
5796
5797 static int
5798 parse_neon_mov (char **str, int *which_operand)
5799 {
5800   int i = *which_operand, val;
5801   enum arm_reg_type rtype;
5802   char *ptr = *str;
5803   struct neon_type_el optype;
5804
5805   if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5806     {
5807       /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
5808       inst.operands[i].reg = val;
5809       inst.operands[i].isscalar = 1;
5810       inst.operands[i].vectype = optype;
5811       inst.operands[i++].present = 1;
5812
5813       if (skip_past_comma (&ptr) == FAIL)
5814         goto wanted_comma;
5815
5816       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5817         goto wanted_arm;
5818
5819       inst.operands[i].reg = val;
5820       inst.operands[i].isreg = 1;
5821       inst.operands[i].present = 1;
5822     }
5823   else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
5824            != FAIL)
5825     {
5826       /* Cases 0, 1, 2, 3, 5 (D only).  */
5827       if (skip_past_comma (&ptr) == FAIL)
5828         goto wanted_comma;
5829
5830       inst.operands[i].reg = val;
5831       inst.operands[i].isreg = 1;
5832       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5833       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5834       inst.operands[i].isvec = 1;
5835       inst.operands[i].vectype = optype;
5836       inst.operands[i++].present = 1;
5837
5838       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5839         {
5840           /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5841              Case 13: VMOV <Sd>, <Rm>  */
5842           inst.operands[i].reg = val;
5843           inst.operands[i].isreg = 1;
5844           inst.operands[i].present = 1;
5845
5846           if (rtype == REG_TYPE_NQ)
5847             {
5848               first_error (_("can't use Neon quad register here"));
5849               return FAIL;
5850             }
5851           else if (rtype != REG_TYPE_VFS)
5852             {
5853               i++;
5854               if (skip_past_comma (&ptr) == FAIL)
5855                 goto wanted_comma;
5856               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5857                 goto wanted_arm;
5858               inst.operands[i].reg = val;
5859               inst.operands[i].isreg = 1;
5860               inst.operands[i].present = 1;
5861             }
5862         }
5863       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
5864                                            &optype)) != FAIL)
5865         {
5866           /* Case 0: VMOV<c><q> <Qd>, <Qm>
5867              Case 1: VMOV<c><q> <Dd>, <Dm>
5868              Case 8: VMOV.F32 <Sd>, <Sm>
5869              Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
5870
5871           inst.operands[i].reg = val;
5872           inst.operands[i].isreg = 1;
5873           inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5874           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5875           inst.operands[i].isvec = 1;
5876           inst.operands[i].vectype = optype;
5877           inst.operands[i].present = 1;
5878
5879           if (skip_past_comma (&ptr) == SUCCESS)
5880             {
5881               /* Case 15.  */
5882               i++;
5883
5884               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5885                 goto wanted_arm;
5886
5887               inst.operands[i].reg = val;
5888               inst.operands[i].isreg = 1;
5889               inst.operands[i++].present = 1;
5890
5891               if (skip_past_comma (&ptr) == FAIL)
5892                 goto wanted_comma;
5893
5894               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5895                 goto wanted_arm;
5896
5897               inst.operands[i].reg = val;
5898               inst.operands[i].isreg = 1;
5899               inst.operands[i++].present = 1;
5900             }
5901         }
5902       else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
5903           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
5904              Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
5905              Case 10: VMOV.F32 <Sd>, #<imm>
5906              Case 11: VMOV.F64 <Dd>, #<imm>  */
5907         inst.operands[i].immisfloat = 1;
5908       else if (parse_big_immediate (&ptr, i) == SUCCESS)
5909           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
5910              Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
5911         ;
5912       else
5913         {
5914           first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
5915           return FAIL;
5916         }
5917     }
5918   else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5919     {
5920       /* Cases 6, 7.  */
5921       inst.operands[i].reg = val;
5922       inst.operands[i].isreg = 1;
5923       inst.operands[i++].present = 1;
5924
5925       if (skip_past_comma (&ptr) == FAIL)
5926         goto wanted_comma;
5927
5928       if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5929         {
5930           /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
5931           inst.operands[i].reg = val;
5932           inst.operands[i].isscalar = 1;
5933           inst.operands[i].present = 1;
5934           inst.operands[i].vectype = optype;
5935         }
5936       else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5937         {
5938           /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
5939           inst.operands[i].reg = val;
5940           inst.operands[i].isreg = 1;
5941           inst.operands[i++].present = 1;
5942
5943           if (skip_past_comma (&ptr) == FAIL)
5944             goto wanted_comma;
5945
5946           if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
5947               == FAIL)
5948             {
5949               first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
5950               return FAIL;
5951             }
5952
5953           inst.operands[i].reg = val;
5954           inst.operands[i].isreg = 1;
5955           inst.operands[i].isvec = 1;
5956           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5957           inst.operands[i].vectype = optype;
5958           inst.operands[i].present = 1;
5959
5960           if (rtype == REG_TYPE_VFS)
5961             {
5962               /* Case 14.  */
5963               i++;
5964               if (skip_past_comma (&ptr) == FAIL)
5965                 goto wanted_comma;
5966               if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
5967                                               &optype)) == FAIL)
5968                 {
5969                   first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
5970                   return FAIL;
5971                 }
5972               inst.operands[i].reg = val;
5973               inst.operands[i].isreg = 1;
5974               inst.operands[i].isvec = 1;
5975               inst.operands[i].issingle = 1;
5976               inst.operands[i].vectype = optype;
5977               inst.operands[i].present = 1;
5978             }
5979         }
5980       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
5981                != FAIL)
5982         {
5983           /* Case 13.  */
5984           inst.operands[i].reg = val;
5985           inst.operands[i].isreg = 1;
5986           inst.operands[i].isvec = 1;
5987           inst.operands[i].issingle = 1;
5988           inst.operands[i].vectype = optype;
5989           inst.operands[i++].present = 1;
5990         }
5991     }
5992   else
5993     {
5994       first_error (_("parse error"));
5995       return FAIL;
5996     }
5997
5998   /* Successfully parsed the operands. Update args.  */
5999   *which_operand = i;
6000   *str = ptr;
6001   return SUCCESS;
6002
6003  wanted_comma:
6004   first_error (_("expected comma"));
6005   return FAIL;
6006
6007  wanted_arm:
6008   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
6009   return FAIL;
6010 }
6011
6012 /* Use this macro when the operand constraints are different
6013    for ARM and THUMB (e.g. ldrd).  */
6014 #define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6015         ((arm_operand) | ((thumb_operand) << 16))
6016
6017 /* Matcher codes for parse_operands.  */
6018 enum operand_parse_code
6019 {
6020   OP_stop,      /* end of line */
6021
6022   OP_RR,        /* ARM register */
6023   OP_RRnpc,     /* ARM register, not r15 */
6024   OP_RRnpcsp,   /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
6025   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
6026   OP_RRnpctw,   /* ARM register, not r15 in Thumb-state or with writeback, 
6027                    optional trailing ! */
6028   OP_RRw,       /* ARM register, not r15, optional trailing ! */
6029   OP_RCP,       /* Coprocessor number */
6030   OP_RCN,       /* Coprocessor register */
6031   OP_RF,        /* FPA register */
6032   OP_RVS,       /* VFP single precision register */
6033   OP_RVD,       /* VFP double precision register (0..15) */
6034   OP_RND,       /* Neon double precision register (0..31) */
6035   OP_RNQ,       /* Neon quad precision register */
6036   OP_RVSD,      /* VFP single or double precision register */
6037   OP_RNDQ,      /* Neon double or quad precision register */
6038   OP_RNSDQ,     /* Neon single, double or quad precision register */
6039   OP_RNSC,      /* Neon scalar D[X] */
6040   OP_RVC,       /* VFP control register */
6041   OP_RMF,       /* Maverick F register */
6042   OP_RMD,       /* Maverick D register */
6043   OP_RMFX,      /* Maverick FX register */
6044   OP_RMDX,      /* Maverick DX register */
6045   OP_RMAX,      /* Maverick AX register */
6046   OP_RMDS,      /* Maverick DSPSC register */
6047   OP_RIWR,      /* iWMMXt wR register */
6048   OP_RIWC,      /* iWMMXt wC register */
6049   OP_RIWG,      /* iWMMXt wCG register */
6050   OP_RXA,       /* XScale accumulator register */
6051
6052   OP_REGLST,    /* ARM register list */
6053   OP_VRSLST,    /* VFP single-precision register list */
6054   OP_VRDLST,    /* VFP double-precision register list */
6055   OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
6056   OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
6057   OP_NSTRLST,   /* Neon element/structure list */
6058
6059   OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
6060   OP_RVSD_I0,   /* VFP S or D reg, or immediate zero.  */
6061   OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
6062   OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
6063   OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
6064   OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
6065   OP_VMOV,      /* Neon VMOV operands.  */
6066   OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN.  */
6067   OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
6068   OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
6069
6070   OP_I0,        /* immediate zero */
6071   OP_I7,        /* immediate value 0 .. 7 */
6072   OP_I15,       /*                 0 .. 15 */
6073   OP_I16,       /*                 1 .. 16 */
6074   OP_I16z,      /*                 0 .. 16 */
6075   OP_I31,       /*                 0 .. 31 */
6076   OP_I31w,      /*                 0 .. 31, optional trailing ! */
6077   OP_I32,       /*                 1 .. 32 */
6078   OP_I32z,      /*                 0 .. 32 */
6079   OP_I63,       /*                 0 .. 63 */
6080   OP_I63s,      /*               -64 .. 63 */
6081   OP_I64,       /*                 1 .. 64 */
6082   OP_I64z,      /*                 0 .. 64 */
6083   OP_I255,      /*                 0 .. 255 */
6084
6085   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
6086   OP_I7b,       /*                             0 .. 7 */
6087   OP_I15b,      /*                             0 .. 15 */
6088   OP_I31b,      /*                             0 .. 31 */
6089
6090   OP_SH,        /* shifter operand */
6091   OP_SHG,       /* shifter operand with possible group relocation */
6092   OP_ADDR,      /* Memory address expression (any mode) */
6093   OP_ADDRGLDR,  /* Mem addr expr (any mode) with possible LDR group reloc */
6094   OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6095   OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
6096   OP_EXP,       /* arbitrary expression */
6097   OP_EXPi,      /* same, with optional immediate prefix */
6098   OP_EXPr,      /* same, with optional relocation suffix */
6099   OP_HALF,      /* 0 .. 65535 or low/high reloc.  */
6100
6101   OP_CPSF,      /* CPS flags */
6102   OP_ENDI,      /* Endianness specifier */
6103   OP_wPSR,      /* CPSR/SPSR/APSR mask for msr (writing).  */
6104   OP_rPSR,      /* CPSR/SPSR/APSR mask for msr (reading).  */
6105   OP_COND,      /* conditional code */
6106   OP_TB,        /* Table branch.  */
6107
6108   OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
6109
6110   OP_RRnpc_I0,  /* ARM register or literal 0 */
6111   OP_RR_EXr,    /* ARM register or expression with opt. reloc suff. */
6112   OP_RR_EXi,    /* ARM register or expression with imm prefix */
6113   OP_RF_IF,     /* FPA register or immediate */
6114   OP_RIWR_RIWC, /* iWMMXt R or C reg */
6115   OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
6116
6117   /* Optional operands.  */
6118   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
6119   OP_oI31b,      /*                             0 .. 31 */
6120   OP_oI32b,      /*                             1 .. 32 */
6121   OP_oIffffb,    /*                             0 .. 65535 */
6122   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
6123
6124   OP_oRR,        /* ARM register */
6125   OP_oRRnpc,     /* ARM register, not the PC */
6126   OP_oRRnpcsp,   /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
6127   OP_oRRw,       /* ARM register, not r15, optional trailing ! */
6128   OP_oRND,       /* Optional Neon double precision register */
6129   OP_oRNQ,       /* Optional Neon quad precision register */
6130   OP_oRNDQ,      /* Optional Neon double or quad precision register */
6131   OP_oRNSDQ,     /* Optional single, double or quad precision vector register */
6132   OP_oSHll,      /* LSL immediate */
6133   OP_oSHar,      /* ASR immediate */
6134   OP_oSHllar,    /* LSL or ASR immediate */
6135   OP_oROR,       /* ROR 0/8/16/24 */
6136   OP_oBARRIER_I15, /* Option argument for a barrier instruction.  */
6137
6138   /* Some pre-defined mixed (ARM/THUMB) operands.  */
6139   OP_RR_npcsp           = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
6140   OP_RRnpc_npcsp        = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
6141   OP_oRRnpc_npcsp       = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
6142
6143   OP_FIRST_OPTIONAL = OP_oI7b
6144 };
6145
6146 /* Generic instruction operand parser.  This does no encoding and no
6147    semantic validation; it merely squirrels values away in the inst
6148    structure.  Returns SUCCESS or FAIL depending on whether the
6149    specified grammar matched.  */
6150 static int
6151 parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
6152 {
6153   unsigned const int *upat = pattern;
6154   char *backtrack_pos = 0;
6155   const char *backtrack_error = 0;
6156   int i, val, backtrack_index = 0;
6157   enum arm_reg_type rtype;
6158   parse_operand_result result;
6159   unsigned int op_parse_code;
6160
6161 #define po_char_or_fail(chr)                    \
6162   do                                            \
6163     {                                           \
6164       if (skip_past_char (&str, chr) == FAIL)   \
6165         goto bad_args;                          \
6166     }                                           \
6167   while (0)
6168
6169 #define po_reg_or_fail(regtype)                                 \
6170   do                                                            \
6171     {                                                           \
6172       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6173                                  & inst.operands[i].vectype);   \
6174       if (val == FAIL)                                          \
6175         {                                                       \
6176           first_error (_(reg_expected_msgs[regtype]));          \
6177           goto failure;                                         \
6178         }                                                       \
6179       inst.operands[i].reg = val;                               \
6180       inst.operands[i].isreg = 1;                               \
6181       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6182       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6183       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6184                              || rtype == REG_TYPE_VFD           \
6185                              || rtype == REG_TYPE_NQ);          \
6186     }                                                           \
6187   while (0)
6188
6189 #define po_reg_or_goto(regtype, label)                          \
6190   do                                                            \
6191     {                                                           \
6192       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6193                                  & inst.operands[i].vectype);   \
6194       if (val == FAIL)                                          \
6195         goto label;                                             \
6196                                                                 \
6197       inst.operands[i].reg = val;                               \
6198       inst.operands[i].isreg = 1;                               \
6199       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6200       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6201       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6202                              || rtype == REG_TYPE_VFD           \
6203                              || rtype == REG_TYPE_NQ);          \
6204     }                                                           \
6205   while (0)
6206
6207 #define po_imm_or_fail(min, max, popt)                          \
6208   do                                                            \
6209     {                                                           \
6210       if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
6211         goto failure;                                           \
6212       inst.operands[i].imm = val;                               \
6213     }                                                           \
6214   while (0)
6215
6216 #define po_scalar_or_goto(elsz, label)                                  \
6217   do                                                                    \
6218     {                                                                   \
6219       val = parse_scalar (& str, elsz, & inst.operands[i].vectype);     \
6220       if (val == FAIL)                                                  \
6221         goto label;                                                     \
6222       inst.operands[i].reg = val;                                       \
6223       inst.operands[i].isscalar = 1;                                    \
6224     }                                                                   \
6225   while (0)
6226
6227 #define po_misc_or_fail(expr)                   \
6228   do                                            \
6229     {                                           \
6230       if (expr)                                 \
6231         goto failure;                           \
6232     }                                           \
6233   while (0)
6234
6235 #define po_misc_or_fail_no_backtrack(expr)              \
6236   do                                                    \
6237     {                                                   \
6238       result = expr;                                    \
6239       if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)    \
6240         backtrack_pos = 0;                              \
6241       if (result != PARSE_OPERAND_SUCCESS)              \
6242         goto failure;                                   \
6243     }                                                   \
6244   while (0)
6245
6246 #define po_barrier_or_imm(str)                             \
6247   do                                                       \
6248     {                                                      \
6249       val = parse_barrier (&str);                          \
6250       if (val == FAIL)                                     \
6251         {                                                  \
6252           if (ISALPHA (*str))                              \
6253               goto failure;                                \
6254           else                                             \
6255               goto immediate;                              \
6256         }                                                  \
6257       else                                                 \
6258         {                                                  \
6259           if ((inst.instruction & 0xf0) == 0x60            \
6260               && val != 0xf)                               \
6261             {                                              \
6262                /* ISB can only take SY as an option.  */   \
6263                inst.error = _("invalid barrier type");     \
6264                goto failure;                               \
6265             }                                              \
6266         }                                                  \
6267     }                                                      \
6268   while (0)
6269
6270   skip_whitespace (str);
6271
6272   for (i = 0; upat[i] != OP_stop; i++)
6273     {
6274       op_parse_code = upat[i];
6275       if (op_parse_code >= 1<<16)
6276         op_parse_code = thumb ? (op_parse_code >> 16)
6277                                 : (op_parse_code & ((1<<16)-1));
6278
6279       if (op_parse_code >= OP_FIRST_OPTIONAL)
6280         {
6281           /* Remember where we are in case we need to backtrack.  */
6282           gas_assert (!backtrack_pos);
6283           backtrack_pos = str;
6284           backtrack_error = inst.error;
6285           backtrack_index = i;
6286         }
6287
6288       if (i > 0 && (i > 1 || inst.operands[0].present))
6289         po_char_or_fail (',');
6290
6291       switch (op_parse_code)
6292         {
6293           /* Registers */
6294         case OP_oRRnpc:
6295         case OP_oRRnpcsp:
6296         case OP_RRnpc:
6297         case OP_RRnpcsp:
6298         case OP_oRR:
6299         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
6300         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
6301         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
6302         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
6303         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
6304         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
6305         case OP_oRND:
6306         case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);     break;
6307         case OP_RVC:
6308           po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6309           break;
6310           /* Also accept generic coprocessor regs for unknown registers.  */
6311           coproc_reg:
6312           po_reg_or_fail (REG_TYPE_CN);
6313           break;
6314         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
6315         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
6316         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
6317         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
6318         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
6319         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
6320         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
6321         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
6322         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
6323         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
6324         case OP_oRNQ:
6325         case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
6326         case OP_oRNDQ:
6327         case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
6328         case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
6329         case OP_oRNSDQ:
6330         case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
6331
6332         /* Neon scalar. Using an element size of 8 means that some invalid
6333            scalars are accepted here, so deal with those in later code.  */
6334         case OP_RNSC:  po_scalar_or_goto (8, failure);    break;
6335
6336         case OP_RNDQ_I0:
6337           {
6338             po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6339             break;
6340             try_imm0:
6341             po_imm_or_fail (0, 0, TRUE);
6342           }
6343           break;
6344
6345         case OP_RVSD_I0:
6346           po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6347           break;
6348
6349         case OP_RR_RNSC:
6350           {
6351             po_scalar_or_goto (8, try_rr);
6352             break;
6353             try_rr:
6354             po_reg_or_fail (REG_TYPE_RN);
6355           }
6356           break;
6357
6358         case OP_RNSDQ_RNSC:
6359           {
6360             po_scalar_or_goto (8, try_nsdq);
6361             break;
6362             try_nsdq:
6363             po_reg_or_fail (REG_TYPE_NSDQ);
6364           }
6365           break;
6366
6367         case OP_RNDQ_RNSC:
6368           {
6369             po_scalar_or_goto (8, try_ndq);
6370             break;
6371             try_ndq:
6372             po_reg_or_fail (REG_TYPE_NDQ);
6373           }
6374           break;
6375
6376         case OP_RND_RNSC:
6377           {
6378             po_scalar_or_goto (8, try_vfd);
6379             break;
6380             try_vfd:
6381             po_reg_or_fail (REG_TYPE_VFD);
6382           }
6383           break;
6384
6385         case OP_VMOV:
6386           /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6387              not careful then bad things might happen.  */
6388           po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6389           break;
6390
6391         case OP_RNDQ_Ibig:
6392           {
6393             po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
6394             break;
6395             try_immbig:
6396             /* There's a possibility of getting a 64-bit immediate here, so
6397                we need special handling.  */
6398             if (parse_big_immediate (&str, i) == FAIL)
6399               {
6400                 inst.error = _("immediate value is out of range");
6401                 goto failure;
6402               }
6403           }
6404           break;
6405
6406         case OP_RNDQ_I63b:
6407           {
6408             po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6409             break;
6410             try_shimm:
6411             po_imm_or_fail (0, 63, TRUE);
6412           }
6413           break;
6414
6415         case OP_RRnpcb:
6416           po_char_or_fail ('[');
6417           po_reg_or_fail  (REG_TYPE_RN);
6418           po_char_or_fail (']');
6419           break;
6420
6421         case OP_RRnpctw:
6422         case OP_RRw:
6423         case OP_oRRw:
6424           po_reg_or_fail (REG_TYPE_RN);
6425           if (skip_past_char (&str, '!') == SUCCESS)
6426             inst.operands[i].writeback = 1;
6427           break;
6428
6429           /* Immediates */
6430         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
6431         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
6432         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
6433         case OP_I16z:    po_imm_or_fail (  0,     16, FALSE);   break;
6434         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
6435         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
6436         case OP_I32z:    po_imm_or_fail (  0,     32, FALSE);   break;
6437         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
6438         case OP_I63:     po_imm_or_fail (  0,     63, FALSE);   break;
6439         case OP_I64:     po_imm_or_fail (  1,     64, FALSE);   break;
6440         case OP_I64z:    po_imm_or_fail (  0,     64, FALSE);   break;
6441         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
6442
6443         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
6444         case OP_oI7b:
6445         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
6446         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
6447         case OP_oI31b:
6448         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
6449         case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
6450         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
6451
6452           /* Immediate variants */
6453         case OP_oI255c:
6454           po_char_or_fail ('{');
6455           po_imm_or_fail (0, 255, TRUE);
6456           po_char_or_fail ('}');
6457           break;
6458
6459         case OP_I31w:
6460           /* The expression parser chokes on a trailing !, so we have
6461              to find it first and zap it.  */
6462           {
6463             char *s = str;
6464             while (*s && *s != ',')
6465               s++;
6466             if (s[-1] == '!')
6467               {
6468                 s[-1] = '\0';
6469                 inst.operands[i].writeback = 1;
6470               }
6471             po_imm_or_fail (0, 31, TRUE);
6472             if (str == s - 1)
6473               str = s;
6474           }
6475           break;
6476
6477           /* Expressions */
6478         case OP_EXPi:   EXPi:
6479           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6480                                               GE_OPT_PREFIX));
6481           break;
6482
6483         case OP_EXP:
6484           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6485                                               GE_NO_PREFIX));
6486           break;
6487
6488         case OP_EXPr:   EXPr:
6489           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6490                                               GE_NO_PREFIX));
6491           if (inst.reloc.exp.X_op == O_symbol)
6492             {
6493               val = parse_reloc (&str);
6494               if (val == -1)
6495                 {
6496                   inst.error = _("unrecognized relocation suffix");
6497                   goto failure;
6498                 }
6499               else if (val != BFD_RELOC_UNUSED)
6500                 {
6501                   inst.operands[i].imm = val;
6502                   inst.operands[i].hasreloc = 1;
6503                 }
6504             }
6505           break;
6506
6507           /* Operand for MOVW or MOVT.  */
6508         case OP_HALF:
6509           po_misc_or_fail (parse_half (&str));
6510           break;
6511
6512           /* Register or expression.  */
6513         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6514         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
6515
6516           /* Register or immediate.  */
6517         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
6518         I0:               po_imm_or_fail (0, 0, FALSE);       break;
6519
6520         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
6521         IF:
6522           if (!is_immediate_prefix (*str))
6523             goto bad_args;
6524           str++;
6525           val = parse_fpa_immediate (&str);
6526           if (val == FAIL)
6527             goto failure;
6528           /* FPA immediates are encoded as registers 8-15.
6529              parse_fpa_immediate has already applied the offset.  */
6530           inst.operands[i].reg = val;
6531           inst.operands[i].isreg = 1;
6532           break;
6533
6534         case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6535         I32z:             po_imm_or_fail (0, 32, FALSE);          break;
6536
6537           /* Two kinds of register.  */
6538         case OP_RIWR_RIWC:
6539           {
6540             struct reg_entry *rege = arm_reg_parse_multi (&str);
6541             if (!rege
6542                 || (rege->type != REG_TYPE_MMXWR
6543                     && rege->type != REG_TYPE_MMXWC
6544                     && rege->type != REG_TYPE_MMXWCG))
6545               {
6546                 inst.error = _("iWMMXt data or control register expected");
6547                 goto failure;
6548               }
6549             inst.operands[i].reg = rege->number;
6550             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6551           }
6552           break;
6553
6554         case OP_RIWC_RIWG:
6555           {
6556             struct reg_entry *rege = arm_reg_parse_multi (&str);
6557             if (!rege
6558                 || (rege->type != REG_TYPE_MMXWC
6559                     && rege->type != REG_TYPE_MMXWCG))
6560               {
6561                 inst.error = _("iWMMXt control register expected");
6562                 goto failure;
6563               }
6564             inst.operands[i].reg = rege->number;
6565             inst.operands[i].isreg = 1;
6566           }
6567           break;
6568
6569           /* Misc */
6570         case OP_CPSF:    val = parse_cps_flags (&str);          break;
6571         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
6572         case OP_oROR:    val = parse_ror (&str);                break;
6573         case OP_COND:    val = parse_cond (&str);               break;
6574         case OP_oBARRIER_I15:
6575           po_barrier_or_imm (str); break;
6576           immediate:
6577           if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
6578             goto failure;
6579           break;
6580
6581         case OP_wPSR:    
6582         case OP_rPSR:
6583           po_reg_or_goto (REG_TYPE_RNB, try_psr);
6584           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
6585             {
6586               inst.error = _("Banked registers are not available with this "
6587                              "architecture.");
6588               goto failure;
6589             }
6590           break;
6591           try_psr:
6592           val = parse_psr (&str, op_parse_code == OP_wPSR);
6593           break;
6594
6595         case OP_APSR_RR:
6596           po_reg_or_goto (REG_TYPE_RN, try_apsr);
6597           break;
6598           try_apsr:
6599           /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6600              instruction).  */
6601           if (strncasecmp (str, "APSR_", 5) == 0)
6602             {
6603               unsigned found = 0;
6604               str += 5;
6605               while (found < 15)
6606                 switch (*str++)
6607                   {
6608                   case 'c': found = (found & 1) ? 16 : found | 1; break;
6609                   case 'n': found = (found & 2) ? 16 : found | 2; break;
6610                   case 'z': found = (found & 4) ? 16 : found | 4; break;
6611                   case 'v': found = (found & 8) ? 16 : found | 8; break;
6612                   default: found = 16;
6613                   }
6614               if (found != 15)
6615                 goto failure;
6616               inst.operands[i].isvec = 1;
6617               /* APSR_nzcv is encoded in instructions as if it were the REG_PC.  */
6618               inst.operands[i].reg = REG_PC;
6619             }
6620           else
6621             goto failure;
6622           break;
6623
6624         case OP_TB:
6625           po_misc_or_fail (parse_tb (&str));
6626           break;
6627
6628           /* Register lists.  */
6629         case OP_REGLST:
6630           val = parse_reg_list (&str);
6631           if (*str == '^')
6632             {
6633               inst.operands[1].writeback = 1;
6634               str++;
6635             }
6636           break;
6637
6638         case OP_VRSLST:
6639           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
6640           break;
6641
6642         case OP_VRDLST:
6643           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
6644           break;
6645
6646         case OP_VRSDLST:
6647           /* Allow Q registers too.  */
6648           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6649                                     REGLIST_NEON_D);
6650           if (val == FAIL)
6651             {
6652               inst.error = NULL;
6653               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6654                                         REGLIST_VFP_S);
6655               inst.operands[i].issingle = 1;
6656             }
6657           break;
6658
6659         case OP_NRDLST:
6660           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6661                                     REGLIST_NEON_D);
6662           break;
6663
6664         case OP_NSTRLST:
6665           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6666                                            &inst.operands[i].vectype);
6667           break;
6668
6669           /* Addressing modes */
6670         case OP_ADDR:
6671           po_misc_or_fail (parse_address (&str, i));
6672           break;
6673
6674         case OP_ADDRGLDR:
6675           po_misc_or_fail_no_backtrack (
6676             parse_address_group_reloc (&str, i, GROUP_LDR));
6677           break;
6678
6679         case OP_ADDRGLDRS:
6680           po_misc_or_fail_no_backtrack (
6681             parse_address_group_reloc (&str, i, GROUP_LDRS));
6682           break;
6683
6684         case OP_ADDRGLDC:
6685           po_misc_or_fail_no_backtrack (
6686             parse_address_group_reloc (&str, i, GROUP_LDC));
6687           break;
6688
6689         case OP_SH:
6690           po_misc_or_fail (parse_shifter_operand (&str, i));
6691           break;
6692
6693         case OP_SHG:
6694           po_misc_or_fail_no_backtrack (
6695             parse_shifter_operand_group_reloc (&str, i));
6696           break;
6697
6698         case OP_oSHll:
6699           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6700           break;
6701
6702         case OP_oSHar:
6703           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6704           break;
6705
6706         case OP_oSHllar:
6707           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6708           break;
6709
6710         default:
6711           as_fatal (_("unhandled operand code %d"), op_parse_code);
6712         }
6713
6714       /* Various value-based sanity checks and shared operations.  We
6715          do not signal immediate failures for the register constraints;
6716          this allows a syntax error to take precedence.  */
6717       switch (op_parse_code)
6718         {
6719         case OP_oRRnpc:
6720         case OP_RRnpc:
6721         case OP_RRnpcb:
6722         case OP_RRw:
6723         case OP_oRRw:
6724         case OP_RRnpc_I0:
6725           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6726             inst.error = BAD_PC;
6727           break;
6728
6729         case OP_oRRnpcsp:
6730         case OP_RRnpcsp:
6731           if (inst.operands[i].isreg)
6732             {
6733               if (inst.operands[i].reg == REG_PC)
6734                 inst.error = BAD_PC;
6735               else if (inst.operands[i].reg == REG_SP)
6736                 inst.error = BAD_SP;
6737             }
6738           break;
6739
6740         case OP_RRnpctw:
6741           if (inst.operands[i].isreg 
6742               && inst.operands[i].reg == REG_PC 
6743               && (inst.operands[i].writeback || thumb))
6744             inst.error = BAD_PC;
6745           break;
6746
6747         case OP_CPSF:
6748         case OP_ENDI:
6749         case OP_oROR:
6750         case OP_wPSR:
6751         case OP_rPSR:
6752         case OP_COND:
6753         case OP_oBARRIER_I15:
6754         case OP_REGLST:
6755         case OP_VRSLST:
6756         case OP_VRDLST:
6757         case OP_VRSDLST:
6758         case OP_NRDLST:
6759         case OP_NSTRLST:
6760           if (val == FAIL)
6761             goto failure;
6762           inst.operands[i].imm = val;
6763           break;
6764
6765         default:
6766           break;
6767         }
6768
6769       /* If we get here, this operand was successfully parsed.  */
6770       inst.operands[i].present = 1;
6771       continue;
6772
6773     bad_args:
6774       inst.error = BAD_ARGS;
6775
6776     failure:
6777       if (!backtrack_pos)
6778         {
6779           /* The parse routine should already have set inst.error, but set a
6780              default here just in case.  */
6781           if (!inst.error)
6782             inst.error = _("syntax error");
6783           return FAIL;
6784         }
6785
6786       /* Do not backtrack over a trailing optional argument that
6787          absorbed some text.  We will only fail again, with the
6788          'garbage following instruction' error message, which is
6789          probably less helpful than the current one.  */
6790       if (backtrack_index == i && backtrack_pos != str
6791           && upat[i+1] == OP_stop)
6792         {
6793           if (!inst.error)
6794             inst.error = _("syntax error");
6795           return FAIL;
6796         }
6797
6798       /* Try again, skipping the optional argument at backtrack_pos.  */
6799       str = backtrack_pos;
6800       inst.error = backtrack_error;
6801       inst.operands[backtrack_index].present = 0;
6802       i = backtrack_index;
6803       backtrack_pos = 0;
6804     }
6805
6806   /* Check that we have parsed all the arguments.  */
6807   if (*str != '\0' && !inst.error)
6808     inst.error = _("garbage following instruction");
6809
6810   return inst.error ? FAIL : SUCCESS;
6811 }
6812
6813 #undef po_char_or_fail
6814 #undef po_reg_or_fail
6815 #undef po_reg_or_goto
6816 #undef po_imm_or_fail
6817 #undef po_scalar_or_fail
6818 #undef po_barrier_or_imm
6819
6820 /* Shorthand macro for instruction encoding functions issuing errors.  */
6821 #define constraint(expr, err)                   \
6822   do                                            \
6823     {                                           \
6824       if (expr)                                 \
6825         {                                       \
6826           inst.error = err;                     \
6827           return;                               \
6828         }                                       \
6829     }                                           \
6830   while (0)
6831
6832 /* Reject "bad registers" for Thumb-2 instructions.  Many Thumb-2
6833    instructions are unpredictable if these registers are used.  This
6834    is the BadReg predicate in ARM's Thumb-2 documentation.  */
6835 #define reject_bad_reg(reg)                             \
6836   do                                                    \
6837    if (reg == REG_SP || reg == REG_PC)                  \
6838      {                                                  \
6839        inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC;  \
6840        return;                                          \
6841      }                                                  \
6842   while (0)
6843
6844 /* If REG is R13 (the stack pointer), warn that its use is
6845    deprecated.  */
6846 #define warn_deprecated_sp(reg)                 \
6847   do                                            \
6848     if (warn_on_deprecated && reg == REG_SP)    \
6849        as_warn (_("use of r13 is deprecated")); \
6850   while (0)
6851
6852 /* Functions for operand encoding.  ARM, then Thumb.  */
6853
6854 #define rotate_left(v, n) (v << n | v >> (32 - n))
6855
6856 /* If VAL can be encoded in the immediate field of an ARM instruction,
6857    return the encoded form.  Otherwise, return FAIL.  */
6858
6859 static unsigned int
6860 encode_arm_immediate (unsigned int val)
6861 {
6862   unsigned int a, i;
6863
6864   for (i = 0; i < 32; i += 2)
6865     if ((a = rotate_left (val, i)) <= 0xff)
6866       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
6867
6868   return FAIL;
6869 }
6870
6871 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6872    return the encoded form.  Otherwise, return FAIL.  */
6873 static unsigned int
6874 encode_thumb32_immediate (unsigned int val)
6875 {
6876   unsigned int a, i;
6877
6878   if (val <= 0xff)
6879     return val;
6880
6881   for (i = 1; i <= 24; i++)
6882     {
6883       a = val >> i;
6884       if ((val & ~(0xff << i)) == 0)
6885         return ((val >> i) & 0x7f) | ((32 - i) << 7);
6886     }
6887
6888   a = val & 0xff;
6889   if (val == ((a << 16) | a))
6890     return 0x100 | a;
6891   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6892     return 0x300 | a;
6893
6894   a = val & 0xff00;
6895   if (val == ((a << 16) | a))
6896     return 0x200 | (a >> 8);
6897
6898   return FAIL;
6899 }
6900 /* Encode a VFP SP or DP register number into inst.instruction.  */
6901
6902 static void
6903 encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6904 {
6905   if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6906       && reg > 15)
6907     {
6908       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
6909         {
6910           if (thumb_mode)
6911             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
6912                                     fpu_vfp_ext_d32);
6913           else
6914             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
6915                                     fpu_vfp_ext_d32);
6916         }
6917       else
6918         {
6919           first_error (_("D register out of range for selected VFP version"));
6920           return;
6921         }
6922     }
6923
6924   switch (pos)
6925     {
6926     case VFP_REG_Sd:
6927       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
6928       break;
6929
6930     case VFP_REG_Sn:
6931       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
6932       break;
6933
6934     case VFP_REG_Sm:
6935       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
6936       break;
6937
6938     case VFP_REG_Dd:
6939       inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
6940       break;
6941
6942     case VFP_REG_Dn:
6943       inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
6944       break;
6945
6946     case VFP_REG_Dm:
6947       inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
6948       break;
6949
6950     default:
6951       abort ();
6952     }
6953 }
6954
6955 /* Encode a <shift> in an ARM-format instruction.  The immediate,
6956    if any, is handled by md_apply_fix.   */
6957 static void
6958 encode_arm_shift (int i)
6959 {
6960   if (inst.operands[i].shift_kind == SHIFT_RRX)
6961     inst.instruction |= SHIFT_ROR << 5;
6962   else
6963     {
6964       inst.instruction |= inst.operands[i].shift_kind << 5;
6965       if (inst.operands[i].immisreg)
6966         {
6967           inst.instruction |= SHIFT_BY_REG;
6968           inst.instruction |= inst.operands[i].imm << 8;
6969         }
6970       else
6971         inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
6972     }
6973 }
6974
6975 static void
6976 encode_arm_shifter_operand (int i)
6977 {
6978   if (inst.operands[i].isreg)
6979     {
6980       inst.instruction |= inst.operands[i].reg;
6981       encode_arm_shift (i);
6982     }
6983   else
6984     inst.instruction |= INST_IMMEDIATE;
6985 }
6986
6987 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
6988 static void
6989 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
6990 {
6991   gas_assert (inst.operands[i].isreg);
6992   inst.instruction |= inst.operands[i].reg << 16;
6993
6994   if (inst.operands[i].preind)
6995     {
6996       if (is_t)
6997         {
6998           inst.error = _("instruction does not accept preindexed addressing");
6999           return;
7000         }
7001       inst.instruction |= PRE_INDEX;
7002       if (inst.operands[i].writeback)
7003         inst.instruction |= WRITE_BACK;
7004
7005     }
7006   else if (inst.operands[i].postind)
7007     {
7008       gas_assert (inst.operands[i].writeback);
7009       if (is_t)
7010         inst.instruction |= WRITE_BACK;
7011     }
7012   else /* unindexed - only for coprocessor */
7013     {
7014       inst.error = _("instruction does not accept unindexed addressing");
7015       return;
7016     }
7017
7018   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
7019       && (((inst.instruction & 0x000f0000) >> 16)
7020           == ((inst.instruction & 0x0000f000) >> 12)))
7021     as_warn ((inst.instruction & LOAD_BIT)
7022              ? _("destination register same as write-back base")
7023              : _("source register same as write-back base"));
7024 }
7025
7026 /* inst.operands[i] was set up by parse_address.  Encode it into an
7027    ARM-format mode 2 load or store instruction.  If is_t is true,
7028    reject forms that cannot be used with a T instruction (i.e. not
7029    post-indexed).  */
7030 static void
7031 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
7032 {
7033   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
7034
7035   encode_arm_addr_mode_common (i, is_t);
7036
7037   if (inst.operands[i].immisreg)
7038     {
7039       constraint ((inst.operands[i].imm == REG_PC
7040                    || (is_pc && inst.operands[i].writeback)),
7041                   BAD_PC_ADDRESSING);
7042       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
7043       inst.instruction |= inst.operands[i].imm;
7044       if (!inst.operands[i].negative)
7045         inst.instruction |= INDEX_UP;
7046       if (inst.operands[i].shifted)
7047         {
7048           if (inst.operands[i].shift_kind == SHIFT_RRX)
7049             inst.instruction |= SHIFT_ROR << 5;
7050           else
7051             {
7052               inst.instruction |= inst.operands[i].shift_kind << 5;
7053               inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7054             }
7055         }
7056     }
7057   else /* immediate offset in inst.reloc */
7058     {
7059       if (is_pc && !inst.reloc.pc_rel)
7060         {
7061           const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
7062
7063           /* If is_t is TRUE, it's called from do_ldstt.  ldrt/strt
7064              cannot use PC in addressing.
7065              PC cannot be used in writeback addressing, either.  */
7066           constraint ((is_t || inst.operands[i].writeback),
7067                       BAD_PC_ADDRESSING);
7068
7069           /* Use of PC in str is deprecated for ARMv7.  */
7070           if (warn_on_deprecated
7071               && !is_load
7072               && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
7073             as_warn (_("use of PC in this instruction is deprecated"));
7074         }
7075
7076       if (inst.reloc.type == BFD_RELOC_UNUSED)
7077         {
7078           /* Prefer + for zero encoded value.  */
7079           if (!inst.operands[i].negative)
7080             inst.instruction |= INDEX_UP;
7081           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
7082         }
7083     }
7084 }
7085
7086 /* inst.operands[i] was set up by parse_address.  Encode it into an
7087    ARM-format mode 3 load or store instruction.  Reject forms that
7088    cannot be used with such instructions.  If is_t is true, reject
7089    forms that cannot be used with a T instruction (i.e. not
7090    post-indexed).  */
7091 static void
7092 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
7093 {
7094   if (inst.operands[i].immisreg && inst.operands[i].shifted)
7095     {
7096       inst.error = _("instruction does not accept scaled register index");
7097       return;
7098     }
7099
7100   encode_arm_addr_mode_common (i, is_t);
7101
7102   if (inst.operands[i].immisreg)
7103     {
7104       constraint ((inst.operands[i].imm == REG_PC
7105                    || inst.operands[i].reg == REG_PC),
7106                   BAD_PC_ADDRESSING);
7107       inst.instruction |= inst.operands[i].imm;
7108       if (!inst.operands[i].negative)
7109         inst.instruction |= INDEX_UP;
7110     }
7111   else /* immediate offset in inst.reloc */
7112     {
7113       constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
7114                    && inst.operands[i].writeback),
7115                   BAD_PC_WRITEBACK);
7116       inst.instruction |= HWOFFSET_IMM;
7117       if (inst.reloc.type == BFD_RELOC_UNUSED)
7118         {
7119           /* Prefer + for zero encoded value.  */
7120           if (!inst.operands[i].negative)
7121             inst.instruction |= INDEX_UP;
7122
7123           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
7124         }
7125     }
7126 }
7127
7128 /* inst.operands[i] was set up by parse_address.  Encode it into an
7129    ARM-format instruction.  Reject all forms which cannot be encoded
7130    into a coprocessor load/store instruction.  If wb_ok is false,
7131    reject use of writeback; if unind_ok is false, reject use of
7132    unindexed addressing.  If reloc_override is not 0, use it instead
7133    of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
7134    (in which case it is preserved).  */
7135
7136 static int
7137 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
7138 {
7139   inst.instruction |= inst.operands[i].reg << 16;
7140
7141   gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
7142
7143   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
7144     {
7145       gas_assert (!inst.operands[i].writeback);
7146       if (!unind_ok)
7147         {
7148           inst.error = _("instruction does not support unindexed addressing");
7149           return FAIL;
7150         }
7151       inst.instruction |= inst.operands[i].imm;
7152       inst.instruction |= INDEX_UP;
7153       return SUCCESS;
7154     }
7155
7156   if (inst.operands[i].preind)
7157     inst.instruction |= PRE_INDEX;
7158
7159   if (inst.operands[i].writeback)
7160     {
7161       if (inst.operands[i].reg == REG_PC)
7162         {
7163           inst.error = _("pc may not be used with write-back");
7164           return FAIL;
7165         }
7166       if (!wb_ok)
7167         {
7168           inst.error = _("instruction does not support writeback");
7169           return FAIL;
7170         }
7171       inst.instruction |= WRITE_BACK;
7172     }
7173
7174   if (reloc_override)
7175     inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
7176   else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
7177             || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
7178            && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
7179     {
7180       if (thumb_mode)
7181         inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
7182       else
7183         inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
7184     }
7185
7186   /* Prefer + for zero encoded value.  */
7187   if (!inst.operands[i].negative)
7188     inst.instruction |= INDEX_UP;
7189
7190   return SUCCESS;
7191 }
7192
7193 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
7194    Determine whether it can be performed with a move instruction; if
7195    it can, convert inst.instruction to that move instruction and
7196    return TRUE; if it can't, convert inst.instruction to a literal-pool
7197    load and return FALSE.  If this is not a valid thing to do in the
7198    current context, set inst.error and return TRUE.
7199
7200    inst.operands[i] describes the destination register.  */
7201
7202 static bfd_boolean
7203 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
7204 {
7205   unsigned long tbit;
7206
7207   if (thumb_p)
7208     tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7209   else
7210     tbit = LOAD_BIT;
7211
7212   if ((inst.instruction & tbit) == 0)
7213     {
7214       inst.error = _("invalid pseudo operation");
7215       return TRUE;
7216     }
7217   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
7218     {
7219       inst.error = _("constant expression expected");
7220       return TRUE;
7221     }
7222   if (inst.reloc.exp.X_op == O_constant)
7223     {
7224       if (thumb_p)
7225         {
7226           if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
7227             {
7228               /* This can be done with a mov(1) instruction.  */
7229               inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
7230               inst.instruction |= inst.reloc.exp.X_add_number;
7231               return TRUE;
7232             }
7233         }
7234       else
7235         {
7236           int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
7237           if (value != FAIL)
7238             {
7239               /* This can be done with a mov instruction.  */
7240               inst.instruction &= LITERAL_MASK;
7241               inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
7242               inst.instruction |= value & 0xfff;
7243               return TRUE;
7244             }
7245
7246           value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
7247           if (value != FAIL)
7248             {
7249               /* This can be done with a mvn instruction.  */
7250               inst.instruction &= LITERAL_MASK;
7251               inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
7252               inst.instruction |= value & 0xfff;
7253               return TRUE;
7254             }
7255         }
7256     }
7257
7258   if (add_to_lit_pool () == FAIL)
7259     {
7260       inst.error = _("literal pool insertion failed");
7261       return TRUE;
7262     }
7263   inst.operands[1].reg = REG_PC;
7264   inst.operands[1].isreg = 1;
7265   inst.operands[1].preind = 1;
7266   inst.reloc.pc_rel = 1;
7267   inst.reloc.type = (thumb_p
7268                      ? BFD_RELOC_ARM_THUMB_OFFSET
7269                      : (mode_3
7270                         ? BFD_RELOC_ARM_HWLITERAL
7271                         : BFD_RELOC_ARM_LITERAL));
7272   return FALSE;
7273 }
7274
7275 /* Functions for instruction encoding, sorted by sub-architecture.
7276    First some generics; their names are taken from the conventional
7277    bit positions for register arguments in ARM format instructions.  */
7278
7279 static void
7280 do_noargs (void)
7281 {
7282 }
7283
7284 static void
7285 do_rd (void)
7286 {
7287   inst.instruction |= inst.operands[0].reg << 12;
7288 }
7289
7290 static void
7291 do_rd_rm (void)
7292 {
7293   inst.instruction |= inst.operands[0].reg << 12;
7294   inst.instruction |= inst.operands[1].reg;
7295 }
7296
7297 static void
7298 do_rd_rn (void)
7299 {
7300   inst.instruction |= inst.operands[0].reg << 12;
7301   inst.instruction |= inst.operands[1].reg << 16;
7302 }
7303
7304 static void
7305 do_rn_rd (void)
7306 {
7307   inst.instruction |= inst.operands[0].reg << 16;
7308   inst.instruction |= inst.operands[1].reg << 12;
7309 }
7310
7311 static void
7312 do_rd_rm_rn (void)
7313 {
7314   unsigned Rn = inst.operands[2].reg;
7315   /* Enforce restrictions on SWP instruction.  */
7316   if ((inst.instruction & 0x0fbfffff) == 0x01000090)
7317     {
7318       constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
7319                   _("Rn must not overlap other operands"));
7320
7321       /* SWP{b} is deprecated for ARMv6* and ARMv7.  */
7322       if (warn_on_deprecated
7323           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
7324         as_warn (_("swp{b} use is deprecated for this architecture"));
7325
7326     }
7327   inst.instruction |= inst.operands[0].reg << 12;
7328   inst.instruction |= inst.operands[1].reg;
7329   inst.instruction |= Rn << 16;
7330 }
7331
7332 static void
7333 do_rd_rn_rm (void)
7334 {
7335   inst.instruction |= inst.operands[0].reg << 12;
7336   inst.instruction |= inst.operands[1].reg << 16;
7337   inst.instruction |= inst.operands[2].reg;
7338 }
7339
7340 static void
7341 do_rm_rd_rn (void)
7342 {
7343   constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7344   constraint (((inst.reloc.exp.X_op != O_constant
7345                 && inst.reloc.exp.X_op != O_illegal)
7346                || inst.reloc.exp.X_add_number != 0),
7347               BAD_ADDR_MODE);
7348   inst.instruction |= inst.operands[0].reg;
7349   inst.instruction |= inst.operands[1].reg << 12;
7350   inst.instruction |= inst.operands[2].reg << 16;
7351 }
7352
7353 static void
7354 do_imm0 (void)
7355 {
7356   inst.instruction |= inst.operands[0].imm;
7357 }
7358
7359 static void
7360 do_rd_cpaddr (void)
7361 {
7362   inst.instruction |= inst.operands[0].reg << 12;
7363   encode_arm_cp_address (1, TRUE, TRUE, 0);
7364 }
7365
7366 /* ARM instructions, in alphabetical order by function name (except
7367    that wrapper functions appear immediately after the function they
7368    wrap).  */
7369
7370 /* This is a pseudo-op of the form "adr rd, label" to be converted
7371    into a relative address of the form "add rd, pc, #label-.-8".  */
7372
7373 static void
7374 do_adr (void)
7375 {
7376   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7377
7378   /* Frag hacking will turn this into a sub instruction if the offset turns
7379      out to be negative.  */
7380   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7381   inst.reloc.pc_rel = 1;
7382   inst.reloc.exp.X_add_number -= 8;
7383 }
7384
7385 /* This is a pseudo-op of the form "adrl rd, label" to be converted
7386    into a relative address of the form:
7387    add rd, pc, #low(label-.-8)"
7388    add rd, rd, #high(label-.-8)"  */
7389
7390 static void
7391 do_adrl (void)
7392 {
7393   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7394
7395   /* Frag hacking will turn this into a sub instruction if the offset turns
7396      out to be negative.  */
7397   inst.reloc.type              = BFD_RELOC_ARM_ADRL_IMMEDIATE;
7398   inst.reloc.pc_rel            = 1;
7399   inst.size                    = INSN_SIZE * 2;
7400   inst.reloc.exp.X_add_number -= 8;
7401 }
7402
7403 static void
7404 do_arit (void)
7405 {
7406   if (!inst.operands[1].present)
7407     inst.operands[1].reg = inst.operands[0].reg;
7408   inst.instruction |= inst.operands[0].reg << 12;
7409   inst.instruction |= inst.operands[1].reg << 16;
7410   encode_arm_shifter_operand (2);
7411 }
7412
7413 static void
7414 do_barrier (void)
7415 {
7416   if (inst.operands[0].present)
7417     {
7418       constraint ((inst.instruction & 0xf0) != 0x40
7419                   && inst.operands[0].imm > 0xf
7420                   && inst.operands[0].imm < 0x0,
7421                   _("bad barrier type"));
7422       inst.instruction |= inst.operands[0].imm;
7423     }
7424   else
7425     inst.instruction |= 0xf;
7426 }
7427
7428 static void
7429 do_bfc (void)
7430 {
7431   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7432   constraint (msb > 32, _("bit-field extends past end of register"));
7433   /* The instruction encoding stores the LSB and MSB,
7434      not the LSB and width.  */
7435   inst.instruction |= inst.operands[0].reg << 12;
7436   inst.instruction |= inst.operands[1].imm << 7;
7437   inst.instruction |= (msb - 1) << 16;
7438 }
7439
7440 static void
7441 do_bfi (void)
7442 {
7443   unsigned int msb;
7444
7445   /* #0 in second position is alternative syntax for bfc, which is
7446      the same instruction but with REG_PC in the Rm field.  */
7447   if (!inst.operands[1].isreg)
7448     inst.operands[1].reg = REG_PC;
7449
7450   msb = inst.operands[2].imm + inst.operands[3].imm;
7451   constraint (msb > 32, _("bit-field extends past end of register"));
7452   /* The instruction encoding stores the LSB and MSB,
7453      not the LSB and width.  */
7454   inst.instruction |= inst.operands[0].reg << 12;
7455   inst.instruction |= inst.operands[1].reg;
7456   inst.instruction |= inst.operands[2].imm << 7;
7457   inst.instruction |= (msb - 1) << 16;
7458 }
7459
7460 static void
7461 do_bfx (void)
7462 {
7463   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7464               _("bit-field extends past end of register"));
7465   inst.instruction |= inst.operands[0].reg << 12;
7466   inst.instruction |= inst.operands[1].reg;
7467   inst.instruction |= inst.operands[2].imm << 7;
7468   inst.instruction |= (inst.operands[3].imm - 1) << 16;
7469 }
7470
7471 /* ARM V5 breakpoint instruction (argument parse)
7472      BKPT <16 bit unsigned immediate>
7473      Instruction is not conditional.
7474         The bit pattern given in insns[] has the COND_ALWAYS condition,
7475         and it is an error if the caller tried to override that.  */
7476
7477 static void
7478 do_bkpt (void)
7479 {
7480   /* Top 12 of 16 bits to bits 19:8.  */
7481   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
7482
7483   /* Bottom 4 of 16 bits to bits 3:0.  */
7484   inst.instruction |= inst.operands[0].imm & 0xf;
7485 }
7486
7487 static void
7488 encode_branch (int default_reloc)
7489 {
7490   if (inst.operands[0].hasreloc)
7491     {
7492       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
7493                   && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
7494                   _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
7495       inst.reloc.type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
7496         ? BFD_RELOC_ARM_PLT32
7497         : thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
7498     }
7499   else
7500     inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
7501   inst.reloc.pc_rel = 1;
7502 }
7503
7504 static void
7505 do_branch (void)
7506 {
7507 #ifdef OBJ_ELF
7508   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7509     encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7510   else
7511 #endif
7512     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7513 }
7514
7515 static void
7516 do_bl (void)
7517 {
7518 #ifdef OBJ_ELF
7519   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7520     {
7521       if (inst.cond == COND_ALWAYS)
7522         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7523       else
7524         encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7525     }
7526   else
7527 #endif
7528     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7529 }
7530
7531 /* ARM V5 branch-link-exchange instruction (argument parse)
7532      BLX <target_addr>          ie BLX(1)
7533      BLX{<condition>} <Rm>      ie BLX(2)
7534    Unfortunately, there are two different opcodes for this mnemonic.
7535    So, the insns[].value is not used, and the code here zaps values
7536         into inst.instruction.
7537    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
7538
7539 static void
7540 do_blx (void)
7541 {
7542   if (inst.operands[0].isreg)
7543     {
7544       /* Arg is a register; the opcode provided by insns[] is correct.
7545          It is not illegal to do "blx pc", just useless.  */
7546       if (inst.operands[0].reg == REG_PC)
7547         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
7548
7549       inst.instruction |= inst.operands[0].reg;
7550     }
7551   else
7552     {
7553       /* Arg is an address; this instruction cannot be executed
7554          conditionally, and the opcode must be adjusted.
7555          We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7556          where we generate out a BFD_RELOC_ARM_PCREL_CALL instead.  */
7557       constraint (inst.cond != COND_ALWAYS, BAD_COND);
7558       inst.instruction = 0xfa000000;
7559       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
7560     }
7561 }
7562
7563 static void
7564 do_bx (void)
7565 {
7566   bfd_boolean want_reloc;
7567
7568   if (inst.operands[0].reg == REG_PC)
7569     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
7570
7571   inst.instruction |= inst.operands[0].reg;
7572   /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7573      it is for ARMv4t or earlier.  */
7574   want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7575   if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7576       want_reloc = TRUE;
7577
7578 #ifdef OBJ_ELF
7579   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
7580 #endif
7581     want_reloc = FALSE;
7582
7583   if (want_reloc)
7584     inst.reloc.type = BFD_RELOC_ARM_V4BX;
7585 }
7586
7587
7588 /* ARM v5TEJ.  Jump to Jazelle code.  */
7589
7590 static void
7591 do_bxj (void)
7592 {
7593   if (inst.operands[0].reg == REG_PC)
7594     as_tsktsk (_("use of r15 in bxj is not really useful"));
7595
7596   inst.instruction |= inst.operands[0].reg;
7597 }
7598
7599 /* Co-processor data operation:
7600       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7601       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
7602 static void
7603 do_cdp (void)
7604 {
7605   inst.instruction |= inst.operands[0].reg << 8;
7606   inst.instruction |= inst.operands[1].imm << 20;
7607   inst.instruction |= inst.operands[2].reg << 12;
7608   inst.instruction |= inst.operands[3].reg << 16;
7609   inst.instruction |= inst.operands[4].reg;
7610   inst.instruction |= inst.operands[5].imm << 5;
7611 }
7612
7613 static void
7614 do_cmp (void)
7615 {
7616   inst.instruction |= inst.operands[0].reg << 16;
7617   encode_arm_shifter_operand (1);
7618 }
7619
7620 /* Transfer between coprocessor and ARM registers.
7621    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7622    MRC2
7623    MCR{cond}
7624    MCR2
7625
7626    No special properties.  */
7627
7628 static void
7629 do_co_reg (void)
7630 {
7631   unsigned Rd;
7632
7633   Rd = inst.operands[2].reg;
7634   if (thumb_mode)
7635     {
7636       if (inst.instruction == 0xee000010
7637           || inst.instruction == 0xfe000010)
7638         /* MCR, MCR2  */
7639         reject_bad_reg (Rd);
7640       else
7641         /* MRC, MRC2  */
7642         constraint (Rd == REG_SP, BAD_SP);
7643     }
7644   else
7645     {
7646       /* MCR */
7647       if (inst.instruction == 0xe000010)
7648         constraint (Rd == REG_PC, BAD_PC);
7649     }
7650
7651
7652   inst.instruction |= inst.operands[0].reg << 8;
7653   inst.instruction |= inst.operands[1].imm << 21;
7654   inst.instruction |= Rd << 12;
7655   inst.instruction |= inst.operands[3].reg << 16;
7656   inst.instruction |= inst.operands[4].reg;
7657   inst.instruction |= inst.operands[5].imm << 5;
7658 }
7659
7660 /* Transfer between coprocessor register and pair of ARM registers.
7661    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7662    MCRR2
7663    MRRC{cond}
7664    MRRC2
7665
7666    Two XScale instructions are special cases of these:
7667
7668      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
7669      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
7670
7671    Result unpredictable if Rd or Rn is R15.  */
7672
7673 static void
7674 do_co_reg2c (void)
7675 {
7676   unsigned Rd, Rn;
7677
7678   Rd = inst.operands[2].reg;
7679   Rn = inst.operands[3].reg;
7680
7681   if (thumb_mode)
7682     {
7683       reject_bad_reg (Rd);
7684       reject_bad_reg (Rn);
7685     }
7686   else
7687     {
7688       constraint (Rd == REG_PC, BAD_PC);
7689       constraint (Rn == REG_PC, BAD_PC);
7690     }
7691
7692   inst.instruction |= inst.operands[0].reg << 8;
7693   inst.instruction |= inst.operands[1].imm << 4;
7694   inst.instruction |= Rd << 12;
7695   inst.instruction |= Rn << 16;
7696   inst.instruction |= inst.operands[4].reg;
7697 }
7698
7699 static void
7700 do_cpsi (void)
7701 {
7702   inst.instruction |= inst.operands[0].imm << 6;
7703   if (inst.operands[1].present)
7704     {
7705       inst.instruction |= CPSI_MMOD;
7706       inst.instruction |= inst.operands[1].imm;
7707     }
7708 }
7709
7710 static void
7711 do_dbg (void)
7712 {
7713   inst.instruction |= inst.operands[0].imm;
7714 }
7715
7716 static void
7717 do_div (void)
7718 {
7719   unsigned Rd, Rn, Rm;
7720
7721   Rd = inst.operands[0].reg;
7722   Rn = (inst.operands[1].present
7723         ? inst.operands[1].reg : Rd);
7724   Rm = inst.operands[2].reg;
7725
7726   constraint ((Rd == REG_PC), BAD_PC);
7727   constraint ((Rn == REG_PC), BAD_PC);
7728   constraint ((Rm == REG_PC), BAD_PC);
7729
7730   inst.instruction |= Rd << 16;
7731   inst.instruction |= Rn << 0;
7732   inst.instruction |= Rm << 8;
7733 }
7734
7735 static void
7736 do_it (void)
7737 {
7738   /* There is no IT instruction in ARM mode.  We
7739      process it to do the validation as if in
7740      thumb mode, just in case the code gets
7741      assembled for thumb using the unified syntax.  */
7742
7743   inst.size = 0;
7744   if (unified_syntax)
7745     {
7746       set_it_insn_type (IT_INSN);
7747       now_it.mask = (inst.instruction & 0xf) | 0x10;
7748       now_it.cc = inst.operands[0].imm;
7749     }
7750 }
7751
7752 static void
7753 do_ldmstm (void)
7754 {
7755   int base_reg = inst.operands[0].reg;
7756   int range = inst.operands[1].imm;
7757
7758   inst.instruction |= base_reg << 16;
7759   inst.instruction |= range;
7760
7761   if (inst.operands[1].writeback)
7762     inst.instruction |= LDM_TYPE_2_OR_3;
7763
7764   if (inst.operands[0].writeback)
7765     {
7766       inst.instruction |= WRITE_BACK;
7767       /* Check for unpredictable uses of writeback.  */
7768       if (inst.instruction & LOAD_BIT)
7769         {
7770           /* Not allowed in LDM type 2.  */
7771           if ((inst.instruction & LDM_TYPE_2_OR_3)
7772               && ((range & (1 << REG_PC)) == 0))
7773             as_warn (_("writeback of base register is UNPREDICTABLE"));
7774           /* Only allowed if base reg not in list for other types.  */
7775           else if (range & (1 << base_reg))
7776             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
7777         }
7778       else /* STM.  */
7779         {
7780           /* Not allowed for type 2.  */
7781           if (inst.instruction & LDM_TYPE_2_OR_3)
7782             as_warn (_("writeback of base register is UNPREDICTABLE"));
7783           /* Only allowed if base reg not in list, or first in list.  */
7784           else if ((range & (1 << base_reg))
7785                    && (range & ((1 << base_reg) - 1)))
7786             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
7787         }
7788     }
7789 }
7790
7791 /* ARMv5TE load-consecutive (argument parse)
7792    Mode is like LDRH.
7793
7794      LDRccD R, mode
7795      STRccD R, mode.  */
7796
7797 static void
7798 do_ldrd (void)
7799 {
7800   constraint (inst.operands[0].reg % 2 != 0,
7801               _("first destination register must be even"));
7802   constraint (inst.operands[1].present
7803               && inst.operands[1].reg != inst.operands[0].reg + 1,
7804               _("can only load two consecutive registers"));
7805   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7806   constraint (!inst.operands[2].isreg, _("'[' expected"));
7807
7808   if (!inst.operands[1].present)
7809     inst.operands[1].reg = inst.operands[0].reg + 1;
7810
7811   if (inst.instruction & LOAD_BIT)
7812     {
7813       /* encode_arm_addr_mode_3 will diagnose overlap between the base
7814          register and the first register written; we have to diagnose
7815          overlap between the base and the second register written here.  */
7816
7817       if (inst.operands[2].reg == inst.operands[1].reg
7818           && (inst.operands[2].writeback || inst.operands[2].postind))
7819         as_warn (_("base register written back, and overlaps "
7820                    "second destination register"));
7821
7822       /* For an index-register load, the index register must not overlap the
7823          destination (even if not write-back).  */
7824       else if (inst.operands[2].immisreg
7825                && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
7826                    || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
7827         as_warn (_("index register overlaps destination register"));
7828     }
7829
7830   inst.instruction |= inst.operands[0].reg << 12;
7831   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
7832 }
7833
7834 static void
7835 do_ldrex (void)
7836 {
7837   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
7838               || inst.operands[1].postind || inst.operands[1].writeback
7839               || inst.operands[1].immisreg || inst.operands[1].shifted
7840               || inst.operands[1].negative
7841               /* This can arise if the programmer has written
7842                    strex rN, rM, foo
7843                  or if they have mistakenly used a register name as the last
7844                  operand,  eg:
7845                    strex rN, rM, rX
7846                  It is very difficult to distinguish between these two cases
7847                  because "rX" might actually be a label. ie the register
7848                  name has been occluded by a symbol of the same name. So we
7849                  just generate a general 'bad addressing mode' type error
7850                  message and leave it up to the programmer to discover the
7851                  true cause and fix their mistake.  */
7852               || (inst.operands[1].reg == REG_PC),
7853               BAD_ADDR_MODE);
7854
7855   constraint (inst.reloc.exp.X_op != O_constant
7856               || inst.reloc.exp.X_add_number != 0,
7857               _("offset must be zero in ARM encoding"));
7858
7859   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
7860
7861   inst.instruction |= inst.operands[0].reg << 12;
7862   inst.instruction |= inst.operands[1].reg << 16;
7863   inst.reloc.type = BFD_RELOC_UNUSED;
7864 }
7865
7866 static void
7867 do_ldrexd (void)
7868 {
7869   constraint (inst.operands[0].reg % 2 != 0,
7870               _("even register required"));
7871   constraint (inst.operands[1].present
7872               && inst.operands[1].reg != inst.operands[0].reg + 1,
7873               _("can only load two consecutive registers"));
7874   /* If op 1 were present and equal to PC, this function wouldn't
7875      have been called in the first place.  */
7876   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7877
7878   inst.instruction |= inst.operands[0].reg << 12;
7879   inst.instruction |= inst.operands[2].reg << 16;
7880 }
7881
7882 static void
7883 do_ldst (void)
7884 {
7885   inst.instruction |= inst.operands[0].reg << 12;
7886   if (!inst.operands[1].isreg)
7887     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
7888       return;
7889   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
7890 }
7891
7892 static void
7893 do_ldstt (void)
7894 {
7895   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
7896      reject [Rn,...].  */
7897   if (inst.operands[1].preind)
7898     {
7899       constraint (inst.reloc.exp.X_op != O_constant
7900                   || inst.reloc.exp.X_add_number != 0,
7901                   _("this instruction requires a post-indexed address"));
7902
7903       inst.operands[1].preind = 0;
7904       inst.operands[1].postind = 1;
7905       inst.operands[1].writeback = 1;
7906     }
7907   inst.instruction |= inst.operands[0].reg << 12;
7908   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
7909 }
7910
7911 /* Halfword and signed-byte load/store operations.  */
7912
7913 static void
7914 do_ldstv4 (void)
7915 {
7916   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
7917   inst.instruction |= inst.operands[0].reg << 12;
7918   if (!inst.operands[1].isreg)
7919     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
7920       return;
7921   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
7922 }
7923
7924 static void
7925 do_ldsttv4 (void)
7926 {
7927   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
7928      reject [Rn,...].  */
7929   if (inst.operands[1].preind)
7930     {
7931       constraint (inst.reloc.exp.X_op != O_constant
7932                   || inst.reloc.exp.X_add_number != 0,
7933                   _("this instruction requires a post-indexed address"));
7934
7935       inst.operands[1].preind = 0;
7936       inst.operands[1].postind = 1;
7937       inst.operands[1].writeback = 1;
7938     }
7939   inst.instruction |= inst.operands[0].reg << 12;
7940   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
7941 }
7942
7943 /* Co-processor register load/store.
7944    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
7945 static void
7946 do_lstc (void)
7947 {
7948   inst.instruction |= inst.operands[0].reg << 8;
7949   inst.instruction |= inst.operands[1].reg << 12;
7950   encode_arm_cp_address (2, TRUE, TRUE, 0);
7951 }
7952
7953 static void
7954 do_mlas (void)
7955 {
7956   /* This restriction does not apply to mls (nor to mla in v6 or later).  */
7957   if (inst.operands[0].reg == inst.operands[1].reg
7958       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
7959       && !(inst.instruction & 0x00400000))
7960     as_tsktsk (_("Rd and Rm should be different in mla"));
7961
7962   inst.instruction |= inst.operands[0].reg << 16;
7963   inst.instruction |= inst.operands[1].reg;
7964   inst.instruction |= inst.operands[2].reg << 8;
7965   inst.instruction |= inst.operands[3].reg << 12;
7966 }
7967
7968 static void
7969 do_mov (void)
7970 {
7971   inst.instruction |= inst.operands[0].reg << 12;
7972   encode_arm_shifter_operand (1);
7973 }
7974
7975 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
7976 static void
7977 do_mov16 (void)
7978 {
7979   bfd_vma imm;
7980   bfd_boolean top;
7981
7982   top = (inst.instruction & 0x00400000) != 0;
7983   constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
7984               _(":lower16: not allowed this instruction"));
7985   constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
7986               _(":upper16: not allowed instruction"));
7987   inst.instruction |= inst.operands[0].reg << 12;
7988   if (inst.reloc.type == BFD_RELOC_UNUSED)
7989     {
7990       imm = inst.reloc.exp.X_add_number;
7991       /* The value is in two pieces: 0:11, 16:19.  */
7992       inst.instruction |= (imm & 0x00000fff);
7993       inst.instruction |= (imm & 0x0000f000) << 4;
7994     }
7995 }
7996
7997 static void do_vfp_nsyn_opcode (const char *);
7998
7999 static int
8000 do_vfp_nsyn_mrs (void)
8001 {
8002   if (inst.operands[0].isvec)
8003     {
8004       if (inst.operands[1].reg != 1)
8005         first_error (_("operand 1 must be FPSCR"));
8006       memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
8007       memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
8008       do_vfp_nsyn_opcode ("fmstat");
8009     }
8010   else if (inst.operands[1].isvec)
8011     do_vfp_nsyn_opcode ("fmrx");
8012   else
8013     return FAIL;
8014
8015   return SUCCESS;
8016 }
8017
8018 static int
8019 do_vfp_nsyn_msr (void)
8020 {
8021   if (inst.operands[0].isvec)
8022     do_vfp_nsyn_opcode ("fmxr");
8023   else
8024     return FAIL;
8025
8026   return SUCCESS;
8027 }
8028
8029 static void
8030 do_vmrs (void)
8031 {
8032   unsigned Rt = inst.operands[0].reg;
8033   
8034   if (thumb_mode && inst.operands[0].reg == REG_SP)
8035     {
8036       inst.error = BAD_SP;
8037       return;
8038     }
8039
8040   /* APSR_ sets isvec. All other refs to PC are illegal.  */
8041   if (!inst.operands[0].isvec && inst.operands[0].reg == REG_PC)
8042     {
8043       inst.error = BAD_PC;
8044       return;
8045     }
8046
8047   if (inst.operands[1].reg != 1)
8048     first_error (_("operand 1 must be FPSCR"));
8049
8050   inst.instruction |= (Rt << 12);
8051 }
8052
8053 static void
8054 do_vmsr (void)
8055 {
8056   unsigned Rt = inst.operands[1].reg;
8057   
8058   if (thumb_mode)
8059     reject_bad_reg (Rt);
8060   else if (Rt == REG_PC)
8061     {
8062       inst.error = BAD_PC;
8063       return;
8064     }
8065
8066   if (inst.operands[0].reg != 1)
8067     first_error (_("operand 0 must be FPSCR"));
8068
8069   inst.instruction |= (Rt << 12);
8070 }
8071
8072 static void
8073 do_mrs (void)
8074 {
8075   unsigned br;
8076
8077   if (do_vfp_nsyn_mrs () == SUCCESS)
8078     return;
8079
8080   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
8081   inst.instruction |= inst.operands[0].reg << 12;
8082
8083   if (inst.operands[1].isreg)
8084     {
8085       br = inst.operands[1].reg;
8086       if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf000))
8087         as_bad (_("bad register for mrs"));
8088     }
8089   else
8090     {
8091       /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
8092       constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
8093                   != (PSR_c|PSR_f),
8094                   _("'APSR', 'CPSR' or 'SPSR' expected"));
8095       br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
8096     }
8097
8098   inst.instruction |= br;
8099 }
8100
8101 /* Two possible forms:
8102       "{C|S}PSR_<field>, Rm",
8103       "{C|S}PSR_f, #expression".  */
8104
8105 static void
8106 do_msr (void)
8107 {
8108   if (do_vfp_nsyn_msr () == SUCCESS)
8109     return;
8110
8111   inst.instruction |= inst.operands[0].imm;
8112   if (inst.operands[1].isreg)
8113     inst.instruction |= inst.operands[1].reg;
8114   else
8115     {
8116       inst.instruction |= INST_IMMEDIATE;
8117       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
8118       inst.reloc.pc_rel = 0;
8119     }
8120 }
8121
8122 static void
8123 do_mul (void)
8124 {
8125   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
8126
8127   if (!inst.operands[2].present)
8128     inst.operands[2].reg = inst.operands[0].reg;
8129   inst.instruction |= inst.operands[0].reg << 16;
8130   inst.instruction |= inst.operands[1].reg;
8131   inst.instruction |= inst.operands[2].reg << 8;
8132
8133   if (inst.operands[0].reg == inst.operands[1].reg
8134       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8135     as_tsktsk (_("Rd and Rm should be different in mul"));
8136 }
8137
8138 /* Long Multiply Parser
8139    UMULL RdLo, RdHi, Rm, Rs
8140    SMULL RdLo, RdHi, Rm, Rs
8141    UMLAL RdLo, RdHi, Rm, Rs
8142    SMLAL RdLo, RdHi, Rm, Rs.  */
8143
8144 static void
8145 do_mull (void)
8146 {
8147   inst.instruction |= inst.operands[0].reg << 12;
8148   inst.instruction |= inst.operands[1].reg << 16;
8149   inst.instruction |= inst.operands[2].reg;
8150   inst.instruction |= inst.operands[3].reg << 8;
8151
8152   /* rdhi and rdlo must be different.  */
8153   if (inst.operands[0].reg == inst.operands[1].reg)
8154     as_tsktsk (_("rdhi and rdlo must be different"));
8155
8156   /* rdhi, rdlo and rm must all be different before armv6.  */
8157   if ((inst.operands[0].reg == inst.operands[2].reg
8158       || inst.operands[1].reg == inst.operands[2].reg)
8159       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8160     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
8161 }
8162
8163 static void
8164 do_nop (void)
8165 {
8166   if (inst.operands[0].present
8167       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
8168     {
8169       /* Architectural NOP hints are CPSR sets with no bits selected.  */
8170       inst.instruction &= 0xf0000000;
8171       inst.instruction |= 0x0320f000;
8172       if (inst.operands[0].present)
8173         inst.instruction |= inst.operands[0].imm;
8174     }
8175 }
8176
8177 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
8178    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
8179    Condition defaults to COND_ALWAYS.
8180    Error if Rd, Rn or Rm are R15.  */
8181
8182 static void
8183 do_pkhbt (void)
8184 {
8185   inst.instruction |= inst.operands[0].reg << 12;
8186   inst.instruction |= inst.operands[1].reg << 16;
8187   inst.instruction |= inst.operands[2].reg;
8188   if (inst.operands[3].present)
8189     encode_arm_shift (3);
8190 }
8191
8192 /* ARM V6 PKHTB (Argument Parse).  */
8193
8194 static void
8195 do_pkhtb (void)
8196 {
8197   if (!inst.operands[3].present)
8198     {
8199       /* If the shift specifier is omitted, turn the instruction
8200          into pkhbt rd, rm, rn. */
8201       inst.instruction &= 0xfff00010;
8202       inst.instruction |= inst.operands[0].reg << 12;
8203       inst.instruction |= inst.operands[1].reg;
8204       inst.instruction |= inst.operands[2].reg << 16;
8205     }
8206   else
8207     {
8208       inst.instruction |= inst.operands[0].reg << 12;
8209       inst.instruction |= inst.operands[1].reg << 16;
8210       inst.instruction |= inst.operands[2].reg;
8211       encode_arm_shift (3);
8212     }
8213 }
8214
8215 /* ARMv5TE: Preload-Cache
8216    MP Extensions: Preload for write
8217
8218     PLD(W) <addr_mode>
8219
8220   Syntactically, like LDR with B=1, W=0, L=1.  */
8221
8222 static void
8223 do_pld (void)
8224 {
8225   constraint (!inst.operands[0].isreg,
8226               _("'[' expected after PLD mnemonic"));
8227   constraint (inst.operands[0].postind,
8228               _("post-indexed expression used in preload instruction"));
8229   constraint (inst.operands[0].writeback,
8230               _("writeback used in preload instruction"));
8231   constraint (!inst.operands[0].preind,
8232               _("unindexed addressing used in preload instruction"));
8233   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8234 }
8235
8236 /* ARMv7: PLI <addr_mode>  */
8237 static void
8238 do_pli (void)
8239 {
8240   constraint (!inst.operands[0].isreg,
8241               _("'[' expected after PLI mnemonic"));
8242   constraint (inst.operands[0].postind,
8243               _("post-indexed expression used in preload instruction"));
8244   constraint (inst.operands[0].writeback,
8245               _("writeback used in preload instruction"));
8246   constraint (!inst.operands[0].preind,
8247               _("unindexed addressing used in preload instruction"));
8248   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8249   inst.instruction &= ~PRE_INDEX;
8250 }
8251
8252 static void
8253 do_push_pop (void)
8254 {
8255   inst.operands[1] = inst.operands[0];
8256   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
8257   inst.operands[0].isreg = 1;
8258   inst.operands[0].writeback = 1;
8259   inst.operands[0].reg = REG_SP;
8260   do_ldmstm ();
8261 }
8262
8263 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
8264    word at the specified address and the following word
8265    respectively.
8266    Unconditionally executed.
8267    Error if Rn is R15.  */
8268
8269 static void
8270 do_rfe (void)
8271 {
8272   inst.instruction |= inst.operands[0].reg << 16;
8273   if (inst.operands[0].writeback)
8274     inst.instruction |= WRITE_BACK;
8275 }
8276
8277 /* ARM V6 ssat (argument parse).  */
8278
8279 static void
8280 do_ssat (void)
8281 {
8282   inst.instruction |= inst.operands[0].reg << 12;
8283   inst.instruction |= (inst.operands[1].imm - 1) << 16;
8284   inst.instruction |= inst.operands[2].reg;
8285
8286   if (inst.operands[3].present)
8287     encode_arm_shift (3);
8288 }
8289
8290 /* ARM V6 usat (argument parse).  */
8291
8292 static void
8293 do_usat (void)
8294 {
8295   inst.instruction |= inst.operands[0].reg << 12;
8296   inst.instruction |= inst.operands[1].imm << 16;
8297   inst.instruction |= inst.operands[2].reg;
8298
8299   if (inst.operands[3].present)
8300     encode_arm_shift (3);
8301 }
8302
8303 /* ARM V6 ssat16 (argument parse).  */
8304
8305 static void
8306 do_ssat16 (void)
8307 {
8308   inst.instruction |= inst.operands[0].reg << 12;
8309   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
8310   inst.instruction |= inst.operands[2].reg;
8311 }
8312
8313 static void
8314 do_usat16 (void)
8315 {
8316   inst.instruction |= inst.operands[0].reg << 12;
8317   inst.instruction |= inst.operands[1].imm << 16;
8318   inst.instruction |= inst.operands[2].reg;
8319 }
8320
8321 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
8322    preserving the other bits.
8323
8324    setend <endian_specifier>, where <endian_specifier> is either
8325    BE or LE.  */
8326
8327 static void
8328 do_setend (void)
8329 {
8330   if (inst.operands[0].imm)
8331     inst.instruction |= 0x200;
8332 }
8333
8334 static void
8335 do_shift (void)
8336 {
8337   unsigned int Rm = (inst.operands[1].present
8338                      ? inst.operands[1].reg
8339                      : inst.operands[0].reg);
8340
8341   inst.instruction |= inst.operands[0].reg << 12;
8342   inst.instruction |= Rm;
8343   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
8344     {
8345       inst.instruction |= inst.operands[2].reg << 8;
8346       inst.instruction |= SHIFT_BY_REG;
8347     }
8348   else
8349     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
8350 }
8351
8352 static void
8353 do_smc (void)
8354 {
8355   inst.reloc.type = BFD_RELOC_ARM_SMC;
8356   inst.reloc.pc_rel = 0;
8357 }
8358
8359 static void
8360 do_hvc (void)
8361 {
8362   inst.reloc.type = BFD_RELOC_ARM_HVC;
8363   inst.reloc.pc_rel = 0;
8364 }
8365
8366 static void
8367 do_swi (void)
8368 {
8369   inst.reloc.type = BFD_RELOC_ARM_SWI;
8370   inst.reloc.pc_rel = 0;
8371 }
8372
8373 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
8374    SMLAxy{cond} Rd,Rm,Rs,Rn
8375    SMLAWy{cond} Rd,Rm,Rs,Rn
8376    Error if any register is R15.  */
8377
8378 static void
8379 do_smla (void)
8380 {
8381   inst.instruction |= inst.operands[0].reg << 16;
8382   inst.instruction |= inst.operands[1].reg;
8383   inst.instruction |= inst.operands[2].reg << 8;
8384   inst.instruction |= inst.operands[3].reg << 12;
8385 }
8386
8387 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8388    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8389    Error if any register is R15.
8390    Warning if Rdlo == Rdhi.  */
8391
8392 static void
8393 do_smlal (void)
8394 {
8395   inst.instruction |= inst.operands[0].reg << 12;
8396   inst.instruction |= inst.operands[1].reg << 16;
8397   inst.instruction |= inst.operands[2].reg;
8398   inst.instruction |= inst.operands[3].reg << 8;
8399
8400   if (inst.operands[0].reg == inst.operands[1].reg)
8401     as_tsktsk (_("rdhi and rdlo must be different"));
8402 }
8403
8404 /* ARM V5E (El Segundo) signed-multiply (argument parse)
8405    SMULxy{cond} Rd,Rm,Rs
8406    Error if any register is R15.  */
8407
8408 static void
8409 do_smul (void)
8410 {
8411   inst.instruction |= inst.operands[0].reg << 16;
8412   inst.instruction |= inst.operands[1].reg;
8413   inst.instruction |= inst.operands[2].reg << 8;
8414 }
8415
8416 /* ARM V6 srs (argument parse).  The variable fields in the encoding are
8417    the same for both ARM and Thumb-2.  */
8418
8419 static void
8420 do_srs (void)
8421 {
8422   int reg;
8423
8424   if (inst.operands[0].present)
8425     {
8426       reg = inst.operands[0].reg;
8427       constraint (reg != REG_SP, _("SRS base register must be r13"));
8428     }
8429   else
8430     reg = REG_SP;
8431
8432   inst.instruction |= reg << 16;
8433   inst.instruction |= inst.operands[1].imm;
8434   if (inst.operands[0].writeback || inst.operands[1].writeback)
8435     inst.instruction |= WRITE_BACK;
8436 }
8437
8438 /* ARM V6 strex (argument parse).  */
8439
8440 static void
8441 do_strex (void)
8442 {
8443   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8444               || inst.operands[2].postind || inst.operands[2].writeback
8445               || inst.operands[2].immisreg || inst.operands[2].shifted
8446               || inst.operands[2].negative
8447               /* See comment in do_ldrex().  */
8448               || (inst.operands[2].reg == REG_PC),
8449               BAD_ADDR_MODE);
8450
8451   constraint (inst.operands[0].reg == inst.operands[1].reg
8452               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8453
8454   constraint (inst.reloc.exp.X_op != O_constant
8455               || inst.reloc.exp.X_add_number != 0,
8456               _("offset must be zero in ARM encoding"));
8457
8458   inst.instruction |= inst.operands[0].reg << 12;
8459   inst.instruction |= inst.operands[1].reg;
8460   inst.instruction |= inst.operands[2].reg << 16;
8461   inst.reloc.type = BFD_RELOC_UNUSED;
8462 }
8463
8464 static void
8465 do_strexd (void)
8466 {
8467   constraint (inst.operands[1].reg % 2 != 0,
8468               _("even register required"));
8469   constraint (inst.operands[2].present
8470               && inst.operands[2].reg != inst.operands[1].reg + 1,
8471               _("can only store two consecutive registers"));
8472   /* If op 2 were present and equal to PC, this function wouldn't
8473      have been called in the first place.  */
8474   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
8475
8476   constraint (inst.operands[0].reg == inst.operands[1].reg
8477               || inst.operands[0].reg == inst.operands[1].reg + 1
8478               || inst.operands[0].reg == inst.operands[3].reg,
8479               BAD_OVERLAP);
8480
8481   inst.instruction |= inst.operands[0].reg << 12;
8482   inst.instruction |= inst.operands[1].reg;
8483   inst.instruction |= inst.operands[3].reg << 16;
8484 }
8485
8486 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8487    extends it to 32-bits, and adds the result to a value in another
8488    register.  You can specify a rotation by 0, 8, 16, or 24 bits
8489    before extracting the 16-bit value.
8490    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8491    Condition defaults to COND_ALWAYS.
8492    Error if any register uses R15.  */
8493
8494 static void
8495 do_sxtah (void)
8496 {
8497   inst.instruction |= inst.operands[0].reg << 12;
8498   inst.instruction |= inst.operands[1].reg << 16;
8499   inst.instruction |= inst.operands[2].reg;
8500   inst.instruction |= inst.operands[3].imm << 10;
8501 }
8502
8503 /* ARM V6 SXTH.
8504
8505    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8506    Condition defaults to COND_ALWAYS.
8507    Error if any register uses R15.  */
8508
8509 static void
8510 do_sxth (void)
8511 {
8512   inst.instruction |= inst.operands[0].reg << 12;
8513   inst.instruction |= inst.operands[1].reg;
8514   inst.instruction |= inst.operands[2].imm << 10;
8515 }
8516 \f
8517 /* VFP instructions.  In a logical order: SP variant first, monad
8518    before dyad, arithmetic then move then load/store.  */
8519
8520 static void
8521 do_vfp_sp_monadic (void)
8522 {
8523   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8524   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8525 }
8526
8527 static void
8528 do_vfp_sp_dyadic (void)
8529 {
8530   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8531   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8532   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8533 }
8534
8535 static void
8536 do_vfp_sp_compare_z (void)
8537 {
8538   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8539 }
8540
8541 static void
8542 do_vfp_dp_sp_cvt (void)
8543 {
8544   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8545   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8546 }
8547
8548 static void
8549 do_vfp_sp_dp_cvt (void)
8550 {
8551   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8552   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8553 }
8554
8555 static void
8556 do_vfp_reg_from_sp (void)
8557 {
8558   inst.instruction |= inst.operands[0].reg << 12;
8559   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8560 }
8561
8562 static void
8563 do_vfp_reg2_from_sp2 (void)
8564 {
8565   constraint (inst.operands[2].imm != 2,
8566               _("only two consecutive VFP SP registers allowed here"));
8567   inst.instruction |= inst.operands[0].reg << 12;
8568   inst.instruction |= inst.operands[1].reg << 16;
8569   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8570 }
8571
8572 static void
8573 do_vfp_sp_from_reg (void)
8574 {
8575   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
8576   inst.instruction |= inst.operands[1].reg << 12;
8577 }
8578
8579 static void
8580 do_vfp_sp2_from_reg2 (void)
8581 {
8582   constraint (inst.operands[0].imm != 2,
8583               _("only two consecutive VFP SP registers allowed here"));
8584   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
8585   inst.instruction |= inst.operands[1].reg << 12;
8586   inst.instruction |= inst.operands[2].reg << 16;
8587 }
8588
8589 static void
8590 do_vfp_sp_ldst (void)
8591 {
8592   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8593   encode_arm_cp_address (1, FALSE, TRUE, 0);
8594 }
8595
8596 static void
8597 do_vfp_dp_ldst (void)
8598 {
8599   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8600   encode_arm_cp_address (1, FALSE, TRUE, 0);
8601 }
8602
8603
8604 static void
8605 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
8606 {
8607   if (inst.operands[0].writeback)
8608     inst.instruction |= WRITE_BACK;
8609   else
8610     constraint (ldstm_type != VFP_LDSTMIA,
8611                 _("this addressing mode requires base-register writeback"));
8612   inst.instruction |= inst.operands[0].reg << 16;
8613   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
8614   inst.instruction |= inst.operands[1].imm;
8615 }
8616
8617 static void
8618 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
8619 {
8620   int count;
8621
8622   if (inst.operands[0].writeback)
8623     inst.instruction |= WRITE_BACK;
8624   else
8625     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
8626                 _("this addressing mode requires base-register writeback"));
8627
8628   inst.instruction |= inst.operands[0].reg << 16;
8629   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8630
8631   count = inst.operands[1].imm << 1;
8632   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
8633     count += 1;
8634
8635   inst.instruction |= count;
8636 }
8637
8638 static void
8639 do_vfp_sp_ldstmia (void)
8640 {
8641   vfp_sp_ldstm (VFP_LDSTMIA);
8642 }
8643
8644 static void
8645 do_vfp_sp_ldstmdb (void)
8646 {
8647   vfp_sp_ldstm (VFP_LDSTMDB);
8648 }
8649
8650 static void
8651 do_vfp_dp_ldstmia (void)
8652 {
8653   vfp_dp_ldstm (VFP_LDSTMIA);
8654 }
8655
8656 static void
8657 do_vfp_dp_ldstmdb (void)
8658 {
8659   vfp_dp_ldstm (VFP_LDSTMDB);
8660 }
8661
8662 static void
8663 do_vfp_xp_ldstmia (void)
8664 {
8665   vfp_dp_ldstm (VFP_LDSTMIAX);
8666 }
8667
8668 static void
8669 do_vfp_xp_ldstmdb (void)
8670 {
8671   vfp_dp_ldstm (VFP_LDSTMDBX);
8672 }
8673
8674 static void
8675 do_vfp_dp_rd_rm (void)
8676 {
8677   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8678   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8679 }
8680
8681 static void
8682 do_vfp_dp_rn_rd (void)
8683 {
8684   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
8685   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8686 }
8687
8688 static void
8689 do_vfp_dp_rd_rn (void)
8690 {
8691   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8692   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8693 }
8694
8695 static void
8696 do_vfp_dp_rd_rn_rm (void)
8697 {
8698   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8699   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8700   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
8701 }
8702
8703 static void
8704 do_vfp_dp_rd (void)
8705 {
8706   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8707 }
8708
8709 static void
8710 do_vfp_dp_rm_rd_rn (void)
8711 {
8712   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
8713   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8714   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
8715 }
8716
8717 /* VFPv3 instructions.  */
8718 static void
8719 do_vfp_sp_const (void)
8720 {
8721   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8722   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8723   inst.instruction |= (inst.operands[1].imm & 0x0f);
8724 }
8725
8726 static void
8727 do_vfp_dp_const (void)
8728 {
8729   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8730   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8731   inst.instruction |= (inst.operands[1].imm & 0x0f);
8732 }
8733
8734 static void
8735 vfp_conv (int srcsize)
8736 {
8737   unsigned immbits = srcsize - inst.operands[1].imm;
8738   inst.instruction |= (immbits & 1) << 5;
8739   inst.instruction |= (immbits >> 1);
8740 }
8741
8742 static void
8743 do_vfp_sp_conv_16 (void)
8744 {
8745   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8746   vfp_conv (16);
8747 }
8748
8749 static void
8750 do_vfp_dp_conv_16 (void)
8751 {
8752   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8753   vfp_conv (16);
8754 }
8755
8756 static void
8757 do_vfp_sp_conv_32 (void)
8758 {
8759   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8760   vfp_conv (32);
8761 }
8762
8763 static void
8764 do_vfp_dp_conv_32 (void)
8765 {
8766   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8767   vfp_conv (32);
8768 }
8769 \f
8770 /* FPA instructions.  Also in a logical order.  */
8771
8772 static void
8773 do_fpa_cmp (void)
8774 {
8775   inst.instruction |= inst.operands[0].reg << 16;
8776   inst.instruction |= inst.operands[1].reg;
8777 }
8778
8779 static void
8780 do_fpa_ldmstm (void)
8781 {
8782   inst.instruction |= inst.operands[0].reg << 12;
8783   switch (inst.operands[1].imm)
8784     {
8785     case 1: inst.instruction |= CP_T_X;          break;
8786     case 2: inst.instruction |= CP_T_Y;          break;
8787     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
8788     case 4:                                      break;
8789     default: abort ();
8790     }
8791
8792   if (inst.instruction & (PRE_INDEX | INDEX_UP))
8793     {
8794       /* The instruction specified "ea" or "fd", so we can only accept
8795          [Rn]{!}.  The instruction does not really support stacking or
8796          unstacking, so we have to emulate these by setting appropriate
8797          bits and offsets.  */
8798       constraint (inst.reloc.exp.X_op != O_constant
8799                   || inst.reloc.exp.X_add_number != 0,
8800                   _("this instruction does not support indexing"));
8801
8802       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
8803         inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
8804
8805       if (!(inst.instruction & INDEX_UP))
8806         inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
8807
8808       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
8809         {
8810           inst.operands[2].preind = 0;
8811           inst.operands[2].postind = 1;
8812         }
8813     }
8814
8815   encode_arm_cp_address (2, TRUE, TRUE, 0);
8816 }
8817 \f
8818 /* iWMMXt instructions: strictly in alphabetical order.  */
8819
8820 static void
8821 do_iwmmxt_tandorc (void)
8822 {
8823   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
8824 }
8825
8826 static void
8827 do_iwmmxt_textrc (void)
8828 {
8829   inst.instruction |= inst.operands[0].reg << 12;
8830   inst.instruction |= inst.operands[1].imm;
8831 }
8832
8833 static void
8834 do_iwmmxt_textrm (void)
8835 {
8836   inst.instruction |= inst.operands[0].reg << 12;
8837   inst.instruction |= inst.operands[1].reg << 16;
8838   inst.instruction |= inst.operands[2].imm;
8839 }
8840
8841 static void
8842 do_iwmmxt_tinsr (void)
8843 {
8844   inst.instruction |= inst.operands[0].reg << 16;
8845   inst.instruction |= inst.operands[1].reg << 12;
8846   inst.instruction |= inst.operands[2].imm;
8847 }
8848
8849 static void
8850 do_iwmmxt_tmia (void)
8851 {
8852   inst.instruction |= inst.operands[0].reg << 5;
8853   inst.instruction |= inst.operands[1].reg;
8854   inst.instruction |= inst.operands[2].reg << 12;
8855 }
8856
8857 static void
8858 do_iwmmxt_waligni (void)
8859 {
8860   inst.instruction |= inst.operands[0].reg << 12;
8861   inst.instruction |= inst.operands[1].reg << 16;
8862   inst.instruction |= inst.operands[2].reg;
8863   inst.instruction |= inst.operands[3].imm << 20;
8864 }
8865
8866 static void
8867 do_iwmmxt_wmerge (void)
8868 {
8869   inst.instruction |= inst.operands[0].reg << 12;
8870   inst.instruction |= inst.operands[1].reg << 16;
8871   inst.instruction |= inst.operands[2].reg;
8872   inst.instruction |= inst.operands[3].imm << 21;
8873 }
8874
8875 static void
8876 do_iwmmxt_wmov (void)
8877 {
8878   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
8879   inst.instruction |= inst.operands[0].reg << 12;
8880   inst.instruction |= inst.operands[1].reg << 16;
8881   inst.instruction |= inst.operands[1].reg;
8882 }
8883
8884 static void
8885 do_iwmmxt_wldstbh (void)
8886 {
8887   int reloc;
8888   inst.instruction |= inst.operands[0].reg << 12;
8889   if (thumb_mode)
8890     reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
8891   else
8892     reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
8893   encode_arm_cp_address (1, TRUE, FALSE, reloc);
8894 }
8895
8896 static void
8897 do_iwmmxt_wldstw (void)
8898 {
8899   /* RIWR_RIWC clears .isreg for a control register.  */
8900   if (!inst.operands[0].isreg)
8901     {
8902       constraint (inst.cond != COND_ALWAYS, BAD_COND);
8903       inst.instruction |= 0xf0000000;
8904     }
8905
8906   inst.instruction |= inst.operands[0].reg << 12;
8907   encode_arm_cp_address (1, TRUE, TRUE, 0);
8908 }
8909
8910 static void
8911 do_iwmmxt_wldstd (void)
8912 {
8913   inst.instruction |= inst.operands[0].reg << 12;
8914   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
8915       && inst.operands[1].immisreg)
8916     {
8917       inst.instruction &= ~0x1a000ff;
8918       inst.instruction |= (0xf << 28);
8919       if (inst.operands[1].preind)
8920         inst.instruction |= PRE_INDEX;
8921       if (!inst.operands[1].negative)
8922         inst.instruction |= INDEX_UP;
8923       if (inst.operands[1].writeback)
8924         inst.instruction |= WRITE_BACK;
8925       inst.instruction |= inst.operands[1].reg << 16;
8926       inst.instruction |= inst.reloc.exp.X_add_number << 4;
8927       inst.instruction |= inst.operands[1].imm;
8928     }
8929   else
8930     encode_arm_cp_address (1, TRUE, FALSE, 0);
8931 }
8932
8933 static void
8934 do_iwmmxt_wshufh (void)
8935 {
8936   inst.instruction |= inst.operands[0].reg << 12;
8937   inst.instruction |= inst.operands[1].reg << 16;
8938   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
8939   inst.instruction |= (inst.operands[2].imm & 0x0f);
8940 }
8941
8942 static void
8943 do_iwmmxt_wzero (void)
8944 {
8945   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
8946   inst.instruction |= inst.operands[0].reg;
8947   inst.instruction |= inst.operands[0].reg << 12;
8948   inst.instruction |= inst.operands[0].reg << 16;
8949 }
8950
8951 static void
8952 do_iwmmxt_wrwrwr_or_imm5 (void)
8953 {
8954   if (inst.operands[2].isreg)
8955     do_rd_rn_rm ();
8956   else {
8957     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
8958                 _("immediate operand requires iWMMXt2"));
8959     do_rd_rn ();
8960     if (inst.operands[2].imm == 0)
8961       {
8962         switch ((inst.instruction >> 20) & 0xf)
8963           {
8964           case 4:
8965           case 5:
8966           case 6:
8967           case 7:
8968             /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
8969             inst.operands[2].imm = 16;
8970             inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
8971             break;
8972           case 8:
8973           case 9:
8974           case 10:
8975           case 11:
8976             /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
8977             inst.operands[2].imm = 32;
8978             inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
8979             break;
8980           case 12:
8981           case 13:
8982           case 14:
8983           case 15:
8984             {
8985               /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
8986               unsigned long wrn;
8987               wrn = (inst.instruction >> 16) & 0xf;
8988               inst.instruction &= 0xff0fff0f;
8989               inst.instruction |= wrn;
8990               /* Bail out here; the instruction is now assembled.  */
8991               return;
8992             }
8993           }
8994       }
8995     /* Map 32 -> 0, etc.  */
8996     inst.operands[2].imm &= 0x1f;
8997     inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
8998   }
8999 }
9000 \f
9001 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
9002    operations first, then control, shift, and load/store.  */
9003
9004 /* Insns like "foo X,Y,Z".  */
9005
9006 static void
9007 do_mav_triple (void)
9008 {
9009   inst.instruction |= inst.operands[0].reg << 16;
9010   inst.instruction |= inst.operands[1].reg;
9011   inst.instruction |= inst.operands[2].reg << 12;
9012 }
9013
9014 /* Insns like "foo W,X,Y,Z".
9015     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
9016
9017 static void
9018 do_mav_quad (void)
9019 {
9020   inst.instruction |= inst.operands[0].reg << 5;
9021   inst.instruction |= inst.operands[1].reg << 12;
9022   inst.instruction |= inst.operands[2].reg << 16;
9023   inst.instruction |= inst.operands[3].reg;
9024 }
9025
9026 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
9027 static void
9028 do_mav_dspsc (void)
9029 {
9030   inst.instruction |= inst.operands[1].reg << 12;
9031 }
9032
9033 /* Maverick shift immediate instructions.
9034    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
9035    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
9036
9037 static void
9038 do_mav_shift (void)
9039 {
9040   int imm = inst.operands[2].imm;
9041
9042   inst.instruction |= inst.operands[0].reg << 12;
9043   inst.instruction |= inst.operands[1].reg << 16;
9044
9045   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
9046      Bits 5-7 of the insn should have bits 4-6 of the immediate.
9047      Bit 4 should be 0.  */
9048   imm = (imm & 0xf) | ((imm & 0x70) << 1);
9049
9050   inst.instruction |= imm;
9051 }
9052 \f
9053 /* XScale instructions.  Also sorted arithmetic before move.  */
9054
9055 /* Xscale multiply-accumulate (argument parse)
9056      MIAcc   acc0,Rm,Rs
9057      MIAPHcc acc0,Rm,Rs
9058      MIAxycc acc0,Rm,Rs.  */
9059
9060 static void
9061 do_xsc_mia (void)
9062 {
9063   inst.instruction |= inst.operands[1].reg;
9064   inst.instruction |= inst.operands[2].reg << 12;
9065 }
9066
9067 /* Xscale move-accumulator-register (argument parse)
9068
9069      MARcc   acc0,RdLo,RdHi.  */
9070
9071 static void
9072 do_xsc_mar (void)
9073 {
9074   inst.instruction |= inst.operands[1].reg << 12;
9075   inst.instruction |= inst.operands[2].reg << 16;
9076 }
9077
9078 /* Xscale move-register-accumulator (argument parse)
9079
9080      MRAcc   RdLo,RdHi,acc0.  */
9081
9082 static void
9083 do_xsc_mra (void)
9084 {
9085   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
9086   inst.instruction |= inst.operands[0].reg << 12;
9087   inst.instruction |= inst.operands[1].reg << 16;
9088 }
9089 \f
9090 /* Encoding functions relevant only to Thumb.  */
9091
9092 /* inst.operands[i] is a shifted-register operand; encode
9093    it into inst.instruction in the format used by Thumb32.  */
9094
9095 static void
9096 encode_thumb32_shifted_operand (int i)
9097 {
9098   unsigned int value = inst.reloc.exp.X_add_number;
9099   unsigned int shift = inst.operands[i].shift_kind;
9100
9101   constraint (inst.operands[i].immisreg,
9102               _("shift by register not allowed in thumb mode"));
9103   inst.instruction |= inst.operands[i].reg;
9104   if (shift == SHIFT_RRX)
9105     inst.instruction |= SHIFT_ROR << 4;
9106   else
9107     {
9108       constraint (inst.reloc.exp.X_op != O_constant,
9109                   _("expression too complex"));
9110
9111       constraint (value > 32
9112                   || (value == 32 && (shift == SHIFT_LSL
9113                                       || shift == SHIFT_ROR)),
9114                   _("shift expression is too large"));
9115
9116       if (value == 0)
9117         shift = SHIFT_LSL;
9118       else if (value == 32)
9119         value = 0;
9120
9121       inst.instruction |= shift << 4;
9122       inst.instruction |= (value & 0x1c) << 10;
9123       inst.instruction |= (value & 0x03) << 6;
9124     }
9125 }
9126
9127
9128 /* inst.operands[i] was set up by parse_address.  Encode it into a
9129    Thumb32 format load or store instruction.  Reject forms that cannot
9130    be used with such instructions.  If is_t is true, reject forms that
9131    cannot be used with a T instruction; if is_d is true, reject forms
9132    that cannot be used with a D instruction.  If it is a store insn,
9133    reject PC in Rn.  */
9134
9135 static void
9136 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
9137 {
9138   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
9139
9140   constraint (!inst.operands[i].isreg,
9141               _("Instruction does not support =N addresses"));
9142
9143   inst.instruction |= inst.operands[i].reg << 16;
9144   if (inst.operands[i].immisreg)
9145     {
9146       constraint (is_pc, BAD_PC_ADDRESSING);
9147       constraint (is_t || is_d, _("cannot use register index with this instruction"));
9148       constraint (inst.operands[i].negative,
9149                   _("Thumb does not support negative register indexing"));
9150       constraint (inst.operands[i].postind,
9151                   _("Thumb does not support register post-indexing"));
9152       constraint (inst.operands[i].writeback,
9153                   _("Thumb does not support register indexing with writeback"));
9154       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
9155                   _("Thumb supports only LSL in shifted register indexing"));
9156
9157       inst.instruction |= inst.operands[i].imm;
9158       if (inst.operands[i].shifted)
9159         {
9160           constraint (inst.reloc.exp.X_op != O_constant,
9161                       _("expression too complex"));
9162           constraint (inst.reloc.exp.X_add_number < 0
9163                       || inst.reloc.exp.X_add_number > 3,
9164                       _("shift out of range"));
9165           inst.instruction |= inst.reloc.exp.X_add_number << 4;
9166         }
9167       inst.reloc.type = BFD_RELOC_UNUSED;
9168     }
9169   else if (inst.operands[i].preind)
9170     {
9171       constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
9172       constraint (is_t && inst.operands[i].writeback,
9173                   _("cannot use writeback with this instruction"));
9174       constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0)
9175                   && !inst.reloc.pc_rel, BAD_PC_ADDRESSING);
9176
9177       if (is_d)
9178         {
9179           inst.instruction |= 0x01000000;
9180           if (inst.operands[i].writeback)
9181             inst.instruction |= 0x00200000;
9182         }
9183       else
9184         {
9185           inst.instruction |= 0x00000c00;
9186           if (inst.operands[i].writeback)
9187             inst.instruction |= 0x00000100;
9188         }
9189       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9190     }
9191   else if (inst.operands[i].postind)
9192     {
9193       gas_assert (inst.operands[i].writeback);
9194       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
9195       constraint (is_t, _("cannot use post-indexing with this instruction"));
9196
9197       if (is_d)
9198         inst.instruction |= 0x00200000;
9199       else
9200         inst.instruction |= 0x00000900;
9201       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9202     }
9203   else /* unindexed - only for coprocessor */
9204     inst.error = _("instruction does not accept unindexed addressing");
9205 }
9206
9207 /* Table of Thumb instructions which exist in both 16- and 32-bit
9208    encodings (the latter only in post-V6T2 cores).  The index is the
9209    value used in the insns table below.  When there is more than one
9210    possible 16-bit encoding for the instruction, this table always
9211    holds variant (1).
9212    Also contains several pseudo-instructions used during relaxation.  */
9213 #define T16_32_TAB                              \
9214   X(_adc,   4140, eb400000),                    \
9215   X(_adcs,  4140, eb500000),                    \
9216   X(_add,   1c00, eb000000),                    \
9217   X(_adds,  1c00, eb100000),                    \
9218   X(_addi,  0000, f1000000),                    \
9219   X(_addis, 0000, f1100000),                    \
9220   X(_add_pc,000f, f20f0000),                    \
9221   X(_add_sp,000d, f10d0000),                    \
9222   X(_adr,   000f, f20f0000),                    \
9223   X(_and,   4000, ea000000),                    \
9224   X(_ands,  4000, ea100000),                    \
9225   X(_asr,   1000, fa40f000),                    \
9226   X(_asrs,  1000, fa50f000),                    \
9227   X(_b,     e000, f000b000),                    \
9228   X(_bcond, d000, f0008000),                    \
9229   X(_bic,   4380, ea200000),                    \
9230   X(_bics,  4380, ea300000),                    \
9231   X(_cmn,   42c0, eb100f00),                    \
9232   X(_cmp,   2800, ebb00f00),                    \
9233   X(_cpsie, b660, f3af8400),                    \
9234   X(_cpsid, b670, f3af8600),                    \
9235   X(_cpy,   4600, ea4f0000),                    \
9236   X(_dec_sp,80dd, f1ad0d00),                    \
9237   X(_eor,   4040, ea800000),                    \
9238   X(_eors,  4040, ea900000),                    \
9239   X(_inc_sp,00dd, f10d0d00),                    \
9240   X(_ldmia, c800, e8900000),                    \
9241   X(_ldr,   6800, f8500000),                    \
9242   X(_ldrb,  7800, f8100000),                    \
9243   X(_ldrh,  8800, f8300000),                    \
9244   X(_ldrsb, 5600, f9100000),                    \
9245   X(_ldrsh, 5e00, f9300000),                    \
9246   X(_ldr_pc,4800, f85f0000),                    \
9247   X(_ldr_pc2,4800, f85f0000),                   \
9248   X(_ldr_sp,9800, f85d0000),                    \
9249   X(_lsl,   0000, fa00f000),                    \
9250   X(_lsls,  0000, fa10f000),                    \
9251   X(_lsr,   0800, fa20f000),                    \
9252   X(_lsrs,  0800, fa30f000),                    \
9253   X(_mov,   2000, ea4f0000),                    \
9254   X(_movs,  2000, ea5f0000),                    \
9255   X(_mul,   4340, fb00f000),                     \
9256   X(_muls,  4340, ffffffff), /* no 32b muls */  \
9257   X(_mvn,   43c0, ea6f0000),                    \
9258   X(_mvns,  43c0, ea7f0000),                    \
9259   X(_neg,   4240, f1c00000), /* rsb #0 */       \
9260   X(_negs,  4240, f1d00000), /* rsbs #0 */      \
9261   X(_orr,   4300, ea400000),                    \
9262   X(_orrs,  4300, ea500000),                    \
9263   X(_pop,   bc00, e8bd0000), /* ldmia sp!,... */        \
9264   X(_push,  b400, e92d0000), /* stmdb sp!,... */        \
9265   X(_rev,   ba00, fa90f080),                    \
9266   X(_rev16, ba40, fa90f090),                    \
9267   X(_revsh, bac0, fa90f0b0),                    \
9268   X(_ror,   41c0, fa60f000),                    \
9269   X(_rors,  41c0, fa70f000),                    \
9270   X(_sbc,   4180, eb600000),                    \
9271   X(_sbcs,  4180, eb700000),                    \
9272   X(_stmia, c000, e8800000),                    \
9273   X(_str,   6000, f8400000),                    \
9274   X(_strb,  7000, f8000000),                    \
9275   X(_strh,  8000, f8200000),                    \
9276   X(_str_sp,9000, f84d0000),                    \
9277   X(_sub,   1e00, eba00000),                    \
9278   X(_subs,  1e00, ebb00000),                    \
9279   X(_subi,  8000, f1a00000),                    \
9280   X(_subis, 8000, f1b00000),                    \
9281   X(_sxtb,  b240, fa4ff080),                    \
9282   X(_sxth,  b200, fa0ff080),                    \
9283   X(_tst,   4200, ea100f00),                    \
9284   X(_uxtb,  b2c0, fa5ff080),                    \
9285   X(_uxth,  b280, fa1ff080),                    \
9286   X(_nop,   bf00, f3af8000),                    \
9287   X(_yield, bf10, f3af8001),                    \
9288   X(_wfe,   bf20, f3af8002),                    \
9289   X(_wfi,   bf30, f3af8003),                    \
9290   X(_sev,   bf40, f3af8004),
9291
9292 /* To catch errors in encoding functions, the codes are all offset by
9293    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
9294    as 16-bit instructions.  */
9295 #define X(a,b,c) T_MNEM##a
9296 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
9297 #undef X
9298
9299 #define X(a,b,c) 0x##b
9300 static const unsigned short thumb_op16[] = { T16_32_TAB };
9301 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
9302 #undef X
9303
9304 #define X(a,b,c) 0x##c
9305 static const unsigned int thumb_op32[] = { T16_32_TAB };
9306 #define THUMB_OP32(n)        (thumb_op32[(n) - (T16_32_OFFSET + 1)])
9307 #define THUMB_SETS_FLAGS(n)  (THUMB_OP32 (n) & 0x00100000)
9308 #undef X
9309 #undef T16_32_TAB
9310
9311 /* Thumb instruction encoders, in alphabetical order.  */
9312
9313 /* ADDW or SUBW.  */
9314
9315 static void
9316 do_t_add_sub_w (void)
9317 {
9318   int Rd, Rn;
9319
9320   Rd = inst.operands[0].reg;
9321   Rn = inst.operands[1].reg;
9322
9323   /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
9324      is the SP-{plus,minus}-immediate form of the instruction.  */
9325   if (Rn == REG_SP)
9326     constraint (Rd == REG_PC, BAD_PC);
9327   else
9328     reject_bad_reg (Rd);
9329
9330   inst.instruction |= (Rn << 16) | (Rd << 8);
9331   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9332 }
9333
9334 /* Parse an add or subtract instruction.  We get here with inst.instruction
9335    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
9336
9337 static void
9338 do_t_add_sub (void)
9339 {
9340   int Rd, Rs, Rn;
9341
9342   Rd = inst.operands[0].reg;
9343   Rs = (inst.operands[1].present
9344         ? inst.operands[1].reg    /* Rd, Rs, foo */
9345         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9346
9347   if (Rd == REG_PC)
9348     set_it_insn_type_last ();
9349
9350   if (unified_syntax)
9351     {
9352       bfd_boolean flags;
9353       bfd_boolean narrow;
9354       int opcode;
9355
9356       flags = (inst.instruction == T_MNEM_adds
9357                || inst.instruction == T_MNEM_subs);
9358       if (flags)
9359         narrow = !in_it_block ();
9360       else
9361         narrow = in_it_block ();
9362       if (!inst.operands[2].isreg)
9363         {
9364           int add;
9365
9366           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9367
9368           add = (inst.instruction == T_MNEM_add
9369                  || inst.instruction == T_MNEM_adds);
9370           opcode = 0;
9371           if (inst.size_req != 4)
9372             {
9373               /* Attempt to use a narrow opcode, with relaxation if
9374                  appropriate.  */
9375               if (Rd == REG_SP && Rs == REG_SP && !flags)
9376                 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
9377               else if (Rd <= 7 && Rs == REG_SP && add && !flags)
9378                 opcode = T_MNEM_add_sp;
9379               else if (Rd <= 7 && Rs == REG_PC && add && !flags)
9380                 opcode = T_MNEM_add_pc;
9381               else if (Rd <= 7 && Rs <= 7 && narrow)
9382                 {
9383                   if (flags)
9384                     opcode = add ? T_MNEM_addis : T_MNEM_subis;
9385                   else
9386                     opcode = add ? T_MNEM_addi : T_MNEM_subi;
9387                 }
9388               if (opcode)
9389                 {
9390                   inst.instruction = THUMB_OP16(opcode);
9391                   inst.instruction |= (Rd << 4) | Rs;
9392                   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9393                   if (inst.size_req != 2)
9394                     inst.relax = opcode;
9395                 }
9396               else
9397                 constraint (inst.size_req == 2, BAD_HIREG);
9398             }
9399           if (inst.size_req == 4
9400               || (inst.size_req != 2 && !opcode))
9401             {
9402               if (Rd == REG_PC)
9403                 {
9404                   constraint (add, BAD_PC);
9405                   constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9406                              _("only SUBS PC, LR, #const allowed"));
9407                   constraint (inst.reloc.exp.X_op != O_constant,
9408                               _("expression too complex"));
9409                   constraint (inst.reloc.exp.X_add_number < 0
9410                               || inst.reloc.exp.X_add_number > 0xff,
9411                              _("immediate value out of range"));
9412                   inst.instruction = T2_SUBS_PC_LR
9413                                      | inst.reloc.exp.X_add_number;
9414                   inst.reloc.type = BFD_RELOC_UNUSED;
9415                   return;
9416                 }
9417               else if (Rs == REG_PC)
9418                 {
9419                   /* Always use addw/subw.  */
9420                   inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9421                   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9422                 }
9423               else
9424                 {
9425                   inst.instruction = THUMB_OP32 (inst.instruction);
9426                   inst.instruction = (inst.instruction & 0xe1ffffff)
9427                                      | 0x10000000;
9428                   if (flags)
9429                     inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9430                   else
9431                     inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9432                 }
9433               inst.instruction |= Rd << 8;
9434               inst.instruction |= Rs << 16;
9435             }
9436         }
9437       else
9438         {
9439           Rn = inst.operands[2].reg;
9440           /* See if we can do this with a 16-bit instruction.  */
9441           if (!inst.operands[2].shifted && inst.size_req != 4)
9442             {
9443               if (Rd > 7 || Rs > 7 || Rn > 7)
9444                 narrow = FALSE;
9445
9446               if (narrow)
9447                 {
9448                   inst.instruction = ((inst.instruction == T_MNEM_adds
9449                                        || inst.instruction == T_MNEM_add)
9450                                       ? T_OPCODE_ADD_R3
9451                                       : T_OPCODE_SUB_R3);
9452                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9453                   return;
9454                 }
9455
9456               if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
9457                 {
9458                   /* Thumb-1 cores (except v6-M) require at least one high
9459                      register in a narrow non flag setting add.  */
9460                   if (Rd > 7 || Rn > 7
9461                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9462                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
9463                     {
9464                       if (Rd == Rn)
9465                         {
9466                           Rn = Rs;
9467                           Rs = Rd;
9468                         }
9469                       inst.instruction = T_OPCODE_ADD_HI;
9470                       inst.instruction |= (Rd & 8) << 4;
9471                       inst.instruction |= (Rd & 7);
9472                       inst.instruction |= Rn << 3;
9473                       return;
9474                     }
9475                 }
9476             }
9477
9478           constraint (Rd == REG_PC, BAD_PC);
9479           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9480           constraint (Rs == REG_PC, BAD_PC);
9481           reject_bad_reg (Rn);
9482
9483           /* If we get here, it can't be done in 16 bits.  */
9484           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9485                       _("shift must be constant"));
9486           inst.instruction = THUMB_OP32 (inst.instruction);
9487           inst.instruction |= Rd << 8;
9488           inst.instruction |= Rs << 16;
9489           encode_thumb32_shifted_operand (2);
9490         }
9491     }
9492   else
9493     {
9494       constraint (inst.instruction == T_MNEM_adds
9495                   || inst.instruction == T_MNEM_subs,
9496                   BAD_THUMB32);
9497
9498       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
9499         {
9500           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9501                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9502                       BAD_HIREG);
9503
9504           inst.instruction = (inst.instruction == T_MNEM_add
9505                               ? 0x0000 : 0x8000);
9506           inst.instruction |= (Rd << 4) | Rs;
9507           inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9508           return;
9509         }
9510
9511       Rn = inst.operands[2].reg;
9512       constraint (inst.operands[2].shifted, _("unshifted register required"));
9513
9514       /* We now have Rd, Rs, and Rn set to registers.  */
9515       if (Rd > 7 || Rs > 7 || Rn > 7)
9516         {
9517           /* Can't do this for SUB.      */
9518           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9519           inst.instruction = T_OPCODE_ADD_HI;
9520           inst.instruction |= (Rd & 8) << 4;
9521           inst.instruction |= (Rd & 7);
9522           if (Rs == Rd)
9523             inst.instruction |= Rn << 3;
9524           else if (Rn == Rd)
9525             inst.instruction |= Rs << 3;
9526           else
9527             constraint (1, _("dest must overlap one source register"));
9528         }
9529       else
9530         {
9531           inst.instruction = (inst.instruction == T_MNEM_add
9532                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9533           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9534         }
9535     }
9536 }
9537
9538 static void
9539 do_t_adr (void)
9540 {
9541   unsigned Rd;
9542
9543   Rd = inst.operands[0].reg;
9544   reject_bad_reg (Rd);
9545
9546   if (unified_syntax && inst.size_req == 0 && Rd <= 7)
9547     {
9548       /* Defer to section relaxation.  */
9549       inst.relax = inst.instruction;
9550       inst.instruction = THUMB_OP16 (inst.instruction);
9551       inst.instruction |= Rd << 4;
9552     }
9553   else if (unified_syntax && inst.size_req != 2)
9554     {
9555       /* Generate a 32-bit opcode.  */
9556       inst.instruction = THUMB_OP32 (inst.instruction);
9557       inst.instruction |= Rd << 8;
9558       inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9559       inst.reloc.pc_rel = 1;
9560     }
9561   else
9562     {
9563       /* Generate a 16-bit opcode.  */
9564       inst.instruction = THUMB_OP16 (inst.instruction);
9565       inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9566       inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
9567       inst.reloc.pc_rel = 1;
9568
9569       inst.instruction |= Rd << 4;
9570     }
9571 }
9572
9573 /* Arithmetic instructions for which there is just one 16-bit
9574    instruction encoding, and it allows only two low registers.
9575    For maximal compatibility with ARM syntax, we allow three register
9576    operands even when Thumb-32 instructions are not available, as long
9577    as the first two are identical.  For instance, both "sbc r0,r1" and
9578    "sbc r0,r0,r1" are allowed.  */
9579 static void
9580 do_t_arit3 (void)
9581 {
9582   int Rd, Rs, Rn;
9583
9584   Rd = inst.operands[0].reg;
9585   Rs = (inst.operands[1].present
9586         ? inst.operands[1].reg    /* Rd, Rs, foo */
9587         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9588   Rn = inst.operands[2].reg;
9589
9590   reject_bad_reg (Rd);
9591   reject_bad_reg (Rs);
9592   if (inst.operands[2].isreg)
9593     reject_bad_reg (Rn);
9594
9595   if (unified_syntax)
9596     {
9597       if (!inst.operands[2].isreg)
9598         {
9599           /* For an immediate, we always generate a 32-bit opcode;
9600              section relaxation will shrink it later if possible.  */
9601           inst.instruction = THUMB_OP32 (inst.instruction);
9602           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9603           inst.instruction |= Rd << 8;
9604           inst.instruction |= Rs << 16;
9605           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9606         }
9607       else
9608         {
9609           bfd_boolean narrow;
9610
9611           /* See if we can do this with a 16-bit instruction.  */
9612           if (THUMB_SETS_FLAGS (inst.instruction))
9613             narrow = !in_it_block ();
9614           else
9615             narrow = in_it_block ();
9616
9617           if (Rd > 7 || Rn > 7 || Rs > 7)
9618             narrow = FALSE;
9619           if (inst.operands[2].shifted)
9620             narrow = FALSE;
9621           if (inst.size_req == 4)
9622             narrow = FALSE;
9623
9624           if (narrow
9625               && Rd == Rs)
9626             {
9627               inst.instruction = THUMB_OP16 (inst.instruction);
9628               inst.instruction |= Rd;
9629               inst.instruction |= Rn << 3;
9630               return;
9631             }
9632
9633           /* If we get here, it can't be done in 16 bits.  */
9634           constraint (inst.operands[2].shifted
9635                       && inst.operands[2].immisreg,
9636                       _("shift must be constant"));
9637           inst.instruction = THUMB_OP32 (inst.instruction);
9638           inst.instruction |= Rd << 8;
9639           inst.instruction |= Rs << 16;
9640           encode_thumb32_shifted_operand (2);
9641         }
9642     }
9643   else
9644     {
9645       /* On its face this is a lie - the instruction does set the
9646          flags.  However, the only supported mnemonic in this mode
9647          says it doesn't.  */
9648       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9649
9650       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9651                   _("unshifted register required"));
9652       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9653       constraint (Rd != Rs,
9654                   _("dest and source1 must be the same register"));
9655
9656       inst.instruction = THUMB_OP16 (inst.instruction);
9657       inst.instruction |= Rd;
9658       inst.instruction |= Rn << 3;
9659     }
9660 }
9661
9662 /* Similarly, but for instructions where the arithmetic operation is
9663    commutative, so we can allow either of them to be different from
9664    the destination operand in a 16-bit instruction.  For instance, all
9665    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
9666    accepted.  */
9667 static void
9668 do_t_arit3c (void)
9669 {
9670   int Rd, Rs, Rn;
9671
9672   Rd = inst.operands[0].reg;
9673   Rs = (inst.operands[1].present
9674         ? inst.operands[1].reg    /* Rd, Rs, foo */
9675         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9676   Rn = inst.operands[2].reg;
9677
9678   reject_bad_reg (Rd);
9679   reject_bad_reg (Rs);
9680   if (inst.operands[2].isreg)
9681     reject_bad_reg (Rn);
9682
9683   if (unified_syntax)
9684     {
9685       if (!inst.operands[2].isreg)
9686         {
9687           /* For an immediate, we always generate a 32-bit opcode;
9688              section relaxation will shrink it later if possible.  */
9689           inst.instruction = THUMB_OP32 (inst.instruction);
9690           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9691           inst.instruction |= Rd << 8;
9692           inst.instruction |= Rs << 16;
9693           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9694         }
9695       else
9696         {
9697           bfd_boolean narrow;
9698
9699           /* See if we can do this with a 16-bit instruction.  */
9700           if (THUMB_SETS_FLAGS (inst.instruction))
9701             narrow = !in_it_block ();
9702           else
9703             narrow = in_it_block ();
9704
9705           if (Rd > 7 || Rn > 7 || Rs > 7)
9706             narrow = FALSE;
9707           if (inst.operands[2].shifted)
9708             narrow = FALSE;
9709           if (inst.size_req == 4)
9710             narrow = FALSE;
9711
9712           if (narrow)
9713             {
9714               if (Rd == Rs)
9715                 {
9716                   inst.instruction = THUMB_OP16 (inst.instruction);
9717                   inst.instruction |= Rd;
9718                   inst.instruction |= Rn << 3;
9719                   return;
9720                 }
9721               if (Rd == Rn)
9722                 {
9723                   inst.instruction = THUMB_OP16 (inst.instruction);
9724                   inst.instruction |= Rd;
9725                   inst.instruction |= Rs << 3;
9726                   return;
9727                 }
9728             }
9729
9730           /* If we get here, it can't be done in 16 bits.  */
9731           constraint (inst.operands[2].shifted
9732                       && inst.operands[2].immisreg,
9733                       _("shift must be constant"));
9734           inst.instruction = THUMB_OP32 (inst.instruction);
9735           inst.instruction |= Rd << 8;
9736           inst.instruction |= Rs << 16;
9737           encode_thumb32_shifted_operand (2);
9738         }
9739     }
9740   else
9741     {
9742       /* On its face this is a lie - the instruction does set the
9743          flags.  However, the only supported mnemonic in this mode
9744          says it doesn't.  */
9745       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9746
9747       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9748                   _("unshifted register required"));
9749       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9750
9751       inst.instruction = THUMB_OP16 (inst.instruction);
9752       inst.instruction |= Rd;
9753
9754       if (Rd == Rs)
9755         inst.instruction |= Rn << 3;
9756       else if (Rd == Rn)
9757         inst.instruction |= Rs << 3;
9758       else
9759         constraint (1, _("dest must overlap one source register"));
9760     }
9761 }
9762
9763 static void
9764 do_t_barrier (void)
9765 {
9766   if (inst.operands[0].present)
9767     {
9768       constraint ((inst.instruction & 0xf0) != 0x40
9769                   && inst.operands[0].imm > 0xf
9770                   && inst.operands[0].imm < 0x0,
9771                   _("bad barrier type"));
9772       inst.instruction |= inst.operands[0].imm;
9773     }
9774   else
9775     inst.instruction |= 0xf;
9776 }
9777
9778 static void
9779 do_t_bfc (void)
9780 {
9781   unsigned Rd;
9782   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
9783   constraint (msb > 32, _("bit-field extends past end of register"));
9784   /* The instruction encoding stores the LSB and MSB,
9785      not the LSB and width.  */
9786   Rd = inst.operands[0].reg;
9787   reject_bad_reg (Rd);
9788   inst.instruction |= Rd << 8;
9789   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
9790   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
9791   inst.instruction |= msb - 1;
9792 }
9793
9794 static void
9795 do_t_bfi (void)
9796 {
9797   int Rd, Rn;
9798   unsigned int msb;
9799
9800   Rd = inst.operands[0].reg;
9801   reject_bad_reg (Rd);
9802
9803   /* #0 in second position is alternative syntax for bfc, which is
9804      the same instruction but with REG_PC in the Rm field.  */
9805   if (!inst.operands[1].isreg)
9806     Rn = REG_PC;
9807   else
9808     {
9809       Rn = inst.operands[1].reg;
9810       reject_bad_reg (Rn);
9811     }
9812
9813   msb = inst.operands[2].imm + inst.operands[3].imm;
9814   constraint (msb > 32, _("bit-field extends past end of register"));
9815   /* The instruction encoding stores the LSB and MSB,
9816      not the LSB and width.  */
9817   inst.instruction |= Rd << 8;
9818   inst.instruction |= Rn << 16;
9819   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9820   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9821   inst.instruction |= msb - 1;
9822 }
9823
9824 static void
9825 do_t_bfx (void)
9826 {
9827   unsigned Rd, Rn;
9828
9829   Rd = inst.operands[0].reg;
9830   Rn = inst.operands[1].reg;
9831
9832   reject_bad_reg (Rd);
9833   reject_bad_reg (Rn);
9834
9835   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
9836               _("bit-field extends past end of register"));
9837   inst.instruction |= Rd << 8;
9838   inst.instruction |= Rn << 16;
9839   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9840   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9841   inst.instruction |= inst.operands[3].imm - 1;
9842 }
9843
9844 /* ARM V5 Thumb BLX (argument parse)
9845         BLX <target_addr>       which is BLX(1)
9846         BLX <Rm>                which is BLX(2)
9847    Unfortunately, there are two different opcodes for this mnemonic.
9848    So, the insns[].value is not used, and the code here zaps values
9849         into inst.instruction.
9850
9851    ??? How to take advantage of the additional two bits of displacement
9852    available in Thumb32 mode?  Need new relocation?  */
9853
9854 static void
9855 do_t_blx (void)
9856 {
9857   set_it_insn_type_last ();
9858
9859   if (inst.operands[0].isreg)
9860     {
9861       constraint (inst.operands[0].reg == REG_PC, BAD_PC);
9862       /* We have a register, so this is BLX(2).  */
9863       inst.instruction |= inst.operands[0].reg << 3;
9864     }
9865   else
9866     {
9867       /* No register.  This must be BLX(1).  */
9868       inst.instruction = 0xf000e800;
9869       encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
9870     }
9871 }
9872
9873 static void
9874 do_t_branch (void)
9875 {
9876   int opcode;
9877   int cond;
9878   int reloc;
9879
9880   cond = inst.cond;
9881   set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
9882
9883   if (in_it_block ())
9884     {
9885       /* Conditional branches inside IT blocks are encoded as unconditional
9886          branches.  */
9887       cond = COND_ALWAYS;
9888     }
9889   else
9890     cond = inst.cond;
9891
9892   if (cond != COND_ALWAYS)
9893     opcode = T_MNEM_bcond;
9894   else
9895     opcode = inst.instruction;
9896
9897   if (unified_syntax
9898       && (inst.size_req == 4
9899           || (inst.size_req != 2
9900               && (inst.operands[0].hasreloc
9901                   || inst.reloc.exp.X_op == O_constant))))
9902     {
9903       inst.instruction = THUMB_OP32(opcode);
9904       if (cond == COND_ALWAYS)
9905         reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
9906       else
9907         {
9908           gas_assert (cond != 0xF);
9909           inst.instruction |= cond << 22;
9910           reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
9911         }
9912     }
9913   else
9914     {
9915       inst.instruction = THUMB_OP16(opcode);
9916       if (cond == COND_ALWAYS)
9917         reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
9918       else
9919         {
9920           inst.instruction |= cond << 8;
9921           reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
9922         }
9923       /* Allow section relaxation.  */
9924       if (unified_syntax && inst.size_req != 2)
9925         inst.relax = opcode;
9926     }
9927   inst.reloc.type = reloc;
9928   inst.reloc.pc_rel = 1;
9929 }
9930
9931 static void
9932 do_t_bkpt (void)
9933 {
9934   constraint (inst.cond != COND_ALWAYS,
9935               _("instruction is always unconditional"));
9936   if (inst.operands[0].present)
9937     {
9938       constraint (inst.operands[0].imm > 255,
9939                   _("immediate value out of range"));
9940       inst.instruction |= inst.operands[0].imm;
9941       set_it_insn_type (NEUTRAL_IT_INSN);
9942     }
9943 }
9944
9945 static void
9946 do_t_branch23 (void)
9947 {
9948   set_it_insn_type_last ();
9949   encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
9950   
9951   /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
9952      this file.  We used to simply ignore the PLT reloc type here --
9953      the branch encoding is now needed to deal with TLSCALL relocs.
9954      So if we see a PLT reloc now, put it back to how it used to be to
9955      keep the preexisting behaviour.  */
9956   if (inst.reloc.type == BFD_RELOC_ARM_PLT32)
9957     inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
9958
9959 #if defined(OBJ_COFF)
9960   /* If the destination of the branch is a defined symbol which does not have
9961      the THUMB_FUNC attribute, then we must be calling a function which has
9962      the (interfacearm) attribute.  We look for the Thumb entry point to that
9963      function and change the branch to refer to that function instead.  */
9964   if (   inst.reloc.exp.X_op == O_symbol
9965       && inst.reloc.exp.X_add_symbol != NULL
9966       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
9967       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
9968     inst.reloc.exp.X_add_symbol =
9969       find_real_start (inst.reloc.exp.X_add_symbol);
9970 #endif
9971 }
9972
9973 static void
9974 do_t_bx (void)
9975 {
9976   set_it_insn_type_last ();
9977   inst.instruction |= inst.operands[0].reg << 3;
9978   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
9979      should cause the alignment to be checked once it is known.  This is
9980      because BX PC only works if the instruction is word aligned.  */
9981 }
9982
9983 static void
9984 do_t_bxj (void)
9985 {
9986   int Rm;
9987
9988   set_it_insn_type_last ();
9989   Rm = inst.operands[0].reg;
9990   reject_bad_reg (Rm);
9991   inst.instruction |= Rm << 16;
9992 }
9993
9994 static void
9995 do_t_clz (void)
9996 {
9997   unsigned Rd;
9998   unsigned Rm;
9999
10000   Rd = inst.operands[0].reg;
10001   Rm = inst.operands[1].reg;
10002
10003   reject_bad_reg (Rd);
10004   reject_bad_reg (Rm);
10005
10006   inst.instruction |= Rd << 8;
10007   inst.instruction |= Rm << 16;
10008   inst.instruction |= Rm;
10009 }
10010
10011 static void
10012 do_t_cps (void)
10013 {
10014   set_it_insn_type (OUTSIDE_IT_INSN);
10015   inst.instruction |= inst.operands[0].imm;
10016 }
10017
10018 static void
10019 do_t_cpsi (void)
10020 {
10021   set_it_insn_type (OUTSIDE_IT_INSN);
10022   if (unified_syntax
10023       && (inst.operands[1].present || inst.size_req == 4)
10024       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
10025     {
10026       unsigned int imod = (inst.instruction & 0x0030) >> 4;
10027       inst.instruction = 0xf3af8000;
10028       inst.instruction |= imod << 9;
10029       inst.instruction |= inst.operands[0].imm << 5;
10030       if (inst.operands[1].present)
10031         inst.instruction |= 0x100 | inst.operands[1].imm;
10032     }
10033   else
10034     {
10035       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
10036                   && (inst.operands[0].imm & 4),
10037                   _("selected processor does not support 'A' form "
10038                     "of this instruction"));
10039       constraint (inst.operands[1].present || inst.size_req == 4,
10040                   _("Thumb does not support the 2-argument "
10041                     "form of this instruction"));
10042       inst.instruction |= inst.operands[0].imm;
10043     }
10044 }
10045
10046 /* THUMB CPY instruction (argument parse).  */
10047
10048 static void
10049 do_t_cpy (void)
10050 {
10051   if (inst.size_req == 4)
10052     {
10053       inst.instruction = THUMB_OP32 (T_MNEM_mov);
10054       inst.instruction |= inst.operands[0].reg << 8;
10055       inst.instruction |= inst.operands[1].reg;
10056     }
10057   else
10058     {
10059       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
10060       inst.instruction |= (inst.operands[0].reg & 0x7);
10061       inst.instruction |= inst.operands[1].reg << 3;
10062     }
10063 }
10064
10065 static void
10066 do_t_cbz (void)
10067 {
10068   set_it_insn_type (OUTSIDE_IT_INSN);
10069   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10070   inst.instruction |= inst.operands[0].reg;
10071   inst.reloc.pc_rel = 1;
10072   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
10073 }
10074
10075 static void
10076 do_t_dbg (void)
10077 {
10078   inst.instruction |= inst.operands[0].imm;
10079 }
10080
10081 static void
10082 do_t_div (void)
10083 {
10084   unsigned Rd, Rn, Rm;
10085
10086   Rd = inst.operands[0].reg;
10087   Rn = (inst.operands[1].present
10088         ? inst.operands[1].reg : Rd);
10089   Rm = inst.operands[2].reg;
10090
10091   reject_bad_reg (Rd);
10092   reject_bad_reg (Rn);
10093   reject_bad_reg (Rm);
10094
10095   inst.instruction |= Rd << 8;
10096   inst.instruction |= Rn << 16;
10097   inst.instruction |= Rm;
10098 }
10099
10100 static void
10101 do_t_hint (void)
10102 {
10103   if (unified_syntax && inst.size_req == 4)
10104     inst.instruction = THUMB_OP32 (inst.instruction);
10105   else
10106     inst.instruction = THUMB_OP16 (inst.instruction);
10107 }
10108
10109 static void
10110 do_t_it (void)
10111 {
10112   unsigned int cond = inst.operands[0].imm;
10113
10114   set_it_insn_type (IT_INSN);
10115   now_it.mask = (inst.instruction & 0xf) | 0x10;
10116   now_it.cc = cond;
10117
10118   /* If the condition is a negative condition, invert the mask.  */
10119   if ((cond & 0x1) == 0x0)
10120     {
10121       unsigned int mask = inst.instruction & 0x000f;
10122
10123       if ((mask & 0x7) == 0)
10124         /* no conversion needed */;
10125       else if ((mask & 0x3) == 0)
10126         mask ^= 0x8;
10127       else if ((mask & 0x1) == 0)
10128         mask ^= 0xC;
10129       else
10130         mask ^= 0xE;
10131
10132       inst.instruction &= 0xfff0;
10133       inst.instruction |= mask;
10134     }
10135
10136   inst.instruction |= cond << 4;
10137 }
10138
10139 /* Helper function used for both push/pop and ldm/stm.  */
10140 static void
10141 encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
10142 {
10143   bfd_boolean load;
10144
10145   load = (inst.instruction & (1 << 20)) != 0;
10146
10147   if (mask & (1 << 13))
10148     inst.error =  _("SP not allowed in register list");
10149
10150   if ((mask & (1 << base)) != 0
10151       && writeback)
10152     inst.error = _("having the base register in the register list when "
10153                    "using write back is UNPREDICTABLE");
10154
10155   if (load)
10156     {
10157       if (mask & (1 << 15))
10158         {
10159           if (mask & (1 << 14))
10160             inst.error = _("LR and PC should not both be in register list");
10161           else
10162             set_it_insn_type_last ();
10163         }
10164     }
10165   else
10166     {
10167       if (mask & (1 << 15))
10168         inst.error = _("PC not allowed in register list");
10169     }
10170
10171   if ((mask & (mask - 1)) == 0)
10172     {
10173       /* Single register transfers implemented as str/ldr.  */
10174       if (writeback)
10175         {
10176           if (inst.instruction & (1 << 23))
10177             inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
10178           else
10179             inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
10180         }
10181       else
10182         {
10183           if (inst.instruction & (1 << 23))
10184             inst.instruction = 0x00800000; /* ia -> [base] */
10185           else
10186             inst.instruction = 0x00000c04; /* db -> [base, #-4] */
10187         }
10188
10189       inst.instruction |= 0xf8400000;
10190       if (load)
10191         inst.instruction |= 0x00100000;
10192
10193       mask = ffs (mask) - 1;
10194       mask <<= 12;
10195     }
10196   else if (writeback)
10197     inst.instruction |= WRITE_BACK;
10198
10199   inst.instruction |= mask;
10200   inst.instruction |= base << 16;
10201 }
10202
10203 static void
10204 do_t_ldmstm (void)
10205 {
10206   /* This really doesn't seem worth it.  */
10207   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10208               _("expression too complex"));
10209   constraint (inst.operands[1].writeback,
10210               _("Thumb load/store multiple does not support {reglist}^"));
10211
10212   if (unified_syntax)
10213     {
10214       bfd_boolean narrow;
10215       unsigned mask;
10216
10217       narrow = FALSE;
10218       /* See if we can use a 16-bit instruction.  */
10219       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
10220           && inst.size_req != 4
10221           && !(inst.operands[1].imm & ~0xff))
10222         {
10223           mask = 1 << inst.operands[0].reg;
10224
10225           if (inst.operands[0].reg <= 7)
10226             {
10227               if (inst.instruction == T_MNEM_stmia
10228                   ? inst.operands[0].writeback
10229                   : (inst.operands[0].writeback
10230                      == !(inst.operands[1].imm & mask)))
10231                 {
10232                   if (inst.instruction == T_MNEM_stmia
10233                       && (inst.operands[1].imm & mask)
10234                       && (inst.operands[1].imm & (mask - 1)))
10235                     as_warn (_("value stored for r%d is UNKNOWN"),
10236                              inst.operands[0].reg);
10237
10238                   inst.instruction = THUMB_OP16 (inst.instruction);
10239                   inst.instruction |= inst.operands[0].reg << 8;
10240                   inst.instruction |= inst.operands[1].imm;
10241                   narrow = TRUE;
10242                 }
10243               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10244                 {
10245                   /* This means 1 register in reg list one of 3 situations:
10246                      1. Instruction is stmia, but without writeback.
10247                      2. lmdia without writeback, but with Rn not in
10248                         reglist.
10249                      3. ldmia with writeback, but with Rn in reglist.
10250                      Case 3 is UNPREDICTABLE behaviour, so we handle
10251                      case 1 and 2 which can be converted into a 16-bit
10252                      str or ldr. The SP cases are handled below.  */
10253                   unsigned long opcode;
10254                   /* First, record an error for Case 3.  */
10255                   if (inst.operands[1].imm & mask
10256                       && inst.operands[0].writeback)
10257                     inst.error = 
10258                         _("having the base register in the register list when "
10259                           "using write back is UNPREDICTABLE");
10260                     
10261                   opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str 
10262                                                              : T_MNEM_ldr);
10263                   inst.instruction = THUMB_OP16 (opcode);
10264                   inst.instruction |= inst.operands[0].reg << 3;
10265                   inst.instruction |= (ffs (inst.operands[1].imm)-1);
10266                   narrow = TRUE;
10267                 }
10268             }
10269           else if (inst.operands[0] .reg == REG_SP)
10270             {
10271               if (inst.operands[0].writeback)
10272                 {
10273                   inst.instruction = 
10274                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10275                                     ? T_MNEM_push : T_MNEM_pop);
10276                   inst.instruction |= inst.operands[1].imm;
10277                   narrow = TRUE;
10278                 }
10279               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10280                 {
10281                   inst.instruction = 
10282                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10283                                     ? T_MNEM_str_sp : T_MNEM_ldr_sp);
10284                   inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
10285                   narrow = TRUE;
10286                 }
10287             }
10288         }
10289
10290       if (!narrow)
10291         {
10292           if (inst.instruction < 0xffff)
10293             inst.instruction = THUMB_OP32 (inst.instruction);
10294
10295           encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
10296                                 inst.operands[0].writeback);
10297         }
10298     }
10299   else
10300     {
10301       constraint (inst.operands[0].reg > 7
10302                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
10303       constraint (inst.instruction != T_MNEM_ldmia
10304                   && inst.instruction != T_MNEM_stmia,
10305                   _("Thumb-2 instruction only valid in unified syntax"));
10306       if (inst.instruction == T_MNEM_stmia)
10307         {
10308           if (!inst.operands[0].writeback)
10309             as_warn (_("this instruction will write back the base register"));
10310           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
10311               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
10312             as_warn (_("value stored for r%d is UNKNOWN"),
10313                      inst.operands[0].reg);
10314         }
10315       else
10316         {
10317           if (!inst.operands[0].writeback
10318               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
10319             as_warn (_("this instruction will write back the base register"));
10320           else if (inst.operands[0].writeback
10321                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
10322             as_warn (_("this instruction will not write back the base register"));
10323         }
10324
10325       inst.instruction = THUMB_OP16 (inst.instruction);
10326       inst.instruction |= inst.operands[0].reg << 8;
10327       inst.instruction |= inst.operands[1].imm;
10328     }
10329 }
10330
10331 static void
10332 do_t_ldrex (void)
10333 {
10334   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
10335               || inst.operands[1].postind || inst.operands[1].writeback
10336               || inst.operands[1].immisreg || inst.operands[1].shifted
10337               || inst.operands[1].negative,
10338               BAD_ADDR_MODE);
10339
10340   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
10341
10342   inst.instruction |= inst.operands[0].reg << 12;
10343   inst.instruction |= inst.operands[1].reg << 16;
10344   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10345 }
10346
10347 static void
10348 do_t_ldrexd (void)
10349 {
10350   if (!inst.operands[1].present)
10351     {
10352       constraint (inst.operands[0].reg == REG_LR,
10353                   _("r14 not allowed as first register "
10354                     "when second register is omitted"));
10355       inst.operands[1].reg = inst.operands[0].reg + 1;
10356     }
10357   constraint (inst.operands[0].reg == inst.operands[1].reg,
10358               BAD_OVERLAP);
10359
10360   inst.instruction |= inst.operands[0].reg << 12;
10361   inst.instruction |= inst.operands[1].reg << 8;
10362   inst.instruction |= inst.operands[2].reg << 16;
10363 }
10364
10365 static void
10366 do_t_ldst (void)
10367 {
10368   unsigned long opcode;
10369   int Rn;
10370
10371   if (inst.operands[0].isreg
10372       && !inst.operands[0].preind
10373       && inst.operands[0].reg == REG_PC)
10374     set_it_insn_type_last ();
10375
10376   opcode = inst.instruction;
10377   if (unified_syntax)
10378     {
10379       if (!inst.operands[1].isreg)
10380         {
10381           if (opcode <= 0xffff)
10382             inst.instruction = THUMB_OP32 (opcode);
10383           if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10384             return;
10385         }
10386       if (inst.operands[1].isreg
10387           && !inst.operands[1].writeback
10388           && !inst.operands[1].shifted && !inst.operands[1].postind
10389           && !inst.operands[1].negative && inst.operands[0].reg <= 7
10390           && opcode <= 0xffff
10391           && inst.size_req != 4)
10392         {
10393           /* Insn may have a 16-bit form.  */
10394           Rn = inst.operands[1].reg;
10395           if (inst.operands[1].immisreg)
10396             {
10397               inst.instruction = THUMB_OP16 (opcode);
10398               /* [Rn, Rik] */
10399               if (Rn <= 7 && inst.operands[1].imm <= 7)
10400                 goto op16;
10401               else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
10402                 reject_bad_reg (inst.operands[1].imm);
10403             }
10404           else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
10405                     && opcode != T_MNEM_ldrsb)
10406                    || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
10407                    || (Rn == REG_SP && opcode == T_MNEM_str))
10408             {
10409               /* [Rn, #const] */
10410               if (Rn > 7)
10411                 {
10412                   if (Rn == REG_PC)
10413                     {
10414                       if (inst.reloc.pc_rel)
10415                         opcode = T_MNEM_ldr_pc2;
10416                       else
10417                         opcode = T_MNEM_ldr_pc;
10418                     }
10419                   else
10420                     {
10421                       if (opcode == T_MNEM_ldr)
10422                         opcode = T_MNEM_ldr_sp;
10423                       else
10424                         opcode = T_MNEM_str_sp;
10425                     }
10426                   inst.instruction = inst.operands[0].reg << 8;
10427                 }
10428               else
10429                 {
10430                   inst.instruction = inst.operands[0].reg;
10431                   inst.instruction |= inst.operands[1].reg << 3;
10432                 }
10433               inst.instruction |= THUMB_OP16 (opcode);
10434               if (inst.size_req == 2)
10435                 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10436               else
10437                 inst.relax = opcode;
10438               return;
10439             }
10440         }
10441       /* Definitely a 32-bit variant.  */
10442
10443       /* Warning for Erratum 752419.  */
10444       if (opcode == T_MNEM_ldr
10445           && inst.operands[0].reg == REG_SP
10446           && inst.operands[1].writeback == 1
10447           && !inst.operands[1].immisreg)
10448         {
10449           if (no_cpu_selected ()
10450               || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
10451                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
10452                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
10453             as_warn (_("This instruction may be unpredictable "
10454                        "if executed on M-profile cores "
10455                        "with interrupts enabled."));
10456         }
10457
10458       /* Do some validations regarding addressing modes.  */
10459       if (inst.operands[1].immisreg && opcode != T_MNEM_ldr
10460           && opcode != T_MNEM_str)
10461         reject_bad_reg (inst.operands[1].imm);
10462
10463       inst.instruction = THUMB_OP32 (opcode);
10464       inst.instruction |= inst.operands[0].reg << 12;
10465       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
10466       return;
10467     }
10468
10469   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10470
10471   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
10472     {
10473       /* Only [Rn,Rm] is acceptable.  */
10474       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10475       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10476                   || inst.operands[1].postind || inst.operands[1].shifted
10477                   || inst.operands[1].negative,
10478                   _("Thumb does not support this addressing mode"));
10479       inst.instruction = THUMB_OP16 (inst.instruction);
10480       goto op16;
10481     }
10482
10483   inst.instruction = THUMB_OP16 (inst.instruction);
10484   if (!inst.operands[1].isreg)
10485     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10486       return;
10487
10488   constraint (!inst.operands[1].preind
10489               || inst.operands[1].shifted
10490               || inst.operands[1].writeback,
10491               _("Thumb does not support this addressing mode"));
10492   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
10493     {
10494       constraint (inst.instruction & 0x0600,
10495                   _("byte or halfword not valid for base register"));
10496       constraint (inst.operands[1].reg == REG_PC
10497                   && !(inst.instruction & THUMB_LOAD_BIT),
10498                   _("r15 based store not allowed"));
10499       constraint (inst.operands[1].immisreg,
10500                   _("invalid base register for register offset"));
10501
10502       if (inst.operands[1].reg == REG_PC)
10503         inst.instruction = T_OPCODE_LDR_PC;
10504       else if (inst.instruction & THUMB_LOAD_BIT)
10505         inst.instruction = T_OPCODE_LDR_SP;
10506       else
10507         inst.instruction = T_OPCODE_STR_SP;
10508
10509       inst.instruction |= inst.operands[0].reg << 8;
10510       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10511       return;
10512     }
10513
10514   constraint (inst.operands[1].reg > 7, BAD_HIREG);
10515   if (!inst.operands[1].immisreg)
10516     {
10517       /* Immediate offset.  */
10518       inst.instruction |= inst.operands[0].reg;
10519       inst.instruction |= inst.operands[1].reg << 3;
10520       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10521       return;
10522     }
10523
10524   /* Register offset.  */
10525   constraint (inst.operands[1].imm > 7, BAD_HIREG);
10526   constraint (inst.operands[1].negative,
10527               _("Thumb does not support this addressing mode"));
10528
10529  op16:
10530   switch (inst.instruction)
10531     {
10532     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10533     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10534     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10535     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10536     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10537     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10538     case 0x5600 /* ldrsb */:
10539     case 0x5e00 /* ldrsh */: break;
10540     default: abort ();
10541     }
10542
10543   inst.instruction |= inst.operands[0].reg;
10544   inst.instruction |= inst.operands[1].reg << 3;
10545   inst.instruction |= inst.operands[1].imm << 6;
10546 }
10547
10548 static void
10549 do_t_ldstd (void)
10550 {
10551   if (!inst.operands[1].present)
10552     {
10553       inst.operands[1].reg = inst.operands[0].reg + 1;
10554       constraint (inst.operands[0].reg == REG_LR,
10555                   _("r14 not allowed here"));
10556     }
10557   inst.instruction |= inst.operands[0].reg << 12;
10558   inst.instruction |= inst.operands[1].reg << 8;
10559   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
10560 }
10561
10562 static void
10563 do_t_ldstt (void)
10564 {
10565   inst.instruction |= inst.operands[0].reg << 12;
10566   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
10567 }
10568
10569 static void
10570 do_t_mla (void)
10571 {
10572   unsigned Rd, Rn, Rm, Ra;
10573
10574   Rd = inst.operands[0].reg;
10575   Rn = inst.operands[1].reg;
10576   Rm = inst.operands[2].reg;
10577   Ra = inst.operands[3].reg;
10578
10579   reject_bad_reg (Rd);
10580   reject_bad_reg (Rn);
10581   reject_bad_reg (Rm);
10582   reject_bad_reg (Ra);
10583
10584   inst.instruction |= Rd << 8;
10585   inst.instruction |= Rn << 16;
10586   inst.instruction |= Rm;
10587   inst.instruction |= Ra << 12;
10588 }
10589
10590 static void
10591 do_t_mlal (void)
10592 {
10593   unsigned RdLo, RdHi, Rn, Rm;
10594
10595   RdLo = inst.operands[0].reg;
10596   RdHi = inst.operands[1].reg;
10597   Rn = inst.operands[2].reg;
10598   Rm = inst.operands[3].reg;
10599
10600   reject_bad_reg (RdLo);
10601   reject_bad_reg (RdHi);
10602   reject_bad_reg (Rn);
10603   reject_bad_reg (Rm);
10604
10605   inst.instruction |= RdLo << 12;
10606   inst.instruction |= RdHi << 8;
10607   inst.instruction |= Rn << 16;
10608   inst.instruction |= Rm;
10609 }
10610
10611 static void
10612 do_t_mov_cmp (void)
10613 {
10614   unsigned Rn, Rm;
10615
10616   Rn = inst.operands[0].reg;
10617   Rm = inst.operands[1].reg;
10618
10619   if (Rn == REG_PC)
10620     set_it_insn_type_last ();
10621
10622   if (unified_syntax)
10623     {
10624       int r0off = (inst.instruction == T_MNEM_mov
10625                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
10626       unsigned long opcode;
10627       bfd_boolean narrow;
10628       bfd_boolean low_regs;
10629
10630       low_regs = (Rn <= 7 && Rm <= 7);
10631       opcode = inst.instruction;
10632       if (in_it_block ())
10633         narrow = opcode != T_MNEM_movs;
10634       else
10635         narrow = opcode != T_MNEM_movs || low_regs;
10636       if (inst.size_req == 4
10637           || inst.operands[1].shifted)
10638         narrow = FALSE;
10639
10640       /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
10641       if (opcode == T_MNEM_movs && inst.operands[1].isreg
10642           && !inst.operands[1].shifted
10643           && Rn == REG_PC
10644           && Rm == REG_LR)
10645         {
10646           inst.instruction = T2_SUBS_PC_LR;
10647           return;
10648         }
10649
10650       if (opcode == T_MNEM_cmp)
10651         {
10652           constraint (Rn == REG_PC, BAD_PC);
10653           if (narrow)
10654             {
10655               /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
10656                  but valid.  */
10657               warn_deprecated_sp (Rm);
10658               /* R15 was documented as a valid choice for Rm in ARMv6,
10659                  but as UNPREDICTABLE in ARMv7.  ARM's proprietary
10660                  tools reject R15, so we do too.  */
10661               constraint (Rm == REG_PC, BAD_PC);
10662             }
10663           else
10664             reject_bad_reg (Rm);
10665         }
10666       else if (opcode == T_MNEM_mov
10667                || opcode == T_MNEM_movs)
10668         {
10669           if (inst.operands[1].isreg)
10670             {
10671               if (opcode == T_MNEM_movs)
10672                 {
10673                   reject_bad_reg (Rn);
10674                   reject_bad_reg (Rm);
10675                 }
10676               else if (narrow)
10677                 {
10678                   /* This is mov.n.  */
10679                   if ((Rn == REG_SP || Rn == REG_PC)
10680                       && (Rm == REG_SP || Rm == REG_PC))
10681                     {
10682                       as_warn (_("Use of r%u as a source register is "
10683                                  "deprecated when r%u is the destination "
10684                                  "register."), Rm, Rn);
10685                     }
10686                 }
10687               else
10688                 {
10689                   /* This is mov.w.  */
10690                   constraint (Rn == REG_PC, BAD_PC);
10691                   constraint (Rm == REG_PC, BAD_PC);
10692                   constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
10693                 }
10694             }
10695           else
10696             reject_bad_reg (Rn);
10697         }
10698
10699       if (!inst.operands[1].isreg)
10700         {
10701           /* Immediate operand.  */
10702           if (!in_it_block () && opcode == T_MNEM_mov)
10703             narrow = 0;
10704           if (low_regs && narrow)
10705             {
10706               inst.instruction = THUMB_OP16 (opcode);
10707               inst.instruction |= Rn << 8;
10708               if (inst.size_req == 2)
10709                 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10710               else
10711                 inst.relax = opcode;
10712             }
10713           else
10714             {
10715               inst.instruction = THUMB_OP32 (inst.instruction);
10716               inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10717               inst.instruction |= Rn << r0off;
10718               inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10719             }
10720         }
10721       else if (inst.operands[1].shifted && inst.operands[1].immisreg
10722                && (inst.instruction == T_MNEM_mov
10723                    || inst.instruction == T_MNEM_movs))
10724         {
10725           /* Register shifts are encoded as separate shift instructions.  */
10726           bfd_boolean flags = (inst.instruction == T_MNEM_movs);
10727
10728           if (in_it_block ())
10729             narrow = !flags;
10730           else
10731             narrow = flags;
10732
10733           if (inst.size_req == 4)
10734             narrow = FALSE;
10735
10736           if (!low_regs || inst.operands[1].imm > 7)
10737             narrow = FALSE;
10738
10739           if (Rn != Rm)
10740             narrow = FALSE;
10741
10742           switch (inst.operands[1].shift_kind)
10743             {
10744             case SHIFT_LSL:
10745               opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
10746               break;
10747             case SHIFT_ASR:
10748               opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
10749               break;
10750             case SHIFT_LSR:
10751               opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
10752               break;
10753             case SHIFT_ROR:
10754               opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
10755               break;
10756             default:
10757               abort ();
10758             }
10759
10760           inst.instruction = opcode;
10761           if (narrow)
10762             {
10763               inst.instruction |= Rn;
10764               inst.instruction |= inst.operands[1].imm << 3;
10765             }
10766           else
10767             {
10768               if (flags)
10769                 inst.instruction |= CONDS_BIT;
10770
10771               inst.instruction |= Rn << 8;
10772               inst.instruction |= Rm << 16;
10773               inst.instruction |= inst.operands[1].imm;
10774             }
10775         }
10776       else if (!narrow)
10777         {
10778           /* Some mov with immediate shift have narrow variants.
10779              Register shifts are handled above.  */
10780           if (low_regs && inst.operands[1].shifted
10781               && (inst.instruction == T_MNEM_mov
10782                   || inst.instruction == T_MNEM_movs))
10783             {
10784               if (in_it_block ())
10785                 narrow = (inst.instruction == T_MNEM_mov);
10786               else
10787                 narrow = (inst.instruction == T_MNEM_movs);
10788             }
10789
10790           if (narrow)
10791             {
10792               switch (inst.operands[1].shift_kind)
10793                 {
10794                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
10795                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
10796                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
10797                 default: narrow = FALSE; break;
10798                 }
10799             }
10800
10801           if (narrow)
10802             {
10803               inst.instruction |= Rn;
10804               inst.instruction |= Rm << 3;
10805               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
10806             }
10807           else
10808             {
10809               inst.instruction = THUMB_OP32 (inst.instruction);
10810               inst.instruction |= Rn << r0off;
10811               encode_thumb32_shifted_operand (1);
10812             }
10813         }
10814       else
10815         switch (inst.instruction)
10816           {
10817           case T_MNEM_mov:
10818             inst.instruction = T_OPCODE_MOV_HR;
10819             inst.instruction |= (Rn & 0x8) << 4;
10820             inst.instruction |= (Rn & 0x7);
10821             inst.instruction |= Rm << 3;
10822             break;
10823
10824           case T_MNEM_movs:
10825             /* We know we have low registers at this point.
10826                Generate LSLS Rd, Rs, #0.  */
10827             inst.instruction = T_OPCODE_LSL_I;
10828             inst.instruction |= Rn;
10829             inst.instruction |= Rm << 3;
10830             break;
10831
10832           case T_MNEM_cmp:
10833             if (low_regs)
10834               {
10835                 inst.instruction = T_OPCODE_CMP_LR;
10836                 inst.instruction |= Rn;
10837                 inst.instruction |= Rm << 3;
10838               }
10839             else
10840               {
10841                 inst.instruction = T_OPCODE_CMP_HR;
10842                 inst.instruction |= (Rn & 0x8) << 4;
10843                 inst.instruction |= (Rn & 0x7);
10844                 inst.instruction |= Rm << 3;
10845               }
10846             break;
10847           }
10848       return;
10849     }
10850
10851   inst.instruction = THUMB_OP16 (inst.instruction);
10852
10853   /* PR 10443: Do not silently ignore shifted operands.  */
10854   constraint (inst.operands[1].shifted,
10855               _("shifts in CMP/MOV instructions are only supported in unified syntax"));
10856
10857   if (inst.operands[1].isreg)
10858     {
10859       if (Rn < 8 && Rm < 8)
10860         {
10861           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
10862              since a MOV instruction produces unpredictable results.  */
10863           if (inst.instruction == T_OPCODE_MOV_I8)
10864             inst.instruction = T_OPCODE_ADD_I3;
10865           else
10866             inst.instruction = T_OPCODE_CMP_LR;
10867
10868           inst.instruction |= Rn;
10869           inst.instruction |= Rm << 3;
10870         }
10871       else
10872         {
10873           if (inst.instruction == T_OPCODE_MOV_I8)
10874             inst.instruction = T_OPCODE_MOV_HR;
10875           else
10876             inst.instruction = T_OPCODE_CMP_HR;
10877           do_t_cpy ();
10878         }
10879     }
10880   else
10881     {
10882       constraint (Rn > 7,
10883                   _("only lo regs allowed with immediate"));
10884       inst.instruction |= Rn << 8;
10885       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10886     }
10887 }
10888
10889 static void
10890 do_t_mov16 (void)
10891 {
10892   unsigned Rd;
10893   bfd_vma imm;
10894   bfd_boolean top;
10895
10896   top = (inst.instruction & 0x00800000) != 0;
10897   if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
10898     {
10899       constraint (top, _(":lower16: not allowed this instruction"));
10900       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
10901     }
10902   else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
10903     {
10904       constraint (!top, _(":upper16: not allowed this instruction"));
10905       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
10906     }
10907
10908   Rd = inst.operands[0].reg;
10909   reject_bad_reg (Rd);
10910
10911   inst.instruction |= Rd << 8;
10912   if (inst.reloc.type == BFD_RELOC_UNUSED)
10913     {
10914       imm = inst.reloc.exp.X_add_number;
10915       inst.instruction |= (imm & 0xf000) << 4;
10916       inst.instruction |= (imm & 0x0800) << 15;
10917       inst.instruction |= (imm & 0x0700) << 4;
10918       inst.instruction |= (imm & 0x00ff);
10919     }
10920 }
10921
10922 static void
10923 do_t_mvn_tst (void)
10924 {
10925   unsigned Rn, Rm;
10926
10927   Rn = inst.operands[0].reg;
10928   Rm = inst.operands[1].reg;
10929
10930   if (inst.instruction == T_MNEM_cmp
10931       || inst.instruction == T_MNEM_cmn)
10932     constraint (Rn == REG_PC, BAD_PC);
10933   else
10934     reject_bad_reg (Rn);
10935   reject_bad_reg (Rm);
10936
10937   if (unified_syntax)
10938     {
10939       int r0off = (inst.instruction == T_MNEM_mvn
10940                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
10941       bfd_boolean narrow;
10942
10943       if (inst.size_req == 4
10944           || inst.instruction > 0xffff
10945           || inst.operands[1].shifted
10946           || Rn > 7 || Rm > 7)
10947         narrow = FALSE;
10948       else if (inst.instruction == T_MNEM_cmn)
10949         narrow = TRUE;
10950       else if (THUMB_SETS_FLAGS (inst.instruction))
10951         narrow = !in_it_block ();
10952       else
10953         narrow = in_it_block ();
10954
10955       if (!inst.operands[1].isreg)
10956         {
10957           /* For an immediate, we always generate a 32-bit opcode;
10958              section relaxation will shrink it later if possible.  */
10959           if (inst.instruction < 0xffff)
10960             inst.instruction = THUMB_OP32 (inst.instruction);
10961           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10962           inst.instruction |= Rn << r0off;
10963           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10964         }
10965       else
10966         {
10967           /* See if we can do this with a 16-bit instruction.  */
10968           if (narrow)
10969             {
10970               inst.instruction = THUMB_OP16 (inst.instruction);
10971               inst.instruction |= Rn;
10972               inst.instruction |= Rm << 3;
10973             }
10974           else
10975             {
10976               constraint (inst.operands[1].shifted
10977                           && inst.operands[1].immisreg,
10978                           _("shift must be constant"));
10979               if (inst.instruction < 0xffff)
10980                 inst.instruction = THUMB_OP32 (inst.instruction);
10981               inst.instruction |= Rn << r0off;
10982               encode_thumb32_shifted_operand (1);
10983             }
10984         }
10985     }
10986   else
10987     {
10988       constraint (inst.instruction > 0xffff
10989                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
10990       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
10991                   _("unshifted register required"));
10992       constraint (Rn > 7 || Rm > 7,
10993                   BAD_HIREG);
10994
10995       inst.instruction = THUMB_OP16 (inst.instruction);
10996       inst.instruction |= Rn;
10997       inst.instruction |= Rm << 3;
10998     }
10999 }
11000
11001 static void
11002 do_t_mrs (void)
11003 {
11004   unsigned Rd;
11005
11006   if (do_vfp_nsyn_mrs () == SUCCESS)
11007     return;
11008
11009   Rd = inst.operands[0].reg;
11010   reject_bad_reg (Rd);
11011   inst.instruction |= Rd << 8;
11012
11013   if (inst.operands[1].isreg)
11014     {
11015       unsigned br = inst.operands[1].reg;
11016       if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
11017         as_bad (_("bad register for mrs"));
11018
11019       inst.instruction |= br & (0xf << 16);
11020       inst.instruction |= (br & 0x300) >> 4;
11021       inst.instruction |= (br & SPSR_BIT) >> 2;
11022     }
11023   else
11024     {
11025       int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11026
11027       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11028         constraint (flags != 0, _("selected processor does not support "
11029                     "requested special purpose register"));
11030       else
11031         /* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
11032            devices).  */
11033         constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
11034                     _("'APSR', 'CPSR' or 'SPSR' expected"));
11035
11036       inst.instruction |= (flags & SPSR_BIT) >> 2;
11037       inst.instruction |= inst.operands[1].imm & 0xff;
11038       inst.instruction |= 0xf0000;
11039     }
11040 }
11041
11042 static void
11043 do_t_msr (void)
11044 {
11045   int flags;
11046   unsigned Rn;
11047
11048   if (do_vfp_nsyn_msr () == SUCCESS)
11049     return;
11050
11051   constraint (!inst.operands[1].isreg,
11052               _("Thumb encoding does not support an immediate here"));
11053
11054   if (inst.operands[0].isreg)
11055     flags = (int)(inst.operands[0].reg);
11056   else
11057     flags = inst.operands[0].imm;
11058
11059   if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11060     {
11061       int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11062
11063       constraint ((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11064                    && (bits & ~(PSR_s | PSR_f)) != 0)
11065                   || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11066                       && bits != PSR_f),
11067                   _("selected processor does not support requested special "
11068                     "purpose register"));
11069     }
11070   else
11071      constraint ((flags & 0xff) != 0, _("selected processor does not support "
11072                  "requested special purpose register"));
11073
11074   Rn = inst.operands[1].reg;
11075   reject_bad_reg (Rn);
11076
11077   inst.instruction |= (flags & SPSR_BIT) >> 2;
11078   inst.instruction |= (flags & 0xf0000) >> 8;
11079   inst.instruction |= (flags & 0x300) >> 4;
11080   inst.instruction |= (flags & 0xff);
11081   inst.instruction |= Rn << 16;
11082 }
11083
11084 static void
11085 do_t_mul (void)
11086 {
11087   bfd_boolean narrow;
11088   unsigned Rd, Rn, Rm;
11089
11090   if (!inst.operands[2].present)
11091     inst.operands[2].reg = inst.operands[0].reg;
11092
11093   Rd = inst.operands[0].reg;
11094   Rn = inst.operands[1].reg;
11095   Rm = inst.operands[2].reg;
11096
11097   if (unified_syntax)
11098     {
11099       if (inst.size_req == 4
11100           || (Rd != Rn
11101               && Rd != Rm)
11102           || Rn > 7
11103           || Rm > 7)
11104         narrow = FALSE;
11105       else if (inst.instruction == T_MNEM_muls)
11106         narrow = !in_it_block ();
11107       else
11108         narrow = in_it_block ();
11109     }
11110   else
11111     {
11112       constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
11113       constraint (Rn > 7 || Rm > 7,
11114                   BAD_HIREG);
11115       narrow = TRUE;
11116     }
11117
11118   if (narrow)
11119     {
11120       /* 16-bit MULS/Conditional MUL.  */
11121       inst.instruction = THUMB_OP16 (inst.instruction);
11122       inst.instruction |= Rd;
11123
11124       if (Rd == Rn)
11125         inst.instruction |= Rm << 3;
11126       else if (Rd == Rm)
11127         inst.instruction |= Rn << 3;
11128       else
11129         constraint (1, _("dest must overlap one source register"));
11130     }
11131   else
11132     {
11133       constraint (inst.instruction != T_MNEM_mul,
11134                   _("Thumb-2 MUL must not set flags"));
11135       /* 32-bit MUL.  */
11136       inst.instruction = THUMB_OP32 (inst.instruction);
11137       inst.instruction |= Rd << 8;
11138       inst.instruction |= Rn << 16;
11139       inst.instruction |= Rm << 0;
11140
11141       reject_bad_reg (Rd);
11142       reject_bad_reg (Rn);
11143       reject_bad_reg (Rm);
11144     }
11145 }
11146
11147 static void
11148 do_t_mull (void)
11149 {
11150   unsigned RdLo, RdHi, Rn, Rm;
11151
11152   RdLo = inst.operands[0].reg;
11153   RdHi = inst.operands[1].reg;
11154   Rn = inst.operands[2].reg;
11155   Rm = inst.operands[3].reg;
11156
11157   reject_bad_reg (RdLo);
11158   reject_bad_reg (RdHi);
11159   reject_bad_reg (Rn);
11160   reject_bad_reg (Rm);
11161
11162   inst.instruction |= RdLo << 12;
11163   inst.instruction |= RdHi << 8;
11164   inst.instruction |= Rn << 16;
11165   inst.instruction |= Rm;
11166
11167  if (RdLo == RdHi)
11168     as_tsktsk (_("rdhi and rdlo must be different"));
11169 }
11170
11171 static void
11172 do_t_nop (void)
11173 {
11174   set_it_insn_type (NEUTRAL_IT_INSN);
11175
11176   if (unified_syntax)
11177     {
11178       if (inst.size_req == 4 || inst.operands[0].imm > 15)
11179         {
11180           inst.instruction = THUMB_OP32 (inst.instruction);
11181           inst.instruction |= inst.operands[0].imm;
11182         }
11183       else
11184         {
11185           /* PR9722: Check for Thumb2 availability before
11186              generating a thumb2 nop instruction.  */
11187           if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
11188             {
11189               inst.instruction = THUMB_OP16 (inst.instruction);
11190               inst.instruction |= inst.operands[0].imm << 4;
11191             }
11192           else
11193             inst.instruction = 0x46c0;
11194         }
11195     }
11196   else
11197     {
11198       constraint (inst.operands[0].present,
11199                   _("Thumb does not support NOP with hints"));
11200       inst.instruction = 0x46c0;
11201     }
11202 }
11203
11204 static void
11205 do_t_neg (void)
11206 {
11207   if (unified_syntax)
11208     {
11209       bfd_boolean narrow;
11210
11211       if (THUMB_SETS_FLAGS (inst.instruction))
11212         narrow = !in_it_block ();
11213       else
11214         narrow = in_it_block ();
11215       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11216         narrow = FALSE;
11217       if (inst.size_req == 4)
11218         narrow = FALSE;
11219
11220       if (!narrow)
11221         {
11222           inst.instruction = THUMB_OP32 (inst.instruction);
11223           inst.instruction |= inst.operands[0].reg << 8;
11224           inst.instruction |= inst.operands[1].reg << 16;
11225         }
11226       else
11227         {
11228           inst.instruction = THUMB_OP16 (inst.instruction);
11229           inst.instruction |= inst.operands[0].reg;
11230           inst.instruction |= inst.operands[1].reg << 3;
11231         }
11232     }
11233   else
11234     {
11235       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
11236                   BAD_HIREG);
11237       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11238
11239       inst.instruction = THUMB_OP16 (inst.instruction);
11240       inst.instruction |= inst.operands[0].reg;
11241       inst.instruction |= inst.operands[1].reg << 3;
11242     }
11243 }
11244
11245 static void
11246 do_t_orn (void)
11247 {
11248   unsigned Rd, Rn;
11249
11250   Rd = inst.operands[0].reg;
11251   Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
11252
11253   reject_bad_reg (Rd);
11254   /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN.  */
11255   reject_bad_reg (Rn);
11256
11257   inst.instruction |= Rd << 8;
11258   inst.instruction |= Rn << 16;
11259
11260   if (!inst.operands[2].isreg)
11261     {
11262       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11263       inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11264     }
11265   else
11266     {
11267       unsigned Rm;
11268
11269       Rm = inst.operands[2].reg;
11270       reject_bad_reg (Rm);
11271
11272       constraint (inst.operands[2].shifted
11273                   && inst.operands[2].immisreg,
11274                   _("shift must be constant"));
11275       encode_thumb32_shifted_operand (2);
11276     }
11277 }
11278
11279 static void
11280 do_t_pkhbt (void)
11281 {
11282   unsigned Rd, Rn, Rm;
11283
11284   Rd = inst.operands[0].reg;
11285   Rn = inst.operands[1].reg;
11286   Rm = inst.operands[2].reg;
11287
11288   reject_bad_reg (Rd);
11289   reject_bad_reg (Rn);
11290   reject_bad_reg (Rm);
11291
11292   inst.instruction |= Rd << 8;
11293   inst.instruction |= Rn << 16;
11294   inst.instruction |= Rm;
11295   if (inst.operands[3].present)
11296     {
11297       unsigned int val = inst.reloc.exp.X_add_number;
11298       constraint (inst.reloc.exp.X_op != O_constant,
11299                   _("expression too complex"));
11300       inst.instruction |= (val & 0x1c) << 10;
11301       inst.instruction |= (val & 0x03) << 6;
11302     }
11303 }
11304
11305 static void
11306 do_t_pkhtb (void)
11307 {
11308   if (!inst.operands[3].present)
11309     {
11310       unsigned Rtmp;
11311
11312       inst.instruction &= ~0x00000020;
11313
11314       /* PR 10168.  Swap the Rm and Rn registers.  */
11315       Rtmp = inst.operands[1].reg;
11316       inst.operands[1].reg = inst.operands[2].reg;
11317       inst.operands[2].reg = Rtmp;
11318     }
11319   do_t_pkhbt ();
11320 }
11321
11322 static void
11323 do_t_pld (void)
11324 {
11325   if (inst.operands[0].immisreg)
11326     reject_bad_reg (inst.operands[0].imm);
11327
11328   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
11329 }
11330
11331 static void
11332 do_t_push_pop (void)
11333 {
11334   unsigned mask;
11335
11336   constraint (inst.operands[0].writeback,
11337               _("push/pop do not support {reglist}^"));
11338   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11339               _("expression too complex"));
11340
11341   mask = inst.operands[0].imm;
11342   if ((mask & ~0xff) == 0)
11343     inst.instruction = THUMB_OP16 (inst.instruction) | mask;
11344   else if ((inst.instruction == T_MNEM_push
11345             && (mask & ~0xff) == 1 << REG_LR)
11346            || (inst.instruction == T_MNEM_pop
11347                && (mask & ~0xff) == 1 << REG_PC))
11348     {
11349       inst.instruction = THUMB_OP16 (inst.instruction);
11350       inst.instruction |= THUMB_PP_PC_LR;
11351       inst.instruction |= mask & 0xff;
11352     }
11353   else if (unified_syntax)
11354     {
11355       inst.instruction = THUMB_OP32 (inst.instruction);
11356       encode_thumb2_ldmstm (13, mask, TRUE);
11357     }
11358   else
11359     {
11360       inst.error = _("invalid register list to push/pop instruction");
11361       return;
11362     }
11363 }
11364
11365 static void
11366 do_t_rbit (void)
11367 {
11368   unsigned Rd, Rm;
11369
11370   Rd = inst.operands[0].reg;
11371   Rm = inst.operands[1].reg;
11372
11373   reject_bad_reg (Rd);
11374   reject_bad_reg (Rm);
11375
11376   inst.instruction |= Rd << 8;
11377   inst.instruction |= Rm << 16;
11378   inst.instruction |= Rm;
11379 }
11380
11381 static void
11382 do_t_rev (void)
11383 {
11384   unsigned Rd, Rm;
11385
11386   Rd = inst.operands[0].reg;
11387   Rm = inst.operands[1].reg;
11388
11389   reject_bad_reg (Rd);
11390   reject_bad_reg (Rm);
11391
11392   if (Rd <= 7 && Rm <= 7
11393       && inst.size_req != 4)
11394     {
11395       inst.instruction = THUMB_OP16 (inst.instruction);
11396       inst.instruction |= Rd;
11397       inst.instruction |= Rm << 3;
11398     }
11399   else if (unified_syntax)
11400     {
11401       inst.instruction = THUMB_OP32 (inst.instruction);
11402       inst.instruction |= Rd << 8;
11403       inst.instruction |= Rm << 16;
11404       inst.instruction |= Rm;
11405     }
11406   else
11407     inst.error = BAD_HIREG;
11408 }
11409
11410 static void
11411 do_t_rrx (void)
11412 {
11413   unsigned Rd, Rm;
11414
11415   Rd = inst.operands[0].reg;
11416   Rm = inst.operands[1].reg;
11417
11418   reject_bad_reg (Rd);
11419   reject_bad_reg (Rm);
11420
11421   inst.instruction |= Rd << 8;
11422   inst.instruction |= Rm;
11423 }
11424
11425 static void
11426 do_t_rsb (void)
11427 {
11428   unsigned Rd, Rs;
11429
11430   Rd = inst.operands[0].reg;
11431   Rs = (inst.operands[1].present
11432         ? inst.operands[1].reg    /* Rd, Rs, foo */
11433         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
11434
11435   reject_bad_reg (Rd);
11436   reject_bad_reg (Rs);
11437   if (inst.operands[2].isreg)
11438     reject_bad_reg (inst.operands[2].reg);
11439
11440   inst.instruction |= Rd << 8;
11441   inst.instruction |= Rs << 16;
11442   if (!inst.operands[2].isreg)
11443     {
11444       bfd_boolean narrow;
11445
11446       if ((inst.instruction & 0x00100000) != 0)
11447         narrow = !in_it_block ();
11448       else
11449         narrow = in_it_block ();
11450
11451       if (Rd > 7 || Rs > 7)
11452         narrow = FALSE;
11453
11454       if (inst.size_req == 4 || !unified_syntax)
11455         narrow = FALSE;
11456
11457       if (inst.reloc.exp.X_op != O_constant
11458           || inst.reloc.exp.X_add_number != 0)
11459         narrow = FALSE;
11460
11461       /* Turn rsb #0 into 16-bit neg.  We should probably do this via
11462          relaxation, but it doesn't seem worth the hassle.  */
11463       if (narrow)
11464         {
11465           inst.reloc.type = BFD_RELOC_UNUSED;
11466           inst.instruction = THUMB_OP16 (T_MNEM_negs);
11467           inst.instruction |= Rs << 3;
11468           inst.instruction |= Rd;
11469         }
11470       else
11471         {
11472           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11473           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11474         }
11475     }
11476   else
11477     encode_thumb32_shifted_operand (2);
11478 }
11479
11480 static void
11481 do_t_setend (void)
11482 {
11483   set_it_insn_type (OUTSIDE_IT_INSN);
11484   if (inst.operands[0].imm)
11485     inst.instruction |= 0x8;
11486 }
11487
11488 static void
11489 do_t_shift (void)
11490 {
11491   if (!inst.operands[1].present)
11492     inst.operands[1].reg = inst.operands[0].reg;
11493
11494   if (unified_syntax)
11495     {
11496       bfd_boolean narrow;
11497       int shift_kind;
11498
11499       switch (inst.instruction)
11500         {
11501         case T_MNEM_asr:
11502         case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11503         case T_MNEM_lsl:
11504         case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11505         case T_MNEM_lsr:
11506         case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11507         case T_MNEM_ror:
11508         case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11509         default: abort ();
11510         }
11511
11512       if (THUMB_SETS_FLAGS (inst.instruction))
11513         narrow = !in_it_block ();
11514       else
11515         narrow = in_it_block ();
11516       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11517         narrow = FALSE;
11518       if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
11519         narrow = FALSE;
11520       if (inst.operands[2].isreg
11521           && (inst.operands[1].reg != inst.operands[0].reg
11522               || inst.operands[2].reg > 7))
11523         narrow = FALSE;
11524       if (inst.size_req == 4)
11525         narrow = FALSE;
11526
11527       reject_bad_reg (inst.operands[0].reg);
11528       reject_bad_reg (inst.operands[1].reg);
11529
11530       if (!narrow)
11531         {
11532           if (inst.operands[2].isreg)
11533             {
11534               reject_bad_reg (inst.operands[2].reg);
11535               inst.instruction = THUMB_OP32 (inst.instruction);
11536               inst.instruction |= inst.operands[0].reg << 8;
11537               inst.instruction |= inst.operands[1].reg << 16;
11538               inst.instruction |= inst.operands[2].reg;
11539             }
11540           else
11541             {
11542               inst.operands[1].shifted = 1;
11543               inst.operands[1].shift_kind = shift_kind;
11544               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
11545                                              ? T_MNEM_movs : T_MNEM_mov);
11546               inst.instruction |= inst.operands[0].reg << 8;
11547               encode_thumb32_shifted_operand (1);
11548               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
11549               inst.reloc.type = BFD_RELOC_UNUSED;
11550             }
11551         }
11552       else
11553         {
11554           if (inst.operands[2].isreg)
11555             {
11556               switch (shift_kind)
11557                 {
11558                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
11559                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
11560                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
11561                 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
11562                 default: abort ();
11563                 }
11564
11565               inst.instruction |= inst.operands[0].reg;
11566               inst.instruction |= inst.operands[2].reg << 3;
11567             }
11568           else
11569             {
11570               switch (shift_kind)
11571                 {
11572                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11573                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11574                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11575                 default: abort ();
11576                 }
11577               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11578               inst.instruction |= inst.operands[0].reg;
11579               inst.instruction |= inst.operands[1].reg << 3;
11580             }
11581         }
11582     }
11583   else
11584     {
11585       constraint (inst.operands[0].reg > 7
11586                   || inst.operands[1].reg > 7, BAD_HIREG);
11587       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11588
11589       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
11590         {
11591           constraint (inst.operands[2].reg > 7, BAD_HIREG);
11592           constraint (inst.operands[0].reg != inst.operands[1].reg,
11593                       _("source1 and dest must be same register"));
11594
11595           switch (inst.instruction)
11596             {
11597             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
11598             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
11599             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
11600             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
11601             default: abort ();
11602             }
11603
11604           inst.instruction |= inst.operands[0].reg;
11605           inst.instruction |= inst.operands[2].reg << 3;
11606         }
11607       else
11608         {
11609           switch (inst.instruction)
11610             {
11611             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
11612             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
11613             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
11614             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
11615             default: abort ();
11616             }
11617           inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11618           inst.instruction |= inst.operands[0].reg;
11619           inst.instruction |= inst.operands[1].reg << 3;
11620         }
11621     }
11622 }
11623
11624 static void
11625 do_t_simd (void)
11626 {
11627   unsigned Rd, Rn, Rm;
11628
11629   Rd = inst.operands[0].reg;
11630   Rn = inst.operands[1].reg;
11631   Rm = inst.operands[2].reg;
11632
11633   reject_bad_reg (Rd);
11634   reject_bad_reg (Rn);
11635   reject_bad_reg (Rm);
11636
11637   inst.instruction |= Rd << 8;
11638   inst.instruction |= Rn << 16;
11639   inst.instruction |= Rm;
11640 }
11641
11642 static void
11643 do_t_simd2 (void)
11644 {
11645   unsigned Rd, Rn, Rm;
11646
11647   Rd = inst.operands[0].reg;
11648   Rm = inst.operands[1].reg;
11649   Rn = inst.operands[2].reg;
11650
11651   reject_bad_reg (Rd);
11652   reject_bad_reg (Rn);
11653   reject_bad_reg (Rm);
11654
11655   inst.instruction |= Rd << 8;
11656   inst.instruction |= Rn << 16;
11657   inst.instruction |= Rm;
11658 }
11659
11660 static void
11661 do_t_smc (void)
11662 {
11663   unsigned int value = inst.reloc.exp.X_add_number;
11664   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
11665               _("SMC is not permitted on this architecture"));
11666   constraint (inst.reloc.exp.X_op != O_constant,
11667               _("expression too complex"));
11668   inst.reloc.type = BFD_RELOC_UNUSED;
11669   inst.instruction |= (value & 0xf000) >> 12;
11670   inst.instruction |= (value & 0x0ff0);
11671   inst.instruction |= (value & 0x000f) << 16;
11672 }
11673
11674 static void
11675 do_t_hvc (void)
11676 {
11677   unsigned int value = inst.reloc.exp.X_add_number;
11678
11679   inst.reloc.type = BFD_RELOC_UNUSED;
11680   inst.instruction |= (value & 0x0fff);
11681   inst.instruction |= (value & 0xf000) << 4;
11682 }
11683
11684 static void
11685 do_t_ssat_usat (int bias)
11686 {
11687   unsigned Rd, Rn;
11688
11689   Rd = inst.operands[0].reg;
11690   Rn = inst.operands[2].reg;
11691
11692   reject_bad_reg (Rd);
11693   reject_bad_reg (Rn);
11694
11695   inst.instruction |= Rd << 8;
11696   inst.instruction |= inst.operands[1].imm - bias;
11697   inst.instruction |= Rn << 16;
11698
11699   if (inst.operands[3].present)
11700     {
11701       offsetT shift_amount = inst.reloc.exp.X_add_number;
11702
11703       inst.reloc.type = BFD_RELOC_UNUSED;
11704
11705       constraint (inst.reloc.exp.X_op != O_constant,
11706                   _("expression too complex"));
11707
11708       if (shift_amount != 0)
11709         {
11710           constraint (shift_amount > 31,
11711                       _("shift expression is too large"));
11712
11713           if (inst.operands[3].shift_kind == SHIFT_ASR)
11714             inst.instruction |= 0x00200000;  /* sh bit.  */
11715
11716           inst.instruction |= (shift_amount & 0x1c) << 10;
11717           inst.instruction |= (shift_amount & 0x03) << 6;
11718         }
11719     }
11720 }
11721
11722 static void
11723 do_t_ssat (void)
11724 {
11725   do_t_ssat_usat (1);
11726 }
11727
11728 static void
11729 do_t_ssat16 (void)
11730 {
11731   unsigned Rd, Rn;
11732
11733   Rd = inst.operands[0].reg;
11734   Rn = inst.operands[2].reg;
11735
11736   reject_bad_reg (Rd);
11737   reject_bad_reg (Rn);
11738
11739   inst.instruction |= Rd << 8;
11740   inst.instruction |= inst.operands[1].imm - 1;
11741   inst.instruction |= Rn << 16;
11742 }
11743
11744 static void
11745 do_t_strex (void)
11746 {
11747   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
11748               || inst.operands[2].postind || inst.operands[2].writeback
11749               || inst.operands[2].immisreg || inst.operands[2].shifted
11750               || inst.operands[2].negative,
11751               BAD_ADDR_MODE);
11752
11753   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
11754
11755   inst.instruction |= inst.operands[0].reg << 8;
11756   inst.instruction |= inst.operands[1].reg << 12;
11757   inst.instruction |= inst.operands[2].reg << 16;
11758   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
11759 }
11760
11761 static void
11762 do_t_strexd (void)
11763 {
11764   if (!inst.operands[2].present)
11765     inst.operands[2].reg = inst.operands[1].reg + 1;
11766
11767   constraint (inst.operands[0].reg == inst.operands[1].reg
11768               || inst.operands[0].reg == inst.operands[2].reg
11769               || inst.operands[0].reg == inst.operands[3].reg,
11770               BAD_OVERLAP);
11771
11772   inst.instruction |= inst.operands[0].reg;
11773   inst.instruction |= inst.operands[1].reg << 12;
11774   inst.instruction |= inst.operands[2].reg << 8;
11775   inst.instruction |= inst.operands[3].reg << 16;
11776 }
11777
11778 static void
11779 do_t_sxtah (void)
11780 {
11781   unsigned Rd, Rn, Rm;
11782
11783   Rd = inst.operands[0].reg;
11784   Rn = inst.operands[1].reg;
11785   Rm = inst.operands[2].reg;
11786
11787   reject_bad_reg (Rd);
11788   reject_bad_reg (Rn);
11789   reject_bad_reg (Rm);
11790
11791   inst.instruction |= Rd << 8;
11792   inst.instruction |= Rn << 16;
11793   inst.instruction |= Rm;
11794   inst.instruction |= inst.operands[3].imm << 4;
11795 }
11796
11797 static void
11798 do_t_sxth (void)
11799 {
11800   unsigned Rd, Rm;
11801
11802   Rd = inst.operands[0].reg;
11803   Rm = inst.operands[1].reg;
11804
11805   reject_bad_reg (Rd);
11806   reject_bad_reg (Rm);
11807
11808   if (inst.instruction <= 0xffff
11809       && inst.size_req != 4
11810       && Rd <= 7 && Rm <= 7
11811       && (!inst.operands[2].present || inst.operands[2].imm == 0))
11812     {
11813       inst.instruction = THUMB_OP16 (inst.instruction);
11814       inst.instruction |= Rd;
11815       inst.instruction |= Rm << 3;
11816     }
11817   else if (unified_syntax)
11818     {
11819       if (inst.instruction <= 0xffff)
11820         inst.instruction = THUMB_OP32 (inst.instruction);
11821       inst.instruction |= Rd << 8;
11822       inst.instruction |= Rm;
11823       inst.instruction |= inst.operands[2].imm << 4;
11824     }
11825   else
11826     {
11827       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
11828                   _("Thumb encoding does not support rotation"));
11829       constraint (1, BAD_HIREG);
11830     }
11831 }
11832
11833 static void
11834 do_t_swi (void)
11835 {
11836   /* We have to do the following check manually as ARM_EXT_OS only applies
11837      to ARM_EXT_V6M.  */
11838   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6m))
11839     {
11840       if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_os)
11841           /* This only applies to the v6m howver, not later architectures.  */
11842           && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7))
11843         as_bad (_("SVC is not permitted on this architecture"));
11844       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, arm_ext_os);
11845     }
11846
11847   inst.reloc.type = BFD_RELOC_ARM_SWI;
11848 }
11849
11850 static void
11851 do_t_tb (void)
11852 {
11853   unsigned Rn, Rm;
11854   int half;
11855
11856   half = (inst.instruction & 0x10) != 0;
11857   set_it_insn_type_last ();
11858   constraint (inst.operands[0].immisreg,
11859               _("instruction requires register index"));
11860
11861   Rn = inst.operands[0].reg;
11862   Rm = inst.operands[0].imm;
11863
11864   constraint (Rn == REG_SP, BAD_SP);
11865   reject_bad_reg (Rm);
11866
11867   constraint (!half && inst.operands[0].shifted,
11868               _("instruction does not allow shifted index"));
11869   inst.instruction |= (Rn << 16) | Rm;
11870 }
11871
11872 static void
11873 do_t_usat (void)
11874 {
11875   do_t_ssat_usat (0);
11876 }
11877
11878 static void
11879 do_t_usat16 (void)
11880 {
11881   unsigned Rd, Rn;
11882
11883   Rd = inst.operands[0].reg;
11884   Rn = inst.operands[2].reg;
11885
11886   reject_bad_reg (Rd);
11887   reject_bad_reg (Rn);
11888
11889   inst.instruction |= Rd << 8;
11890   inst.instruction |= inst.operands[1].imm;
11891   inst.instruction |= Rn << 16;
11892 }
11893
11894 /* Neon instruction encoder helpers.  */
11895
11896 /* Encodings for the different types for various Neon opcodes.  */
11897
11898 /* An "invalid" code for the following tables.  */
11899 #define N_INV -1u
11900
11901 struct neon_tab_entry
11902 {
11903   unsigned integer;
11904   unsigned float_or_poly;
11905   unsigned scalar_or_imm;
11906 };
11907
11908 /* Map overloaded Neon opcodes to their respective encodings.  */
11909 #define NEON_ENC_TAB                                    \
11910   X(vabd,       0x0000700, 0x1200d00, N_INV),           \
11911   X(vmax,       0x0000600, 0x0000f00, N_INV),           \
11912   X(vmin,       0x0000610, 0x0200f00, N_INV),           \
11913   X(vpadd,      0x0000b10, 0x1000d00, N_INV),           \
11914   X(vpmax,      0x0000a00, 0x1000f00, N_INV),           \
11915   X(vpmin,      0x0000a10, 0x1200f00, N_INV),           \
11916   X(vadd,       0x0000800, 0x0000d00, N_INV),           \
11917   X(vsub,       0x1000800, 0x0200d00, N_INV),           \
11918   X(vceq,       0x1000810, 0x0000e00, 0x1b10100),       \
11919   X(vcge,       0x0000310, 0x1000e00, 0x1b10080),       \
11920   X(vcgt,       0x0000300, 0x1200e00, 0x1b10000),       \
11921   /* Register variants of the following two instructions are encoded as
11922      vcge / vcgt with the operands reversed.  */        \
11923   X(vclt,       0x0000300, 0x1200e00, 0x1b10200),       \
11924   X(vcle,       0x0000310, 0x1000e00, 0x1b10180),       \
11925   X(vfma,       N_INV, 0x0000c10, N_INV),               \
11926   X(vfms,       N_INV, 0x0200c10, N_INV),               \
11927   X(vmla,       0x0000900, 0x0000d10, 0x0800040),       \
11928   X(vmls,       0x1000900, 0x0200d10, 0x0800440),       \
11929   X(vmul,       0x0000910, 0x1000d10, 0x0800840),       \
11930   X(vmull,      0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
11931   X(vmlal,      0x0800800, N_INV,     0x0800240),       \
11932   X(vmlsl,      0x0800a00, N_INV,     0x0800640),       \
11933   X(vqdmlal,    0x0800900, N_INV,     0x0800340),       \
11934   X(vqdmlsl,    0x0800b00, N_INV,     0x0800740),       \
11935   X(vqdmull,    0x0800d00, N_INV,     0x0800b40),       \
11936   X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),       \
11937   X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),       \
11938   X(vshl,       0x0000400, N_INV,     0x0800510),       \
11939   X(vqshl,      0x0000410, N_INV,     0x0800710),       \
11940   X(vand,       0x0000110, N_INV,     0x0800030),       \
11941   X(vbic,       0x0100110, N_INV,     0x0800030),       \
11942   X(veor,       0x1000110, N_INV,     N_INV),           \
11943   X(vorn,       0x0300110, N_INV,     0x0800010),       \
11944   X(vorr,       0x0200110, N_INV,     0x0800010),       \
11945   X(vmvn,       0x1b00580, N_INV,     0x0800030),       \
11946   X(vshll,      0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
11947   X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
11948   X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
11949   X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
11950   X(vst1,       0x0000000, 0x0800000, N_INV),           \
11951   X(vld2,       0x0200100, 0x0a00100, 0x0a00d00),       \
11952   X(vst2,       0x0000100, 0x0800100, N_INV),           \
11953   X(vld3,       0x0200200, 0x0a00200, 0x0a00e00),       \
11954   X(vst3,       0x0000200, 0x0800200, N_INV),           \
11955   X(vld4,       0x0200300, 0x0a00300, 0x0a00f00),       \
11956   X(vst4,       0x0000300, 0x0800300, N_INV),           \
11957   X(vmovn,      0x1b20200, N_INV,     N_INV),           \
11958   X(vtrn,       0x1b20080, N_INV,     N_INV),           \
11959   X(vqmovn,     0x1b20200, N_INV,     N_INV),           \
11960   X(vqmovun,    0x1b20240, N_INV,     N_INV),           \
11961   X(vnmul,      0xe200a40, 0xe200b40, N_INV),           \
11962   X(vnmla,      0xe100a40, 0xe100b40, N_INV),           \
11963   X(vnmls,      0xe100a00, 0xe100b00, N_INV),           \
11964   X(vfnma,      0xe900a40, 0xe900b40, N_INV),           \
11965   X(vfnms,      0xe900a00, 0xe900b00, N_INV),           \
11966   X(vcmp,       0xeb40a40, 0xeb40b40, N_INV),           \
11967   X(vcmpz,      0xeb50a40, 0xeb50b40, N_INV),           \
11968   X(vcmpe,      0xeb40ac0, 0xeb40bc0, N_INV),           \
11969   X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV)
11970
11971 enum neon_opc
11972 {
11973 #define X(OPC,I,F,S) N_MNEM_##OPC
11974 NEON_ENC_TAB
11975 #undef X
11976 };
11977
11978 static const struct neon_tab_entry neon_enc_tab[] =
11979 {
11980 #define X(OPC,I,F,S) { (I), (F), (S) }
11981 NEON_ENC_TAB
11982 #undef X
11983 };
11984
11985 /* Do not use these macros; instead, use NEON_ENCODE defined below.  */
11986 #define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
11987 #define NEON_ENC_ARMREG_(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
11988 #define NEON_ENC_POLY_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11989 #define NEON_ENC_FLOAT_(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11990 #define NEON_ENC_SCALAR_(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11991 #define NEON_ENC_IMMED_(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11992 #define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
11993 #define NEON_ENC_LANE_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
11994 #define NEON_ENC_DUP_(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
11995 #define NEON_ENC_SINGLE_(X) \
11996   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
11997 #define NEON_ENC_DOUBLE_(X) \
11998   ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
11999
12000 #define NEON_ENCODE(type, inst)                                 \
12001   do                                                            \
12002     {                                                           \
12003       inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
12004       inst.is_neon = 1;                                         \
12005     }                                                           \
12006   while (0)
12007
12008 #define check_neon_suffixes                                             \
12009   do                                                                    \
12010     {                                                                   \
12011       if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon)       \
12012         {                                                               \
12013           as_bad (_("invalid neon suffix for non neon instruction"));   \
12014           return;                                                       \
12015         }                                                               \
12016     }                                                                   \
12017   while (0)
12018
12019 /* Define shapes for instruction operands. The following mnemonic characters
12020    are used in this table:
12021
12022      F - VFP S<n> register
12023      D - Neon D<n> register
12024      Q - Neon Q<n> register
12025      I - Immediate
12026      S - Scalar
12027      R - ARM register
12028      L - D<n> register list
12029
12030    This table is used to generate various data:
12031      - enumerations of the form NS_DDR to be used as arguments to
12032        neon_select_shape.
12033      - a table classifying shapes into single, double, quad, mixed.
12034      - a table used to drive neon_select_shape.  */
12035
12036 #define NEON_SHAPE_DEF                  \
12037   X(3, (D, D, D), DOUBLE),              \
12038   X(3, (Q, Q, Q), QUAD),                \
12039   X(3, (D, D, I), DOUBLE),              \
12040   X(3, (Q, Q, I), QUAD),                \
12041   X(3, (D, D, S), DOUBLE),              \
12042   X(3, (Q, Q, S), QUAD),                \
12043   X(2, (D, D), DOUBLE),                 \
12044   X(2, (Q, Q), QUAD),                   \
12045   X(2, (D, S), DOUBLE),                 \
12046   X(2, (Q, S), QUAD),                   \
12047   X(2, (D, R), DOUBLE),                 \
12048   X(2, (Q, R), QUAD),                   \
12049   X(2, (D, I), DOUBLE),                 \
12050   X(2, (Q, I), QUAD),                   \
12051   X(3, (D, L, D), DOUBLE),              \
12052   X(2, (D, Q), MIXED),                  \
12053   X(2, (Q, D), MIXED),                  \
12054   X(3, (D, Q, I), MIXED),               \
12055   X(3, (Q, D, I), MIXED),               \
12056   X(3, (Q, D, D), MIXED),               \
12057   X(3, (D, Q, Q), MIXED),               \
12058   X(3, (Q, Q, D), MIXED),               \
12059   X(3, (Q, D, S), MIXED),               \
12060   X(3, (D, Q, S), MIXED),               \
12061   X(4, (D, D, D, I), DOUBLE),           \
12062   X(4, (Q, Q, Q, I), QUAD),             \
12063   X(2, (F, F), SINGLE),                 \
12064   X(3, (F, F, F), SINGLE),              \
12065   X(2, (F, I), SINGLE),                 \
12066   X(2, (F, D), MIXED),                  \
12067   X(2, (D, F), MIXED),                  \
12068   X(3, (F, F, I), MIXED),               \
12069   X(4, (R, R, F, F), SINGLE),           \
12070   X(4, (F, F, R, R), SINGLE),           \
12071   X(3, (D, R, R), DOUBLE),              \
12072   X(3, (R, R, D), DOUBLE),              \
12073   X(2, (S, R), SINGLE),                 \
12074   X(2, (R, S), SINGLE),                 \
12075   X(2, (F, R), SINGLE),                 \
12076   X(2, (R, F), SINGLE)
12077
12078 #define S2(A,B)         NS_##A##B
12079 #define S3(A,B,C)       NS_##A##B##C
12080 #define S4(A,B,C,D)     NS_##A##B##C##D
12081
12082 #define X(N, L, C) S##N L
12083
12084 enum neon_shape
12085 {
12086   NEON_SHAPE_DEF,
12087   NS_NULL
12088 };
12089
12090 #undef X
12091 #undef S2
12092 #undef S3
12093 #undef S4
12094
12095 enum neon_shape_class
12096 {
12097   SC_SINGLE,
12098   SC_DOUBLE,
12099   SC_QUAD,
12100   SC_MIXED
12101 };
12102
12103 #define X(N, L, C) SC_##C
12104
12105 static enum neon_shape_class neon_shape_class[] =
12106 {
12107   NEON_SHAPE_DEF
12108 };
12109
12110 #undef X
12111
12112 enum neon_shape_el
12113 {
12114   SE_F,
12115   SE_D,
12116   SE_Q,
12117   SE_I,
12118   SE_S,
12119   SE_R,
12120   SE_L
12121 };
12122
12123 /* Register widths of above.  */
12124 static unsigned neon_shape_el_size[] =
12125 {
12126   32,
12127   64,
12128   128,
12129   0,
12130   32,
12131   32,
12132   0
12133 };
12134
12135 struct neon_shape_info
12136 {
12137   unsigned els;
12138   enum neon_shape_el el[NEON_MAX_TYPE_ELS];
12139 };
12140
12141 #define S2(A,B)         { SE_##A, SE_##B }
12142 #define S3(A,B,C)       { SE_##A, SE_##B, SE_##C }
12143 #define S4(A,B,C,D)     { SE_##A, SE_##B, SE_##C, SE_##D }
12144
12145 #define X(N, L, C) { N, S##N L }
12146
12147 static struct neon_shape_info neon_shape_tab[] =
12148 {
12149   NEON_SHAPE_DEF
12150 };
12151
12152 #undef X
12153 #undef S2
12154 #undef S3
12155 #undef S4
12156
12157 /* Bit masks used in type checking given instructions.
12158   'N_EQK' means the type must be the same as (or based on in some way) the key
12159    type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
12160    set, various other bits can be set as well in order to modify the meaning of
12161    the type constraint.  */
12162
12163 enum neon_type_mask
12164 {
12165   N_S8   = 0x0000001,
12166   N_S16  = 0x0000002,
12167   N_S32  = 0x0000004,
12168   N_S64  = 0x0000008,
12169   N_U8   = 0x0000010,
12170   N_U16  = 0x0000020,
12171   N_U32  = 0x0000040,
12172   N_U64  = 0x0000080,
12173   N_I8   = 0x0000100,
12174   N_I16  = 0x0000200,
12175   N_I32  = 0x0000400,
12176   N_I64  = 0x0000800,
12177   N_8    = 0x0001000,
12178   N_16   = 0x0002000,
12179   N_32   = 0x0004000,
12180   N_64   = 0x0008000,
12181   N_P8   = 0x0010000,
12182   N_P16  = 0x0020000,
12183   N_F16  = 0x0040000,
12184   N_F32  = 0x0080000,
12185   N_F64  = 0x0100000,
12186   N_KEY  = 0x1000000, /* Key element (main type specifier).  */
12187   N_EQK  = 0x2000000, /* Given operand has the same type & size as the key.  */
12188   N_VFP  = 0x4000000, /* VFP mode: operand size must match register width.  */
12189   N_DBL  = 0x0000001, /* If N_EQK, this operand is twice the size.  */
12190   N_HLF  = 0x0000002, /* If N_EQK, this operand is half the size.  */
12191   N_SGN  = 0x0000004, /* If N_EQK, this operand is forced to be signed.  */
12192   N_UNS  = 0x0000008, /* If N_EQK, this operand is forced to be unsigned.  */
12193   N_INT  = 0x0000010, /* If N_EQK, this operand is forced to be integer.  */
12194   N_FLT  = 0x0000020, /* If N_EQK, this operand is forced to be float.  */
12195   N_SIZ  = 0x0000040, /* If N_EQK, this operand is forced to be size-only.  */
12196   N_UTYP = 0,
12197   N_MAX_NONSPECIAL = N_F64
12198 };
12199
12200 #define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
12201
12202 #define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
12203 #define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
12204 #define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
12205 #define N_SUF_32   (N_SU_32 | N_F32)
12206 #define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
12207 #define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F32)
12208
12209 /* Pass this as the first type argument to neon_check_type to ignore types
12210    altogether.  */
12211 #define N_IGNORE_TYPE (N_KEY | N_EQK)
12212
12213 /* Select a "shape" for the current instruction (describing register types or
12214    sizes) from a list of alternatives. Return NS_NULL if the current instruction
12215    doesn't fit. For non-polymorphic shapes, checking is usually done as a
12216    function of operand parsing, so this function doesn't need to be called.
12217    Shapes should be listed in order of decreasing length.  */
12218
12219 static enum neon_shape
12220 neon_select_shape (enum neon_shape shape, ...)
12221 {
12222   va_list ap;
12223   enum neon_shape first_shape = shape;
12224
12225   /* Fix missing optional operands. FIXME: we don't know at this point how
12226      many arguments we should have, so this makes the assumption that we have
12227      > 1. This is true of all current Neon opcodes, I think, but may not be
12228      true in the future.  */
12229   if (!inst.operands[1].present)
12230     inst.operands[1] = inst.operands[0];
12231
12232   va_start (ap, shape);
12233
12234   for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
12235     {
12236       unsigned j;
12237       int matches = 1;
12238
12239       for (j = 0; j < neon_shape_tab[shape].els; j++)
12240         {
12241           if (!inst.operands[j].present)
12242             {
12243               matches = 0;
12244               break;
12245             }
12246
12247           switch (neon_shape_tab[shape].el[j])
12248             {
12249             case SE_F:
12250               if (!(inst.operands[j].isreg
12251                     && inst.operands[j].isvec
12252                     && inst.operands[j].issingle
12253                     && !inst.operands[j].isquad))
12254                 matches = 0;
12255               break;
12256
12257             case SE_D:
12258               if (!(inst.operands[j].isreg
12259                     && inst.operands[j].isvec
12260                     && !inst.operands[j].isquad
12261                     && !inst.operands[j].issingle))
12262                 matches = 0;
12263               break;
12264
12265             case SE_R:
12266               if (!(inst.operands[j].isreg
12267                     && !inst.operands[j].isvec))
12268                 matches = 0;
12269               break;
12270
12271             case SE_Q:
12272               if (!(inst.operands[j].isreg
12273                     && inst.operands[j].isvec
12274                     && inst.operands[j].isquad
12275                     && !inst.operands[j].issingle))
12276                 matches = 0;
12277               break;
12278
12279             case SE_I:
12280               if (!(!inst.operands[j].isreg
12281                     && !inst.operands[j].isscalar))
12282                 matches = 0;
12283               break;
12284
12285             case SE_S:
12286               if (!(!inst.operands[j].isreg
12287                     && inst.operands[j].isscalar))
12288                 matches = 0;
12289               break;
12290
12291             case SE_L:
12292               break;
12293             }
12294           if (!matches)
12295             break;
12296         }
12297       if (matches)
12298         break;
12299     }
12300
12301   va_end (ap);
12302
12303   if (shape == NS_NULL && first_shape != NS_NULL)
12304     first_error (_("invalid instruction shape"));
12305
12306   return shape;
12307 }
12308
12309 /* True if SHAPE is predominantly a quadword operation (most of the time, this
12310    means the Q bit should be set).  */
12311
12312 static int
12313 neon_quad (enum neon_shape shape)
12314 {
12315   return neon_shape_class[shape] == SC_QUAD;
12316 }
12317
12318 static void
12319 neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
12320                        unsigned *g_size)
12321 {
12322   /* Allow modification to be made to types which are constrained to be
12323      based on the key element, based on bits set alongside N_EQK.  */
12324   if ((typebits & N_EQK) != 0)
12325     {
12326       if ((typebits & N_HLF) != 0)
12327         *g_size /= 2;
12328       else if ((typebits & N_DBL) != 0)
12329         *g_size *= 2;
12330       if ((typebits & N_SGN) != 0)
12331         *g_type = NT_signed;
12332       else if ((typebits & N_UNS) != 0)
12333         *g_type = NT_unsigned;
12334       else if ((typebits & N_INT) != 0)
12335         *g_type = NT_integer;
12336       else if ((typebits & N_FLT) != 0)
12337         *g_type = NT_float;
12338       else if ((typebits & N_SIZ) != 0)
12339         *g_type = NT_untyped;
12340     }
12341 }
12342
12343 /* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
12344    operand type, i.e. the single type specified in a Neon instruction when it
12345    is the only one given.  */
12346
12347 static struct neon_type_el
12348 neon_type_promote (struct neon_type_el *key, unsigned thisarg)
12349 {
12350   struct neon_type_el dest = *key;
12351
12352   gas_assert ((thisarg & N_EQK) != 0);
12353
12354   neon_modify_type_size (thisarg, &dest.type, &dest.size);
12355
12356   return dest;
12357 }
12358
12359 /* Convert Neon type and size into compact bitmask representation.  */
12360
12361 static enum neon_type_mask
12362 type_chk_of_el_type (enum neon_el_type type, unsigned size)
12363 {
12364   switch (type)
12365     {
12366     case NT_untyped:
12367       switch (size)
12368         {
12369         case 8:  return N_8;
12370         case 16: return N_16;
12371         case 32: return N_32;
12372         case 64: return N_64;
12373         default: ;
12374         }
12375       break;
12376
12377     case NT_integer:
12378       switch (size)
12379         {
12380         case 8:  return N_I8;
12381         case 16: return N_I16;
12382         case 32: return N_I32;
12383         case 64: return N_I64;
12384         default: ;
12385         }
12386       break;
12387
12388     case NT_float:
12389       switch (size)
12390         {
12391         case 16: return N_F16;
12392         case 32: return N_F32;
12393         case 64: return N_F64;
12394         default: ;
12395         }
12396       break;
12397
12398     case NT_poly:
12399       switch (size)
12400         {
12401         case 8:  return N_P8;
12402         case 16: return N_P16;
12403         default: ;
12404         }
12405       break;
12406
12407     case NT_signed:
12408       switch (size)
12409         {
12410         case 8:  return N_S8;
12411         case 16: return N_S16;
12412         case 32: return N_S32;
12413         case 64: return N_S64;
12414         default: ;
12415         }
12416       break;
12417
12418     case NT_unsigned:
12419       switch (size)
12420         {
12421         case 8:  return N_U8;
12422         case 16: return N_U16;
12423         case 32: return N_U32;
12424         case 64: return N_U64;
12425         default: ;
12426         }
12427       break;
12428
12429     default: ;
12430     }
12431
12432   return N_UTYP;
12433 }
12434
12435 /* Convert compact Neon bitmask type representation to a type and size. Only
12436    handles the case where a single bit is set in the mask.  */
12437
12438 static int
12439 el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
12440                      enum neon_type_mask mask)
12441 {
12442   if ((mask & N_EQK) != 0)
12443     return FAIL;
12444
12445   if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
12446     *size = 8;
12447   else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_P16)) != 0)
12448     *size = 16;
12449   else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
12450     *size = 32;
12451   else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64)) != 0)
12452     *size = 64;
12453   else
12454     return FAIL;
12455
12456   if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
12457     *type = NT_signed;
12458   else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
12459     *type = NT_unsigned;
12460   else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
12461     *type = NT_integer;
12462   else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
12463     *type = NT_untyped;
12464   else if ((mask & (N_P8 | N_P16)) != 0)
12465     *type = NT_poly;
12466   else if ((mask & (N_F32 | N_F64)) != 0)
12467     *type = NT_float;
12468   else
12469     return FAIL;
12470
12471   return SUCCESS;
12472 }
12473
12474 /* Modify a bitmask of allowed types. This is only needed for type
12475    relaxation.  */
12476
12477 static unsigned
12478 modify_types_allowed (unsigned allowed, unsigned mods)
12479 {
12480   unsigned size;
12481   enum neon_el_type type;
12482   unsigned destmask;
12483   int i;
12484
12485   destmask = 0;
12486
12487   for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
12488     {
12489       if (el_type_of_type_chk (&type, &size,
12490                                (enum neon_type_mask) (allowed & i)) == SUCCESS)
12491         {
12492           neon_modify_type_size (mods, &type, &size);
12493           destmask |= type_chk_of_el_type (type, size);
12494         }
12495     }
12496
12497   return destmask;
12498 }
12499
12500 /* Check type and return type classification.
12501    The manual states (paraphrase): If one datatype is given, it indicates the
12502    type given in:
12503     - the second operand, if there is one
12504     - the operand, if there is no second operand
12505     - the result, if there are no operands.
12506    This isn't quite good enough though, so we use a concept of a "key" datatype
12507    which is set on a per-instruction basis, which is the one which matters when
12508    only one data type is written.
12509    Note: this function has side-effects (e.g. filling in missing operands). All
12510    Neon instructions should call it before performing bit encoding.  */
12511
12512 static struct neon_type_el
12513 neon_check_type (unsigned els, enum neon_shape ns, ...)
12514 {
12515   va_list ap;
12516   unsigned i, pass, key_el = 0;
12517   unsigned types[NEON_MAX_TYPE_ELS];
12518   enum neon_el_type k_type = NT_invtype;
12519   unsigned k_size = -1u;
12520   struct neon_type_el badtype = {NT_invtype, -1};
12521   unsigned key_allowed = 0;
12522
12523   /* Optional registers in Neon instructions are always (not) in operand 1.
12524      Fill in the missing operand here, if it was omitted.  */
12525   if (els > 1 && !inst.operands[1].present)
12526     inst.operands[1] = inst.operands[0];
12527
12528   /* Suck up all the varargs.  */
12529   va_start (ap, ns);
12530   for (i = 0; i < els; i++)
12531     {
12532       unsigned thisarg = va_arg (ap, unsigned);
12533       if (thisarg == N_IGNORE_TYPE)
12534         {
12535           va_end (ap);
12536           return badtype;
12537         }
12538       types[i] = thisarg;
12539       if ((thisarg & N_KEY) != 0)
12540         key_el = i;
12541     }
12542   va_end (ap);
12543
12544   if (inst.vectype.elems > 0)
12545     for (i = 0; i < els; i++)
12546       if (inst.operands[i].vectype.type != NT_invtype)
12547         {
12548           first_error (_("types specified in both the mnemonic and operands"));
12549           return badtype;
12550         }
12551
12552   /* Duplicate inst.vectype elements here as necessary.
12553      FIXME: No idea if this is exactly the same as the ARM assembler,
12554      particularly when an insn takes one register and one non-register
12555      operand. */
12556   if (inst.vectype.elems == 1 && els > 1)
12557     {
12558       unsigned j;
12559       inst.vectype.elems = els;
12560       inst.vectype.el[key_el] = inst.vectype.el[0];
12561       for (j = 0; j < els; j++)
12562         if (j != key_el)
12563           inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12564                                                   types[j]);
12565     }
12566   else if (inst.vectype.elems == 0 && els > 0)
12567     {
12568       unsigned j;
12569       /* No types were given after the mnemonic, so look for types specified
12570          after each operand. We allow some flexibility here; as long as the
12571          "key" operand has a type, we can infer the others.  */
12572       for (j = 0; j < els; j++)
12573         if (inst.operands[j].vectype.type != NT_invtype)
12574           inst.vectype.el[j] = inst.operands[j].vectype;
12575
12576       if (inst.operands[key_el].vectype.type != NT_invtype)
12577         {
12578           for (j = 0; j < els; j++)
12579             if (inst.operands[j].vectype.type == NT_invtype)
12580               inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12581                                                       types[j]);
12582         }
12583       else
12584         {
12585           first_error (_("operand types can't be inferred"));
12586           return badtype;
12587         }
12588     }
12589   else if (inst.vectype.elems != els)
12590     {
12591       first_error (_("type specifier has the wrong number of parts"));
12592       return badtype;
12593     }
12594
12595   for (pass = 0; pass < 2; pass++)
12596     {
12597       for (i = 0; i < els; i++)
12598         {
12599           unsigned thisarg = types[i];
12600           unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
12601             ? modify_types_allowed (key_allowed, thisarg) : thisarg;
12602           enum neon_el_type g_type = inst.vectype.el[i].type;
12603           unsigned g_size = inst.vectype.el[i].size;
12604
12605           /* Decay more-specific signed & unsigned types to sign-insensitive
12606              integer types if sign-specific variants are unavailable.  */
12607           if ((g_type == NT_signed || g_type == NT_unsigned)
12608               && (types_allowed & N_SU_ALL) == 0)
12609             g_type = NT_integer;
12610
12611           /* If only untyped args are allowed, decay any more specific types to
12612              them. Some instructions only care about signs for some element
12613              sizes, so handle that properly.  */
12614           if ((g_size == 8 && (types_allowed & N_8) != 0)
12615               || (g_size == 16 && (types_allowed & N_16) != 0)
12616               || (g_size == 32 && (types_allowed & N_32) != 0)
12617               || (g_size == 64 && (types_allowed & N_64) != 0))
12618             g_type = NT_untyped;
12619
12620           if (pass == 0)
12621             {
12622               if ((thisarg & N_KEY) != 0)
12623                 {
12624                   k_type = g_type;
12625                   k_size = g_size;
12626                   key_allowed = thisarg & ~N_KEY;
12627                 }
12628             }
12629           else
12630             {
12631               if ((thisarg & N_VFP) != 0)
12632                 {
12633                   enum neon_shape_el regshape;
12634                   unsigned regwidth, match;
12635
12636                   /* PR 11136: Catch the case where we are passed a shape of NS_NULL.  */
12637                   if (ns == NS_NULL)
12638                     {
12639                       first_error (_("invalid instruction shape"));
12640                       return badtype;
12641                     }
12642                   regshape = neon_shape_tab[ns].el[i];
12643                   regwidth = neon_shape_el_size[regshape];
12644
12645                   /* In VFP mode, operands must match register widths. If we
12646                      have a key operand, use its width, else use the width of
12647                      the current operand.  */
12648                   if (k_size != -1u)
12649                     match = k_size;
12650                   else
12651                     match = g_size;
12652
12653                   if (regwidth != match)
12654                     {
12655                       first_error (_("operand size must match register width"));
12656                       return badtype;
12657                     }
12658                 }
12659
12660               if ((thisarg & N_EQK) == 0)
12661                 {
12662                   unsigned given_type = type_chk_of_el_type (g_type, g_size);
12663
12664                   if ((given_type & types_allowed) == 0)
12665                     {
12666                       first_error (_("bad type in Neon instruction"));
12667                       return badtype;
12668                     }
12669                 }
12670               else
12671                 {
12672                   enum neon_el_type mod_k_type = k_type;
12673                   unsigned mod_k_size = k_size;
12674                   neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
12675                   if (g_type != mod_k_type || g_size != mod_k_size)
12676                     {
12677                       first_error (_("inconsistent types in Neon instruction"));
12678                       return badtype;
12679                     }
12680                 }
12681             }
12682         }
12683     }
12684
12685   return inst.vectype.el[key_el];
12686 }
12687
12688 /* Neon-style VFP instruction forwarding.  */
12689
12690 /* Thumb VFP instructions have 0xE in the condition field.  */
12691
12692 static void
12693 do_vfp_cond_or_thumb (void)
12694 {
12695   inst.is_neon = 1;
12696
12697   if (thumb_mode)
12698     inst.instruction |= 0xe0000000;
12699   else
12700     inst.instruction |= inst.cond << 28;
12701 }
12702
12703 /* Look up and encode a simple mnemonic, for use as a helper function for the
12704    Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
12705    etc.  It is assumed that operand parsing has already been done, and that the
12706    operands are in the form expected by the given opcode (this isn't necessarily
12707    the same as the form in which they were parsed, hence some massaging must
12708    take place before this function is called).
12709    Checks current arch version against that in the looked-up opcode.  */
12710
12711 static void
12712 do_vfp_nsyn_opcode (const char *opname)
12713 {
12714   const struct asm_opcode *opcode;
12715
12716   opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
12717
12718   if (!opcode)
12719     abort ();
12720
12721   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
12722                 thumb_mode ? *opcode->tvariant : *opcode->avariant),
12723               _(BAD_FPU));
12724
12725   inst.is_neon = 1;
12726
12727   if (thumb_mode)
12728     {
12729       inst.instruction = opcode->tvalue;
12730       opcode->tencode ();
12731     }
12732   else
12733     {
12734       inst.instruction = (inst.cond << 28) | opcode->avalue;
12735       opcode->aencode ();
12736     }
12737 }
12738
12739 static void
12740 do_vfp_nsyn_add_sub (enum neon_shape rs)
12741 {
12742   int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
12743
12744   if (rs == NS_FFF)
12745     {
12746       if (is_add)
12747         do_vfp_nsyn_opcode ("fadds");
12748       else
12749         do_vfp_nsyn_opcode ("fsubs");
12750     }
12751   else
12752     {
12753       if (is_add)
12754         do_vfp_nsyn_opcode ("faddd");
12755       else
12756         do_vfp_nsyn_opcode ("fsubd");
12757     }
12758 }
12759
12760 /* Check operand types to see if this is a VFP instruction, and if so call
12761    PFN ().  */
12762
12763 static int
12764 try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
12765 {
12766   enum neon_shape rs;
12767   struct neon_type_el et;
12768
12769   switch (args)
12770     {
12771     case 2:
12772       rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12773       et = neon_check_type (2, rs,
12774         N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12775       break;
12776
12777     case 3:
12778       rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12779       et = neon_check_type (3, rs,
12780         N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12781       break;
12782
12783     default:
12784       abort ();
12785     }
12786
12787   if (et.type != NT_invtype)
12788     {
12789       pfn (rs);
12790       return SUCCESS;
12791     }
12792
12793   inst.error = NULL;
12794   return FAIL;
12795 }
12796
12797 static void
12798 do_vfp_nsyn_mla_mls (enum neon_shape rs)
12799 {
12800   int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
12801
12802   if (rs == NS_FFF)
12803     {
12804       if (is_mla)
12805         do_vfp_nsyn_opcode ("fmacs");
12806       else
12807         do_vfp_nsyn_opcode ("fnmacs");
12808     }
12809   else
12810     {
12811       if (is_mla)
12812         do_vfp_nsyn_opcode ("fmacd");
12813       else
12814         do_vfp_nsyn_opcode ("fnmacd");
12815     }
12816 }
12817
12818 static void
12819 do_vfp_nsyn_fma_fms (enum neon_shape rs)
12820 {
12821   int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
12822
12823   if (rs == NS_FFF)
12824     {
12825       if (is_fma)
12826         do_vfp_nsyn_opcode ("ffmas");
12827       else
12828         do_vfp_nsyn_opcode ("ffnmas");
12829     }
12830   else
12831     {
12832       if (is_fma)
12833         do_vfp_nsyn_opcode ("ffmad");
12834       else
12835         do_vfp_nsyn_opcode ("ffnmad");
12836     }
12837 }
12838
12839 static void
12840 do_vfp_nsyn_mul (enum neon_shape rs)
12841 {
12842   if (rs == NS_FFF)
12843     do_vfp_nsyn_opcode ("fmuls");
12844   else
12845     do_vfp_nsyn_opcode ("fmuld");
12846 }
12847
12848 static void
12849 do_vfp_nsyn_abs_neg (enum neon_shape rs)
12850 {
12851   int is_neg = (inst.instruction & 0x80) != 0;
12852   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
12853
12854   if (rs == NS_FF)
12855     {
12856       if (is_neg)
12857         do_vfp_nsyn_opcode ("fnegs");
12858       else
12859         do_vfp_nsyn_opcode ("fabss");
12860     }
12861   else
12862     {
12863       if (is_neg)
12864         do_vfp_nsyn_opcode ("fnegd");
12865       else
12866         do_vfp_nsyn_opcode ("fabsd");
12867     }
12868 }
12869
12870 /* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
12871    insns belong to Neon, and are handled elsewhere.  */
12872
12873 static void
12874 do_vfp_nsyn_ldm_stm (int is_dbmode)
12875 {
12876   int is_ldm = (inst.instruction & (1 << 20)) != 0;
12877   if (is_ldm)
12878     {
12879       if (is_dbmode)
12880         do_vfp_nsyn_opcode ("fldmdbs");
12881       else
12882         do_vfp_nsyn_opcode ("fldmias");
12883     }
12884   else
12885     {
12886       if (is_dbmode)
12887         do_vfp_nsyn_opcode ("fstmdbs");
12888       else
12889         do_vfp_nsyn_opcode ("fstmias");
12890     }
12891 }
12892
12893 static void
12894 do_vfp_nsyn_sqrt (void)
12895 {
12896   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12897   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12898
12899   if (rs == NS_FF)
12900     do_vfp_nsyn_opcode ("fsqrts");
12901   else
12902     do_vfp_nsyn_opcode ("fsqrtd");
12903 }
12904
12905 static void
12906 do_vfp_nsyn_div (void)
12907 {
12908   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12909   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
12910     N_F32 | N_F64 | N_KEY | N_VFP);
12911
12912   if (rs == NS_FFF)
12913     do_vfp_nsyn_opcode ("fdivs");
12914   else
12915     do_vfp_nsyn_opcode ("fdivd");
12916 }
12917
12918 static void
12919 do_vfp_nsyn_nmul (void)
12920 {
12921   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12922   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
12923     N_F32 | N_F64 | N_KEY | N_VFP);
12924
12925   if (rs == NS_FFF)
12926     {
12927       NEON_ENCODE (SINGLE, inst);
12928       do_vfp_sp_dyadic ();
12929     }
12930   else
12931     {
12932       NEON_ENCODE (DOUBLE, inst);
12933       do_vfp_dp_rd_rn_rm ();
12934     }
12935   do_vfp_cond_or_thumb ();
12936 }
12937
12938 static void
12939 do_vfp_nsyn_cmp (void)
12940 {
12941   if (inst.operands[1].isreg)
12942     {
12943       enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12944       neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12945
12946       if (rs == NS_FF)
12947         {
12948           NEON_ENCODE (SINGLE, inst);
12949           do_vfp_sp_monadic ();
12950         }
12951       else
12952         {
12953           NEON_ENCODE (DOUBLE, inst);
12954           do_vfp_dp_rd_rm ();
12955         }
12956     }
12957   else
12958     {
12959       enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
12960       neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
12961
12962       switch (inst.instruction & 0x0fffffff)
12963         {
12964         case N_MNEM_vcmp:
12965           inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
12966           break;
12967         case N_MNEM_vcmpe:
12968           inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
12969           break;
12970         default:
12971           abort ();
12972         }
12973
12974       if (rs == NS_FI)
12975         {
12976           NEON_ENCODE (SINGLE, inst);
12977           do_vfp_sp_compare_z ();
12978         }
12979       else
12980         {
12981           NEON_ENCODE (DOUBLE, inst);
12982           do_vfp_dp_rd ();
12983         }
12984     }
12985   do_vfp_cond_or_thumb ();
12986 }
12987
12988 static void
12989 nsyn_insert_sp (void)
12990 {
12991   inst.operands[1] = inst.operands[0];
12992   memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
12993   inst.operands[0].reg = REG_SP;
12994   inst.operands[0].isreg = 1;
12995   inst.operands[0].writeback = 1;
12996   inst.operands[0].present = 1;
12997 }
12998
12999 static void
13000 do_vfp_nsyn_push (void)
13001 {
13002   nsyn_insert_sp ();
13003   if (inst.operands[1].issingle)
13004     do_vfp_nsyn_opcode ("fstmdbs");
13005   else
13006     do_vfp_nsyn_opcode ("fstmdbd");
13007 }
13008
13009 static void
13010 do_vfp_nsyn_pop (void)
13011 {
13012   nsyn_insert_sp ();
13013   if (inst.operands[1].issingle)
13014     do_vfp_nsyn_opcode ("fldmias");
13015   else
13016     do_vfp_nsyn_opcode ("fldmiad");
13017 }
13018
13019 /* Fix up Neon data-processing instructions, ORing in the correct bits for
13020    ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
13021
13022 static void
13023 neon_dp_fixup (struct arm_it* insn)
13024 {
13025   unsigned int i = insn->instruction;
13026   insn->is_neon = 1;
13027
13028   if (thumb_mode)
13029     {
13030       /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
13031       if (i & (1 << 24))
13032         i |= 1 << 28;
13033
13034       i &= ~(1 << 24);
13035
13036       i |= 0xef000000;
13037     }
13038   else
13039     i |= 0xf2000000;
13040
13041   insn->instruction = i;
13042 }
13043
13044 /* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
13045    (0, 1, 2, 3).  */
13046
13047 static unsigned
13048 neon_logbits (unsigned x)
13049 {
13050   return ffs (x) - 4;
13051 }
13052
13053 #define LOW4(R) ((R) & 0xf)
13054 #define HI1(R) (((R) >> 4) & 1)
13055
13056 /* Encode insns with bit pattern:
13057
13058   |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
13059   |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
13060
13061   SIZE is passed in bits. -1 means size field isn't changed, in case it has a
13062   different meaning for some instruction.  */
13063
13064 static void
13065 neon_three_same (int isquad, int ubit, int size)
13066 {
13067   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13068   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13069   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13070   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13071   inst.instruction |= LOW4 (inst.operands[2].reg);
13072   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13073   inst.instruction |= (isquad != 0) << 6;
13074   inst.instruction |= (ubit != 0) << 24;
13075   if (size != -1)
13076     inst.instruction |= neon_logbits (size) << 20;
13077
13078   neon_dp_fixup (&inst);
13079 }
13080
13081 /* Encode instructions of the form:
13082
13083   |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
13084   |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
13085
13086   Don't write size if SIZE == -1.  */
13087
13088 static void
13089 neon_two_same (int qbit, int ubit, int size)
13090 {
13091   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13092   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13093   inst.instruction |= LOW4 (inst.operands[1].reg);
13094   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13095   inst.instruction |= (qbit != 0) << 6;
13096   inst.instruction |= (ubit != 0) << 24;
13097
13098   if (size != -1)
13099     inst.instruction |= neon_logbits (size) << 18;
13100
13101   neon_dp_fixup (&inst);
13102 }
13103
13104 /* Neon instruction encoders, in approximate order of appearance.  */
13105
13106 static void
13107 do_neon_dyadic_i_su (void)
13108 {
13109   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13110   struct neon_type_el et = neon_check_type (3, rs,
13111     N_EQK, N_EQK, N_SU_32 | N_KEY);
13112   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13113 }
13114
13115 static void
13116 do_neon_dyadic_i64_su (void)
13117 {
13118   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13119   struct neon_type_el et = neon_check_type (3, rs,
13120     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13121   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13122 }
13123
13124 static void
13125 neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
13126                 unsigned immbits)
13127 {
13128   unsigned size = et.size >> 3;
13129   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13130   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13131   inst.instruction |= LOW4 (inst.operands[1].reg);
13132   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13133   inst.instruction |= (isquad != 0) << 6;
13134   inst.instruction |= immbits << 16;
13135   inst.instruction |= (size >> 3) << 7;
13136   inst.instruction |= (size & 0x7) << 19;
13137   if (write_ubit)
13138     inst.instruction |= (uval != 0) << 24;
13139
13140   neon_dp_fixup (&inst);
13141 }
13142
13143 static void
13144 do_neon_shl_imm (void)
13145 {
13146   if (!inst.operands[2].isreg)
13147     {
13148       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13149       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
13150       NEON_ENCODE (IMMED, inst);
13151       neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
13152     }
13153   else
13154     {
13155       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13156       struct neon_type_el et = neon_check_type (3, rs,
13157         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13158       unsigned int tmp;
13159
13160       /* VSHL/VQSHL 3-register variants have syntax such as:
13161            vshl.xx Dd, Dm, Dn
13162          whereas other 3-register operations encoded by neon_three_same have
13163          syntax like:
13164            vadd.xx Dd, Dn, Dm
13165          (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
13166          here.  */
13167       tmp = inst.operands[2].reg;
13168       inst.operands[2].reg = inst.operands[1].reg;
13169       inst.operands[1].reg = tmp;
13170       NEON_ENCODE (INTEGER, inst);
13171       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13172     }
13173 }
13174
13175 static void
13176 do_neon_qshl_imm (void)
13177 {
13178   if (!inst.operands[2].isreg)
13179     {
13180       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13181       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
13182
13183       NEON_ENCODE (IMMED, inst);
13184       neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
13185                       inst.operands[2].imm);
13186     }
13187   else
13188     {
13189       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13190       struct neon_type_el et = neon_check_type (3, rs,
13191         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13192       unsigned int tmp;
13193
13194       /* See note in do_neon_shl_imm.  */
13195       tmp = inst.operands[2].reg;
13196       inst.operands[2].reg = inst.operands[1].reg;
13197       inst.operands[1].reg = tmp;
13198       NEON_ENCODE (INTEGER, inst);
13199       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13200     }
13201 }
13202
13203 static void
13204 do_neon_rshl (void)
13205 {
13206   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13207   struct neon_type_el et = neon_check_type (3, rs,
13208     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13209   unsigned int tmp;
13210
13211   tmp = inst.operands[2].reg;
13212   inst.operands[2].reg = inst.operands[1].reg;
13213   inst.operands[1].reg = tmp;
13214   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13215 }
13216
13217 static int
13218 neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
13219 {
13220   /* Handle .I8 pseudo-instructions.  */
13221   if (size == 8)
13222     {
13223       /* Unfortunately, this will make everything apart from zero out-of-range.
13224          FIXME is this the intended semantics? There doesn't seem much point in
13225          accepting .I8 if so.  */
13226       immediate |= immediate << 8;
13227       size = 16;
13228     }
13229
13230   if (size >= 32)
13231     {
13232       if (immediate == (immediate & 0x000000ff))
13233         {
13234           *immbits = immediate;
13235           return 0x1;
13236         }
13237       else if (immediate == (immediate & 0x0000ff00))
13238         {
13239           *immbits = immediate >> 8;
13240           return 0x3;
13241         }
13242       else if (immediate == (immediate & 0x00ff0000))
13243         {
13244           *immbits = immediate >> 16;
13245           return 0x5;
13246         }
13247       else if (immediate == (immediate & 0xff000000))
13248         {
13249           *immbits = immediate >> 24;
13250           return 0x7;
13251         }
13252       if ((immediate & 0xffff) != (immediate >> 16))
13253         goto bad_immediate;
13254       immediate &= 0xffff;
13255     }
13256
13257   if (immediate == (immediate & 0x000000ff))
13258     {
13259       *immbits = immediate;
13260       return 0x9;
13261     }
13262   else if (immediate == (immediate & 0x0000ff00))
13263     {
13264       *immbits = immediate >> 8;
13265       return 0xb;
13266     }
13267
13268   bad_immediate:
13269   first_error (_("immediate value out of range"));
13270   return FAIL;
13271 }
13272
13273 /* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
13274    A, B, C, D.  */
13275
13276 static int
13277 neon_bits_same_in_bytes (unsigned imm)
13278 {
13279   return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
13280          && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
13281          && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
13282          && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
13283 }
13284
13285 /* For immediate of above form, return 0bABCD.  */
13286
13287 static unsigned
13288 neon_squash_bits (unsigned imm)
13289 {
13290   return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
13291          | ((imm & 0x01000000) >> 21);
13292 }
13293
13294 /* Compress quarter-float representation to 0b...000 abcdefgh.  */
13295
13296 static unsigned
13297 neon_qfloat_bits (unsigned imm)
13298 {
13299   return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
13300 }
13301
13302 /* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
13303    the instruction. *OP is passed as the initial value of the op field, and
13304    may be set to a different value depending on the constant (i.e.
13305    "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
13306    MVN).  If the immediate looks like a repeated pattern then also
13307    try smaller element sizes.  */
13308
13309 static int
13310 neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
13311                          unsigned *immbits, int *op, int size,
13312                          enum neon_el_type type)
13313 {
13314   /* Only permit float immediates (including 0.0/-0.0) if the operand type is
13315      float.  */
13316   if (type == NT_float && !float_p)
13317     return FAIL;
13318
13319   if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
13320     {
13321       if (size != 32 || *op == 1)
13322         return FAIL;
13323       *immbits = neon_qfloat_bits (immlo);
13324       return 0xf;
13325     }
13326
13327   if (size == 64)
13328     {
13329       if (neon_bits_same_in_bytes (immhi)
13330           && neon_bits_same_in_bytes (immlo))
13331         {
13332           if (*op == 1)
13333             return FAIL;
13334           *immbits = (neon_squash_bits (immhi) << 4)
13335                      | neon_squash_bits (immlo);
13336           *op = 1;
13337           return 0xe;
13338         }
13339
13340       if (immhi != immlo)
13341         return FAIL;
13342     }
13343
13344   if (size >= 32)
13345     {
13346       if (immlo == (immlo & 0x000000ff))
13347         {
13348           *immbits = immlo;
13349           return 0x0;
13350         }
13351       else if (immlo == (immlo & 0x0000ff00))
13352         {
13353           *immbits = immlo >> 8;
13354           return 0x2;
13355         }
13356       else if (immlo == (immlo & 0x00ff0000))
13357         {
13358           *immbits = immlo >> 16;
13359           return 0x4;
13360         }
13361       else if (immlo == (immlo & 0xff000000))
13362         {
13363           *immbits = immlo >> 24;
13364           return 0x6;
13365         }
13366       else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
13367         {
13368           *immbits = (immlo >> 8) & 0xff;
13369           return 0xc;
13370         }
13371       else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
13372         {
13373           *immbits = (immlo >> 16) & 0xff;
13374           return 0xd;
13375         }
13376
13377       if ((immlo & 0xffff) != (immlo >> 16))
13378         return FAIL;
13379       immlo &= 0xffff;
13380     }
13381
13382   if (size >= 16)
13383     {
13384       if (immlo == (immlo & 0x000000ff))
13385         {
13386           *immbits = immlo;
13387           return 0x8;
13388         }
13389       else if (immlo == (immlo & 0x0000ff00))
13390         {
13391           *immbits = immlo >> 8;
13392           return 0xa;
13393         }
13394
13395       if ((immlo & 0xff) != (immlo >> 8))
13396         return FAIL;
13397       immlo &= 0xff;
13398     }
13399
13400   if (immlo == (immlo & 0x000000ff))
13401     {
13402       /* Don't allow MVN with 8-bit immediate.  */
13403       if (*op == 1)
13404         return FAIL;
13405       *immbits = immlo;
13406       return 0xe;
13407     }
13408
13409   return FAIL;
13410 }
13411
13412 /* Write immediate bits [7:0] to the following locations:
13413
13414   |28/24|23     19|18 16|15                    4|3     0|
13415   |  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|
13416
13417   This function is used by VMOV/VMVN/VORR/VBIC.  */
13418
13419 static void
13420 neon_write_immbits (unsigned immbits)
13421 {
13422   inst.instruction |= immbits & 0xf;
13423   inst.instruction |= ((immbits >> 4) & 0x7) << 16;
13424   inst.instruction |= ((immbits >> 7) & 0x1) << 24;
13425 }
13426
13427 /* Invert low-order SIZE bits of XHI:XLO.  */
13428
13429 static void
13430 neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
13431 {
13432   unsigned immlo = xlo ? *xlo : 0;
13433   unsigned immhi = xhi ? *xhi : 0;
13434
13435   switch (size)
13436     {
13437     case 8:
13438       immlo = (~immlo) & 0xff;
13439       break;
13440
13441     case 16:
13442       immlo = (~immlo) & 0xffff;
13443       break;
13444
13445     case 64:
13446       immhi = (~immhi) & 0xffffffff;
13447       /* fall through.  */
13448
13449     case 32:
13450       immlo = (~immlo) & 0xffffffff;
13451       break;
13452
13453     default:
13454       abort ();
13455     }
13456
13457   if (xlo)
13458     *xlo = immlo;
13459
13460   if (xhi)
13461     *xhi = immhi;
13462 }
13463
13464 static void
13465 do_neon_logic (void)
13466 {
13467   if (inst.operands[2].present && inst.operands[2].isreg)
13468     {
13469       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13470       neon_check_type (3, rs, N_IGNORE_TYPE);
13471       /* U bit and size field were set as part of the bitmask.  */
13472       NEON_ENCODE (INTEGER, inst);
13473       neon_three_same (neon_quad (rs), 0, -1);
13474     }
13475   else
13476     {
13477       const int three_ops_form = (inst.operands[2].present
13478                                   && !inst.operands[2].isreg);
13479       const int immoperand = (three_ops_form ? 2 : 1);
13480       enum neon_shape rs = (three_ops_form
13481                             ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
13482                             : neon_select_shape (NS_DI, NS_QI, NS_NULL));
13483       struct neon_type_el et = neon_check_type (2, rs,
13484         N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
13485       enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
13486       unsigned immbits;
13487       int cmode;
13488
13489       if (et.type == NT_invtype)
13490         return;
13491
13492       if (three_ops_form)
13493         constraint (inst.operands[0].reg != inst.operands[1].reg,
13494                     _("first and second operands shall be the same register"));
13495
13496       NEON_ENCODE (IMMED, inst);
13497
13498       immbits = inst.operands[immoperand].imm;
13499       if (et.size == 64)
13500         {
13501           /* .i64 is a pseudo-op, so the immediate must be a repeating
13502              pattern.  */
13503           if (immbits != (inst.operands[immoperand].regisimm ?
13504                           inst.operands[immoperand].reg : 0))
13505             {
13506               /* Set immbits to an invalid constant.  */
13507               immbits = 0xdeadbeef;
13508             }
13509         }
13510
13511       switch (opcode)
13512         {
13513         case N_MNEM_vbic:
13514           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13515           break;
13516
13517         case N_MNEM_vorr:
13518           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13519           break;
13520
13521         case N_MNEM_vand:
13522           /* Pseudo-instruction for VBIC.  */
13523           neon_invert_size (&immbits, 0, et.size);
13524           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13525           break;
13526
13527         case N_MNEM_vorn:
13528           /* Pseudo-instruction for VORR.  */
13529           neon_invert_size (&immbits, 0, et.size);
13530           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13531           break;
13532
13533         default:
13534           abort ();
13535         }
13536
13537       if (cmode == FAIL)
13538         return;
13539
13540       inst.instruction |= neon_quad (rs) << 6;
13541       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13542       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13543       inst.instruction |= cmode << 8;
13544       neon_write_immbits (immbits);
13545
13546       neon_dp_fixup (&inst);
13547     }
13548 }
13549
13550 static void
13551 do_neon_bitfield (void)
13552 {
13553   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13554   neon_check_type (3, rs, N_IGNORE_TYPE);
13555   neon_three_same (neon_quad (rs), 0, -1);
13556 }
13557
13558 static void
13559 neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
13560                   unsigned destbits)
13561 {
13562   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13563   struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
13564                                             types | N_KEY);
13565   if (et.type == NT_float)
13566     {
13567       NEON_ENCODE (FLOAT, inst);
13568       neon_three_same (neon_quad (rs), 0, -1);
13569     }
13570   else
13571     {
13572       NEON_ENCODE (INTEGER, inst);
13573       neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
13574     }
13575 }
13576
13577 static void
13578 do_neon_dyadic_if_su (void)
13579 {
13580   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13581 }
13582
13583 static void
13584 do_neon_dyadic_if_su_d (void)
13585 {
13586   /* This version only allow D registers, but that constraint is enforced during
13587      operand parsing so we don't need to do anything extra here.  */
13588   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13589 }
13590
13591 static void
13592 do_neon_dyadic_if_i_d (void)
13593 {
13594   /* The "untyped" case can't happen. Do this to stop the "U" bit being
13595      affected if we specify unsigned args.  */
13596   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13597 }
13598
13599 enum vfp_or_neon_is_neon_bits
13600 {
13601   NEON_CHECK_CC = 1,
13602   NEON_CHECK_ARCH = 2
13603 };
13604
13605 /* Call this function if an instruction which may have belonged to the VFP or
13606    Neon instruction sets, but turned out to be a Neon instruction (due to the
13607    operand types involved, etc.). We have to check and/or fix-up a couple of
13608    things:
13609
13610      - Make sure the user hasn't attempted to make a Neon instruction
13611        conditional.
13612      - Alter the value in the condition code field if necessary.
13613      - Make sure that the arch supports Neon instructions.
13614
13615    Which of these operations take place depends on bits from enum
13616    vfp_or_neon_is_neon_bits.
13617
13618    WARNING: This function has side effects! If NEON_CHECK_CC is used and the
13619    current instruction's condition is COND_ALWAYS, the condition field is
13620    changed to inst.uncond_value. This is necessary because instructions shared
13621    between VFP and Neon may be conditional for the VFP variants only, and the
13622    unconditional Neon version must have, e.g., 0xF in the condition field.  */
13623
13624 static int
13625 vfp_or_neon_is_neon (unsigned check)
13626 {
13627   /* Conditions are always legal in Thumb mode (IT blocks).  */
13628   if (!thumb_mode && (check & NEON_CHECK_CC))
13629     {
13630       if (inst.cond != COND_ALWAYS)
13631         {
13632           first_error (_(BAD_COND));
13633           return FAIL;
13634         }
13635       if (inst.uncond_value != -1)
13636         inst.instruction |= inst.uncond_value << 28;
13637     }
13638
13639   if ((check & NEON_CHECK_ARCH)
13640       && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
13641     {
13642       first_error (_(BAD_FPU));
13643       return FAIL;
13644     }
13645
13646   return SUCCESS;
13647 }
13648
13649 static void
13650 do_neon_addsub_if_i (void)
13651 {
13652   if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
13653     return;
13654
13655   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13656     return;
13657
13658   /* The "untyped" case can't happen. Do this to stop the "U" bit being
13659      affected if we specify unsigned args.  */
13660   neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
13661 }
13662
13663 /* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
13664    result to be:
13665      V<op> A,B     (A is operand 0, B is operand 2)
13666    to mean:
13667      V<op> A,B,A
13668    not:
13669      V<op> A,B,B
13670    so handle that case specially.  */
13671
13672 static void
13673 neon_exchange_operands (void)
13674 {
13675   void *scratch = alloca (sizeof (inst.operands[0]));
13676   if (inst.operands[1].present)
13677     {
13678       /* Swap operands[1] and operands[2].  */
13679       memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
13680       inst.operands[1] = inst.operands[2];
13681       memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
13682     }
13683   else
13684     {
13685       inst.operands[1] = inst.operands[2];
13686       inst.operands[2] = inst.operands[0];
13687     }
13688 }
13689
13690 static void
13691 neon_compare (unsigned regtypes, unsigned immtypes, int invert)
13692 {
13693   if (inst.operands[2].isreg)
13694     {
13695       if (invert)
13696         neon_exchange_operands ();
13697       neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
13698     }
13699   else
13700     {
13701       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13702       struct neon_type_el et = neon_check_type (2, rs,
13703         N_EQK | N_SIZ, immtypes | N_KEY);
13704
13705       NEON_ENCODE (IMMED, inst);
13706       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13707       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13708       inst.instruction |= LOW4 (inst.operands[1].reg);
13709       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13710       inst.instruction |= neon_quad (rs) << 6;
13711       inst.instruction |= (et.type == NT_float) << 10;
13712       inst.instruction |= neon_logbits (et.size) << 18;
13713
13714       neon_dp_fixup (&inst);
13715     }
13716 }
13717
13718 static void
13719 do_neon_cmp (void)
13720 {
13721   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
13722 }
13723
13724 static void
13725 do_neon_cmp_inv (void)
13726 {
13727   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
13728 }
13729
13730 static void
13731 do_neon_ceq (void)
13732 {
13733   neon_compare (N_IF_32, N_IF_32, FALSE);
13734 }
13735
13736 /* For multiply instructions, we have the possibility of 16-bit or 32-bit
13737    scalars, which are encoded in 5 bits, M : Rm.
13738    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
13739    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
13740    index in M.  */
13741
13742 static unsigned
13743 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
13744 {
13745   unsigned regno = NEON_SCALAR_REG (scalar);
13746   unsigned elno = NEON_SCALAR_INDEX (scalar);
13747
13748   switch (elsize)
13749     {
13750     case 16:
13751       if (regno > 7 || elno > 3)
13752         goto bad_scalar;
13753       return regno | (elno << 3);
13754
13755     case 32:
13756       if (regno > 15 || elno > 1)
13757         goto bad_scalar;
13758       return regno | (elno << 4);
13759
13760     default:
13761     bad_scalar:
13762       first_error (_("scalar out of range for multiply instruction"));
13763     }
13764
13765   return 0;
13766 }
13767
13768 /* Encode multiply / multiply-accumulate scalar instructions.  */
13769
13770 static void
13771 neon_mul_mac (struct neon_type_el et, int ubit)
13772 {
13773   unsigned scalar;
13774
13775   /* Give a more helpful error message if we have an invalid type.  */
13776   if (et.type == NT_invtype)
13777     return;
13778
13779   scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
13780   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13781   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13782   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13783   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13784   inst.instruction |= LOW4 (scalar);
13785   inst.instruction |= HI1 (scalar) << 5;
13786   inst.instruction |= (et.type == NT_float) << 8;
13787   inst.instruction |= neon_logbits (et.size) << 20;
13788   inst.instruction |= (ubit != 0) << 24;
13789
13790   neon_dp_fixup (&inst);
13791 }
13792
13793 static void
13794 do_neon_mac_maybe_scalar (void)
13795 {
13796   if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
13797     return;
13798
13799   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13800     return;
13801
13802   if (inst.operands[2].isscalar)
13803     {
13804       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
13805       struct neon_type_el et = neon_check_type (3, rs,
13806         N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
13807       NEON_ENCODE (SCALAR, inst);
13808       neon_mul_mac (et, neon_quad (rs));
13809     }
13810   else
13811     {
13812       /* The "untyped" case can't happen.  Do this to stop the "U" bit being
13813          affected if we specify unsigned args.  */
13814       neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13815     }
13816 }
13817
13818 static void
13819 do_neon_fmac (void)
13820 {
13821   if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
13822     return;
13823
13824   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13825     return;
13826
13827   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13828 }
13829
13830 static void
13831 do_neon_tst (void)
13832 {
13833   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13834   struct neon_type_el et = neon_check_type (3, rs,
13835     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
13836   neon_three_same (neon_quad (rs), 0, et.size);
13837 }
13838
13839 /* VMUL with 3 registers allows the P8 type. The scalar version supports the
13840    same types as the MAC equivalents. The polynomial type for this instruction
13841    is encoded the same as the integer type.  */
13842
13843 static void
13844 do_neon_mul (void)
13845 {
13846   if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
13847     return;
13848
13849   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13850     return;
13851
13852   if (inst.operands[2].isscalar)
13853     do_neon_mac_maybe_scalar ();
13854   else
13855     neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
13856 }
13857
13858 static void
13859 do_neon_qdmulh (void)
13860 {
13861   if (inst.operands[2].isscalar)
13862     {
13863       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
13864       struct neon_type_el et = neon_check_type (3, rs,
13865         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
13866       NEON_ENCODE (SCALAR, inst);
13867       neon_mul_mac (et, neon_quad (rs));
13868     }
13869   else
13870     {
13871       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13872       struct neon_type_el et = neon_check_type (3, rs,
13873         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
13874       NEON_ENCODE (INTEGER, inst);
13875       /* The U bit (rounding) comes from bit mask.  */
13876       neon_three_same (neon_quad (rs), 0, et.size);
13877     }
13878 }
13879
13880 static void
13881 do_neon_fcmp_absolute (void)
13882 {
13883   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13884   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
13885   /* Size field comes from bit mask.  */
13886   neon_three_same (neon_quad (rs), 1, -1);
13887 }
13888
13889 static void
13890 do_neon_fcmp_absolute_inv (void)
13891 {
13892   neon_exchange_operands ();
13893   do_neon_fcmp_absolute ();
13894 }
13895
13896 static void
13897 do_neon_step (void)
13898 {
13899   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13900   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
13901   neon_three_same (neon_quad (rs), 0, -1);
13902 }
13903
13904 static void
13905 do_neon_abs_neg (void)
13906 {
13907   enum neon_shape rs;
13908   struct neon_type_el et;
13909
13910   if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
13911     return;
13912
13913   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13914     return;
13915
13916   rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13917   et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
13918
13919   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13920   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13921   inst.instruction |= LOW4 (inst.operands[1].reg);
13922   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13923   inst.instruction |= neon_quad (rs) << 6;
13924   inst.instruction |= (et.type == NT_float) << 10;
13925   inst.instruction |= neon_logbits (et.size) << 18;
13926
13927   neon_dp_fixup (&inst);
13928 }
13929
13930 static void
13931 do_neon_sli (void)
13932 {
13933   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13934   struct neon_type_el et = neon_check_type (2, rs,
13935     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
13936   int imm = inst.operands[2].imm;
13937   constraint (imm < 0 || (unsigned)imm >= et.size,
13938               _("immediate out of range for insert"));
13939   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
13940 }
13941
13942 static void
13943 do_neon_sri (void)
13944 {
13945   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13946   struct neon_type_el et = neon_check_type (2, rs,
13947     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
13948   int imm = inst.operands[2].imm;
13949   constraint (imm < 1 || (unsigned)imm > et.size,
13950               _("immediate out of range for insert"));
13951   neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
13952 }
13953
13954 static void
13955 do_neon_qshlu_imm (void)
13956 {
13957   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13958   struct neon_type_el et = neon_check_type (2, rs,
13959     N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
13960   int imm = inst.operands[2].imm;
13961   constraint (imm < 0 || (unsigned)imm >= et.size,
13962               _("immediate out of range for shift"));
13963   /* Only encodes the 'U present' variant of the instruction.
13964      In this case, signed types have OP (bit 8) set to 0.
13965      Unsigned types have OP set to 1.  */
13966   inst.instruction |= (et.type == NT_unsigned) << 8;
13967   /* The rest of the bits are the same as other immediate shifts.  */
13968   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
13969 }
13970
13971 static void
13972 do_neon_qmovn (void)
13973 {
13974   struct neon_type_el et = neon_check_type (2, NS_DQ,
13975     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
13976   /* Saturating move where operands can be signed or unsigned, and the
13977      destination has the same signedness.  */
13978   NEON_ENCODE (INTEGER, inst);
13979   if (et.type == NT_unsigned)
13980     inst.instruction |= 0xc0;
13981   else
13982     inst.instruction |= 0x80;
13983   neon_two_same (0, 1, et.size / 2);
13984 }
13985
13986 static void
13987 do_neon_qmovun (void)
13988 {
13989   struct neon_type_el et = neon_check_type (2, NS_DQ,
13990     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
13991   /* Saturating move with unsigned results. Operands must be signed.  */
13992   NEON_ENCODE (INTEGER, inst);
13993   neon_two_same (0, 1, et.size / 2);
13994 }
13995
13996 static void
13997 do_neon_rshift_sat_narrow (void)
13998 {
13999   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14000      or unsigned. If operands are unsigned, results must also be unsigned.  */
14001   struct neon_type_el et = neon_check_type (2, NS_DQI,
14002     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14003   int imm = inst.operands[2].imm;
14004   /* This gets the bounds check, size encoding and immediate bits calculation
14005      right.  */
14006   et.size /= 2;
14007
14008   /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
14009      VQMOVN.I<size> <Dd>, <Qm>.  */
14010   if (imm == 0)
14011     {
14012       inst.operands[2].present = 0;
14013       inst.instruction = N_MNEM_vqmovn;
14014       do_neon_qmovn ();
14015       return;
14016     }
14017
14018   constraint (imm < 1 || (unsigned)imm > et.size,
14019               _("immediate out of range"));
14020   neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
14021 }
14022
14023 static void
14024 do_neon_rshift_sat_narrow_u (void)
14025 {
14026   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14027      or unsigned. If operands are unsigned, results must also be unsigned.  */
14028   struct neon_type_el et = neon_check_type (2, NS_DQI,
14029     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14030   int imm = inst.operands[2].imm;
14031   /* This gets the bounds check, size encoding and immediate bits calculation
14032      right.  */
14033   et.size /= 2;
14034
14035   /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
14036      VQMOVUN.I<size> <Dd>, <Qm>.  */
14037   if (imm == 0)
14038     {
14039       inst.operands[2].present = 0;
14040       inst.instruction = N_MNEM_vqmovun;
14041       do_neon_qmovun ();
14042       return;
14043     }
14044
14045   constraint (imm < 1 || (unsigned)imm > et.size,
14046               _("immediate out of range"));
14047   /* FIXME: The manual is kind of unclear about what value U should have in
14048      VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
14049      must be 1.  */
14050   neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
14051 }
14052
14053 static void
14054 do_neon_movn (void)
14055 {
14056   struct neon_type_el et = neon_check_type (2, NS_DQ,
14057     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14058   NEON_ENCODE (INTEGER, inst);
14059   neon_two_same (0, 1, et.size / 2);
14060 }
14061
14062 static void
14063 do_neon_rshift_narrow (void)
14064 {
14065   struct neon_type_el et = neon_check_type (2, NS_DQI,
14066     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14067   int imm = inst.operands[2].imm;
14068   /* This gets the bounds check, size encoding and immediate bits calculation
14069      right.  */
14070   et.size /= 2;
14071
14072   /* If immediate is zero then we are a pseudo-instruction for
14073      VMOVN.I<size> <Dd>, <Qm>  */
14074   if (imm == 0)
14075     {
14076       inst.operands[2].present = 0;
14077       inst.instruction = N_MNEM_vmovn;
14078       do_neon_movn ();
14079       return;
14080     }
14081
14082   constraint (imm < 1 || (unsigned)imm > et.size,
14083               _("immediate out of range for narrowing operation"));
14084   neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
14085 }
14086
14087 static void
14088 do_neon_shll (void)
14089 {
14090   /* FIXME: Type checking when lengthening.  */
14091   struct neon_type_el et = neon_check_type (2, NS_QDI,
14092     N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
14093   unsigned imm = inst.operands[2].imm;
14094
14095   if (imm == et.size)
14096     {
14097       /* Maximum shift variant.  */
14098       NEON_ENCODE (INTEGER, inst);
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_logbits (et.size) << 18;
14104
14105       neon_dp_fixup (&inst);
14106     }
14107   else
14108     {
14109       /* A more-specific type check for non-max versions.  */
14110       et = neon_check_type (2, NS_QDI,
14111         N_EQK | N_DBL, N_SU_32 | N_KEY);
14112       NEON_ENCODE (IMMED, inst);
14113       neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
14114     }
14115 }
14116
14117 /* Check the various types for the VCVT instruction, and return which version
14118    the current instruction is.  */
14119
14120 static int
14121 neon_cvt_flavour (enum neon_shape rs)
14122 {
14123 #define CVT_VAR(C,X,Y)                                                  \
14124   et = neon_check_type (2, rs, whole_reg | (X), whole_reg | (Y));       \
14125   if (et.type != NT_invtype)                                            \
14126     {                                                                   \
14127       inst.error = NULL;                                                \
14128       return (C);                                                       \
14129     }
14130   struct neon_type_el et;
14131   unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
14132                         || rs == NS_FF) ? N_VFP : 0;
14133   /* The instruction versions which take an immediate take one register
14134      argument, which is extended to the width of the full register. Thus the
14135      "source" and "destination" registers must have the same width.  Hack that
14136      here by making the size equal to the key (wider, in this case) operand.  */
14137   unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
14138
14139   CVT_VAR (0, N_S32, N_F32);
14140   CVT_VAR (1, N_U32, N_F32);
14141   CVT_VAR (2, N_F32, N_S32);
14142   CVT_VAR (3, N_F32, N_U32);
14143   /* Half-precision conversions.  */
14144   CVT_VAR (4, N_F32, N_F16);
14145   CVT_VAR (5, N_F16, N_F32);
14146
14147   whole_reg = N_VFP;
14148
14149   /* VFP instructions.  */
14150   CVT_VAR (6, N_F32, N_F64);
14151   CVT_VAR (7, N_F64, N_F32);
14152   CVT_VAR (8, N_S32, N_F64 | key);
14153   CVT_VAR (9, N_U32, N_F64 | key);
14154   CVT_VAR (10, N_F64 | key, N_S32);
14155   CVT_VAR (11, N_F64 | key, N_U32);
14156   /* VFP instructions with bitshift.  */
14157   CVT_VAR (12, N_F32 | key, N_S16);
14158   CVT_VAR (13, N_F32 | key, N_U16);
14159   CVT_VAR (14, N_F64 | key, N_S16);
14160   CVT_VAR (15, N_F64 | key, N_U16);
14161   CVT_VAR (16, N_S16, N_F32 | key);
14162   CVT_VAR (17, N_U16, N_F32 | key);
14163   CVT_VAR (18, N_S16, N_F64 | key);
14164   CVT_VAR (19, N_U16, N_F64 | key);
14165
14166   return -1;
14167 #undef CVT_VAR
14168 }
14169
14170 /* Neon-syntax VFP conversions.  */
14171
14172 static void
14173 do_vfp_nsyn_cvt (enum neon_shape rs, int flavour)
14174 {
14175   const char *opname = 0;
14176
14177   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
14178     {
14179       /* Conversions with immediate bitshift.  */
14180       const char *enc[] =
14181         {
14182           "ftosls",
14183           "ftouls",
14184           "fsltos",
14185           "fultos",
14186           NULL,
14187           NULL,
14188           NULL,
14189           NULL,
14190           "ftosld",
14191           "ftould",
14192           "fsltod",
14193           "fultod",
14194           "fshtos",
14195           "fuhtos",
14196           "fshtod",
14197           "fuhtod",
14198           "ftoshs",
14199           "ftouhs",
14200           "ftoshd",
14201           "ftouhd"
14202         };
14203
14204       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
14205         {
14206           opname = enc[flavour];
14207           constraint (inst.operands[0].reg != inst.operands[1].reg,
14208                       _("operands 0 and 1 must be the same register"));
14209           inst.operands[1] = inst.operands[2];
14210           memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
14211         }
14212     }
14213   else
14214     {
14215       /* Conversions without bitshift.  */
14216       const char *enc[] =
14217         {
14218           "ftosis",
14219           "ftouis",
14220           "fsitos",
14221           "fuitos",
14222           "NULL",
14223           "NULL",
14224           "fcvtsd",
14225           "fcvtds",
14226           "ftosid",
14227           "ftouid",
14228           "fsitod",
14229           "fuitod"
14230         };
14231
14232       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
14233         opname = enc[flavour];
14234     }
14235
14236   if (opname)
14237     do_vfp_nsyn_opcode (opname);
14238 }
14239
14240 static void
14241 do_vfp_nsyn_cvtz (void)
14242 {
14243   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
14244   int flavour = neon_cvt_flavour (rs);
14245   const char *enc[] =
14246     {
14247       "ftosizs",
14248       "ftouizs",
14249       NULL,
14250       NULL,
14251       NULL,
14252       NULL,
14253       NULL,
14254       NULL,
14255       "ftosizd",
14256       "ftouizd"
14257     };
14258
14259   if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
14260     do_vfp_nsyn_opcode (enc[flavour]);
14261 }
14262
14263 static void
14264 do_neon_cvt_1 (bfd_boolean round_to_zero ATTRIBUTE_UNUSED)
14265 {
14266   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
14267     NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
14268   int flavour = neon_cvt_flavour (rs);
14269
14270   /* PR11109: Handle round-to-zero for VCVT conversions.  */
14271   if (round_to_zero
14272       && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
14273       && (flavour == 0 || flavour == 1 || flavour == 8 || flavour == 9)
14274       && (rs == NS_FD || rs == NS_FF))
14275     {
14276       do_vfp_nsyn_cvtz ();
14277       return;
14278     }
14279
14280   /* VFP rather than Neon conversions.  */
14281   if (flavour >= 6)
14282     {
14283       do_vfp_nsyn_cvt (rs, flavour);
14284       return;
14285     }
14286
14287   switch (rs)
14288     {
14289     case NS_DDI:
14290     case NS_QQI:
14291       {
14292         unsigned immbits;
14293         unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
14294
14295         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14296           return;
14297
14298         /* Fixed-point conversion with #0 immediate is encoded as an
14299            integer conversion.  */
14300         if (inst.operands[2].present && inst.operands[2].imm == 0)
14301           goto int_encode;
14302        immbits = 32 - inst.operands[2].imm;
14303         NEON_ENCODE (IMMED, inst);
14304         if (flavour != -1)
14305           inst.instruction |= enctab[flavour];
14306         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14307         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14308         inst.instruction |= LOW4 (inst.operands[1].reg);
14309         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14310         inst.instruction |= neon_quad (rs) << 6;
14311         inst.instruction |= 1 << 21;
14312         inst.instruction |= immbits << 16;
14313
14314         neon_dp_fixup (&inst);
14315       }
14316       break;
14317
14318     case NS_DD:
14319     case NS_QQ:
14320     int_encode:
14321       {
14322         unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
14323
14324         NEON_ENCODE (INTEGER, inst);
14325
14326         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14327           return;
14328
14329         if (flavour != -1)
14330           inst.instruction |= enctab[flavour];
14331
14332         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14333         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14334         inst.instruction |= LOW4 (inst.operands[1].reg);
14335         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14336         inst.instruction |= neon_quad (rs) << 6;
14337         inst.instruction |= 2 << 18;
14338
14339         neon_dp_fixup (&inst);
14340       }
14341     break;
14342
14343     /* Half-precision conversions for Advanced SIMD -- neon.  */
14344     case NS_QD:
14345     case NS_DQ:
14346
14347       if ((rs == NS_DQ)
14348           && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
14349           {
14350             as_bad (_("operand size must match register width"));
14351             break;
14352           }
14353
14354       if ((rs == NS_QD)
14355           && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
14356           {
14357             as_bad (_("operand size must match register width"));
14358             break;
14359           }
14360
14361       if (rs == NS_DQ)
14362         inst.instruction = 0x3b60600;
14363       else
14364         inst.instruction = 0x3b60700;
14365
14366       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14367       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14368       inst.instruction |= LOW4 (inst.operands[1].reg);
14369       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14370       neon_dp_fixup (&inst);
14371       break;
14372
14373     default:
14374       /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
14375       do_vfp_nsyn_cvt (rs, flavour);
14376     }
14377 }
14378
14379 static void
14380 do_neon_cvtr (void)
14381 {
14382   do_neon_cvt_1 (FALSE);
14383 }
14384
14385 static void
14386 do_neon_cvt (void)
14387 {
14388   do_neon_cvt_1 (TRUE);
14389 }
14390
14391 static void
14392 do_neon_cvtb (void)
14393 {
14394   inst.instruction = 0xeb20a40;
14395
14396   /* The sizes are attached to the mnemonic.  */
14397   if (inst.vectype.el[0].type != NT_invtype
14398       && inst.vectype.el[0].size == 16)
14399     inst.instruction |= 0x00010000;
14400
14401   /* Programmer's syntax: the sizes are attached to the operands.  */
14402   else if (inst.operands[0].vectype.type != NT_invtype
14403            && inst.operands[0].vectype.size == 16)
14404     inst.instruction |= 0x00010000;
14405
14406   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
14407   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
14408   do_vfp_cond_or_thumb ();
14409 }
14410
14411
14412 static void
14413 do_neon_cvtt (void)
14414 {
14415   do_neon_cvtb ();
14416   inst.instruction |= 0x80;
14417 }
14418
14419 static void
14420 neon_move_immediate (void)
14421 {
14422   enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
14423   struct neon_type_el et = neon_check_type (2, rs,
14424     N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
14425   unsigned immlo, immhi = 0, immbits;
14426   int op, cmode, float_p;
14427
14428   constraint (et.type == NT_invtype,
14429               _("operand size must be specified for immediate VMOV"));
14430
14431   /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
14432   op = (inst.instruction & (1 << 5)) != 0;
14433
14434   immlo = inst.operands[1].imm;
14435   if (inst.operands[1].regisimm)
14436     immhi = inst.operands[1].reg;
14437
14438   constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
14439               _("immediate has bits set outside the operand size"));
14440
14441   float_p = inst.operands[1].immisfloat;
14442
14443   if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
14444                                         et.size, et.type)) == FAIL)
14445     {
14446       /* Invert relevant bits only.  */
14447       neon_invert_size (&immlo, &immhi, et.size);
14448       /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
14449          with one or the other; those cases are caught by
14450          neon_cmode_for_move_imm.  */
14451       op = !op;
14452       if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
14453                                             &op, et.size, et.type)) == FAIL)
14454         {
14455           first_error (_("immediate out of range"));
14456           return;
14457         }
14458     }
14459
14460   inst.instruction &= ~(1 << 5);
14461   inst.instruction |= op << 5;
14462
14463   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14464   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14465   inst.instruction |= neon_quad (rs) << 6;
14466   inst.instruction |= cmode << 8;
14467
14468   neon_write_immbits (immbits);
14469 }
14470
14471 static void
14472 do_neon_mvn (void)
14473 {
14474   if (inst.operands[1].isreg)
14475     {
14476       enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14477
14478       NEON_ENCODE (INTEGER, inst);
14479       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14480       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14481       inst.instruction |= LOW4 (inst.operands[1].reg);
14482       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14483       inst.instruction |= neon_quad (rs) << 6;
14484     }
14485   else
14486     {
14487       NEON_ENCODE (IMMED, inst);
14488       neon_move_immediate ();
14489     }
14490
14491   neon_dp_fixup (&inst);
14492 }
14493
14494 /* Encode instructions of form:
14495
14496   |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
14497   |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |  */
14498
14499 static void
14500 neon_mixed_length (struct neon_type_el et, unsigned size)
14501 {
14502   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14503   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14504   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14505   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14506   inst.instruction |= LOW4 (inst.operands[2].reg);
14507   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14508   inst.instruction |= (et.type == NT_unsigned) << 24;
14509   inst.instruction |= neon_logbits (size) << 20;
14510
14511   neon_dp_fixup (&inst);
14512 }
14513
14514 static void
14515 do_neon_dyadic_long (void)
14516 {
14517   /* FIXME: Type checking for lengthening op.  */
14518   struct neon_type_el et = neon_check_type (3, NS_QDD,
14519     N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
14520   neon_mixed_length (et, et.size);
14521 }
14522
14523 static void
14524 do_neon_abal (void)
14525 {
14526   struct neon_type_el et = neon_check_type (3, NS_QDD,
14527     N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
14528   neon_mixed_length (et, et.size);
14529 }
14530
14531 static void
14532 neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
14533 {
14534   if (inst.operands[2].isscalar)
14535     {
14536       struct neon_type_el et = neon_check_type (3, NS_QDS,
14537         N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
14538       NEON_ENCODE (SCALAR, inst);
14539       neon_mul_mac (et, et.type == NT_unsigned);
14540     }
14541   else
14542     {
14543       struct neon_type_el et = neon_check_type (3, NS_QDD,
14544         N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
14545       NEON_ENCODE (INTEGER, inst);
14546       neon_mixed_length (et, et.size);
14547     }
14548 }
14549
14550 static void
14551 do_neon_mac_maybe_scalar_long (void)
14552 {
14553   neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
14554 }
14555
14556 static void
14557 do_neon_dyadic_wide (void)
14558 {
14559   struct neon_type_el et = neon_check_type (3, NS_QQD,
14560     N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
14561   neon_mixed_length (et, et.size);
14562 }
14563
14564 static void
14565 do_neon_dyadic_narrow (void)
14566 {
14567   struct neon_type_el et = neon_check_type (3, NS_QDD,
14568     N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
14569   /* Operand sign is unimportant, and the U bit is part of the opcode,
14570      so force the operand type to integer.  */
14571   et.type = NT_integer;
14572   neon_mixed_length (et, et.size / 2);
14573 }
14574
14575 static void
14576 do_neon_mul_sat_scalar_long (void)
14577 {
14578   neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
14579 }
14580
14581 static void
14582 do_neon_vmull (void)
14583 {
14584   if (inst.operands[2].isscalar)
14585     do_neon_mac_maybe_scalar_long ();
14586   else
14587     {
14588       struct neon_type_el et = neon_check_type (3, NS_QDD,
14589         N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_KEY);
14590       if (et.type == NT_poly)
14591         NEON_ENCODE (POLY, inst);
14592       else
14593         NEON_ENCODE (INTEGER, inst);
14594       /* For polynomial encoding, size field must be 0b00 and the U bit must be
14595          zero. Should be OK as-is.  */
14596       neon_mixed_length (et, et.size);
14597     }
14598 }
14599
14600 static void
14601 do_neon_ext (void)
14602 {
14603   enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
14604   struct neon_type_el et = neon_check_type (3, rs,
14605     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14606   unsigned imm = (inst.operands[3].imm * et.size) / 8;
14607
14608   constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
14609               _("shift out of range"));
14610   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14611   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14612   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14613   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14614   inst.instruction |= LOW4 (inst.operands[2].reg);
14615   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14616   inst.instruction |= neon_quad (rs) << 6;
14617   inst.instruction |= imm << 8;
14618
14619   neon_dp_fixup (&inst);
14620 }
14621
14622 static void
14623 do_neon_rev (void)
14624 {
14625   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14626   struct neon_type_el et = neon_check_type (2, rs,
14627     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14628   unsigned op = (inst.instruction >> 7) & 3;
14629   /* N (width of reversed regions) is encoded as part of the bitmask. We
14630      extract it here to check the elements to be reversed are smaller.
14631      Otherwise we'd get a reserved instruction.  */
14632   unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
14633   gas_assert (elsize != 0);
14634   constraint (et.size >= elsize,
14635               _("elements must be smaller than reversal region"));
14636   neon_two_same (neon_quad (rs), 1, et.size);
14637 }
14638
14639 static void
14640 do_neon_dup (void)
14641 {
14642   if (inst.operands[1].isscalar)
14643     {
14644       enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
14645       struct neon_type_el et = neon_check_type (2, rs,
14646         N_EQK, N_8 | N_16 | N_32 | N_KEY);
14647       unsigned sizebits = et.size >> 3;
14648       unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
14649       int logsize = neon_logbits (et.size);
14650       unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
14651
14652       if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
14653         return;
14654
14655       NEON_ENCODE (SCALAR, inst);
14656       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14657       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14658       inst.instruction |= LOW4 (dm);
14659       inst.instruction |= HI1 (dm) << 5;
14660       inst.instruction |= neon_quad (rs) << 6;
14661       inst.instruction |= x << 17;
14662       inst.instruction |= sizebits << 16;
14663
14664       neon_dp_fixup (&inst);
14665     }
14666   else
14667     {
14668       enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
14669       struct neon_type_el et = neon_check_type (2, rs,
14670         N_8 | N_16 | N_32 | N_KEY, N_EQK);
14671       /* Duplicate ARM register to lanes of vector.  */
14672       NEON_ENCODE (ARMREG, inst);
14673       switch (et.size)
14674         {
14675         case 8:  inst.instruction |= 0x400000; break;
14676         case 16: inst.instruction |= 0x000020; break;
14677         case 32: inst.instruction |= 0x000000; break;
14678         default: break;
14679         }
14680       inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
14681       inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
14682       inst.instruction |= HI1 (inst.operands[0].reg) << 7;
14683       inst.instruction |= neon_quad (rs) << 21;
14684       /* The encoding for this instruction is identical for the ARM and Thumb
14685          variants, except for the condition field.  */
14686       do_vfp_cond_or_thumb ();
14687     }
14688 }
14689
14690 /* VMOV has particularly many variations. It can be one of:
14691      0. VMOV<c><q> <Qd>, <Qm>
14692      1. VMOV<c><q> <Dd>, <Dm>
14693    (Register operations, which are VORR with Rm = Rn.)
14694      2. VMOV<c><q>.<dt> <Qd>, #<imm>
14695      3. VMOV<c><q>.<dt> <Dd>, #<imm>
14696    (Immediate loads.)
14697      4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
14698    (ARM register to scalar.)
14699      5. VMOV<c><q> <Dm>, <Rd>, <Rn>
14700    (Two ARM registers to vector.)
14701      6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
14702    (Scalar to ARM register.)
14703      7. VMOV<c><q> <Rd>, <Rn>, <Dm>
14704    (Vector to two ARM registers.)
14705      8. VMOV.F32 <Sd>, <Sm>
14706      9. VMOV.F64 <Dd>, <Dm>
14707    (VFP register moves.)
14708     10. VMOV.F32 <Sd>, #imm
14709     11. VMOV.F64 <Dd>, #imm
14710    (VFP float immediate load.)
14711     12. VMOV <Rd>, <Sm>
14712    (VFP single to ARM reg.)
14713     13. VMOV <Sd>, <Rm>
14714    (ARM reg to VFP single.)
14715     14. VMOV <Rd>, <Re>, <Sn>, <Sm>
14716    (Two ARM regs to two VFP singles.)
14717     15. VMOV <Sd>, <Se>, <Rn>, <Rm>
14718    (Two VFP singles to two ARM regs.)
14719
14720    These cases can be disambiguated using neon_select_shape, except cases 1/9
14721    and 3/11 which depend on the operand type too.
14722
14723    All the encoded bits are hardcoded by this function.
14724
14725    Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
14726    Cases 5, 7 may be used with VFPv2 and above.
14727
14728    FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
14729    can specify a type where it doesn't make sense to, and is ignored).  */
14730
14731 static void
14732 do_neon_mov (void)
14733 {
14734   enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
14735     NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
14736     NS_NULL);
14737   struct neon_type_el et;
14738   const char *ldconst = 0;
14739
14740   switch (rs)
14741     {
14742     case NS_DD:  /* case 1/9.  */
14743       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14744       /* It is not an error here if no type is given.  */
14745       inst.error = NULL;
14746       if (et.type == NT_float && et.size == 64)
14747         {
14748           do_vfp_nsyn_opcode ("fcpyd");
14749           break;
14750         }
14751       /* fall through.  */
14752
14753     case NS_QQ:  /* case 0/1.  */
14754       {
14755         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14756           return;
14757         /* The architecture manual I have doesn't explicitly state which
14758            value the U bit should have for register->register moves, but
14759            the equivalent VORR instruction has U = 0, so do that.  */
14760         inst.instruction = 0x0200110;
14761         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14762         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14763         inst.instruction |= LOW4 (inst.operands[1].reg);
14764         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14765         inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14766         inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14767         inst.instruction |= neon_quad (rs) << 6;
14768
14769         neon_dp_fixup (&inst);
14770       }
14771       break;
14772
14773     case NS_DI:  /* case 3/11.  */
14774       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14775       inst.error = NULL;
14776       if (et.type == NT_float && et.size == 64)
14777         {
14778           /* case 11 (fconstd).  */
14779           ldconst = "fconstd";
14780           goto encode_fconstd;
14781         }
14782       /* fall through.  */
14783
14784     case NS_QI:  /* case 2/3.  */
14785       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14786         return;
14787       inst.instruction = 0x0800010;
14788       neon_move_immediate ();
14789       neon_dp_fixup (&inst);
14790       break;
14791
14792     case NS_SR:  /* case 4.  */
14793       {
14794         unsigned bcdebits = 0;
14795         int logsize;
14796         unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
14797         unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
14798
14799         et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
14800         logsize = neon_logbits (et.size);
14801
14802         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
14803                     _(BAD_FPU));
14804         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
14805                     && et.size != 32, _(BAD_FPU));
14806         constraint (et.type == NT_invtype, _("bad type for scalar"));
14807         constraint (x >= 64 / et.size, _("scalar index out of range"));
14808
14809         switch (et.size)
14810           {
14811           case 8:  bcdebits = 0x8; break;
14812           case 16: bcdebits = 0x1; break;
14813           case 32: bcdebits = 0x0; break;
14814           default: ;
14815           }
14816
14817         bcdebits |= x << logsize;
14818
14819         inst.instruction = 0xe000b10;
14820         do_vfp_cond_or_thumb ();
14821         inst.instruction |= LOW4 (dn) << 16;
14822         inst.instruction |= HI1 (dn) << 7;
14823         inst.instruction |= inst.operands[1].reg << 12;
14824         inst.instruction |= (bcdebits & 3) << 5;
14825         inst.instruction |= (bcdebits >> 2) << 21;
14826       }
14827       break;
14828
14829     case NS_DRR:  /* case 5 (fmdrr).  */
14830       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
14831                   _(BAD_FPU));
14832
14833       inst.instruction = 0xc400b10;
14834       do_vfp_cond_or_thumb ();
14835       inst.instruction |= LOW4 (inst.operands[0].reg);
14836       inst.instruction |= HI1 (inst.operands[0].reg) << 5;
14837       inst.instruction |= inst.operands[1].reg << 12;
14838       inst.instruction |= inst.operands[2].reg << 16;
14839       break;
14840
14841     case NS_RS:  /* case 6.  */
14842       {
14843         unsigned logsize;
14844         unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
14845         unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
14846         unsigned abcdebits = 0;
14847
14848         et = neon_check_type (2, NS_NULL,
14849                               N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
14850         logsize = neon_logbits (et.size);
14851
14852         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
14853                     _(BAD_FPU));
14854         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
14855                     && et.size != 32, _(BAD_FPU));
14856         constraint (et.type == NT_invtype, _("bad type for scalar"));
14857         constraint (x >= 64 / et.size, _("scalar index out of range"));
14858
14859         switch (et.size)
14860           {
14861           case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
14862           case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
14863           case 32: abcdebits = 0x00; break;
14864           default: ;
14865           }
14866
14867         abcdebits |= x << logsize;
14868         inst.instruction = 0xe100b10;
14869         do_vfp_cond_or_thumb ();
14870         inst.instruction |= LOW4 (dn) << 16;
14871         inst.instruction |= HI1 (dn) << 7;
14872         inst.instruction |= inst.operands[0].reg << 12;
14873         inst.instruction |= (abcdebits & 3) << 5;
14874         inst.instruction |= (abcdebits >> 2) << 21;
14875       }
14876       break;
14877
14878     case NS_RRD:  /* case 7 (fmrrd).  */
14879       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
14880                   _(BAD_FPU));
14881
14882       inst.instruction = 0xc500b10;
14883       do_vfp_cond_or_thumb ();
14884       inst.instruction |= inst.operands[0].reg << 12;
14885       inst.instruction |= inst.operands[1].reg << 16;
14886       inst.instruction |= LOW4 (inst.operands[2].reg);
14887       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14888       break;
14889
14890     case NS_FF:  /* case 8 (fcpys).  */
14891       do_vfp_nsyn_opcode ("fcpys");
14892       break;
14893
14894     case NS_FI:  /* case 10 (fconsts).  */
14895       ldconst = "fconsts";
14896       encode_fconstd:
14897       if (is_quarter_float (inst.operands[1].imm))
14898         {
14899           inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
14900           do_vfp_nsyn_opcode (ldconst);
14901         }
14902       else
14903         first_error (_("immediate out of range"));
14904       break;
14905
14906     case NS_RF:  /* case 12 (fmrs).  */
14907       do_vfp_nsyn_opcode ("fmrs");
14908       break;
14909
14910     case NS_FR:  /* case 13 (fmsr).  */
14911       do_vfp_nsyn_opcode ("fmsr");
14912       break;
14913
14914     /* The encoders for the fmrrs and fmsrr instructions expect three operands
14915        (one of which is a list), but we have parsed four.  Do some fiddling to
14916        make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
14917        expect.  */
14918     case NS_RRFF:  /* case 14 (fmrrs).  */
14919       constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
14920                   _("VFP registers must be adjacent"));
14921       inst.operands[2].imm = 2;
14922       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
14923       do_vfp_nsyn_opcode ("fmrrs");
14924       break;
14925
14926     case NS_FFRR:  /* case 15 (fmsrr).  */
14927       constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
14928                   _("VFP registers must be adjacent"));
14929       inst.operands[1] = inst.operands[2];
14930       inst.operands[2] = inst.operands[3];
14931       inst.operands[0].imm = 2;
14932       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
14933       do_vfp_nsyn_opcode ("fmsrr");
14934       break;
14935
14936     default:
14937       abort ();
14938     }
14939 }
14940
14941 static void
14942 do_neon_rshift_round_imm (void)
14943 {
14944   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14945   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
14946   int imm = inst.operands[2].imm;
14947
14948   /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
14949   if (imm == 0)
14950     {
14951       inst.operands[2].present = 0;
14952       do_neon_mov ();
14953       return;
14954     }
14955
14956   constraint (imm < 1 || (unsigned)imm > et.size,
14957               _("immediate out of range for shift"));
14958   neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
14959                   et.size - imm);
14960 }
14961
14962 static void
14963 do_neon_movl (void)
14964 {
14965   struct neon_type_el et = neon_check_type (2, NS_QD,
14966     N_EQK | N_DBL, N_SU_32 | N_KEY);
14967   unsigned sizebits = et.size >> 3;
14968   inst.instruction |= sizebits << 19;
14969   neon_two_same (0, et.type == NT_unsigned, -1);
14970 }
14971
14972 static void
14973 do_neon_trn (void)
14974 {
14975   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14976   struct neon_type_el et = neon_check_type (2, rs,
14977     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14978   NEON_ENCODE (INTEGER, inst);
14979   neon_two_same (neon_quad (rs), 1, et.size);
14980 }
14981
14982 static void
14983 do_neon_zip_uzp (void)
14984 {
14985   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14986   struct neon_type_el et = neon_check_type (2, rs,
14987     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14988   if (rs == NS_DD && et.size == 32)
14989     {
14990       /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
14991       inst.instruction = N_MNEM_vtrn;
14992       do_neon_trn ();
14993       return;
14994     }
14995   neon_two_same (neon_quad (rs), 1, et.size);
14996 }
14997
14998 static void
14999 do_neon_sat_abs_neg (void)
15000 {
15001   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15002   struct neon_type_el et = neon_check_type (2, rs,
15003     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15004   neon_two_same (neon_quad (rs), 1, et.size);
15005 }
15006
15007 static void
15008 do_neon_pair_long (void)
15009 {
15010   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15011   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
15012   /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
15013   inst.instruction |= (et.type == NT_unsigned) << 7;
15014   neon_two_same (neon_quad (rs), 1, et.size);
15015 }
15016
15017 static void
15018 do_neon_recip_est (void)
15019 {
15020   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15021   struct neon_type_el et = neon_check_type (2, rs,
15022     N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
15023   inst.instruction |= (et.type == NT_float) << 8;
15024   neon_two_same (neon_quad (rs), 1, et.size);
15025 }
15026
15027 static void
15028 do_neon_cls (void)
15029 {
15030   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15031   struct neon_type_el et = neon_check_type (2, rs,
15032     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15033   neon_two_same (neon_quad (rs), 1, et.size);
15034 }
15035
15036 static void
15037 do_neon_clz (void)
15038 {
15039   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15040   struct neon_type_el et = neon_check_type (2, rs,
15041     N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
15042   neon_two_same (neon_quad (rs), 1, et.size);
15043 }
15044
15045 static void
15046 do_neon_cnt (void)
15047 {
15048   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15049   struct neon_type_el et = neon_check_type (2, rs,
15050     N_EQK | N_INT, N_8 | N_KEY);
15051   neon_two_same (neon_quad (rs), 1, et.size);
15052 }
15053
15054 static void
15055 do_neon_swp (void)
15056 {
15057   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15058   neon_two_same (neon_quad (rs), 1, -1);
15059 }
15060
15061 static void
15062 do_neon_tbl_tbx (void)
15063 {
15064   unsigned listlenbits;
15065   neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
15066
15067   if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
15068     {
15069       first_error (_("bad list length for table lookup"));
15070       return;
15071     }
15072
15073   listlenbits = inst.operands[1].imm - 1;
15074   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15075   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15076   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15077   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15078   inst.instruction |= LOW4 (inst.operands[2].reg);
15079   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15080   inst.instruction |= listlenbits << 8;
15081
15082   neon_dp_fixup (&inst);
15083 }
15084
15085 static void
15086 do_neon_ldm_stm (void)
15087 {
15088   /* P, U and L bits are part of bitmask.  */
15089   int is_dbmode = (inst.instruction & (1 << 24)) != 0;
15090   unsigned offsetbits = inst.operands[1].imm * 2;
15091
15092   if (inst.operands[1].issingle)
15093     {
15094       do_vfp_nsyn_ldm_stm (is_dbmode);
15095       return;
15096     }
15097
15098   constraint (is_dbmode && !inst.operands[0].writeback,
15099               _("writeback (!) must be used for VLDMDB and VSTMDB"));
15100
15101   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
15102               _("register list must contain at least 1 and at most 16 "
15103                 "registers"));
15104
15105   inst.instruction |= inst.operands[0].reg << 16;
15106   inst.instruction |= inst.operands[0].writeback << 21;
15107   inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15108   inst.instruction |= HI1 (inst.operands[1].reg) << 22;
15109
15110   inst.instruction |= offsetbits;
15111
15112   do_vfp_cond_or_thumb ();
15113 }
15114
15115 static void
15116 do_neon_ldr_str (void)
15117 {
15118   int is_ldr = (inst.instruction & (1 << 20)) != 0;
15119
15120   /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
15121      And is UNPREDICTABLE in thumb mode.  */
15122   if (!is_ldr 
15123       && inst.operands[1].reg == REG_PC
15124       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
15125     {
15126       if (!thumb_mode && warn_on_deprecated)
15127         as_warn (_("Use of PC here is deprecated"));
15128       else
15129         inst.error = _("Use of PC here is UNPREDICTABLE");
15130     }
15131
15132   if (inst.operands[0].issingle)
15133     {
15134       if (is_ldr)
15135         do_vfp_nsyn_opcode ("flds");
15136       else
15137         do_vfp_nsyn_opcode ("fsts");
15138     }
15139   else
15140     {
15141       if (is_ldr)
15142         do_vfp_nsyn_opcode ("fldd");
15143       else
15144         do_vfp_nsyn_opcode ("fstd");
15145     }
15146 }
15147
15148 /* "interleave" version also handles non-interleaving register VLD1/VST1
15149    instructions.  */
15150
15151 static void
15152 do_neon_ld_st_interleave (void)
15153 {
15154   struct neon_type_el et = neon_check_type (1, NS_NULL,
15155                                             N_8 | N_16 | N_32 | N_64);
15156   unsigned alignbits = 0;
15157   unsigned idx;
15158   /* The bits in this table go:
15159      0: register stride of one (0) or two (1)
15160      1,2: register list length, minus one (1, 2, 3, 4).
15161      3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
15162      We use -1 for invalid entries.  */
15163   const int typetable[] =
15164     {
15165       0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
15166        -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
15167        -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
15168        -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
15169     };
15170   int typebits;
15171
15172   if (et.type == NT_invtype)
15173     return;
15174
15175   if (inst.operands[1].immisalign)
15176     switch (inst.operands[1].imm >> 8)
15177       {
15178       case 64: alignbits = 1; break;
15179       case 128:
15180         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
15181             && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15182           goto bad_alignment;
15183         alignbits = 2;
15184         break;
15185       case 256:
15186         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15187           goto bad_alignment;
15188         alignbits = 3;
15189         break;
15190       default:
15191       bad_alignment:
15192         first_error (_("bad alignment"));
15193         return;
15194       }
15195
15196   inst.instruction |= alignbits << 4;
15197   inst.instruction |= neon_logbits (et.size) << 6;
15198
15199   /* Bits [4:6] of the immediate in a list specifier encode register stride
15200      (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
15201      VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
15202      up the right value for "type" in a table based on this value and the given
15203      list style, then stick it back.  */
15204   idx = ((inst.operands[0].imm >> 4) & 7)
15205         | (((inst.instruction >> 8) & 3) << 3);
15206
15207   typebits = typetable[idx];
15208
15209   constraint (typebits == -1, _("bad list type for instruction"));
15210
15211   inst.instruction &= ~0xf00;
15212   inst.instruction |= typebits << 8;
15213 }
15214
15215 /* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
15216    *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
15217    otherwise. The variable arguments are a list of pairs of legal (size, align)
15218    values, terminated with -1.  */
15219
15220 static int
15221 neon_alignment_bit (int size, int align, int *do_align, ...)
15222 {
15223   va_list ap;
15224   int result = FAIL, thissize, thisalign;
15225
15226   if (!inst.operands[1].immisalign)
15227     {
15228       *do_align = 0;
15229       return SUCCESS;
15230     }
15231
15232   va_start (ap, do_align);
15233
15234   do
15235     {
15236       thissize = va_arg (ap, int);
15237       if (thissize == -1)
15238         break;
15239       thisalign = va_arg (ap, int);
15240
15241       if (size == thissize && align == thisalign)
15242         result = SUCCESS;
15243     }
15244   while (result != SUCCESS);
15245
15246   va_end (ap);
15247
15248   if (result == SUCCESS)
15249     *do_align = 1;
15250   else
15251     first_error (_("unsupported alignment for instruction"));
15252
15253   return result;
15254 }
15255
15256 static void
15257 do_neon_ld_st_lane (void)
15258 {
15259   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15260   int align_good, do_align = 0;
15261   int logsize = neon_logbits (et.size);
15262   int align = inst.operands[1].imm >> 8;
15263   int n = (inst.instruction >> 8) & 3;
15264   int max_el = 64 / et.size;
15265
15266   if (et.type == NT_invtype)
15267     return;
15268
15269   constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
15270               _("bad list length"));
15271   constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
15272               _("scalar index out of range"));
15273   constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
15274               && et.size == 8,
15275               _("stride of 2 unavailable when element size is 8"));
15276
15277   switch (n)
15278     {
15279     case 0:  /* VLD1 / VST1.  */
15280       align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
15281                                        32, 32, -1);
15282       if (align_good == FAIL)
15283         return;
15284       if (do_align)
15285         {
15286           unsigned alignbits = 0;
15287           switch (et.size)
15288             {
15289             case 16: alignbits = 0x1; break;
15290             case 32: alignbits = 0x3; break;
15291             default: ;
15292             }
15293           inst.instruction |= alignbits << 4;
15294         }
15295       break;
15296
15297     case 1:  /* VLD2 / VST2.  */
15298       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
15299                                        32, 64, -1);
15300       if (align_good == FAIL)
15301         return;
15302       if (do_align)
15303         inst.instruction |= 1 << 4;
15304       break;
15305
15306     case 2:  /* VLD3 / VST3.  */
15307       constraint (inst.operands[1].immisalign,
15308                   _("can't use alignment with this instruction"));
15309       break;
15310
15311     case 3:  /* VLD4 / VST4.  */
15312       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15313                                        16, 64, 32, 64, 32, 128, -1);
15314       if (align_good == FAIL)
15315         return;
15316       if (do_align)
15317         {
15318           unsigned alignbits = 0;
15319           switch (et.size)
15320             {
15321             case 8:  alignbits = 0x1; break;
15322             case 16: alignbits = 0x1; break;
15323             case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
15324             default: ;
15325             }
15326           inst.instruction |= alignbits << 4;
15327         }
15328       break;
15329
15330     default: ;
15331     }
15332
15333   /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
15334   if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15335     inst.instruction |= 1 << (4 + logsize);
15336
15337   inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
15338   inst.instruction |= logsize << 10;
15339 }
15340
15341 /* Encode single n-element structure to all lanes VLD<n> instructions.  */
15342
15343 static void
15344 do_neon_ld_dup (void)
15345 {
15346   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15347   int align_good, do_align = 0;
15348
15349   if (et.type == NT_invtype)
15350     return;
15351
15352   switch ((inst.instruction >> 8) & 3)
15353     {
15354     case 0:  /* VLD1.  */
15355       gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
15356       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15357                                        &do_align, 16, 16, 32, 32, -1);
15358       if (align_good == FAIL)
15359         return;
15360       switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
15361         {
15362         case 1: break;
15363         case 2: inst.instruction |= 1 << 5; break;
15364         default: first_error (_("bad list length")); return;
15365         }
15366       inst.instruction |= neon_logbits (et.size) << 6;
15367       break;
15368
15369     case 1:  /* VLD2.  */
15370       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15371                                        &do_align, 8, 16, 16, 32, 32, 64, -1);
15372       if (align_good == FAIL)
15373         return;
15374       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
15375                   _("bad list length"));
15376       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15377         inst.instruction |= 1 << 5;
15378       inst.instruction |= neon_logbits (et.size) << 6;
15379       break;
15380
15381     case 2:  /* VLD3.  */
15382       constraint (inst.operands[1].immisalign,
15383                   _("can't use alignment with this instruction"));
15384       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
15385                   _("bad list length"));
15386       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15387         inst.instruction |= 1 << 5;
15388       inst.instruction |= neon_logbits (et.size) << 6;
15389       break;
15390
15391     case 3:  /* VLD4.  */
15392       {
15393         int align = inst.operands[1].imm >> 8;
15394         align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15395                                          16, 64, 32, 64, 32, 128, -1);
15396         if (align_good == FAIL)
15397           return;
15398         constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
15399                     _("bad list length"));
15400         if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15401           inst.instruction |= 1 << 5;
15402         if (et.size == 32 && align == 128)
15403           inst.instruction |= 0x3 << 6;
15404         else
15405           inst.instruction |= neon_logbits (et.size) << 6;
15406       }
15407       break;
15408
15409     default: ;
15410     }
15411
15412   inst.instruction |= do_align << 4;
15413 }
15414
15415 /* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
15416    apart from bits [11:4].  */
15417
15418 static void
15419 do_neon_ldx_stx (void)
15420 {
15421   if (inst.operands[1].isreg)
15422     constraint (inst.operands[1].reg == REG_PC, BAD_PC);
15423
15424   switch (NEON_LANE (inst.operands[0].imm))
15425     {
15426     case NEON_INTERLEAVE_LANES:
15427       NEON_ENCODE (INTERLV, inst);
15428       do_neon_ld_st_interleave ();
15429       break;
15430
15431     case NEON_ALL_LANES:
15432       NEON_ENCODE (DUP, inst);
15433       do_neon_ld_dup ();
15434       break;
15435
15436     default:
15437       NEON_ENCODE (LANE, inst);
15438       do_neon_ld_st_lane ();
15439     }
15440
15441   /* L bit comes from bit mask.  */
15442   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15443   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15444   inst.instruction |= inst.operands[1].reg << 16;
15445
15446   if (inst.operands[1].postind)
15447     {
15448       int postreg = inst.operands[1].imm & 0xf;
15449       constraint (!inst.operands[1].immisreg,
15450                   _("post-index must be a register"));
15451       constraint (postreg == 0xd || postreg == 0xf,
15452                   _("bad register for post-index"));
15453       inst.instruction |= postreg;
15454     }
15455   else if (inst.operands[1].writeback)
15456     {
15457       inst.instruction |= 0xd;
15458     }
15459   else
15460     inst.instruction |= 0xf;
15461
15462   if (thumb_mode)
15463     inst.instruction |= 0xf9000000;
15464   else
15465     inst.instruction |= 0xf4000000;
15466 }
15467 \f
15468 /* Overall per-instruction processing.  */
15469
15470 /* We need to be able to fix up arbitrary expressions in some statements.
15471    This is so that we can handle symbols that are an arbitrary distance from
15472    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
15473    which returns part of an address in a form which will be valid for
15474    a data instruction.  We do this by pushing the expression into a symbol
15475    in the expr_section, and creating a fix for that.  */
15476
15477 static void
15478 fix_new_arm (fragS *       frag,
15479              int           where,
15480              short int     size,
15481              expressionS * exp,
15482              int           pc_rel,
15483              int           reloc)
15484 {
15485   fixS *           new_fix;
15486
15487   switch (exp->X_op)
15488     {
15489     case O_constant:
15490       if (pc_rel)
15491         {
15492           /* Create an absolute valued symbol, so we have something to
15493              refer to in the object file.  Unfortunately for us, gas's
15494              generic expression parsing will already have folded out
15495              any use of .set foo/.type foo %function that may have
15496              been used to set type information of the target location,
15497              that's being specified symbolically.  We have to presume
15498              the user knows what they are doing.  */
15499           char name[16 + 8];
15500           symbolS *symbol;
15501
15502           sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
15503
15504           symbol = symbol_find_or_make (name);
15505           S_SET_SEGMENT (symbol, absolute_section);
15506           symbol_set_frag (symbol, &zero_address_frag);
15507           S_SET_VALUE (symbol, exp->X_add_number);
15508           exp->X_op = O_symbol;
15509           exp->X_add_symbol = symbol;
15510           exp->X_add_number = 0;
15511         }
15512       /* FALLTHROUGH */
15513     case O_symbol:
15514     case O_add:
15515     case O_subtract:
15516       new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
15517                              (enum bfd_reloc_code_real) reloc);
15518       break;
15519
15520     default:
15521       new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
15522                                   pc_rel, (enum bfd_reloc_code_real) reloc);
15523       break;
15524     }
15525
15526   /* Mark whether the fix is to a THUMB instruction, or an ARM
15527      instruction.  */
15528   new_fix->tc_fix_data = thumb_mode;
15529 }
15530
15531 /* Create a frg for an instruction requiring relaxation.  */
15532 static void
15533 output_relax_insn (void)
15534 {
15535   char * to;
15536   symbolS *sym;
15537   int offset;
15538
15539   /* The size of the instruction is unknown, so tie the debug info to the
15540      start of the instruction.  */
15541   dwarf2_emit_insn (0);
15542
15543   switch (inst.reloc.exp.X_op)
15544     {
15545     case O_symbol:
15546       sym = inst.reloc.exp.X_add_symbol;
15547       offset = inst.reloc.exp.X_add_number;
15548       break;
15549     case O_constant:
15550       sym = NULL;
15551       offset = inst.reloc.exp.X_add_number;
15552       break;
15553     default:
15554       sym = make_expr_symbol (&inst.reloc.exp);
15555       offset = 0;
15556       break;
15557   }
15558   to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
15559                  inst.relax, sym, offset, NULL/*offset, opcode*/);
15560   md_number_to_chars (to, inst.instruction, THUMB_SIZE);
15561 }
15562
15563 /* Write a 32-bit thumb instruction to buf.  */
15564 static void
15565 put_thumb32_insn (char * buf, unsigned long insn)
15566 {
15567   md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
15568   md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
15569 }
15570
15571 static void
15572 output_inst (const char * str)
15573 {
15574   char * to = NULL;
15575
15576   if (inst.error)
15577     {
15578       as_bad ("%s -- `%s'", inst.error, str);
15579       return;
15580     }
15581   if (inst.relax)
15582     {
15583       output_relax_insn ();
15584       return;
15585     }
15586   if (inst.size == 0)
15587     return;
15588
15589   to = frag_more (inst.size);
15590   /* PR 9814: Record the thumb mode into the current frag so that we know
15591      what type of NOP padding to use, if necessary.  We override any previous
15592      setting so that if the mode has changed then the NOPS that we use will
15593      match the encoding of the last instruction in the frag.  */
15594   frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
15595
15596   if (thumb_mode && (inst.size > THUMB_SIZE))
15597     {
15598       gas_assert (inst.size == (2 * THUMB_SIZE));
15599       put_thumb32_insn (to, inst.instruction);
15600     }
15601   else if (inst.size > INSN_SIZE)
15602     {
15603       gas_assert (inst.size == (2 * INSN_SIZE));
15604       md_number_to_chars (to, inst.instruction, INSN_SIZE);
15605       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
15606     }
15607   else
15608     md_number_to_chars (to, inst.instruction, inst.size);
15609
15610   if (inst.reloc.type != BFD_RELOC_UNUSED)
15611     fix_new_arm (frag_now, to - frag_now->fr_literal,
15612                  inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
15613                  inst.reloc.type);
15614
15615   dwarf2_emit_insn (inst.size);
15616 }
15617
15618 static char *
15619 output_it_inst (int cond, int mask, char * to)
15620 {
15621   unsigned long instruction = 0xbf00;
15622
15623   mask &= 0xf;
15624   instruction |= mask;
15625   instruction |= cond << 4;
15626
15627   if (to == NULL)
15628     {
15629       to = frag_more (2);
15630 #ifdef OBJ_ELF
15631       dwarf2_emit_insn (2);
15632 #endif
15633     }
15634
15635   md_number_to_chars (to, instruction, 2);
15636
15637   return to;
15638 }
15639
15640 /* Tag values used in struct asm_opcode's tag field.  */
15641 enum opcode_tag
15642 {
15643   OT_unconditional,     /* Instruction cannot be conditionalized.
15644                            The ARM condition field is still 0xE.  */
15645   OT_unconditionalF,    /* Instruction cannot be conditionalized
15646                            and carries 0xF in its ARM condition field.  */
15647   OT_csuffix,           /* Instruction takes a conditional suffix.  */
15648   OT_csuffixF,          /* Some forms of the instruction take a conditional
15649                            suffix, others place 0xF where the condition field
15650                            would be.  */
15651   OT_cinfix3,           /* Instruction takes a conditional infix,
15652                            beginning at character index 3.  (In
15653                            unified mode, it becomes a suffix.)  */
15654   OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
15655                             tsts, cmps, cmns, and teqs. */
15656   OT_cinfix3_legacy,    /* Legacy instruction takes a conditional infix at
15657                            character index 3, even in unified mode.  Used for
15658                            legacy instructions where suffix and infix forms
15659                            may be ambiguous.  */
15660   OT_csuf_or_in3,       /* Instruction takes either a conditional
15661                            suffix or an infix at character index 3.  */
15662   OT_odd_infix_unc,     /* This is the unconditional variant of an
15663                            instruction that takes a conditional infix
15664                            at an unusual position.  In unified mode,
15665                            this variant will accept a suffix.  */
15666   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
15667                            are the conditional variants of instructions that
15668                            take conditional infixes in unusual positions.
15669                            The infix appears at character index
15670                            (tag - OT_odd_infix_0).  These are not accepted
15671                            in unified mode.  */
15672 };
15673
15674 /* Subroutine of md_assemble, responsible for looking up the primary
15675    opcode from the mnemonic the user wrote.  STR points to the
15676    beginning of the mnemonic.
15677
15678    This is not simply a hash table lookup, because of conditional
15679    variants.  Most instructions have conditional variants, which are
15680    expressed with a _conditional affix_ to the mnemonic.  If we were
15681    to encode each conditional variant as a literal string in the opcode
15682    table, it would have approximately 20,000 entries.
15683
15684    Most mnemonics take this affix as a suffix, and in unified syntax,
15685    'most' is upgraded to 'all'.  However, in the divided syntax, some
15686    instructions take the affix as an infix, notably the s-variants of
15687    the arithmetic instructions.  Of those instructions, all but six
15688    have the infix appear after the third character of the mnemonic.
15689
15690    Accordingly, the algorithm for looking up primary opcodes given
15691    an identifier is:
15692
15693    1. Look up the identifier in the opcode table.
15694       If we find a match, go to step U.
15695
15696    2. Look up the last two characters of the identifier in the
15697       conditions table.  If we find a match, look up the first N-2
15698       characters of the identifier in the opcode table.  If we
15699       find a match, go to step CE.
15700
15701    3. Look up the fourth and fifth characters of the identifier in
15702       the conditions table.  If we find a match, extract those
15703       characters from the identifier, and look up the remaining
15704       characters in the opcode table.  If we find a match, go
15705       to step CM.
15706
15707    4. Fail.
15708
15709    U. Examine the tag field of the opcode structure, in case this is
15710       one of the six instructions with its conditional infix in an
15711       unusual place.  If it is, the tag tells us where to find the
15712       infix; look it up in the conditions table and set inst.cond
15713       accordingly.  Otherwise, this is an unconditional instruction.
15714       Again set inst.cond accordingly.  Return the opcode structure.
15715
15716   CE. Examine the tag field to make sure this is an instruction that
15717       should receive a conditional suffix.  If it is not, fail.
15718       Otherwise, set inst.cond from the suffix we already looked up,
15719       and return the opcode structure.
15720
15721   CM. Examine the tag field to make sure this is an instruction that
15722       should receive a conditional infix after the third character.
15723       If it is not, fail.  Otherwise, undo the edits to the current
15724       line of input and proceed as for case CE.  */
15725
15726 static const struct asm_opcode *
15727 opcode_lookup (char **str)
15728 {
15729   char *end, *base;
15730   char *affix;
15731   const struct asm_opcode *opcode;
15732   const struct asm_cond *cond;
15733   char save[2];
15734
15735   /* Scan up to the end of the mnemonic, which must end in white space,
15736      '.' (in unified mode, or for Neon/VFP instructions), or end of string.  */
15737   for (base = end = *str; *end != '\0'; end++)
15738     if (*end == ' ' || *end == '.')
15739       break;
15740
15741   if (end == base)
15742     return NULL;
15743
15744   /* Handle a possible width suffix and/or Neon type suffix.  */
15745   if (end[0] == '.')
15746     {
15747       int offset = 2;
15748
15749       /* The .w and .n suffixes are only valid if the unified syntax is in
15750          use.  */
15751       if (unified_syntax && end[1] == 'w')
15752         inst.size_req = 4;
15753       else if (unified_syntax && end[1] == 'n')
15754         inst.size_req = 2;
15755       else
15756         offset = 0;
15757
15758       inst.vectype.elems = 0;
15759
15760       *str = end + offset;
15761
15762       if (end[offset] == '.')
15763         {
15764           /* See if we have a Neon type suffix (possible in either unified or
15765              non-unified ARM syntax mode).  */
15766           if (parse_neon_type (&inst.vectype, str) == FAIL)
15767             return NULL;
15768         }
15769       else if (end[offset] != '\0' && end[offset] != ' ')
15770         return NULL;
15771     }
15772   else
15773     *str = end;
15774
15775   /* Look for unaffixed or special-case affixed mnemonic.  */
15776   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15777                                                     end - base);
15778   if (opcode)
15779     {
15780       /* step U */
15781       if (opcode->tag < OT_odd_infix_0)
15782         {
15783           inst.cond = COND_ALWAYS;
15784           return opcode;
15785         }
15786
15787       if (warn_on_deprecated && unified_syntax)
15788         as_warn (_("conditional infixes are deprecated in unified syntax"));
15789       affix = base + (opcode->tag - OT_odd_infix_0);
15790       cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15791       gas_assert (cond);
15792
15793       inst.cond = cond->value;
15794       return opcode;
15795     }
15796
15797   /* Cannot have a conditional suffix on a mnemonic of less than two
15798      characters.  */
15799   if (end - base < 3)
15800     return NULL;
15801
15802   /* Look for suffixed mnemonic.  */
15803   affix = end - 2;
15804   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15805   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15806                                                     affix - base);
15807   if (opcode && cond)
15808     {
15809       /* step CE */
15810       switch (opcode->tag)
15811         {
15812         case OT_cinfix3_legacy:
15813           /* Ignore conditional suffixes matched on infix only mnemonics.  */
15814           break;
15815
15816         case OT_cinfix3:
15817         case OT_cinfix3_deprecated:
15818         case OT_odd_infix_unc:
15819           if (!unified_syntax)
15820             return 0;
15821           /* else fall through */
15822
15823         case OT_csuffix:
15824         case OT_csuffixF:
15825         case OT_csuf_or_in3:
15826           inst.cond = cond->value;
15827           return opcode;
15828
15829         case OT_unconditional:
15830         case OT_unconditionalF:
15831           if (thumb_mode)
15832             inst.cond = cond->value;
15833           else
15834             {
15835               /* Delayed diagnostic.  */
15836               inst.error = BAD_COND;
15837               inst.cond = COND_ALWAYS;
15838             }
15839           return opcode;
15840
15841         default:
15842           return NULL;
15843         }
15844     }
15845
15846   /* Cannot have a usual-position infix on a mnemonic of less than
15847      six characters (five would be a suffix).  */
15848   if (end - base < 6)
15849     return NULL;
15850
15851   /* Look for infixed mnemonic in the usual position.  */
15852   affix = base + 3;
15853   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15854   if (!cond)
15855     return NULL;
15856
15857   memcpy (save, affix, 2);
15858   memmove (affix, affix + 2, (end - affix) - 2);
15859   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15860                                                     (end - base) - 2);
15861   memmove (affix + 2, affix, (end - affix) - 2);
15862   memcpy (affix, save, 2);
15863
15864   if (opcode
15865       && (opcode->tag == OT_cinfix3
15866           || opcode->tag == OT_cinfix3_deprecated
15867           || opcode->tag == OT_csuf_or_in3
15868           || opcode->tag == OT_cinfix3_legacy))
15869     {
15870       /* Step CM.  */
15871       if (warn_on_deprecated && unified_syntax
15872           && (opcode->tag == OT_cinfix3
15873               || opcode->tag == OT_cinfix3_deprecated))
15874         as_warn (_("conditional infixes are deprecated in unified syntax"));
15875
15876       inst.cond = cond->value;
15877       return opcode;
15878     }
15879
15880   return NULL;
15881 }
15882
15883 /* This function generates an initial IT instruction, leaving its block
15884    virtually open for the new instructions. Eventually,
15885    the mask will be updated by now_it_add_mask () each time
15886    a new instruction needs to be included in the IT block.
15887    Finally, the block is closed with close_automatic_it_block ().
15888    The block closure can be requested either from md_assemble (),
15889    a tencode (), or due to a label hook.  */
15890
15891 static void
15892 new_automatic_it_block (int cond)
15893 {
15894   now_it.state = AUTOMATIC_IT_BLOCK;
15895   now_it.mask = 0x18;
15896   now_it.cc = cond;
15897   now_it.block_length = 1;
15898   mapping_state (MAP_THUMB);
15899   now_it.insn = output_it_inst (cond, now_it.mask, NULL);
15900 }
15901
15902 /* Close an automatic IT block.
15903    See comments in new_automatic_it_block ().  */
15904
15905 static void
15906 close_automatic_it_block (void)
15907 {
15908   now_it.mask = 0x10;
15909   now_it.block_length = 0;
15910 }
15911
15912 /* Update the mask of the current automatically-generated IT
15913    instruction. See comments in new_automatic_it_block ().  */
15914
15915 static void
15916 now_it_add_mask (int cond)
15917 {
15918 #define CLEAR_BIT(value, nbit)  ((value) & ~(1 << (nbit)))
15919 #define SET_BIT_VALUE(value, bitvalue, nbit)  (CLEAR_BIT (value, nbit) \
15920                                               | ((bitvalue) << (nbit)))
15921   const int resulting_bit = (cond & 1);
15922
15923   now_it.mask &= 0xf;
15924   now_it.mask = SET_BIT_VALUE (now_it.mask,
15925                                    resulting_bit,
15926                                   (5 - now_it.block_length));
15927   now_it.mask = SET_BIT_VALUE (now_it.mask,
15928                                    1,
15929                                    ((5 - now_it.block_length) - 1) );
15930   output_it_inst (now_it.cc, now_it.mask, now_it.insn);
15931
15932 #undef CLEAR_BIT
15933 #undef SET_BIT_VALUE
15934 }
15935
15936 /* The IT blocks handling machinery is accessed through the these functions:
15937      it_fsm_pre_encode ()               from md_assemble ()
15938      set_it_insn_type ()                optional, from the tencode functions
15939      set_it_insn_type_last ()           ditto
15940      in_it_block ()                     ditto
15941      it_fsm_post_encode ()              from md_assemble ()
15942      force_automatic_it_block_close ()  from label habdling functions
15943
15944    Rationale:
15945      1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
15946         initializing the IT insn type with a generic initial value depending
15947         on the inst.condition.
15948      2) During the tencode function, two things may happen:
15949         a) The tencode function overrides the IT insn type by
15950            calling either set_it_insn_type (type) or set_it_insn_type_last ().
15951         b) The tencode function queries the IT block state by
15952            calling in_it_block () (i.e. to determine narrow/not narrow mode).
15953
15954         Both set_it_insn_type and in_it_block run the internal FSM state
15955         handling function (handle_it_state), because: a) setting the IT insn
15956         type may incur in an invalid state (exiting the function),
15957         and b) querying the state requires the FSM to be updated.
15958         Specifically we want to avoid creating an IT block for conditional
15959         branches, so it_fsm_pre_encode is actually a guess and we can't
15960         determine whether an IT block is required until the tencode () routine
15961         has decided what type of instruction this actually it.
15962         Because of this, if set_it_insn_type and in_it_block have to be used,
15963         set_it_insn_type has to be called first.
15964
15965         set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
15966         determines the insn IT type depending on the inst.cond code.
15967         When a tencode () routine encodes an instruction that can be
15968         either outside an IT block, or, in the case of being inside, has to be
15969         the last one, set_it_insn_type_last () will determine the proper
15970         IT instruction type based on the inst.cond code. Otherwise,
15971         set_it_insn_type can be called for overriding that logic or
15972         for covering other cases.
15973
15974         Calling handle_it_state () may not transition the IT block state to
15975         OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
15976         still queried. Instead, if the FSM determines that the state should
15977         be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
15978         after the tencode () function: that's what it_fsm_post_encode () does.
15979
15980         Since in_it_block () calls the state handling function to get an
15981         updated state, an error may occur (due to invalid insns combination).
15982         In that case, inst.error is set.
15983         Therefore, inst.error has to be checked after the execution of
15984         the tencode () routine.
15985
15986      3) Back in md_assemble(), it_fsm_post_encode () is called to commit
15987         any pending state change (if any) that didn't take place in
15988         handle_it_state () as explained above.  */
15989
15990 static void
15991 it_fsm_pre_encode (void)
15992 {
15993   if (inst.cond != COND_ALWAYS)
15994     inst.it_insn_type = INSIDE_IT_INSN;
15995   else
15996     inst.it_insn_type = OUTSIDE_IT_INSN;
15997
15998   now_it.state_handled = 0;
15999 }
16000
16001 /* IT state FSM handling function.  */
16002
16003 static int
16004 handle_it_state (void)
16005 {
16006   now_it.state_handled = 1;
16007
16008   switch (now_it.state)
16009     {
16010     case OUTSIDE_IT_BLOCK:
16011       switch (inst.it_insn_type)
16012         {
16013         case OUTSIDE_IT_INSN:
16014           break;
16015
16016         case INSIDE_IT_INSN:
16017         case INSIDE_IT_LAST_INSN:
16018           if (thumb_mode == 0)
16019             {
16020               if (unified_syntax
16021                   && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
16022                 as_tsktsk (_("Warning: conditional outside an IT block"\
16023                              " for Thumb."));
16024             }
16025           else
16026             {
16027               if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
16028                   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
16029                 {
16030                   /* Automatically generate the IT instruction.  */
16031                   new_automatic_it_block (inst.cond);
16032                   if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
16033                     close_automatic_it_block ();
16034                 }
16035               else
16036                 {
16037                   inst.error = BAD_OUT_IT;
16038                   return FAIL;
16039                 }
16040             }
16041           break;
16042
16043         case IF_INSIDE_IT_LAST_INSN:
16044         case NEUTRAL_IT_INSN:
16045           break;
16046
16047         case IT_INSN:
16048           now_it.state = MANUAL_IT_BLOCK;
16049           now_it.block_length = 0;
16050           break;
16051         }
16052       break;
16053
16054     case AUTOMATIC_IT_BLOCK:
16055       /* Three things may happen now:
16056          a) We should increment current it block size;
16057          b) We should close current it block (closing insn or 4 insns);
16058          c) We should close current it block and start a new one (due
16059          to incompatible conditions or
16060          4 insns-length block reached).  */
16061
16062       switch (inst.it_insn_type)
16063         {
16064         case OUTSIDE_IT_INSN:
16065           /* The closure of the block shall happen immediatelly,
16066              so any in_it_block () call reports the block as closed.  */
16067           force_automatic_it_block_close ();
16068           break;
16069
16070         case INSIDE_IT_INSN:
16071         case INSIDE_IT_LAST_INSN:
16072         case IF_INSIDE_IT_LAST_INSN:
16073           now_it.block_length++;
16074
16075           if (now_it.block_length > 4
16076               || !now_it_compatible (inst.cond))
16077             {
16078               force_automatic_it_block_close ();
16079               if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
16080                 new_automatic_it_block (inst.cond);
16081             }
16082           else
16083             {
16084               now_it_add_mask (inst.cond);
16085             }
16086
16087           if (now_it.state == AUTOMATIC_IT_BLOCK
16088               && (inst.it_insn_type == INSIDE_IT_LAST_INSN
16089                   || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
16090             close_automatic_it_block ();
16091           break;
16092
16093         case NEUTRAL_IT_INSN:
16094           now_it.block_length++;
16095
16096           if (now_it.block_length > 4)
16097             force_automatic_it_block_close ();
16098           else
16099             now_it_add_mask (now_it.cc & 1);
16100           break;
16101
16102         case IT_INSN:
16103           close_automatic_it_block ();
16104           now_it.state = MANUAL_IT_BLOCK;
16105           break;
16106         }
16107       break;
16108
16109     case MANUAL_IT_BLOCK:
16110       {
16111         /* Check conditional suffixes.  */
16112         const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
16113         int is_last;
16114         now_it.mask <<= 1;
16115         now_it.mask &= 0x1f;
16116         is_last = (now_it.mask == 0x10);
16117
16118         switch (inst.it_insn_type)
16119           {
16120           case OUTSIDE_IT_INSN:
16121             inst.error = BAD_NOT_IT;
16122             return FAIL;
16123
16124           case INSIDE_IT_INSN:
16125             if (cond != inst.cond)
16126               {
16127                 inst.error = BAD_IT_COND;
16128                 return FAIL;
16129               }
16130             break;
16131
16132           case INSIDE_IT_LAST_INSN:
16133           case IF_INSIDE_IT_LAST_INSN:
16134             if (cond != inst.cond)
16135               {
16136                 inst.error = BAD_IT_COND;
16137                 return FAIL;
16138               }
16139             if (!is_last)
16140               {
16141                 inst.error = BAD_BRANCH;
16142                 return FAIL;
16143               }
16144             break;
16145
16146           case NEUTRAL_IT_INSN:
16147             /* The BKPT instruction is unconditional even in an IT block.  */
16148             break;
16149
16150           case IT_INSN:
16151             inst.error = BAD_IT_IT;
16152             return FAIL;
16153           }
16154       }
16155       break;
16156     }
16157
16158   return SUCCESS;
16159 }
16160
16161 static void
16162 it_fsm_post_encode (void)
16163 {
16164   int is_last;
16165
16166   if (!now_it.state_handled)
16167     handle_it_state ();
16168
16169   is_last = (now_it.mask == 0x10);
16170   if (is_last)
16171     {
16172       now_it.state = OUTSIDE_IT_BLOCK;
16173       now_it.mask = 0;
16174     }
16175 }
16176
16177 static void
16178 force_automatic_it_block_close (void)
16179 {
16180   if (now_it.state == AUTOMATIC_IT_BLOCK)
16181     {
16182       close_automatic_it_block ();
16183       now_it.state = OUTSIDE_IT_BLOCK;
16184       now_it.mask = 0;
16185     }
16186 }
16187
16188 static int
16189 in_it_block (void)
16190 {
16191   if (!now_it.state_handled)
16192     handle_it_state ();
16193
16194   return now_it.state != OUTSIDE_IT_BLOCK;
16195 }
16196
16197 void
16198 md_assemble (char *str)
16199 {
16200   char *p = str;
16201   const struct asm_opcode * opcode;
16202
16203   /* Align the previous label if needed.  */
16204   if (last_label_seen != NULL)
16205     {
16206       symbol_set_frag (last_label_seen, frag_now);
16207       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
16208       S_SET_SEGMENT (last_label_seen, now_seg);
16209     }
16210
16211   memset (&inst, '\0', sizeof (inst));
16212   inst.reloc.type = BFD_RELOC_UNUSED;
16213
16214   opcode = opcode_lookup (&p);
16215   if (!opcode)
16216     {
16217       /* It wasn't an instruction, but it might be a register alias of
16218          the form alias .req reg, or a Neon .dn/.qn directive.  */
16219       if (! create_register_alias (str, p)
16220           && ! create_neon_reg_alias (str, p))
16221         as_bad (_("bad instruction `%s'"), str);
16222
16223       return;
16224     }
16225
16226   if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
16227     as_warn (_("s suffix on comparison instruction is deprecated"));
16228
16229   /* The value which unconditional instructions should have in place of the
16230      condition field.  */
16231   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
16232
16233   if (thumb_mode)
16234     {
16235       arm_feature_set variant;
16236
16237       variant = cpu_variant;
16238       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
16239       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
16240         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
16241       /* Check that this instruction is supported for this CPU.  */
16242       if (!opcode->tvariant
16243           || (thumb_mode == 1
16244               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
16245         {
16246           as_bad (_("selected processor does not support Thumb mode `%s'"), str);
16247           return;
16248         }
16249       if (inst.cond != COND_ALWAYS && !unified_syntax
16250           && opcode->tencode != do_t_branch)
16251         {
16252           as_bad (_("Thumb does not support conditional execution"));
16253           return;
16254         }
16255
16256       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
16257         {
16258           if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
16259               && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
16260                    || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
16261             {
16262               /* Two things are addressed here.
16263                  1) Implicit require narrow instructions on Thumb-1.
16264                     This avoids relaxation accidentally introducing Thumb-2
16265                      instructions.
16266                  2) Reject wide instructions in non Thumb-2 cores.  */
16267               if (inst.size_req == 0)
16268                 inst.size_req = 2;
16269               else if (inst.size_req == 4)
16270                 {
16271                   as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
16272                   return;
16273                 }
16274             }
16275         }
16276
16277       inst.instruction = opcode->tvalue;
16278
16279       if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
16280         {
16281           /* Prepare the it_insn_type for those encodings that don't set
16282              it.  */
16283           it_fsm_pre_encode ();
16284
16285           opcode->tencode ();
16286
16287           it_fsm_post_encode ();
16288         }
16289
16290       if (!(inst.error || inst.relax))
16291         {
16292           gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
16293           inst.size = (inst.instruction > 0xffff ? 4 : 2);
16294           if (inst.size_req && inst.size_req != inst.size)
16295             {
16296               as_bad (_("cannot honor width suffix -- `%s'"), str);
16297               return;
16298             }
16299         }
16300
16301       /* Something has gone badly wrong if we try to relax a fixed size
16302          instruction.  */
16303       gas_assert (inst.size_req == 0 || !inst.relax);
16304
16305       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16306                               *opcode->tvariant);
16307       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
16308          set those bits when Thumb-2 32-bit instructions are seen.  ie.
16309          anything other than bl/blx and v6-M instructions.
16310          This is overly pessimistic for relaxable instructions.  */
16311       if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
16312            || inst.relax)
16313           && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
16314                || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
16315         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16316                                 arm_ext_v6t2);
16317
16318       check_neon_suffixes;
16319
16320       if (!inst.error)
16321         {
16322           mapping_state (MAP_THUMB);
16323         }
16324     }
16325   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
16326     {
16327       bfd_boolean is_bx;
16328
16329       /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
16330       is_bx = (opcode->aencode == do_bx);
16331
16332       /* Check that this instruction is supported for this CPU.  */
16333       if (!(is_bx && fix_v4bx)
16334           && !(opcode->avariant &&
16335                ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
16336         {
16337           as_bad (_("selected processor does not support ARM mode `%s'"), str);
16338           return;
16339         }
16340       if (inst.size_req)
16341         {
16342           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
16343           return;
16344         }
16345
16346       inst.instruction = opcode->avalue;
16347       if (opcode->tag == OT_unconditionalF)
16348         inst.instruction |= 0xF << 28;
16349       else
16350         inst.instruction |= inst.cond << 28;
16351       inst.size = INSN_SIZE;
16352       if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
16353         {
16354           it_fsm_pre_encode ();
16355           opcode->aencode ();
16356           it_fsm_post_encode ();
16357         }
16358       /* Arm mode bx is marked as both v4T and v5 because it's still required
16359          on a hypothetical non-thumb v5 core.  */
16360       if (is_bx)
16361         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
16362       else
16363         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
16364                                 *opcode->avariant);
16365
16366       check_neon_suffixes;
16367
16368       if (!inst.error)
16369         {
16370           mapping_state (MAP_ARM);
16371         }
16372     }
16373   else
16374     {
16375       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
16376                 "-- `%s'"), str);
16377       return;
16378     }
16379   output_inst (str);
16380 }
16381
16382 static void
16383 check_it_blocks_finished (void)
16384 {
16385 #ifdef OBJ_ELF
16386   asection *sect;
16387
16388   for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
16389     if (seg_info (sect)->tc_segment_info_data.current_it.state
16390         == MANUAL_IT_BLOCK)
16391       {
16392         as_warn (_("section '%s' finished with an open IT block."),
16393                  sect->name);
16394       }
16395 #else
16396   if (now_it.state == MANUAL_IT_BLOCK)
16397     as_warn (_("file finished with an open IT block."));
16398 #endif
16399 }
16400
16401 /* Various frobbings of labels and their addresses.  */
16402
16403 void
16404 arm_start_line_hook (void)
16405 {
16406   last_label_seen = NULL;
16407 }
16408
16409 void
16410 arm_frob_label (symbolS * sym)
16411 {
16412   last_label_seen = sym;
16413
16414   ARM_SET_THUMB (sym, thumb_mode);
16415
16416 #if defined OBJ_COFF || defined OBJ_ELF
16417   ARM_SET_INTERWORK (sym, support_interwork);
16418 #endif
16419
16420   force_automatic_it_block_close ();
16421
16422   /* Note - do not allow local symbols (.Lxxx) to be labelled
16423      as Thumb functions.  This is because these labels, whilst
16424      they exist inside Thumb code, are not the entry points for
16425      possible ARM->Thumb calls.  Also, these labels can be used
16426      as part of a computed goto or switch statement.  eg gcc
16427      can generate code that looks like this:
16428
16429                 ldr  r2, [pc, .Laaa]
16430                 lsl  r3, r3, #2
16431                 ldr  r2, [r3, r2]
16432                 mov  pc, r2
16433
16434        .Lbbb:  .word .Lxxx
16435        .Lccc:  .word .Lyyy
16436        ..etc...
16437        .Laaa:   .word Lbbb
16438
16439      The first instruction loads the address of the jump table.
16440      The second instruction converts a table index into a byte offset.
16441      The third instruction gets the jump address out of the table.
16442      The fourth instruction performs the jump.
16443
16444      If the address stored at .Laaa is that of a symbol which has the
16445      Thumb_Func bit set, then the linker will arrange for this address
16446      to have the bottom bit set, which in turn would mean that the
16447      address computation performed by the third instruction would end
16448      up with the bottom bit set.  Since the ARM is capable of unaligned
16449      word loads, the instruction would then load the incorrect address
16450      out of the jump table, and chaos would ensue.  */
16451   if (label_is_thumb_function_name
16452       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
16453       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
16454     {
16455       /* When the address of a Thumb function is taken the bottom
16456          bit of that address should be set.  This will allow
16457          interworking between Arm and Thumb functions to work
16458          correctly.  */
16459
16460       THUMB_SET_FUNC (sym, 1);
16461
16462       label_is_thumb_function_name = FALSE;
16463     }
16464
16465   dwarf2_emit_label (sym);
16466 }
16467
16468 bfd_boolean
16469 arm_data_in_code (void)
16470 {
16471   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
16472     {
16473       *input_line_pointer = '/';
16474       input_line_pointer += 5;
16475       *input_line_pointer = 0;
16476       return TRUE;
16477     }
16478
16479   return FALSE;
16480 }
16481
16482 char *
16483 arm_canonicalize_symbol_name (char * name)
16484 {
16485   int len;
16486
16487   if (thumb_mode && (len = strlen (name)) > 5
16488       && streq (name + len - 5, "/data"))
16489     *(name + len - 5) = 0;
16490
16491   return name;
16492 }
16493 \f
16494 /* Table of all register names defined by default.  The user can
16495    define additional names with .req.  Note that all register names
16496    should appear in both upper and lowercase variants.  Some registers
16497    also have mixed-case names.  */
16498
16499 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
16500 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
16501 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
16502 #define REGSET(p,t) \
16503   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
16504   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
16505   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
16506   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
16507 #define REGSETH(p,t) \
16508   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
16509   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
16510   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
16511   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
16512 #define REGSET2(p,t) \
16513   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
16514   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
16515   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
16516   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
16517 #define SPLRBANK(base,bank,t) \
16518   REGDEF(lr_##bank, 768|((base+0)<<16), t), \
16519   REGDEF(sp_##bank, 768|((base+1)<<16), t), \
16520   REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
16521   REGDEF(LR_##bank, 768|((base+0)<<16), t), \
16522   REGDEF(SP_##bank, 768|((base+1)<<16), t), \
16523   REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
16524
16525 static const struct reg_entry reg_names[] =
16526 {
16527   /* ARM integer registers.  */
16528   REGSET(r, RN), REGSET(R, RN),
16529
16530   /* ATPCS synonyms.  */
16531   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
16532   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
16533   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
16534
16535   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
16536   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
16537   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
16538
16539   /* Well-known aliases.  */
16540   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
16541   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
16542
16543   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
16544   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
16545
16546   /* Coprocessor numbers.  */
16547   REGSET(p, CP), REGSET(P, CP),
16548
16549   /* Coprocessor register numbers.  The "cr" variants are for backward
16550      compatibility.  */
16551   REGSET(c,  CN), REGSET(C, CN),
16552   REGSET(cr, CN), REGSET(CR, CN),
16553
16554   /* ARM banked registers.  */
16555   REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
16556   REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
16557   REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
16558   REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
16559   REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
16560   REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
16561   REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
16562
16563   REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
16564   REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
16565   REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
16566   REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
16567   REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
16568   REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(SP_fiq,512|(13<<16),RNB),
16569   REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
16570   REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
16571
16572   SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
16573   SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
16574   SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
16575   SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
16576   SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
16577   REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
16578   REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
16579   REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB), 
16580   REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
16581
16582   /* FPA registers.  */
16583   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
16584   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
16585
16586   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
16587   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
16588
16589   /* VFP SP registers.  */
16590   REGSET(s,VFS),  REGSET(S,VFS),
16591   REGSETH(s,VFS), REGSETH(S,VFS),
16592
16593   /* VFP DP Registers.  */
16594   REGSET(d,VFD),  REGSET(D,VFD),
16595   /* Extra Neon DP registers.  */
16596   REGSETH(d,VFD), REGSETH(D,VFD),
16597
16598   /* Neon QP registers.  */
16599   REGSET2(q,NQ),  REGSET2(Q,NQ),
16600
16601   /* VFP control registers.  */
16602   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
16603   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
16604   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
16605   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
16606   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
16607   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
16608
16609   /* Maverick DSP coprocessor registers.  */
16610   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
16611   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
16612
16613   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
16614   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
16615   REGDEF(dspsc,0,DSPSC),
16616
16617   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
16618   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
16619   REGDEF(DSPSC,0,DSPSC),
16620
16621   /* iWMMXt data registers - p0, c0-15.  */
16622   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
16623
16624   /* iWMMXt control registers - p1, c0-3.  */
16625   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
16626   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
16627   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
16628   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
16629
16630   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
16631   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
16632   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
16633   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
16634   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
16635
16636   /* XScale accumulator registers.  */
16637   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
16638 };
16639 #undef REGDEF
16640 #undef REGNUM
16641 #undef REGSET
16642
16643 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
16644    within psr_required_here.  */
16645 static const struct asm_psr psrs[] =
16646 {
16647   /* Backward compatibility notation.  Note that "all" is no longer
16648      truly all possible PSR bits.  */
16649   {"all",  PSR_c | PSR_f},
16650   {"flg",  PSR_f},
16651   {"ctl",  PSR_c},
16652
16653   /* Individual flags.  */
16654   {"f",    PSR_f},
16655   {"c",    PSR_c},
16656   {"x",    PSR_x},
16657   {"s",    PSR_s},
16658
16659   /* Combinations of flags.  */
16660   {"fs",   PSR_f | PSR_s},
16661   {"fx",   PSR_f | PSR_x},
16662   {"fc",   PSR_f | PSR_c},
16663   {"sf",   PSR_s | PSR_f},
16664   {"sx",   PSR_s | PSR_x},
16665   {"sc",   PSR_s | PSR_c},
16666   {"xf",   PSR_x | PSR_f},
16667   {"xs",   PSR_x | PSR_s},
16668   {"xc",   PSR_x | PSR_c},
16669   {"cf",   PSR_c | PSR_f},
16670   {"cs",   PSR_c | PSR_s},
16671   {"cx",   PSR_c | PSR_x},
16672   {"fsx",  PSR_f | PSR_s | PSR_x},
16673   {"fsc",  PSR_f | PSR_s | PSR_c},
16674   {"fxs",  PSR_f | PSR_x | PSR_s},
16675   {"fxc",  PSR_f | PSR_x | PSR_c},
16676   {"fcs",  PSR_f | PSR_c | PSR_s},
16677   {"fcx",  PSR_f | PSR_c | PSR_x},
16678   {"sfx",  PSR_s | PSR_f | PSR_x},
16679   {"sfc",  PSR_s | PSR_f | PSR_c},
16680   {"sxf",  PSR_s | PSR_x | PSR_f},
16681   {"sxc",  PSR_s | PSR_x | PSR_c},
16682   {"scf",  PSR_s | PSR_c | PSR_f},
16683   {"scx",  PSR_s | PSR_c | PSR_x},
16684   {"xfs",  PSR_x | PSR_f | PSR_s},
16685   {"xfc",  PSR_x | PSR_f | PSR_c},
16686   {"xsf",  PSR_x | PSR_s | PSR_f},
16687   {"xsc",  PSR_x | PSR_s | PSR_c},
16688   {"xcf",  PSR_x | PSR_c | PSR_f},
16689   {"xcs",  PSR_x | PSR_c | PSR_s},
16690   {"cfs",  PSR_c | PSR_f | PSR_s},
16691   {"cfx",  PSR_c | PSR_f | PSR_x},
16692   {"csf",  PSR_c | PSR_s | PSR_f},
16693   {"csx",  PSR_c | PSR_s | PSR_x},
16694   {"cxf",  PSR_c | PSR_x | PSR_f},
16695   {"cxs",  PSR_c | PSR_x | PSR_s},
16696   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
16697   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
16698   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
16699   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
16700   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
16701   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
16702   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
16703   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
16704   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
16705   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
16706   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
16707   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
16708   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
16709   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
16710   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
16711   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
16712   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
16713   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
16714   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
16715   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
16716   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
16717   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
16718   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
16719   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
16720 };
16721
16722 /* Table of V7M psr names.  */
16723 static const struct asm_psr v7m_psrs[] =
16724 {
16725   {"apsr",        0 }, {"APSR",         0 },
16726   {"iapsr",       1 }, {"IAPSR",        1 },
16727   {"eapsr",       2 }, {"EAPSR",        2 },
16728   {"psr",         3 }, {"PSR",          3 },
16729   {"xpsr",        3 }, {"XPSR",         3 }, {"xPSR",     3 },
16730   {"ipsr",        5 }, {"IPSR",         5 },
16731   {"epsr",        6 }, {"EPSR",         6 },
16732   {"iepsr",       7 }, {"IEPSR",        7 },
16733   {"msp",         8 }, {"MSP",          8 },
16734   {"psp",         9 }, {"PSP",          9 },
16735   {"primask",     16}, {"PRIMASK",      16},
16736   {"basepri",     17}, {"BASEPRI",      17},
16737   {"basepri_max", 18}, {"BASEPRI_MAX",  18},
16738   {"basepri_max", 18}, {"BASEPRI_MASK", 18}, /* Typo, preserved for backwards compatibility.  */
16739   {"faultmask",   19}, {"FAULTMASK",    19},
16740   {"control",     20}, {"CONTROL",      20}
16741 };
16742
16743 /* Table of all shift-in-operand names.  */
16744 static const struct asm_shift_name shift_names [] =
16745 {
16746   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
16747   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
16748   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
16749   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
16750   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
16751   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
16752 };
16753
16754 /* Table of all explicit relocation names.  */
16755 #ifdef OBJ_ELF
16756 static struct reloc_entry reloc_names[] =
16757 {
16758   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
16759   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
16760   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
16761   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
16762   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
16763   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
16764   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
16765   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
16766   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
16767   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
16768   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32},
16769   { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
16770   { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
16771         { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
16772   { "tlscall", BFD_RELOC_ARM_TLS_CALL},
16773         { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
16774   { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
16775         { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
16776 };
16777 #endif
16778
16779 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
16780 static const struct asm_cond conds[] =
16781 {
16782   {"eq", 0x0},
16783   {"ne", 0x1},
16784   {"cs", 0x2}, {"hs", 0x2},
16785   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
16786   {"mi", 0x4},
16787   {"pl", 0x5},
16788   {"vs", 0x6},
16789   {"vc", 0x7},
16790   {"hi", 0x8},
16791   {"ls", 0x9},
16792   {"ge", 0xa},
16793   {"lt", 0xb},
16794   {"gt", 0xc},
16795   {"le", 0xd},
16796   {"al", 0xe}
16797 };
16798
16799 static struct asm_barrier_opt barrier_opt_names[] =
16800 {
16801   { "sy",    0xf }, { "SY",    0xf },
16802   { "un",    0x7 }, { "UN",    0x7 },
16803   { "st",    0xe }, { "ST",    0xe },
16804   { "unst",  0x6 }, { "UNST",  0x6 },
16805   { "ish",   0xb }, { "ISH",   0xb },
16806   { "sh",    0xb }, { "SH",    0xb },
16807   { "ishst", 0xa }, { "ISHST", 0xa },
16808   { "shst",  0xa }, { "SHST",  0xa },
16809   { "nsh",   0x7 }, { "NSH",   0x7 },
16810   { "nshst", 0x6 }, { "NSHST", 0x6 },
16811   { "osh",   0x3 }, { "OSH",   0x3 },
16812   { "oshst", 0x2 }, { "OSHST", 0x2 }
16813 };
16814
16815 /* Table of ARM-format instructions.    */
16816
16817 /* Macros for gluing together operand strings.  N.B. In all cases
16818    other than OPS0, the trailing OP_stop comes from default
16819    zero-initialization of the unspecified elements of the array.  */
16820 #define OPS0()            { OP_stop, }
16821 #define OPS1(a)           { OP_##a, }
16822 #define OPS2(a,b)         { OP_##a,OP_##b, }
16823 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
16824 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
16825 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
16826 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
16827
16828 /* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
16829    This is useful when mixing operands for ARM and THUMB, i.e. using the
16830    MIX_ARM_THUMB_OPERANDS macro.
16831    In order to use these macros, prefix the number of operands with _
16832    e.g. _3.  */
16833 #define OPS_1(a)           { a, }
16834 #define OPS_2(a,b)         { a,b, }
16835 #define OPS_3(a,b,c)       { a,b,c, }
16836 #define OPS_4(a,b,c,d)     { a,b,c,d, }
16837 #define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
16838 #define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
16839
16840 /* These macros abstract out the exact format of the mnemonic table and
16841    save some repeated characters.  */
16842
16843 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
16844 #define TxCE(mnem, op, top, nops, ops, ae, te) \
16845   { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
16846     THUMB_VARIANT, do_##ae, do_##te }
16847
16848 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
16849    a T_MNEM_xyz enumerator.  */
16850 #define TCE(mnem, aop, top, nops, ops, ae, te) \
16851       TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
16852 #define tCE(mnem, aop, top, nops, ops, ae, te) \
16853       TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
16854
16855 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
16856    infix after the third character.  */
16857 #define TxC3(mnem, op, top, nops, ops, ae, te) \
16858   { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
16859     THUMB_VARIANT, do_##ae, do_##te }
16860 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
16861   { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
16862     THUMB_VARIANT, do_##ae, do_##te }
16863 #define TC3(mnem, aop, top, nops, ops, ae, te) \
16864       TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
16865 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
16866       TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
16867 #define tC3(mnem, aop, top, nops, ops, ae, te) \
16868       TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
16869 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
16870       TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
16871
16872 /* Mnemonic with a conditional infix in an unusual place.  Each and every variant has to
16873    appear in the condition table.  */
16874 #define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te)   \
16875   { m1 #m2 m3, OPS##nops ops, sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
16876     0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
16877
16878 #define TxCM(m1, m2, op, top, nops, ops, ae, te)        \
16879   TxCM_ (m1,   , m2, op, top, nops, ops, ae, te),       \
16880   TxCM_ (m1, eq, m2, op, top, nops, ops, ae, te),       \
16881   TxCM_ (m1, ne, m2, op, top, nops, ops, ae, te),       \
16882   TxCM_ (m1, cs, m2, op, top, nops, ops, ae, te),       \
16883   TxCM_ (m1, hs, m2, op, top, nops, ops, ae, te),       \
16884   TxCM_ (m1, cc, m2, op, top, nops, ops, ae, te),       \
16885   TxCM_ (m1, ul, m2, op, top, nops, ops, ae, te),       \
16886   TxCM_ (m1, lo, m2, op, top, nops, ops, ae, te),       \
16887   TxCM_ (m1, mi, m2, op, top, nops, ops, ae, te),       \
16888   TxCM_ (m1, pl, m2, op, top, nops, ops, ae, te),       \
16889   TxCM_ (m1, vs, m2, op, top, nops, ops, ae, te),       \
16890   TxCM_ (m1, vc, m2, op, top, nops, ops, ae, te),       \
16891   TxCM_ (m1, hi, m2, op, top, nops, ops, ae, te),       \
16892   TxCM_ (m1, ls, m2, op, top, nops, ops, ae, te),       \
16893   TxCM_ (m1, ge, m2, op, top, nops, ops, ae, te),       \
16894   TxCM_ (m1, lt, m2, op, top, nops, ops, ae, te),       \
16895   TxCM_ (m1, gt, m2, op, top, nops, ops, ae, te),       \
16896   TxCM_ (m1, le, m2, op, top, nops, ops, ae, te),       \
16897   TxCM_ (m1, al, m2, op, top, nops, ops, ae, te)
16898
16899 #define TCM(m1,m2, aop, top, nops, ops, ae, te)         \
16900       TxCM (m1,m2, aop, 0x##top, nops, ops, ae, te)
16901 #define tCM(m1,m2, aop, top, nops, ops, ae, te)         \
16902       TxCM (m1,m2, aop, T_MNEM##top, nops, ops, ae, te)
16903
16904 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
16905    field is still 0xE.  Many of the Thumb variants can be executed
16906    conditionally, so this is checked separately.  */
16907 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
16908   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
16909     THUMB_VARIANT, do_##ae, do_##te }
16910
16911 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
16912    condition code field.  */
16913 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
16914   { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
16915     THUMB_VARIANT, do_##ae, do_##te }
16916
16917 /* ARM-only variants of all the above.  */
16918 #define CE(mnem,  op, nops, ops, ae)    \
16919   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16920
16921 #define C3(mnem, op, nops, ops, ae)     \
16922   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16923
16924 /* Legacy mnemonics that always have conditional infix after the third
16925    character.  */
16926 #define CL(mnem, op, nops, ops, ae)     \
16927   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
16928     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16929
16930 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
16931 #define cCE(mnem,  op, nops, ops, ae)   \
16932   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16933
16934 /* Legacy coprocessor instructions where conditional infix and conditional
16935    suffix are ambiguous.  For consistency this includes all FPA instructions,
16936    not just the potentially ambiguous ones.  */
16937 #define cCL(mnem, op, nops, ops, ae)    \
16938   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
16939     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16940
16941 /* Coprocessor, takes either a suffix or a position-3 infix
16942    (for an FPA corner case). */
16943 #define C3E(mnem, op, nops, ops, ae) \
16944   { mnem, OPS##nops ops, OT_csuf_or_in3, \
16945     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
16946
16947 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
16948   { m1 #m2 m3, OPS##nops ops, \
16949     sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
16950     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
16951
16952 #define CM(m1, m2, op, nops, ops, ae)   \
16953   xCM_ (m1,   , m2, op, nops, ops, ae), \
16954   xCM_ (m1, eq, m2, op, nops, ops, ae), \
16955   xCM_ (m1, ne, m2, op, nops, ops, ae), \
16956   xCM_ (m1, cs, m2, op, nops, ops, ae), \
16957   xCM_ (m1, hs, m2, op, nops, ops, ae), \
16958   xCM_ (m1, cc, m2, op, nops, ops, ae), \
16959   xCM_ (m1, ul, m2, op, nops, ops, ae), \
16960   xCM_ (m1, lo, m2, op, nops, ops, ae), \
16961   xCM_ (m1, mi, m2, op, nops, ops, ae), \
16962   xCM_ (m1, pl, m2, op, nops, ops, ae), \
16963   xCM_ (m1, vs, m2, op, nops, ops, ae), \
16964   xCM_ (m1, vc, m2, op, nops, ops, ae), \
16965   xCM_ (m1, hi, m2, op, nops, ops, ae), \
16966   xCM_ (m1, ls, m2, op, nops, ops, ae), \
16967   xCM_ (m1, ge, m2, op, nops, ops, ae), \
16968   xCM_ (m1, lt, m2, op, nops, ops, ae), \
16969   xCM_ (m1, gt, m2, op, nops, ops, ae), \
16970   xCM_ (m1, le, m2, op, nops, ops, ae), \
16971   xCM_ (m1, al, m2, op, nops, ops, ae)
16972
16973 #define UE(mnem, op, nops, ops, ae)     \
16974   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
16975
16976 #define UF(mnem, op, nops, ops, ae)     \
16977   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
16978
16979 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
16980    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
16981    use the same encoding function for each.  */
16982 #define NUF(mnem, op, nops, ops, enc)                                   \
16983   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
16984     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16985
16986 /* Neon data processing, version which indirects through neon_enc_tab for
16987    the various overloaded versions of opcodes.  */
16988 #define nUF(mnem, op, nops, ops, enc)                                   \
16989   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
16990     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
16991
16992 /* Neon insn with conditional suffix for the ARM version, non-overloaded
16993    version.  */
16994 #define NCE_tag(mnem, op, nops, ops, enc, tag)                          \
16995   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
16996     THUMB_VARIANT, do_##enc, do_##enc }
16997
16998 #define NCE(mnem, op, nops, ops, enc)                                   \
16999    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
17000
17001 #define NCEF(mnem, op, nops, ops, enc)                                  \
17002     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
17003
17004 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
17005 #define nCE_tag(mnem, op, nops, ops, enc, tag)                          \
17006   { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,          \
17007     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17008
17009 #define nCE(mnem, op, nops, ops, enc)                                   \
17010    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
17011
17012 #define nCEF(mnem, op, nops, ops, enc)                                  \
17013     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
17014
17015 #define do_0 0
17016
17017 static const struct asm_opcode insns[] =
17018 {
17019 #define ARM_VARIANT &arm_ext_v1 /* Core ARM Instructions.  */
17020 #define THUMB_VARIANT &arm_ext_v4t
17021  tCE("and",     0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
17022  tC3("ands",    0100000, _ands,    3, (RR, oRR, SH), arit, t_arit3c),
17023  tCE("eor",     0200000, _eor,     3, (RR, oRR, SH), arit, t_arit3c),
17024  tC3("eors",    0300000, _eors,    3, (RR, oRR, SH), arit, t_arit3c),
17025  tCE("sub",     0400000, _sub,     3, (RR, oRR, SH), arit, t_add_sub),
17026  tC3("subs",    0500000, _subs,    3, (RR, oRR, SH), arit, t_add_sub),
17027  tCE("add",     0800000, _add,     3, (RR, oRR, SHG), arit, t_add_sub),
17028  tC3("adds",    0900000, _adds,    3, (RR, oRR, SHG), arit, t_add_sub),
17029  tCE("adc",     0a00000, _adc,     3, (RR, oRR, SH), arit, t_arit3c),
17030  tC3("adcs",    0b00000, _adcs,    3, (RR, oRR, SH), arit, t_arit3c),
17031  tCE("sbc",     0c00000, _sbc,     3, (RR, oRR, SH), arit, t_arit3),
17032  tC3("sbcs",    0d00000, _sbcs,    3, (RR, oRR, SH), arit, t_arit3),
17033  tCE("orr",     1800000, _orr,     3, (RR, oRR, SH), arit, t_arit3c),
17034  tC3("orrs",    1900000, _orrs,    3, (RR, oRR, SH), arit, t_arit3c),
17035  tCE("bic",     1c00000, _bic,     3, (RR, oRR, SH), arit, t_arit3),
17036  tC3("bics",    1d00000, _bics,    3, (RR, oRR, SH), arit, t_arit3),
17037
17038  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
17039     for setting PSR flag bits.  They are obsolete in V6 and do not
17040     have Thumb equivalents. */
17041  tCE("tst",     1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
17042  tC3w("tsts",   1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
17043   CL("tstp",    110f000,           2, (RR, SH),      cmp),
17044  tCE("cmp",     1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
17045  tC3w("cmps",   1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
17046   CL("cmpp",    150f000,           2, (RR, SH),      cmp),
17047  tCE("cmn",     1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
17048  tC3w("cmns",   1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
17049   CL("cmnp",    170f000,           2, (RR, SH),      cmp),
17050
17051  tCE("mov",     1a00000, _mov,     2, (RR, SH),      mov,  t_mov_cmp),
17052  tC3("movs",    1b00000, _movs,    2, (RR, SH),      mov,  t_mov_cmp),
17053  tCE("mvn",     1e00000, _mvn,     2, (RR, SH),      mov,  t_mvn_tst),
17054  tC3("mvns",    1f00000, _mvns,    2, (RR, SH),      mov,  t_mvn_tst),
17055
17056  tCE("ldr",     4100000, _ldr,     2, (RR, ADDRGLDR),ldst, t_ldst),
17057  tC3("ldrb",    4500000, _ldrb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
17058  tCE("str",     4000000, _str,     _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
17059                                                                 OP_RRnpc),
17060                                         OP_ADDRGLDR),ldst, t_ldst),
17061  tC3("strb",    4400000, _strb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
17062
17063  tCE("stm",     8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17064  tC3("stmia",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17065  tC3("stmea",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17066  tCE("ldm",     8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17067  tC3("ldmia",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17068  tC3("ldmfd",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17069
17070  TCE("swi",     f000000, df00,     1, (EXPi),        swi, t_swi),
17071  TCE("svc",     f000000, df00,     1, (EXPi),        swi, t_swi),
17072  tCE("b",       a000000, _b,       1, (EXPr),        branch, t_branch),
17073  TCE("bl",      b000000, f000f800, 1, (EXPr),        bl, t_branch23),
17074
17075   /* Pseudo ops.  */
17076  tCE("adr",     28f0000, _adr,     2, (RR, EXP),     adr,  t_adr),
17077   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
17078  tCE("nop",     1a00000, _nop,     1, (oI255c),      nop,  t_nop),
17079
17080   /* Thumb-compatibility pseudo ops.  */
17081  tCE("lsl",     1a00000, _lsl,     3, (RR, oRR, SH), shift, t_shift),
17082  tC3("lsls",    1b00000, _lsls,    3, (RR, oRR, SH), shift, t_shift),
17083  tCE("lsr",     1a00020, _lsr,     3, (RR, oRR, SH), shift, t_shift),
17084  tC3("lsrs",    1b00020, _lsrs,    3, (RR, oRR, SH), shift, t_shift),
17085  tCE("asr",     1a00040, _asr,     3, (RR, oRR, SH), shift, t_shift),
17086  tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
17087  tCE("ror",     1a00060, _ror,     3, (RR, oRR, SH), shift, t_shift),
17088  tC3("rors",    1b00060, _rors,    3, (RR, oRR, SH), shift, t_shift),
17089  tCE("neg",     2600000, _neg,     2, (RR, RR),      rd_rn, t_neg),
17090  tC3("negs",    2700000, _negs,    2, (RR, RR),      rd_rn, t_neg),
17091  tCE("push",    92d0000, _push,     1, (REGLST),             push_pop, t_push_pop),
17092  tCE("pop",     8bd0000, _pop,     1, (REGLST),      push_pop, t_push_pop),
17093
17094  /* These may simplify to neg.  */
17095  TCE("rsb",     0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
17096  TC3("rsbs",    0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
17097
17098 #undef  THUMB_VARIANT
17099 #define THUMB_VARIANT  & arm_ext_v6
17100
17101  TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
17102
17103  /* V1 instructions with no Thumb analogue prior to V6T2.  */
17104 #undef  THUMB_VARIANT
17105 #define THUMB_VARIANT  & arm_ext_v6t2
17106
17107  TCE("teq",     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
17108  TC3w("teqs",   1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
17109   CL("teqp",    130f000,           2, (RR, SH),      cmp),
17110
17111  TC3("ldrt",    4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17112  TC3("ldrbt",   4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17113  TC3("strt",    4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
17114  TC3("strbt",   4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17115
17116  TC3("stmdb",   9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17117  TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17118
17119  TC3("ldmdb",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17120  TC3("ldmea",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17121
17122  /* V1 instructions with no Thumb analogue at all.  */
17123   CE("rsc",     0e00000,           3, (RR, oRR, SH), arit),
17124   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
17125
17126   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
17127   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
17128   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
17129   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
17130   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
17131   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
17132   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
17133   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
17134
17135 #undef  ARM_VARIANT
17136 #define ARM_VARIANT    & arm_ext_v2     /* ARM 2 - multiplies.  */
17137 #undef  THUMB_VARIANT
17138 #define THUMB_VARIANT  & arm_ext_v4t
17139
17140  tCE("mul",     0000090, _mul,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
17141  tC3("muls",    0100090, _muls,    3, (RRnpc, RRnpc, oRR), mul, t_mul),
17142
17143 #undef  THUMB_VARIANT
17144 #define THUMB_VARIANT  & arm_ext_v6t2
17145
17146  TCE("mla",     0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
17147   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
17148
17149   /* Generic coprocessor instructions.  */
17150  TCE("cdp",     e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
17151  TCE("ldc",     c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17152  TC3("ldcl",    c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17153  TCE("stc",     c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17154  TC3("stcl",    c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17155  TCE("mcr",     e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
17156  TCE("mrc",     e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b),   co_reg, co_reg),
17157
17158 #undef  ARM_VARIANT
17159 #define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
17160
17161   CE("swp",     1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
17162   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
17163
17164 #undef  ARM_VARIANT
17165 #define ARM_VARIANT    & arm_ext_v3     /* ARM 6 Status register instructions.  */
17166 #undef  THUMB_VARIANT
17167 #define THUMB_VARIANT  & arm_ext_msr
17168
17169  TCE("mrs",     1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
17170  TCE("msr",     120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
17171
17172 #undef  ARM_VARIANT
17173 #define ARM_VARIANT    & arm_ext_v3m     /* ARM 7M long multiplies.  */
17174 #undef  THUMB_VARIANT
17175 #define THUMB_VARIANT  & arm_ext_v6t2
17176
17177  TCE("smull",   0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17178   CM("smull","s",       0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17179  TCE("umull",   0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17180   CM("umull","s",       0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17181  TCE("smlal",   0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17182   CM("smlal","s",       0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17183  TCE("umlal",   0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17184   CM("umlal","s",       0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17185
17186 #undef  ARM_VARIANT
17187 #define ARM_VARIANT    & arm_ext_v4     /* ARM Architecture 4.  */
17188 #undef  THUMB_VARIANT
17189 #define THUMB_VARIANT  & arm_ext_v4t
17190
17191  tC3("ldrh",    01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17192  tC3("strh",    00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17193  tC3("ldrsh",   01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17194  tC3("ldrsb",   01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17195  tCM("ld","sh", 01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17196  tCM("ld","sb", 01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17197
17198 #undef  ARM_VARIANT
17199 #define ARM_VARIANT  & arm_ext_v4t_5
17200
17201   /* ARM Architecture 4T.  */
17202   /* Note: bx (and blx) are required on V5, even if the processor does
17203      not support Thumb.  */
17204  TCE("bx",      12fff10, 4700, 1, (RR), bx, t_bx),
17205
17206 #undef  ARM_VARIANT
17207 #define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.     */
17208 #undef  THUMB_VARIANT
17209 #define THUMB_VARIANT  & arm_ext_v5t
17210
17211   /* Note: blx has 2 variants; the .value coded here is for
17212      BLX(2).  Only this variant has conditional execution.  */
17213  TCE("blx",     12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
17214  TUE("bkpt",    1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
17215
17216 #undef  THUMB_VARIANT
17217 #define THUMB_VARIANT  & arm_ext_v6t2
17218
17219  TCE("clz",     16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
17220  TUF("ldc2",    c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17221  TUF("ldc2l",   c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
17222  TUF("stc2",    c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17223  TUF("stc2l",   c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
17224  TUF("cdp2",    e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
17225  TUF("mcr2",    e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
17226  TUF("mrc2",    e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
17227
17228 #undef  ARM_VARIANT
17229 #define ARM_VARIANT  & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
17230 #undef THUMB_VARIANT
17231 #define THUMB_VARIANT &arm_ext_v5exp
17232
17233  TCE("smlabb",  1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17234  TCE("smlatb",  10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17235  TCE("smlabt",  10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17236  TCE("smlatt",  10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17237
17238  TCE("smlawb",  1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17239  TCE("smlawt",  12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17240
17241  TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
17242  TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
17243  TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
17244  TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
17245
17246  TCE("smulbb",  1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17247  TCE("smultb",  16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17248  TCE("smulbt",  16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17249  TCE("smultt",  16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17250
17251  TCE("smulwb",  12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17252  TCE("smulwt",  12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17253
17254  TCE("qadd",    1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
17255  TCE("qdadd",   1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
17256  TCE("qsub",    1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
17257  TCE("qdsub",   1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
17258
17259 #undef  ARM_VARIANT
17260 #define ARM_VARIANT  & arm_ext_v5e /*  ARM Architecture 5TE.  */
17261 #undef THUMB_VARIANT
17262 #define THUMB_VARIANT &arm_ext_v6t2
17263
17264  TUF("pld",     450f000, f810f000, 1, (ADDR),                pld,  t_pld),
17265  TC3("ldrd",    00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
17266      ldrd, t_ldstd),
17267  TC3("strd",    00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
17268                                        ADDRGLDRS), ldrd, t_ldstd),
17269
17270  TCE("mcrr",    c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17271  TCE("mrrc",    c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17272
17273 #undef  ARM_VARIANT
17274 #define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
17275
17276  TCE("bxj",     12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
17277
17278 #undef  ARM_VARIANT
17279 #define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
17280 #undef  THUMB_VARIANT
17281 #define THUMB_VARIANT  & arm_ext_v6
17282
17283  TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
17284  TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
17285  tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
17286  tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
17287  tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
17288  tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17289  tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17290  tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17291  tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17292  TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
17293
17294 #undef  THUMB_VARIANT
17295 #define THUMB_VARIANT  & arm_ext_v6t2
17296
17297  TCE("ldrex",   1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),        ldrex, t_ldrex),
17298  TCE("strex",   1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17299                                       strex,  t_strex),
17300  TUF("mcrr2",   c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17301  TUF("mrrc2",   c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17302
17303  TCE("ssat",    6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
17304  TCE("usat",    6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
17305
17306 /*  ARM V6 not included in V7M.  */
17307 #undef  THUMB_VARIANT
17308 #define THUMB_VARIANT  & arm_ext_v6_notm
17309  TUF("rfeia",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
17310   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
17311   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
17312  TUF("rfedb",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
17313  TUF("rfefd",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
17314   UF(rfefa,     9900a00,           1, (RRw),                       rfe),
17315   UF(rfeea,     8100a00,           1, (RRw),                       rfe),
17316  TUF("rfeed",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
17317  TUF("srsia",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
17318   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
17319   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
17320  TUF("srsdb",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
17321
17322 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
17323 #undef  THUMB_VARIANT
17324 #define THUMB_VARIANT  & arm_ext_v6_dsp
17325  TUF("cps",     1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
17326  TCE("pkhbt",   6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
17327  TCE("pkhtb",   6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
17328  TCE("qadd16",  6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17329  TCE("qadd8",   6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17330  TCE("qasx",    6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17331  /* Old name for QASX.  */
17332  TCE("qaddsubx",        6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17333  TCE("qsax",    6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17334  /* Old name for QSAX.  */
17335  TCE("qsubaddx",        6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17336  TCE("qsub16",  6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17337  TCE("qsub8",   6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17338  TCE("sadd16",  6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17339  TCE("sadd8",   6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17340  TCE("sasx",    6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17341  /* Old name for SASX.  */
17342  TCE("saddsubx",        6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17343  TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17344  TCE("shadd8",  6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17345  TCE("shasx",     6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17346  /* Old name for SHASX.  */
17347  TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17348  TCE("shsax",      6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),    rd_rn_rm, t_simd),
17349  /* Old name for SHSAX.  */
17350  TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17351  TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17352  TCE("shsub8",  6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17353  TCE("ssax",    6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17354  /* Old name for SSAX.  */
17355  TCE("ssubaddx",        6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17356  TCE("ssub16",  6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17357  TCE("ssub8",   6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17358  TCE("uadd16",  6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17359  TCE("uadd8",   6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17360  TCE("uasx",    6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17361  /* Old name for UASX.  */
17362  TCE("uaddsubx",        6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17363  TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17364  TCE("uhadd8",  6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17365  TCE("uhasx",     6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17366  /* Old name for UHASX.  */
17367  TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17368  TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17369  /* Old name for UHSAX.  */
17370  TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17371  TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17372  TCE("uhsub8",  6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17373  TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17374  TCE("uqadd8",  6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17375  TCE("uqasx",     6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17376  /* Old name for UQASX.  */
17377  TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17378  TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17379  /* Old name for UQSAX.  */
17380  TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17381  TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17382  TCE("uqsub8",  6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17383  TCE("usub16",  6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17384  TCE("usax",    6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17385  /* Old name for USAX.  */
17386  TCE("usubaddx",        6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17387  TCE("usub8",   6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17388  TCE("sxtah",   6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17389  TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17390  TCE("sxtab",   6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17391  TCE("sxtb16",  68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
17392  TCE("uxtah",   6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17393  TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17394  TCE("uxtab",   6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17395  TCE("uxtb16",  6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
17396  TCE("sel",     6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17397  TCE("smlad",   7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17398  TCE("smladx",  7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17399  TCE("smlald",  7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17400  TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17401  TCE("smlsd",   7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17402  TCE("smlsdx",  7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17403  TCE("smlsld",  7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17404  TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17405  TCE("smmla",   7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17406  TCE("smmlar",  7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17407  TCE("smmls",   75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17408  TCE("smmlsr",  75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17409  TCE("smmul",   750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17410  TCE("smmulr",  750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17411  TCE("smuad",   700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17412  TCE("smuadx",  700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17413  TCE("smusd",   700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17414  TCE("smusdx",  700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17415  TCE("ssat16",  6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
17416  TCE("umaal",   0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
17417  TCE("usad8",   780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
17418  TCE("usada8",  7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
17419  TCE("usat16",  6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
17420
17421 #undef  ARM_VARIANT
17422 #define ARM_VARIANT   & arm_ext_v6k
17423 #undef  THUMB_VARIANT
17424 #define THUMB_VARIANT & arm_ext_v6k
17425
17426  tCE("yield",   320f001, _yield,    0, (), noargs, t_hint),
17427  tCE("wfe",     320f002, _wfe,      0, (), noargs, t_hint),
17428  tCE("wfi",     320f003, _wfi,      0, (), noargs, t_hint),
17429  tCE("sev",     320f004, _sev,      0, (), noargs, t_hint),
17430
17431 #undef  THUMB_VARIANT
17432 #define THUMB_VARIANT  & arm_ext_v6_notm
17433  TCE("ldrexd",  1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
17434                                       ldrexd, t_ldrexd),
17435  TCE("strexd",  1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
17436                                        RRnpcb), strexd, t_strexd),
17437
17438 #undef  THUMB_VARIANT
17439 #define THUMB_VARIANT  & arm_ext_v6t2
17440  TCE("ldrexb",  1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
17441      rd_rn,  rd_rn),
17442  TCE("ldrexh",  1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
17443      rd_rn,  rd_rn),
17444  TCE("strexb",  1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17445      strex, rm_rd_rn),
17446  TCE("strexh",  1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17447      strex, rm_rd_rn), 
17448  TUF("clrex",   57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
17449
17450 #undef  ARM_VARIANT
17451 #define ARM_VARIANT    & arm_ext_sec
17452 #undef THUMB_VARIANT
17453 #define THUMB_VARIANT  & arm_ext_sec
17454
17455  TCE("smc",     1600070, f7f08000, 1, (EXPi), smc, t_smc),
17456
17457 #undef  ARM_VARIANT
17458 #define ARM_VARIANT    & arm_ext_virt
17459 #undef  THUMB_VARIANT
17460 #define THUMB_VARIANT    & arm_ext_virt
17461
17462  TCE("hvc",     1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
17463  TCE("eret",    160006e, f3de8f00, 0, (), noargs, noargs),
17464
17465 #undef  ARM_VARIANT
17466 #define ARM_VARIANT  & arm_ext_v6t2
17467 #undef  THUMB_VARIANT
17468 #define THUMB_VARIANT  & arm_ext_v6t2
17469
17470  TCE("bfc",     7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
17471  TCE("bfi",     7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
17472  TCE("sbfx",    7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
17473  TCE("ubfx",    7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
17474
17475  TCE("mls",     0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
17476  TCE("movw",    3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
17477  TCE("movt",    3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
17478  TCE("rbit",    6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
17479
17480  TC3("ldrht",   03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17481  TC3("ldrsht",  03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17482  TC3("ldrsbt",  03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17483  TC3("strht",   02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17484
17485  /* Thumb-only instructions.  */
17486 #undef ARM_VARIANT
17487 #define ARM_VARIANT NULL
17488   TUE("cbnz",     0,           b900,     2, (RR, EXP), 0, t_cbz),
17489   TUE("cbz",      0,           b100,     2, (RR, EXP), 0, t_cbz),
17490
17491  /* ARM does not really have an IT instruction, so always allow it.
17492     The opcode is copied from Thumb in order to allow warnings in
17493     -mimplicit-it=[never | arm] modes.  */
17494 #undef  ARM_VARIANT
17495 #define ARM_VARIANT  & arm_ext_v1
17496
17497  TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
17498  TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
17499  TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
17500  TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
17501  TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
17502  TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
17503  TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
17504  TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
17505  TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
17506  TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
17507  TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
17508  TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
17509  TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
17510  TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
17511  TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
17512  /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
17513  TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
17514  TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
17515
17516  /* Thumb2 only instructions.  */
17517 #undef  ARM_VARIANT
17518 #define ARM_VARIANT  NULL
17519
17520  TCE("addw",    0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17521  TCE("subw",    0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17522  TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
17523  TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
17524  TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
17525  TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
17526
17527  /* Hardware division instructions.  */
17528 #undef  ARM_VARIANT
17529 #define ARM_VARIANT    & arm_ext_adiv
17530 #undef  THUMB_VARIANT
17531 #define THUMB_VARIANT  & arm_ext_div
17532
17533  TCE("sdiv",    710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
17534  TCE("udiv",    730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
17535
17536  /* ARM V6M/V7 instructions.  */
17537 #undef  ARM_VARIANT
17538 #define ARM_VARIANT    & arm_ext_barrier
17539 #undef  THUMB_VARIANT
17540 #define THUMB_VARIANT  & arm_ext_barrier
17541
17542  TUF("dmb",     57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier,  t_barrier),
17543  TUF("dsb",     57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier,  t_barrier),
17544  TUF("isb",     57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier,  t_barrier),
17545
17546  /* ARM V7 instructions.  */
17547 #undef  ARM_VARIANT
17548 #define ARM_VARIANT    & arm_ext_v7
17549 #undef  THUMB_VARIANT
17550 #define THUMB_VARIANT  & arm_ext_v7
17551
17552  TUF("pli",     450f000, f910f000, 1, (ADDR),     pli,      t_pld),
17553  TCE("dbg",     320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
17554
17555 #undef ARM_VARIANT
17556 #define ARM_VARIANT    & arm_ext_mp
17557 #undef THUMB_VARIANT
17558 #define THUMB_VARIANT  & arm_ext_mp
17559
17560  TUF("pldw",    410f000, f830f000, 1, (ADDR),   pld,    t_pld),
17561
17562 #undef  ARM_VARIANT
17563 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
17564
17565  cCE("wfs",     e200110, 1, (RR),            rd),
17566  cCE("rfs",     e300110, 1, (RR),            rd),
17567  cCE("wfc",     e400110, 1, (RR),            rd),
17568  cCE("rfc",     e500110, 1, (RR),            rd),
17569
17570  cCL("ldfs",    c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17571  cCL("ldfd",    c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17572  cCL("ldfe",    c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17573  cCL("ldfp",    c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17574
17575  cCL("stfs",    c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17576  cCL("stfd",    c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17577  cCL("stfe",    c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17578  cCL("stfp",    c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17579
17580  cCL("mvfs",    e008100, 2, (RF, RF_IF),     rd_rm),
17581  cCL("mvfsp",   e008120, 2, (RF, RF_IF),     rd_rm),
17582  cCL("mvfsm",   e008140, 2, (RF, RF_IF),     rd_rm),
17583  cCL("mvfsz",   e008160, 2, (RF, RF_IF),     rd_rm),
17584  cCL("mvfd",    e008180, 2, (RF, RF_IF),     rd_rm),
17585  cCL("mvfdp",   e0081a0, 2, (RF, RF_IF),     rd_rm),
17586  cCL("mvfdm",   e0081c0, 2, (RF, RF_IF),     rd_rm),
17587  cCL("mvfdz",   e0081e0, 2, (RF, RF_IF),     rd_rm),
17588  cCL("mvfe",    e088100, 2, (RF, RF_IF),     rd_rm),
17589  cCL("mvfep",   e088120, 2, (RF, RF_IF),     rd_rm),
17590  cCL("mvfem",   e088140, 2, (RF, RF_IF),     rd_rm),
17591  cCL("mvfez",   e088160, 2, (RF, RF_IF),     rd_rm),
17592
17593  cCL("mnfs",    e108100, 2, (RF, RF_IF),     rd_rm),
17594  cCL("mnfsp",   e108120, 2, (RF, RF_IF),     rd_rm),
17595  cCL("mnfsm",   e108140, 2, (RF, RF_IF),     rd_rm),
17596  cCL("mnfsz",   e108160, 2, (RF, RF_IF),     rd_rm),
17597  cCL("mnfd",    e108180, 2, (RF, RF_IF),     rd_rm),
17598  cCL("mnfdp",   e1081a0, 2, (RF, RF_IF),     rd_rm),
17599  cCL("mnfdm",   e1081c0, 2, (RF, RF_IF),     rd_rm),
17600  cCL("mnfdz",   e1081e0, 2, (RF, RF_IF),     rd_rm),
17601  cCL("mnfe",    e188100, 2, (RF, RF_IF),     rd_rm),
17602  cCL("mnfep",   e188120, 2, (RF, RF_IF),     rd_rm),
17603  cCL("mnfem",   e188140, 2, (RF, RF_IF),     rd_rm),
17604  cCL("mnfez",   e188160, 2, (RF, RF_IF),     rd_rm),
17605
17606  cCL("abss",    e208100, 2, (RF, RF_IF),     rd_rm),
17607  cCL("abssp",   e208120, 2, (RF, RF_IF),     rd_rm),
17608  cCL("abssm",   e208140, 2, (RF, RF_IF),     rd_rm),
17609  cCL("abssz",   e208160, 2, (RF, RF_IF),     rd_rm),
17610  cCL("absd",    e208180, 2, (RF, RF_IF),     rd_rm),
17611  cCL("absdp",   e2081a0, 2, (RF, RF_IF),     rd_rm),
17612  cCL("absdm",   e2081c0, 2, (RF, RF_IF),     rd_rm),
17613  cCL("absdz",   e2081e0, 2, (RF, RF_IF),     rd_rm),
17614  cCL("abse",    e288100, 2, (RF, RF_IF),     rd_rm),
17615  cCL("absep",   e288120, 2, (RF, RF_IF),     rd_rm),
17616  cCL("absem",   e288140, 2, (RF, RF_IF),     rd_rm),
17617  cCL("absez",   e288160, 2, (RF, RF_IF),     rd_rm),
17618
17619  cCL("rnds",    e308100, 2, (RF, RF_IF),     rd_rm),
17620  cCL("rndsp",   e308120, 2, (RF, RF_IF),     rd_rm),
17621  cCL("rndsm",   e308140, 2, (RF, RF_IF),     rd_rm),
17622  cCL("rndsz",   e308160, 2, (RF, RF_IF),     rd_rm),
17623  cCL("rndd",    e308180, 2, (RF, RF_IF),     rd_rm),
17624  cCL("rnddp",   e3081a0, 2, (RF, RF_IF),     rd_rm),
17625  cCL("rnddm",   e3081c0, 2, (RF, RF_IF),     rd_rm),
17626  cCL("rnddz",   e3081e0, 2, (RF, RF_IF),     rd_rm),
17627  cCL("rnde",    e388100, 2, (RF, RF_IF),     rd_rm),
17628  cCL("rndep",   e388120, 2, (RF, RF_IF),     rd_rm),
17629  cCL("rndem",   e388140, 2, (RF, RF_IF),     rd_rm),
17630  cCL("rndez",   e388160, 2, (RF, RF_IF),     rd_rm),
17631
17632  cCL("sqts",    e408100, 2, (RF, RF_IF),     rd_rm),
17633  cCL("sqtsp",   e408120, 2, (RF, RF_IF),     rd_rm),
17634  cCL("sqtsm",   e408140, 2, (RF, RF_IF),     rd_rm),
17635  cCL("sqtsz",   e408160, 2, (RF, RF_IF),     rd_rm),
17636  cCL("sqtd",    e408180, 2, (RF, RF_IF),     rd_rm),
17637  cCL("sqtdp",   e4081a0, 2, (RF, RF_IF),     rd_rm),
17638  cCL("sqtdm",   e4081c0, 2, (RF, RF_IF),     rd_rm),
17639  cCL("sqtdz",   e4081e0, 2, (RF, RF_IF),     rd_rm),
17640  cCL("sqte",    e488100, 2, (RF, RF_IF),     rd_rm),
17641  cCL("sqtep",   e488120, 2, (RF, RF_IF),     rd_rm),
17642  cCL("sqtem",   e488140, 2, (RF, RF_IF),     rd_rm),
17643  cCL("sqtez",   e488160, 2, (RF, RF_IF),     rd_rm),
17644
17645  cCL("logs",    e508100, 2, (RF, RF_IF),     rd_rm),
17646  cCL("logsp",   e508120, 2, (RF, RF_IF),     rd_rm),
17647  cCL("logsm",   e508140, 2, (RF, RF_IF),     rd_rm),
17648  cCL("logsz",   e508160, 2, (RF, RF_IF),     rd_rm),
17649  cCL("logd",    e508180, 2, (RF, RF_IF),     rd_rm),
17650  cCL("logdp",   e5081a0, 2, (RF, RF_IF),     rd_rm),
17651  cCL("logdm",   e5081c0, 2, (RF, RF_IF),     rd_rm),
17652  cCL("logdz",   e5081e0, 2, (RF, RF_IF),     rd_rm),
17653  cCL("loge",    e588100, 2, (RF, RF_IF),     rd_rm),
17654  cCL("logep",   e588120, 2, (RF, RF_IF),     rd_rm),
17655  cCL("logem",   e588140, 2, (RF, RF_IF),     rd_rm),
17656  cCL("logez",   e588160, 2, (RF, RF_IF),     rd_rm),
17657
17658  cCL("lgns",    e608100, 2, (RF, RF_IF),     rd_rm),
17659  cCL("lgnsp",   e608120, 2, (RF, RF_IF),     rd_rm),
17660  cCL("lgnsm",   e608140, 2, (RF, RF_IF),     rd_rm),
17661  cCL("lgnsz",   e608160, 2, (RF, RF_IF),     rd_rm),
17662  cCL("lgnd",    e608180, 2, (RF, RF_IF),     rd_rm),
17663  cCL("lgndp",   e6081a0, 2, (RF, RF_IF),     rd_rm),
17664  cCL("lgndm",   e6081c0, 2, (RF, RF_IF),     rd_rm),
17665  cCL("lgndz",   e6081e0, 2, (RF, RF_IF),     rd_rm),
17666  cCL("lgne",    e688100, 2, (RF, RF_IF),     rd_rm),
17667  cCL("lgnep",   e688120, 2, (RF, RF_IF),     rd_rm),
17668  cCL("lgnem",   e688140, 2, (RF, RF_IF),     rd_rm),
17669  cCL("lgnez",   e688160, 2, (RF, RF_IF),     rd_rm),
17670
17671  cCL("exps",    e708100, 2, (RF, RF_IF),     rd_rm),
17672  cCL("expsp",   e708120, 2, (RF, RF_IF),     rd_rm),
17673  cCL("expsm",   e708140, 2, (RF, RF_IF),     rd_rm),
17674  cCL("expsz",   e708160, 2, (RF, RF_IF),     rd_rm),
17675  cCL("expd",    e708180, 2, (RF, RF_IF),     rd_rm),
17676  cCL("expdp",   e7081a0, 2, (RF, RF_IF),     rd_rm),
17677  cCL("expdm",   e7081c0, 2, (RF, RF_IF),     rd_rm),
17678  cCL("expdz",   e7081e0, 2, (RF, RF_IF),     rd_rm),
17679  cCL("expe",    e788100, 2, (RF, RF_IF),     rd_rm),
17680  cCL("expep",   e788120, 2, (RF, RF_IF),     rd_rm),
17681  cCL("expem",   e788140, 2, (RF, RF_IF),     rd_rm),
17682  cCL("expdz",   e788160, 2, (RF, RF_IF),     rd_rm),
17683
17684  cCL("sins",    e808100, 2, (RF, RF_IF),     rd_rm),
17685  cCL("sinsp",   e808120, 2, (RF, RF_IF),     rd_rm),
17686  cCL("sinsm",   e808140, 2, (RF, RF_IF),     rd_rm),
17687  cCL("sinsz",   e808160, 2, (RF, RF_IF),     rd_rm),
17688  cCL("sind",    e808180, 2, (RF, RF_IF),     rd_rm),
17689  cCL("sindp",   e8081a0, 2, (RF, RF_IF),     rd_rm),
17690  cCL("sindm",   e8081c0, 2, (RF, RF_IF),     rd_rm),
17691  cCL("sindz",   e8081e0, 2, (RF, RF_IF),     rd_rm),
17692  cCL("sine",    e888100, 2, (RF, RF_IF),     rd_rm),
17693  cCL("sinep",   e888120, 2, (RF, RF_IF),     rd_rm),
17694  cCL("sinem",   e888140, 2, (RF, RF_IF),     rd_rm),
17695  cCL("sinez",   e888160, 2, (RF, RF_IF),     rd_rm),
17696
17697  cCL("coss",    e908100, 2, (RF, RF_IF),     rd_rm),
17698  cCL("cossp",   e908120, 2, (RF, RF_IF),     rd_rm),
17699  cCL("cossm",   e908140, 2, (RF, RF_IF),     rd_rm),
17700  cCL("cossz",   e908160, 2, (RF, RF_IF),     rd_rm),
17701  cCL("cosd",    e908180, 2, (RF, RF_IF),     rd_rm),
17702  cCL("cosdp",   e9081a0, 2, (RF, RF_IF),     rd_rm),
17703  cCL("cosdm",   e9081c0, 2, (RF, RF_IF),     rd_rm),
17704  cCL("cosdz",   e9081e0, 2, (RF, RF_IF),     rd_rm),
17705  cCL("cose",    e988100, 2, (RF, RF_IF),     rd_rm),
17706  cCL("cosep",   e988120, 2, (RF, RF_IF),     rd_rm),
17707  cCL("cosem",   e988140, 2, (RF, RF_IF),     rd_rm),
17708  cCL("cosez",   e988160, 2, (RF, RF_IF),     rd_rm),
17709
17710  cCL("tans",    ea08100, 2, (RF, RF_IF),     rd_rm),
17711  cCL("tansp",   ea08120, 2, (RF, RF_IF),     rd_rm),
17712  cCL("tansm",   ea08140, 2, (RF, RF_IF),     rd_rm),
17713  cCL("tansz",   ea08160, 2, (RF, RF_IF),     rd_rm),
17714  cCL("tand",    ea08180, 2, (RF, RF_IF),     rd_rm),
17715  cCL("tandp",   ea081a0, 2, (RF, RF_IF),     rd_rm),
17716  cCL("tandm",   ea081c0, 2, (RF, RF_IF),     rd_rm),
17717  cCL("tandz",   ea081e0, 2, (RF, RF_IF),     rd_rm),
17718  cCL("tane",    ea88100, 2, (RF, RF_IF),     rd_rm),
17719  cCL("tanep",   ea88120, 2, (RF, RF_IF),     rd_rm),
17720  cCL("tanem",   ea88140, 2, (RF, RF_IF),     rd_rm),
17721  cCL("tanez",   ea88160, 2, (RF, RF_IF),     rd_rm),
17722
17723  cCL("asns",    eb08100, 2, (RF, RF_IF),     rd_rm),
17724  cCL("asnsp",   eb08120, 2, (RF, RF_IF),     rd_rm),
17725  cCL("asnsm",   eb08140, 2, (RF, RF_IF),     rd_rm),
17726  cCL("asnsz",   eb08160, 2, (RF, RF_IF),     rd_rm),
17727  cCL("asnd",    eb08180, 2, (RF, RF_IF),     rd_rm),
17728  cCL("asndp",   eb081a0, 2, (RF, RF_IF),     rd_rm),
17729  cCL("asndm",   eb081c0, 2, (RF, RF_IF),     rd_rm),
17730  cCL("asndz",   eb081e0, 2, (RF, RF_IF),     rd_rm),
17731  cCL("asne",    eb88100, 2, (RF, RF_IF),     rd_rm),
17732  cCL("asnep",   eb88120, 2, (RF, RF_IF),     rd_rm),
17733  cCL("asnem",   eb88140, 2, (RF, RF_IF),     rd_rm),
17734  cCL("asnez",   eb88160, 2, (RF, RF_IF),     rd_rm),
17735
17736  cCL("acss",    ec08100, 2, (RF, RF_IF),     rd_rm),
17737  cCL("acssp",   ec08120, 2, (RF, RF_IF),     rd_rm),
17738  cCL("acssm",   ec08140, 2, (RF, RF_IF),     rd_rm),
17739  cCL("acssz",   ec08160, 2, (RF, RF_IF),     rd_rm),
17740  cCL("acsd",    ec08180, 2, (RF, RF_IF),     rd_rm),
17741  cCL("acsdp",   ec081a0, 2, (RF, RF_IF),     rd_rm),
17742  cCL("acsdm",   ec081c0, 2, (RF, RF_IF),     rd_rm),
17743  cCL("acsdz",   ec081e0, 2, (RF, RF_IF),     rd_rm),
17744  cCL("acse",    ec88100, 2, (RF, RF_IF),     rd_rm),
17745  cCL("acsep",   ec88120, 2, (RF, RF_IF),     rd_rm),
17746  cCL("acsem",   ec88140, 2, (RF, RF_IF),     rd_rm),
17747  cCL("acsez",   ec88160, 2, (RF, RF_IF),     rd_rm),
17748
17749  cCL("atns",    ed08100, 2, (RF, RF_IF),     rd_rm),
17750  cCL("atnsp",   ed08120, 2, (RF, RF_IF),     rd_rm),
17751  cCL("atnsm",   ed08140, 2, (RF, RF_IF),     rd_rm),
17752  cCL("atnsz",   ed08160, 2, (RF, RF_IF),     rd_rm),
17753  cCL("atnd",    ed08180, 2, (RF, RF_IF),     rd_rm),
17754  cCL("atndp",   ed081a0, 2, (RF, RF_IF),     rd_rm),
17755  cCL("atndm",   ed081c0, 2, (RF, RF_IF),     rd_rm),
17756  cCL("atndz",   ed081e0, 2, (RF, RF_IF),     rd_rm),
17757  cCL("atne",    ed88100, 2, (RF, RF_IF),     rd_rm),
17758  cCL("atnep",   ed88120, 2, (RF, RF_IF),     rd_rm),
17759  cCL("atnem",   ed88140, 2, (RF, RF_IF),     rd_rm),
17760  cCL("atnez",   ed88160, 2, (RF, RF_IF),     rd_rm),
17761
17762  cCL("urds",    ee08100, 2, (RF, RF_IF),     rd_rm),
17763  cCL("urdsp",   ee08120, 2, (RF, RF_IF),     rd_rm),
17764  cCL("urdsm",   ee08140, 2, (RF, RF_IF),     rd_rm),
17765  cCL("urdsz",   ee08160, 2, (RF, RF_IF),     rd_rm),
17766  cCL("urdd",    ee08180, 2, (RF, RF_IF),     rd_rm),
17767  cCL("urddp",   ee081a0, 2, (RF, RF_IF),     rd_rm),
17768  cCL("urddm",   ee081c0, 2, (RF, RF_IF),     rd_rm),
17769  cCL("urddz",   ee081e0, 2, (RF, RF_IF),     rd_rm),
17770  cCL("urde",    ee88100, 2, (RF, RF_IF),     rd_rm),
17771  cCL("urdep",   ee88120, 2, (RF, RF_IF),     rd_rm),
17772  cCL("urdem",   ee88140, 2, (RF, RF_IF),     rd_rm),
17773  cCL("urdez",   ee88160, 2, (RF, RF_IF),     rd_rm),
17774
17775  cCL("nrms",    ef08100, 2, (RF, RF_IF),     rd_rm),
17776  cCL("nrmsp",   ef08120, 2, (RF, RF_IF),     rd_rm),
17777  cCL("nrmsm",   ef08140, 2, (RF, RF_IF),     rd_rm),
17778  cCL("nrmsz",   ef08160, 2, (RF, RF_IF),     rd_rm),
17779  cCL("nrmd",    ef08180, 2, (RF, RF_IF),     rd_rm),
17780  cCL("nrmdp",   ef081a0, 2, (RF, RF_IF),     rd_rm),
17781  cCL("nrmdm",   ef081c0, 2, (RF, RF_IF),     rd_rm),
17782  cCL("nrmdz",   ef081e0, 2, (RF, RF_IF),     rd_rm),
17783  cCL("nrme",    ef88100, 2, (RF, RF_IF),     rd_rm),
17784  cCL("nrmep",   ef88120, 2, (RF, RF_IF),     rd_rm),
17785  cCL("nrmem",   ef88140, 2, (RF, RF_IF),     rd_rm),
17786  cCL("nrmez",   ef88160, 2, (RF, RF_IF),     rd_rm),
17787
17788  cCL("adfs",    e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
17789  cCL("adfsp",   e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
17790  cCL("adfsm",   e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
17791  cCL("adfsz",   e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
17792  cCL("adfd",    e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
17793  cCL("adfdp",   e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17794  cCL("adfdm",   e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17795  cCL("adfdz",   e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17796  cCL("adfe",    e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
17797  cCL("adfep",   e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
17798  cCL("adfem",   e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
17799  cCL("adfez",   e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
17800
17801  cCL("sufs",    e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
17802  cCL("sufsp",   e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
17803  cCL("sufsm",   e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
17804  cCL("sufsz",   e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
17805  cCL("sufd",    e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
17806  cCL("sufdp",   e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17807  cCL("sufdm",   e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17808  cCL("sufdz",   e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17809  cCL("sufe",    e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
17810  cCL("sufep",   e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
17811  cCL("sufem",   e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
17812  cCL("sufez",   e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
17813
17814  cCL("rsfs",    e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
17815  cCL("rsfsp",   e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
17816  cCL("rsfsm",   e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
17817  cCL("rsfsz",   e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
17818  cCL("rsfd",    e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
17819  cCL("rsfdp",   e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17820  cCL("rsfdm",   e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17821  cCL("rsfdz",   e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17822  cCL("rsfe",    e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
17823  cCL("rsfep",   e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
17824  cCL("rsfem",   e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
17825  cCL("rsfez",   e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
17826
17827  cCL("mufs",    e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
17828  cCL("mufsp",   e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
17829  cCL("mufsm",   e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
17830  cCL("mufsz",   e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
17831  cCL("mufd",    e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
17832  cCL("mufdp",   e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17833  cCL("mufdm",   e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17834  cCL("mufdz",   e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17835  cCL("mufe",    e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
17836  cCL("mufep",   e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
17837  cCL("mufem",   e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
17838  cCL("mufez",   e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
17839
17840  cCL("dvfs",    e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
17841  cCL("dvfsp",   e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
17842  cCL("dvfsm",   e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
17843  cCL("dvfsz",   e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
17844  cCL("dvfd",    e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
17845  cCL("dvfdp",   e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17846  cCL("dvfdm",   e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17847  cCL("dvfdz",   e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17848  cCL("dvfe",    e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
17849  cCL("dvfep",   e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
17850  cCL("dvfem",   e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
17851  cCL("dvfez",   e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
17852
17853  cCL("rdfs",    e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
17854  cCL("rdfsp",   e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
17855  cCL("rdfsm",   e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
17856  cCL("rdfsz",   e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
17857  cCL("rdfd",    e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
17858  cCL("rdfdp",   e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17859  cCL("rdfdm",   e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17860  cCL("rdfdz",   e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17861  cCL("rdfe",    e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
17862  cCL("rdfep",   e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
17863  cCL("rdfem",   e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
17864  cCL("rdfez",   e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
17865
17866  cCL("pows",    e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
17867  cCL("powsp",   e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
17868  cCL("powsm",   e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
17869  cCL("powsz",   e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
17870  cCL("powd",    e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
17871  cCL("powdp",   e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17872  cCL("powdm",   e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17873  cCL("powdz",   e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17874  cCL("powe",    e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
17875  cCL("powep",   e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
17876  cCL("powem",   e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
17877  cCL("powez",   e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
17878
17879  cCL("rpws",    e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
17880  cCL("rpwsp",   e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
17881  cCL("rpwsm",   e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
17882  cCL("rpwsz",   e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
17883  cCL("rpwd",    e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
17884  cCL("rpwdp",   e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17885  cCL("rpwdm",   e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17886  cCL("rpwdz",   e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17887  cCL("rpwe",    e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
17888  cCL("rpwep",   e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
17889  cCL("rpwem",   e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
17890  cCL("rpwez",   e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
17891
17892  cCL("rmfs",    e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
17893  cCL("rmfsp",   e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
17894  cCL("rmfsm",   e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
17895  cCL("rmfsz",   e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
17896  cCL("rmfd",    e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
17897  cCL("rmfdp",   e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17898  cCL("rmfdm",   e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17899  cCL("rmfdz",   e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17900  cCL("rmfe",    e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
17901  cCL("rmfep",   e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
17902  cCL("rmfem",   e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
17903  cCL("rmfez",   e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
17904
17905  cCL("fmls",    e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
17906  cCL("fmlsp",   e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
17907  cCL("fmlsm",   e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
17908  cCL("fmlsz",   e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
17909  cCL("fmld",    e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
17910  cCL("fmldp",   e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17911  cCL("fmldm",   e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17912  cCL("fmldz",   e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17913  cCL("fmle",    e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
17914  cCL("fmlep",   e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
17915  cCL("fmlem",   e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
17916  cCL("fmlez",   e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
17917
17918  cCL("fdvs",    ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17919  cCL("fdvsp",   ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17920  cCL("fdvsm",   ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17921  cCL("fdvsz",   ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17922  cCL("fdvd",    ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17923  cCL("fdvdp",   ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17924  cCL("fdvdm",   ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17925  cCL("fdvdz",   ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17926  cCL("fdve",    ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17927  cCL("fdvep",   ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17928  cCL("fdvem",   ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17929  cCL("fdvez",   ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17930
17931  cCL("frds",    eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17932  cCL("frdsp",   eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17933  cCL("frdsm",   eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17934  cCL("frdsz",   eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17935  cCL("frdd",    eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17936  cCL("frddp",   eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17937  cCL("frddm",   eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17938  cCL("frddz",   eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17939  cCL("frde",    eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17940  cCL("frdep",   eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17941  cCL("frdem",   eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17942  cCL("frdez",   eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17943
17944  cCL("pols",    ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
17945  cCL("polsp",   ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
17946  cCL("polsm",   ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
17947  cCL("polsz",   ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
17948  cCL("pold",    ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
17949  cCL("poldp",   ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17950  cCL("poldm",   ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17951  cCL("poldz",   ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17952  cCL("pole",    ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
17953  cCL("polep",   ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
17954  cCL("polem",   ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
17955  cCL("polez",   ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
17956
17957  cCE("cmf",     e90f110, 2, (RF, RF_IF),     fpa_cmp),
17958  C3E("cmfe",    ed0f110, 2, (RF, RF_IF),     fpa_cmp),
17959  cCE("cnf",     eb0f110, 2, (RF, RF_IF),     fpa_cmp),
17960  C3E("cnfe",    ef0f110, 2, (RF, RF_IF),     fpa_cmp),
17961
17962  cCL("flts",    e000110, 2, (RF, RR),        rn_rd),
17963  cCL("fltsp",   e000130, 2, (RF, RR),        rn_rd),
17964  cCL("fltsm",   e000150, 2, (RF, RR),        rn_rd),
17965  cCL("fltsz",   e000170, 2, (RF, RR),        rn_rd),
17966  cCL("fltd",    e000190, 2, (RF, RR),        rn_rd),
17967  cCL("fltdp",   e0001b0, 2, (RF, RR),        rn_rd),
17968  cCL("fltdm",   e0001d0, 2, (RF, RR),        rn_rd),
17969  cCL("fltdz",   e0001f0, 2, (RF, RR),        rn_rd),
17970  cCL("flte",    e080110, 2, (RF, RR),        rn_rd),
17971  cCL("fltep",   e080130, 2, (RF, RR),        rn_rd),
17972  cCL("fltem",   e080150, 2, (RF, RR),        rn_rd),
17973  cCL("fltez",   e080170, 2, (RF, RR),        rn_rd),
17974
17975   /* The implementation of the FIX instruction is broken on some
17976      assemblers, in that it accepts a precision specifier as well as a
17977      rounding specifier, despite the fact that this is meaningless.
17978      To be more compatible, we accept it as well, though of course it
17979      does not set any bits.  */
17980  cCE("fix",     e100110, 2, (RR, RF),        rd_rm),
17981  cCL("fixp",    e100130, 2, (RR, RF),        rd_rm),
17982  cCL("fixm",    e100150, 2, (RR, RF),        rd_rm),
17983  cCL("fixz",    e100170, 2, (RR, RF),        rd_rm),
17984  cCL("fixsp",   e100130, 2, (RR, RF),        rd_rm),
17985  cCL("fixsm",   e100150, 2, (RR, RF),        rd_rm),
17986  cCL("fixsz",   e100170, 2, (RR, RF),        rd_rm),
17987  cCL("fixdp",   e100130, 2, (RR, RF),        rd_rm),
17988  cCL("fixdm",   e100150, 2, (RR, RF),        rd_rm),
17989  cCL("fixdz",   e100170, 2, (RR, RF),        rd_rm),
17990  cCL("fixep",   e100130, 2, (RR, RF),        rd_rm),
17991  cCL("fixem",   e100150, 2, (RR, RF),        rd_rm),
17992  cCL("fixez",   e100170, 2, (RR, RF),        rd_rm),
17993
17994   /* Instructions that were new with the real FPA, call them V2.  */
17995 #undef  ARM_VARIANT
17996 #define ARM_VARIANT  & fpu_fpa_ext_v2
17997
17998  cCE("lfm",     c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
17999  cCL("lfmfd",   c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18000  cCL("lfmea",   d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18001  cCE("sfm",     c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18002  cCL("sfmfd",   d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18003  cCL("sfmea",   c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18004
18005 #undef  ARM_VARIANT
18006 #define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
18007
18008   /* Moves and type conversions.  */
18009  cCE("fcpys",   eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
18010  cCE("fmrs",    e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
18011  cCE("fmsr",    e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
18012  cCE("fmstat",  ef1fa10, 0, (),               noargs),
18013  cCE("vmrs",    ef10a10, 2, (APSR_RR, RVC),   vmrs),
18014  cCE("vmsr",    ee10a10, 2, (RVC, RR),        vmsr),
18015  cCE("fsitos",  eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18016  cCE("fuitos",  eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
18017  cCE("ftosis",  ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
18018  cCE("ftosizs", ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18019  cCE("ftouis",  ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
18020  cCE("ftouizs", ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18021  cCE("fmrx",    ef00a10, 2, (RR, RVC),        rd_rn),
18022  cCE("fmxr",    ee00a10, 2, (RVC, RR),        rn_rd),
18023
18024   /* Memory operations.  */
18025  cCE("flds",    d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
18026  cCE("fsts",    d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
18027  cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
18028  cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
18029  cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
18030  cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
18031  cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
18032  cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
18033  cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
18034  cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
18035  cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
18036  cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
18037  cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
18038  cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
18039  cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
18040  cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
18041  cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
18042  cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
18043
18044   /* Monadic operations.  */
18045  cCE("fabss",   eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18046  cCE("fnegs",   eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
18047  cCE("fsqrts",  eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18048
18049   /* Dyadic operations.  */
18050  cCE("fadds",   e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18051  cCE("fsubs",   e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18052  cCE("fmuls",   e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18053  cCE("fdivs",   e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18054  cCE("fmacs",   e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18055  cCE("fmscs",   e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18056  cCE("fnmuls",  e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18057  cCE("fnmacs",  e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18058  cCE("fnmscs",  e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18059
18060   /* Comparisons.  */
18061  cCE("fcmps",   eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
18062  cCE("fcmpzs",  eb50a40, 1, (RVS),            vfp_sp_compare_z),
18063  cCE("fcmpes",  eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18064  cCE("fcmpezs", eb50ac0, 1, (RVS),            vfp_sp_compare_z),
18065
18066  /* Double precision load/store are still present on single precision
18067     implementations.  */
18068  cCE("fldd",    d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
18069  cCE("fstd",    d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
18070  cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
18071  cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
18072  cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
18073  cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
18074  cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
18075  cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
18076  cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
18077  cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
18078
18079 #undef  ARM_VARIANT
18080 #define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
18081
18082   /* Moves and type conversions.  */
18083  cCE("fcpyd",   eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
18084  cCE("fcvtds",  eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
18085  cCE("fcvtsd",  eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18086  cCE("fmdhr",   e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
18087  cCE("fmdlr",   e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
18088  cCE("fmrdh",   e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
18089  cCE("fmrdl",   e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
18090  cCE("fsitod",  eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
18091  cCE("fuitod",  eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
18092  cCE("ftosid",  ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18093  cCE("ftosizd", ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18094  cCE("ftouid",  ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18095  cCE("ftouizd", ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18096
18097   /* Monadic operations.  */
18098  cCE("fabsd",   eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
18099  cCE("fnegd",   eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
18100  cCE("fsqrtd",  eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
18101
18102   /* Dyadic operations.  */
18103  cCE("faddd",   e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18104  cCE("fsubd",   e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18105  cCE("fmuld",   e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18106  cCE("fdivd",   e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18107  cCE("fmacd",   e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18108  cCE("fmscd",   e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18109  cCE("fnmuld",  e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18110  cCE("fnmacd",  e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18111  cCE("fnmscd",  e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18112
18113   /* Comparisons.  */
18114  cCE("fcmpd",   eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
18115  cCE("fcmpzd",  eb50b40, 1, (RVD),            vfp_dp_rd),
18116  cCE("fcmped",  eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
18117  cCE("fcmpezd", eb50bc0, 1, (RVD),            vfp_dp_rd),
18118
18119 #undef  ARM_VARIANT
18120 #define ARM_VARIANT  & fpu_vfp_ext_v2
18121
18122  cCE("fmsrr",   c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
18123  cCE("fmrrs",   c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
18124  cCE("fmdrr",   c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
18125  cCE("fmrrd",   c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
18126
18127 /* Instructions which may belong to either the Neon or VFP instruction sets.
18128    Individual encoder functions perform additional architecture checks.  */
18129 #undef  ARM_VARIANT
18130 #define ARM_VARIANT    & fpu_vfp_ext_v1xd
18131 #undef  THUMB_VARIANT
18132 #define THUMB_VARIANT  & fpu_vfp_ext_v1xd
18133
18134   /* These mnemonics are unique to VFP.  */
18135  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
18136  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
18137  nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18138  nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18139  nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18140  nCE(vcmp,      _vcmp,    2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
18141  nCE(vcmpe,     _vcmpe,   2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
18142  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
18143  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
18144  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
18145
18146   /* Mnemonics shared by Neon and VFP.  */
18147  nCEF(vmul,     _vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
18148  nCEF(vmla,     _vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
18149  nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
18150
18151  nCEF(vadd,     _vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
18152  nCEF(vsub,     _vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
18153
18154  NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
18155  NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
18156
18157  NCE(vldm,      c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18158  NCE(vldmia,    c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18159  NCE(vldmdb,    d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18160  NCE(vstm,      c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18161  NCE(vstmia,    c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18162  NCE(vstmdb,    d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18163  NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
18164  NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
18165
18166  nCEF(vcvt,     _vcvt,   3, (RNSDQ, RNSDQ, oI32b), neon_cvt),
18167  nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
18168  nCEF(vcvtb,    _vcvt,   2, (RVS, RVS), neon_cvtb),
18169  nCEF(vcvtt,    _vcvt,   2, (RVS, RVS), neon_cvtt),
18170
18171
18172   /* NOTE: All VMOV encoding is special-cased!  */
18173  NCE(vmov,      0,       1, (VMOV), neon_mov),
18174  NCE(vmovq,     0,       1, (VMOV), neon_mov),
18175
18176 #undef  THUMB_VARIANT
18177 #define THUMB_VARIANT  & fpu_neon_ext_v1
18178 #undef  ARM_VARIANT
18179 #define ARM_VARIANT    & fpu_neon_ext_v1
18180
18181   /* Data processing with three registers of the same length.  */
18182   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
18183  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
18184  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
18185  NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18186  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
18187  NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18188  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
18189  NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18190  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
18191   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
18192  NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
18193  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
18194  NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
18195  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
18196  NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
18197  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
18198  NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
18199  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
18200   /* If not immediate, fall back to neon_dyadic_i64_su.
18201      shl_imm should accept I8 I16 I32 I64,
18202      qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
18203  nUF(vshl,      _vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
18204  nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
18205  nUF(vqshl,     _vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
18206  nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
18207   /* Logic ops, types optional & ignored.  */
18208  nUF(vand,      _vand,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18209  nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
18210  nUF(vbic,      _vbic,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18211  nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
18212  nUF(vorr,      _vorr,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18213  nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
18214  nUF(vorn,      _vorn,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18215  nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
18216  nUF(veor,      _veor,    3, (RNDQ, oRNDQ, RNDQ),      neon_logic),
18217  nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
18218   /* Bitfield ops, untyped.  */
18219  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18220  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
18221  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18222  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
18223  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18224  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
18225   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32.  */
18226  nUF(vabd,      _vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18227  nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
18228  nUF(vmax,      _vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18229  nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
18230  nUF(vmin,      _vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18231  nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
18232   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
18233      back to neon_dyadic_if_su.  */
18234  nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
18235  nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
18236  nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
18237  nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
18238  nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
18239  nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
18240  nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
18241  nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
18242   /* Comparison. Type I8 I16 I32 F32.  */
18243  nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
18244  nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
18245   /* As above, D registers only.  */
18246  nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
18247  nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
18248   /* Int and float variants, signedness unimportant.  */
18249  nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
18250  nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
18251  nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
18252   /* Add/sub take types I8 I16 I32 I64 F32.  */
18253  nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
18254  nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
18255   /* vtst takes sizes 8, 16, 32.  */
18256  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
18257  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
18258   /* VMUL takes I8 I16 I32 F32 P8.  */
18259  nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
18260   /* VQD{R}MULH takes S16 S32.  */
18261  nUF(vqdmulh,   _vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18262  nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
18263  nUF(vqrdmulh,  _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18264  nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
18265  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18266  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
18267  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18268  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
18269  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18270  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
18271  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18272  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
18273  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
18274  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
18275  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
18276  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
18277
18278   /* Two address, int/float. Types S8 S16 S32 F32.  */
18279  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
18280  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
18281
18282   /* Data processing with two registers and a shift amount.  */
18283   /* Right shifts, and variants with rounding.
18284      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
18285  NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18286  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
18287  NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18288  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
18289  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
18290  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
18291  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
18292  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
18293   /* Shift and insert. Sizes accepted 8 16 32 64.  */
18294  NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
18295  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
18296  NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
18297  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
18298   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
18299  NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
18300  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
18301   /* Right shift immediate, saturating & narrowing, with rounding variants.
18302      Types accepted S16 S32 S64 U16 U32 U64.  */
18303  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18304  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18305   /* As above, unsigned. Types accepted S16 S32 S64.  */
18306  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18307  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18308   /* Right shift narrowing. Types accepted I16 I32 I64.  */
18309  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18310  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18311   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
18312  nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
18313   /* CVT with optional immediate for fixed-point variant.  */
18314  nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
18315
18316  nUF(vmvn,      _vmvn,    2, (RNDQ, RNDQ_Ibig), neon_mvn),
18317  nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
18318
18319   /* Data processing, three registers of different lengths.  */
18320   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
18321  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
18322  NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
18323  NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
18324  NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
18325   /* If not scalar, fall back to neon_dyadic_long.
18326      Vector types as above, scalar types S16 S32 U16 U32.  */
18327  nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
18328  nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
18329   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
18330  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18331  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18332   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
18333  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18334  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18335  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18336  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18337   /* Saturating doubling multiplies. Types S16 S32.  */
18338  nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18339  nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18340  nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18341   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
18342      S16 S32 U16 U32.  */
18343  nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
18344
18345   /* Extract. Size 8.  */
18346  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
18347  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
18348
18349   /* Two registers, miscellaneous.  */
18350   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
18351  NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
18352  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
18353  NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
18354  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
18355  NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
18356  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
18357   /* Vector replicate. Sizes 8 16 32.  */
18358  nCE(vdup,      _vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
18359  nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
18360   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
18361  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
18362   /* VMOVN. Types I16 I32 I64.  */
18363  nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
18364   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
18365  nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
18366   /* VQMOVUN. Types S16 S32 S64.  */
18367  nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
18368   /* VZIP / VUZP. Sizes 8 16 32.  */
18369  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
18370  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
18371  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
18372  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
18373   /* VQABS / VQNEG. Types S8 S16 S32.  */
18374  NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
18375  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
18376  NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
18377  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
18378   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
18379  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
18380  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
18381  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
18382  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
18383   /* Reciprocal estimates. Types U32 F32.  */
18384  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
18385  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
18386  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
18387  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
18388   /* VCLS. Types S8 S16 S32.  */
18389  NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
18390  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
18391   /* VCLZ. Types I8 I16 I32.  */
18392  NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
18393  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
18394   /* VCNT. Size 8.  */
18395  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
18396  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
18397   /* Two address, untyped.  */
18398  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
18399  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
18400   /* VTRN. Sizes 8 16 32.  */
18401  nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
18402  nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
18403
18404   /* Table lookup. Size 8.  */
18405  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18406  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18407
18408 #undef  THUMB_VARIANT
18409 #define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
18410 #undef  ARM_VARIANT
18411 #define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
18412
18413   /* Neon element/structure load/store.  */
18414  nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18415  nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18416  nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18417  nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18418  nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18419  nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18420  nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18421  nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18422
18423 #undef  THUMB_VARIANT
18424 #define THUMB_VARIANT &fpu_vfp_ext_v3xd
18425 #undef ARM_VARIANT
18426 #define ARM_VARIANT &fpu_vfp_ext_v3xd
18427  cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
18428  cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18429  cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18430  cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18431  cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18432  cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18433  cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18434  cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18435  cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18436
18437 #undef THUMB_VARIANT
18438 #define THUMB_VARIANT  & fpu_vfp_ext_v3
18439 #undef  ARM_VARIANT
18440 #define ARM_VARIANT    & fpu_vfp_ext_v3
18441
18442  cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
18443  cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18444  cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18445  cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18446  cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18447  cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18448  cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18449  cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18450  cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18451
18452 #undef ARM_VARIANT
18453 #define ARM_VARIANT &fpu_vfp_ext_fma
18454 #undef THUMB_VARIANT
18455 #define THUMB_VARIANT &fpu_vfp_ext_fma
18456  /* Mnemonics shared by Neon and VFP.  These are included in the
18457     VFP FMA variant; NEON and VFP FMA always includes the NEON
18458     FMA instructions.  */
18459  nCEF(vfma,     _vfma,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18460  nCEF(vfms,     _vfms,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18461  /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
18462     the v form should always be used.  */
18463  cCE("ffmas",   ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18464  cCE("ffnmas",  ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18465  cCE("ffmad",   ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18466  cCE("ffnmad",  ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18467  nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18468  nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18469
18470 #undef THUMB_VARIANT
18471 #undef  ARM_VARIANT
18472 #define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
18473
18474  cCE("mia",     e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18475  cCE("miaph",   e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18476  cCE("miabb",   e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18477  cCE("miabt",   e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18478  cCE("miatb",   e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18479  cCE("miatt",   e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18480  cCE("mar",     c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
18481  cCE("mra",     c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
18482
18483 #undef  ARM_VARIANT
18484 #define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
18485
18486  cCE("tandcb",  e13f130, 1, (RR),                   iwmmxt_tandorc),
18487  cCE("tandch",  e53f130, 1, (RR),                   iwmmxt_tandorc),
18488  cCE("tandcw",  e93f130, 1, (RR),                   iwmmxt_tandorc),
18489  cCE("tbcstb",  e400010, 2, (RIWR, RR),             rn_rd),
18490  cCE("tbcsth",  e400050, 2, (RIWR, RR),             rn_rd),
18491  cCE("tbcstw",  e400090, 2, (RIWR, RR),             rn_rd),
18492  cCE("textrcb", e130170, 2, (RR, I7),               iwmmxt_textrc),
18493  cCE("textrch", e530170, 2, (RR, I7),               iwmmxt_textrc),
18494  cCE("textrcw", e930170, 2, (RR, I7),               iwmmxt_textrc),
18495  cCE("textrmub",        e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18496  cCE("textrmuh",        e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18497  cCE("textrmuw",        e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18498  cCE("textrmsb",        e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18499  cCE("textrmsh",        e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18500  cCE("textrmsw",        e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18501  cCE("tinsrb",  e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
18502  cCE("tinsrh",  e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
18503  cCE("tinsrw",  e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
18504  cCE("tmcr",    e000110, 2, (RIWC_RIWG, RR),        rn_rd),
18505  cCE("tmcrr",   c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
18506  cCE("tmia",    e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18507  cCE("tmiaph",  e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18508  cCE("tmiabb",  e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18509  cCE("tmiabt",  e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18510  cCE("tmiatb",  e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18511  cCE("tmiatt",  e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18512  cCE("tmovmskb",        e100030, 2, (RR, RIWR),             rd_rn),
18513  cCE("tmovmskh",        e500030, 2, (RR, RIWR),             rd_rn),
18514  cCE("tmovmskw",        e900030, 2, (RR, RIWR),             rd_rn),
18515  cCE("tmrc",    e100110, 2, (RR, RIWC_RIWG),        rd_rn),
18516  cCE("tmrrc",   c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
18517  cCE("torcb",   e13f150, 1, (RR),                   iwmmxt_tandorc),
18518  cCE("torch",   e53f150, 1, (RR),                   iwmmxt_tandorc),
18519  cCE("torcw",   e93f150, 1, (RR),                   iwmmxt_tandorc),
18520  cCE("waccb",   e0001c0, 2, (RIWR, RIWR),           rd_rn),
18521  cCE("wacch",   e4001c0, 2, (RIWR, RIWR),           rd_rn),
18522  cCE("waccw",   e8001c0, 2, (RIWR, RIWR),           rd_rn),
18523  cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18524  cCE("waddb",   e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18525  cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18526  cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18527  cCE("waddh",   e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18528  cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18529  cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18530  cCE("waddw",   e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18531  cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18532  cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
18533  cCE("walignr0",        e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18534  cCE("walignr1",        e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18535  cCE("walignr2",        ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18536  cCE("walignr3",        eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18537  cCE("wand",    e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18538  cCE("wandn",   e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18539  cCE("wavg2b",  e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18540  cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18541  cCE("wavg2h",  ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18542  cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18543  cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18544  cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18545  cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18546  cCE("wcmpgtub",        e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18547  cCE("wcmpgtuh",        e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18548  cCE("wcmpgtuw",        e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18549  cCE("wcmpgtsb",        e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18550  cCE("wcmpgtsh",        e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18551  cCE("wcmpgtsw",        eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18552  cCE("wldrb",   c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18553  cCE("wldrh",   c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18554  cCE("wldrw",   c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
18555  cCE("wldrd",   c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
18556  cCE("wmacs",   e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18557  cCE("wmacsz",  e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18558  cCE("wmacu",   e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18559  cCE("wmacuz",  e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18560  cCE("wmadds",  ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18561  cCE("wmaddu",  e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18562  cCE("wmaxsb",  e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18563  cCE("wmaxsh",  e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18564  cCE("wmaxsw",  ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18565  cCE("wmaxub",  e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18566  cCE("wmaxuh",  e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18567  cCE("wmaxuw",  e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18568  cCE("wminsb",  e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18569  cCE("wminsh",  e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18570  cCE("wminsw",  eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18571  cCE("wminub",  e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18572  cCE("wminuh",  e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18573  cCE("wminuw",  e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18574  cCE("wmov",    e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
18575  cCE("wmulsm",  e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18576  cCE("wmulsl",  e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18577  cCE("wmulum",  e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18578  cCE("wmulul",  e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18579  cCE("wor",     e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18580  cCE("wpackhss",        e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18581  cCE("wpackhus",        e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18582  cCE("wpackwss",        eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18583  cCE("wpackwus",        e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18584  cCE("wpackdss",        ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18585  cCE("wpackdus",        ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18586  cCE("wrorh",   e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18587  cCE("wrorhg",  e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18588  cCE("wrorw",   eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18589  cCE("wrorwg",  eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18590  cCE("wrord",   ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18591  cCE("wrordg",  ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18592  cCE("wsadb",   e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18593  cCE("wsadbz",  e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18594  cCE("wsadh",   e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18595  cCE("wsadhz",  e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18596  cCE("wshufh",  e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
18597  cCE("wsllh",   e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18598  cCE("wsllhg",  e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18599  cCE("wsllw",   e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18600  cCE("wsllwg",  e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18601  cCE("wslld",   ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18602  cCE("wslldg",  ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18603  cCE("wsrah",   e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18604  cCE("wsrahg",  e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18605  cCE("wsraw",   e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18606  cCE("wsrawg",  e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18607  cCE("wsrad",   ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18608  cCE("wsradg",  ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18609  cCE("wsrlh",   e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18610  cCE("wsrlhg",  e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18611  cCE("wsrlw",   ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18612  cCE("wsrlwg",  ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18613  cCE("wsrld",   ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18614  cCE("wsrldg",  ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18615  cCE("wstrb",   c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18616  cCE("wstrh",   c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18617  cCE("wstrw",   c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
18618  cCE("wstrd",   c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
18619  cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18620  cCE("wsubb",   e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18621  cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18622  cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18623  cCE("wsubh",   e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18624  cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18625  cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18626  cCE("wsubw",   e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18627  cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18628  cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),         rd_rn),
18629  cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),         rd_rn),
18630  cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),         rd_rn),
18631  cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),         rd_rn),
18632  cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),         rd_rn),
18633  cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),         rd_rn),
18634  cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18635  cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18636  cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18637  cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),         rd_rn),
18638  cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),         rd_rn),
18639  cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),         rd_rn),
18640  cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),         rd_rn),
18641  cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),         rd_rn),
18642  cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),         rd_rn),
18643  cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18644  cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18645  cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18646  cCE("wxor",    e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18647  cCE("wzero",   e300000, 1, (RIWR),                 iwmmxt_wzero),
18648
18649 #undef  ARM_VARIANT
18650 #define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
18651
18652  cCE("torvscb",   e12f190, 1, (RR),                 iwmmxt_tandorc),
18653  cCE("torvsch",   e52f190, 1, (RR),                 iwmmxt_tandorc),
18654  cCE("torvscw",   e92f190, 1, (RR),                 iwmmxt_tandorc),
18655  cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
18656  cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
18657  cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
18658  cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18659  cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18660  cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18661  cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18662  cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18663  cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18664  cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18665  cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18666  cCE("wavg4",   e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18667  cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18668  cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18669  cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18670  cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18671  cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18672  cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
18673  cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18674  cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18675  cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18676  cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18677  cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18678  cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18679  cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18680  cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18681  cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18682  cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18683  cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18684  cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18685  cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18686  cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18687  cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18688  cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18689  cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18690  cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18691  cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18692  cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18693  cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18694  cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18695  cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18696  cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18697  cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18698  cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18699  cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18700  cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18701  cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18702  cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18703  cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18704  cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18705  cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18706  cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18707  cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18708  cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18709
18710 #undef  ARM_VARIANT
18711 #define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
18712
18713  cCE("cfldrs",  c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
18714  cCE("cfldrd",  c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
18715  cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
18716  cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
18717  cCE("cfstrs",  c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
18718  cCE("cfstrd",  c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
18719  cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
18720  cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
18721  cCE("cfmvsr",  e000450, 2, (RMF, RR),                rn_rd),
18722  cCE("cfmvrs",  e100450, 2, (RR, RMF),                rd_rn),
18723  cCE("cfmvdlr", e000410, 2, (RMD, RR),                rn_rd),
18724  cCE("cfmvrdl", e100410, 2, (RR, RMD),                rd_rn),
18725  cCE("cfmvdhr", e000430, 2, (RMD, RR),                rn_rd),
18726  cCE("cfmvrdh", e100430, 2, (RR, RMD),                rd_rn),
18727  cCE("cfmv64lr",        e000510, 2, (RMDX, RR),               rn_rd),
18728  cCE("cfmvr64l",        e100510, 2, (RR, RMDX),               rd_rn),
18729  cCE("cfmv64hr",        e000530, 2, (RMDX, RR),               rn_rd),
18730  cCE("cfmvr64h",        e100530, 2, (RR, RMDX),               rd_rn),
18731  cCE("cfmval32",        e200440, 2, (RMAX, RMFX),             rd_rn),
18732  cCE("cfmv32al",        e100440, 2, (RMFX, RMAX),             rd_rn),
18733  cCE("cfmvam32",        e200460, 2, (RMAX, RMFX),             rd_rn),
18734  cCE("cfmv32am",        e100460, 2, (RMFX, RMAX),             rd_rn),
18735  cCE("cfmvah32",        e200480, 2, (RMAX, RMFX),             rd_rn),
18736  cCE("cfmv32ah",        e100480, 2, (RMFX, RMAX),             rd_rn),
18737  cCE("cfmva32", e2004a0, 2, (RMAX, RMFX),             rd_rn),
18738  cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX),             rd_rn),
18739  cCE("cfmva64", e2004c0, 2, (RMAX, RMDX),             rd_rn),
18740  cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX),             rd_rn),
18741  cCE("cfmvsc32",        e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
18742  cCE("cfmv32sc",        e1004e0, 2, (RMDX, RMDS),             rd),
18743  cCE("cfcpys",  e000400, 2, (RMF, RMF),               rd_rn),
18744  cCE("cfcpyd",  e000420, 2, (RMD, RMD),               rd_rn),
18745  cCE("cfcvtsd", e000460, 2, (RMD, RMF),               rd_rn),
18746  cCE("cfcvtds", e000440, 2, (RMF, RMD),               rd_rn),
18747  cCE("cfcvt32s",        e000480, 2, (RMF, RMFX),              rd_rn),
18748  cCE("cfcvt32d",        e0004a0, 2, (RMD, RMFX),              rd_rn),
18749  cCE("cfcvt64s",        e0004c0, 2, (RMF, RMDX),              rd_rn),
18750  cCE("cfcvt64d",        e0004e0, 2, (RMD, RMDX),              rd_rn),
18751  cCE("cfcvts32",        e100580, 2, (RMFX, RMF),              rd_rn),
18752  cCE("cfcvtd32",        e1005a0, 2, (RMFX, RMD),              rd_rn),
18753  cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),            rd_rn),
18754  cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),            rd_rn),
18755  cCE("cfrshl32",        e000550, 3, (RMFX, RMFX, RR),         mav_triple),
18756  cCE("cfrshl64",        e000570, 3, (RMDX, RMDX, RR),         mav_triple),
18757  cCE("cfsh32",  e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
18758  cCE("cfsh64",  e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
18759  cCE("cfcmps",  e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
18760  cCE("cfcmpd",  e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
18761  cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
18762  cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
18763  cCE("cfabss",  e300400, 2, (RMF, RMF),               rd_rn),
18764  cCE("cfabsd",  e300420, 2, (RMD, RMD),               rd_rn),
18765  cCE("cfnegs",  e300440, 2, (RMF, RMF),               rd_rn),
18766  cCE("cfnegd",  e300460, 2, (RMD, RMD),               rd_rn),
18767  cCE("cfadds",  e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
18768  cCE("cfaddd",  e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
18769  cCE("cfsubs",  e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
18770  cCE("cfsubd",  e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
18771  cCE("cfmuls",  e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
18772  cCE("cfmuld",  e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
18773  cCE("cfabs32", e300500, 2, (RMFX, RMFX),             rd_rn),
18774  cCE("cfabs64", e300520, 2, (RMDX, RMDX),             rd_rn),
18775  cCE("cfneg32", e300540, 2, (RMFX, RMFX),             rd_rn),
18776  cCE("cfneg64", e300560, 2, (RMDX, RMDX),             rd_rn),
18777  cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18778  cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18779  cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18780  cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18781  cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18782  cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18783  cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18784  cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18785  cCE("cfmadd32",        e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18786  cCE("cfmsub32",        e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18787  cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
18788  cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
18789 };
18790 #undef ARM_VARIANT
18791 #undef THUMB_VARIANT
18792 #undef TCE
18793 #undef TCM
18794 #undef TUE
18795 #undef TUF
18796 #undef TCC
18797 #undef cCE
18798 #undef cCL
18799 #undef C3E
18800 #undef CE
18801 #undef CM
18802 #undef UE
18803 #undef UF
18804 #undef UT
18805 #undef NUF
18806 #undef nUF
18807 #undef NCE
18808 #undef nCE
18809 #undef OPS0
18810 #undef OPS1
18811 #undef OPS2
18812 #undef OPS3
18813 #undef OPS4
18814 #undef OPS5
18815 #undef OPS6
18816 #undef do_0
18817 \f
18818 /* MD interface: bits in the object file.  */
18819
18820 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
18821    for use in the a.out file, and stores them in the array pointed to by buf.
18822    This knows about the endian-ness of the target machine and does
18823    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
18824    2 (short) and 4 (long)  Floating numbers are put out as a series of
18825    LITTLENUMS (shorts, here at least).  */
18826
18827 void
18828 md_number_to_chars (char * buf, valueT val, int n)
18829 {
18830   if (target_big_endian)
18831     number_to_chars_bigendian (buf, val, n);
18832   else
18833     number_to_chars_littleendian (buf, val, n);
18834 }
18835
18836 static valueT
18837 md_chars_to_number (char * buf, int n)
18838 {
18839   valueT result = 0;
18840   unsigned char * where = (unsigned char *) buf;
18841
18842   if (target_big_endian)
18843     {
18844       while (n--)
18845         {
18846           result <<= 8;
18847           result |= (*where++ & 255);
18848         }
18849     }
18850   else
18851     {
18852       while (n--)
18853         {
18854           result <<= 8;
18855           result |= (where[n] & 255);
18856         }
18857     }
18858
18859   return result;
18860 }
18861
18862 /* MD interface: Sections.  */
18863
18864 /* Estimate the size of a frag before relaxing.  Assume everything fits in
18865    2 bytes.  */
18866
18867 int
18868 md_estimate_size_before_relax (fragS * fragp,
18869                                segT    segtype ATTRIBUTE_UNUSED)
18870 {
18871   fragp->fr_var = 2;
18872   return 2;
18873 }
18874
18875 /* Convert a machine dependent frag.  */
18876
18877 void
18878 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
18879 {
18880   unsigned long insn;
18881   unsigned long old_op;
18882   char *buf;
18883   expressionS exp;
18884   fixS *fixp;
18885   int reloc_type;
18886   int pc_rel;
18887   int opcode;
18888
18889   buf = fragp->fr_literal + fragp->fr_fix;
18890
18891   old_op = bfd_get_16(abfd, buf);
18892   if (fragp->fr_symbol)
18893     {
18894       exp.X_op = O_symbol;
18895       exp.X_add_symbol = fragp->fr_symbol;
18896     }
18897   else
18898     {
18899       exp.X_op = O_constant;
18900     }
18901   exp.X_add_number = fragp->fr_offset;
18902   opcode = fragp->fr_subtype;
18903   switch (opcode)
18904     {
18905     case T_MNEM_ldr_pc:
18906     case T_MNEM_ldr_pc2:
18907     case T_MNEM_ldr_sp:
18908     case T_MNEM_str_sp:
18909     case T_MNEM_ldr:
18910     case T_MNEM_ldrb:
18911     case T_MNEM_ldrh:
18912     case T_MNEM_str:
18913     case T_MNEM_strb:
18914     case T_MNEM_strh:
18915       if (fragp->fr_var == 4)
18916         {
18917           insn = THUMB_OP32 (opcode);
18918           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
18919             {
18920               insn |= (old_op & 0x700) << 4;
18921             }
18922           else
18923             {
18924               insn |= (old_op & 7) << 12;
18925               insn |= (old_op & 0x38) << 13;
18926             }
18927           insn |= 0x00000c00;
18928           put_thumb32_insn (buf, insn);
18929           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
18930         }
18931       else
18932         {
18933           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
18934         }
18935       pc_rel = (opcode == T_MNEM_ldr_pc2);
18936       break;
18937     case T_MNEM_adr:
18938       if (fragp->fr_var == 4)
18939         {
18940           insn = THUMB_OP32 (opcode);
18941           insn |= (old_op & 0xf0) << 4;
18942           put_thumb32_insn (buf, insn);
18943           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
18944         }
18945       else
18946         {
18947           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
18948           exp.X_add_number -= 4;
18949         }
18950       pc_rel = 1;
18951       break;
18952     case T_MNEM_mov:
18953     case T_MNEM_movs:
18954     case T_MNEM_cmp:
18955     case T_MNEM_cmn:
18956       if (fragp->fr_var == 4)
18957         {
18958           int r0off = (opcode == T_MNEM_mov
18959                        || opcode == T_MNEM_movs) ? 0 : 8;
18960           insn = THUMB_OP32 (opcode);
18961           insn = (insn & 0xe1ffffff) | 0x10000000;
18962           insn |= (old_op & 0x700) << r0off;
18963           put_thumb32_insn (buf, insn);
18964           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
18965         }
18966       else
18967         {
18968           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
18969         }
18970       pc_rel = 0;
18971       break;
18972     case T_MNEM_b:
18973       if (fragp->fr_var == 4)
18974         {
18975           insn = THUMB_OP32(opcode);
18976           put_thumb32_insn (buf, insn);
18977           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
18978         }
18979       else
18980         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
18981       pc_rel = 1;
18982       break;
18983     case T_MNEM_bcond:
18984       if (fragp->fr_var == 4)
18985         {
18986           insn = THUMB_OP32(opcode);
18987           insn |= (old_op & 0xf00) << 14;
18988           put_thumb32_insn (buf, insn);
18989           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
18990         }
18991       else
18992         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
18993       pc_rel = 1;
18994       break;
18995     case T_MNEM_add_sp:
18996     case T_MNEM_add_pc:
18997     case T_MNEM_inc_sp:
18998     case T_MNEM_dec_sp:
18999       if (fragp->fr_var == 4)
19000         {
19001           /* ??? Choose between add and addw.  */
19002           insn = THUMB_OP32 (opcode);
19003           insn |= (old_op & 0xf0) << 4;
19004           put_thumb32_insn (buf, insn);
19005           if (opcode == T_MNEM_add_pc)
19006             reloc_type = BFD_RELOC_ARM_T32_IMM12;
19007           else
19008             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
19009         }
19010       else
19011         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19012       pc_rel = 0;
19013       break;
19014
19015     case T_MNEM_addi:
19016     case T_MNEM_addis:
19017     case T_MNEM_subi:
19018     case T_MNEM_subis:
19019       if (fragp->fr_var == 4)
19020         {
19021           insn = THUMB_OP32 (opcode);
19022           insn |= (old_op & 0xf0) << 4;
19023           insn |= (old_op & 0xf) << 16;
19024           put_thumb32_insn (buf, insn);
19025           if (insn & (1 << 20))
19026             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
19027           else
19028             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
19029         }
19030       else
19031         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19032       pc_rel = 0;
19033       break;
19034     default:
19035       abort ();
19036     }
19037   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
19038                       (enum bfd_reloc_code_real) reloc_type);
19039   fixp->fx_file = fragp->fr_file;
19040   fixp->fx_line = fragp->fr_line;
19041   fragp->fr_fix += fragp->fr_var;
19042 }
19043
19044 /* Return the size of a relaxable immediate operand instruction.
19045    SHIFT and SIZE specify the form of the allowable immediate.  */
19046 static int
19047 relax_immediate (fragS *fragp, int size, int shift)
19048 {
19049   offsetT offset;
19050   offsetT mask;
19051   offsetT low;
19052
19053   /* ??? Should be able to do better than this.  */
19054   if (fragp->fr_symbol)
19055     return 4;
19056
19057   low = (1 << shift) - 1;
19058   mask = (1 << (shift + size)) - (1 << shift);
19059   offset = fragp->fr_offset;
19060   /* Force misaligned offsets to 32-bit variant.  */
19061   if (offset & low)
19062     return 4;
19063   if (offset & ~mask)
19064     return 4;
19065   return 2;
19066 }
19067
19068 /* Get the address of a symbol during relaxation.  */
19069 static addressT
19070 relaxed_symbol_addr (fragS *fragp, long stretch)
19071 {
19072   fragS *sym_frag;
19073   addressT addr;
19074   symbolS *sym;
19075
19076   sym = fragp->fr_symbol;
19077   sym_frag = symbol_get_frag (sym);
19078   know (S_GET_SEGMENT (sym) != absolute_section
19079         || sym_frag == &zero_address_frag);
19080   addr = S_GET_VALUE (sym) + fragp->fr_offset;
19081
19082   /* If frag has yet to be reached on this pass, assume it will
19083      move by STRETCH just as we did.  If this is not so, it will
19084      be because some frag between grows, and that will force
19085      another pass.  */
19086
19087   if (stretch != 0
19088       && sym_frag->relax_marker != fragp->relax_marker)
19089     {
19090       fragS *f;
19091
19092       /* Adjust stretch for any alignment frag.  Note that if have
19093          been expanding the earlier code, the symbol may be
19094          defined in what appears to be an earlier frag.  FIXME:
19095          This doesn't handle the fr_subtype field, which specifies
19096          a maximum number of bytes to skip when doing an
19097          alignment.  */
19098       for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
19099         {
19100           if (f->fr_type == rs_align || f->fr_type == rs_align_code)
19101             {
19102               if (stretch < 0)
19103                 stretch = - ((- stretch)
19104                              & ~ ((1 << (int) f->fr_offset) - 1));
19105               else
19106                 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
19107               if (stretch == 0)
19108                 break;
19109             }
19110         }
19111       if (f != NULL)
19112         addr += stretch;
19113     }
19114
19115   return addr;
19116 }
19117
19118 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
19119    load.  */
19120 static int
19121 relax_adr (fragS *fragp, asection *sec, long stretch)
19122 {
19123   addressT addr;
19124   offsetT val;
19125
19126   /* Assume worst case for symbols not known to be in the same section.  */
19127   if (fragp->fr_symbol == NULL
19128       || !S_IS_DEFINED (fragp->fr_symbol)
19129       || sec != S_GET_SEGMENT (fragp->fr_symbol)
19130       || S_IS_WEAK (fragp->fr_symbol))
19131     return 4;
19132
19133   val = relaxed_symbol_addr (fragp, stretch);
19134   addr = fragp->fr_address + fragp->fr_fix;
19135   addr = (addr + 4) & ~3;
19136   /* Force misaligned targets to 32-bit variant.  */
19137   if (val & 3)
19138     return 4;
19139   val -= addr;
19140   if (val < 0 || val > 1020)
19141     return 4;
19142   return 2;
19143 }
19144
19145 /* Return the size of a relaxable add/sub immediate instruction.  */
19146 static int
19147 relax_addsub (fragS *fragp, asection *sec)
19148 {
19149   char *buf;
19150   int op;
19151
19152   buf = fragp->fr_literal + fragp->fr_fix;
19153   op = bfd_get_16(sec->owner, buf);
19154   if ((op & 0xf) == ((op >> 4) & 0xf))
19155     return relax_immediate (fragp, 8, 0);
19156   else
19157     return relax_immediate (fragp, 3, 0);
19158 }
19159
19160
19161 /* Return the size of a relaxable branch instruction.  BITS is the
19162    size of the offset field in the narrow instruction.  */
19163
19164 static int
19165 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
19166 {
19167   addressT addr;
19168   offsetT val;
19169   offsetT limit;
19170
19171   /* Assume worst case for symbols not known to be in the same section.  */
19172   if (!S_IS_DEFINED (fragp->fr_symbol)
19173       || sec != S_GET_SEGMENT (fragp->fr_symbol)
19174       || S_IS_WEAK (fragp->fr_symbol))
19175     return 4;
19176
19177 #ifdef OBJ_ELF
19178   if (S_IS_DEFINED (fragp->fr_symbol)
19179       && ARM_IS_FUNC (fragp->fr_symbol))
19180       return 4;
19181
19182   /* PR 12532.  Global symbols with default visibility might
19183      be preempted, so do not relax relocations to them.  */
19184   if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragp->fr_symbol)) == STV_DEFAULT)
19185       && (! S_IS_LOCAL (fragp->fr_symbol)))
19186     return 4;
19187 #endif
19188
19189   val = relaxed_symbol_addr (fragp, stretch);
19190   addr = fragp->fr_address + fragp->fr_fix + 4;
19191   val -= addr;
19192
19193   /* Offset is a signed value *2 */
19194   limit = 1 << bits;
19195   if (val >= limit || val < -limit)
19196     return 4;
19197   return 2;
19198 }
19199
19200
19201 /* Relax a machine dependent frag.  This returns the amount by which
19202    the current size of the frag should change.  */
19203
19204 int
19205 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
19206 {
19207   int oldsize;
19208   int newsize;
19209
19210   oldsize = fragp->fr_var;
19211   switch (fragp->fr_subtype)
19212     {
19213     case T_MNEM_ldr_pc2:
19214       newsize = relax_adr (fragp, sec, stretch);
19215       break;
19216     case T_MNEM_ldr_pc:
19217     case T_MNEM_ldr_sp:
19218     case T_MNEM_str_sp:
19219       newsize = relax_immediate (fragp, 8, 2);
19220       break;
19221     case T_MNEM_ldr:
19222     case T_MNEM_str:
19223       newsize = relax_immediate (fragp, 5, 2);
19224       break;
19225     case T_MNEM_ldrh:
19226     case T_MNEM_strh:
19227       newsize = relax_immediate (fragp, 5, 1);
19228       break;
19229     case T_MNEM_ldrb:
19230     case T_MNEM_strb:
19231       newsize = relax_immediate (fragp, 5, 0);
19232       break;
19233     case T_MNEM_adr:
19234       newsize = relax_adr (fragp, sec, stretch);
19235       break;
19236     case T_MNEM_mov:
19237     case T_MNEM_movs:
19238     case T_MNEM_cmp:
19239     case T_MNEM_cmn:
19240       newsize = relax_immediate (fragp, 8, 0);
19241       break;
19242     case T_MNEM_b:
19243       newsize = relax_branch (fragp, sec, 11, stretch);
19244       break;
19245     case T_MNEM_bcond:
19246       newsize = relax_branch (fragp, sec, 8, stretch);
19247       break;
19248     case T_MNEM_add_sp:
19249     case T_MNEM_add_pc:
19250       newsize = relax_immediate (fragp, 8, 2);
19251       break;
19252     case T_MNEM_inc_sp:
19253     case T_MNEM_dec_sp:
19254       newsize = relax_immediate (fragp, 7, 2);
19255       break;
19256     case T_MNEM_addi:
19257     case T_MNEM_addis:
19258     case T_MNEM_subi:
19259     case T_MNEM_subis:
19260       newsize = relax_addsub (fragp, sec);
19261       break;
19262     default:
19263       abort ();
19264     }
19265
19266   fragp->fr_var = newsize;
19267   /* Freeze wide instructions that are at or before the same location as
19268      in the previous pass.  This avoids infinite loops.
19269      Don't freeze them unconditionally because targets may be artificially
19270      misaligned by the expansion of preceding frags.  */
19271   if (stretch <= 0 && newsize > 2)
19272     {
19273       md_convert_frag (sec->owner, sec, fragp);
19274       frag_wane (fragp);
19275     }
19276
19277   return newsize - oldsize;
19278 }
19279
19280 /* Round up a section size to the appropriate boundary.  */
19281
19282 valueT
19283 md_section_align (segT   segment ATTRIBUTE_UNUSED,
19284                   valueT size)
19285 {
19286 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
19287   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
19288     {
19289       /* For a.out, force the section size to be aligned.  If we don't do
19290          this, BFD will align it for us, but it will not write out the
19291          final bytes of the section.  This may be a bug in BFD, but it is
19292          easier to fix it here since that is how the other a.out targets
19293          work.  */
19294       int align;
19295
19296       align = bfd_get_section_alignment (stdoutput, segment);
19297       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
19298     }
19299 #endif
19300
19301   return size;
19302 }
19303
19304 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
19305    of an rs_align_code fragment.  */
19306
19307 void
19308 arm_handle_align (fragS * fragP)
19309 {
19310   static char const arm_noop[2][2][4] =
19311     {
19312       {  /* ARMv1 */
19313         {0x00, 0x00, 0xa0, 0xe1},  /* LE */
19314         {0xe1, 0xa0, 0x00, 0x00},  /* BE */
19315       },
19316       {  /* ARMv6k */
19317         {0x00, 0xf0, 0x20, 0xe3},  /* LE */
19318         {0xe3, 0x20, 0xf0, 0x00},  /* BE */
19319       },
19320     };
19321   static char const thumb_noop[2][2][2] =
19322     {
19323       {  /* Thumb-1 */
19324         {0xc0, 0x46},  /* LE */
19325         {0x46, 0xc0},  /* BE */
19326       },
19327       {  /* Thumb-2 */
19328         {0x00, 0xbf},  /* LE */
19329         {0xbf, 0x00}   /* BE */
19330       }
19331     };
19332   static char const wide_thumb_noop[2][4] =
19333     {  /* Wide Thumb-2 */
19334       {0xaf, 0xf3, 0x00, 0x80},  /* LE */
19335       {0xf3, 0xaf, 0x80, 0x00},  /* BE */
19336     };
19337
19338   unsigned bytes, fix, noop_size;
19339   char * p;
19340   const char * noop;
19341   const char *narrow_noop = NULL;
19342 #ifdef OBJ_ELF
19343   enum mstate state;
19344 #endif
19345
19346   if (fragP->fr_type != rs_align_code)
19347     return;
19348
19349   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
19350   p = fragP->fr_literal + fragP->fr_fix;
19351   fix = 0;
19352
19353   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
19354     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
19355
19356   gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
19357
19358   if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
19359     {
19360       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
19361         {
19362           narrow_noop = thumb_noop[1][target_big_endian];
19363           noop = wide_thumb_noop[target_big_endian];
19364         }
19365       else
19366         noop = thumb_noop[0][target_big_endian];
19367       noop_size = 2;
19368 #ifdef OBJ_ELF
19369       state = MAP_THUMB;
19370 #endif
19371     }
19372   else
19373     {
19374       noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
19375                      [target_big_endian];
19376       noop_size = 4;
19377 #ifdef OBJ_ELF
19378       state = MAP_ARM;
19379 #endif
19380     }
19381
19382   fragP->fr_var = noop_size;
19383
19384   if (bytes & (noop_size - 1))
19385     {
19386       fix = bytes & (noop_size - 1);
19387 #ifdef OBJ_ELF
19388       insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
19389 #endif
19390       memset (p, 0, fix);
19391       p += fix;
19392       bytes -= fix;
19393     }
19394
19395   if (narrow_noop)
19396     {
19397       if (bytes & noop_size)
19398         {
19399           /* Insert a narrow noop.  */
19400           memcpy (p, narrow_noop, noop_size);
19401           p += noop_size;
19402           bytes -= noop_size;
19403           fix += noop_size;
19404         }
19405
19406       /* Use wide noops for the remainder */
19407       noop_size = 4;
19408     }
19409
19410   while (bytes >= noop_size)
19411     {
19412       memcpy (p, noop, noop_size);
19413       p += noop_size;
19414       bytes -= noop_size;
19415       fix += noop_size;
19416     }
19417
19418   fragP->fr_fix += fix;
19419 }
19420
19421 /* Called from md_do_align.  Used to create an alignment
19422    frag in a code section.  */
19423
19424 void
19425 arm_frag_align_code (int n, int max)
19426 {
19427   char * p;
19428
19429   /* We assume that there will never be a requirement
19430      to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
19431   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
19432     {
19433       char err_msg[128];
19434
19435       sprintf (err_msg, 
19436         _("alignments greater than %d bytes not supported in .text sections."),
19437         MAX_MEM_FOR_RS_ALIGN_CODE + 1);
19438       as_fatal ("%s", err_msg);
19439     }
19440
19441   p = frag_var (rs_align_code,
19442                 MAX_MEM_FOR_RS_ALIGN_CODE,
19443                 1,
19444                 (relax_substateT) max,
19445                 (symbolS *) NULL,
19446                 (offsetT) n,
19447                 (char *) NULL);
19448   *p = 0;
19449 }
19450
19451 /* Perform target specific initialisation of a frag.
19452    Note - despite the name this initialisation is not done when the frag
19453    is created, but only when its type is assigned.  A frag can be created
19454    and used a long time before its type is set, so beware of assuming that
19455    this initialisationis performed first.  */
19456
19457 #ifndef OBJ_ELF
19458 void
19459 arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
19460 {
19461   /* Record whether this frag is in an ARM or a THUMB area.  */
19462   fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
19463 }
19464
19465 #else /* OBJ_ELF is defined.  */
19466 void
19467 arm_init_frag (fragS * fragP, int max_chars)
19468 {
19469   /* If the current ARM vs THUMB mode has not already
19470      been recorded into this frag then do so now.  */
19471   if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
19472     {
19473       fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
19474
19475       /* Record a mapping symbol for alignment frags.  We will delete this
19476          later if the alignment ends up empty.  */
19477       switch (fragP->fr_type)
19478         {
19479           case rs_align:
19480           case rs_align_test:
19481           case rs_fill:
19482             mapping_state_2 (MAP_DATA, max_chars);
19483             break;
19484           case rs_align_code:
19485             mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
19486             break;
19487           default:
19488             break;
19489         }
19490     }
19491 }
19492
19493 /* When we change sections we need to issue a new mapping symbol.  */
19494
19495 void
19496 arm_elf_change_section (void)
19497 {
19498   /* Link an unlinked unwind index table section to the .text section.  */
19499   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
19500       && elf_linked_to_section (now_seg) == NULL)
19501     elf_linked_to_section (now_seg) = text_section;
19502 }
19503
19504 int
19505 arm_elf_section_type (const char * str, size_t len)
19506 {
19507   if (len == 5 && strncmp (str, "exidx", 5) == 0)
19508     return SHT_ARM_EXIDX;
19509
19510   return -1;
19511 }
19512 \f
19513 /* Code to deal with unwinding tables.  */
19514
19515 static void add_unwind_adjustsp (offsetT);
19516
19517 /* Generate any deferred unwind frame offset.  */
19518
19519 static void
19520 flush_pending_unwind (void)
19521 {
19522   offsetT offset;
19523
19524   offset = unwind.pending_offset;
19525   unwind.pending_offset = 0;
19526   if (offset != 0)
19527     add_unwind_adjustsp (offset);
19528 }
19529
19530 /* Add an opcode to this list for this function.  Two-byte opcodes should
19531    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
19532    order.  */
19533
19534 static void
19535 add_unwind_opcode (valueT op, int length)
19536 {
19537   /* Add any deferred stack adjustment.  */
19538   if (unwind.pending_offset)
19539     flush_pending_unwind ();
19540
19541   unwind.sp_restored = 0;
19542
19543   if (unwind.opcode_count + length > unwind.opcode_alloc)
19544     {
19545       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
19546       if (unwind.opcodes)
19547         unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
19548                                                      unwind.opcode_alloc);
19549       else
19550         unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
19551     }
19552   while (length > 0)
19553     {
19554       length--;
19555       unwind.opcodes[unwind.opcode_count] = op & 0xff;
19556       op >>= 8;
19557       unwind.opcode_count++;
19558     }
19559 }
19560
19561 /* Add unwind opcodes to adjust the stack pointer.  */
19562
19563 static void
19564 add_unwind_adjustsp (offsetT offset)
19565 {
19566   valueT op;
19567
19568   if (offset > 0x200)
19569     {
19570       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
19571       char bytes[5];
19572       int n;
19573       valueT o;
19574
19575       /* Long form: 0xb2, uleb128.  */
19576       /* This might not fit in a word so add the individual bytes,
19577          remembering the list is built in reverse order.  */
19578       o = (valueT) ((offset - 0x204) >> 2);
19579       if (o == 0)
19580         add_unwind_opcode (0, 1);
19581
19582       /* Calculate the uleb128 encoding of the offset.  */
19583       n = 0;
19584       while (o)
19585         {
19586           bytes[n] = o & 0x7f;
19587           o >>= 7;
19588           if (o)
19589             bytes[n] |= 0x80;
19590           n++;
19591         }
19592       /* Add the insn.  */
19593       for (; n; n--)
19594         add_unwind_opcode (bytes[n - 1], 1);
19595       add_unwind_opcode (0xb2, 1);
19596     }
19597   else if (offset > 0x100)
19598     {
19599       /* Two short opcodes.  */
19600       add_unwind_opcode (0x3f, 1);
19601       op = (offset - 0x104) >> 2;
19602       add_unwind_opcode (op, 1);
19603     }
19604   else if (offset > 0)
19605     {
19606       /* Short opcode.  */
19607       op = (offset - 4) >> 2;
19608       add_unwind_opcode (op, 1);
19609     }
19610   else if (offset < 0)
19611     {
19612       offset = -offset;
19613       while (offset > 0x100)
19614         {
19615           add_unwind_opcode (0x7f, 1);
19616           offset -= 0x100;
19617         }
19618       op = ((offset - 4) >> 2) | 0x40;
19619       add_unwind_opcode (op, 1);
19620     }
19621 }
19622
19623 /* Finish the list of unwind opcodes for this function.  */
19624 static void
19625 finish_unwind_opcodes (void)
19626 {
19627   valueT op;
19628
19629   if (unwind.fp_used)
19630     {
19631       /* Adjust sp as necessary.  */
19632       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
19633       flush_pending_unwind ();
19634
19635       /* After restoring sp from the frame pointer.  */
19636       op = 0x90 | unwind.fp_reg;
19637       add_unwind_opcode (op, 1);
19638     }
19639   else
19640     flush_pending_unwind ();
19641 }
19642
19643
19644 /* Start an exception table entry.  If idx is nonzero this is an index table
19645    entry.  */
19646
19647 static void
19648 start_unwind_section (const segT text_seg, int idx)
19649 {
19650   const char * text_name;
19651   const char * prefix;
19652   const char * prefix_once;
19653   const char * group_name;
19654   size_t prefix_len;
19655   size_t text_len;
19656   char * sec_name;
19657   size_t sec_name_len;
19658   int type;
19659   int flags;
19660   int linkonce;
19661
19662   if (idx)
19663     {
19664       prefix = ELF_STRING_ARM_unwind;
19665       prefix_once = ELF_STRING_ARM_unwind_once;
19666       type = SHT_ARM_EXIDX;
19667     }
19668   else
19669     {
19670       prefix = ELF_STRING_ARM_unwind_info;
19671       prefix_once = ELF_STRING_ARM_unwind_info_once;
19672       type = SHT_PROGBITS;
19673     }
19674
19675   text_name = segment_name (text_seg);
19676   if (streq (text_name, ".text"))
19677     text_name = "";
19678
19679   if (strncmp (text_name, ".gnu.linkonce.t.",
19680                strlen (".gnu.linkonce.t.")) == 0)
19681     {
19682       prefix = prefix_once;
19683       text_name += strlen (".gnu.linkonce.t.");
19684     }
19685
19686   prefix_len = strlen (prefix);
19687   text_len = strlen (text_name);
19688   sec_name_len = prefix_len + text_len;
19689   sec_name = (char *) xmalloc (sec_name_len + 1);
19690   memcpy (sec_name, prefix, prefix_len);
19691   memcpy (sec_name + prefix_len, text_name, text_len);
19692   sec_name[prefix_len + text_len] = '\0';
19693
19694   flags = SHF_ALLOC;
19695   linkonce = 0;
19696   group_name = 0;
19697
19698   /* Handle COMDAT group.  */
19699   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
19700     {
19701       group_name = elf_group_name (text_seg);
19702       if (group_name == NULL)
19703         {
19704           as_bad (_("Group section `%s' has no group signature"),
19705                   segment_name (text_seg));
19706           ignore_rest_of_line ();
19707           return;
19708         }
19709       flags |= SHF_GROUP;
19710       linkonce = 1;
19711     }
19712
19713   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
19714
19715   /* Set the section link for index tables.  */
19716   if (idx)
19717     elf_linked_to_section (now_seg) = text_seg;
19718 }
19719
19720
19721 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
19722    personality routine data.  Returns zero, or the index table value for
19723    and inline entry.  */
19724
19725 static valueT
19726 create_unwind_entry (int have_data)
19727 {
19728   int size;
19729   addressT where;
19730   char *ptr;
19731   /* The current word of data.  */
19732   valueT data;
19733   /* The number of bytes left in this word.  */
19734   int n;
19735
19736   finish_unwind_opcodes ();
19737
19738   /* Remember the current text section.  */
19739   unwind.saved_seg = now_seg;
19740   unwind.saved_subseg = now_subseg;
19741
19742   start_unwind_section (now_seg, 0);
19743
19744   if (unwind.personality_routine == NULL)
19745     {
19746       if (unwind.personality_index == -2)
19747         {
19748           if (have_data)
19749             as_bad (_("handlerdata in cantunwind frame"));
19750           return 1; /* EXIDX_CANTUNWIND.  */
19751         }
19752
19753       /* Use a default personality routine if none is specified.  */
19754       if (unwind.personality_index == -1)
19755         {
19756           if (unwind.opcode_count > 3)
19757             unwind.personality_index = 1;
19758           else
19759             unwind.personality_index = 0;
19760         }
19761
19762       /* Space for the personality routine entry.  */
19763       if (unwind.personality_index == 0)
19764         {
19765           if (unwind.opcode_count > 3)
19766             as_bad (_("too many unwind opcodes for personality routine 0"));
19767
19768           if (!have_data)
19769             {
19770               /* All the data is inline in the index table.  */
19771               data = 0x80;
19772               n = 3;
19773               while (unwind.opcode_count > 0)
19774                 {
19775                   unwind.opcode_count--;
19776                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
19777                   n--;
19778                 }
19779
19780               /* Pad with "finish" opcodes.  */
19781               while (n--)
19782                 data = (data << 8) | 0xb0;
19783
19784               return data;
19785             }
19786           size = 0;
19787         }
19788       else
19789         /* We get two opcodes "free" in the first word.  */
19790         size = unwind.opcode_count - 2;
19791     }
19792   else
19793     /* An extra byte is required for the opcode count.  */
19794     size = unwind.opcode_count + 1;
19795
19796   size = (size + 3) >> 2;
19797   if (size > 0xff)
19798     as_bad (_("too many unwind opcodes"));
19799
19800   frag_align (2, 0, 0);
19801   record_alignment (now_seg, 2);
19802   unwind.table_entry = expr_build_dot ();
19803
19804   /* Allocate the table entry.  */
19805   ptr = frag_more ((size << 2) + 4);
19806   where = frag_now_fix () - ((size << 2) + 4);
19807
19808   switch (unwind.personality_index)
19809     {
19810     case -1:
19811       /* ??? Should this be a PLT generating relocation?  */
19812       /* Custom personality routine.  */
19813       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
19814                BFD_RELOC_ARM_PREL31);
19815
19816       where += 4;
19817       ptr += 4;
19818
19819       /* Set the first byte to the number of additional words.  */
19820       data = size - 1;
19821       n = 3;
19822       break;
19823
19824     /* ABI defined personality routines.  */
19825     case 0:
19826       /* Three opcodes bytes are packed into the first word.  */
19827       data = 0x80;
19828       n = 3;
19829       break;
19830
19831     case 1:
19832     case 2:
19833       /* The size and first two opcode bytes go in the first word.  */
19834       data = ((0x80 + unwind.personality_index) << 8) | size;
19835       n = 2;
19836       break;
19837
19838     default:
19839       /* Should never happen.  */
19840       abort ();
19841     }
19842
19843   /* Pack the opcodes into words (MSB first), reversing the list at the same
19844      time.  */
19845   while (unwind.opcode_count > 0)
19846     {
19847       if (n == 0)
19848         {
19849           md_number_to_chars (ptr, data, 4);
19850           ptr += 4;
19851           n = 4;
19852           data = 0;
19853         }
19854       unwind.opcode_count--;
19855       n--;
19856       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
19857     }
19858
19859   /* Finish off the last word.  */
19860   if (n < 4)
19861     {
19862       /* Pad with "finish" opcodes.  */
19863       while (n--)
19864         data = (data << 8) | 0xb0;
19865
19866       md_number_to_chars (ptr, data, 4);
19867     }
19868
19869   if (!have_data)
19870     {
19871       /* Add an empty descriptor if there is no user-specified data.   */
19872       ptr = frag_more (4);
19873       md_number_to_chars (ptr, 0, 4);
19874     }
19875
19876   return 0;
19877 }
19878
19879
19880 /* Initialize the DWARF-2 unwind information for this procedure.  */
19881
19882 void
19883 tc_arm_frame_initial_instructions (void)
19884 {
19885   cfi_add_CFA_def_cfa (REG_SP, 0);
19886 }
19887 #endif /* OBJ_ELF */
19888
19889 /* Convert REGNAME to a DWARF-2 register number.  */
19890
19891 int
19892 tc_arm_regname_to_dw2regnum (char *regname)
19893 {
19894   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
19895
19896   if (reg == FAIL)
19897     return -1;
19898
19899   return reg;
19900 }
19901
19902 #ifdef TE_PE
19903 void
19904 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
19905 {
19906   expressionS exp;
19907
19908   exp.X_op = O_secrel;
19909   exp.X_add_symbol = symbol;
19910   exp.X_add_number = 0;
19911   emit_expr (&exp, size);
19912 }
19913 #endif
19914
19915 /* MD interface: Symbol and relocation handling.  */
19916
19917 /* Return the address within the segment that a PC-relative fixup is
19918    relative to.  For ARM, PC-relative fixups applied to instructions
19919    are generally relative to the location of the fixup plus 8 bytes.
19920    Thumb branches are offset by 4, and Thumb loads relative to PC
19921    require special handling.  */
19922
19923 long
19924 md_pcrel_from_section (fixS * fixP, segT seg)
19925 {
19926   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
19927
19928   /* If this is pc-relative and we are going to emit a relocation
19929      then we just want to put out any pipeline compensation that the linker
19930      will need.  Otherwise we want to use the calculated base.
19931      For WinCE we skip the bias for externals as well, since this
19932      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
19933   if (fixP->fx_pcrel
19934       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
19935           || (arm_force_relocation (fixP)
19936 #ifdef TE_WINCE
19937               && !S_IS_EXTERNAL (fixP->fx_addsy)
19938 #endif
19939               )))
19940     base = 0;
19941
19942
19943   switch (fixP->fx_r_type)
19944     {
19945       /* PC relative addressing on the Thumb is slightly odd as the
19946          bottom two bits of the PC are forced to zero for the
19947          calculation.  This happens *after* application of the
19948          pipeline offset.  However, Thumb adrl already adjusts for
19949          this, so we need not do it again.  */
19950     case BFD_RELOC_ARM_THUMB_ADD:
19951       return base & ~3;
19952
19953     case BFD_RELOC_ARM_THUMB_OFFSET:
19954     case BFD_RELOC_ARM_T32_OFFSET_IMM:
19955     case BFD_RELOC_ARM_T32_ADD_PC12:
19956     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
19957       return (base + 4) & ~3;
19958
19959       /* Thumb branches are simply offset by +4.  */
19960     case BFD_RELOC_THUMB_PCREL_BRANCH7:
19961     case BFD_RELOC_THUMB_PCREL_BRANCH9:
19962     case BFD_RELOC_THUMB_PCREL_BRANCH12:
19963     case BFD_RELOC_THUMB_PCREL_BRANCH20:
19964     case BFD_RELOC_THUMB_PCREL_BRANCH25:
19965       return base + 4;
19966
19967     case BFD_RELOC_THUMB_PCREL_BRANCH23:
19968       if (fixP->fx_addsy
19969           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19970           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
19971           && ARM_IS_FUNC (fixP->fx_addsy)
19972           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19973         base = fixP->fx_where + fixP->fx_frag->fr_address;
19974        return base + 4;
19975
19976       /* BLX is like branches above, but forces the low two bits of PC to
19977          zero.  */
19978     case BFD_RELOC_THUMB_PCREL_BLX:
19979       if (fixP->fx_addsy
19980           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19981           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
19982           && THUMB_IS_FUNC (fixP->fx_addsy)
19983           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19984         base = fixP->fx_where + fixP->fx_frag->fr_address;
19985       return (base + 4) & ~3;
19986
19987       /* ARM mode branches are offset by +8.  However, the Windows CE
19988          loader expects the relocation not to take this into account.  */
19989     case BFD_RELOC_ARM_PCREL_BLX:
19990       if (fixP->fx_addsy
19991           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
19992           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
19993           && ARM_IS_FUNC (fixP->fx_addsy)
19994           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
19995         base = fixP->fx_where + fixP->fx_frag->fr_address;
19996       return base + 8;
19997
19998     case BFD_RELOC_ARM_PCREL_CALL:
19999       if (fixP->fx_addsy
20000           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20001           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
20002           && THUMB_IS_FUNC (fixP->fx_addsy)
20003           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20004         base = fixP->fx_where + fixP->fx_frag->fr_address;
20005       return base + 8;
20006
20007     case BFD_RELOC_ARM_PCREL_BRANCH:
20008     case BFD_RELOC_ARM_PCREL_JUMP:
20009     case BFD_RELOC_ARM_PLT32:
20010 #ifdef TE_WINCE
20011       /* When handling fixups immediately, because we have already
20012          discovered the value of a symbol, or the address of the frag involved
20013          we must account for the offset by +8, as the OS loader will never see the reloc.
20014          see fixup_segment() in write.c
20015          The S_IS_EXTERNAL test handles the case of global symbols.
20016          Those need the calculated base, not just the pipe compensation the linker will need.  */
20017       if (fixP->fx_pcrel
20018           && fixP->fx_addsy != NULL
20019           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20020           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
20021         return base + 8;
20022       return base;
20023 #else
20024       return base + 8;
20025 #endif
20026
20027
20028       /* ARM mode loads relative to PC are also offset by +8.  Unlike
20029          branches, the Windows CE loader *does* expect the relocation
20030          to take this into account.  */
20031     case BFD_RELOC_ARM_OFFSET_IMM:
20032     case BFD_RELOC_ARM_OFFSET_IMM8:
20033     case BFD_RELOC_ARM_HWLITERAL:
20034     case BFD_RELOC_ARM_LITERAL:
20035     case BFD_RELOC_ARM_CP_OFF_IMM:
20036       return base + 8;
20037
20038
20039       /* Other PC-relative relocations are un-offset.  */
20040     default:
20041       return base;
20042     }
20043 }
20044
20045 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
20046    Otherwise we have no need to default values of symbols.  */
20047
20048 symbolS *
20049 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
20050 {
20051 #ifdef OBJ_ELF
20052   if (name[0] == '_' && name[1] == 'G'
20053       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
20054     {
20055       if (!GOT_symbol)
20056         {
20057           if (symbol_find (name))
20058             as_bad (_("GOT already in the symbol table"));
20059
20060           GOT_symbol = symbol_new (name, undefined_section,
20061                                    (valueT) 0, & zero_address_frag);
20062         }
20063
20064       return GOT_symbol;
20065     }
20066 #endif
20067
20068   return NULL;
20069 }
20070
20071 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
20072    computed as two separate immediate values, added together.  We
20073    already know that this value cannot be computed by just one ARM
20074    instruction.  */
20075
20076 static unsigned int
20077 validate_immediate_twopart (unsigned int   val,
20078                             unsigned int * highpart)
20079 {
20080   unsigned int a;
20081   unsigned int i;
20082
20083   for (i = 0; i < 32; i += 2)
20084     if (((a = rotate_left (val, i)) & 0xff) != 0)
20085       {
20086         if (a & 0xff00)
20087           {
20088             if (a & ~ 0xffff)
20089               continue;
20090             * highpart = (a  >> 8) | ((i + 24) << 7);
20091           }
20092         else if (a & 0xff0000)
20093           {
20094             if (a & 0xff000000)
20095               continue;
20096             * highpart = (a >> 16) | ((i + 16) << 7);
20097           }
20098         else
20099           {
20100             gas_assert (a & 0xff000000);
20101             * highpart = (a >> 24) | ((i + 8) << 7);
20102           }
20103
20104         return (a & 0xff) | (i << 7);
20105       }
20106
20107   return FAIL;
20108 }
20109
20110 static int
20111 validate_offset_imm (unsigned int val, int hwse)
20112 {
20113   if ((hwse && val > 255) || val > 4095)
20114     return FAIL;
20115   return val;
20116 }
20117
20118 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
20119    negative immediate constant by altering the instruction.  A bit of
20120    a hack really.
20121         MOV <-> MVN
20122         AND <-> BIC
20123         ADC <-> SBC
20124         by inverting the second operand, and
20125         ADD <-> SUB
20126         CMP <-> CMN
20127         by negating the second operand.  */
20128
20129 static int
20130 negate_data_op (unsigned long * instruction,
20131                 unsigned long   value)
20132 {
20133   int op, new_inst;
20134   unsigned long negated, inverted;
20135
20136   negated = encode_arm_immediate (-value);
20137   inverted = encode_arm_immediate (~value);
20138
20139   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
20140   switch (op)
20141     {
20142       /* First negates.  */
20143     case OPCODE_SUB:             /* ADD <-> SUB  */
20144       new_inst = OPCODE_ADD;
20145       value = negated;
20146       break;
20147
20148     case OPCODE_ADD:
20149       new_inst = OPCODE_SUB;
20150       value = negated;
20151       break;
20152
20153     case OPCODE_CMP:             /* CMP <-> CMN  */
20154       new_inst = OPCODE_CMN;
20155       value = negated;
20156       break;
20157
20158     case OPCODE_CMN:
20159       new_inst = OPCODE_CMP;
20160       value = negated;
20161       break;
20162
20163       /* Now Inverted ops.  */
20164     case OPCODE_MOV:             /* MOV <-> MVN  */
20165       new_inst = OPCODE_MVN;
20166       value = inverted;
20167       break;
20168
20169     case OPCODE_MVN:
20170       new_inst = OPCODE_MOV;
20171       value = inverted;
20172       break;
20173
20174     case OPCODE_AND:             /* AND <-> BIC  */
20175       new_inst = OPCODE_BIC;
20176       value = inverted;
20177       break;
20178
20179     case OPCODE_BIC:
20180       new_inst = OPCODE_AND;
20181       value = inverted;
20182       break;
20183
20184     case OPCODE_ADC:              /* ADC <-> SBC  */
20185       new_inst = OPCODE_SBC;
20186       value = inverted;
20187       break;
20188
20189     case OPCODE_SBC:
20190       new_inst = OPCODE_ADC;
20191       value = inverted;
20192       break;
20193
20194       /* We cannot do anything.  */
20195     default:
20196       return FAIL;
20197     }
20198
20199   if (value == (unsigned) FAIL)
20200     return FAIL;
20201
20202   *instruction &= OPCODE_MASK;
20203   *instruction |= new_inst << DATA_OP_SHIFT;
20204   return value;
20205 }
20206
20207 /* Like negate_data_op, but for Thumb-2.   */
20208
20209 static unsigned int
20210 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
20211 {
20212   int op, new_inst;
20213   int rd;
20214   unsigned int negated, inverted;
20215
20216   negated = encode_thumb32_immediate (-value);
20217   inverted = encode_thumb32_immediate (~value);
20218
20219   rd = (*instruction >> 8) & 0xf;
20220   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
20221   switch (op)
20222     {
20223       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
20224     case T2_OPCODE_SUB:
20225       new_inst = T2_OPCODE_ADD;
20226       value = negated;
20227       break;
20228
20229     case T2_OPCODE_ADD:
20230       new_inst = T2_OPCODE_SUB;
20231       value = negated;
20232       break;
20233
20234       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
20235     case T2_OPCODE_ORR:
20236       new_inst = T2_OPCODE_ORN;
20237       value = inverted;
20238       break;
20239
20240     case T2_OPCODE_ORN:
20241       new_inst = T2_OPCODE_ORR;
20242       value = inverted;
20243       break;
20244
20245       /* AND <-> BIC.  TST has no inverted equivalent.  */
20246     case T2_OPCODE_AND:
20247       new_inst = T2_OPCODE_BIC;
20248       if (rd == 15)
20249         value = FAIL;
20250       else
20251         value = inverted;
20252       break;
20253
20254     case T2_OPCODE_BIC:
20255       new_inst = T2_OPCODE_AND;
20256       value = inverted;
20257       break;
20258
20259       /* ADC <-> SBC  */
20260     case T2_OPCODE_ADC:
20261       new_inst = T2_OPCODE_SBC;
20262       value = inverted;
20263       break;
20264
20265     case T2_OPCODE_SBC:
20266       new_inst = T2_OPCODE_ADC;
20267       value = inverted;
20268       break;
20269
20270       /* We cannot do anything.  */
20271     default:
20272       return FAIL;
20273     }
20274
20275   if (value == (unsigned int)FAIL)
20276     return FAIL;
20277
20278   *instruction &= T2_OPCODE_MASK;
20279   *instruction |= new_inst << T2_DATA_OP_SHIFT;
20280   return value;
20281 }
20282
20283 /* Read a 32-bit thumb instruction from buf.  */
20284 static unsigned long
20285 get_thumb32_insn (char * buf)
20286 {
20287   unsigned long insn;
20288   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
20289   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20290
20291   return insn;
20292 }
20293
20294
20295 /* We usually want to set the low bit on the address of thumb function
20296    symbols.  In particular .word foo - . should have the low bit set.
20297    Generic code tries to fold the difference of two symbols to
20298    a constant.  Prevent this and force a relocation when the first symbols
20299    is a thumb function.  */
20300
20301 bfd_boolean
20302 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
20303 {
20304   if (op == O_subtract
20305       && l->X_op == O_symbol
20306       && r->X_op == O_symbol
20307       && THUMB_IS_FUNC (l->X_add_symbol))
20308     {
20309       l->X_op = O_subtract;
20310       l->X_op_symbol = r->X_add_symbol;
20311       l->X_add_number -= r->X_add_number;
20312       return TRUE;
20313     }
20314
20315   /* Process as normal.  */
20316   return FALSE;
20317 }
20318
20319 /* Encode Thumb2 unconditional branches and calls. The encoding
20320    for the 2 are identical for the immediate values.  */
20321
20322 static void
20323 encode_thumb2_b_bl_offset (char * buf, offsetT value)
20324 {
20325 #define T2I1I2MASK  ((1 << 13) | (1 << 11))
20326   offsetT newval;
20327   offsetT newval2;
20328   addressT S, I1, I2, lo, hi;
20329
20330   S = (value >> 24) & 0x01;
20331   I1 = (value >> 23) & 0x01;
20332   I2 = (value >> 22) & 0x01;
20333   hi = (value >> 12) & 0x3ff;
20334   lo = (value >> 1) & 0x7ff; 
20335   newval   = md_chars_to_number (buf, THUMB_SIZE);
20336   newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20337   newval  |= (S << 10) | hi;
20338   newval2 &=  ~T2I1I2MASK;
20339   newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
20340   md_number_to_chars (buf, newval, THUMB_SIZE);
20341   md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
20342 }
20343
20344 void
20345 md_apply_fix (fixS *    fixP,
20346                valueT * valP,
20347                segT     seg)
20348 {
20349   offsetT        value = * valP;
20350   offsetT        newval;
20351   unsigned int   newimm;
20352   unsigned long  temp;
20353   int            sign;
20354   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
20355
20356   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
20357
20358   /* Note whether this will delete the relocation.  */
20359
20360   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
20361     fixP->fx_done = 1;
20362
20363   /* On a 64-bit host, silently truncate 'value' to 32 bits for
20364      consistency with the behaviour on 32-bit hosts.  Remember value
20365      for emit_reloc.  */
20366   value &= 0xffffffff;
20367   value ^= 0x80000000;
20368   value -= 0x80000000;
20369
20370   *valP = value;
20371   fixP->fx_addnumber = value;
20372
20373   /* Same treatment for fixP->fx_offset.  */
20374   fixP->fx_offset &= 0xffffffff;
20375   fixP->fx_offset ^= 0x80000000;
20376   fixP->fx_offset -= 0x80000000;
20377
20378   switch (fixP->fx_r_type)
20379     {
20380     case BFD_RELOC_NONE:
20381       /* This will need to go in the object file.  */
20382       fixP->fx_done = 0;
20383       break;
20384
20385     case BFD_RELOC_ARM_IMMEDIATE:
20386       /* We claim that this fixup has been processed here,
20387          even if in fact we generate an error because we do
20388          not have a reloc for it, so tc_gen_reloc will reject it.  */
20389       fixP->fx_done = 1;
20390
20391       if (fixP->fx_addsy)
20392         {
20393           const char *msg = 0;
20394
20395           if (! S_IS_DEFINED (fixP->fx_addsy))
20396             msg = _("undefined symbol %s used as an immediate value");
20397           else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20398             msg = _("symbol %s is in a different section");
20399           else if (S_IS_WEAK (fixP->fx_addsy))
20400             msg = _("symbol %s is weak and may be overridden later");
20401
20402           if (msg)
20403             {
20404               as_bad_where (fixP->fx_file, fixP->fx_line,
20405                             msg, S_GET_NAME (fixP->fx_addsy));
20406               break;
20407             }
20408         }
20409
20410       newimm = encode_arm_immediate (value);
20411       temp = md_chars_to_number (buf, INSN_SIZE);
20412
20413       /* If the instruction will fail, see if we can fix things up by
20414          changing the opcode.  */
20415       if (newimm == (unsigned int) FAIL
20416           && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
20417         {
20418           as_bad_where (fixP->fx_file, fixP->fx_line,
20419                         _("invalid constant (%lx) after fixup"),
20420                         (unsigned long) value);
20421           break;
20422         }
20423
20424       newimm |= (temp & 0xfffff000);
20425       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
20426       break;
20427
20428     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
20429       {
20430         unsigned int highpart = 0;
20431         unsigned int newinsn  = 0xe1a00000; /* nop.  */
20432
20433         if (fixP->fx_addsy)
20434           {
20435             const char *msg = 0;
20436
20437             if (! S_IS_DEFINED (fixP->fx_addsy))
20438               msg = _("undefined symbol %s used as an immediate value");
20439             else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20440               msg = _("symbol %s is in a different section");
20441             else if (S_IS_WEAK (fixP->fx_addsy))
20442               msg = _("symbol %s is weak and may be overridden later");
20443
20444             if (msg)
20445               {
20446                 as_bad_where (fixP->fx_file, fixP->fx_line,
20447                               msg, S_GET_NAME (fixP->fx_addsy));
20448                 break;
20449               }
20450           }
20451         
20452         newimm = encode_arm_immediate (value);
20453         temp = md_chars_to_number (buf, INSN_SIZE);
20454
20455         /* If the instruction will fail, see if we can fix things up by
20456            changing the opcode.  */
20457         if (newimm == (unsigned int) FAIL
20458             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
20459           {
20460             /* No ?  OK - try using two ADD instructions to generate
20461                the value.  */
20462             newimm = validate_immediate_twopart (value, & highpart);
20463
20464             /* Yes - then make sure that the second instruction is
20465                also an add.  */
20466             if (newimm != (unsigned int) FAIL)
20467               newinsn = temp;
20468             /* Still No ?  Try using a negated value.  */
20469             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
20470               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
20471             /* Otherwise - give up.  */
20472             else
20473               {
20474                 as_bad_where (fixP->fx_file, fixP->fx_line,
20475                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
20476                               (long) value);
20477                 break;
20478               }
20479
20480             /* Replace the first operand in the 2nd instruction (which
20481                is the PC) with the destination register.  We have
20482                already added in the PC in the first instruction and we
20483                do not want to do it again.  */
20484             newinsn &= ~ 0xf0000;
20485             newinsn |= ((newinsn & 0x0f000) << 4);
20486           }
20487
20488         newimm |= (temp & 0xfffff000);
20489         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
20490
20491         highpart |= (newinsn & 0xfffff000);
20492         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
20493       }
20494       break;
20495
20496     case BFD_RELOC_ARM_OFFSET_IMM:
20497       if (!fixP->fx_done && seg->use_rela_p)
20498         value = 0;
20499
20500     case BFD_RELOC_ARM_LITERAL:
20501       sign = value > 0;
20502
20503       if (value < 0)
20504         value = - value;
20505
20506       if (validate_offset_imm (value, 0) == FAIL)
20507         {
20508           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
20509             as_bad_where (fixP->fx_file, fixP->fx_line,
20510                           _("invalid literal constant: pool needs to be closer"));
20511           else
20512             as_bad_where (fixP->fx_file, fixP->fx_line,
20513                           _("bad immediate value for offset (%ld)"),
20514                           (long) value);
20515           break;
20516         }
20517
20518       newval = md_chars_to_number (buf, INSN_SIZE);
20519       if (value == 0)
20520         newval &= 0xfffff000;
20521       else
20522         {
20523           newval &= 0xff7ff000;
20524           newval |= value | (sign ? INDEX_UP : 0);
20525         }
20526       md_number_to_chars (buf, newval, INSN_SIZE);
20527       break;
20528
20529     case BFD_RELOC_ARM_OFFSET_IMM8:
20530     case BFD_RELOC_ARM_HWLITERAL:
20531       sign = value > 0;
20532
20533       if (value < 0)
20534         value = - value;
20535
20536       if (validate_offset_imm (value, 1) == FAIL)
20537         {
20538           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
20539             as_bad_where (fixP->fx_file, fixP->fx_line,
20540                           _("invalid literal constant: pool needs to be closer"));
20541           else
20542             as_bad (_("bad immediate value for 8-bit offset (%ld)"),
20543                     (long) value);
20544           break;
20545         }
20546
20547       newval = md_chars_to_number (buf, INSN_SIZE);
20548       if (value == 0)
20549         newval &= 0xfffff0f0;
20550       else
20551         {
20552           newval &= 0xff7ff0f0;
20553           newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
20554         }
20555       md_number_to_chars (buf, newval, INSN_SIZE);
20556       break;
20557
20558     case BFD_RELOC_ARM_T32_OFFSET_U8:
20559       if (value < 0 || value > 1020 || value % 4 != 0)
20560         as_bad_where (fixP->fx_file, fixP->fx_line,
20561                       _("bad immediate value for offset (%ld)"), (long) value);
20562       value /= 4;
20563
20564       newval = md_chars_to_number (buf+2, THUMB_SIZE);
20565       newval |= value;
20566       md_number_to_chars (buf+2, newval, THUMB_SIZE);
20567       break;
20568
20569     case BFD_RELOC_ARM_T32_OFFSET_IMM:
20570       /* This is a complicated relocation used for all varieties of Thumb32
20571          load/store instruction with immediate offset:
20572
20573          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
20574                                                    *4, optional writeback(W)
20575                                                    (doubleword load/store)
20576
20577          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
20578          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
20579          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
20580          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
20581          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
20582
20583          Uppercase letters indicate bits that are already encoded at
20584          this point.  Lowercase letters are our problem.  For the
20585          second block of instructions, the secondary opcode nybble
20586          (bits 8..11) is present, and bit 23 is zero, even if this is
20587          a PC-relative operation.  */
20588       newval = md_chars_to_number (buf, THUMB_SIZE);
20589       newval <<= 16;
20590       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
20591
20592       if ((newval & 0xf0000000) == 0xe0000000)
20593         {
20594           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
20595           if (value >= 0)
20596             newval |= (1 << 23);
20597           else
20598             value = -value;
20599           if (value % 4 != 0)
20600             {
20601               as_bad_where (fixP->fx_file, fixP->fx_line,
20602                             _("offset not a multiple of 4"));
20603               break;
20604             }
20605           value /= 4;
20606           if (value > 0xff)
20607             {
20608               as_bad_where (fixP->fx_file, fixP->fx_line,
20609                             _("offset out of range"));
20610               break;
20611             }
20612           newval &= ~0xff;
20613         }
20614       else if ((newval & 0x000f0000) == 0x000f0000)
20615         {
20616           /* PC-relative, 12-bit offset.  */
20617           if (value >= 0)
20618             newval |= (1 << 23);
20619           else
20620             value = -value;
20621           if (value > 0xfff)
20622             {
20623               as_bad_where (fixP->fx_file, fixP->fx_line,
20624                             _("offset out of range"));
20625               break;
20626             }
20627           newval &= ~0xfff;
20628         }
20629       else if ((newval & 0x00000100) == 0x00000100)
20630         {
20631           /* Writeback: 8-bit, +/- offset.  */
20632           if (value >= 0)
20633             newval |= (1 << 9);
20634           else
20635             value = -value;
20636           if (value > 0xff)
20637             {
20638               as_bad_where (fixP->fx_file, fixP->fx_line,
20639                             _("offset out of range"));
20640               break;
20641             }
20642           newval &= ~0xff;
20643         }
20644       else if ((newval & 0x00000f00) == 0x00000e00)
20645         {
20646           /* T-instruction: positive 8-bit offset.  */
20647           if (value < 0 || value > 0xff)
20648             {
20649               as_bad_where (fixP->fx_file, fixP->fx_line,
20650                             _("offset out of range"));
20651               break;
20652             }
20653           newval &= ~0xff;
20654           newval |= value;
20655         }
20656       else
20657         {
20658           /* Positive 12-bit or negative 8-bit offset.  */
20659           int limit;
20660           if (value >= 0)
20661             {
20662               newval |= (1 << 23);
20663               limit = 0xfff;
20664             }
20665           else
20666             {
20667               value = -value;
20668               limit = 0xff;
20669             }
20670           if (value > limit)
20671             {
20672               as_bad_where (fixP->fx_file, fixP->fx_line,
20673                             _("offset out of range"));
20674               break;
20675             }
20676           newval &= ~limit;
20677         }
20678
20679       newval |= value;
20680       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
20681       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
20682       break;
20683
20684     case BFD_RELOC_ARM_SHIFT_IMM:
20685       newval = md_chars_to_number (buf, INSN_SIZE);
20686       if (((unsigned long) value) > 32
20687           || (value == 32
20688               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
20689         {
20690           as_bad_where (fixP->fx_file, fixP->fx_line,
20691                         _("shift expression is too large"));
20692           break;
20693         }
20694
20695       if (value == 0)
20696         /* Shifts of zero must be done as lsl.  */
20697         newval &= ~0x60;
20698       else if (value == 32)
20699         value = 0;
20700       newval &= 0xfffff07f;
20701       newval |= (value & 0x1f) << 7;
20702       md_number_to_chars (buf, newval, INSN_SIZE);
20703       break;
20704
20705     case BFD_RELOC_ARM_T32_IMMEDIATE:
20706     case BFD_RELOC_ARM_T32_ADD_IMM:
20707     case BFD_RELOC_ARM_T32_IMM12:
20708     case BFD_RELOC_ARM_T32_ADD_PC12:
20709       /* We claim that this fixup has been processed here,
20710          even if in fact we generate an error because we do
20711          not have a reloc for it, so tc_gen_reloc will reject it.  */
20712       fixP->fx_done = 1;
20713
20714       if (fixP->fx_addsy
20715           && ! S_IS_DEFINED (fixP->fx_addsy))
20716         {
20717           as_bad_where (fixP->fx_file, fixP->fx_line,
20718                         _("undefined symbol %s used as an immediate value"),
20719                         S_GET_NAME (fixP->fx_addsy));
20720           break;
20721         }
20722
20723       newval = md_chars_to_number (buf, THUMB_SIZE);
20724       newval <<= 16;
20725       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
20726
20727       newimm = FAIL;
20728       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
20729           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
20730         {
20731           newimm = encode_thumb32_immediate (value);
20732           if (newimm == (unsigned int) FAIL)
20733             newimm = thumb32_negate_data_op (&newval, value);
20734         }
20735       if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
20736           && newimm == (unsigned int) FAIL)
20737         {
20738           /* Turn add/sum into addw/subw.  */
20739           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
20740             newval = (newval & 0xfeffffff) | 0x02000000;
20741           /* No flat 12-bit imm encoding for addsw/subsw.  */
20742           if ((newval & 0x00100000) == 0)
20743             {
20744               /* 12 bit immediate for addw/subw.  */
20745               if (value < 0)
20746                 {
20747                   value = -value;
20748                   newval ^= 0x00a00000;
20749                 }
20750               if (value > 0xfff)
20751                 newimm = (unsigned int) FAIL;
20752               else
20753                 newimm = value;
20754             }
20755         }
20756
20757       if (newimm == (unsigned int)FAIL)
20758         {
20759           as_bad_where (fixP->fx_file, fixP->fx_line,
20760                         _("invalid constant (%lx) after fixup"),
20761                         (unsigned long) value);
20762           break;
20763         }
20764
20765       newval |= (newimm & 0x800) << 15;
20766       newval |= (newimm & 0x700) << 4;
20767       newval |= (newimm & 0x0ff);
20768
20769       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
20770       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
20771       break;
20772
20773     case BFD_RELOC_ARM_SMC:
20774       if (((unsigned long) value) > 0xffff)
20775         as_bad_where (fixP->fx_file, fixP->fx_line,
20776                       _("invalid smc expression"));
20777       newval = md_chars_to_number (buf, INSN_SIZE);
20778       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
20779       md_number_to_chars (buf, newval, INSN_SIZE);
20780       break;
20781
20782     case BFD_RELOC_ARM_HVC:
20783       if (((unsigned long) value) > 0xffff)
20784         as_bad_where (fixP->fx_file, fixP->fx_line,
20785                       _("invalid hvc expression"));
20786       newval = md_chars_to_number (buf, INSN_SIZE);
20787       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
20788       md_number_to_chars (buf, newval, INSN_SIZE);
20789       break;
20790
20791     case BFD_RELOC_ARM_SWI:
20792       if (fixP->tc_fix_data != 0)
20793         {
20794           if (((unsigned long) value) > 0xff)
20795             as_bad_where (fixP->fx_file, fixP->fx_line,
20796                           _("invalid swi expression"));
20797           newval = md_chars_to_number (buf, THUMB_SIZE);
20798           newval |= value;
20799           md_number_to_chars (buf, newval, THUMB_SIZE);
20800         }
20801       else
20802         {
20803           if (((unsigned long) value) > 0x00ffffff)
20804             as_bad_where (fixP->fx_file, fixP->fx_line,
20805                           _("invalid swi expression"));
20806           newval = md_chars_to_number (buf, INSN_SIZE);
20807           newval |= value;
20808           md_number_to_chars (buf, newval, INSN_SIZE);
20809         }
20810       break;
20811
20812     case BFD_RELOC_ARM_MULTI:
20813       if (((unsigned long) value) > 0xffff)
20814         as_bad_where (fixP->fx_file, fixP->fx_line,
20815                       _("invalid expression in load/store multiple"));
20816       newval = value | md_chars_to_number (buf, INSN_SIZE);
20817       md_number_to_chars (buf, newval, INSN_SIZE);
20818       break;
20819
20820 #ifdef OBJ_ELF
20821     case BFD_RELOC_ARM_PCREL_CALL:
20822
20823       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20824           && fixP->fx_addsy
20825           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
20826           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20827           && THUMB_IS_FUNC (fixP->fx_addsy))
20828         /* Flip the bl to blx. This is a simple flip
20829            bit here because we generate PCREL_CALL for
20830            unconditional bls.  */
20831         {
20832           newval = md_chars_to_number (buf, INSN_SIZE);
20833           newval = newval | 0x10000000;
20834           md_number_to_chars (buf, newval, INSN_SIZE);
20835           temp = 1;
20836           fixP->fx_done = 1;
20837         }
20838       else
20839         temp = 3;
20840       goto arm_branch_common;
20841
20842     case BFD_RELOC_ARM_PCREL_JUMP:
20843       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20844           && fixP->fx_addsy
20845           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
20846           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20847           && THUMB_IS_FUNC (fixP->fx_addsy))
20848         {
20849           /* This would map to a bl<cond>, b<cond>,
20850              b<always> to a Thumb function. We
20851              need to force a relocation for this particular
20852              case.  */
20853           newval = md_chars_to_number (buf, INSN_SIZE);
20854           fixP->fx_done = 0;
20855         }
20856
20857     case BFD_RELOC_ARM_PLT32:
20858 #endif
20859     case BFD_RELOC_ARM_PCREL_BRANCH:
20860       temp = 3;
20861       goto arm_branch_common;
20862
20863     case BFD_RELOC_ARM_PCREL_BLX:
20864
20865       temp = 1;
20866       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
20867           && fixP->fx_addsy
20868           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
20869           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20870           && ARM_IS_FUNC (fixP->fx_addsy))
20871         {
20872           /* Flip the blx to a bl and warn.  */
20873           const char *name = S_GET_NAME (fixP->fx_addsy);
20874           newval = 0xeb000000;
20875           as_warn_where (fixP->fx_file, fixP->fx_line,
20876                          _("blx to '%s' an ARM ISA state function changed to bl"),
20877                           name);
20878           md_number_to_chars (buf, newval, INSN_SIZE);
20879           temp = 3;
20880           fixP->fx_done = 1;
20881         }
20882
20883 #ifdef OBJ_ELF
20884        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
20885          fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
20886 #endif
20887
20888     arm_branch_common:
20889       /* We are going to store value (shifted right by two) in the
20890          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
20891          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
20892          also be be clear.  */
20893       if (value & temp)
20894         as_bad_where (fixP->fx_file, fixP->fx_line,
20895                       _("misaligned branch destination"));
20896       if ((value & (offsetT)0xfe000000) != (offsetT)0
20897           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
20898         as_bad_where (fixP->fx_file, fixP->fx_line,
20899                       _("branch out of range"));
20900
20901       if (fixP->fx_done || !seg->use_rela_p)
20902         {
20903           newval = md_chars_to_number (buf, INSN_SIZE);
20904           newval |= (value >> 2) & 0x00ffffff;
20905           /* Set the H bit on BLX instructions.  */
20906           if (temp == 1)
20907             {
20908               if (value & 2)
20909                 newval |= 0x01000000;
20910               else
20911                 newval &= ~0x01000000;
20912             }
20913           md_number_to_chars (buf, newval, INSN_SIZE);
20914         }
20915       break;
20916
20917     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
20918       /* CBZ can only branch forward.  */
20919
20920       /* Attempts to use CBZ to branch to the next instruction
20921          (which, strictly speaking, are prohibited) will be turned into
20922          no-ops.
20923
20924          FIXME: It may be better to remove the instruction completely and
20925          perform relaxation.  */
20926       if (value == -2)
20927         {
20928           newval = md_chars_to_number (buf, THUMB_SIZE);
20929           newval = 0xbf00; /* NOP encoding T1 */
20930           md_number_to_chars (buf, newval, THUMB_SIZE);
20931         }
20932       else
20933         {
20934           if (value & ~0x7e)
20935             as_bad_where (fixP->fx_file, fixP->fx_line,
20936                           _("branch out of range"));
20937
20938           if (fixP->fx_done || !seg->use_rela_p)
20939             {
20940               newval = md_chars_to_number (buf, THUMB_SIZE);
20941               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
20942               md_number_to_chars (buf, newval, THUMB_SIZE);
20943             }
20944         }
20945       break;
20946
20947     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
20948       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
20949         as_bad_where (fixP->fx_file, fixP->fx_line,
20950                       _("branch out of range"));
20951
20952       if (fixP->fx_done || !seg->use_rela_p)
20953         {
20954           newval = md_chars_to_number (buf, THUMB_SIZE);
20955           newval |= (value & 0x1ff) >> 1;
20956           md_number_to_chars (buf, newval, THUMB_SIZE);
20957         }
20958       break;
20959
20960     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
20961       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
20962         as_bad_where (fixP->fx_file, fixP->fx_line,
20963                       _("branch out of range"));
20964
20965       if (fixP->fx_done || !seg->use_rela_p)
20966         {
20967           newval = md_chars_to_number (buf, THUMB_SIZE);
20968           newval |= (value & 0xfff) >> 1;
20969           md_number_to_chars (buf, newval, THUMB_SIZE);
20970         }
20971       break;
20972
20973     case BFD_RELOC_THUMB_PCREL_BRANCH20:
20974       if (fixP->fx_addsy
20975           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20976           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
20977           && ARM_IS_FUNC (fixP->fx_addsy)
20978           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20979         {
20980           /* Force a relocation for a branch 20 bits wide.  */
20981           fixP->fx_done = 0;
20982         }
20983       if ((value & ~0x1fffff) && ((value & ~0x1fffff) != ~0x1fffff))
20984         as_bad_where (fixP->fx_file, fixP->fx_line,
20985                       _("conditional branch out of range"));
20986
20987       if (fixP->fx_done || !seg->use_rela_p)
20988         {
20989           offsetT newval2;
20990           addressT S, J1, J2, lo, hi;
20991
20992           S  = (value & 0x00100000) >> 20;
20993           J2 = (value & 0x00080000) >> 19;
20994           J1 = (value & 0x00040000) >> 18;
20995           hi = (value & 0x0003f000) >> 12;
20996           lo = (value & 0x00000ffe) >> 1;
20997
20998           newval   = md_chars_to_number (buf, THUMB_SIZE);
20999           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21000           newval  |= (S << 10) | hi;
21001           newval2 |= (J1 << 13) | (J2 << 11) | lo;
21002           md_number_to_chars (buf, newval, THUMB_SIZE);
21003           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
21004         }
21005       break;
21006
21007     case BFD_RELOC_THUMB_PCREL_BLX:
21008
21009       /* If there is a blx from a thumb state function to
21010          another thumb function flip this to a bl and warn
21011          about it.  */
21012
21013       if (fixP->fx_addsy
21014           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21015           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21016           && THUMB_IS_FUNC (fixP->fx_addsy))
21017         {
21018           const char *name = S_GET_NAME (fixP->fx_addsy);
21019           as_warn_where (fixP->fx_file, fixP->fx_line,
21020                          _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
21021                          name);
21022           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21023           newval = newval | 0x1000;
21024           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
21025           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
21026           fixP->fx_done = 1;
21027         }
21028
21029
21030       goto thumb_bl_common;
21031
21032     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21033
21034       /* A bl from Thumb state ISA to an internal ARM state function
21035          is converted to a blx.  */
21036       if (fixP->fx_addsy
21037           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21038           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21039           && ARM_IS_FUNC (fixP->fx_addsy)
21040           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21041         {
21042           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21043           newval = newval & ~0x1000;
21044           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
21045           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
21046           fixP->fx_done = 1;
21047         }
21048
21049     thumb_bl_common:
21050
21051 #ifdef OBJ_ELF
21052        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4 &&
21053            fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
21054          fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
21055 #endif
21056
21057       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
21058         /* For a BLX instruction, make sure that the relocation is rounded up
21059            to a word boundary.  This follows the semantics of the instruction
21060            which specifies that bit 1 of the target address will come from bit
21061            1 of the base address.  */
21062         value = (value + 1) & ~ 1;
21063
21064
21065        if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
21066         {
21067           if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
21068             {
21069               as_bad_where (fixP->fx_file, fixP->fx_line,
21070                             _("branch out of range"));
21071             }
21072           else if ((value & ~0x1ffffff)
21073                    && ((value & ~0x1ffffff) != ~0x1ffffff))
21074               {
21075                 as_bad_where (fixP->fx_file, fixP->fx_line,
21076                             _("Thumb2 branch out of range"));
21077               }
21078         }
21079
21080       if (fixP->fx_done || !seg->use_rela_p)
21081         encode_thumb2_b_bl_offset (buf, value);
21082
21083       break;
21084
21085     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21086       if ((value & ~0x1ffffff) && ((value & ~0x1ffffff) != ~0x1ffffff))
21087         as_bad_where (fixP->fx_file, fixP->fx_line,
21088                       _("branch out of range"));
21089
21090       if (fixP->fx_done || !seg->use_rela_p)
21091           encode_thumb2_b_bl_offset (buf, value);
21092
21093       break;
21094
21095     case BFD_RELOC_8:
21096       if (fixP->fx_done || !seg->use_rela_p)
21097         md_number_to_chars (buf, value, 1);
21098       break;
21099
21100     case BFD_RELOC_16:
21101       if (fixP->fx_done || !seg->use_rela_p)
21102         md_number_to_chars (buf, value, 2);
21103       break;
21104
21105 #ifdef OBJ_ELF
21106     case BFD_RELOC_ARM_TLS_CALL:
21107     case BFD_RELOC_ARM_THM_TLS_CALL:
21108     case BFD_RELOC_ARM_TLS_DESCSEQ:
21109     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
21110       S_SET_THREAD_LOCAL (fixP->fx_addsy);
21111       break;
21112
21113     case BFD_RELOC_ARM_TLS_GOTDESC:
21114     case BFD_RELOC_ARM_TLS_GD32:
21115     case BFD_RELOC_ARM_TLS_LE32:
21116     case BFD_RELOC_ARM_TLS_IE32:
21117     case BFD_RELOC_ARM_TLS_LDM32:
21118     case BFD_RELOC_ARM_TLS_LDO32:
21119       S_SET_THREAD_LOCAL (fixP->fx_addsy);
21120       /* fall through */
21121
21122     case BFD_RELOC_ARM_GOT32:
21123     case BFD_RELOC_ARM_GOTOFF:
21124       if (fixP->fx_done || !seg->use_rela_p)
21125         md_number_to_chars (buf, 0, 4);
21126       break;
21127
21128     case BFD_RELOC_ARM_GOT_PREL:
21129       if (fixP->fx_done || !seg->use_rela_p)
21130         md_number_to_chars (buf, value, 4);
21131       break;
21132
21133     case BFD_RELOC_ARM_TARGET2:
21134       /* TARGET2 is not partial-inplace, so we need to write the
21135          addend here for REL targets, because it won't be written out
21136          during reloc processing later.  */
21137       if (fixP->fx_done || !seg->use_rela_p)
21138         md_number_to_chars (buf, fixP->fx_offset, 4);
21139       break;
21140 #endif
21141
21142     case BFD_RELOC_RVA:
21143     case BFD_RELOC_32:
21144     case BFD_RELOC_ARM_TARGET1:
21145     case BFD_RELOC_ARM_ROSEGREL32:
21146     case BFD_RELOC_ARM_SBREL32:
21147     case BFD_RELOC_32_PCREL:
21148 #ifdef TE_PE
21149     case BFD_RELOC_32_SECREL:
21150 #endif
21151       if (fixP->fx_done || !seg->use_rela_p)
21152 #ifdef TE_WINCE
21153         /* For WinCE we only do this for pcrel fixups.  */
21154         if (fixP->fx_done || fixP->fx_pcrel)
21155 #endif
21156           md_number_to_chars (buf, value, 4);
21157       break;
21158
21159 #ifdef OBJ_ELF
21160     case BFD_RELOC_ARM_PREL31:
21161       if (fixP->fx_done || !seg->use_rela_p)
21162         {
21163           newval = md_chars_to_number (buf, 4) & 0x80000000;
21164           if ((value ^ (value >> 1)) & 0x40000000)
21165             {
21166               as_bad_where (fixP->fx_file, fixP->fx_line,
21167                             _("rel31 relocation overflow"));
21168             }
21169           newval |= value & 0x7fffffff;
21170           md_number_to_chars (buf, newval, 4);
21171         }
21172       break;
21173 #endif
21174
21175     case BFD_RELOC_ARM_CP_OFF_IMM:
21176     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
21177       if (value < -1023 || value > 1023 || (value & 3))
21178         as_bad_where (fixP->fx_file, fixP->fx_line,
21179                       _("co-processor offset out of range"));
21180     cp_off_common:
21181       sign = value > 0;
21182       if (value < 0)
21183         value = -value;
21184       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21185           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
21186         newval = md_chars_to_number (buf, INSN_SIZE);
21187       else
21188         newval = get_thumb32_insn (buf);
21189       if (value == 0)
21190         newval &= 0xffffff00;
21191       else
21192         {
21193           newval &= 0xff7fff00;
21194           newval |= (value >> 2) | (sign ? INDEX_UP : 0);
21195         }
21196       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21197           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
21198         md_number_to_chars (buf, newval, INSN_SIZE);
21199       else
21200         put_thumb32_insn (buf, newval);
21201       break;
21202
21203     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
21204     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
21205       if (value < -255 || value > 255)
21206         as_bad_where (fixP->fx_file, fixP->fx_line,
21207                       _("co-processor offset out of range"));
21208       value *= 4;
21209       goto cp_off_common;
21210
21211     case BFD_RELOC_ARM_THUMB_OFFSET:
21212       newval = md_chars_to_number (buf, THUMB_SIZE);
21213       /* Exactly what ranges, and where the offset is inserted depends
21214          on the type of instruction, we can establish this from the
21215          top 4 bits.  */
21216       switch (newval >> 12)
21217         {
21218         case 4: /* PC load.  */
21219           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
21220              forced to zero for these loads; md_pcrel_from has already
21221              compensated for this.  */
21222           if (value & 3)
21223             as_bad_where (fixP->fx_file, fixP->fx_line,
21224                           _("invalid offset, target not word aligned (0x%08lX)"),
21225                           (((unsigned long) fixP->fx_frag->fr_address
21226                             + (unsigned long) fixP->fx_where) & ~3)
21227                           + (unsigned long) value);
21228
21229           if (value & ~0x3fc)
21230             as_bad_where (fixP->fx_file, fixP->fx_line,
21231                           _("invalid offset, value too big (0x%08lX)"),
21232                           (long) value);
21233
21234           newval |= value >> 2;
21235           break;
21236
21237         case 9: /* SP load/store.  */
21238           if (value & ~0x3fc)
21239             as_bad_where (fixP->fx_file, fixP->fx_line,
21240                           _("invalid offset, value too big (0x%08lX)"),
21241                           (long) value);
21242           newval |= value >> 2;
21243           break;
21244
21245         case 6: /* Word load/store.  */
21246           if (value & ~0x7c)
21247             as_bad_where (fixP->fx_file, fixP->fx_line,
21248                           _("invalid offset, value too big (0x%08lX)"),
21249                           (long) value);
21250           newval |= value << 4; /* 6 - 2.  */
21251           break;
21252
21253         case 7: /* Byte load/store.  */
21254           if (value & ~0x1f)
21255             as_bad_where (fixP->fx_file, fixP->fx_line,
21256                           _("invalid offset, value too big (0x%08lX)"),
21257                           (long) value);
21258           newval |= value << 6;
21259           break;
21260
21261         case 8: /* Halfword load/store.  */
21262           if (value & ~0x3e)
21263             as_bad_where (fixP->fx_file, fixP->fx_line,
21264                           _("invalid offset, value too big (0x%08lX)"),
21265                           (long) value);
21266           newval |= value << 5; /* 6 - 1.  */
21267           break;
21268
21269         default:
21270           as_bad_where (fixP->fx_file, fixP->fx_line,
21271                         "Unable to process relocation for thumb opcode: %lx",
21272                         (unsigned long) newval);
21273           break;
21274         }
21275       md_number_to_chars (buf, newval, THUMB_SIZE);
21276       break;
21277
21278     case BFD_RELOC_ARM_THUMB_ADD:
21279       /* This is a complicated relocation, since we use it for all of
21280          the following immediate relocations:
21281
21282             3bit ADD/SUB
21283             8bit ADD/SUB
21284             9bit ADD/SUB SP word-aligned
21285            10bit ADD PC/SP word-aligned
21286
21287          The type of instruction being processed is encoded in the
21288          instruction field:
21289
21290            0x8000  SUB
21291            0x00F0  Rd
21292            0x000F  Rs
21293       */
21294       newval = md_chars_to_number (buf, THUMB_SIZE);
21295       {
21296         int rd = (newval >> 4) & 0xf;
21297         int rs = newval & 0xf;
21298         int subtract = !!(newval & 0x8000);
21299
21300         /* Check for HI regs, only very restricted cases allowed:
21301            Adjusting SP, and using PC or SP to get an address.  */
21302         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
21303             || (rs > 7 && rs != REG_SP && rs != REG_PC))
21304           as_bad_where (fixP->fx_file, fixP->fx_line,
21305                         _("invalid Hi register with immediate"));
21306
21307         /* If value is negative, choose the opposite instruction.  */
21308         if (value < 0)
21309           {
21310             value = -value;
21311             subtract = !subtract;
21312             if (value < 0)
21313               as_bad_where (fixP->fx_file, fixP->fx_line,
21314                             _("immediate value out of range"));
21315           }
21316
21317         if (rd == REG_SP)
21318           {
21319             if (value & ~0x1fc)
21320               as_bad_where (fixP->fx_file, fixP->fx_line,
21321                             _("invalid immediate for stack address calculation"));
21322             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
21323             newval |= value >> 2;
21324           }
21325         else if (rs == REG_PC || rs == REG_SP)
21326           {
21327             if (subtract || value & ~0x3fc)
21328               as_bad_where (fixP->fx_file, fixP->fx_line,
21329                             _("invalid immediate for address calculation (value = 0x%08lX)"),
21330                             (unsigned long) value);
21331             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
21332             newval |= rd << 8;
21333             newval |= value >> 2;
21334           }
21335         else if (rs == rd)
21336           {
21337             if (value & ~0xff)
21338               as_bad_where (fixP->fx_file, fixP->fx_line,
21339                             _("immediate value out of range"));
21340             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
21341             newval |= (rd << 8) | value;
21342           }
21343         else
21344           {
21345             if (value & ~0x7)
21346               as_bad_where (fixP->fx_file, fixP->fx_line,
21347                             _("immediate value out of range"));
21348             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
21349             newval |= rd | (rs << 3) | (value << 6);
21350           }
21351       }
21352       md_number_to_chars (buf, newval, THUMB_SIZE);
21353       break;
21354
21355     case BFD_RELOC_ARM_THUMB_IMM:
21356       newval = md_chars_to_number (buf, THUMB_SIZE);
21357       if (value < 0 || value > 255)
21358         as_bad_where (fixP->fx_file, fixP->fx_line,
21359                       _("invalid immediate: %ld is out of range"),
21360                       (long) value);
21361       newval |= value;
21362       md_number_to_chars (buf, newval, THUMB_SIZE);
21363       break;
21364
21365     case BFD_RELOC_ARM_THUMB_SHIFT:
21366       /* 5bit shift value (0..32).  LSL cannot take 32.  */
21367       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
21368       temp = newval & 0xf800;
21369       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
21370         as_bad_where (fixP->fx_file, fixP->fx_line,
21371                       _("invalid shift value: %ld"), (long) value);
21372       /* Shifts of zero must be encoded as LSL.  */
21373       if (value == 0)
21374         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
21375       /* Shifts of 32 are encoded as zero.  */
21376       else if (value == 32)
21377         value = 0;
21378       newval |= value << 6;
21379       md_number_to_chars (buf, newval, THUMB_SIZE);
21380       break;
21381
21382     case BFD_RELOC_VTABLE_INHERIT:
21383     case BFD_RELOC_VTABLE_ENTRY:
21384       fixP->fx_done = 0;
21385       return;
21386
21387     case BFD_RELOC_ARM_MOVW:
21388     case BFD_RELOC_ARM_MOVT:
21389     case BFD_RELOC_ARM_THUMB_MOVW:
21390     case BFD_RELOC_ARM_THUMB_MOVT:
21391       if (fixP->fx_done || !seg->use_rela_p)
21392         {
21393           /* REL format relocations are limited to a 16-bit addend.  */
21394           if (!fixP->fx_done)
21395             {
21396               if (value < -0x8000 || value > 0x7fff)
21397                   as_bad_where (fixP->fx_file, fixP->fx_line,
21398                                 _("offset out of range"));
21399             }
21400           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
21401                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21402             {
21403               value >>= 16;
21404             }
21405
21406           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
21407               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21408             {
21409               newval = get_thumb32_insn (buf);
21410               newval &= 0xfbf08f00;
21411               newval |= (value & 0xf000) << 4;
21412               newval |= (value & 0x0800) << 15;
21413               newval |= (value & 0x0700) << 4;
21414               newval |= (value & 0x00ff);
21415               put_thumb32_insn (buf, newval);
21416             }
21417           else
21418             {
21419               newval = md_chars_to_number (buf, 4);
21420               newval &= 0xfff0f000;
21421               newval |= value & 0x0fff;
21422               newval |= (value & 0xf000) << 4;
21423               md_number_to_chars (buf, newval, 4);
21424             }
21425         }
21426       return;
21427
21428    case BFD_RELOC_ARM_ALU_PC_G0_NC:
21429    case BFD_RELOC_ARM_ALU_PC_G0:
21430    case BFD_RELOC_ARM_ALU_PC_G1_NC:
21431    case BFD_RELOC_ARM_ALU_PC_G1:
21432    case BFD_RELOC_ARM_ALU_PC_G2:
21433    case BFD_RELOC_ARM_ALU_SB_G0_NC:
21434    case BFD_RELOC_ARM_ALU_SB_G0:
21435    case BFD_RELOC_ARM_ALU_SB_G1_NC:
21436    case BFD_RELOC_ARM_ALU_SB_G1:
21437    case BFD_RELOC_ARM_ALU_SB_G2:
21438      gas_assert (!fixP->fx_done);
21439      if (!seg->use_rela_p)
21440        {
21441          bfd_vma insn;
21442          bfd_vma encoded_addend;
21443          bfd_vma addend_abs = abs (value);
21444
21445          /* Check that the absolute value of the addend can be
21446             expressed as an 8-bit constant plus a rotation.  */
21447          encoded_addend = encode_arm_immediate (addend_abs);
21448          if (encoded_addend == (unsigned int) FAIL)
21449            as_bad_where (fixP->fx_file, fixP->fx_line,
21450                          _("the offset 0x%08lX is not representable"),
21451                          (unsigned long) addend_abs);
21452
21453          /* Extract the instruction.  */
21454          insn = md_chars_to_number (buf, INSN_SIZE);
21455
21456          /* If the addend is positive, use an ADD instruction.
21457             Otherwise use a SUB.  Take care not to destroy the S bit.  */
21458          insn &= 0xff1fffff;
21459          if (value < 0)
21460            insn |= 1 << 22;
21461          else
21462            insn |= 1 << 23;
21463
21464          /* Place the encoded addend into the first 12 bits of the
21465             instruction.  */
21466          insn &= 0xfffff000;
21467          insn |= encoded_addend;
21468
21469          /* Update the instruction.  */
21470          md_number_to_chars (buf, insn, INSN_SIZE);
21471        }
21472      break;
21473
21474     case BFD_RELOC_ARM_LDR_PC_G0:
21475     case BFD_RELOC_ARM_LDR_PC_G1:
21476     case BFD_RELOC_ARM_LDR_PC_G2:
21477     case BFD_RELOC_ARM_LDR_SB_G0:
21478     case BFD_RELOC_ARM_LDR_SB_G1:
21479     case BFD_RELOC_ARM_LDR_SB_G2:
21480       gas_assert (!fixP->fx_done);
21481       if (!seg->use_rela_p)
21482         {
21483           bfd_vma insn;
21484           bfd_vma addend_abs = abs (value);
21485
21486           /* Check that the absolute value of the addend can be
21487              encoded in 12 bits.  */
21488           if (addend_abs >= 0x1000)
21489             as_bad_where (fixP->fx_file, fixP->fx_line,
21490                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
21491                           (unsigned long) addend_abs);
21492
21493           /* Extract the instruction.  */
21494           insn = md_chars_to_number (buf, INSN_SIZE);
21495
21496           /* If the addend is negative, clear bit 23 of the instruction.
21497              Otherwise set it.  */
21498           if (value < 0)
21499             insn &= ~(1 << 23);
21500           else
21501             insn |= 1 << 23;
21502
21503           /* Place the absolute value of the addend into the first 12 bits
21504              of the instruction.  */
21505           insn &= 0xfffff000;
21506           insn |= addend_abs;
21507
21508           /* Update the instruction.  */
21509           md_number_to_chars (buf, insn, INSN_SIZE);
21510         }
21511       break;
21512
21513     case BFD_RELOC_ARM_LDRS_PC_G0:
21514     case BFD_RELOC_ARM_LDRS_PC_G1:
21515     case BFD_RELOC_ARM_LDRS_PC_G2:
21516     case BFD_RELOC_ARM_LDRS_SB_G0:
21517     case BFD_RELOC_ARM_LDRS_SB_G1:
21518     case BFD_RELOC_ARM_LDRS_SB_G2:
21519       gas_assert (!fixP->fx_done);
21520       if (!seg->use_rela_p)
21521         {
21522           bfd_vma insn;
21523           bfd_vma addend_abs = abs (value);
21524
21525           /* Check that the absolute value of the addend can be
21526              encoded in 8 bits.  */
21527           if (addend_abs >= 0x100)
21528             as_bad_where (fixP->fx_file, fixP->fx_line,
21529                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
21530                           (unsigned long) addend_abs);
21531
21532           /* Extract the instruction.  */
21533           insn = md_chars_to_number (buf, INSN_SIZE);
21534
21535           /* If the addend is negative, clear bit 23 of the instruction.
21536              Otherwise set it.  */
21537           if (value < 0)
21538             insn &= ~(1 << 23);
21539           else
21540             insn |= 1 << 23;
21541
21542           /* Place the first four bits of the absolute value of the addend
21543              into the first 4 bits of the instruction, and the remaining
21544              four into bits 8 .. 11.  */
21545           insn &= 0xfffff0f0;
21546           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
21547
21548           /* Update the instruction.  */
21549           md_number_to_chars (buf, insn, INSN_SIZE);
21550         }
21551       break;
21552
21553     case BFD_RELOC_ARM_LDC_PC_G0:
21554     case BFD_RELOC_ARM_LDC_PC_G1:
21555     case BFD_RELOC_ARM_LDC_PC_G2:
21556     case BFD_RELOC_ARM_LDC_SB_G0:
21557     case BFD_RELOC_ARM_LDC_SB_G1:
21558     case BFD_RELOC_ARM_LDC_SB_G2:
21559       gas_assert (!fixP->fx_done);
21560       if (!seg->use_rela_p)
21561         {
21562           bfd_vma insn;
21563           bfd_vma addend_abs = abs (value);
21564
21565           /* Check that the absolute value of the addend is a multiple of
21566              four and, when divided by four, fits in 8 bits.  */
21567           if (addend_abs & 0x3)
21568             as_bad_where (fixP->fx_file, fixP->fx_line,
21569                           _("bad offset 0x%08lX (must be word-aligned)"),
21570                           (unsigned long) addend_abs);
21571
21572           if ((addend_abs >> 2) > 0xff)
21573             as_bad_where (fixP->fx_file, fixP->fx_line,
21574                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
21575                           (unsigned long) addend_abs);
21576
21577           /* Extract the instruction.  */
21578           insn = md_chars_to_number (buf, INSN_SIZE);
21579
21580           /* If the addend is negative, clear bit 23 of the instruction.
21581              Otherwise set it.  */
21582           if (value < 0)
21583             insn &= ~(1 << 23);
21584           else
21585             insn |= 1 << 23;
21586
21587           /* Place the addend (divided by four) into the first eight
21588              bits of the instruction.  */
21589           insn &= 0xfffffff0;
21590           insn |= addend_abs >> 2;
21591
21592           /* Update the instruction.  */
21593           md_number_to_chars (buf, insn, INSN_SIZE);
21594         }
21595       break;
21596
21597     case BFD_RELOC_ARM_V4BX:
21598       /* This will need to go in the object file.  */
21599       fixP->fx_done = 0;
21600       break;
21601
21602     case BFD_RELOC_UNUSED:
21603     default:
21604       as_bad_where (fixP->fx_file, fixP->fx_line,
21605                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
21606     }
21607 }
21608
21609 /* Translate internal representation of relocation info to BFD target
21610    format.  */
21611
21612 arelent *
21613 tc_gen_reloc (asection *section, fixS *fixp)
21614 {
21615   arelent * reloc;
21616   bfd_reloc_code_real_type code;
21617
21618   reloc = (arelent *) xmalloc (sizeof (arelent));
21619
21620   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
21621   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
21622   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
21623
21624   if (fixp->fx_pcrel)
21625     {
21626       if (section->use_rela_p)
21627         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
21628       else
21629         fixp->fx_offset = reloc->address;
21630     }
21631   reloc->addend = fixp->fx_offset;
21632
21633   switch (fixp->fx_r_type)
21634     {
21635     case BFD_RELOC_8:
21636       if (fixp->fx_pcrel)
21637         {
21638           code = BFD_RELOC_8_PCREL;
21639           break;
21640         }
21641
21642     case BFD_RELOC_16:
21643       if (fixp->fx_pcrel)
21644         {
21645           code = BFD_RELOC_16_PCREL;
21646           break;
21647         }
21648
21649     case BFD_RELOC_32:
21650       if (fixp->fx_pcrel)
21651         {
21652           code = BFD_RELOC_32_PCREL;
21653           break;
21654         }
21655
21656     case BFD_RELOC_ARM_MOVW:
21657       if (fixp->fx_pcrel)
21658         {
21659           code = BFD_RELOC_ARM_MOVW_PCREL;
21660           break;
21661         }
21662
21663     case BFD_RELOC_ARM_MOVT:
21664       if (fixp->fx_pcrel)
21665         {
21666           code = BFD_RELOC_ARM_MOVT_PCREL;
21667           break;
21668         }
21669
21670     case BFD_RELOC_ARM_THUMB_MOVW:
21671       if (fixp->fx_pcrel)
21672         {
21673           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
21674           break;
21675         }
21676
21677     case BFD_RELOC_ARM_THUMB_MOVT:
21678       if (fixp->fx_pcrel)
21679         {
21680           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
21681           break;
21682         }
21683
21684     case BFD_RELOC_NONE:
21685     case BFD_RELOC_ARM_PCREL_BRANCH:
21686     case BFD_RELOC_ARM_PCREL_BLX:
21687     case BFD_RELOC_RVA:
21688     case BFD_RELOC_THUMB_PCREL_BRANCH7:
21689     case BFD_RELOC_THUMB_PCREL_BRANCH9:
21690     case BFD_RELOC_THUMB_PCREL_BRANCH12:
21691     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21692     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21693     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21694     case BFD_RELOC_VTABLE_ENTRY:
21695     case BFD_RELOC_VTABLE_INHERIT:
21696 #ifdef TE_PE
21697     case BFD_RELOC_32_SECREL:
21698 #endif
21699       code = fixp->fx_r_type;
21700       break;
21701
21702     case BFD_RELOC_THUMB_PCREL_BLX:
21703 #ifdef OBJ_ELF
21704       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
21705         code = BFD_RELOC_THUMB_PCREL_BRANCH23;
21706       else
21707 #endif
21708         code = BFD_RELOC_THUMB_PCREL_BLX;
21709       break;
21710
21711     case BFD_RELOC_ARM_LITERAL:
21712     case BFD_RELOC_ARM_HWLITERAL:
21713       /* If this is called then the a literal has
21714          been referenced across a section boundary.  */
21715       as_bad_where (fixp->fx_file, fixp->fx_line,
21716                     _("literal referenced across section boundary"));
21717       return NULL;
21718
21719 #ifdef OBJ_ELF
21720     case BFD_RELOC_ARM_TLS_CALL:
21721     case BFD_RELOC_ARM_THM_TLS_CALL:
21722     case BFD_RELOC_ARM_TLS_DESCSEQ:
21723     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
21724     case BFD_RELOC_ARM_GOT32:
21725     case BFD_RELOC_ARM_GOTOFF:
21726     case BFD_RELOC_ARM_GOT_PREL:
21727     case BFD_RELOC_ARM_PLT32:
21728     case BFD_RELOC_ARM_TARGET1:
21729     case BFD_RELOC_ARM_ROSEGREL32:
21730     case BFD_RELOC_ARM_SBREL32:
21731     case BFD_RELOC_ARM_PREL31:
21732     case BFD_RELOC_ARM_TARGET2:
21733     case BFD_RELOC_ARM_TLS_LE32:
21734     case BFD_RELOC_ARM_TLS_LDO32:
21735     case BFD_RELOC_ARM_PCREL_CALL:
21736     case BFD_RELOC_ARM_PCREL_JUMP:
21737     case BFD_RELOC_ARM_ALU_PC_G0_NC:
21738     case BFD_RELOC_ARM_ALU_PC_G0:
21739     case BFD_RELOC_ARM_ALU_PC_G1_NC:
21740     case BFD_RELOC_ARM_ALU_PC_G1:
21741     case BFD_RELOC_ARM_ALU_PC_G2:
21742     case BFD_RELOC_ARM_LDR_PC_G0:
21743     case BFD_RELOC_ARM_LDR_PC_G1:
21744     case BFD_RELOC_ARM_LDR_PC_G2:
21745     case BFD_RELOC_ARM_LDRS_PC_G0:
21746     case BFD_RELOC_ARM_LDRS_PC_G1:
21747     case BFD_RELOC_ARM_LDRS_PC_G2:
21748     case BFD_RELOC_ARM_LDC_PC_G0:
21749     case BFD_RELOC_ARM_LDC_PC_G1:
21750     case BFD_RELOC_ARM_LDC_PC_G2:
21751     case BFD_RELOC_ARM_ALU_SB_G0_NC:
21752     case BFD_RELOC_ARM_ALU_SB_G0:
21753     case BFD_RELOC_ARM_ALU_SB_G1_NC:
21754     case BFD_RELOC_ARM_ALU_SB_G1:
21755     case BFD_RELOC_ARM_ALU_SB_G2:
21756     case BFD_RELOC_ARM_LDR_SB_G0:
21757     case BFD_RELOC_ARM_LDR_SB_G1:
21758     case BFD_RELOC_ARM_LDR_SB_G2:
21759     case BFD_RELOC_ARM_LDRS_SB_G0:
21760     case BFD_RELOC_ARM_LDRS_SB_G1:
21761     case BFD_RELOC_ARM_LDRS_SB_G2:
21762     case BFD_RELOC_ARM_LDC_SB_G0:
21763     case BFD_RELOC_ARM_LDC_SB_G1:
21764     case BFD_RELOC_ARM_LDC_SB_G2:
21765     case BFD_RELOC_ARM_V4BX:
21766       code = fixp->fx_r_type;
21767       break;
21768
21769     case BFD_RELOC_ARM_TLS_GOTDESC:
21770     case BFD_RELOC_ARM_TLS_GD32:
21771     case BFD_RELOC_ARM_TLS_IE32:
21772     case BFD_RELOC_ARM_TLS_LDM32:
21773       /* BFD will include the symbol's address in the addend.
21774          But we don't want that, so subtract it out again here.  */
21775       if (!S_IS_COMMON (fixp->fx_addsy))
21776         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
21777       code = fixp->fx_r_type;
21778       break;
21779 #endif
21780
21781     case BFD_RELOC_ARM_IMMEDIATE:
21782       as_bad_where (fixp->fx_file, fixp->fx_line,
21783                     _("internal relocation (type: IMMEDIATE) not fixed up"));
21784       return NULL;
21785
21786     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21787       as_bad_where (fixp->fx_file, fixp->fx_line,
21788                     _("ADRL used for a symbol not defined in the same file"));
21789       return NULL;
21790
21791     case BFD_RELOC_ARM_OFFSET_IMM:
21792       if (section->use_rela_p)
21793         {
21794           code = fixp->fx_r_type;
21795           break;
21796         }
21797
21798       if (fixp->fx_addsy != NULL
21799           && !S_IS_DEFINED (fixp->fx_addsy)
21800           && S_IS_LOCAL (fixp->fx_addsy))
21801         {
21802           as_bad_where (fixp->fx_file, fixp->fx_line,
21803                         _("undefined local label `%s'"),
21804                         S_GET_NAME (fixp->fx_addsy));
21805           return NULL;
21806         }
21807
21808       as_bad_where (fixp->fx_file, fixp->fx_line,
21809                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
21810       return NULL;
21811
21812     default:
21813       {
21814         char * type;
21815
21816         switch (fixp->fx_r_type)
21817           {
21818           case BFD_RELOC_NONE:             type = "NONE";         break;
21819           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
21820           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
21821           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
21822           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
21823           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
21824           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
21825           case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
21826           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
21827           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
21828           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
21829           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
21830           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
21831           default:                         type = _("<unknown>"); break;
21832           }
21833         as_bad_where (fixp->fx_file, fixp->fx_line,
21834                       _("cannot represent %s relocation in this object file format"),
21835                       type);
21836         return NULL;
21837       }
21838     }
21839
21840 #ifdef OBJ_ELF
21841   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
21842       && GOT_symbol
21843       && fixp->fx_addsy == GOT_symbol)
21844     {
21845       code = BFD_RELOC_ARM_GOTPC;
21846       reloc->addend = fixp->fx_offset = reloc->address;
21847     }
21848 #endif
21849
21850   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
21851
21852   if (reloc->howto == NULL)
21853     {
21854       as_bad_where (fixp->fx_file, fixp->fx_line,
21855                     _("cannot represent %s relocation in this object file format"),
21856                     bfd_get_reloc_code_name (code));
21857       return NULL;
21858     }
21859
21860   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
21861      vtable entry to be used in the relocation's section offset.  */
21862   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
21863     reloc->address = fixp->fx_offset;
21864
21865   return reloc;
21866 }
21867
21868 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
21869
21870 void
21871 cons_fix_new_arm (fragS *       frag,
21872                   int           where,
21873                   int           size,
21874                   expressionS * exp)
21875 {
21876   bfd_reloc_code_real_type type;
21877   int pcrel = 0;
21878
21879   /* Pick a reloc.
21880      FIXME: @@ Should look at CPU word size.  */
21881   switch (size)
21882     {
21883     case 1:
21884       type = BFD_RELOC_8;
21885       break;
21886     case 2:
21887       type = BFD_RELOC_16;
21888       break;
21889     case 4:
21890     default:
21891       type = BFD_RELOC_32;
21892       break;
21893     case 8:
21894       type = BFD_RELOC_64;
21895       break;
21896     }
21897
21898 #ifdef TE_PE
21899   if (exp->X_op == O_secrel)
21900   {
21901     exp->X_op = O_symbol;
21902     type = BFD_RELOC_32_SECREL;
21903   }
21904 #endif
21905
21906   fix_new_exp (frag, where, (int) size, exp, pcrel, type);
21907 }
21908
21909 #if defined (OBJ_COFF)
21910 void
21911 arm_validate_fix (fixS * fixP)
21912 {
21913   /* If the destination of the branch is a defined symbol which does not have
21914      the THUMB_FUNC attribute, then we must be calling a function which has
21915      the (interfacearm) attribute.  We look for the Thumb entry point to that
21916      function and change the branch to refer to that function instead.  */
21917   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
21918       && fixP->fx_addsy != NULL
21919       && S_IS_DEFINED (fixP->fx_addsy)
21920       && ! THUMB_IS_FUNC (fixP->fx_addsy))
21921     {
21922       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
21923     }
21924 }
21925 #endif
21926
21927
21928 int
21929 arm_force_relocation (struct fix * fixp)
21930 {
21931 #if defined (OBJ_COFF) && defined (TE_PE)
21932   if (fixp->fx_r_type == BFD_RELOC_RVA)
21933     return 1;
21934 #endif
21935
21936   /* In case we have a call or a branch to a function in ARM ISA mode from
21937      a thumb function or vice-versa force the relocation. These relocations
21938      are cleared off for some cores that might have blx and simple transformations
21939      are possible.  */
21940
21941 #ifdef OBJ_ELF
21942   switch (fixp->fx_r_type)
21943     {
21944     case BFD_RELOC_ARM_PCREL_JUMP:
21945     case BFD_RELOC_ARM_PCREL_CALL:
21946     case BFD_RELOC_THUMB_PCREL_BLX:
21947       if (THUMB_IS_FUNC (fixp->fx_addsy))
21948         return 1;
21949       break;
21950
21951     case BFD_RELOC_ARM_PCREL_BLX:
21952     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21953     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21954     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21955       if (ARM_IS_FUNC (fixp->fx_addsy))
21956         return 1;
21957       break;
21958
21959     default:
21960       break;
21961     }
21962 #endif
21963
21964   /* Resolve these relocations even if the symbol is extern or weak.
21965      Technically this is probably wrong due to symbol preemption.
21966      In practice these relocations do not have enough range to be useful
21967      at dynamic link time, and some code (e.g. in the Linux kernel)
21968      expects these references to be resolved.  */
21969   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
21970       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
21971       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
21972       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
21973       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21974       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
21975       || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
21976       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
21977       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
21978       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
21979       || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
21980       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
21981       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
21982       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
21983     return 0;
21984
21985   /* Always leave these relocations for the linker.  */
21986   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
21987        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
21988       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
21989     return 1;
21990
21991   /* Always generate relocations against function symbols.  */
21992   if (fixp->fx_r_type == BFD_RELOC_32
21993       && fixp->fx_addsy
21994       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
21995     return 1;
21996
21997   return generic_force_reloc (fixp);
21998 }
21999
22000 #if defined (OBJ_ELF) || defined (OBJ_COFF)
22001 /* Relocations against function names must be left unadjusted,
22002    so that the linker can use this information to generate interworking
22003    stubs.  The MIPS version of this function
22004    also prevents relocations that are mips-16 specific, but I do not
22005    know why it does this.
22006
22007    FIXME:
22008    There is one other problem that ought to be addressed here, but
22009    which currently is not:  Taking the address of a label (rather
22010    than a function) and then later jumping to that address.  Such
22011    addresses also ought to have their bottom bit set (assuming that
22012    they reside in Thumb code), but at the moment they will not.  */
22013
22014 bfd_boolean
22015 arm_fix_adjustable (fixS * fixP)
22016 {
22017   if (fixP->fx_addsy == NULL)
22018     return 1;
22019
22020   /* Preserve relocations against symbols with function type.  */
22021   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
22022     return FALSE;
22023
22024   if (THUMB_IS_FUNC (fixP->fx_addsy)
22025       && fixP->fx_subsy == NULL)
22026     return FALSE;
22027
22028   /* We need the symbol name for the VTABLE entries.  */
22029   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
22030       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
22031     return FALSE;
22032
22033   /* Don't allow symbols to be discarded on GOT related relocs.  */
22034   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
22035       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
22036       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
22037       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
22038       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
22039       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
22040       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
22041       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
22042       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
22043       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
22044       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
22045       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
22046       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
22047       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
22048     return FALSE;
22049
22050   /* Similarly for group relocations.  */
22051   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
22052        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
22053       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
22054     return FALSE;
22055
22056   /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
22057   if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
22058       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
22059       || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
22060       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
22061       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
22062       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
22063       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
22064       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
22065     return FALSE;
22066
22067   return TRUE;
22068 }
22069 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
22070
22071 #ifdef OBJ_ELF
22072
22073 const char *
22074 elf32_arm_target_format (void)
22075 {
22076 #ifdef TE_SYMBIAN
22077   return (target_big_endian
22078           ? "elf32-bigarm-symbian"
22079           : "elf32-littlearm-symbian");
22080 #elif defined (TE_VXWORKS)
22081   return (target_big_endian
22082           ? "elf32-bigarm-vxworks"
22083           : "elf32-littlearm-vxworks");
22084 #else
22085   if (target_big_endian)
22086     return "elf32-bigarm";
22087   else
22088     return "elf32-littlearm";
22089 #endif
22090 }
22091
22092 void
22093 armelf_frob_symbol (symbolS * symp,
22094                     int *     puntp)
22095 {
22096   elf_frob_symbol (symp, puntp);
22097 }
22098 #endif
22099
22100 /* MD interface: Finalization.  */
22101
22102 void
22103 arm_cleanup (void)
22104 {
22105   literal_pool * pool;
22106
22107   /* Ensure that all the IT blocks are properly closed.  */
22108   check_it_blocks_finished ();
22109
22110   for (pool = list_of_pools; pool; pool = pool->next)
22111     {
22112       /* Put it at the end of the relevant section.  */
22113       subseg_set (pool->section, pool->sub_section);
22114 #ifdef OBJ_ELF
22115       arm_elf_change_section ();
22116 #endif
22117       s_ltorg (0);
22118     }
22119 }
22120
22121 #ifdef OBJ_ELF
22122 /* Remove any excess mapping symbols generated for alignment frags in
22123    SEC.  We may have created a mapping symbol before a zero byte
22124    alignment; remove it if there's a mapping symbol after the
22125    alignment.  */
22126 static void
22127 check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
22128                        void *dummy ATTRIBUTE_UNUSED)
22129 {
22130   segment_info_type *seginfo = seg_info (sec);
22131   fragS *fragp;
22132
22133   if (seginfo == NULL || seginfo->frchainP == NULL)
22134     return;
22135
22136   for (fragp = seginfo->frchainP->frch_root;
22137        fragp != NULL;
22138        fragp = fragp->fr_next)
22139     {
22140       symbolS *sym = fragp->tc_frag_data.last_map;
22141       fragS *next = fragp->fr_next;
22142
22143       /* Variable-sized frags have been converted to fixed size by
22144          this point.  But if this was variable-sized to start with,
22145          there will be a fixed-size frag after it.  So don't handle
22146          next == NULL.  */
22147       if (sym == NULL || next == NULL)
22148         continue;
22149
22150       if (S_GET_VALUE (sym) < next->fr_address)
22151         /* Not at the end of this frag.  */
22152         continue;
22153       know (S_GET_VALUE (sym) == next->fr_address);
22154
22155       do
22156         {
22157           if (next->tc_frag_data.first_map != NULL)
22158             {
22159               /* Next frag starts with a mapping symbol.  Discard this
22160                  one.  */
22161               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
22162               break;
22163             }
22164
22165           if (next->fr_next == NULL)
22166             {
22167               /* This mapping symbol is at the end of the section.  Discard
22168                  it.  */
22169               know (next->fr_fix == 0 && next->fr_var == 0);
22170               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
22171               break;
22172             }
22173
22174           /* As long as we have empty frags without any mapping symbols,
22175              keep looking.  */
22176           /* If the next frag is non-empty and does not start with a
22177              mapping symbol, then this mapping symbol is required.  */
22178           if (next->fr_address != next->fr_next->fr_address)
22179             break;
22180
22181           next = next->fr_next;
22182         }
22183       while (next != NULL);
22184     }
22185 }
22186 #endif
22187
22188 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
22189    ARM ones.  */
22190
22191 void
22192 arm_adjust_symtab (void)
22193 {
22194 #ifdef OBJ_COFF
22195   symbolS * sym;
22196
22197   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
22198     {
22199       if (ARM_IS_THUMB (sym))
22200         {
22201           if (THUMB_IS_FUNC (sym))
22202             {
22203               /* Mark the symbol as a Thumb function.  */
22204               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
22205                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
22206                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
22207
22208               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
22209                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
22210               else
22211                 as_bad (_("%s: unexpected function type: %d"),
22212                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
22213             }
22214           else switch (S_GET_STORAGE_CLASS (sym))
22215             {
22216             case C_EXT:
22217               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
22218               break;
22219             case C_STAT:
22220               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
22221               break;
22222             case C_LABEL:
22223               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
22224               break;
22225             default:
22226               /* Do nothing.  */
22227               break;
22228             }
22229         }
22230
22231       if (ARM_IS_INTERWORK (sym))
22232         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
22233     }
22234 #endif
22235 #ifdef OBJ_ELF
22236   symbolS * sym;
22237   char      bind;
22238
22239   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
22240     {
22241       if (ARM_IS_THUMB (sym))
22242         {
22243           elf_symbol_type * elf_sym;
22244
22245           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
22246           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
22247
22248           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
22249                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
22250             {
22251               /* If it's a .thumb_func, declare it as so,
22252                  otherwise tag label as .code 16.  */
22253               if (THUMB_IS_FUNC (sym))
22254                 elf_sym->internal_elf_sym.st_target_internal
22255                   = ST_BRANCH_TO_THUMB;
22256               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
22257                 elf_sym->internal_elf_sym.st_info =
22258                   ELF_ST_INFO (bind, STT_ARM_16BIT);
22259             }
22260         }
22261     }
22262
22263   /* Remove any overlapping mapping symbols generated by alignment frags.  */
22264   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
22265   /* Now do generic ELF adjustments.  */
22266   elf_adjust_symtab ();
22267 #endif
22268 }
22269
22270 /* MD interface: Initialization.  */
22271
22272 static void
22273 set_constant_flonums (void)
22274 {
22275   int i;
22276
22277   for (i = 0; i < NUM_FLOAT_VALS; i++)
22278     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
22279       abort ();
22280 }
22281
22282 /* Auto-select Thumb mode if it's the only available instruction set for the
22283    given architecture.  */
22284
22285 static void
22286 autoselect_thumb_from_cpu_variant (void)
22287 {
22288   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
22289     opcode_select (16);
22290 }
22291
22292 void
22293 md_begin (void)
22294 {
22295   unsigned mach;
22296   unsigned int i;
22297
22298   if (   (arm_ops_hsh = hash_new ()) == NULL
22299       || (arm_cond_hsh = hash_new ()) == NULL
22300       || (arm_shift_hsh = hash_new ()) == NULL
22301       || (arm_psr_hsh = hash_new ()) == NULL
22302       || (arm_v7m_psr_hsh = hash_new ()) == NULL
22303       || (arm_reg_hsh = hash_new ()) == NULL
22304       || (arm_reloc_hsh = hash_new ()) == NULL
22305       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
22306     as_fatal (_("virtual memory exhausted"));
22307
22308   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
22309     hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
22310   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
22311     hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
22312   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
22313     hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
22314   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
22315     hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
22316   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
22317     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
22318                  (void *) (v7m_psrs + i));
22319   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
22320     hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
22321   for (i = 0;
22322        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
22323        i++)
22324     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
22325                  (void *) (barrier_opt_names + i));
22326 #ifdef OBJ_ELF
22327   for (i = 0; i < sizeof (reloc_names) / sizeof (struct reloc_entry); i++)
22328     hash_insert (arm_reloc_hsh, reloc_names[i].name, (void *) (reloc_names + i));
22329 #endif
22330
22331   set_constant_flonums ();
22332
22333   /* Set the cpu variant based on the command-line options.  We prefer
22334      -mcpu= over -march= if both are set (as for GCC); and we prefer
22335      -mfpu= over any other way of setting the floating point unit.
22336      Use of legacy options with new options are faulted.  */
22337   if (legacy_cpu)
22338     {
22339       if (mcpu_cpu_opt || march_cpu_opt)
22340         as_bad (_("use of old and new-style options to set CPU type"));
22341
22342       mcpu_cpu_opt = legacy_cpu;
22343     }
22344   else if (!mcpu_cpu_opt)
22345     mcpu_cpu_opt = march_cpu_opt;
22346
22347   if (legacy_fpu)
22348     {
22349       if (mfpu_opt)
22350         as_bad (_("use of old and new-style options to set FPU type"));
22351
22352       mfpu_opt = legacy_fpu;
22353     }
22354   else if (!mfpu_opt)
22355     {
22356 #if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
22357         || defined (TE_NetBSD) || defined (TE_VXWORKS))
22358       /* Some environments specify a default FPU.  If they don't, infer it
22359          from the processor.  */
22360       if (mcpu_fpu_opt)
22361         mfpu_opt = mcpu_fpu_opt;
22362       else
22363         mfpu_opt = march_fpu_opt;
22364 #else
22365       mfpu_opt = &fpu_default;
22366 #endif
22367     }
22368
22369   if (!mfpu_opt)
22370     {
22371       if (mcpu_cpu_opt != NULL)
22372         mfpu_opt = &fpu_default;
22373       else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
22374         mfpu_opt = &fpu_arch_vfp_v2;
22375       else
22376         mfpu_opt = &fpu_arch_fpa;
22377     }
22378
22379 #ifdef CPU_DEFAULT
22380   if (!mcpu_cpu_opt)
22381     {
22382       mcpu_cpu_opt = &cpu_default;
22383       selected_cpu = cpu_default;
22384     }
22385 #else
22386   if (mcpu_cpu_opt)
22387     selected_cpu = *mcpu_cpu_opt;
22388   else
22389     mcpu_cpu_opt = &arm_arch_any;
22390 #endif
22391
22392   ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
22393
22394   autoselect_thumb_from_cpu_variant ();
22395
22396   arm_arch_used = thumb_arch_used = arm_arch_none;
22397
22398 #if defined OBJ_COFF || defined OBJ_ELF
22399   {
22400     unsigned int flags = 0;
22401
22402 #if defined OBJ_ELF
22403     flags = meabi_flags;
22404
22405     switch (meabi_flags)
22406       {
22407       case EF_ARM_EABI_UNKNOWN:
22408 #endif
22409         /* Set the flags in the private structure.  */
22410         if (uses_apcs_26)      flags |= F_APCS26;
22411         if (support_interwork) flags |= F_INTERWORK;
22412         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
22413         if (pic_code)          flags |= F_PIC;
22414         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
22415           flags |= F_SOFT_FLOAT;
22416
22417         switch (mfloat_abi_opt)
22418           {
22419           case ARM_FLOAT_ABI_SOFT:
22420           case ARM_FLOAT_ABI_SOFTFP:
22421             flags |= F_SOFT_FLOAT;
22422             break;
22423
22424           case ARM_FLOAT_ABI_HARD:
22425             if (flags & F_SOFT_FLOAT)
22426               as_bad (_("hard-float conflicts with specified fpu"));
22427             break;
22428           }
22429
22430         /* Using pure-endian doubles (even if soft-float).      */
22431         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
22432           flags |= F_VFP_FLOAT;
22433
22434 #if defined OBJ_ELF
22435         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
22436             flags |= EF_ARM_MAVERICK_FLOAT;
22437         break;
22438
22439       case EF_ARM_EABI_VER4:
22440       case EF_ARM_EABI_VER5:
22441         /* No additional flags to set.  */
22442         break;
22443
22444       default:
22445         abort ();
22446       }
22447 #endif
22448     bfd_set_private_flags (stdoutput, flags);
22449
22450     /* We have run out flags in the COFF header to encode the
22451        status of ATPCS support, so instead we create a dummy,
22452        empty, debug section called .arm.atpcs.  */
22453     if (atpcs)
22454       {
22455         asection * sec;
22456
22457         sec = bfd_make_section (stdoutput, ".arm.atpcs");
22458
22459         if (sec != NULL)
22460           {
22461             bfd_set_section_flags
22462               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
22463             bfd_set_section_size (stdoutput, sec, 0);
22464             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
22465           }
22466       }
22467   }
22468 #endif
22469
22470   /* Record the CPU type as well.  */
22471   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
22472     mach = bfd_mach_arm_iWMMXt2;
22473   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
22474     mach = bfd_mach_arm_iWMMXt;
22475   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
22476     mach = bfd_mach_arm_XScale;
22477   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
22478     mach = bfd_mach_arm_ep9312;
22479   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
22480     mach = bfd_mach_arm_5TE;
22481   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
22482     {
22483       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
22484         mach = bfd_mach_arm_5T;
22485       else
22486         mach = bfd_mach_arm_5;
22487     }
22488   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
22489     {
22490       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
22491         mach = bfd_mach_arm_4T;
22492       else
22493         mach = bfd_mach_arm_4;
22494     }
22495   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
22496     mach = bfd_mach_arm_3M;
22497   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
22498     mach = bfd_mach_arm_3;
22499   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
22500     mach = bfd_mach_arm_2a;
22501   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
22502     mach = bfd_mach_arm_2;
22503   else
22504     mach = bfd_mach_arm_unknown;
22505
22506   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
22507 }
22508
22509 /* Command line processing.  */
22510
22511 /* md_parse_option
22512       Invocation line includes a switch not recognized by the base assembler.
22513       See if it's a processor-specific option.
22514
22515       This routine is somewhat complicated by the need for backwards
22516       compatibility (since older releases of gcc can't be changed).
22517       The new options try to make the interface as compatible as
22518       possible with GCC.
22519
22520       New options (supported) are:
22521
22522               -mcpu=<cpu name>           Assemble for selected processor
22523               -march=<architecture name> Assemble for selected architecture
22524               -mfpu=<fpu architecture>   Assemble for selected FPU.
22525               -EB/-mbig-endian           Big-endian
22526               -EL/-mlittle-endian        Little-endian
22527               -k                         Generate PIC code
22528               -mthumb                    Start in Thumb mode
22529               -mthumb-interwork          Code supports ARM/Thumb interworking
22530
22531               -m[no-]warn-deprecated     Warn about deprecated features
22532
22533       For now we will also provide support for:
22534
22535               -mapcs-32                  32-bit Program counter
22536               -mapcs-26                  26-bit Program counter
22537               -macps-float               Floats passed in FP registers
22538               -mapcs-reentrant           Reentrant code
22539               -matpcs
22540       (sometime these will probably be replaced with -mapcs=<list of options>
22541       and -matpcs=<list of options>)
22542
22543       The remaining options are only supported for back-wards compatibility.
22544       Cpu variants, the arm part is optional:
22545               -m[arm]1                Currently not supported.
22546               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
22547               -m[arm]3                Arm 3 processor
22548               -m[arm]6[xx],           Arm 6 processors
22549               -m[arm]7[xx][t][[d]m]   Arm 7 processors
22550               -m[arm]8[10]            Arm 8 processors
22551               -m[arm]9[20][tdmi]      Arm 9 processors
22552               -mstrongarm[110[0]]     StrongARM processors
22553               -mxscale                XScale processors
22554               -m[arm]v[2345[t[e]]]    Arm architectures
22555               -mall                   All (except the ARM1)
22556       FP variants:
22557               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
22558               -mfpe-old               (No float load/store multiples)
22559               -mvfpxd                 VFP Single precision
22560               -mvfp                   All VFP
22561               -mno-fpu                Disable all floating point instructions
22562
22563       The following CPU names are recognized:
22564               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
22565               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
22566               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
22567               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
22568               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
22569               arm10t arm10e, arm1020t, arm1020e, arm10200e,
22570               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
22571
22572       */
22573
22574 const char * md_shortopts = "m:k";
22575
22576 #ifdef ARM_BI_ENDIAN
22577 #define OPTION_EB (OPTION_MD_BASE + 0)
22578 #define OPTION_EL (OPTION_MD_BASE + 1)
22579 #else
22580 #if TARGET_BYTES_BIG_ENDIAN
22581 #define OPTION_EB (OPTION_MD_BASE + 0)
22582 #else
22583 #define OPTION_EL (OPTION_MD_BASE + 1)
22584 #endif
22585 #endif
22586 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
22587
22588 struct option md_longopts[] =
22589 {
22590 #ifdef OPTION_EB
22591   {"EB", no_argument, NULL, OPTION_EB},
22592 #endif
22593 #ifdef OPTION_EL
22594   {"EL", no_argument, NULL, OPTION_EL},
22595 #endif
22596   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
22597   {NULL, no_argument, NULL, 0}
22598 };
22599
22600 size_t md_longopts_size = sizeof (md_longopts);
22601
22602 struct arm_option_table
22603 {
22604   char *option;         /* Option name to match.  */
22605   char *help;           /* Help information.  */
22606   int  *var;            /* Variable to change.  */
22607   int   value;          /* What to change it to.  */
22608   char *deprecated;     /* If non-null, print this message.  */
22609 };
22610
22611 struct arm_option_table arm_opts[] =
22612 {
22613   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
22614   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
22615   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
22616    &support_interwork, 1, NULL},
22617   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
22618   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
22619   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
22620    1, NULL},
22621   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
22622   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
22623   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
22624   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
22625    NULL},
22626
22627   /* These are recognized by the assembler, but have no affect on code.  */
22628   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
22629   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
22630
22631   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
22632   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
22633    &warn_on_deprecated, 0, NULL},
22634   {NULL, NULL, NULL, 0, NULL}
22635 };
22636
22637 struct arm_legacy_option_table
22638 {
22639   char *option;                         /* Option name to match.  */
22640   const arm_feature_set **var;          /* Variable to change.  */
22641   const arm_feature_set value;          /* What to change it to.  */
22642   char *deprecated;                     /* If non-null, print this message.  */
22643 };
22644
22645 const struct arm_legacy_option_table arm_legacy_opts[] =
22646 {
22647   /* DON'T add any new processors to this list -- we want the whole list
22648      to go away...  Add them to the processors table instead.  */
22649   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
22650   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
22651   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
22652   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
22653   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
22654   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
22655   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
22656   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
22657   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
22658   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
22659   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
22660   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
22661   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
22662   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
22663   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
22664   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
22665   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
22666   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
22667   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
22668   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
22669   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
22670   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
22671   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
22672   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
22673   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
22674   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
22675   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
22676   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
22677   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
22678   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
22679   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
22680   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
22681   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
22682   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
22683   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22684   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22685   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22686   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22687   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22688   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22689   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
22690   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
22691   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
22692   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
22693   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
22694   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
22695   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22696   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22697   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22698   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22699   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22700   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22701   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22702   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22703   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22704   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22705   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
22706   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
22707   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
22708   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
22709   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22710   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22711   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22712   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22713   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22714   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22715   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22716   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22717   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
22718   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
22719    N_("use -mcpu=strongarm110")},
22720   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
22721    N_("use -mcpu=strongarm1100")},
22722   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
22723    N_("use -mcpu=strongarm1110")},
22724   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
22725   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
22726   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
22727
22728   /* Architecture variants -- don't add any more to this list either.  */
22729   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
22730   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
22731   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22732   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22733   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
22734   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
22735   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22736   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22737   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
22738   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
22739   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22740   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22741   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
22742   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
22743   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22744   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22745   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
22746   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
22747
22748   /* Floating point variants -- don't add any more to this list either.  */
22749   {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
22750   {"mfpa10",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
22751   {"mfpa11",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
22752   {"mno-fpu",  &legacy_fpu, ARM_ARCH_NONE,
22753    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
22754
22755   {NULL, NULL, ARM_ARCH_NONE, NULL}
22756 };
22757
22758 struct arm_cpu_option_table
22759 {
22760   char *name;
22761   const arm_feature_set value;
22762   /* For some CPUs we assume an FPU unless the user explicitly sets
22763      -mfpu=...  */
22764   const arm_feature_set default_fpu;
22765   /* The canonical name of the CPU, or NULL to use NAME converted to upper
22766      case.  */
22767   const char *canonical_name;
22768 };
22769
22770 /* This list should, at a minimum, contain all the cpu names
22771    recognized by GCC.  */
22772 static const struct arm_cpu_option_table arm_cpus[] =
22773 {
22774   {"all",               ARM_ANY,         FPU_ARCH_FPA,    NULL},
22775   {"arm1",              ARM_ARCH_V1,     FPU_ARCH_FPA,    NULL},
22776   {"arm2",              ARM_ARCH_V2,     FPU_ARCH_FPA,    NULL},
22777   {"arm250",            ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL},
22778   {"arm3",              ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL},
22779   {"arm6",              ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22780   {"arm60",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22781   {"arm600",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22782   {"arm610",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22783   {"arm620",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22784   {"arm7",              ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22785   {"arm7m",             ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
22786   {"arm7d",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22787   {"arm7dm",            ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
22788   {"arm7di",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22789   {"arm7dmi",           ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
22790   {"arm70",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22791   {"arm700",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22792   {"arm700i",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22793   {"arm710",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22794   {"arm710t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22795   {"arm720",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22796   {"arm720t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22797   {"arm740t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22798   {"arm710c",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22799   {"arm7100",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22800   {"arm7500",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22801   {"arm7500fe",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
22802   {"arm7t",             ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22803   {"arm7tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22804   {"arm7tdmi-s",        ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22805   {"arm8",              ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22806   {"arm810",            ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22807   {"strongarm",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22808   {"strongarm1",        ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22809   {"strongarm110",      ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22810   {"strongarm1100",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22811   {"strongarm1110",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22812   {"arm9",              ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22813   {"arm920",            ARM_ARCH_V4T,    FPU_ARCH_FPA,    "ARM920T"},
22814   {"arm920t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22815   {"arm922t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22816   {"arm940t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22817   {"arm9tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
22818   {"fa526",             ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22819   {"fa626",             ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
22820   /* For V5 or later processors we default to using VFP; but the user
22821      should really set the FPU type explicitly.  */
22822   {"arm9e-r0",          ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22823   {"arm9e",             ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22824   {"arm926ej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"},
22825   {"arm926ejs",         ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"},
22826   {"arm926ej-s",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL},
22827   {"arm946e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22828   {"arm946e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM946E-S"},
22829   {"arm946e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22830   {"arm966e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
22831   {"arm966e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM966E-S"},
22832   {"arm966e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22833   {"arm968e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22834   {"arm10t",            ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
22835   {"arm10tdmi",         ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
22836   {"arm10e",            ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22837   {"arm1020",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM1020E"},
22838   {"arm1020t",          ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
22839   {"arm1020e",          ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22840   {"arm1022e",          ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22841   {"arm1026ejs",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM1026EJ-S"},
22842   {"arm1026ej-s",       ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL},
22843   {"fa606te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22844   {"fa616te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22845   {"fa626te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22846   {"fmp626",            ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22847   {"fa726te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
22848   {"arm1136js",         ARM_ARCH_V6,     FPU_NONE,        "ARM1136J-S"},
22849   {"arm1136j-s",        ARM_ARCH_V6,     FPU_NONE,        NULL},
22850   {"arm1136jfs",        ARM_ARCH_V6,     FPU_ARCH_VFP_V2, "ARM1136JF-S"},
22851   {"arm1136jf-s",       ARM_ARCH_V6,     FPU_ARCH_VFP_V2, NULL},
22852   {"mpcore",            ARM_ARCH_V6K,    FPU_ARCH_VFP_V2, "MPCore"},
22853   {"mpcorenovfp",       ARM_ARCH_V6K,    FPU_NONE,        "MPCore"},
22854   {"arm1156t2-s",       ARM_ARCH_V6T2,   FPU_NONE,        NULL},
22855   {"arm1156t2f-s",      ARM_ARCH_V6T2,   FPU_ARCH_VFP_V2, NULL},
22856   {"arm1176jz-s",       ARM_ARCH_V6ZK,   FPU_NONE,        NULL},
22857   {"arm1176jzf-s",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2, NULL},
22858   {"cortex-a5",         ARM_ARCH_V7A_MP_SEC, 
22859                                          FPU_NONE,        "Cortex-A5"},
22860   {"cortex-a8",         ARM_ARCH_V7A_SEC,
22861                                          ARM_FEATURE (0, FPU_VFP_V3
22862                                                         | FPU_NEON_EXT_V1),
22863                                                           "Cortex-A8"},
22864   {"cortex-a9",         ARM_ARCH_V7A_MP_SEC,
22865                                          ARM_FEATURE (0, FPU_VFP_V3
22866                                                         | FPU_NEON_EXT_V1),
22867                                                           "Cortex-A9"},
22868   {"cortex-a15",        ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
22869                                          FPU_ARCH_NEON_VFP_V4,
22870                                                           "Cortex-A15"},
22871   {"cortex-r4",         ARM_ARCH_V7R,    FPU_NONE,        "Cortex-R4"},
22872   {"cortex-r4f",        ARM_ARCH_V7R,    FPU_ARCH_VFP_V3D16,
22873                                                           "Cortex-R4F"},
22874   {"cortex-r5",         ARM_ARCH_V7R_IDIV,
22875                                          FPU_NONE,        "Cortex-R5"},
22876   {"cortex-m4",         ARM_ARCH_V7EM,   FPU_NONE,        "Cortex-M4"},
22877   {"cortex-m3",         ARM_ARCH_V7M,    FPU_NONE,        "Cortex-M3"},
22878   {"cortex-m1",         ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M1"},
22879   {"cortex-m0",         ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0"},
22880   /* ??? XSCALE is really an architecture.  */
22881   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
22882   /* ??? iwmmxt is not a processor.  */
22883   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL},
22884   {"iwmmxt2",           ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL},
22885   {"i80200",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
22886   /* Maverick */
22887   {"ep9312",    ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK), FPU_ARCH_MAVERICK, "ARM920T"},
22888   {NULL,                ARM_ARCH_NONE,   ARM_ARCH_NONE, NULL}
22889 };
22890
22891 struct arm_arch_option_table
22892 {
22893   char *name;
22894   const arm_feature_set value;
22895   const arm_feature_set default_fpu;
22896 };
22897
22898 /* This list should, at a minimum, contain all the architecture names
22899    recognized by GCC.  */
22900 static const struct arm_arch_option_table arm_archs[] =
22901 {
22902   {"all",               ARM_ANY,         FPU_ARCH_FPA},
22903   {"armv1",             ARM_ARCH_V1,     FPU_ARCH_FPA},
22904   {"armv2",             ARM_ARCH_V2,     FPU_ARCH_FPA},
22905   {"armv2a",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
22906   {"armv2s",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
22907   {"armv3",             ARM_ARCH_V3,     FPU_ARCH_FPA},
22908   {"armv3m",            ARM_ARCH_V3M,    FPU_ARCH_FPA},
22909   {"armv4",             ARM_ARCH_V4,     FPU_ARCH_FPA},
22910   {"armv4xm",           ARM_ARCH_V4xM,   FPU_ARCH_FPA},
22911   {"armv4t",            ARM_ARCH_V4T,    FPU_ARCH_FPA},
22912   {"armv4txm",          ARM_ARCH_V4TxM,  FPU_ARCH_FPA},
22913   {"armv5",             ARM_ARCH_V5,     FPU_ARCH_VFP},
22914   {"armv5t",            ARM_ARCH_V5T,    FPU_ARCH_VFP},
22915   {"armv5txm",          ARM_ARCH_V5TxM,  FPU_ARCH_VFP},
22916   {"armv5te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP},
22917   {"armv5texp",         ARM_ARCH_V5TExP, FPU_ARCH_VFP},
22918   {"armv5tej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP},
22919   {"armv6",             ARM_ARCH_V6,     FPU_ARCH_VFP},
22920   {"armv6j",            ARM_ARCH_V6,     FPU_ARCH_VFP},
22921   {"armv6k",            ARM_ARCH_V6K,    FPU_ARCH_VFP},
22922   {"armv6z",            ARM_ARCH_V6Z,    FPU_ARCH_VFP},
22923   {"armv6zk",           ARM_ARCH_V6ZK,   FPU_ARCH_VFP},
22924   {"armv6t2",           ARM_ARCH_V6T2,   FPU_ARCH_VFP},
22925   {"armv6kt2",          ARM_ARCH_V6KT2,  FPU_ARCH_VFP},
22926   {"armv6zt2",          ARM_ARCH_V6ZT2,  FPU_ARCH_VFP},
22927   {"armv6zkt2",         ARM_ARCH_V6ZKT2, FPU_ARCH_VFP},
22928   {"armv6-m",           ARM_ARCH_V6M,    FPU_ARCH_VFP},
22929   {"armv6s-m",          ARM_ARCH_V6SM,   FPU_ARCH_VFP},
22930   {"armv7",             ARM_ARCH_V7,     FPU_ARCH_VFP},
22931   /* The official spelling of the ARMv7 profile variants is the dashed form.
22932      Accept the non-dashed form for compatibility with old toolchains.  */
22933   {"armv7a",            ARM_ARCH_V7A,    FPU_ARCH_VFP},
22934   {"armv7r",            ARM_ARCH_V7R,    FPU_ARCH_VFP},
22935   {"armv7m",            ARM_ARCH_V7M,    FPU_ARCH_VFP},
22936   {"armv7-a",           ARM_ARCH_V7A,    FPU_ARCH_VFP},
22937   {"armv7-r",           ARM_ARCH_V7R,    FPU_ARCH_VFP},
22938   {"armv7-m",           ARM_ARCH_V7M,    FPU_ARCH_VFP},
22939   {"armv7e-m",          ARM_ARCH_V7EM,   FPU_ARCH_VFP},
22940   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP},
22941   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP},
22942   {"iwmmxt2",           ARM_ARCH_IWMMXT2,FPU_ARCH_VFP},
22943   {NULL,                ARM_ARCH_NONE,   ARM_ARCH_NONE}
22944 };
22945
22946 /* ISA extensions in the co-processor and main instruction set space.  */
22947 struct arm_option_extension_value_table
22948 {
22949   char *name;
22950   const arm_feature_set value;
22951   const arm_feature_set allowed_archs;
22952 };
22953
22954 /* The following table must be in alphabetical order with a NULL last entry.
22955    */
22956 static const struct arm_option_extension_value_table arm_extensions[] =
22957 {
22958   {"idiv",      ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
22959                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)},
22960   {"iwmmxt",    ARM_FEATURE (0, ARM_CEXT_IWMMXT),       ARM_ANY},
22961   {"iwmmxt2",   ARM_FEATURE (0, ARM_CEXT_IWMMXT2),      ARM_ANY},
22962   {"maverick",  ARM_FEATURE (0, ARM_CEXT_MAVERICK),     ARM_ANY},
22963   {"mp",        ARM_FEATURE (ARM_EXT_MP, 0),
22964                      ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)},
22965   {"os",        ARM_FEATURE (ARM_EXT_OS, 0),
22966                                    ARM_FEATURE (ARM_EXT_V6M, 0)},
22967   {"sec",       ARM_FEATURE (ARM_EXT_SEC, 0),
22968                      ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)},
22969   {"virt",      ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV | ARM_EXT_DIV, 0),
22970                                    ARM_FEATURE (ARM_EXT_V7A, 0)},
22971   {"xscale",    ARM_FEATURE (0, ARM_CEXT_XSCALE),       ARM_ANY},
22972   {NULL,        ARM_ARCH_NONE,                    ARM_ARCH_NONE}
22973 };
22974
22975 /* ISA floating-point and Advanced SIMD extensions.  */
22976 struct arm_option_fpu_value_table
22977 {
22978   char *name;
22979   const arm_feature_set value;
22980 };
22981
22982 /* This list should, at a minimum, contain all the fpu names
22983    recognized by GCC.  */
22984 static const struct arm_option_fpu_value_table arm_fpus[] =
22985 {
22986   {"softfpa",           FPU_NONE},
22987   {"fpe",               FPU_ARCH_FPE},
22988   {"fpe2",              FPU_ARCH_FPE},
22989   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
22990   {"fpa",               FPU_ARCH_FPA},
22991   {"fpa10",             FPU_ARCH_FPA},
22992   {"fpa11",             FPU_ARCH_FPA},
22993   {"arm7500fe",         FPU_ARCH_FPA},
22994   {"softvfp",           FPU_ARCH_VFP},
22995   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
22996   {"vfp",               FPU_ARCH_VFP_V2},
22997   {"vfp9",              FPU_ARCH_VFP_V2},
22998   {"vfp3",              FPU_ARCH_VFP_V3}, /* For backwards compatbility.  */
22999   {"vfp10",             FPU_ARCH_VFP_V2},
23000   {"vfp10-r0",          FPU_ARCH_VFP_V1},
23001   {"vfpxd",             FPU_ARCH_VFP_V1xD},
23002   {"vfpv2",             FPU_ARCH_VFP_V2},
23003   {"vfpv3",             FPU_ARCH_VFP_V3},
23004   {"vfpv3-fp16",        FPU_ARCH_VFP_V3_FP16},
23005   {"vfpv3-d16",         FPU_ARCH_VFP_V3D16},
23006   {"vfpv3-d16-fp16",    FPU_ARCH_VFP_V3D16_FP16},
23007   {"vfpv3xd",           FPU_ARCH_VFP_V3xD},
23008   {"vfpv3xd-fp16",      FPU_ARCH_VFP_V3xD_FP16},
23009   {"arm1020t",          FPU_ARCH_VFP_V1},
23010   {"arm1020e",          FPU_ARCH_VFP_V2},
23011   {"arm1136jfs",        FPU_ARCH_VFP_V2},
23012   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
23013   {"maverick",          FPU_ARCH_MAVERICK},
23014   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
23015   {"neon-fp16",         FPU_ARCH_NEON_FP16},
23016   {"vfpv4",             FPU_ARCH_VFP_V4},
23017   {"vfpv4-d16",         FPU_ARCH_VFP_V4D16},
23018   {"fpv4-sp-d16",       FPU_ARCH_VFP_V4_SP_D16},
23019   {"neon-vfpv4",        FPU_ARCH_NEON_VFP_V4},
23020   {NULL,                ARM_ARCH_NONE}
23021 };
23022
23023 struct arm_option_value_table
23024 {
23025   char *name;
23026   long value;
23027 };
23028
23029 static const struct arm_option_value_table arm_float_abis[] =
23030 {
23031   {"hard",      ARM_FLOAT_ABI_HARD},
23032   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
23033   {"soft",      ARM_FLOAT_ABI_SOFT},
23034   {NULL,        0}
23035 };
23036
23037 #ifdef OBJ_ELF
23038 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
23039 static const struct arm_option_value_table arm_eabis[] =
23040 {
23041   {"gnu",       EF_ARM_EABI_UNKNOWN},
23042   {"4",         EF_ARM_EABI_VER4},
23043   {"5",         EF_ARM_EABI_VER5},
23044   {NULL,        0}
23045 };
23046 #endif
23047
23048 struct arm_long_option_table
23049 {
23050   char * option;                /* Substring to match.  */
23051   char * help;                  /* Help information.  */
23052   int (* func) (char * subopt); /* Function to decode sub-option.  */
23053   char * deprecated;            /* If non-null, print this message.  */
23054 };
23055
23056 static bfd_boolean
23057 arm_parse_extension (char * str, const arm_feature_set **opt_p)
23058 {
23059   arm_feature_set *ext_set = (arm_feature_set *)
23060       xmalloc (sizeof (arm_feature_set));
23061
23062   /* We insist on extensions being specified in alphabetical order, and with
23063      extensions being added before being removed.  We achieve this by having 
23064      the global ARM_EXTENSIONS table in alphabetical order, and using the 
23065      ADDING_VALUE variable to indicate whether we are adding an extension (1)
23066      or removing it (0) and only allowing it to change in the order 
23067      -1 -> 1 -> 0.  */
23068   const struct arm_option_extension_value_table * opt = NULL;
23069   int adding_value = -1;
23070
23071   /* Copy the feature set, so that we can modify it.  */
23072   *ext_set = **opt_p;
23073   *opt_p = ext_set;
23074
23075   while (str != NULL && *str != 0)
23076     {
23077       char * ext;
23078       size_t optlen;
23079
23080       if (*str != '+')
23081         {
23082           as_bad (_("invalid architectural extension"));
23083           return FALSE;
23084         }
23085
23086       str++;
23087       ext = strchr (str, '+');
23088
23089       if (ext != NULL)
23090         optlen = ext - str;
23091       else
23092         optlen = strlen (str);
23093
23094       if (optlen >= 2
23095           && strncmp (str, "no", 2) == 0)
23096         {
23097           if (adding_value != 0)
23098             {
23099               adding_value = 0;
23100               opt = arm_extensions;
23101             }
23102
23103           optlen -= 2;
23104           str += 2;
23105         }
23106       else if (optlen > 0)
23107         {
23108           if (adding_value == -1)
23109             {
23110               adding_value = 1;
23111               opt = arm_extensions;
23112             }
23113           else if (adding_value != 1)
23114             {
23115               as_bad (_("must specify extensions to add before specifying "
23116                         "those to remove"));
23117               return FALSE;
23118             }
23119         }
23120
23121       if (optlen == 0)
23122         {
23123           as_bad (_("missing architectural extension"));
23124           return FALSE;
23125         }
23126
23127       gas_assert (adding_value != -1);
23128       gas_assert (opt != NULL);
23129
23130       /* Scan over the options table trying to find an exact match. */
23131       for (; opt->name != NULL; opt++)
23132         if (strncmp (opt->name, str, optlen) == 0
23133             && strlen (opt->name) == optlen)
23134           {
23135             /* Check we can apply the extension to this architecture.  */
23136             if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
23137               {
23138                 as_bad (_("extension does not apply to the base architecture"));
23139                 return FALSE;
23140               }
23141
23142             /* Add or remove the extension.  */
23143             if (adding_value)
23144               ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
23145             else
23146               ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
23147
23148             break;
23149           }
23150
23151       if (opt->name == NULL)
23152         {
23153           /* Did we fail to find an extension because it wasn't specified in
23154              alphabetical order, or because it does not exist?  */
23155
23156           for (opt = arm_extensions; opt->name != NULL; opt++)
23157             if (strncmp (opt->name, str, optlen) == 0)
23158               break;
23159
23160           if (opt->name == NULL)
23161             as_bad (_("unknown architectural extension `%s'"), str);
23162           else
23163             as_bad (_("architectural extensions must be specified in "
23164                       "alphabetical order"));
23165
23166           return FALSE;
23167         }
23168       else
23169         {
23170           /* We should skip the extension we've just matched the next time
23171              round.  */
23172           opt++;
23173         }
23174
23175       str = ext;
23176     };
23177
23178   return TRUE;
23179 }
23180
23181 static bfd_boolean
23182 arm_parse_cpu (char * str)
23183 {
23184   const struct arm_cpu_option_table * opt;
23185   char * ext = strchr (str, '+');
23186   int optlen;
23187
23188   if (ext != NULL)
23189     optlen = ext - str;
23190   else
23191     optlen = strlen (str);
23192
23193   if (optlen == 0)
23194     {
23195       as_bad (_("missing cpu name `%s'"), str);
23196       return FALSE;
23197     }
23198
23199   for (opt = arm_cpus; opt->name != NULL; opt++)
23200     if (strncmp (opt->name, str, optlen) == 0)
23201       {
23202         mcpu_cpu_opt = &opt->value;
23203         mcpu_fpu_opt = &opt->default_fpu;
23204         if (opt->canonical_name)
23205           strcpy (selected_cpu_name, opt->canonical_name);
23206         else
23207           {
23208             int i;
23209
23210             for (i = 0; i < optlen; i++)
23211               selected_cpu_name[i] = TOUPPER (opt->name[i]);
23212             selected_cpu_name[i] = 0;
23213           }
23214
23215         if (ext != NULL)
23216           return arm_parse_extension (ext, &mcpu_cpu_opt);
23217
23218         return TRUE;
23219       }
23220
23221   as_bad (_("unknown cpu `%s'"), str);
23222   return FALSE;
23223 }
23224
23225 static bfd_boolean
23226 arm_parse_arch (char * str)
23227 {
23228   const struct arm_arch_option_table *opt;
23229   char *ext = strchr (str, '+');
23230   int optlen;
23231
23232   if (ext != NULL)
23233     optlen = ext - str;
23234   else
23235     optlen = strlen (str);
23236
23237   if (optlen == 0)
23238     {
23239       as_bad (_("missing architecture name `%s'"), str);
23240       return FALSE;
23241     }
23242
23243   for (opt = arm_archs; opt->name != NULL; opt++)
23244     if (strncmp (opt->name, str, optlen) == 0)
23245       {
23246         march_cpu_opt = &opt->value;
23247         march_fpu_opt = &opt->default_fpu;
23248         strcpy (selected_cpu_name, opt->name);
23249
23250         if (ext != NULL)
23251           return arm_parse_extension (ext, &march_cpu_opt);
23252
23253         return TRUE;
23254       }
23255
23256   as_bad (_("unknown architecture `%s'\n"), str);
23257   return FALSE;
23258 }
23259
23260 static bfd_boolean
23261 arm_parse_fpu (char * str)
23262 {
23263   const struct arm_option_fpu_value_table * opt;
23264
23265   for (opt = arm_fpus; opt->name != NULL; opt++)
23266     if (streq (opt->name, str))
23267       {
23268         mfpu_opt = &opt->value;
23269         return TRUE;
23270       }
23271
23272   as_bad (_("unknown floating point format `%s'\n"), str);
23273   return FALSE;
23274 }
23275
23276 static bfd_boolean
23277 arm_parse_float_abi (char * str)
23278 {
23279   const struct arm_option_value_table * opt;
23280
23281   for (opt = arm_float_abis; opt->name != NULL; opt++)
23282     if (streq (opt->name, str))
23283       {
23284         mfloat_abi_opt = opt->value;
23285         return TRUE;
23286       }
23287
23288   as_bad (_("unknown floating point abi `%s'\n"), str);
23289   return FALSE;
23290 }
23291
23292 #ifdef OBJ_ELF
23293 static bfd_boolean
23294 arm_parse_eabi (char * str)
23295 {
23296   const struct arm_option_value_table *opt;
23297
23298   for (opt = arm_eabis; opt->name != NULL; opt++)
23299     if (streq (opt->name, str))
23300       {
23301         meabi_flags = opt->value;
23302         return TRUE;
23303       }
23304   as_bad (_("unknown EABI `%s'\n"), str);
23305   return FALSE;
23306 }
23307 #endif
23308
23309 static bfd_boolean
23310 arm_parse_it_mode (char * str)
23311 {
23312   bfd_boolean ret = TRUE;
23313
23314   if (streq ("arm", str))
23315     implicit_it_mode = IMPLICIT_IT_MODE_ARM;
23316   else if (streq ("thumb", str))
23317     implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
23318   else if (streq ("always", str))
23319     implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
23320   else if (streq ("never", str))
23321     implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
23322   else
23323     {
23324       as_bad (_("unknown implicit IT mode `%s', should be "\
23325                 "arm, thumb, always, or never."), str);
23326       ret = FALSE;
23327     }
23328
23329   return ret;
23330 }
23331
23332 struct arm_long_option_table arm_long_opts[] =
23333 {
23334   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
23335    arm_parse_cpu, NULL},
23336   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
23337    arm_parse_arch, NULL},
23338   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
23339    arm_parse_fpu, NULL},
23340   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
23341    arm_parse_float_abi, NULL},
23342 #ifdef OBJ_ELF
23343   {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
23344    arm_parse_eabi, NULL},
23345 #endif
23346   {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
23347    arm_parse_it_mode, NULL},
23348   {NULL, NULL, 0, NULL}
23349 };
23350
23351 int
23352 md_parse_option (int c, char * arg)
23353 {
23354   struct arm_option_table *opt;
23355   const struct arm_legacy_option_table *fopt;
23356   struct arm_long_option_table *lopt;
23357
23358   switch (c)
23359     {
23360 #ifdef OPTION_EB
23361     case OPTION_EB:
23362       target_big_endian = 1;
23363       break;
23364 #endif
23365
23366 #ifdef OPTION_EL
23367     case OPTION_EL:
23368       target_big_endian = 0;
23369       break;
23370 #endif
23371
23372     case OPTION_FIX_V4BX:
23373       fix_v4bx = TRUE;
23374       break;
23375
23376     case 'a':
23377       /* Listing option.  Just ignore these, we don't support additional
23378          ones.  */
23379       return 0;
23380
23381     default:
23382       for (opt = arm_opts; opt->option != NULL; opt++)
23383         {
23384           if (c == opt->option[0]
23385               && ((arg == NULL && opt->option[1] == 0)
23386                   || streq (arg, opt->option + 1)))
23387             {
23388               /* If the option is deprecated, tell the user.  */
23389               if (warn_on_deprecated && opt->deprecated != NULL)
23390                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23391                            arg ? arg : "", _(opt->deprecated));
23392
23393               if (opt->var != NULL)
23394                 *opt->var = opt->value;
23395
23396               return 1;
23397             }
23398         }
23399
23400       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
23401         {
23402           if (c == fopt->option[0]
23403               && ((arg == NULL && fopt->option[1] == 0)
23404                   || streq (arg, fopt->option + 1)))
23405             {
23406               /* If the option is deprecated, tell the user.  */
23407               if (warn_on_deprecated && fopt->deprecated != NULL)
23408                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23409                            arg ? arg : "", _(fopt->deprecated));
23410
23411               if (fopt->var != NULL)
23412                 *fopt->var = &fopt->value;
23413
23414               return 1;
23415             }
23416         }
23417
23418       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23419         {
23420           /* These options are expected to have an argument.  */
23421           if (c == lopt->option[0]
23422               && arg != NULL
23423               && strncmp (arg, lopt->option + 1,
23424                           strlen (lopt->option + 1)) == 0)
23425             {
23426               /* If the option is deprecated, tell the user.  */
23427               if (warn_on_deprecated && lopt->deprecated != NULL)
23428                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
23429                            _(lopt->deprecated));
23430
23431               /* Call the sup-option parser.  */
23432               return lopt->func (arg + strlen (lopt->option) - 1);
23433             }
23434         }
23435
23436       return 0;
23437     }
23438
23439   return 1;
23440 }
23441
23442 void
23443 md_show_usage (FILE * fp)
23444 {
23445   struct arm_option_table *opt;
23446   struct arm_long_option_table *lopt;
23447
23448   fprintf (fp, _(" ARM-specific assembler options:\n"));
23449
23450   for (opt = arm_opts; opt->option != NULL; opt++)
23451     if (opt->help != NULL)
23452       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
23453
23454   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23455     if (lopt->help != NULL)
23456       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
23457
23458 #ifdef OPTION_EB
23459   fprintf (fp, _("\
23460   -EB                     assemble code for a big-endian cpu\n"));
23461 #endif
23462
23463 #ifdef OPTION_EL
23464   fprintf (fp, _("\
23465   -EL                     assemble code for a little-endian cpu\n"));
23466 #endif
23467
23468   fprintf (fp, _("\
23469   --fix-v4bx              Allow BX in ARMv4 code\n"));
23470 }
23471
23472
23473 #ifdef OBJ_ELF
23474 typedef struct
23475 {
23476   int val;
23477   arm_feature_set flags;
23478 } cpu_arch_ver_table;
23479
23480 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
23481    least features first.  */
23482 static const cpu_arch_ver_table cpu_arch_ver[] =
23483 {
23484     {1, ARM_ARCH_V4},
23485     {2, ARM_ARCH_V4T},
23486     {3, ARM_ARCH_V5},
23487     {3, ARM_ARCH_V5T},
23488     {4, ARM_ARCH_V5TE},
23489     {5, ARM_ARCH_V5TEJ},
23490     {6, ARM_ARCH_V6},
23491     {9, ARM_ARCH_V6K},
23492     {7, ARM_ARCH_V6Z},
23493     {11, ARM_ARCH_V6M},
23494     {12, ARM_ARCH_V6SM},
23495     {8, ARM_ARCH_V6T2},
23496     {10, ARM_ARCH_V7A},
23497     {10, ARM_ARCH_V7R},
23498     {10, ARM_ARCH_V7M},
23499     {0, ARM_ARCH_NONE}
23500 };
23501
23502 /* Set an attribute if it has not already been set by the user.  */
23503 static void
23504 aeabi_set_attribute_int (int tag, int value)
23505 {
23506   if (tag < 1
23507       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23508       || !attributes_set_explicitly[tag])
23509     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
23510 }
23511
23512 static void
23513 aeabi_set_attribute_string (int tag, const char *value)
23514 {
23515   if (tag < 1
23516       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23517       || !attributes_set_explicitly[tag])
23518     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
23519 }
23520
23521 /* Set the public EABI object attributes.  */
23522 static void
23523 aeabi_set_public_attributes (void)
23524 {
23525   int arch;
23526   int virt_sec = 0;
23527   arm_feature_set flags;
23528   arm_feature_set tmp;
23529   const cpu_arch_ver_table *p;
23530
23531   /* Choose the architecture based on the capabilities of the requested cpu
23532      (if any) and/or the instructions actually used.  */
23533   ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
23534   ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
23535   ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
23536   /*Allow the user to override the reported architecture.  */
23537   if (object_arch)
23538     {
23539       ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
23540       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
23541     }
23542
23543   /* We need to make sure that the attributes do not identify us as v6S-M
23544      when the only v6S-M feature in use is the Operating System Extensions.  */
23545   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
23546       if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
23547         ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
23548
23549   tmp = flags;
23550   arch = 0;
23551   for (p = cpu_arch_ver; p->val; p++)
23552     {
23553       if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
23554         {
23555           arch = p->val;
23556           ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
23557         }
23558     }
23559
23560   /* The table lookup above finds the last architecture to contribute
23561      a new feature.  Unfortunately, Tag13 is a subset of the union of
23562      v6T2 and v7-M, so it is never seen as contributing a new feature.
23563      We can not search for the last entry which is entirely used,
23564      because if no CPU is specified we build up only those flags
23565      actually used.  Perhaps we should separate out the specified
23566      and implicit cases.  Avoid taking this path for -march=all by
23567      checking for contradictory v7-A / v7-M features.  */
23568   if (arch == 10
23569       && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
23570       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
23571       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
23572     arch = 13;
23573
23574   /* Tag_CPU_name.  */
23575   if (selected_cpu_name[0])
23576     {
23577       char *q;
23578
23579       q = selected_cpu_name;
23580       if (strncmp (q, "armv", 4) == 0)
23581         {
23582           int i;
23583
23584           q += 4;
23585           for (i = 0; q[i]; i++)
23586             q[i] = TOUPPER (q[i]);
23587         }
23588       aeabi_set_attribute_string (Tag_CPU_name, q);
23589     }
23590
23591   /* Tag_CPU_arch.  */
23592   aeabi_set_attribute_int (Tag_CPU_arch, arch);
23593
23594   /* Tag_CPU_arch_profile.  */
23595   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
23596     aeabi_set_attribute_int (Tag_CPU_arch_profile, 'A');
23597   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
23598     aeabi_set_attribute_int (Tag_CPU_arch_profile, 'R');
23599   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
23600     aeabi_set_attribute_int (Tag_CPU_arch_profile, 'M');
23601
23602   /* Tag_ARM_ISA_use.  */
23603   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
23604       || arch == 0)
23605     aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
23606
23607   /* Tag_THUMB_ISA_use.  */
23608   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
23609       || arch == 0)
23610     aeabi_set_attribute_int (Tag_THUMB_ISA_use,
23611         ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
23612
23613   /* Tag_VFP_arch.  */
23614   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
23615     aeabi_set_attribute_int (Tag_VFP_arch,
23616                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
23617                              ? 5 : 6);
23618   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
23619     aeabi_set_attribute_int (Tag_VFP_arch, 3);
23620   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
23621     aeabi_set_attribute_int (Tag_VFP_arch, 4);
23622   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
23623     aeabi_set_attribute_int (Tag_VFP_arch, 2);
23624   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
23625            || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
23626     aeabi_set_attribute_int (Tag_VFP_arch, 1);
23627
23628   /* Tag_ABI_HardFP_use.  */
23629   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
23630       && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
23631     aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
23632
23633   /* Tag_WMMX_arch.  */
23634   if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
23635     aeabi_set_attribute_int (Tag_WMMX_arch, 2);
23636   else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
23637     aeabi_set_attribute_int (Tag_WMMX_arch, 1);
23638
23639   /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
23640   if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
23641     aeabi_set_attribute_int
23642       (Tag_Advanced_SIMD_arch, (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma)
23643                                 ? 2 : 1));
23644   
23645   /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
23646   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16))
23647     aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
23648
23649   /* Tag_DIV_use.  */
23650   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv))
23651     aeabi_set_attribute_int (Tag_DIV_use, 2);
23652   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_div))
23653     aeabi_set_attribute_int (Tag_DIV_use, 0);
23654   else
23655     aeabi_set_attribute_int (Tag_DIV_use, 1);
23656
23657   /* Tag_MP_extension_use.  */
23658   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
23659     aeabi_set_attribute_int (Tag_MPextension_use, 1);
23660
23661   /* Tag Virtualization_use.  */
23662   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
23663     virt_sec |= 1;
23664   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
23665     virt_sec |= 2;
23666   if (virt_sec != 0)
23667     aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
23668 }
23669
23670 /* Add the default contents for the .ARM.attributes section.  */
23671 void
23672 arm_md_end (void)
23673 {
23674   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
23675     return;
23676
23677   aeabi_set_public_attributes ();
23678 }
23679 #endif /* OBJ_ELF */
23680
23681
23682 /* Parse a .cpu directive.  */
23683
23684 static void
23685 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
23686 {
23687   const struct arm_cpu_option_table *opt;
23688   char *name;
23689   char saved_char;
23690
23691   name = input_line_pointer;
23692   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23693     input_line_pointer++;
23694   saved_char = *input_line_pointer;
23695   *input_line_pointer = 0;
23696
23697   /* Skip the first "all" entry.  */
23698   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
23699     if (streq (opt->name, name))
23700       {
23701         mcpu_cpu_opt = &opt->value;
23702         selected_cpu = opt->value;
23703         if (opt->canonical_name)
23704           strcpy (selected_cpu_name, opt->canonical_name);
23705         else
23706           {
23707             int i;
23708             for (i = 0; opt->name[i]; i++)
23709               selected_cpu_name[i] = TOUPPER (opt->name[i]);
23710             selected_cpu_name[i] = 0;
23711           }
23712         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23713         *input_line_pointer = saved_char;
23714         demand_empty_rest_of_line ();
23715         return;
23716       }
23717   as_bad (_("unknown cpu `%s'"), name);
23718   *input_line_pointer = saved_char;
23719   ignore_rest_of_line ();
23720 }
23721
23722
23723 /* Parse a .arch directive.  */
23724
23725 static void
23726 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
23727 {
23728   const struct arm_arch_option_table *opt;
23729   char saved_char;
23730   char *name;
23731
23732   name = input_line_pointer;
23733   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23734     input_line_pointer++;
23735   saved_char = *input_line_pointer;
23736   *input_line_pointer = 0;
23737
23738   /* Skip the first "all" entry.  */
23739   for (opt = arm_archs + 1; opt->name != NULL; opt++)
23740     if (streq (opt->name, name))
23741       {
23742         mcpu_cpu_opt = &opt->value;
23743         selected_cpu = opt->value;
23744         strcpy (selected_cpu_name, opt->name);
23745         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23746         *input_line_pointer = saved_char;
23747         demand_empty_rest_of_line ();
23748         return;
23749       }
23750
23751   as_bad (_("unknown architecture `%s'\n"), name);
23752   *input_line_pointer = saved_char;
23753   ignore_rest_of_line ();
23754 }
23755
23756
23757 /* Parse a .object_arch directive.  */
23758
23759 static void
23760 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
23761 {
23762   const struct arm_arch_option_table *opt;
23763   char saved_char;
23764   char *name;
23765
23766   name = input_line_pointer;
23767   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23768     input_line_pointer++;
23769   saved_char = *input_line_pointer;
23770   *input_line_pointer = 0;
23771
23772   /* Skip the first "all" entry.  */
23773   for (opt = arm_archs + 1; opt->name != NULL; opt++)
23774     if (streq (opt->name, name))
23775       {
23776         object_arch = &opt->value;
23777         *input_line_pointer = saved_char;
23778         demand_empty_rest_of_line ();
23779         return;
23780       }
23781
23782   as_bad (_("unknown architecture `%s'\n"), name);
23783   *input_line_pointer = saved_char;
23784   ignore_rest_of_line ();
23785 }
23786
23787 /* Parse a .arch_extension directive.  */
23788
23789 static void
23790 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
23791 {
23792   const struct arm_option_extension_value_table *opt;
23793   char saved_char;
23794   char *name;
23795   int adding_value = 1;
23796
23797   name = input_line_pointer;
23798   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23799     input_line_pointer++;
23800   saved_char = *input_line_pointer;
23801   *input_line_pointer = 0;
23802
23803   if (strlen (name) >= 2
23804       && strncmp (name, "no", 2) == 0)
23805     {
23806       adding_value = 0;
23807       name += 2;
23808     }
23809
23810   for (opt = arm_extensions; opt->name != NULL; opt++)
23811     if (streq (opt->name, name))
23812       {
23813         if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
23814           {
23815             as_bad (_("architectural extension `%s' is not allowed for the "
23816                       "current base architecture"), name);
23817             break;
23818           }
23819
23820         if (adding_value)
23821           ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
23822         else
23823           ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
23824
23825         mcpu_cpu_opt = &selected_cpu;
23826         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23827         *input_line_pointer = saved_char;
23828         demand_empty_rest_of_line ();
23829         return;
23830       }
23831
23832   if (opt->name == NULL)
23833     as_bad (_("unknown architecture `%s'\n"), name);
23834
23835   *input_line_pointer = saved_char;
23836   ignore_rest_of_line ();
23837 }
23838
23839 /* Parse a .fpu directive.  */
23840
23841 static void
23842 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
23843 {
23844   const struct arm_option_fpu_value_table *opt;
23845   char saved_char;
23846   char *name;
23847
23848   name = input_line_pointer;
23849   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23850     input_line_pointer++;
23851   saved_char = *input_line_pointer;
23852   *input_line_pointer = 0;
23853
23854   for (opt = arm_fpus; opt->name != NULL; opt++)
23855     if (streq (opt->name, name))
23856       {
23857         mfpu_opt = &opt->value;
23858         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23859         *input_line_pointer = saved_char;
23860         demand_empty_rest_of_line ();
23861         return;
23862       }
23863
23864   as_bad (_("unknown floating point format `%s'\n"), name);
23865   *input_line_pointer = saved_char;
23866   ignore_rest_of_line ();
23867 }
23868
23869 /* Copy symbol information.  */
23870
23871 void
23872 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
23873 {
23874   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
23875 }
23876
23877 #ifdef OBJ_ELF
23878 /* Given a symbolic attribute NAME, return the proper integer value.
23879    Returns -1 if the attribute is not known.  */
23880
23881 int
23882 arm_convert_symbolic_attribute (const char *name)
23883 {
23884   static const struct
23885   {
23886     const char * name;
23887     const int    tag;
23888   }
23889   attribute_table[] =
23890     {
23891       /* When you modify this table you should
23892          also modify the list in doc/c-arm.texi.  */
23893 #define T(tag) {#tag, tag}
23894       T (Tag_CPU_raw_name),
23895       T (Tag_CPU_name),
23896       T (Tag_CPU_arch),
23897       T (Tag_CPU_arch_profile),
23898       T (Tag_ARM_ISA_use),
23899       T (Tag_THUMB_ISA_use),
23900       T (Tag_FP_arch),
23901       T (Tag_VFP_arch),
23902       T (Tag_WMMX_arch),
23903       T (Tag_Advanced_SIMD_arch),
23904       T (Tag_PCS_config),
23905       T (Tag_ABI_PCS_R9_use),
23906       T (Tag_ABI_PCS_RW_data),
23907       T (Tag_ABI_PCS_RO_data),
23908       T (Tag_ABI_PCS_GOT_use),
23909       T (Tag_ABI_PCS_wchar_t),
23910       T (Tag_ABI_FP_rounding),
23911       T (Tag_ABI_FP_denormal),
23912       T (Tag_ABI_FP_exceptions),
23913       T (Tag_ABI_FP_user_exceptions),
23914       T (Tag_ABI_FP_number_model),
23915       T (Tag_ABI_align_needed),
23916       T (Tag_ABI_align8_needed),
23917       T (Tag_ABI_align_preserved),
23918       T (Tag_ABI_align8_preserved),
23919       T (Tag_ABI_enum_size),
23920       T (Tag_ABI_HardFP_use),
23921       T (Tag_ABI_VFP_args),
23922       T (Tag_ABI_WMMX_args),
23923       T (Tag_ABI_optimization_goals),
23924       T (Tag_ABI_FP_optimization_goals),
23925       T (Tag_compatibility),
23926       T (Tag_CPU_unaligned_access),
23927       T (Tag_FP_HP_extension),
23928       T (Tag_VFP_HP_extension),
23929       T (Tag_ABI_FP_16bit_format),
23930       T (Tag_MPextension_use),
23931       T (Tag_DIV_use),
23932       T (Tag_nodefaults),
23933       T (Tag_also_compatible_with),
23934       T (Tag_conformance),
23935       T (Tag_T2EE_use),
23936       T (Tag_Virtualization_use),
23937       /* We deliberately do not include Tag_MPextension_use_legacy.  */
23938 #undef T
23939     };
23940   unsigned int i;
23941
23942   if (name == NULL)
23943     return -1;
23944
23945   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
23946     if (streq (name, attribute_table[i].name))
23947       return attribute_table[i].tag;
23948
23949   return -1;
23950 }
23951
23952
23953 /* Apply sym value for relocations only in the case that
23954    they are for local symbols and you have the respective
23955    architectural feature for blx and simple switches.  */
23956 int
23957 arm_apply_sym_value (struct fix * fixP)
23958 {
23959   if (fixP->fx_addsy
23960       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
23961       && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
23962     {
23963       switch (fixP->fx_r_type)
23964         {
23965         case BFD_RELOC_ARM_PCREL_BLX:
23966         case BFD_RELOC_THUMB_PCREL_BRANCH23:
23967           if (ARM_IS_FUNC (fixP->fx_addsy))
23968             return 1;
23969           break;
23970
23971         case BFD_RELOC_ARM_PCREL_CALL:
23972         case BFD_RELOC_THUMB_PCREL_BLX:
23973           if (THUMB_IS_FUNC (fixP->fx_addsy))
23974               return 1;
23975           break;
23976
23977         default:
23978           break;
23979         }
23980
23981     }
23982   return 0;
23983 }
23984 #endif /* OBJ_ELF */